PromucFlow_constructor/app/client/src/widgets/TableWidgetV2/component/TableStyledWrappers.tsx
balajisoundar d2fc0af659
fix: [Table Widget] Remove unnecessary scrollbar when page size fits in available height (#32327)
Fixes https://github.com/appsmithorg/appsmith/issues/17857

## Automation

/ok-to-test tags="@tag.Table"

### 🔍 Cypress test results
<!-- This is an auto-generated comment: Cypress test results  -->
> [!TIP]
> 🟢 🟢 🟢 All cypress tests have passed! 🎉 🎉 🎉
> Workflow run:
<https://github.com/appsmithorg/appsmith/actions/runs/8645383412>
> Commit: a0001d83d5826441c0e0dde59100b8eb5732974b
> Cypress dashboard url: <a
href="https://internal.appsmith.com/app/cypress-dashboard/rundetails-65890b3c81d7400d08fa9ee5?branch=master&workflowId=8645383412&attempt=1"
target="_blank">Click here!</a>

<!-- end of auto-generated comment: Cypress test results  -->
2024-04-15 12:21:08 +05:30

819 lines
19 KiB
TypeScript

import styled, { css } from "styled-components";
import type {
TableSizes,
CellLayoutProperties,
CellAlignment,
VerticalAlignment,
ImageSize,
} from "./Constants";
import {
JUSTIFY_CONTENT,
ALIGN_ITEMS,
IMAGE_HORIZONTAL_ALIGN,
IMAGE_VERTICAL_ALIGN,
TEXT_ALIGN,
TABLE_SIZES,
ImageSizes,
MULTISELECT_CHECKBOX_WIDTH,
TABLE_SCROLLBAR_HEIGHT,
TABLE_SCROLLBAR_WIDTH,
} from "./Constants";
import type { Color } from "constants/Colors";
import { Colors } from "constants/Colors";
import { hideScrollbar, invisible } from "constants/DefaultTheme";
import { lightenColor, darkenColor } from "widgets/WidgetUtils";
import { FontStyleTypes } from "constants/WidgetConstants";
import { Classes } from "@blueprintjs/core";
import type { TableVariant } from "../constants";
import { TableVariantTypes } from "../constants";
import { Layers } from "constants/Layers";
const BORDER_RADIUS = "border-radius: 4px;";
const HEADER_CONTROL_FONT_SIZE = "12px";
export const TableWrapper = styled.div<{
width: number;
height: number;
tableSizes: TableSizes;
accentColor: string;
backgroundColor?: Color;
triggerRowSelection: boolean;
isHeaderVisible?: boolean;
borderRadius: string;
boxShadow?: string;
borderColor?: string;
borderWidth?: number;
isResizingColumn?: boolean;
variant?: TableVariant;
isAddRowInProgress: boolean;
multiRowSelection?: boolean;
}>`
width: 100%;
height: 100%;
background: white;
border-style: solid;
border-width: ${({ borderWidth }) => `${borderWidth}px`};
border-color: ${({ borderColor }) => borderColor};
border-radius: ${({ borderRadius }) => borderRadius};
box-shadow: ${({ boxShadow }) => `${boxShadow}`} !important;
box-sizing: border-box;
display: flex;
justify-content: space-between;
flex-direction: column;
overflow: hidden;
.simplebar-track {
opacity: 0.7;
&.simplebar-horizontal {
height: ${TABLE_SCROLLBAR_HEIGHT}px;
.simplebar-scrollbar {
height: 5px;
}
&.simplebar-hover {
height: 10px;
& .simplebar-scrollbar {
height: 8px;
}
}
}
&.simplebar-vertical {
direction: rtl;
top: ${(props) => props.tableSizes.TABLE_HEADER_HEIGHT - 10}px;
width: ${TABLE_SCROLLBAR_WIDTH}px;
&.simplebar-hover {
width: 10px;
& .simplebar-scrollbar {
width: 11px;
}
}
}
}
.tableWrap {
height: 100%;
display: block;
position: relative;
width: ${({ width }) => width}px;
overflow: auto hidden;
&.virtual {
${hideScrollbar};
}
}
.table {
border-spacing: 0;
color: ${Colors.THUNDER};
position: relative;
display: table;
width: 100%;
${hideScrollbar};
.tbody {
height: fit-content;
width: fit-content;
}
.tr {
cursor: ${(props) => props.triggerRowSelection && "pointer"};
background: ${Colors.WHITE};
&.selected-row {
background: ${({ accentColor }) =>
`${lightenColor(accentColor)}`} !important;
&:hover {
background: ${({ accentColor }) =>
`${lightenColor(accentColor, "0.9")}`} !important;
}
}
${(props) => {
if (!props.isAddRowInProgress) {
return `&:hover {
background: var(--wds-color-bg-hover) !important;
}`;
}
}}
&.new-row {
background: ${({ accentColor }) =>
`${lightenColor(accentColor)}`} !important;
}
}
.th,
.td {
margin: 0;
position: relative;
border-right: ${(props) =>
props.variant === TableVariantTypes.DEFAULT ||
props.variant === undefined ||
props.isResizingColumn
? "1px solid var(--wds-color-border-onaccent)"
: "none"};
position: relative;
font-size: ${(props) => props.tableSizes.ROW_FONT_SIZE}px;
line-height: ${(props) => props.tableSizes.ROW_FONT_SIZE}px;
:last-child {
border-right: 0;
.resizer {
right: 5px;
}
}
.resizer {
display: inline-block;
width: 10px;
height: 100%;
position: absolute;
right: 0;
top: 0;
transform: translateX(50%);
z-index: 1;
${"" /* prevents from scrolling while dragging on touch devices */}
touch-action:none;
&.isResizing {
cursor: isResizing;
}
}
&:after {
content: "";
position: absolute;
right: 0;
bottom: 0;
width: 100%;
border-bottom: ${(props) =>
props.variant === TableVariantTypes.DEFAULT ||
props.variant === undefined ||
props.variant === TableVariantTypes.VARIANT3
? "1px solid var(--wds-color-border-onaccent)"
: "none"};
}
}
.th {
font-size: 14px;
}
.th {
padding: 0 10px 0 0;
height: ${(props) =>
props.isHeaderVisible ? props.tableSizes.COLUMN_HEADER_HEIGHT : 40}px;
line-height: ${(props) =>
props.isHeaderVisible ? props.tableSizes.COLUMN_HEADER_HEIGHT : 40}px;
background: var(--wds-color-bg);
font-weight: bold;
}
.td {
min-height: ${(props) => props.tableSizes.ROW_HEIGHT}px;
padding: 0;
}
.thead {
position: sticky;
top: 0;
z-index: 1;
width: fit-content;
}
}
.virtual-list {
${hideScrollbar};
}
.column-freeze {
.body {
position: relative;
z-index: 0;
}
[role="columnheader"] {
background-color: var(--wds-color-bg) !important;
}
[data-sticky-td] {
position: sticky;
position: -webkit-sticky;
background-color: inherit;
border-bottom: ${(props) =>
props.variant === TableVariantTypes.VARIANT2
? "none"
: "1px solid var(--wds-color-border-onaccent)"};
& .draggable-header {
cursor: pointer;
}
&.hidden-cell,
&:has(> .hidden-header) {
z-index: 0;
position: unset !important;
}
&:has(> .hidden-header) .resizer {
position: relative;
}
}
[data-sticky-last-left-td] {
left: 0px;
border-right: 3px solid var(--wds-color-border);
&.hidden-cell,
&:has(> .hidden-header) {
border-right: 0.5px solid var(--wds-color-border);
}
}
[data-sticky-first-right-td] {
right: 0px;
border-left: 3px solid var(--wds-color-border);
&.hidden-cell,
&:has(> .hidden-header) {
border-left: none;
}
}
& .sticky-right-modifier {
border-left: 3px solid var(--wds-color-border);
}
}
.tbody .tr:last-child .td {
border-bottom: none;
}
.draggable-header,
.hidden-header {
width: 100%;
text-overflow: ellipsis;
overflow: hidden;
color: ${Colors.OXFORD_BLUE};
padding-left: 10px;
&.sorted {
padding-left: 5px;
}
}
.draggable-header {
cursor: grab;
display: inline-block;
width: 100%;
height: ${(props) => props.tableSizes.COLUMN_HEADER_HEIGHT};
&.reorder-line {
width: 1px;
height: 100%;
}
}
.hidden-header {
opacity: 0.6;
${invisible};
}
.header-menu {
cursor: pointer;
width: 24px;
display: flex;
align-items: center;
.bp3-popover2-target {
display: block;
}
&.hide-menu {
display: none;
}
&.hide {
&:hover {
.bp3-popover2-target {
display: block;
}
}
.bp3-popover2-target {
display: none;
}
}
}
.column-menu {
cursor: pointer;
height: ${(props) => props.tableSizes.COLUMN_HEADER_HEIGHT}px;
line-height: ${(props) => props.tableSizes.COLUMN_HEADER_HEIGHT}px;
}
.th {
display: flex !important;
justify-content: space-between;
&.highlight-left {
border-left: 2px solid ${Colors.GREEN};
}
&.highlight-right {
border-right: 2px solid ${Colors.GREEN};
}
& .draggable-header--dragging {
background: #efefef;
border-radius: 4px;
z-index: 100;
width: 100%;
text-overflow: none;
overflow: none;
}
}
.input-group {
height: ${(props) => props.tableSizes.COLUMN_HEADER_HEIGHT}px;
line-height: ${(props) => props.tableSizes.COLUMN_HEADER_HEIGHT}px;
padding: 0 5px;
}
`;
export const DropDownWrapper = styled.div`
display: flex;
flex-direction: column;
background: white;
z-index: 1;
padding: 10px;
${BORDER_RADIUS}
border: 1px solid ${Colors.ATHENS_GRAY};
box-shadow: 0px 2px 4px rgba(67, 70, 74, 0.14);
`;
export const OptionWrapper = styled.div<{
selected: boolean;
isHeader?: boolean;
}>`
display: flex;
width: 100%;
justify-content: space-between;
height: 32px;
box-sizing: border-box;
padding: 8px;
color: ${(props) => (props.selected ? Colors.WHITE : Colors.OXFORD_BLUE)};
font-size: 14px;
min-width: 200px;
cursor: ${(props) => (!props.isHeader ? "pointer" : "default")};
${BORDER_RADIUS}
margin: 3px 0;
background: ${(props) => (props.selected ? Colors.GREEN : Colors.WHITE)};
&:hover {
background: ${(props) => (props.selected ? Colors.GREEN : Colors.POLAR)};
}
.column-type {
width: 100%;
}
&.non-selectable {
background: ${(props) =>
!props.isHeader ? Colors.WHITE_SMOKE : Colors.WHITE_CLOUD};
}
`;
export const IconOptionWrapper = styled.div`
display: flex;
justify-content: space-between;
width: 100%;
cursor: pointer;
`;
export const PaginationWrapper = styled.div`
box-sizing: border-box;
display: flex;
width: 100%;
justify-content: flex-end;
align-items: center;
padding: 8px;
color: var(--wds-color-text-light);
`;
export const PaginationItemWrapper = styled.div<{
disabled?: boolean;
selected?: boolean;
borderRadius: string;
accentColor: string;
}>`
background: ${(props) =>
props.disabled ? `var(--wds-color-bg-disabled)` : `var(--wds-color-bg)`};
border: 1px solid
${(props) =>
props.disabled
? `var(--wds-color-border-disabled)`
: `var(--wds-color-border)`};
box-sizing: border-box;
width: 24px;
height: 24px;
display: flex;
justify-content: center;
align-items: center;
margin: 0 4px;
cursor: ${(props) => (props.disabled ? "not-allowed" : "pointer")};
border-radius: ${({ borderRadius }) => borderRadius};
& > * {
pointer-events: ${(props) => props.disabled && "none"};
display: flex;
align-items: center;
justify-content: center;
position: relative;
}
& svg {
fill: ${(props) =>
props.disabled
? `var(--wds-color-icon-disabled)`
: `var(--wds-color-icon)`};
}
${({ disabled }) =>
!disabled &&
`&:hover {
border-color: var(--wds-color-border-hover);
background-color: var(--wds-color-bg-hover);
}`}
`;
export const MenuColumnWrapper = styled.div<{ selected: boolean }>`
display: flex;
justify-content: flex-start;
align-items: center;
width: 100%;
background: ${(props) => props.selected && Colors.GREEN};
position: relative;
.title {
color: ${(props) => (props.selected ? Colors.WHITE : Colors.OXFORD_BLUE)};
margin-left: 10px;
}
.sub-menu {
position: absolute;
right: 0;
}
`;
export const ActionWrapper = styled.div<{ disabled: boolean }>`
margin: 0 5px 0 0;
${(props) => (props.disabled ? "cursor: not-allowed;" : null)}
&&&&&& {
.bp3-button {
border: none;
}
.bp3-button span {
font-weight: 400;
text-decoration: none;
}
&&& .bp3-disabled {
background: ${Colors.GREY_1};
color: ${Colors.GREY_4};
}
}
`;
export const IconButtonWrapper = styled.div<{ disabled: boolean }>`
${(props) => (props.disabled ? "cursor: not-allowed;" : null)}
align-items: center;
display: flex;
}
`;
export const TableStyles = css<{
cellProperties?: CellLayoutProperties;
isTextType?: boolean;
}>``;
export const CELL_WRAPPER_LINE_HEIGHT = 28;
export const CellWrapper = styled.div<{
isHidden?: boolean;
isHyperLink?: boolean;
isCellVisible?: boolean;
isTextType?: boolean;
compactMode?: string;
allowCellWrapping?: boolean;
horizontalAlignment?: CellAlignment;
verticalAlignment?: VerticalAlignment;
fontStyle?: string;
textColor?: string;
cellBackground?: string;
textSize?: string;
disablePadding?: boolean;
imageSize?: ImageSize;
isCellDisabled?: boolean;
}>`
display: ${(props) => (props.isCellVisible !== false ? "flex" : "none")};
align-items: center;
justify-content: flex-start;
width: 100%;
height: 100%;
${(props) => (props.isHidden ? invisible : "")};
font-weight: ${(props) =>
props.fontStyle?.includes(FontStyleTypes.BOLD) ? "bold" : "normal"};
color: ${(props) => props.textColor};
font-style: ${(props) =>
props.fontStyle?.includes(FontStyleTypes.ITALIC) ? "italic" : ""};
text-decoration: ${(props) =>
props.fontStyle?.includes(FontStyleTypes.UNDERLINE) && props.isTextType
? "underline"
: ""};
justify-content: ${(props) =>
props.horizontalAlignment && JUSTIFY_CONTENT[props.horizontalAlignment]};
text-align: ${(props) =>
props.horizontalAlignment && TEXT_ALIGN[props.horizontalAlignment]};
align-items: ${(props) =>
props.verticalAlignment && ALIGN_ITEMS[props.verticalAlignment]};
background: ${(props) => {
if (props.isCellDisabled) {
return props.cellBackground
? lightenColor(props.cellBackground)
: "var(--wds-color-bg-disabled)";
} else {
return props.cellBackground;
}
}};
&:hover,
.selected-row & {
background: ${(props) =>
props.cellBackground && !props.isCellDisabled
? darkenColor(props.cellBackground, 5)
: ""};
}
font-size: ${(props) => props.textSize};
padding: ${(props) =>
props.disablePadding
? 0
: `${
props.compactMode
? `${TABLE_SIZES[props.compactMode].VERTICAL_PADDING}px 10px`
: `${0}px 10px`
}`};
line-height: ${CELL_WRAPPER_LINE_HEIGHT}px;
.${Classes.POPOVER_WRAPPER} {
width: 100%;
overflow: hidden;
text-overflow: ellipsis;
}
${(props) =>
props.allowCellWrapping
? `
white-space: break-spaces;
word-break: break-word;
`
: `
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;`}
.image-cell-wrapper {
width: 100%;
height: 100%;
display: flex;
align-items: ${(props) =>
props.verticalAlignment && IMAGE_VERTICAL_ALIGN[props.verticalAlignment]};
justify-content: ${(props) =>
props.horizontalAlignment &&
IMAGE_HORIZONTAL_ALIGN[props.horizontalAlignment]};
}
.image-cell {
height: ${(props) =>
props.imageSize ? ImageSizes[props.imageSize] : ImageSizes.DEFAULT};
margin: 0 5px 0 0;
${BORDER_RADIUS}
object-fit: contain;
}
video {
${BORDER_RADIUS}
}
${(props) =>
props.isHyperLink &&
`
cursor: pointer;
&:hover {
color: ${Colors.ROYAL_BLUE};
text-decoration: underline;
}`};
&.video-cell {
height: 100%;
iframe {
border: none;
${BORDER_RADIUS}
}
}
.link-text {
width: 100%;
overflow: hidden;
text-overflow: ellipsis;
word-break: break-word;
text-align: ${(props) =>
props.horizontalAlignment && TEXT_ALIGN[props.horizontalAlignment]};
}
.hidden-icon {
display: none;
}
&:hover {
.hidden-icon {
display: inline;
}
}
`;
export const CellCheckboxWrapper = styled(CellWrapper)<{
isChecked?: boolean;
accentColor?: string;
borderRadius?: string;
}>`
left: 0;
z-index: ${Layers.modalWidget};
justify-content: center;
width: ${MULTISELECT_CHECKBOX_WIDTH}px;
height: auto;
& > div {
border-radius: ${({ borderRadius }) => borderRadius};
${(props) =>
props.isChecked
? `
background: ${props.accentColor};
&:hover {
background: ${darkenColor(props.accentColor)};
}
`
: `
border: 1px solid ${Colors.GREY_3};
&:hover {
border: 1px solid ${Colors.GREY_5};
}
`};
}
`;
export const CellCheckbox = styled.div`
height: 14px;
width: 14px;
background: ${Colors.WHITE};
cursor: pointer;
position: relative;
.th-svg {
display: block;
position: absolute;
left: 2px;
top: 2px;
}
`;
const MIN_WIDTH_TO_SHOW_PAGE_ITEMS = 700;
export const TableHeaderWrapper = styled.div<{
serverSidePaginationEnabled: boolean;
width: number;
tableSizes: TableSizes;
backgroundColor?: Color;
}>`
position: relative;
display: flex;
width: 100%;
.show-page-items {
display: ${(props) =>
props.width < MIN_WIDTH_TO_SHOW_PAGE_ITEMS ? "none" : "flex"};
}
height: ${(props) => props.tableSizes.TABLE_HEADER_HEIGHT}px;
min-height: ${(props) => props.tableSizes.TABLE_HEADER_HEIGHT}px;
`;
export const TableHeaderInnerWrapper = styled.div<{
serverSidePaginationEnabled: boolean;
width: number;
tableSizes: TableSizes;
backgroundColor?: Color;
variant?: TableVariant;
}>`
position: relative;
display: flex;
width: 100%;
height: 100%;
border-bottom: ${(props) =>
props.variant !== "VARIANT2" &&
`1px solid var(--wds-color-border-onaccent)`};
`;
export const CommonFunctionsMenuWrapper = styled.div<{
tableSizes: TableSizes;
}>`
display: flex;
align-items: center;
height: 100%;
& .bp3-popover-target,
& .bp3-popover-wrapper {
height: 100%;
}
& .bp3-popover-target {
display: flex;
align-items: center;
}
`;
export const TableHeaderContentWrapper = styled.div`
display: flex;
align-items: center;
justify-content: center;
font-size: ${HEADER_CONTROL_FONT_SIZE};
line-height: 20px;
color: ${Colors.GRAY};
margin: 0 4px;
white-space: nowrap;
`;
export const TableIconWrapper = styled.div<{
selected?: boolean;
disabled?: boolean;
}>`
background: ${(props) =>
props.selected ? Colors.ATHENS_GRAY : "transparent"};
box-shadow: ${(props) =>
props.selected ? `inset 0px 4px 0px ${Colors.GREEN}` : "none"};
width: 48px;
height: 38px;
display: flex;
align-items: center;
justify-content: center;
${(props) => (props.disabled ? invisible : "")};
cursor: ${(props) => !props.disabled && "pointer"};
position: relative;
&:hover {
background: ${Colors.ATHENS_GRAY};
}
`;
export const RenderOptionWrapper = styled.div<{ selected: boolean }>`
display: flex;
justify-content: space-between;
align-items: center;
width: 150px;
position: relative;
.title {
color: ${Colors.GREY_10};
width: 120px;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.type {
position: absolute;
left: 135px;
font-size: ${HEADER_CONTROL_FONT_SIZE} !important;
color: ${Colors.GREY_10};
}
`;
export const MenuCategoryWrapper = styled.div`
display: flex;
width: 100%;
align-items: center;
justify-content: space-between;
color: ${Colors.RIVER_BED};
`;
export const MenuStyledOptionHeader = styled.div`
font-weight: 600;
`;
export const TooltipContentWrapper = styled.div<{ width?: number }>`
word-break: break-all;
max-width: ${(props) => props.width}px;
`;
export const EmptyRow = styled.div`
display: flex;
flex: 1 0 auto;
`;
export const EmptyCell = styled.div<{ width: number; sticky?: string }>`
width: ${(props) => props.width}px;
boxsizing: border-box;
flex: ${(props) => props.width} 0 auto;
z-index: ${(props) => (props.sticky ? Layers.dragPreview : 0)};
`;