@economic/taco 2.6.0 → 2.7.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (47) hide show
  1. package/dist/components/Icon/components/AttachWarning.d.ts +3 -0
  2. package/dist/components/Icon/components/index.d.ts +1 -1
  3. package/dist/components/Input/Input.d.ts +1 -1
  4. package/dist/components/Menu/components/Item.d.ts +1 -1
  5. package/dist/components/Menu/components/Link.d.ts +1 -1
  6. package/dist/components/Navigation2/components/Link.d.ts +1 -1
  7. package/dist/components/Select2/components/Option.d.ts +1 -1
  8. package/dist/components/Select2/components/Search.d.ts +1 -1
  9. package/dist/components/Select2/components/Trigger.d.ts +1 -1
  10. package/dist/components/Table3/components/columns/cell/EditingCell.d.ts +5 -2
  11. package/dist/components/Table3/components/columns/cell/EditingControl.d.ts +21 -0
  12. package/dist/components/Table3/components/columns/cell/controls/TextAreaControl.d.ts +2 -0
  13. package/dist/components/Tag/Tag.d.ts +1 -1
  14. package/dist/esm/index.css +85 -22
  15. package/dist/esm/packages/taco/src/components/Icon/components/AttachWarning.js +19 -0
  16. package/dist/esm/packages/taco/src/components/Icon/components/AttachWarning.js.map +1 -0
  17. package/dist/esm/packages/taco/src/components/Icon/components/index.js +2 -0
  18. package/dist/esm/packages/taco/src/components/Icon/components/index.js.map +1 -1
  19. package/dist/esm/packages/taco/src/components/Select2/components/Trigger.js +1 -1
  20. package/dist/esm/packages/taco/src/components/Select2/components/Trigger.js.map +1 -1
  21. package/dist/esm/packages/taco/src/components/Table3/Table3.js +10 -3
  22. package/dist/esm/packages/taco/src/components/Table3/Table3.js.map +1 -1
  23. package/dist/esm/packages/taco/src/components/Table3/components/columns/cell/EditingCell.js +27 -145
  24. package/dist/esm/packages/taco/src/components/Table3/components/columns/cell/EditingCell.js.map +1 -1
  25. package/dist/esm/packages/taco/src/components/Table3/components/columns/cell/EditingControl.js +158 -0
  26. package/dist/esm/packages/taco/src/components/Table3/components/columns/cell/EditingControl.js.map +1 -0
  27. package/dist/esm/packages/taco/src/components/Table3/components/columns/cell/controls/TextAreaControl.js +102 -0
  28. package/dist/esm/packages/taco/src/components/Table3/components/columns/cell/controls/TextAreaControl.js.map +1 -0
  29. package/dist/esm/packages/taco/src/components/Table3/components/columns/footer/Footer.js +1 -1
  30. package/dist/esm/packages/taco/src/components/Table3/components/columns/footer/Footer.js.map +1 -1
  31. package/dist/esm/packages/taco/src/components/Table3/components/columns/internal/Actions.js +2 -2
  32. package/dist/esm/packages/taco/src/components/Table3/components/columns/internal/Actions.js.map +1 -1
  33. package/dist/esm/packages/taco/src/components/Table3/components/columns/internal/Selection.js +1 -1
  34. package/dist/esm/packages/taco/src/components/Table3/components/columns/internal/Selection.js.map +1 -1
  35. package/dist/esm/packages/taco/src/components/Table3/components/toolbar/PrintButton/PrintIFrame.js +1 -1
  36. package/dist/esm/packages/taco/src/components/Table3/hooks/useConvertChildrenToColumns.js +1 -1
  37. package/dist/esm/packages/taco/src/components/Table3/hooks/useConvertChildrenToColumns.js.map +1 -1
  38. package/dist/esm/packages/taco/src/index.js +1 -1
  39. package/dist/index.css +85 -22
  40. package/dist/primitives/Listbox2/components/Root.d.ts +1 -1
  41. package/dist/primitives/Listbox2/types.d.ts +1 -1
  42. package/dist/taco.cjs.development.js +310 -163
  43. package/dist/taco.cjs.development.js.map +1 -1
  44. package/dist/taco.cjs.production.min.js +1 -1
  45. package/dist/taco.cjs.production.min.js.map +1 -1
  46. package/package.json +2 -2
  47. package/types.json +14876 -12163
@@ -1,22 +1,26 @@
1
1
  import React__default from 'react';
2
2
  import cn from 'classnames';
3
- import { Input } from '../../../../Input/Input.js';
4
- import { deselectInputValue } from '../../../../../utils/input.js';
5
- import { Datepicker } from '../../../../Datepicker/Datepicker.js';
6
- import { Switch } from '../../../../Switch/Switch.js';
3
+ import { useRowContext } from '../../rows/RowContext.js';
7
4
  import { getCurrentRowCellElement } from '../../../util/columns.js';
8
- import { getInputAppearanceClassnames, getCellAlignmentClasses } from '../styles.js';
9
5
  import { globalFilterFn, columnFilterFn } from '../../../util/filtering.js';
10
- import _ from 'lodash-es';
11
6
  import { EDITING_ACTIONS_WIDTH } from '../internal/EditingActions.js';
12
7
  import { Indicator, IndicatorReason } from './Indicator.js';
13
8
  import { hasChanged, willRowMoveAfterSorting } from '../../../util/editing.js';
9
+ import { EditingControl } from './EditingControl.js';
14
10
 
15
11
  function EditingCell(props) {
16
- return /*#__PURE__*/React__default.createElement(MemoedEditingCell, Object.assign({}, props));
12
+ const {
13
+ isHovered
14
+ } = useRowContext();
15
+ // Need to explicitly pass tableMeta, because just passing the table object will not trigger editing change since table object is not mutatable.
16
+ const tableMeta = props.table.options.meta;
17
+ return /*#__PURE__*/React__default.createElement(MemoedEditingCell, Object.assign({}, props, {
18
+ isHovered: isHovered,
19
+ tableMeta: tableMeta
20
+ }));
17
21
  }
