@economic/taco 2.6.0 → 2.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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":"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"}
@@ -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);