@economic/taco 2.6.0 → 2.7.1
Sign up to get free protection for your applications and to get access to all the features.
- package/dist/components/Icon/components/AttachWarning.d.ts +3 -0
- package/dist/components/Icon/components/index.d.ts +1 -1
- package/dist/components/Input/Input.d.ts +1 -1
- package/dist/components/Menu/components/Item.d.ts +1 -1
- package/dist/components/Menu/components/Link.d.ts +1 -1
- package/dist/components/Navigation2/components/Link.d.ts +1 -1
- package/dist/components/Select2/components/Option.d.ts +1 -1
- package/dist/components/Select2/components/Search.d.ts +1 -1
- package/dist/components/Select2/components/Trigger.d.ts +1 -1
- package/dist/components/Table3/components/columns/cell/EditingCell.d.ts +5 -2
- package/dist/components/Table3/components/columns/cell/EditingControl.d.ts +21 -0
- package/dist/components/Table3/components/columns/cell/controls/TextAreaControl.d.ts +2 -0
- package/dist/components/Tag/Tag.d.ts +1 -1
- package/dist/esm/index.css +85 -22
- package/dist/esm/packages/taco/src/components/Icon/components/AttachWarning.js +19 -0
- package/dist/esm/packages/taco/src/components/Icon/components/AttachWarning.js.map +1 -0
- package/dist/esm/packages/taco/src/components/Icon/components/index.js +2 -0
- package/dist/esm/packages/taco/src/components/Icon/components/index.js.map +1 -1
- package/dist/esm/packages/taco/src/components/Select2/components/Trigger.js +1 -1
- package/dist/esm/packages/taco/src/components/Select2/components/Trigger.js.map +1 -1
- package/dist/esm/packages/taco/src/components/Table3/Table3.js +10 -3
- package/dist/esm/packages/taco/src/components/Table3/Table3.js.map +1 -1
- package/dist/esm/packages/taco/src/components/Table3/components/columns/cell/EditingCell.js +27 -145
- package/dist/esm/packages/taco/src/components/Table3/components/columns/cell/EditingCell.js.map +1 -1
- package/dist/esm/packages/taco/src/components/Table3/components/columns/cell/EditingControl.js +158 -0
- package/dist/esm/packages/taco/src/components/Table3/components/columns/cell/EditingControl.js.map +1 -0
- package/dist/esm/packages/taco/src/components/Table3/components/columns/cell/controls/TextAreaControl.js +102 -0
- package/dist/esm/packages/taco/src/components/Table3/components/columns/cell/controls/TextAreaControl.js.map +1 -0
- package/dist/esm/packages/taco/src/components/Table3/components/columns/footer/Footer.js +1 -1
- package/dist/esm/packages/taco/src/components/Table3/components/columns/footer/Footer.js.map +1 -1
- package/dist/esm/packages/taco/src/components/Table3/components/columns/internal/Actions.js +2 -2
- package/dist/esm/packages/taco/src/components/Table3/components/columns/internal/Actions.js.map +1 -1
- package/dist/esm/packages/taco/src/components/Table3/components/columns/internal/Selection.js.map +1 -1
- package/dist/esm/packages/taco/src/components/Table3/components/toolbar/PrintButton/PrintIFrame.js +1 -1
- package/dist/esm/packages/taco/src/components/Table3/hooks/useConvertChildrenToColumns.js +1 -1
- package/dist/esm/packages/taco/src/components/Table3/hooks/useConvertChildrenToColumns.js.map +1 -1
- package/dist/esm/packages/taco/src/index.js +1 -1
- package/dist/index.css +85 -22
- package/dist/primitives/Listbox2/components/Root.d.ts +1 -1
- package/dist/primitives/Listbox2/types.d.ts +1 -1
- package/dist/taco.cjs.development.js +309 -162
- package/dist/taco.cjs.development.js.map +1 -1
- package/dist/taco.cjs.production.min.js +1 -1
- package/dist/taco.cjs.production.min.js.map +1 -1
- package/package.json +2 -2
- package/types.json +14876 -12163
@@ -1,22 +1,26 @@
|
|
1
1
|
import React__default from 'react';
|
2
2
|
import cn from 'classnames';
|
3
|
-
import {
|
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
|
-
|
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
|
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(
|
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;
|
package/dist/esm/packages/taco/src/components/Table3/components/columns/cell/EditingCell.js.map
CHANGED
@@ -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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"}
|
package/dist/esm/packages/taco/src/components/Table3/components/columns/cell/EditingControl.js
ADDED
@@ -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
|
package/dist/esm/packages/taco/src/components/Table3/components/columns/cell/EditingControl.js.map
ADDED
@@ -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: "
|
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);
|