18
22
  const MemoedEditingCell = /*#__PURE__*/React__default.memo(function MemoedEditingCell(props) {
19
- var _tableMeta$editing$ge, _tableMeta$editing$ro, _rows$tableMeta$curre;
23
+ var _tableMeta$editing$ge, _tableMeta$editing$ro, _rows$tableMeta$curre, _column$columnDef$met;
20
24
  const {
21
25
  cell,
22
26
  column,
@@ -24,9 +28,10 @@ const MemoedEditingCell = /*#__PURE__*/React__default.memo(function MemoedEditin
24
28
  getValue,
25
29
  table,
26
30
  tableRef,
27
- row
31
+ row,
32
+ isHovered,
33
+ tableMeta
28
34
  } = props;
29
- const tableMeta = table.options.meta;
30
35
  const columnMeta = column.columnDef.meta;
31
36
  const cellRef = React__default.useRef(null);
32
37
  const controlRef = React__default.useRef(null);
@@ -94,7 +99,15 @@ const MemoedEditingCell = /*#__PURE__*/React__default.memo(function MemoedEditin
94
99
  }
95
100
  return removeMoveReason;
96
101
  }, [value]);
97
- const className = cn('!px-2 py-[var(--table3-row-padding)]',
102
+ const controlRenderer = (_column$columnDef$met = column.columnDef.meta) === null || _column$columnDef$met === void 0 ? void 0 : _column$columnDef$met.control;
103
+ const className = cn('!px-2 py-[var(--table3-row-padding)]', {
104
+ relative: (isCurrentRow || isHovered) && controlRenderer === 'textarea',
105
+ // Need to set higher z-index, so that the current row textarea (in expanded state) overlaps rows below
106
+ 'z-10': isCurrentRow,
107
+ // When row is hovered and located below, then the hovered textarea overlaps the current row textarea(if the current row textarea is expanded to support multiple lines),
108
+ // as result we need to set lower z-index for the hovered row -> cell.
109
+ 'z-0': isHovered
110
+ },
98
111
  // component overrides - grayscale for editing hover
99
112
  '[[role="row"][data-current="false"]:hover_&>*]:!grayscale [[role="row"][data-current="false"]:hover_&_.bg-white]:!bg-grey-100',
100
113
  // we alias to any because className conflicts with the Table2 definition,
@@ -110,7 +123,7 @@ const MemoedEditingCell = /*#__PURE__*/React__default.memo(function MemoedEditin
110
123
  "data-column-index": index,
111
124
  role: "cell",
112
125
  ref: cellRef
113
- }, /*#__PURE__*/React__default.createElement(Control, {
126
+ }, /*#__PURE__*/React__default.createElement(EditingControl, {
114
127
  align: columnMeta.align,
115
128
  column: cell.column,
116
129
  data: cell.row.original,
@@ -122,141 +135,10 @@ const MemoedEditingCell = /*#__PURE__*/React__default.memo(function MemoedEditin
122
135
  table: table,
123
136
  tableRef: tableRef,
124
137
  value: value,
125
- cell: cell
138
+ cell: cell,
139
+ isCurrentRow: isCurrentRow
126
140
  })));
127
141
  });
128
- const Control = /*#__PURE__*/React__default.forwardRef(function Control(props, ref) {
129
- var _column$columnDef$met, _ref$current;
130
- const {
131
- align,
132
- column,
133
- data,
134
- initialValue,
135
- onChange: handleChange,
136
- table,
137
- tableRef,
138
- value,
139
- cell,
140
- ...attributes
141
- } = props;
142
- const tableMeta = table.options.meta;
143
- const controlRenderer = (_column$columnDef$met = column.columnDef.meta) === null || _column$columnDef$met === void 0 ? void 0 : _column$columnDef$met.control;
144
- const isCellInDetailMode = tableMeta.editing.detailModeEditing && (ref === null || ref === void 0 ? void 0 : (_ref$current = ref.current) === null || _ref$current === void 0 ? void 0 : _ref$current.contains(document.activeElement));
145
- const handleKeyDown = event => {
146
- const target = event.target;
147
- if (target.readOnly) {
148
- return;
149
- }
150
- // prevent row arrow shortcuts triggering when in detail mode
151
- if (tableMeta.editing.detailModeEditing && (event.key === 'ArrowUp' || event.key === 'ArrowDown')) {
152
- event.preventDefault();
153
- event.stopPropagation();
154
- }
155
- if (event.key === 'Escape') {
156
- event.preventDefault();
157
- // Revert to initial value if escape was pressed in detail mode.
158
- if (tableMeta.editing.detailModeEditing) {
159
- tableMeta.editing.setDetailModeEditing(false);
160
- if (value !== initialValue) {
161
- // Before reseting to initial value, we need to check if edited row with cell initial value is the same as original row,
162
- // and in this case we need to completely remove row from editing state to avoid saving the same data as original.
163
- const changedRow = tableMeta.editing.changes ? tableMeta.editing.changes[cell.row.id] : {};
164
- const rowEdtitingDataWithInitialValue = {
165
- ...changedRow,
166
- [cell.column.id]: initialValue
167
- };
168
- if (_.isEqual(cell.row.original, rowEdtitingDataWithInitialValue)) {
169
- tableMeta.editing.resetChange(cell.row.id);
170
- } else {
171
- handleChange(initialValue);
172
- }
173
- }
174
- } else {
175
- tableMeta.editing.toggleEditing(false);
176
- }
177
- return;
178
- }
179
- // Should enable/disable editing mode if Enter was clicked
180
- if (event.key === 'Enter') {
181
- event.preventDefault();
182
- if (!tableMeta.editing.detailModeEditing) {
183
- deselectInputValue(target);
184
- } else {
185
- var _target$select;
186
- target === null || target === void 0 ? void 0 : (_target$select = target.select) === null || _target$select === void 0 ? void 0 : _target$select.call(target);
187
- }
188
- // Ketydown "Enter" should toggle edititng mode
189
- tableMeta.editing.setDetailModeEditing(!tableMeta.editing.detailModeEditing);
190
- return;
191
- }
192
- };
193
- const handleDatepickerChange = event => {
194
- // When datepicker looses focus, it triggers change event, even if date wasn't changed,
195
- // so adding additional check here to prevent adding change to the edititng state.
196
- const originalDate = cell.row.original[cell.column.id];
197
- const changedDate = event.detail;
198
- if (hasChanged(originalDate, changedDate)) {
199
- handleChange(changedDate);
200
- }
201
- };
202
- if (typeof controlRenderer === 'function') {
203
- return controlRenderer({
204
- ...attributes,
205
- ref,
206
- setValue: nextValue => {
207
- if (nextValue !== value) {
208
- handleChange(nextValue);
209
- }
210
- },
211
- value
212
- }, data);
213
- } else if (controlRenderer === 'datepicker') {
214
- const handleDatepickerKeyDown = event => {
215
- handleKeyDown(event);
216
- if (/^[a-z0-9]$/i.test(event.key)) {
217
- tableMeta.editing.setDetailModeEditing(true);
218
- return;
219
- }
220
- };
221
- return /*#__PURE__*/React__default.createElement(Datepicker, Object.assign({}, attributes, {
222
- className: cn({
223
- '[&_input]:!yt-focus-dark': isCellInDetailMode
224
- }),
225
- onChange: handleDatepickerChange,
226
- onKeyDown: handleDatepickerKeyDown,
227
- ref: ref,
228
- value: value
229
- }));
230
- } else if (controlRenderer === 'switch') {
231
- return /*#__PURE__*/React__default.createElement(Switch, Object.assign({}, attributes, {
232
- className: "mx-2 mt-1.5",
233
- checked: Boolean(value),
234
- onChange: handleChange,
235
- ref: ref
236
- }));
237
- }
238
- const isNumber = typeof value === 'number';
239
- const handleInputKeyDown = event => {
240
- handleKeyDown(event);
241
- // Switching to editing mode, when key pressed any alphabetical character or number
242
- if (/^[a-z0-9]$/i.test(event.key)) {
243
- tableMeta.editing.setDetailModeEditing(true);
244
- return;
245
- }
246
- };
247
- return /*#__PURE__*/React__default.createElement(Input, Object.assign({}, attributes, {
248
- className: cn(getInputAppearanceClassnames(), getCellAlignmentClasses(align), {
249
- '!yt-focus-dark': isCellInDetailMode
250
- }),
251
- onChange: event => {
252
- handleChange(event.target.value);
253
- },
254
- onKeyDown: handleInputKeyDown,
255
- ref: ref,
256
- type: isNumber ? 'number' : undefined,
257
- value: isNumber ? value : String(value !== null && value !== void 0 ? value : '')
258
- }));
259
- });
260
142
  function getRowMoveReason(table, rowIndex, rowValues, cell, newValue) {
261
143
  var _table$getState$sorti;
262
144
  let rowMoveReason = null;
@@ -1 +1 @@
1
- {"version":3,"file":"EditingCell.js","sources":["../../../../../../../../../../src/components/Table3/components/columns/cell/EditingCell.tsx"],"sourcesContent":["import React from 'react';\nimport cn from 'classnames';\nimport _ from 'lodash';\nimport { TableMeta, CellContext, ColumnMeta, Cell as RTCell, Table as RTTable } from '@tanstack/react-table';\nimport { Input } from '../../../../Input/Input';\nimport { Switch } from '../../../../Switch/Switch';\nimport { Datepicker } from '../../../../Datepicker/Datepicker';\nimport { getCellAlignmentClasses, getInputAppearanceClassnames } from '../styles';\nimport { Indicator, IndicatorReason } from './Indicator';\nimport { columnFilterFn, globalFilterFn } from '../../../util/filtering';\nimport { Table3FilterValue } from '../../../types';\nimport { hasChanged, willRowMoveAfterSorting } from '../../../util/editing';\nimport { getCurrentRowCellElement } from '../../../util/columns';\nimport { deselectInputValue } from '../../../../../utils/input';\nimport { EDITING_ACTIONS_WIDTH } from '../internal/EditingActions';\n\nexport type EditingCellProps<TType = unknown> = CellContext<TType, unknown> & {\n children?: string | JSX.Element;\n};\n\nexport function EditingCell<TType = unknown>(props: EditingCellProps<TType>) {\n return <MemoedEditingCell<TType> {...props} />;\n}\n\n// Memoization\nexport type MemoedEditingCellProps<TType = unknown> = EditingCellProps<TType>;\n\nconst MemoedEditingCell = React.memo(function MemoedEditingCell<TType = unknown>(props: MemoedEditingCellProps<TType>) {\n const { cell, column, index, getValue, table, tableRef, row } = props;\n const tableMeta = table.options.meta as TableMeta<unknown>;\n const columnMeta = column.columnDef.meta as ColumnMeta<TType, unknown>;\n\n const cellRef = React.useRef<HTMLDivElement>(null);\n const controlRef = React.useRef<HTMLElement>(null);\n\n const handleChange = (value: unknown) => tableMeta.editing.setCellValue(cell, value);\n const value = tableMeta.editing.getCellValue(cell) ?? getValue();\n\n const handleFocus = event => {\n // Check if cell is hidden behind pinned columns or edititng actions, and scroll to it.\n const frozenColumnIndex = tableMeta.columnFreezing.frozenColumnIndex;\n const tableElement = tableRef.current;\n\n if (tableElement && frozenColumnIndex !== undefined && index > frozenColumnIndex) {\n const lastFrozenColumnElement = getCurrentRowCellElement(frozenColumnIndex, tableElement);\n const cellRect = cellRef.current?.getBoundingClientRect();\n const lastFrozenRect = lastFrozenColumnElement?.getBoundingClientRect();\n const tableRect = tableElement.getBoundingClientRect();\n\n // Check for pinned columns overlap\n if (cellRect && lastFrozenRect && cellRect.left < lastFrozenRect.left + lastFrozenRect.width) {\n const pinnedColumnsWidth = lastFrozenRect.left + lastFrozenRect.width;\n tableElement.scrollTo(cellRect.left - pinnedColumnsWidth, tableElement.scrollTop);\n // Check for editing actions overlap\n } else if (cellRect && tableRect && cellRect.right > tableRect.right - EDITING_ACTIONS_WIDTH) {\n const spaceBetweenCellAndEditingActions = 10;\n tableElement.scrollTo(\n // Need to take into account if table has been already scrolled.\n tableElement.scrollLeft + EDITING_ACTIONS_WIDTH + spaceBetweenCellAndEditingActions,\n tableElement.scrollTop\n );\n }\n }\n\n if (event.target?.select) {\n requestAnimationFrame(() => {\n event.target.select();\n });\n }\n };\n\n const handleBlur = () => {\n tableMeta.editing.setDetailModeEditing(false);\n };\n\n // row move indicator\n const moveReason = tableMeta.editing.rowMoveReason[cell.column.id] ?? null;\n const rows = table.getRowModel().rows;\n const isCurrentRow = rows[tableMeta.currentRow.currentRowIndex]?.id === row.id;\n const mountNode = React.useMemo(() => {\n if (moveReason) {\n return cellRef.current?.parentElement?.firstChild as Element | null;\n }\n return null;\n }, [moveReason, cellRef]);\n\n const removeMoveReason = () => {\n tableMeta.editing.removeRowMoveReason(cell.column.id);\n };\n\n React.useEffect(() => {\n // To avoid reseting move reason on another row hover,\n // we need to check for changes only if value got changed in the current row.\n if (!isCurrentRow) {\n return;\n }\n\n if (hasChanged(getValue(), value)) {\n const moveReason = getRowMoveReason(table, row.index, row.original, cell, value);\n tableMeta.editing.setRowMoveReason({ [cell.column.id]: moveReason });\n } else {\n removeMoveReason();\n }\n return removeMoveReason;\n }, [value]);\n\n const className = cn(\n '!px-2 py-[var(--table3-row-padding)]',\n // component overrides - grayscale for editing hover\n '[[role=\"row\"][data-current=\"false\"]:hover_&>*]:!grayscale [[role=\"row\"][data-current=\"false\"]:hover_&_.bg-white]:!bg-grey-100',\n // we alias to any because className conflicts with the Table2 definition,\n // when Table2 is gone, remove this as any\n typeof columnMeta.className === 'function' ? (columnMeta.className as any)(row.original) : columnMeta.className\n );\n\n return (\n <>\n {moveReason !== null && mountNode && (\n <Indicator\n reason={moveReason}\n columnName={String(cell.column.columnDef.header)}\n mountNode={mountNode}\n validationErrors={[]}\n />\n )}\n <div className={className} data-column-index={index} role=\"cell\" ref={cellRef}>\n <Control\n align={columnMeta.align}\n column={cell.column}\n data={cell.row.original}\n initialValue={getValue()}\n onBlur={handleBlur}\n onFocus={handleFocus}\n onChange={handleChange}\n ref={controlRef}\n table={table}\n tableRef={tableRef}\n value={value}\n cell={cell}\n />\n </div>\n </>\n );\n}) as <TType = unknown>(props: MemoedEditingCellProps<TType>) => JSX.Element;\n\nconst Control = React.forwardRef<HTMLElement, any>(function Control(props, ref) {\n const { align, column, data, initialValue, onChange: handleChange, table, tableRef, value, cell, ...attributes } = props;\n const tableMeta = table.options.meta as TableMeta<unknown>;\n\n const controlRenderer = column.columnDef.meta?.control;\n\n const isCellInDetailMode =\n tableMeta.editing.detailModeEditing && (ref as React.RefObject<HTMLElement>)?.current?.contains(document.activeElement);\n\n const handleKeyDown = (event: React.KeyboardEvent) => {\n const target = event.target as HTMLInputElement;\n\n if (target.readOnly) {\n return;\n }\n\n // prevent row arrow shortcuts triggering when in detail mode\n if (tableMeta.editing.detailModeEditing && (event.key === 'ArrowUp' || event.key === 'ArrowDown')) {\n event.preventDefault();\n event.stopPropagation();\n }\n\n if (event.key === 'Escape') {\n event.preventDefault();\n\n // Revert to initial value if escape was pressed in detail mode.\n if (tableMeta.editing.detailModeEditing) {\n tableMeta.editing.setDetailModeEditing(false);\n\n if (value !== initialValue) {\n // Before reseting to initial value, we need to check if edited row with cell initial value is the same as original row,\n // and in this case we need to completely remove row from editing state to avoid saving the same data as original.\n const changedRow: any = tableMeta.editing.changes ? tableMeta.editing.changes[cell.row.id] : {};\n const rowEdtitingDataWithInitialValue = { ...changedRow, [cell.column.id]: initialValue };\n if (_.isEqual(cell.row.original, rowEdtitingDataWithInitialValue)) {\n tableMeta.editing.resetChange(cell.row.id);\n } else {\n handleChange(initialValue);\n }\n }\n } else {\n tableMeta.editing.toggleEditing(false);\n }\n\n return;\n }\n\n // Should enable/disable editing mode if Enter was clicked\n if (event.key === 'Enter') {\n event.preventDefault();\n\n if (!tableMeta.editing.detailModeEditing) {\n deselectInputValue(target);\n } else {\n target?.select?.();\n }\n\n // Ketydown \"Enter\" should toggle edititng mode\n tableMeta.editing.setDetailModeEditing(!tableMeta.editing.detailModeEditing);\n\n return;\n }\n };\n\n const handleDatepickerChange = event => {\n // When datepicker looses focus, it triggers change event, even if date wasn't changed,\n // so adding additional check here to prevent adding change to the edititng state.\n const originalDate = cell.row.original[cell.column.id];\n const changedDate = (event as any).detail;\n if (hasChanged(originalDate, changedDate)) {\n handleChange(changedDate);\n }\n };\n\n if (typeof controlRenderer === 'function') {\n return controlRenderer(\n {\n ...attributes,\n ref,\n setValue: nextValue => {\n if (nextValue !== value) {\n handleChange(nextValue);\n }\n },\n value,\n },\n data\n );\n } else if (controlRenderer === 'datepicker') {\n const handleDatepickerKeyDown = (event: React.KeyboardEvent<HTMLInputElement>) => {\n handleKeyDown(event);\n\n if (/^[a-z0-9]$/i.test(event.key)) {\n tableMeta.editing.setDetailModeEditing(true);\n return;\n }\n };\n\n return (\n <Datepicker\n {...attributes}\n className={cn({\n '[&_input]:!yt-focus-dark': isCellInDetailMode,\n })}\n onChange={handleDatepickerChange}\n onKeyDown={handleDatepickerKeyDown}\n ref={ref}\n value={value as Date}\n />\n );\n } else if (controlRenderer === 'switch') {\n return <Switch {...attributes} className=\"mx-2 mt-1.5\" checked={Boolean(value)} onChange={handleChange} ref={ref} />;\n }\n\n const isNumber = typeof value === 'number';\n const handleInputKeyDown = (event: React.KeyboardEvent<HTMLInputElement>) => {\n handleKeyDown(event);\n\n // Switching to editing mode, when key pressed any alphabetical character or number\n if (/^[a-z0-9]$/i.test(event.key)) {\n tableMeta.editing.setDetailModeEditing(true);\n return;\n }\n };\n\n return (\n <Input\n {...attributes}\n className={cn(getInputAppearanceClassnames(), getCellAlignmentClasses(align), {\n '!yt-focus-dark': isCellInDetailMode,\n })}\n onChange={event => {\n handleChange(event.target.value);\n }}\n onKeyDown={handleInputKeyDown}\n ref={ref as React.Ref<HTMLInputElement>}\n type={isNumber ? 'number' : undefined}\n value={isNumber ? value : String(value ?? '')}\n />\n );\n});\n\nfunction getRowMoveReason<TType>(\n table: RTTable<any>,\n rowIndex: number,\n rowValues: TType,\n cell: RTCell<any, unknown>,\n newValue: any\n) {\n let rowMoveReason: IndicatorReason | null = null;\n const { globalFilter } = table.getState();\n\n const isFilteredByGlobalFilter = Object.values<unknown>({ ...rowValues, [cell.id]: newValue }).some(cellValue =>\n // Global filter can be undefined when there is no text being searched so we pass an empty string to\n // globalFilterFn as query in that case.\n globalFilterFn(String(cellValue), globalFilter ? String(globalFilter) : '')\n );\n\n if (!isFilteredByGlobalFilter) {\n rowMoveReason = IndicatorReason.SEARCH;\n } else if (cell.column.getIsFiltered() && !columnFilterFn(newValue, cell.column.getFilterValue() as Table3FilterValue)) {\n rowMoveReason = IndicatorReason.FILTER;\n } else if (\n !rowMoveReason &&\n cell.column.getIsSorted() &&\n willRowMoveAfterSorting(\n newValue,\n cell,\n rowIndex,\n table.getRowModel().rows,\n !!table.getState().sorting.find(s => s.id === cell.column.id)?.desc\n )\n ) {\n rowMoveReason = IndicatorReason.SORTING;\n }\n\n return rowMoveReason;\n}\n"],"names":["EditingCell","props","React","MemoedEditingCell","memo","cell","column","index","getValue","table","tableRef","row","tableMeta","options","meta","columnMeta","columnDef","cellRef","useRef","controlRef","handleChange","value","editing","setCellValue","_tableMeta$editing$ge","getCellValue","handleFocus","event","frozenColumnIndex","columnFreezing","tableElement","current","undefined","_cellRef$current","lastFrozenColumnElement","getCurrentRowCellElement","cellRect","getBoundingClientRect","lastFrozenRect","tableRect","left","width","pinnedColumnsWidth","scrollTo","scrollTop","right","EDITING_ACTIONS_WIDTH","spaceBetweenCellAndEditingActions","scrollLeft","_event$target","target","select","requestAnimationFrame","handleBlur","setDetailModeEditing","moveReason","_tableMeta$editing$ro","rowMoveReason","id","rows","getRowModel","isCurrentRow","_rows$tableMeta$curre","currentRow","currentRowIndex","mountNode","useMemo","_cellRef$current2","_cellRef$current2$par","parentElement","firstChild","removeMoveReason","removeRowMoveReason","useEffect","hasChanged","getRowMoveReason","original","setRowMoveReason","className","cn","Indicator","reason","columnName","String","header","validationErrors","role","ref","Control","align","data","initialValue","onBlur","onFocus","onChange","forwardRef","attributes","controlRenderer","_column$columnDef$met","control","isCellInDetailMode","detailModeEditing","_ref$current","contains","document","activeElement","handleKeyDown","readOnly","key","preventDefault","stopPropagation","changedRow","changes","rowEdtitingDataWithInitialValue","_","isEqual","resetChange","toggleEditing","deselectInputValue","_target$select","call","handleDatepickerChange","originalDate","changedDate","detail","setValue","nextValue","handleDatepickerKeyDown","test","Datepicker","onKeyDown","Switch","checked","Boolean","isNumber","handleInputKeyDown","Input","getInputAppearanceClassnames","getCellAlignmentClasses","type","rowIndex","rowValues","newValue","globalFilter","getState","isFilteredByGlobalFilter","Object","values","some","cellValue","globalFilterFn","IndicatorReason","SEARCH","getIsFiltered","columnFilterFn","getFilterValue","FILTER","getIsSorted","willRowMoveAfterSorting","_table$getState$sorti","sorting","find","s","desc","SORTING"],"mappings":"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"}
1
+ {"version":3,"file":"EditingCell.js","sources":["../../../../../../../../../../src/components/Table3/components/columns/cell/EditingCell.tsx"],"sourcesContent":["import React from 'react';\nimport cn from 'classnames';\nimport _ from 'lodash';\nimport { TableMeta, CellContext, ColumnMeta, Cell as RTCell, Table as RTTable } from '@tanstack/react-table';\nimport { Indicator, IndicatorReason } from './Indicator';\nimport { columnFilterFn, globalFilterFn } from '../../../util/filtering';\nimport { Table3FilterValue } from '../../../types';\nimport { hasChanged, willRowMoveAfterSorting } from '../../../util/editing';\nimport { getCurrentRowCellElement } from '../../../util/columns';\nimport { EDITING_ACTIONS_WIDTH } from '../internal/EditingActions';\nimport { EditingControl } from './EditingControl';\nimport { useRowContext } from '../../rows/RowContext';\n\nexport type EditingCellProps<TType = unknown> = CellContext<TType, unknown> & {\n children?: string | JSX.Element;\n};\n\nexport function EditingCell<TType = unknown>(props: EditingCellProps<TType>) {\n const { isHovered } = useRowContext();\n // Need to explicitly pass tableMeta, because just passing the table object will not trigger editing change since table object is not mutatable.\n const tableMeta = props.table.options.meta as TableMeta<TType>;\n return <MemoedEditingCell<TType> {...props} isHovered={isHovered} tableMeta={tableMeta} />;\n}\n\n// Memoization\nexport type MemoedEditingCellProps<TType = unknown> = EditingCellProps<TType> & {\n isHovered: boolean;\n tableMeta: TableMeta<TType>;\n};\n\nconst MemoedEditingCell = React.memo(function MemoedEditingCell<TType = unknown>(props: MemoedEditingCellProps<TType>) {\n const { cell, column, index, getValue, table, tableRef, row, isHovered, tableMeta } = props;\n const columnMeta = column.columnDef.meta as ColumnMeta<TType, unknown>;\n\n const cellRef = React.useRef<HTMLDivElement>(null);\n const controlRef = React.useRef<HTMLElement>(null);\n\n const handleChange = (value: unknown) => tableMeta.editing.setCellValue(cell, value);\n const value = tableMeta.editing.getCellValue(cell) ?? getValue();\n\n const handleFocus = event => {\n // Check if cell is hidden behind pinned columns or edititng actions, and scroll to it.\n const frozenColumnIndex = tableMeta.columnFreezing.frozenColumnIndex;\n const tableElement = tableRef.current;\n\n if (tableElement && frozenColumnIndex !== undefined && index > frozenColumnIndex) {\n const lastFrozenColumnElement = getCurrentRowCellElement(frozenColumnIndex, tableElement);\n const cellRect = cellRef.current?.getBoundingClientRect();\n const lastFrozenRect = lastFrozenColumnElement?.getBoundingClientRect();\n const tableRect = tableElement.getBoundingClientRect();\n\n // Check for pinned columns overlap\n if (cellRect && lastFrozenRect && cellRect.left < lastFrozenRect.left + lastFrozenRect.width) {\n const pinnedColumnsWidth = lastFrozenRect.left + lastFrozenRect.width;\n tableElement.scrollTo(cellRect.left - pinnedColumnsWidth, tableElement.scrollTop);\n // Check for editing actions overlap\n } else if (cellRect && tableRect && cellRect.right > tableRect.right - EDITING_ACTIONS_WIDTH) {\n const spaceBetweenCellAndEditingActions = 10;\n tableElement.scrollTo(\n // Need to take into account if table has been already scrolled.\n tableElement.scrollLeft + EDITING_ACTIONS_WIDTH + spaceBetweenCellAndEditingActions,\n tableElement.scrollTop\n );\n }\n }\n\n if (event.target?.select) {\n requestAnimationFrame(() => {\n event.target.select();\n });\n }\n };\n\n const handleBlur = () => {\n tableMeta.editing.setDetailModeEditing(false);\n };\n\n // row move indicator\n const moveReason = tableMeta.editing.rowMoveReason[cell.column.id] ?? null;\n const rows = table.getRowModel().rows;\n const isCurrentRow = rows[tableMeta.currentRow.currentRowIndex]?.id === row.id;\n const mountNode = React.useMemo(() => {\n if (moveReason) {\n return cellRef.current?.parentElement?.firstChild as Element | null;\n }\n return null;\n }, [moveReason, cellRef]);\n\n const removeMoveReason = () => {\n tableMeta.editing.removeRowMoveReason(cell.column.id);\n };\n\n React.useEffect(() => {\n // To avoid reseting move reason on another row hover,\n // we need to check for changes only if value got changed in the current row.\n if (!isCurrentRow) {\n return;\n }\n\n if (hasChanged(getValue(), value)) {\n const moveReason = getRowMoveReason(table, row.index, row.original, cell, value);\n tableMeta.editing.setRowMoveReason({ [cell.column.id]: moveReason });\n } else {\n removeMoveReason();\n }\n return removeMoveReason;\n }, [value]);\n\n const controlRenderer = column.columnDef.meta?.control;\n\n const className = cn(\n '!px-2 py-[var(--table3-row-padding)]',\n {\n relative: (isCurrentRow || isHovered) && controlRenderer === 'textarea',\n // Need to set higher z-index, so that the current row textarea (in expanded state) overlaps rows below\n 'z-10': isCurrentRow,\n // When row is hovered and located below, then the hovered textarea overlaps the current row textarea(if the current row textarea is expanded to support multiple lines),\n // as result we need to set lower z-index for the hovered row -> cell.\n 'z-0': isHovered,\n },\n\n // component overrides - grayscale for editing hover\n '[[role=\"row\"][data-current=\"false\"]:hover_&>*]:!grayscale [[role=\"row\"][data-current=\"false\"]:hover_&_.bg-white]:!bg-grey-100',\n // we alias to any because className conflicts with the Table2 definition,\n // when Table2 is gone, remove this as any\n typeof columnMeta.className === 'function' ? (columnMeta.className as any)(row.original) : columnMeta.className\n );\n\n return (\n <>\n {moveReason !== null && mountNode && (\n <Indicator\n reason={moveReason}\n columnName={String(cell.column.columnDef.header)}\n mountNode={mountNode}\n validationErrors={[]}\n />\n )}\n <div className={className} data-column-index={index} role=\"cell\" ref={cellRef}>\n <EditingControl\n align={columnMeta.align}\n column={cell.column}\n data={cell.row.original}\n initialValue={getValue()}\n onBlur={handleBlur}\n onFocus={handleFocus}\n onChange={handleChange}\n ref={controlRef}\n table={table}\n tableRef={tableRef}\n value={value}\n cell={cell}\n isCurrentRow={isCurrentRow}\n />\n </div>\n </>\n );\n}) as <TType = unknown>(props: MemoedEditingCellProps<TType>) => JSX.Element;\n\nfunction getRowMoveReason<TType>(\n table: RTTable<any>,\n rowIndex: number,\n rowValues: TType,\n cell: RTCell<any, unknown>,\n newValue: any\n) {\n let rowMoveReason: IndicatorReason | null = null;\n const { globalFilter } = table.getState();\n\n const isFilteredByGlobalFilter = Object.values<unknown>({ ...rowValues, [cell.id]: newValue }).some(cellValue =>\n // Global filter can be undefined when there is no text being searched so we pass an empty string to\n // globalFilterFn as query in that case.\n globalFilterFn(String(cellValue), globalFilter ? String(globalFilter) : '')\n );\n\n if (!isFilteredByGlobalFilter) {\n rowMoveReason = IndicatorReason.SEARCH;\n } else if (cell.column.getIsFiltered() && !columnFilterFn(newValue, cell.column.getFilterValue() as Table3FilterValue)) {\n rowMoveReason = IndicatorReason.FILTER;\n } else if (\n !rowMoveReason &&\n cell.column.getIsSorted() &&\n willRowMoveAfterSorting(\n newValue,\n cell,\n rowIndex,\n table.getRowModel().rows,\n !!table.getState().sorting.find(s => s.id === cell.column.id)?.desc\n )\n ) {\n rowMoveReason = IndicatorReason.SORTING;\n }\n\n return rowMoveReason;\n}\n"],"names":["EditingCell","props","isHovered","useRowContext","tableMeta","table","options","meta","React","MemoedEditingCell","memo","cell","column","index","getValue","tableRef","row","columnMeta","columnDef","cellRef","useRef","controlRef","handleChange","value","editing","setCellValue","_tableMeta$editing$ge","getCellValue","handleFocus","event","frozenColumnIndex","columnFreezing","tableElement","current","undefined","_cellRef$current","lastFrozenColumnElement","getCurrentRowCellElement","cellRect","getBoundingClientRect","lastFrozenRect","tableRect","left","width","pinnedColumnsWidth","scrollTo","scrollTop","right","EDITING_ACTIONS_WIDTH","spaceBetweenCellAndEditingActions","scrollLeft","_event$target","target","select","requestAnimationFrame","handleBlur","setDetailModeEditing","moveReason","_tableMeta$editing$ro","rowMoveReason","id","rows","getRowModel","isCurrentRow","_rows$tableMeta$curre","currentRow","currentRowIndex","mountNode","useMemo","_cellRef$current2","_cellRef$current2$par","parentElement","firstChild","removeMoveReason","removeRowMoveReason","useEffect","hasChanged","getRowMoveReason","original","setRowMoveReason","controlRenderer","_column$columnDef$met","control","className","cn","relative","Indicator","reason","columnName","String","header","validationErrors","role","ref","EditingControl","align","data","initialValue","onBlur","onFocus","onChange","rowIndex","rowValues","newValue","globalFilter","getState","isFilteredByGlobalFilter","Object","values","some","cellValue","globalFilterFn","IndicatorReason","SEARCH","getIsFiltered","columnFilterFn","getFilterValue","FILTER","getIsSorted","willRowMoveAfterSorting","_table$getState$sorti","sorting","find","s","desc","SORTING"],"mappings":";;;;;;;;;;SAiBgBA,WAAWA,CAAkBC,KAA8B;EACvE,MAAM;IAAEC;GAAW,GAAGC,aAAa,EAAE;;EAErC,MAAMC,SAAS,GAAGH,KAAK,CAACI,KAAK,CAACC,OAAO,CAACC,IAAwB;EAC9D,oBAAOC,6BAACC,iBAAiB,oBAAYR,KAAK;IAAEC,SAAS,EAAEA,SAAS;IAAEE,SAAS,EAAEA;KAAa;AAC9F;AAQA,MAAMK,iBAAiB,gBAAGD,cAAK,CAACE,IAAI,CAAC,SAASD,iBAAiBA,CAAkBR,KAAoC;;EACjH,MAAM;IAAEU,IAAI;IAAEC,MAAM;IAAEC,KAAK;IAAEC,QAAQ;IAAET,KAAK;IAAEU,QAAQ;IAAEC,GAAG;IAAEd,SAAS;IAAEE;GAAW,GAAGH,KAAK;EAC3F,MAAMgB,UAAU,GAAGL,MAAM,CAACM,SAAS,CAACX,IAAkC;EAEtE,MAAMY,OAAO,GAAGX,cAAK,CAACY,MAAM,CAAiB,IAAI,CAAC;EAClD,MAAMC,UAAU,GAAGb,cAAK,CAACY,MAAM,CAAc,IAAI,CAAC;EAElD,MAAME,YAAY,GAAIC,KAAc,IAAKnB,SAAS,CAACoB,OAAO,CAACC,YAAY,CAACd,IAAI,EAAEY,KAAK,CAAC;EACpF,MAAMA,KAAK,IAAAG,qBAAA,GAAGtB,SAAS,CAACoB,OAAO,CAACG,YAAY,CAAChB,IAAI,CAAC,cAAAe,qBAAA,cAAAA,qBAAA,GAAIZ,QAAQ,EAAE;EAEhE,MAAMc,WAAW,GAAGC,KAAK;;;IAErB,MAAMC,iBAAiB,GAAG1B,SAAS,CAAC2B,cAAc,CAACD,iBAAiB;IACpE,MAAME,YAAY,GAAGjB,QAAQ,CAACkB,OAAO;IAErC,IAAID,YAAY,IAAIF,iBAAiB,KAAKI,SAAS,IAAIrB,KAAK,GAAGiB,iBAAiB,EAAE;MAAA,IAAAK,gBAAA;MAC9E,MAAMC,uBAAuB,GAAGC,wBAAwB,CAACP,iBAAiB,EAAEE,YAAY,CAAC;MACzF,MAAMM,QAAQ,IAAAH,gBAAA,GAAGhB,OAAO,CAACc,OAAO,cAAAE,gBAAA,uBAAfA,gBAAA,CAAiBI,qBAAqB,EAAE;MACzD,MAAMC,cAAc,GAAGJ,uBAAuB,aAAvBA,uBAAuB,uBAAvBA,uBAAuB,CAAEG,qBAAqB,EAAE;MACvE,MAAME,SAAS,GAAGT,YAAY,CAACO,qBAAqB,EAAE;;MAGtD,IAAID,QAAQ,IAAIE,cAAc,IAAIF,QAAQ,CAACI,IAAI,GAAGF,cAAc,CAACE,IAAI,GAAGF,cAAc,CAACG,KAAK,EAAE;QAC1F,MAAMC,kBAAkB,GAAGJ,cAAc,CAACE,IAAI,GAAGF,cAAc,CAACG,KAAK;QACrEX,YAAY,CAACa,QAAQ,CAACP,QAAQ,CAACI,IAAI,GAAGE,kBAAkB,EAAEZ,YAAY,CAACc,SAAS,CAAC;;OAEpF,MAAM,IAAIR,QAAQ,IAAIG,SAAS,IAAIH,QAAQ,CAACS,KAAK,GAAGN,SAAS,CAACM,KAAK,GAAGC,qBAAqB,EAAE;QAC1F,MAAMC,iCAAiC,GAAG,EAAE;QAC5CjB,YAAY,CAACa,QAAQ;;QAEjBb,YAAY,CAACkB,UAAU,GAAGF,qBAAqB,GAAGC,iCAAiC,EACnFjB,YAAY,CAACc,SAAS,CACzB;;;IAIT,KAAAK,aAAA,GAAItB,KAAK,CAACuB,MAAM,cAAAD,aAAA,eAAZA,aAAA,CAAcE,MAAM,EAAE;MACtBC,qBAAqB,CAAC;QAClBzB,KAAK,CAACuB,MAAM,CAACC,MAAM,EAAE;OACxB,CAAC;;GAET;EAED,MAAME,UAAU,GAAGA;IACfnD,SAAS,CAACoB,OAAO,CAACgC,oBAAoB,CAAC,KAAK,CAAC;GAChD;;EAGD,MAAMC,UAAU,IAAAC,qBAAA,GAAGtD,SAAS,CAACoB,OAAO,CAACmC,aAAa,CAAChD,IAAI,CAACC,MAAM,CAACgD,EAAE,CAAC,cAAAF,qBAAA,cAAAA,qBAAA,GAAI,IAAI;EAC1E,MAAMG,IAAI,GAAGxD,KAAK,CAACyD,WAAW,EAAE,CAACD,IAAI;EACrC,MAAME,YAAY,GAAG,EAAAC,qBAAA,GAAAH,IAAI,CAACzD,SAAS,CAAC6D,UAAU,CAACC,eAAe,CAAC,cAAAF,qBAAA,uBAA1CA,qBAAA,CAA4CJ,EAAE,MAAK5C,GAAG,CAAC4C,EAAE;EAC9E,MAAMO,SAAS,GAAG3D,cAAK,CAAC4D,OAAO,CAAC;IAC5B,IAAIX,UAAU,EAAE;MAAA,IAAAY,iBAAA,EAAAC,qBAAA;MACZ,QAAAD,iBAAA,GAAOlD,OAAO,CAACc,OAAO,cAAAoC,iBAAA,wBAAAC,qBAAA,GAAfD,iBAAA,CAAiBE,aAAa,cAAAD,qBAAA,uBAA9BA,qBAAA,CAAgCE,UAA4B;;IAEvE,OAAO,IAAI;GACd,EAAE,CAACf,UAAU,EAAEtC,OAAO,CAAC,CAAC;EAEzB,MAAMsD,gBAAgB,GAAGA;IACrBrE,SAAS,CAACoB,OAAO,CAACkD,mBAAmB,CAAC/D,IAAI,CAACC,MAAM,CAACgD,EAAE,CAAC;GACxD;EAEDpD,cAAK,CAACmE,SAAS,CAAC;;;IAGZ,IAAI,CAACZ,YAAY,EAAE;MACf;;IAGJ,IAAIa,UAAU,CAAC9D,QAAQ,EAAE,EAAES,KAAK,CAAC,EAAE;MAC/B,MAAMkC,UAAU,GAAGoB,gBAAgB,CAACxE,KAAK,EAAEW,GAAG,CAACH,KAAK,EAAEG,GAAG,CAAC8D,QAAQ,EAAEnE,IAAI,EAAEY,KAAK,CAAC;MAChFnB,SAAS,CAACoB,OAAO,CAACuD,gBAAgB,CAAC;QAAE,CAACpE,IAAI,CAACC,MAAM,CAACgD,EAAE,GAAGH;OAAY,CAAC;KACvE,MAAM;MACHgB,gBAAgB,EAAE;;IAEtB,OAAOA,gBAAgB;GAC1B,EAAE,CAAClD,KAAK,CAAC,CAAC;EAEX,MAAMyD,eAAe,IAAAC,qBAAA,GAAGrE,MAAM,CAACM,SAAS,CAACX,IAAI,cAAA0E,qBAAA,uBAArBA,qBAAA,CAAuBC,OAAO;EAEtD,MAAMC,SAAS,GAAGC,EAAE,CAChB,sCAAsC,EACtC;IACIC,QAAQ,EAAE,CAACtB,YAAY,IAAI7D,SAAS,KAAK8E,eAAe,KAAK,UAAU;;IAEvE,MAAM,EAAEjB,YAAY;;;IAGpB,KAAK,EAAE7D;GACV;;EAGD,+HAA+H;;;EAG/H,OAAOe,UAAU,CAACkE,SAAS,KAAK,UAAU,GAAIlE,UAAU,CAACkE,SAAiB,CAACnE,GAAG,CAAC8D,QAAQ,CAAC,GAAG7D,UAAU,CAACkE,SAAS,CAClH;EAED,oBACI3E,4DACKiD,UAAU,KAAK,IAAI,IAAIU,SAAS,iBAC7B3D,6BAAC8E,SAAS;IACNC,MAAM,EAAE9B,UAAU;IAClB+B,UAAU,EAAEC,MAAM,CAAC9E,IAAI,CAACC,MAAM,CAACM,SAAS,CAACwE,MAAM,CAAC;IAChDvB,SAAS,EAAEA,SAAS;IACpBwB,gBAAgB,EAAE;IAEzB,eACDnF;IAAK2E,SAAS,EAAEA,SAAS;yBAAqBtE,KAAK;IAAE+E,IAAI,EAAC,MAAM;IAACC,GAAG,EAAE1E;kBAClEX,6BAACsF,cAAc;IACXC,KAAK,EAAE9E,UAAU,CAAC8E,KAAK;IACvBnF,MAAM,EAAED,IAAI,CAACC,MAAM;IACnBoF,IAAI,EAAErF,IAAI,CAACK,GAAG,CAAC8D,QAAQ;IACvBmB,YAAY,EAAEnF,QAAQ,EAAE;IACxBoF,MAAM,EAAE3C,UAAU;IAClB4C,OAAO,EAAEvE,WAAW;IACpBwE,QAAQ,EAAE9E,YAAY;IACtBuE,GAAG,EAAExE,UAAU;IACfhB,KAAK,EAAEA,KAAK;IACZU,QAAQ,EAAEA,QAAQ;IAClBQ,KAAK,EAAEA,KAAK;IACZZ,IAAI,EAAEA,IAAI;IACVoD,YAAY,EAAEA;IAChB,CACA,CACP;AAEX,CAAC,CAA2E;AAE5E,SAASc,gBAAgBA,CACrBxE,KAAmB,EACnBgG,QAAgB,EAChBC,SAAgB,EAChB3F,IAA0B,EAC1B4F,QAAa;;EAEb,IAAI5C,aAAa,GAA2B,IAAI;EAChD,MAAM;IAAE6C;GAAc,GAAGnG,KAAK,CAACoG,QAAQ,EAAE;EAEzC,MAAMC,wBAAwB,GAAGC,MAAM,CAACC,MAAM,CAAU;IAAE,GAAGN,SAAS;IAAE,CAAC3F,IAAI,CAACiD,EAAE,GAAG2C;GAAU,CAAC,CAACM,IAAI,CAACC,SAAS;;;EAGzGC,cAAc,CAACtB,MAAM,CAACqB,SAAS,CAAC,EAAEN,YAAY,GAAGf,MAAM,CAACe,YAAY,CAAC,GAAG,EAAE,CAAC,CAC9E;EAED,IAAI,CAACE,wBAAwB,EAAE;IAC3B/C,aAAa,GAAGqD,eAAe,CAACC,MAAM;GACzC,MAAM,IAAItG,IAAI,CAACC,MAAM,CAACsG,aAAa,EAAE,IAAI,CAACC,cAAc,CAACZ,QAAQ,EAAE5F,IAAI,CAACC,MAAM,CAACwG,cAAc,EAAuB,CAAC,EAAE;IACpHzD,aAAa,GAAGqD,eAAe,CAACK,MAAM;GACzC,MAAM,IACH,CAAC1D,aAAa,IACdhD,IAAI,CAACC,MAAM,CAAC0G,WAAW,EAAE,IACzBC,uBAAuB,CACnBhB,QAAQ,EACR5F,IAAI,EACJ0F,QAAQ,EACRhG,KAAK,CAACyD,WAAW,EAAE,CAACD,IAAI,EACxB,CAAC,GAAA2D,qBAAA,GAACnH,KAAK,CAACoG,QAAQ,EAAE,CAACgB,OAAO,CAACC,IAAI,CAACC,CAAC,IAAIA,CAAC,CAAC/D,EAAE,KAAKjD,IAAI,CAACC,MAAM,CAACgD,EAAE,CAAC,cAAA4D,qBAAA,eAA3DA,qBAAA,CAA6DI,IAAI,EACtE,EACH;IACEjE,aAAa,GAAGqD,eAAe,CAACa,OAAO;;EAG3C,OAAOlE,aAAa;AACxB;;;;"}
@@ -0,0 +1,158 @@
1
+ import React__default from 'react';
2
+ import cn from 'classnames';
3
+ import { mergeRefs } from '../../../../../utils/mergeRefs.js';
4
+ import { Input } from '../../../../Input/Input.js';
5
+ import { deselectInputValue } from '../../../../../utils/input.js';
6
+ import { Datepicker } from '../../../../Datepicker/Datepicker.js';
7
+ import { Switch } from '../../../../Switch/Switch.js';
8
+ import { getInputAppearanceClassnames, getCellAlignmentClasses } from '../styles.js';
9
+ import _ from 'lodash-es';
10
+ import { hasChanged } from '../../../util/editing.js';
11
+ import { TextAreaControl } from './controls/TextAreaControl.js';
12
+
13
+ const EditingControl = /*#__PURE__*/React__default.forwardRef(function Control(props, externalRef) {
14
+ var _ref$current;
15
+ const {
16
+ align,
17
+ column,
18
+ data,
19
+ initialValue,
20
+ onChange: handleChange,
21
+ table,
22
+ tableRef,
23
+ value,
24
+ cell,
25
+ isCurrentRow,
26
+ ...attributes
27
+ } = props;
28
+ const tableMeta = table.options.meta;
29
+ const ref = React__default.useRef();
30
+ const refCallback = mergeRefs([ref, externalRef]);
31
+ const columnMeta = column.columnDef.meta;
32
+ const controlRenderer = columnMeta === null || columnMeta === void 0 ? void 0 : columnMeta.control;
33
+ const isCellInDetailMode = tableMeta.editing.detailModeEditing && (ref === null || ref === void 0 ? void 0 : (_ref$current = ref.current) === null || _ref$current === void 0 ? void 0 : _ref$current.contains(document.activeElement));
34
+ // Revert to initial value if escape was pressed
35
+ const handleKeyDown = event => {
36
+ const target = event.target;
37
+ if (target.readOnly) {
38
+ return;
39
+ }
40
+ // prevent row arrow shortcuts triggering when in detail mode
41
+ if (tableMeta.editing.detailModeEditing && (event.key === 'ArrowUp' || event.key === 'ArrowDown')) {
42
+ event.stopPropagation();
43
+ }
44
+ if (event.key === 'Escape') {
45
+ event.preventDefault();
46
+ if (tableMeta.editing.detailModeEditing) {
47
+ tableMeta.editing.setDetailModeEditing(false);
48
+ if (value !== initialValue) {
49
+ // Before reseting to initial value, we need to check if edited row with cell initial value is the same as original row,
50
+ // and in this case we need to completely remove row from editing state to avoid saving the same data as original.
51
+ const changedRow = tableMeta.editing.changes ? tableMeta.editing.changes[cell.row.id] : {};
52
+ const rowEdtitingDataWithInitialValue = {
53
+ ...changedRow,
54
+ [cell.column.id]: initialValue
55
+ };
56
+ if (_.isEqual(cell.row.original, rowEdtitingDataWithInitialValue)) {
57
+ tableMeta.editing.resetChange(cell.row.id);
58
+ } else {
59
+ handleChange(initialValue);
60
+ }
61
+ }
62
+ } else {
63
+ var _tableRef$current;
64
+ tableMeta.editing.toggleEditing(false);
65
+ (_tableRef$current = tableRef.current) === null || _tableRef$current === void 0 ? void 0 : _tableRef$current.focus();
66
+ }
67
+ return;
68
+ }
69
+ // Should enable/disable editing mode if Enter was clicked
70
+ if (event.key === 'Enter') {
71
+ event.preventDefault();
72
+ if (!tableMeta.editing.detailModeEditing) {
73
+ deselectInputValue(target);
74
+ } else {
75
+ var _target$select;
76
+ target === null || target === void 0 ? void 0 : (_target$select = target.select) === null || _target$select === void 0 ? void 0 : _target$select.call(target);
77
+ }
78
+ // Ketydown "Enter" should toggle edititng mode
79
+ tableMeta.editing.setDetailModeEditing(!tableMeta.editing.detailModeEditing);
80
+ return;
81
+ }
82
+ };
83
+ const isNumber = typeof value === 'number';
84
+ const handleInputKeyDown = event => {
85
+ handleKeyDown(event);
86
+ // Switching to editing mode, when key pressed any alphabetical character or number
87
+ if (/^[a-z0-9]$/i.test(event.key)) {
88
+ tableMeta.editing.setDetailModeEditing(true);
89
+ return;
90
+ }
91
+ };
92
+ const handleDatepickerChange = event => {
93
+ // When datepicker looses focus, it triggers change event, even if date wasn't changed,
94
+ // so adding additional check here to prevent adding change to the edititng state.
95
+ const originalDate = cell.row.original[cell.column.id];
96
+ const changedDate = event.detail;
97
+ if (hasChanged(originalDate, changedDate)) {
98
+ handleChange(changedDate);
99
+ }
100
+ };
101
+ if (typeof controlRenderer === 'function') {
102
+ return controlRenderer({
103
+ ...attributes,
104
+ ref: ref,
105
+ setValue: nextValue => {
106
+ if (nextValue !== value) {
107
+ handleChange(nextValue);
108
+ }
109
+ },
110
+ value
111
+ }, data);
112
+ } else if (controlRenderer === 'datepicker') {
113
+ const handleDatepickerKeyDown = event => {
114
+ handleKeyDown(event);
115
+ if (/^[a-z0-9]$/i.test(event.key)) {
116
+ tableMeta.editing.setDetailModeEditing(true);
117
+ return;
118
+ }
119
+ };
120
+ return /*#__PURE__*/React__default.createElement(Datepicker, Object.assign({}, attributes, {
121
+ className: cn({
122
+ '[&_input]:!yt-focus-dark': isCellInDetailMode
123
+ }),
124
+ onChange: handleDatepickerChange,
125
+ onKeyDown: handleDatepickerKeyDown,
126
+ ref: refCallback,
127
+ value: value
128
+ }));
129
+ } else if (controlRenderer === 'switch') {
130
+ return /*#__PURE__*/React__default.createElement(Switch, Object.assign({}, attributes, {
131
+ className: "mx-2 mt-1.5",
132
+ checked: Boolean(value),
133
+ onChange: handleChange,
134
+ ref: refCallback
135
+ }));
136
+ } else if (controlRenderer === 'textarea') {
137
+ return /*#__PURE__*/React__default.createElement(TextAreaControl, Object.assign({}, props, {
138
+ isCellInDetailMode: isCellInDetailMode,
139
+ onKeyDown: handleInputKeyDown,
140
+ ref: refCallback
141
+ }));
142
+ }
143
+ return /*#__PURE__*/React__default.createElement(Input, Object.assign({}, attributes, {
144
+ className: cn(getInputAppearanceClassnames(), getCellAlignmentClasses(align), {
145
+ '!yt-focus-dark': isCellInDetailMode
146
+ }),
147
+ onChange: event => {
148
+ handleChange(event.target.value);
149
+ },
150
+ onKeyDown: handleInputKeyDown,
151
+ ref: refCallback,
152
+ type: isNumber ? 'number' : undefined,
153
+ value: isNumber ? value : String(value !== null && value !== void 0 ? value : '')
154
+ }));
155
+ });
156
+
157
+ export { EditingControl };
158
+ //# sourceMappingURL=EditingControl.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EditingControl.js","sources":["../../../../../../../../../../src/components/Table3/components/columns/cell/EditingControl.tsx"],"sourcesContent":["import React from 'react';\nimport cn from 'classnames';\nimport { Cell as RTCell, Column as RTColumn, Table as RTTable, TableMeta } from '@tanstack/react-table';\nimport _ from 'lodash';\n\nimport { deselectInputValue } from '../../../../../utils/input';\nimport { hasChanged } from '../../../util/editing';\nimport { Datepicker } from '../../../../Datepicker/Datepicker';\nimport { Switch } from '../../../../Switch/Switch';\nimport { Input } from '../../../../Input/Input';\nimport { getCellAlignmentClasses, getInputAppearanceClassnames } from '../styles';\nimport { mergeRefs } from '../../../../../utils/mergeRefs';\nimport { Table3ColumnAlignment } from '../../../types';\nimport { TextAreaControl } from './controls/TextAreaControl';\n\nexport type EditingControlProps<TType = unknown> = {\n align?: Table3ColumnAlignment;\n column: RTColumn<TType, unknown>;\n data: TType;\n initialValue: any;\n value: any;\n onBlur: (event: React.FocusEvent) => void;\n onFocus: (event: React.FocusEvent) => void;\n onChange: (value: any) => void;\n ref: React.Ref<HTMLElement>;\n table: RTTable<TType>;\n tableRef: React.RefObject<HTMLDivElement>;\n cell: RTCell<TType, unknown>;\n error?: string;\n tabIndex?: number;\n isCurrentRow?: boolean;\n};\n\nexport const EditingControl = React.forwardRef<HTMLElement, any>(function Control<TType = unknown>(\n props: EditingControlProps<TType>,\n externalRef: React.Ref<HTMLElement>\n) {\n const {\n align,\n column,\n data,\n initialValue,\n onChange: handleChange,\n table,\n tableRef,\n value,\n cell,\n isCurrentRow,\n ...attributes\n } = props;\n\n const tableMeta = table.options.meta as TableMeta<unknown>;\n\n const ref = React.useRef<HTMLElement>();\n const refCallback = mergeRefs([ref, externalRef]);\n\n const columnMeta = column.columnDef.meta;\n const controlRenderer = columnMeta?.control;\n\n const isCellInDetailMode =\n tableMeta.editing.detailModeEditing && (ref as React.RefObject<HTMLElement>)?.current?.contains(document.activeElement);\n\n // Revert to initial value if escape was pressed\n const handleKeyDown = (event: React.KeyboardEvent) => {\n const target = event.target as HTMLInputElement;\n\n if (target.readOnly) {\n return;\n }\n\n // prevent row arrow shortcuts triggering when in detail mode\n if (tableMeta.editing.detailModeEditing && (event.key === 'ArrowUp' || event.key === 'ArrowDown')) {\n event.stopPropagation();\n }\n\n if (event.key === 'Escape') {\n event.preventDefault();\n\n if (tableMeta.editing.detailModeEditing) {\n tableMeta.editing.setDetailModeEditing(false);\n\n if (value !== initialValue) {\n // Before reseting to initial value, we need to check if edited row with cell initial value is the same as original row,\n // and in this case we need to completely remove row from editing state to avoid saving the same data as original.\n const changedRow: any = tableMeta.editing.changes ? tableMeta.editing.changes[cell.row.id] : {};\n const rowEdtitingDataWithInitialValue = { ...changedRow, [cell.column.id]: initialValue };\n if (_.isEqual(cell.row.original, rowEdtitingDataWithInitialValue)) {\n tableMeta.editing.resetChange(cell.row.id);\n } else {\n handleChange(initialValue);\n }\n }\n } else {\n tableMeta.editing.toggleEditing(false);\n tableRef.current?.focus();\n }\n\n return;\n }\n\n // Should enable/disable editing mode if Enter was clicked\n if (event.key === 'Enter') {\n event.preventDefault();\n\n if (!tableMeta.editing.detailModeEditing) {\n deselectInputValue(target);\n } else {\n target?.select?.();\n }\n\n // Ketydown \"Enter\" should toggle edititng mode\n tableMeta.editing.setDetailModeEditing(!tableMeta.editing.detailModeEditing);\n\n return;\n }\n };\n\n const isNumber = typeof value === 'number';\n const handleInputKeyDown = (event: React.KeyboardEvent<HTMLInputElement | HTMLTextAreaElement>) => {\n handleKeyDown(event);\n\n // Switching to editing mode, when key pressed any alphabetical character or number\n if (/^[a-z0-9]$/i.test(event.key)) {\n tableMeta.editing.setDetailModeEditing(true);\n return;\n }\n };\n\n const handleDatepickerChange = event => {\n // When datepicker looses focus, it triggers change event, even if date wasn't changed,\n // so adding additional check here to prevent adding change to the edititng state.\n const originalDate = cell.row.original[cell.column.id];\n const changedDate = (event as any).detail;\n if (hasChanged(originalDate, changedDate)) {\n handleChange(changedDate);\n }\n };\n\n if (typeof controlRenderer === 'function') {\n return controlRenderer(\n {\n ...attributes,\n ref: ref,\n setValue: nextValue => {\n if (nextValue !== value) {\n handleChange(nextValue);\n }\n },\n value,\n },\n data\n );\n } else if (controlRenderer === 'datepicker') {\n const handleDatepickerKeyDown = (event: React.KeyboardEvent<HTMLInputElement>) => {\n handleKeyDown(event);\n\n if (/^[a-z0-9]$/i.test(event.key)) {\n tableMeta.editing.setDetailModeEditing(true);\n return;\n }\n };\n\n return (\n <Datepicker\n {...attributes}\n className={cn({\n '[&_input]:!yt-focus-dark': isCellInDetailMode,\n })}\n onChange={handleDatepickerChange}\n onKeyDown={handleDatepickerKeyDown}\n ref={refCallback}\n value={value as Date}\n />\n );\n } else if (controlRenderer === 'switch') {\n return (\n <Switch {...attributes} className=\"mx-2 mt-1.5\" checked={Boolean(value)} onChange={handleChange} ref={refCallback} />\n );\n } else if (controlRenderer === 'textarea') {\n return (\n <TextAreaControl\n {...props}\n isCellInDetailMode={isCellInDetailMode}\n onKeyDown={handleInputKeyDown}\n ref={refCallback}\n />\n );\n }\n\n return (\n <Input\n {...attributes}\n className={cn(getInputAppearanceClassnames(), getCellAlignmentClasses(align), {\n '!yt-focus-dark': isCellInDetailMode,\n })}\n onChange={event => {\n handleChange(event.target.value);\n }}\n onKeyDown={handleInputKeyDown}\n ref={refCallback}\n type={isNumber ? 'number' : undefined}\n value={isNumber ? value : String(value ?? '')}\n />\n );\n});\n"],"names":["EditingControl","React","forwardRef","Control","props","externalRef","align","column","data","initialValue","onChange","handleChange","table","tableRef","value","cell","isCurrentRow","attributes","tableMeta","options","meta","ref","useRef","refCallback","mergeRefs","columnMeta","columnDef","controlRenderer","control","isCellInDetailMode","editing","detailModeEditing","_ref$current","current","contains","document","activeElement","handleKeyDown","event","target","readOnly","key","stopPropagation","preventDefault","setDetailModeEditing","changedRow","changes","row","id","rowEdtitingDataWithInitialValue","_","isEqual","original","resetChange","_tableRef$current","toggleEditing","focus","deselectInputValue","_target$select","select","call","isNumber","handleInputKeyDown","test","handleDatepickerChange","originalDate","changedDate","detail","hasChanged","setValue","nextValue","handleDatepickerKeyDown","Datepicker","className","cn","onKeyDown","Switch","checked","Boolean","TextAreaControl","Input","getInputAppearanceClassnames","getCellAlignmentClasses","type","undefined","String"],"mappings":"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"}
@@ -0,0 +1,102 @@
1
+ import React__default from 'react';
2
+ import cn from 'classnames';
3
+ import { useMergedRef } from '../../../../../../hooks/useMergedRef.js';
4
+ import { getCellAlignmentClasses } from '../../styles.js';
5
+ import { Textarea } from '../../../../../Textarea/Textarea.js';
6
+
7
+ const TextAreaControl = /*#__PURE__*/React__default.forwardRef(function TextAreaControl(props, externalRef) {
8
+ const {
9
+ onKeyDown: handleKeyDown,
10
+ onChange: handleChange,
11
+ column,
12
+ isCellInDetailMode,
13
+ align,
14
+ isCurrentRow,
15
+ value,
16
+ ...attributes
17
+ } = props;
18
+ const textareaMaxHeight = 120;
19
+ const textareaMinHeight = 32;
20
+ const columnMeta = column.columnDef.meta;
21
+ const ref = useMergedRef(externalRef);
22
+ React__default.useEffect(() => {
23
+ // If truncation is not enabled, then textarea should re-calculate it's height to fit with it's own content, when initialized.
24
+ if (ref !== null && ref !== void 0 && ref.current && !(columnMeta !== null && columnMeta !== void 0 && columnMeta.enableTruncate)) {
25
+ const textareaElement = ref === null || ref === void 0 ? void 0 : ref.current;
26
+ resizeTextArea(textareaElement);
27
+ }
28
+ }, []);
29
+ React__default.useEffect(() => {
30
+ // If truncation is enabled, then textarea should only adjust to it's own content, when in detail mode.
31
+ // Otherwise it should collapse to minimal height.
32
+ if (ref !== null && ref !== void 0 && ref.current && columnMeta !== null && columnMeta !== void 0 && columnMeta.enableTruncate) {
33
+ const textareaElement = ref === null || ref === void 0 ? void 0 : ref.current;
34
+ if (isCellInDetailMode) {
35
+ resizeTextArea(textareaElement);
36
+ } else {
37
+ textareaElement.style.height = `${textareaMinHeight}px`;
38
+ }
39
+ }
40
+ }, [isCellInDetailMode]);
41
+ const resizeTextArea = textareaElement => {
42
+ // Need to set inherit before calculating height, so that browser sets the scrollHeight properly,
43
+ // depending on text inside.
44
+ const textareaRect = textareaElement.getBoundingClientRect();
45
+ const prevHeight = textareaRect.height;
46
+ if (columnMeta !== null && columnMeta !== void 0 && columnMeta.enableTruncate) {
47
+ if (prevHeight < textareaMaxHeight) {
48
+ textareaElement.style.height = 'inherit';
49
+ textareaElement.style.height = `${Math.min(textareaElement.scrollHeight, textareaMaxHeight)}px`;
50
+ }
51
+ } else {
52
+ textareaElement.style.height = 'inherit';
53
+ textareaElement.style.height = `${textareaElement.scrollHeight}px`;
54
+ }
55
+ };
56
+ const handleTextareaChange = e => {
57
+ resizeTextArea(e.target);
58
+ };
59
+ const textareaContainerClassName = cn('w-full', {
60
+ 'focus-within:absolute focus-within:left-0 focus-within:top-0 focus-within:z-20 focus-within:px-2 focus-within:pt-[var(--table3-row-padding)]': columnMeta === null || columnMeta === void 0 ? void 0 : columnMeta.enableTruncate
61
+ });
62
+ const handleTextareaKeyDown = event => {
63
+ // By default Shift + Enter in textarea makes a new line, we want to keep this behaviour
64
+ if (event.shiftKey && event.key === 'Enter') {
65
+ return;
66
+ } else {
67
+ handleKeyDown(event);
68
+ }
69
+ };
70
+ return /*#__PURE__*/React__default.createElement("div", {
71
+ className: textareaContainerClassName,
72
+ "data-taco": "input-container"
73
+ }, /*#__PURE__*/React__default.createElement(Textarea, Object.assign({}, attributes, {
74
+ onChange: event => {
75
+ handleChange(event.target.value);
76
+ handleTextareaChange(event);
77
+ },
78
+ rows: 1,
79
+ onKeyDown: e => {
80
+ handleTextareaKeyDown(e);
81
+ },
82
+ onBlur: event => {
83
+ // If truncation is enabled, then textarea should shring back to min height, when loosing focus.
84
+ if (columnMeta !== null && columnMeta !== void 0 && columnMeta.enableTruncate) {
85
+ const textareaElement = event.currentTarget;
86
+ textareaElement.style.height = `${textareaMinHeight}px`;
87
+ }
88
+ },
89
+ className: cn(getCellAlignmentClasses(align), `z-20 h-fit resize-none`, {
90
+ [`!min-h-[${textareaMinHeight}px]`]: columnMeta === null || columnMeta === void 0 ? void 0 : columnMeta.enableTruncate,
91
+ '!yt-focus-dark': isCellInDetailMode,
92
+ [`h-[${textareaMinHeight}px]`]: !isCellInDetailMode && (columnMeta === null || columnMeta === void 0 ? void 0 : columnMeta.enableTruncate),
93
+ // Only allow resizing when focused and truncation enabled
94
+ 'focus:resize-y': isCurrentRow && (columnMeta === null || columnMeta === void 0 ? void 0 : columnMeta.enableTruncate)
95
+ }),
96
+ ref: ref,
97
+ value: String(value !== null && value !== void 0 ? value : '')
98
+ })));
99
+ });
100
+
101
+ export { TextAreaControl };
102
+ //# sourceMappingURL=TextAreaControl.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TextAreaControl.js","sources":["../../../../../../../../../../../src/components/Table3/components/columns/cell/controls/TextAreaControl.tsx"],"sourcesContent":["import React from 'react';\nimport cn from 'classnames';\nimport { Textarea } from '../../../../../Textarea/Textarea';\nimport { EditingControlProps } from '../EditingControl';\nimport { getCellAlignmentClasses } from '../../styles';\nimport { useMergedRef } from '../../../../../../hooks/useMergedRef';\n\ntype TextAreaControlProps<TType = unknown> = EditingControlProps<TType> & {\n onKeyDown: (event: React.KeyboardEvent<HTMLTextAreaElement>) => void;\n isCellInDetailMode?: boolean;\n};\n\nexport const TextAreaControl = React.forwardRef<HTMLElement, any>(function TextAreaControl<TType = unknown>(\n props: TextAreaControlProps<TType>,\n externalRef: React.Ref<HTMLElement>\n) {\n const {\n onKeyDown: handleKeyDown,\n onChange: handleChange,\n column,\n isCellInDetailMode,\n align,\n isCurrentRow,\n value,\n ...attributes\n } = props;\n\n const textareaMaxHeight = 120;\n const textareaMinHeight = 32;\n\n const columnMeta = column.columnDef.meta;\n\n const ref = useMergedRef<HTMLTextAreaElement>(externalRef);\n\n React.useEffect(() => {\n // If truncation is not enabled, then textarea should re-calculate it's height to fit with it's own content, when initialized.\n if (ref?.current && !columnMeta?.enableTruncate) {\n const textareaElement = ref?.current as HTMLTextAreaElement;\n resizeTextArea(textareaElement);\n }\n }, []);\n\n React.useEffect(() => {\n // If truncation is enabled, then textarea should only adjust to it's own content, when in detail mode.\n // Otherwise it should collapse to minimal height.\n if (ref?.current && columnMeta?.enableTruncate) {\n const textareaElement = ref?.current as HTMLTextAreaElement;\n\n if (isCellInDetailMode) {\n resizeTextArea(textareaElement);\n } else {\n textareaElement.style.height = `${textareaMinHeight}px`;\n }\n }\n }, [isCellInDetailMode]);\n\n const resizeTextArea = (textareaElement: HTMLTextAreaElement) => {\n // Need to set inherit before calculating height, so that browser sets the scrollHeight properly,\n // depending on text inside.\n const textareaRect = textareaElement.getBoundingClientRect();\n const prevHeight = textareaRect.height;\n if (columnMeta?.enableTruncate) {\n if (prevHeight < textareaMaxHeight) {\n textareaElement.style.height = 'inherit';\n textareaElement.style.height = `${Math.min(textareaElement.scrollHeight, textareaMaxHeight)}px`;\n }\n } else {\n textareaElement.style.height = 'inherit';\n textareaElement.style.height = `${textareaElement.scrollHeight}px`;\n }\n };\n\n const handleTextareaChange = e => {\n resizeTextArea(e.target);\n };\n\n const textareaContainerClassName = cn('w-full', {\n 'focus-within:absolute focus-within:left-0 focus-within:top-0 focus-within:z-20 focus-within:px-2 focus-within:pt-[var(--table3-row-padding)]':\n columnMeta?.enableTruncate,\n });\n const handleTextareaKeyDown = (event: React.KeyboardEvent<HTMLTextAreaElement>) => {\n // By default Shift + Enter in textarea makes a new line, we want to keep this behaviour\n if (event.shiftKey && event.key === 'Enter') {\n return;\n } else {\n handleKeyDown(event);\n }\n };\n\n return (\n <div className={textareaContainerClassName} data-taco=\"input-container\">\n <Textarea\n {...attributes}\n onChange={event => {\n handleChange(event.target.value);\n handleTextareaChange(event);\n }}\n rows={1}\n onKeyDown={e => {\n handleTextareaKeyDown(e);\n }}\n onBlur={event => {\n // If truncation is enabled, then textarea should shring back to min height, when loosing focus.\n if (columnMeta?.enableTruncate) {\n const textareaElement = event.currentTarget;\n textareaElement.style.height = `${textareaMinHeight}px`;\n }\n }}\n className={cn(getCellAlignmentClasses(align), `z-20 h-fit resize-none`, {\n [`!min-h-[${textareaMinHeight}px]`]: columnMeta?.enableTruncate,\n '!yt-focus-dark': isCellInDetailMode,\n [`h-[${textareaMinHeight}px]`]: !isCellInDetailMode && columnMeta?.enableTruncate,\n // Only allow resizing when focused and truncation enabled\n 'focus:resize-y': isCurrentRow && columnMeta?.enableTruncate,\n })}\n ref={ref}\n value={String(value ?? '')}\n />\n </div>\n );\n});\n"],"names":["TextAreaControl","React","forwardRef","props","externalRef","onKeyDown","handleKeyDown","onChange","handleChange","column","isCellInDetailMode","align","isCurrentRow","value","attributes","textareaMaxHeight","textareaMinHeight","columnMeta","columnDef","meta","ref","useMergedRef","useEffect","current","enableTruncate","textareaElement","resizeTextArea","style","height","textareaRect","getBoundingClientRect","prevHeight","Math","min","scrollHeight","handleTextareaChange","e","target","textareaContainerClassName","cn","handleTextareaKeyDown","event","shiftKey","key","className","Textarea","rows","onBlur","currentTarget","getCellAlignmentClasses","String"],"mappings":"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"}
@@ -40,7 +40,7 @@ const MemoedFooter = /*#__PURE__*/React__default.memo(function MemoedFooter(prop
40
40
  className: className,
41
41
  "data-align": align,
42
42
  "data-column-index": index,
43
- role: "cell"
43
+ role: "columnheader"
44
44
  }, typeof meta.footer === 'function' ? /*#__PURE__*/React__default.createElement("span", {
45
45
  className: "flex-grow truncate"
46
46
  }, meta.footer(table.getRowModel().rows.map(row => row.original[id]))) : null);