ToolJet/frontend/src/Editor/Components/Table/String.jsx
Kiran Ashok d9f796a85a
Fix : Table string column max height not getting applied , ui fixes in image column type (#9436)
* initial commit

* redesign column manager

* redesign string column type in the table

* setting the color of the input field for string column type

* setting bg of popover body

* design the style tab of string column type

* adjusted spaces in the properties and style elements in the column manager

* fixed typo error

* removed unwanted line

* redesign the validation section of number column type manager

* added the placeholder value for string column type min and max length in the validation section

* replace text with icons for horizontal alignment in the style tab

* show delete icon outside of the menu actions for each column in the table inspector

* Revert "redesign string column type in the table"

This reverts commit a440f3fc23, which made changes for string column type in the table component on the canvas

* making flex fill for horizontal alignment icon buttons in the style tab of column manager in the table

* Bug fixed: event manager is not working in toggle column type

* added decimalPlaces prop to number column manager

* added text color and cell background props to style tab of number column manager

* added few validations for number

* created boolean column type consisting input checkbox working as toggle switch

* allow user to select boolean column type from the component manager and display boolean column in the table on the canvas

* making boolean component content consistent with the horizontal alignment

* making Boolean column type functional

adding editable and non-editale content to display on table

* fixed horizonta alignment issue for boolean column

* Revert "fixed horizonta alignment issue for boolean column"

This reverts commit d41499a1ed.

* making input elment vertically aligned

* added generalised cell interaction

* added props for boolean column types in column manager of table

* added feature to provide custom bg to toggle switch

* removed default value to toggleOnBg and toggleOffBg

* conditionally displaying hardcoded value if toggleBg is not available

* change the file and component name of existing customSelect to customDropdown

* change component name

* remove unwanted code

* added select option to the column type dropdown field

* Created component for select column type

* rendering custom select component for select column type

* adding border danger for invalid value

* redesign column manager for select column type

* bug fixed : disabling control to select column type when editable is off

* changing the name key to label for select column type options

* partially implemented make default option feature

* Implemented default option for select column type

* added text color prop in a styles tab to select column type

* adding indigo color to selected option to select column type menu list

* avoid breaking table if array is not provided for dynamicOption field

* Organize the column manager and related files

* Added validation fields in text column manager

* Added text color to text area column type

* Added validation to text column type

* Avoiding bg to persisit for few column tupes, who dont have background field

* bug fixed : other valdiation are not rendering for string column type

* bug fixed: on hover always danger border is displayed for each cell

* Cell density enhancement

* Returning empty array for validationList for few column types

* handling validation list by merging organizing-column-manager

* Changed the select component in the properties tab of column popover

* Changed the UI of validation according to new design also few column popover and action popover UI changes

* Adding fx code block in style tab for text color and cell bg color

* fixing UI of select column type column manager according to new UI

* creating multiselect column and its UI wrt option list

* added overlay trigger to multiselect

* feat : added design theme new colors

* fix : adding new color swatch to input components

* fix : colors, number input with height less than 16px and number input arrow in padding none mdode

* fix : icon color

* few color fixes

* overlay trigger for multi-select column type

* color picker bug fixed

* color changes

* column type input text is not consistent with the dark theme- fixed

* custom select single value container bug

* manking add new row, hide column and download popover background consistent with the dark theme

* Making add new row consistent with the updated UI changes

* feat : link column type table

* fix: default underline color

* fix : sentence casing

* added missing transformation field

* fixes

* fixing tab opening condition

* fix : backward compatibility

* supported multiple badges , tags for cell density propety

* added feature to duplicate column

* made td container overflow hidden

* provided 100% width to Image fit prop in styles tab

* oveflow hidden prop changes

* revert unwanted change

* change the gap between columns in column lists inside table inspector

* Deprecate few column types in table

* Fix

* Fixes

* change the functionality of cell density feature

* Fix msg

* Revamp date picker in table

* Fix

* fix : darkmode colors

* revert

* Supported cell density feature for multiple badges

* making badges aligned center

* madde tags column consistent with cell density feature

* Remove imports

* enhancing the code density feature

* Making radio column consistent with the cell density feature

* Fix unixtimestamp

* Fix CSS issues

* making tags and badges overlay appear only when content is overflowed

* CSS fixes

* Fix

* Fix dark mode issues

* making background transparent for deprecating columns

making overlay visible on horizontal overflow

* New revamped styles

* fix box shadow

* Migrations to move visibility and disabled states from styles to properties

* undo change

* refactored custom select component

* patch fixes

* bug fixed action popover was inconsistent with dark theme

* testing

* update custom select column type

* fixes

* Avoided options being populated in columns

* removed consoles

* making custom select align center vertically

* on focus , we used to see on hover effect, avoiding it

* Design review changes

* Made text and string text-container according to design

* vertical positioning of select and multiselect

* overlay for deprecated columns

* regex placeholder

* Icons for number column type

* Design feedback changes

* Design fixes

* box shadow on select menu list in canvas

* added missing feature of decimal places and make increment and decrement icon vertically aligned

* Fix design issues

* Solve lint issues

* Design theme revert changes

* color of column list on hover and active is updated

* fixes

* changing the font weight of labels in styles tab of column manager

* fix

* Revert design theme

* label change

* horizontal alignment of select and datepicker columns

* Reverted back to textarea for text column type

* sync package-lock.json

* fix import

* UI fixes

* Css changes

* feat: Update default table data (#9312)

* updated default table data

* fix : table breaking

* fix : datepikcer crashing table

* fix : data

* fix :: table image height (#9307)

* fix  : Table datepicker UI fixes (#9324)

* fix : datepicker ui

* update

* fix

* refactor: removed unused codes

* add overlay

* add overlay

* Fix datepicker when date and time both are disabled

* Fix paddings and margins

* fix : default states in datepicker in table (#9335)

* feat : update default data with images (#9338)

* Design feedback

* fix multiselect column type issues

* Fix datepicker header width

* Fix dropdown

* Fix options loading state

* Fix select issues

* Fix multiselect default option

* fix overlay trigger multiselect

* fix: fixed issue with overlay display and cell content alignment for text

* fix: Multiselect popover (#9394)

* fix: popover only needed when content overflows

* fix

* fix: update zindex of edited text column

* fix: show overlay when text in string overlay overflows

* Fix multiselect default options

* fix: show error message for editable string cloumn

* Fix date issues

* Fix date fixes

* fix: more info popup close on mouse leave

* Fix unix timestamp issue

* Migration: set default demo data for older data (#9423)

* fix: backfill old default data if user did not add a data

* fix: backfill old default data if user did not add a data

* Table column redeisgn demo string fix (#9415)

* fix: show error message on table input validations

* fix: error message alignments

* Fix import issue for datepicker

* wrapping the contant of multiselect selected options (#9429)

* Fix popover in multiselect

* Add multiselect popover only when content wrap is false or max row height is custom

* Fix : String column types bug fixes (#9431)

* Bug fixed: Hiding max row height field when content wrap is disabled

* Removed border bottom when striped table style is applied

* removed unwanted code

* Apply hover effect on non-editable cell

* fix : Max column hight is not working in table

* Fixed width applied to multiselect popover

* fix : Remove height and width from table image column /  backward compatibility (#9425)

* fix : table column image , remove width and height

* optimise

* adding default object fit

* fix :  text is overlaping issue

* fix : non editable string column text alignment

* remove logs

* fix : text overflow

* fix : text padding

---------

Co-authored-by: manishkushare <kushare.manish9@gmail.com>
Co-authored-by: Nakul Nagargade <nakul@tooljet.com>
Co-authored-by: Nakul Nagargade <133095394+nakulnagargade@users.noreply.github.com>
Co-authored-by: Johnson Cherian <johnsonc.dev@gmail.com>
Co-authored-by: Manish Kushare <37823141+manishkushare@users.noreply.github.com>
2024-04-19 18:02:20 +05:30

193 lines
5.2 KiB
JavaScript

import React, { useState, useEffect } from 'react';
import { validateWidget, determineJustifyContentValue } from '@/_helpers/utils';
import OverlayTrigger from 'react-bootstrap/OverlayTrigger';
const String = ({
isEditable,
darkMode,
handleCellValueChange,
cellTextColor,
cellValue,
column,
currentState,
containerWidth,
cell,
horizontalAlignment,
isMaxRowHeightAuto,
cellSize,
maxRowHeightValue,
}) => {
const validationData = validateWidget({
validationObject: {
regex: {
value: column.regex,
},
minLength: {
value: column.minLength,
},
maxLength: {
value: column.maxLength,
},
customRule: {
value: column.customRule,
},
},
widgetValue: cellValue,
currentState,
customResolveObjects: { cellValue },
});
const { isValid, validationError } = validationData;
const cellStyles = {
color: cellTextColor ?? 'inherit',
};
const ref = React.useRef(null);
const [showOverlay, setShowOverlay] = useState(false);
const [hovered, setHovered] = useState(false);
const [isEditing, setIsEditing] = useState(false);
useEffect(() => {
if (hovered) {
setShowOverlay(true);
} else {
setShowOverlay(false);
}
}, [hovered]);
useEffect(() => {
if (!isEditable && isEditing) {
setIsEditing(false);
}
}, [isEditable]);
const _renderString = () => (
<div
ref={ref}
contentEditable={true}
className={`${!isValid ? 'is-invalid' : ''} h-100 text-container long-text-input d-flex align-items-center ${
darkMode ? ' textarea-dark-theme' : ''
}`}
style={{
color: cellTextColor ? cellTextColor : 'inherit',
outline: 'none',
border: 'none',
background: 'inherit',
position: 'relative',
height: '100%',
maxHeight: isMaxRowHeightAuto
? 'auto'
: maxRowHeightValue
? maxRowHeightValue
: cellSize === 'condensed'
? '39px'
: '45px',
}}
readOnly={!isEditable}
onBlur={(e) => {
setIsEditing(false);
if (cellValue !== e.target.textContent) {
handleCellValueChange(cell.row.index, column.key || column.name, e.target.textContent, cell.row.original);
}
}}
onKeyDown={(e) => {
if (e.key === 'Enter') {
if (cellValue !== e.target.textContent) {
handleCellValueChange(cell.row.index, column.key || column.name, e.target.textContent, cell.row.original);
}
}
}}
onFocus={(e) => {
setIsEditing(true);
e.stopPropagation();
}}
>
{isEditing ? cellValue : <span>{cellValue}</span>}
</div>
);
const getOverlay = () => {
return (
<div
className={`overlay-cell-table ${darkMode && 'dark-theme'}`}
onMouseEnter={() => setHovered(true)}
onMouseLeave={() => setHovered(false)}
style={{ color: 'var(--text-primary)' }}
>
<span
style={{
width: `${containerWidth}px`,
}}
>
{cellValue}
</span>
</div>
);
};
const _showOverlay = ref?.current && ref?.current?.clientWidth < ref?.current?.children[0]?.offsetWidth;
// if (!isEditable) {
// return (
// <div
// className={`d-flex align-items-center h-100 w-100 justify-content-${determineJustifyContentValue(
// horizontalAlignment
// )}`}
// style={cellStyles}
// >
// <span>{cellValue}</span>
// </div>
// );
// }
return (
<>
<OverlayTrigger
placement="bottom"
overlay={_showOverlay ? getOverlay() : <div></div>}
trigger={_showOverlay && ['hover', 'focus']}
rootClose={true}
show={_showOverlay && showOverlay && !isEditing}
>
{!isEditable ? (
<div
className={`d-flex align-items-center h-100 w-100 justify-content-${determineJustifyContentValue(
horizontalAlignment
)}`}
style={cellStyles}
onMouseMove={() => {
if (!hovered) setHovered(true);
}}
onMouseLeave={() => {
setHovered(false);
}}
ref={ref}
>
<span
style={{
maxHeight: isMaxRowHeightAuto
? 'auto'
: maxRowHeightValue
? maxRowHeightValue
: cellSize === 'condensed'
? '39px'
: '45px',
}}
>
{cellValue}
</span>
</div>
) : (
<div className="h-100 d-flex flex-column justify-content-center position-relative">
<div
onMouseMove={() => {
if (!hovered) setHovered(true);
}}
onMouseLeave={() => setHovered(false)}
className={`${!isValid ? 'is-invalid' : ''} ${isEditing ? 'h-100 content-editing' : ''} h-100`}
>
{_renderString()}
</div>
<div className={`${isValid ? '' : 'invalid-feedback text-truncate'} `}>{validationError}</div>
</div>
)}
</OverlayTrigger>
</>
);
};
export default String;