@economic/taco 2.14.2 → 2.16.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.
- package/dist/components/Drawer/Drawer.d.ts +5 -1
- package/dist/components/Icon/components/AiChatSolid.d.ts +3 -0
- package/dist/components/Icon/components/AiStars.d.ts +3 -0
- package/dist/components/Icon/components/EnvelopeSolid.d.ts +3 -0
- package/dist/components/Icon/components/PhoneSolid.d.ts +3 -0
- package/dist/components/Icon/components/QuestionMarkBold.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/Provider/Localization.d.ts +19 -0
- package/dist/components/SearchInput2/SearchInput2.d.ts +1 -0
- package/dist/components/Select2/components/Option.d.ts +2 -2
- package/dist/components/Select2/components/Search.d.ts +1 -1
- package/dist/components/Table3/components/alert/ErrorAlert.d.ts +10 -0
- package/dist/components/Table3/components/columns/cell/DisplayCell.d.ts +5 -2
- package/dist/components/Table3/components/columns/cell/EditingCell.d.ts +3 -0
- package/dist/components/Table3/components/columns/cell/Highlight.d.ts +2 -0
- package/dist/components/Table3/components/columns/internal/EditingActions.d.ts +1 -1
- package/dist/components/Table3/components/rows/Row.d.ts +2 -0
- package/dist/components/Table3/components/rows/RowContext.d.ts +1 -0
- package/dist/components/Table3/hooks/features/useEditing.d.ts +12 -11
- package/dist/components/Table3/hooks/features/usePauseShortcuts.d.ts +5 -0
- package/dist/components/Table3/hooks/features/useSearch.d.ts +2 -0
- package/dist/components/Table3/hooks/features/useValidation.d.ts +13 -0
- package/dist/components/Table3/hooks/useTable.d.ts +4 -0
- package/dist/components/Table3/types.d.ts +26 -1
- package/dist/components/Table3/util/editing.d.ts +6 -0
- package/dist/components/Tag/Tag.d.ts +1 -1
- package/dist/components/Tooltip/Tooltip.d.ts +4 -0
- package/dist/esm/index.css +112 -33
- package/dist/esm/packages/taco/src/components/Drawer/Drawer.js +7 -2
- package/dist/esm/packages/taco/src/components/Drawer/Drawer.js.map +1 -1
- package/dist/esm/packages/taco/src/components/Field/Field.js +19 -3
- package/dist/esm/packages/taco/src/components/Field/Field.js.map +1 -1
- package/dist/esm/packages/taco/src/components/Icon/components/AiChatSolid.js +19 -0
- package/dist/esm/packages/taco/src/components/Icon/components/AiChatSolid.js.map +1 -0
- package/dist/esm/packages/taco/src/components/Icon/components/AiStars.js +30 -0
- package/dist/esm/packages/taco/src/components/Icon/components/AiStars.js.map +1 -0
- package/dist/esm/packages/taco/src/components/Icon/components/EnvelopeSolid.js +19 -0
- package/dist/esm/packages/taco/src/components/Icon/components/EnvelopeSolid.js.map +1 -0
- package/dist/esm/packages/taco/src/components/Icon/components/PhoneSolid.js +17 -0
- package/dist/esm/packages/taco/src/components/Icon/components/PhoneSolid.js.map +1 -0
- package/dist/esm/packages/taco/src/components/Icon/components/QuestionMarkBold.js +17 -0
- package/dist/esm/packages/taco/src/components/Icon/components/QuestionMarkBold.js.map +1 -0
- package/dist/esm/packages/taco/src/components/Icon/components/index.js +10 -0
- package/dist/esm/packages/taco/src/components/Icon/components/index.js.map +1 -1
- package/dist/esm/packages/taco/src/components/Provider/Localization.js +19 -0
- package/dist/esm/packages/taco/src/components/Provider/Localization.js.map +1 -1
- package/dist/esm/packages/taco/src/components/SearchInput2/SearchInput2.js +4 -0
- package/dist/esm/packages/taco/src/components/SearchInput2/SearchInput2.js.map +1 -1
- package/dist/esm/packages/taco/src/components/Table3/Table3.js +28 -4
- package/dist/esm/packages/taco/src/components/Table3/Table3.js.map +1 -1
- package/dist/esm/packages/taco/src/components/Table3/components/alert/ErrorAlert.js +154 -0
- package/dist/esm/packages/taco/src/components/Table3/components/alert/ErrorAlert.js.map +1 -0
- package/dist/esm/packages/taco/src/components/Table3/components/columns/cell/Cell.js +51 -6
- package/dist/esm/packages/taco/src/components/Table3/components/columns/cell/Cell.js.map +1 -1
- package/dist/esm/packages/taco/src/components/Table3/components/columns/cell/DisplayCell.js +7 -55
- package/dist/esm/packages/taco/src/components/Table3/components/columns/cell/DisplayCell.js.map +1 -1
- package/dist/esm/packages/taco/src/components/Table3/components/columns/cell/EditingCell.js +69 -37
- 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 +17 -17
- package/dist/esm/packages/taco/src/components/Table3/components/columns/cell/EditingControl.js.map +1 -1
- package/dist/esm/packages/taco/src/components/Table3/components/columns/cell/Highlight.js +41 -0
- package/dist/esm/packages/taco/src/components/Table3/components/columns/cell/Highlight.js.map +1 -0
- package/dist/esm/packages/taco/src/components/Table3/components/columns/cell/controls/TextareaControl.js +21 -12
- package/dist/esm/packages/taco/src/components/Table3/components/columns/cell/controls/TextareaControl.js.map +1 -1
- 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/header/Group.js +6 -5
- package/dist/esm/packages/taco/src/components/Table3/components/columns/header/Group.js.map +1 -1
- package/dist/esm/packages/taco/src/components/Table3/components/columns/header/Header.js +2 -2
- package/dist/esm/packages/taco/src/components/Table3/components/columns/header/Header.js.map +1 -1
- package/dist/esm/packages/taco/src/components/Table3/components/columns/internal/EditingActions.js +57 -17
- package/dist/esm/packages/taco/src/components/Table3/components/columns/internal/EditingActions.js.map +1 -1
- package/dist/esm/packages/taco/src/components/Table3/components/rows/Row.js +42 -32
- package/dist/esm/packages/taco/src/components/Table3/components/rows/Row.js.map +1 -1
- package/dist/esm/packages/taco/src/components/Table3/components/rows/RowContext.js +2 -1
- package/dist/esm/packages/taco/src/components/Table3/components/rows/RowContext.js.map +1 -1
- package/dist/esm/packages/taco/src/components/Table3/components/toolbar/Filter/filters/Filters.js +8 -1
- package/dist/esm/packages/taco/src/components/Table3/components/toolbar/Filter/filters/Filters.js.map +1 -1
- package/dist/esm/packages/taco/src/components/Table3/components/toolbar/PrintButton/hooks/useParentStylesheets.js +2 -1
- package/dist/esm/packages/taco/src/components/Table3/components/toolbar/PrintButton/hooks/useParentStylesheets.js.map +1 -1
- package/dist/esm/packages/taco/src/components/Table3/components/toolbar/Search.js +48 -1
- package/dist/esm/packages/taco/src/components/Table3/components/toolbar/Search.js.map +1 -1
- package/dist/esm/packages/taco/src/components/Table3/components/toolbar/Settings.js +2 -2
- package/dist/esm/packages/taco/src/components/Table3/components/toolbar/Settings.js.map +1 -1
- package/dist/esm/packages/taco/src/components/Table3/components/toolbar/Toolbar.js +1 -1
- package/dist/esm/packages/taco/src/components/Table3/components/toolbar/Toolbar.js.map +1 -1
- package/dist/esm/packages/taco/src/components/Table3/hooks/features/useEditing.js +185 -101
- package/dist/esm/packages/taco/src/components/Table3/hooks/features/useEditing.js.map +1 -1
- package/dist/esm/packages/taco/src/components/Table3/hooks/features/usePauseShortcuts.js +12 -0
- package/dist/esm/packages/taco/src/components/Table3/hooks/features/usePauseShortcuts.js.map +1 -0
- package/dist/esm/packages/taco/src/components/Table3/hooks/features/useSearch.js +4 -1
- package/dist/esm/packages/taco/src/components/Table3/hooks/features/useSearch.js.map +1 -1
- package/dist/esm/packages/taco/src/components/Table3/hooks/features/useValidation.js +178 -0
- package/dist/esm/packages/taco/src/components/Table3/hooks/features/useValidation.js.map +1 -0
- 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/components/Table3/hooks/useTable.js +8 -2
- package/dist/esm/packages/taco/src/components/Table3/hooks/useTable.js.map +1 -1
- package/dist/esm/packages/taco/src/components/Table3/strategies/virtualised.js +1 -1
- package/dist/esm/packages/taco/src/components/Table3/types.js.map +1 -1
- package/dist/esm/packages/taco/src/components/Table3/util/editing.js +21 -1
- package/dist/esm/packages/taco/src/components/Table3/util/editing.js.map +1 -1
- package/dist/esm/packages/taco/src/components/Tooltip/Tooltip.js +4 -0
- package/dist/esm/packages/taco/src/components/Tooltip/Tooltip.js.map +1 -1
- package/dist/esm/packages/taco/src/utils/hooks/useTruncated.js +20 -0
- package/dist/esm/packages/taco/src/utils/hooks/useTruncated.js.map +1 -0
- package/dist/index.css +112 -33
- package/dist/taco.cjs.development.js +1735 -957
- 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 +23852 -10957
|
@@ -188,6 +188,47 @@ function IconAccounting(props, svgRef) {
|
|
|
188
188
|
}
|
|
189
189
|
var Accounting = /*#__PURE__*/React.forwardRef(IconAccounting);
|
|
190
190
|
|
|
191
|
+
function IconAiChatSolid(props, svgRef) {
|
|
192
|
+
return /*#__PURE__*/React.createElement("svg", Object.assign({
|
|
193
|
+
fill: "none",
|
|
194
|
+
xmlns: "http://www.w3.org/2000/svg",
|
|
195
|
+
viewBox: "0 0 24 24",
|
|
196
|
+
ref: svgRef
|
|
197
|
+
}, props), /*#__PURE__*/React.createElement("path", {
|
|
198
|
+
fillRule: "evenodd",
|
|
199
|
+
clipRule: "evenodd",
|
|
200
|
+
d: "M18.823 2.122a.188.188 0 01.352 0l.874 2.364c.02.051.06.092.111.11l2.364.875a.188.188 0 010 .352l-2.364.875a.188.188 0 00-.11.11l-.875 2.364a.188.188 0 01-.352 0l-.875-2.364a.187.187 0 00-.11-.11l-2.364-.875a.188.188 0 010-.352l2.364-.874a.187.187 0 00.11-.111l.875-2.364zm1.667 7a.188.188 0 01.351 0l.515 1.39a.19.19 0 00.11.112l1.39.514a.188.188 0 010 .352l-1.39.514a.188.188 0 00-.11.111l-.515 1.39a.187.187 0 01-.351 0l-.515-1.39a.187.187 0 00-.11-.11l-1.391-.515a.188.188 0 010-.352l1.39-.514a.187.187 0 00.111-.111l.515-1.39zm-5.363-2.36c-.889-.328-1.014-1.455-.374-2.008a12.291 12.291 0 00-3.864-.606C5.979 4.148 2 6.884 2 10.26c0 2.393 1.999 4.463 4.91 5.467L4.513 19.99a.556.556 0 00.832.706l5.406-4.325.426-.003c3.493-.076 6.477-1.538 7.829-3.612l-.879-.325c-1.034-.383-1.034-1.845 0-2.228l.234-.086a1.168 1.168 0 01-.476-.595l-.745-2.013-2.013-.745z",
|
|
201
|
+
fill: "currentColor"
|
|
202
|
+
}));
|
|
203
|
+
}
|
|
204
|
+
var AiChatSolid = /*#__PURE__*/React.forwardRef(IconAiChatSolid);
|
|
205
|
+
|
|
206
|
+
function IconAiStars(props, svgRef) {
|
|
207
|
+
return /*#__PURE__*/React.createElement("svg", Object.assign({
|
|
208
|
+
fill: "none",
|
|
209
|
+
xmlns: "http://www.w3.org/2000/svg",
|
|
210
|
+
viewBox: "0 0 24 24",
|
|
211
|
+
ref: svgRef
|
|
212
|
+
}, props), /*#__PURE__*/React.createElement("mask", {
|
|
213
|
+
id: "ai-stars_svg__a",
|
|
214
|
+
fill: "#fff"
|
|
215
|
+
}, /*#__PURE__*/React.createElement("path", {
|
|
216
|
+
fillRule: "evenodd",
|
|
217
|
+
clipRule: "evenodd",
|
|
218
|
+
d: "M17.324 2.476a.188.188 0 01.351 0l.875 2.364c.019.05.06.091.11.11l2.364.875a.188.188 0 010 .352l-2.363.874a.187.187 0 00-.111.11l-.875 2.365a.188.188 0 01-.351 0l-.875-2.364a.188.188 0 00-.11-.11l-2.364-.875a.188.188 0 010-.352l2.363-.875a.188.188 0 00.111-.11l.875-2.364zM8.226 4.931c.266-.719 1.281-.719 1.547 0l1.566 4.23 4.23 1.566c.719.266.719 1.282 0 1.547l-4.23 1.566-1.566 4.23c-.266.72-1.281.72-1.547 0L6.66 13.84l-4.23-1.566c-.719-.265-.719-1.281 0-1.547l4.23-1.566 1.566-4.23zM9 7.16L7.96 9.974a.825.825 0 01-.488.487L4.66 11.5l2.81 1.041a.825.825 0 01.488.487L9 15.84l1.04-2.812a.825.825 0 01.488-.487l2.811-1.04-2.81-1.04a.825.825 0 01-.488-.488L9 7.162zm8.675 7.315a.188.188 0 00-.351 0l-.875 2.364a.188.188 0 01-.11.11l-2.364.875a.188.188 0 000 .352l2.363.874c.052.02.092.06.111.11l.875 2.364c.06.164.291.164.351 0l.875-2.363a.187.187 0 01.11-.11l2.364-.875a.188.188 0 000-.352l-2.363-.875a.187.187 0 01-.111-.11l-.875-2.364z"
|
|
219
|
+
})), /*#__PURE__*/React.createElement("path", {
|
|
220
|
+
fillRule: "evenodd",
|
|
221
|
+
clipRule: "evenodd",
|
|
222
|
+
d: "M17.324 2.476a.188.188 0 01.351 0l.875 2.364c.019.05.06.091.11.11l2.364.875a.188.188 0 010 .352l-2.363.874a.187.187 0 00-.111.11l-.875 2.365a.188.188 0 01-.351 0l-.875-2.364a.188.188 0 00-.11-.11l-2.364-.875a.188.188 0 010-.352l2.363-.875a.188.188 0 00.111-.11l.875-2.364zM8.226 4.931c.266-.719 1.281-.719 1.547 0l1.566 4.23 4.23 1.566c.719.266.719 1.282 0 1.547l-4.23 1.566-1.566 4.23c-.266.72-1.281.72-1.547 0L6.66 13.84l-4.23-1.566c-.719-.265-.719-1.281 0-1.547l4.23-1.566 1.566-4.23zM9 7.16L7.96 9.974a.825.825 0 01-.488.487L4.66 11.5l2.81 1.041a.825.825 0 01.488.487L9 15.84l1.04-2.812a.825.825 0 01.488-.487l2.811-1.04-2.81-1.04a.825.825 0 01-.488-.488L9 7.162zm8.675 7.315a.188.188 0 00-.351 0l-.875 2.364a.188.188 0 01-.11.11l-2.364.875a.188.188 0 000 .352l2.363.874c.052.02.092.06.111.11l.875 2.364c.06.164.291.164.351 0l.875-2.363a.187.187 0 01.11-.11l2.364-.875a.188.188 0 000-.352l-2.363-.875a.187.187 0 01-.111-.11l-.875-2.364z",
|
|
223
|
+
fill: "currentColor"
|
|
224
|
+
}), /*#__PURE__*/React.createElement("path", {
|
|
225
|
+
d: "M17.675 2.476l.704-.26-.704.26zm-.351 0l-.704-.26.704.26zM18.55 4.84l.703-.26-.703.26zm.11.11l-.26.704.26-.704zm2.364.875l.26-.704-.26.704zm0 .352l-.26-.704.26.704zm-2.363.874l-.26-.703.26.703zm-.111.11l.703.261-.703-.26zm-.875 2.365l.704.26-.704-.26zm-.351 0l-.704.26.704-.26zm-.875-2.364l.703-.26-.703.26zm-.11-.11l.26-.704-.26.703zm-2.364-.875l-.26.703.26-.703zm0-.352l-.26-.704.26.704zm2.363-.875l.26.704-.26-.704zm.111-.11l.703.26-.703-.26zm-6.676.09l-.703.26.703-.26zm-1.547 0l.703.26-.703-.26zm3.113 4.231l-.704.26.12.324.323.12.26-.704zm4.23 1.566l-.26.703.26-.703zm0 1.547l-.26-.703.26.704zm-4.23 1.566l-.26-.703-.324.12-.12.323.704.26zm-1.566 4.23l-.703-.26.703.26zm-1.547 0l.703-.26-.703.26zM6.66 13.84l.704-.26-.12-.324-.324-.12-.26.704zm-4.23-1.566l.26-.703-.26.704zm0-1.547l.26.703-.26-.703zm4.23-1.566l.26.704.324-.12.12-.323-.704-.26zm1.3.812l.703.26-.704-.26zM9 7.162l.703-.26L9 5l-.704 1.9.704.26zM7.472 10.46l-.26-.703.26.704zM4.66 11.5l-.26-.703-1.901.704 1.9.703.26-.703zm2.81 1.041l.261-.703-.26.703zm.488.487l.704-.26-.704.26zM9 15.84l-.703.26L9 18l.703-1.9L9 15.84zm1.04-2.812l.704.26-.703-.26zm.488-.487l-.26-.703.26.703zm2.811-1.04l.26.703 1.901-.703-1.9-.704-.26.704zm-2.81-1.04l.26-.704-.26.704zm-.488-.488l.703-.26-.703.26zm7.284 4.503l-.704-.26.704.26zm.351 0l.704-.26-.704.26zM16.45 16.84l.703.26-.703-.26zm-.11.11l.26.704-.26-.704zm-2.364.875l-.26-.703.26.703zm0 .352l.26-.704-.26.704zm2.363.874l-.26.704.26-.704zm.111.11l.703-.26-.703.26zm.875 2.364l-.704.26.704-.26zm.351 0l.704.26-.704-.26zm.875-2.363l.703.26-.703-.26zm.11-.11l.261.703-.26-.704zm2.364-.875l.26.703-.26-.703zm0-.352l.26-.703-.26.703zm-2.363-.875l-.26.704.26-.704zm-.111-.11l.703-.26-.703.26zM18.38 2.216c-.302-.817-1.457-.817-1.759 0l1.407.52a.563.563 0 01-1.055 0l1.407-.52zm.874 2.363l-.874-2.363-1.407.52.875 2.364 1.406-.52zm-.332-.332a.562.562 0 01.332.332l-1.406.52a.937.937 0 00.553.555l.521-1.407zm2.364.874l-2.364-.874-.52 1.407 2.363.874.52-1.407zm0 1.759c.816-.302.816-1.456 0-1.759l-.521 1.407a.563.563 0 010-1.055l.52 1.407zm-2.364.875l2.364-.875-.521-1.407-2.363.875.52 1.407zm.332-.333a.562.562 0 01-.332.333l-.52-1.407a.937.937 0 00-.554.554l1.406.52zm-.874 2.364l.874-2.364-1.406-.52-.875 2.363 1.407.52zm-1.759 0c.302.816 1.457.816 1.759 0l-1.407-.52a.563.563 0 011.055 0l-1.407.52zm-.874-2.364l.874 2.364 1.407-.52-.875-2.364-1.406.52zm.332.333a.562.562 0 01-.332-.333l1.406-.52a.938.938 0 00-.553-.554l-.521 1.407zm-2.364-.875l2.364.875.52-1.407-2.363-.875-.52 1.407zm0-1.759c-.816.303-.816 1.457 0 1.759l.521-1.407c.49.181.49.874 0 1.055l-.52-1.407zm2.364-.874l-2.364.874.521 1.407 2.364-.874-.521-1.407zm-.332.332a.562.562 0 01.332-.332l.52 1.407a.938.938 0 00.555-.554l-1.407-.52zm.874-2.363l-.874 2.363 1.406.52.875-2.363-1.407-.52zM10.477 4.67c-.508-1.37-2.447-1.37-2.955 0l1.407.52a.1.1 0 01.015-.027.041.041 0 01.01-.01A.085.085 0 019 5.142c.021 0 .037.006.045.011a.041.041 0 01.01.01.1.1 0 01.015.028l1.407-.52zm1.565 4.231l-1.565-4.23-1.407.52 1.565 4.23 1.407-.52zm3.788 1.123L11.6 8.458l-.521 1.407 4.23 1.565.521-1.406zm0 2.954c1.371-.508 1.371-2.447 0-2.954l-.52 1.406a.103.103 0 01.028.015.044.044 0 01.009.01.084.084 0 01.011.046.084.084 0 01-.011.045.04.04 0 01-.01.01.102.102 0 01-.028.015l.521 1.407zm-4.23 1.565l4.23-1.565-.52-1.407-4.232 1.566.521 1.406zm-1.123 3.788l1.565-4.23-1.407-.521-1.565 4.23 1.407.521zm-2.955 0c.508 1.371 2.447 1.371 2.955 0l-1.407-.52a.1.1 0 01-.015.028.04.04 0 01-.01.009.085.085 0 01-.045.012.085.085 0 01-.046-.012.04.04 0 01-.01-.01.1.1 0 01-.015-.027l-1.407.52zm-1.565-4.23l1.565 4.23 1.407-.52-1.565-4.231-1.407.52zm-3.788-1.123l4.23 1.565.521-1.406-4.23-1.566-.521 1.407zm0-2.954c-1.371.507-1.371 2.446 0 2.954l.52-1.407a.1.1 0 01-.028-.015.04.04 0 01-.009-.01.085.085 0 01-.011-.045.09.09 0 01.011-.046.043.043 0 01.01-.01.099.099 0 01.028-.015l-.521-1.406zm4.23-1.566l-4.23 1.566.52 1.406L6.92 9.865 6.4 8.458zM7.523 4.67L5.957 8.901l1.407.52 1.565-4.23-1.407-.52zm1.14 5.563l1.04-2.81-1.406-.521-1.04 2.81 1.407.521zm-.93.93c.431-.159.771-.498.93-.93l-1.406-.52a.075.075 0 01-.044.044l.52 1.407zm-2.811 1.041l2.811-1.04-.52-1.407-2.812 1.04.52 1.407zm2.811-.366l-2.811-1.04-.52 1.406 2.81 1.04.521-1.406zm.93.93a1.574 1.574 0 00-.93-.93l-.52 1.406c.02.008.036.024.044.045l1.407-.52zm1.04 2.811l-1.04-2.81-1.406.52 1.04 2.81 1.407-.52zm-.366-2.81l-1.04 2.81 1.407.52 1.04-2.81-1.407-.52zm.93-.931c-.43.16-.77.499-.93.93l1.407.52a.075.075 0 01.044-.044l-.52-1.406zm2.812-1.04l-2.811 1.04.52 1.406 2.812-1.04-.52-1.407zm-2.811.366l2.811 1.04.52-1.407-2.81-1.04-.521 1.407zm-.93-.93c.159.43.499.77.93.93l.52-1.407a.075.075 0 01-.044-.044l-1.407.52zm-1.04-2.812l1.04 2.811 1.406-.52-1.04-2.811-1.407.52zm9.73 7.314a.563.563 0 01-1.055 0l1.407-.52c-.302-.816-1.457-.816-1.759 0l1.407.52zm-.875 2.364l.875-2.364-1.407-.52-.874 2.363 1.406.52zm-.553.554a.938.938 0 00.553-.554l-1.406-.52a.563.563 0 01.332-.333l.52 1.407zm-2.364.874l2.364-.874-.521-1.407-2.364.875.521 1.406zm0-1.055c.49.181.49.874 0 1.055l-.52-1.406c-.817.302-.817 1.456 0 1.758l.52-1.407zm2.364.875l-2.364-.875-.52 1.407 2.363.875.52-1.407zm.553.554a.938.938 0 00-.553-.554l-.521 1.407a.563.563 0 01-.332-.333l1.406-.52zm.875 2.363l-.875-2.363-1.406.52.874 2.364 1.407-.52zm-1.055 0a.563.563 0 011.055 0l-1.407.52c.302.817 1.457.817 1.759 0l-1.407-.52zm.875-2.363l-.875 2.363 1.407.52.874-2.363-1.406-.52zm.553-.554a.937.937 0 00-.553.554l1.406.52a.562.562 0 01-.332.333l-.52-1.407zm2.364-.875l-2.363.875.52 1.407 2.364-.875-.521-1.407zm0 1.055a.563.563 0 010-1.055l.52 1.407c.817-.302.817-1.456 0-1.758l-.52 1.406zm-2.363-.874l2.363.874.52-1.406-2.363-.875-.52 1.407zm-.554-.554a.938.938 0 00.553.554l.521-1.407a.562.562 0 01.332.332l-1.406.52zm-.875-2.364l.875 2.364 1.406-.52-.874-2.364-1.407.52z",
|
|
226
|
+
fill: "currentColor",
|
|
227
|
+
mask: "url(#ai-stars_svg__a)"
|
|
228
|
+
}));
|
|
229
|
+
}
|
|
230
|
+
var AiStars = /*#__PURE__*/React.forwardRef(IconAiStars);
|
|
231
|
+
|
|
191
232
|
function IconArrowBottom(props, svgRef) {
|
|
192
233
|
return /*#__PURE__*/React.createElement("svg", Object.assign({
|
|
193
234
|
xmlns: "http://www.w3.org/2000/svg",
|
|
@@ -1471,6 +1512,21 @@ function IconEnvelopeApproved(props, svgRef) {
|
|
|
1471
1512
|
}
|
|
1472
1513
|
var EnvelopeApproved = /*#__PURE__*/React.forwardRef(IconEnvelopeApproved);
|
|
1473
1514
|
|
|
1515
|
+
function IconEnvelopeSolid(props, svgRef) {
|
|
1516
|
+
return /*#__PURE__*/React.createElement("svg", Object.assign({
|
|
1517
|
+
fill: "none",
|
|
1518
|
+
xmlns: "http://www.w3.org/2000/svg",
|
|
1519
|
+
viewBox: "0 0 24 24",
|
|
1520
|
+
ref: svgRef
|
|
1521
|
+
}, props), /*#__PURE__*/React.createElement("path", {
|
|
1522
|
+
fillRule: "evenodd",
|
|
1523
|
+
clipRule: "evenodd",
|
|
1524
|
+
d: "M2.137 5.07l8.77 7.016a1.75 1.75 0 002.186 0l8.77-7.016c.088.209.137.439.137.68v12.5A1.75 1.75 0 0120.25 20H3.75A1.75 1.75 0 012 18.25V5.75c0-.241.049-.471.137-.68zM3.28 4.064c.15-.042.307-.064.47-.064h16.5c.163 0 .32.022.47.064l-8.564 6.85a.25.25 0 01-.312 0L3.28 4.064z",
|
|
1525
|
+
fill: "currentColor"
|
|
1526
|
+
}));
|
|
1527
|
+
}
|
|
1528
|
+
var EnvelopeSolid = /*#__PURE__*/React.forwardRef(IconEnvelopeSolid);
|
|
1529
|
+
|
|
1474
1530
|
function IconEnvelope(props, svgRef) {
|
|
1475
1531
|
return /*#__PURE__*/React.createElement("svg", Object.assign({
|
|
1476
1532
|
xmlns: "http://www.w3.org/2000/svg",
|
|
@@ -2481,6 +2537,19 @@ function IconPersonTick(props, svgRef) {
|
|
|
2481
2537
|
}
|
|
2482
2538
|
var PersonTick = /*#__PURE__*/React.forwardRef(IconPersonTick);
|
|
2483
2539
|
|
|
2540
|
+
function IconPhoneSolid(props, svgRef) {
|
|
2541
|
+
return /*#__PURE__*/React.createElement("svg", Object.assign({
|
|
2542
|
+
fill: "none",
|
|
2543
|
+
xmlns: "http://www.w3.org/2000/svg",
|
|
2544
|
+
viewBox: "0 0 24 24",
|
|
2545
|
+
ref: svgRef
|
|
2546
|
+
}, props), /*#__PURE__*/React.createElement("path", {
|
|
2547
|
+
d: "M5.357 4.384l.891-.58c.835-.542 1.942-.323 2.586.513l1.28 1.663c.56.724.628 1.734.17 2.496l-1.273 2.12c.372.965.962 1.855 1.77 2.67a8.253 8.253 0 002.701 1.844l1.876-1.253c.711-.475 1.645-.398 2.317.19l1.565 1.373c.782.685.99 1.862.487 2.755l-.538.957c-.536.952-1.517 1.508-2.576 1.46-2.498-.115-5.197-1.718-8.096-4.811-2.903-3.098-4.408-5.983-4.514-8.655-.045-1.125.47-2.168 1.354-2.742z",
|
|
2548
|
+
fill: "currentColor"
|
|
2549
|
+
}));
|
|
2550
|
+
}
|
|
2551
|
+
var PhoneSolid = /*#__PURE__*/React.forwardRef(IconPhoneSolid);
|
|
2552
|
+
|
|
2484
2553
|
function IconPlay(props, svgRef) {
|
|
2485
2554
|
return /*#__PURE__*/React.createElement("svg", Object.assign({
|
|
2486
2555
|
xmlns: "http://www.w3.org/2000/svg",
|
|
@@ -2587,6 +2656,19 @@ function IconProjects(props, svgRef) {
|
|
|
2587
2656
|
}
|
|
2588
2657
|
var Projects = /*#__PURE__*/React.forwardRef(IconProjects);
|
|
2589
2658
|
|
|
2659
|
+
function IconQuestionMarkBold(props, svgRef) {
|
|
2660
|
+
return /*#__PURE__*/React.createElement("svg", Object.assign({
|
|
2661
|
+
fill: "none",
|
|
2662
|
+
xmlns: "http://www.w3.org/2000/svg",
|
|
2663
|
+
viewBox: "0 0 24 24",
|
|
2664
|
+
ref: svgRef
|
|
2665
|
+
}, props), /*#__PURE__*/React.createElement("path", {
|
|
2666
|
+
d: "M5.367 7.727a.476.476 0 00.484.48h3.147c.274 0 .492-.222.537-.493.184-1.108.965-1.9 2.266-1.9 1.161 0 2.252.623 2.252 2.053 0 1.246-.864 1.841-2.195 2.705-1.714 1.09-2.634 2.534-2.422 4.715l.008.173a.5.5 0 00.5.478h3a.5.5 0 00.5-.5v-.18c0-1.514.665-1.953 2.322-3.072 1.374-.934 2.86-2.025 2.86-4.545 0-3.569-3.002-5.325-6.556-5.325-3.361 0-6.618 1.557-6.703 5.411zm3.432 12.247c0 1.388 1.09 2.322 2.776 2.322 1.741 0 2.817-.934 2.817-2.322 0-1.416-1.09-2.35-2.817-2.35-1.7 0-2.776.934-2.776 2.35z",
|
|
2667
|
+
fill: "currentColor"
|
|
2668
|
+
}));
|
|
2669
|
+
}
|
|
2670
|
+
var QuestionMarkBold = /*#__PURE__*/React.forwardRef(IconQuestionMarkBold);
|
|
2671
|
+
|
|
2590
2672
|
function IconQuestionMark(props, svgRef) {
|
|
2591
2673
|
return /*#__PURE__*/React.createElement("svg", Object.assign({
|
|
2592
2674
|
fill: "none",
|
|
@@ -3294,6 +3376,8 @@ const icons = {
|
|
|
3294
3376
|
'accounting-year-cancel': AccountingYearCancel,
|
|
3295
3377
|
'accounting-year': AccountingYear,
|
|
3296
3378
|
accounting: Accounting,
|
|
3379
|
+
'ai-chat-solid': AiChatSolid,
|
|
3380
|
+
'ai-stars': AiStars,
|
|
3297
3381
|
'arrow-bottom': ArrowBottom,
|
|
3298
3382
|
'arrow-down': ArrowDown,
|
|
3299
3383
|
'arrow-end': ArrowEnd,
|
|
@@ -3391,6 +3475,7 @@ const icons = {
|
|
|
3391
3475
|
'entry-type-supplier-invoice': EntryTypeSupplierInvoice,
|
|
3392
3476
|
'entry-type-supplier-payment': EntryTypeSupplierPayment,
|
|
3393
3477
|
'envelope-approved': EnvelopeApproved,
|
|
3478
|
+
'envelope-solid': EnvelopeSolid,
|
|
3394
3479
|
envelope: Envelope,
|
|
3395
3480
|
'expand-view': ExpandView,
|
|
3396
3481
|
expenses: Expenses,
|
|
@@ -3466,6 +3551,7 @@ const icons = {
|
|
|
3466
3551
|
'person-minus': PersonMinus,
|
|
3467
3552
|
'person-plus': PersonPlus,
|
|
3468
3553
|
'person-tick': PersonTick,
|
|
3554
|
+
'phone-solid': PhoneSolid,
|
|
3469
3555
|
play: Play,
|
|
3470
3556
|
'plus-minus': PlusMinus,
|
|
3471
3557
|
print: Print,
|
|
@@ -3474,6 +3560,7 @@ const icons = {
|
|
|
3474
3560
|
profile: Profile,
|
|
3475
3561
|
'project-cards': ProjectCards,
|
|
3476
3562
|
projects: Projects,
|
|
3563
|
+
'question-mark-bold': QuestionMarkBold,
|
|
3477
3564
|
'question-mark': QuestionMark,
|
|
3478
3565
|
quicklinks: Quicklinks,
|
|
3479
3566
|
'rating-bankruptcy': RatingBankruptcy,
|
|
@@ -4016,9 +4103,13 @@ const Tooltip = /*#__PURE__*/React.forwardRef(function Tooltip(props, ref) {
|
|
|
4016
4103
|
title,
|
|
4017
4104
|
children,
|
|
4018
4105
|
placement,
|
|
4106
|
+
hide = false,
|
|
4019
4107
|
...otherProps
|
|
4020
4108
|
} = props;
|
|
4021
4109
|
const className = cn(otherProps.className);
|
|
4110
|
+
if (hide) {
|
|
4111
|
+
return children;
|
|
4112
|
+
}
|
|
4022
4113
|
return /*#__PURE__*/React.createElement(TooltipPrimitive.Root, {
|
|
4023
4114
|
delayDuration: 250
|
|
4024
4115
|
}, /*#__PURE__*/React.createElement(TooltipPrimitive.Trigger, {
|
|
@@ -4291,6 +4382,12 @@ const defaultLocalisationTexts = {
|
|
|
4291
4382
|
saving: {
|
|
4292
4383
|
progress: 'Saving...',
|
|
4293
4384
|
complete: 'Saved'
|
|
4385
|
+
},
|
|
4386
|
+
clearChangesConfirmationDialog: {
|
|
4387
|
+
title: 'Discard changes',
|
|
4388
|
+
description: 'Are you sure you want to discard changes on row ‘[ROW_IDENTIFIER] [ROW_IDENTIFIER_VALUE]’. Your changes will be lost.',
|
|
4389
|
+
cancel: 'Continue edititng',
|
|
4390
|
+
confirm: 'Discard'
|
|
4294
4391
|
}
|
|
4295
4392
|
},
|
|
4296
4393
|
filters: {
|
|
@@ -4391,6 +4488,19 @@ const defaultLocalisationTexts = {
|
|
|
4391
4488
|
},
|
|
4392
4489
|
otherOptions: {
|
|
4393
4490
|
tooltip: 'Table settings'
|
|
4491
|
+
},
|
|
4492
|
+
validation: {
|
|
4493
|
+
index: 'Index',
|
|
4494
|
+
alert: {
|
|
4495
|
+
unsavedEntries: (count = 1) => count === 1 ? 'unsaved entry:' : 'unsaved entries:',
|
|
4496
|
+
incompleteAndHavntBeenSaved: (count = 1) => count === 1 ? 'is incomplete and haven’t been saved.' : 'are incomplete and haven’t been saved.'
|
|
4497
|
+
},
|
|
4498
|
+
resetFiltersDialog: {
|
|
4499
|
+
title: 'Row is hidden',
|
|
4500
|
+
description: 'The row is hidden due to filtering.',
|
|
4501
|
+
cancel: 'Cancel',
|
|
4502
|
+
confirm: 'Remove filters'
|
|
4503
|
+
}
|
|
4394
4504
|
}
|
|
4395
4505
|
},
|
|
4396
4506
|
searchInput: {
|
|
@@ -6692,11 +6802,14 @@ const Trigger$4 = /*#__PURE__*/React.forwardRef(function DrawerTrigger(props, re
|
|
|
6692
6802
|
}));
|
|
6693
6803
|
});
|
|
6694
6804
|
|
|
6805
|
+
const DEFAULT_OUTLET_NAME = 'default';
|
|
6695
6806
|
const Outlet = /*#__PURE__*/React.forwardRef(function Outlet(props, ref) {
|
|
6807
|
+
var _props$name;
|
|
6696
6808
|
const className = cn('h-full ml-auto overflow-hidden flex-shrink-0', props.className);
|
|
6697
6809
|
return /*#__PURE__*/React.createElement("div", Object.assign({}, props, {
|
|
6698
6810
|
className: className,
|
|
6699
6811
|
"data-taco": "drawer-outlet",
|
|
6812
|
+
"data-taco-outlet-name": (_props$name = props.name) !== null && _props$name !== void 0 ? _props$name : DEFAULT_OUTLET_NAME,
|
|
6700
6813
|
ref: ref
|
|
6701
6814
|
}));
|
|
6702
6815
|
});
|
|
@@ -6720,6 +6833,7 @@ const Drawer = /*#__PURE__*/React.forwardRef(function Drawer(props, ref) {
|
|
|
6720
6833
|
children,
|
|
6721
6834
|
focusTrap = props.focusTrap === undefined && props.variant === 'overlay' ? true : props.focusTrap,
|
|
6722
6835
|
showCloseButton = true,
|
|
6836
|
+
outletName,
|
|
6723
6837
|
...otherProps
|
|
6724
6838
|
} = props;
|
|
6725
6839
|
const [open, setOpen] = reactUseControllableState.useControllableState({
|
|
@@ -6749,9 +6863,10 @@ const Drawer = /*#__PURE__*/React.forwardRef(function Drawer(props, ref) {
|
|
|
6749
6863
|
}, []);
|
|
6750
6864
|
React.useEffect(() => {
|
|
6751
6865
|
var _document$querySelect;
|
|
6752
|
-
const
|
|
6866
|
+
const outletSelector = `[data-taco="drawer-outlet"][data-taco-outlet-name="${outletName !== null && outletName !== void 0 ? outletName : DEFAULT_OUTLET_NAME}"]`;
|
|
6867
|
+
const outletElement = (_document$querySelect = document.querySelector(outletSelector)) !== null && _document$querySelect !== void 0 ? _document$querySelect : document.body;
|
|
6753
6868
|
setOutlet(outletElement);
|
|
6754
|
-
}, []);
|
|
6869
|
+
}, [outletName]);
|
|
6755
6870
|
React.useEffect(() => {
|
|
6756
6871
|
if (open) {
|
|
6757
6872
|
// if drawerStack is defined, this means that another drawer was opened before
|
|
@@ -6784,7 +6899,30 @@ Drawer.Close = Close$3;
|
|
|
6784
6899
|
Drawer.Actions = Actions;
|
|
6785
6900
|
Drawer.Outlet = Outlet;
|
|
6786
6901
|
|
|
6902
|
+
const isTruncated = targetElement => {
|
|
6903
|
+
if (targetElement !== null) {
|
|
6904
|
+
return targetElement.offsetWidth < targetElement.scrollWidth;
|
|
6905
|
+
}
|
|
6906
|
+
return false;
|
|
6907
|
+
};
|
|
6908
|
+
const useTruncated = (element, deps = []) => {
|
|
6909
|
+
const [truncated, setTruncated] = React__default.useState(isTruncated(element));
|
|
6910
|
+
React__default.useEffect(() => {
|
|
6911
|
+
setTruncated(isTruncated(element));
|
|
6912
|
+
}, [element, ...deps]);
|
|
6913
|
+
return {
|
|
6914
|
+
truncated
|
|
6915
|
+
};
|
|
6916
|
+
};
|
|
6917
|
+
|
|
6787
6918
|
const Field = /*#__PURE__*/React.forwardRef(function Field(props, ref) {
|
|
6919
|
+
const [showTooltip, setShowTooltip] = React.useState(false);
|
|
6920
|
+
const messageRef = React.useRef(null);
|
|
6921
|
+
React.useEffect(() => {
|
|
6922
|
+
// refs are null on the first render so setting showTooltip state forces the rerender to see if message is
|
|
6923
|
+
// truncated or not
|
|
6924
|
+
setShowTooltip(true);
|
|
6925
|
+
}, []);
|
|
6788
6926
|
const {
|
|
6789
6927
|
disabled,
|
|
6790
6928
|
children,
|
|
@@ -6802,14 +6940,21 @@ const Field = /*#__PURE__*/React.forwardRef(function Field(props, ref) {
|
|
|
6802
6940
|
'text-yellow-700': warning && !invalid,
|
|
6803
6941
|
'opacity-50': disabled
|
|
6804
6942
|
});
|
|
6943
|
+
const {
|
|
6944
|
+
truncated: isMessageTrucated
|
|
6945
|
+
} = useTruncated(messageRef.current, [message, showTooltip]);
|
|
6805
6946
|
return /*#__PURE__*/React.createElement("label", Object.assign({}, otherProps, {
|
|
6806
6947
|
className: className,
|
|
6807
6948
|
"data-taco": "label",
|
|
6808
6949
|
ref: ref
|
|
6809
|
-
}), children, message && /*#__PURE__*/React.createElement(
|
|
6950
|
+
}), children, message && /*#__PURE__*/React.createElement(Tooltip, {
|
|
6951
|
+
title: message,
|
|
6952
|
+
hide: !isMessageTrucated
|
|
6953
|
+
}, /*#__PURE__*/React.createElement("span", {
|
|
6810
6954
|
className: messageClassName,
|
|
6955
|
+
ref: messageRef,
|
|
6811
6956
|
role: invalid ? 'alert' : undefined
|
|
6812
|
-
}, message));
|
|
6957
|
+
}, message)));
|
|
6813
6958
|
});
|
|
6814
6959
|
|
|
6815
6960
|
const Form = /*#__PURE__*/React.forwardRef(function Form(props, ref) {
|
|
@@ -9013,6 +9158,7 @@ const SearchInput2 = /*#__PURE__*/React__default.forwardRef(function SearchInput
|
|
|
9013
9158
|
findTotal,
|
|
9014
9159
|
loading = false,
|
|
9015
9160
|
onChange: handleChange,
|
|
9161
|
+
onClear: handleClearCallback,
|
|
9016
9162
|
onClickFindNext: handleClickFindNext,
|
|
9017
9163
|
onClickFindPrevious: handleClickFindPrevious,
|
|
9018
9164
|
settingsContent,
|
|
@@ -9049,6 +9195,7 @@ const SearchInput2 = /*#__PURE__*/React__default.forwardRef(function SearchInput
|
|
|
9049
9195
|
return (_internalRef$current2 = internalRef.current) === null || _internalRef$current2 === void 0 ? void 0 : _internalRef$current2.blur();
|
|
9050
9196
|
});
|
|
9051
9197
|
handleChange('');
|
|
9198
|
+
handleClearCallback === null || handleClearCallback === void 0 ? void 0 : handleClearCallback();
|
|
9052
9199
|
};
|
|
9053
9200
|
const handleFocus = event => {
|
|
9054
9201
|
var _attributes$onFocus;
|
|
@@ -9170,6 +9317,8 @@ const SearchInput2 = /*#__PURE__*/React__default.forwardRef(function SearchInput
|
|
|
9170
9317
|
opacity: 0.999
|
|
9171
9318
|
}
|
|
9172
9319
|
}, input, /*#__PURE__*/React__default.createElement("div", {
|
|
9320
|
+
// We need to trigger blur when settings got blured as well, because settings is a part of SearchInput2 component
|
|
9321
|
+
onBlur: handleBlur,
|
|
9173
9322
|
className: settingsClassname,
|
|
9174
9323
|
onClickCapture: () => {
|
|
9175
9324
|
var _internalRef$current5;
|
|
@@ -12516,9 +12665,9 @@ const MemoedHeader = /*#__PURE__*/React__default.memo(function MemoedHeader(prop
|
|
|
12516
12665
|
sortDirection,
|
|
12517
12666
|
table
|
|
12518
12667
|
} = props;
|
|
12519
|
-
const className = cn('
|
|
12668
|
+
const className = cn('font-bold border-b-2 box-content group/column relative', '[[role="table"][data-resizing="true"]_&]:pointer-events-none', 'px-[var(--table3-cell-padding-x)]', {
|
|
12520
12669
|
'!border-white': isPlaceholder,
|
|
12521
|
-
'h-10 items-center': !isPrinting,
|
|
12670
|
+
'h-10 items-center sticky': !isPrinting,
|
|
12522
12671
|
'pb-2': isPrinting,
|
|
12523
12672
|
'cursor-pointer select-none': canSort,
|
|
12524
12673
|
'hover:bg-grey-100': !isPlaceholder && (canSort || canResize || hasMenu),
|
|
@@ -12598,27 +12747,60 @@ const RowContext = /*#__PURE__*/React__default.createContext({
|
|
|
12598
12747
|
setIsHovered: () => {
|
|
12599
12748
|
/* empty */
|
|
12600
12749
|
},
|
|
12601
|
-
rowIndex: 0
|
|
12750
|
+
rowIndex: 0,
|
|
12751
|
+
hasError: false
|
|
12602
12752
|
});
|
|
12603
12753
|
const useRowContext = () => React__default.useContext(RowContext);
|
|
12604
12754
|
|
|
12755
|
+
const Highlight = props => {
|
|
12756
|
+
const {
|
|
12757
|
+
current,
|
|
12758
|
+
frozenColumnIndex,
|
|
12759
|
+
index,
|
|
12760
|
+
tableRef,
|
|
12761
|
+
...attributes
|
|
12762
|
+
} = props;
|
|
12763
|
+
const {
|
|
12764
|
+
hasError: rowHasError
|
|
12765
|
+
} = useRowContext();
|
|
12766
|
+
const ref = React__default.useRef(null);
|
|
12767
|
+
const className = cn('h-full flex [justify-content:inherit] [text-align:inherit]', props.className, {
|
|
12768
|
+
// normal row
|
|
12769
|
+
'bg-blue-200/25': !current && !rowHasError,
|
|
12770
|
+
// current row
|
|
12771
|
+
'bg-blue-200/75': current && !rowHasError,
|
|
12772
|
+
// normal row with error
|
|
12773
|
+
'bg-[#eaeaf5]': !current && rowHasError,
|
|
12774
|
+
// current with error
|
|
12775
|
+
'bg-[#dadaf5]': current && rowHasError
|
|
12776
|
+
});
|
|
12777
|
+
React__default.useEffect(() => {
|
|
12778
|
+
if (ref.current && current) {
|
|
12779
|
+
scrollColumnIntoView(index, frozenColumnIndex, ref.current, tableRef.current);
|
|
12780
|
+
}
|
|
12781
|
+
}, [current]);
|
|
12782
|
+
return /*#__PURE__*/React__default.createElement("div", Object.assign({}, attributes, {
|
|
12783
|
+
"data-taco": 'highlight',
|
|
12784
|
+
className: className,
|
|
12785
|
+
ref: ref
|
|
12786
|
+
}));
|
|
12787
|
+
};
|
|
12788
|
+
|
|
12605
12789
|
function DisplayCell(props) {
|
|
12606
12790
|
const {
|
|
12607
12791
|
cell,
|
|
12608
12792
|
className,
|
|
12609
12793
|
column,
|
|
12610
|
-
|
|
12794
|
+
value,
|
|
12611
12795
|
index,
|
|
12612
12796
|
row,
|
|
12613
12797
|
table,
|
|
12614
|
-
tableRef
|
|
12798
|
+
tableRef,
|
|
12799
|
+
highlighted,
|
|
12800
|
+
highlightedAsCurrent
|
|
12615
12801
|
} = props;
|
|
12616
12802
|
const columnMeta = React__default.useMemo(() => column.columnDef.meta, []);
|
|
12617
12803
|
const tableMeta = table.options.meta;
|
|
12618
|
-
const {
|
|
12619
|
-
rowIndex
|
|
12620
|
-
} = React__default.useContext(RowContext);
|
|
12621
|
-
const value = getValue();
|
|
12622
12804
|
// cells are heavily memoized because performance in our table is critical
|
|
12623
12805
|
// be careful and selective about props that you pass to the cell
|
|
12624
12806
|
const memoedProps = React__default.useMemo(() => {
|
|
@@ -12636,29 +12818,9 @@ function DisplayCell(props) {
|
|
|
12636
12818
|
tableRef
|
|
12637
12819
|
};
|
|
12638
12820
|
}, [row.original, props.children, value, tableMeta.columnFreezing.frozenColumnIndex]);
|
|
12639
|
-
const memoedHighlight = React__default.useMemo(() => {
|
|
12640
|
-
var _tableMeta$search$que;
|
|
12641
|
-
if (!tableMeta.search.isHighlightingEnabled || !columnMeta.enableSearch) {
|
|
12642
|
-
return false;
|
|
12643
|
-
}
|
|
12644
|
-
if ((_tableMeta$search$que = tableMeta.search.query) !== null && _tableMeta$search$que !== void 0 && _tableMeta$search$que.length) {
|
|
12645
|
-
return isCellHighlighted(tableMeta.search.query, value, columnMeta.dataType);
|
|
12646
|
-
}
|
|
12647
|
-
return false;
|
|
12648
|
-
}, [value, tableMeta.search.isHighlightingEnabled, tableMeta.search.excludeUnmatchedResults, tableMeta.search.query]);
|
|
12649
|
-
const memoedHighlightCurrent = React__default.useMemo(() => {
|
|
12650
|
-
if (!tableMeta.search.isHighlightingEnabled || !memoedHighlight || tableMeta.search.currentHighlightColumnIndex === undefined) {
|
|
12651
|
-
return false;
|
|
12652
|
-
}
|
|
12653
|
-
const [currentRowIndex, currentColumnIndex] = tableMeta.search.highlightedColumnIndexes[tableMeta.search.currentHighlightColumnIndex];
|
|
12654
|
-
if (currentRowIndex === rowIndex && currentColumnIndex === index) {
|
|
12655
|
-
return true;
|
|
12656
|
-
}
|
|
12657
|
-
return false;
|
|
12658
|
-
}, [memoedHighlight, tableMeta.search.highlightedColumnIndexes.length, tableMeta.search.currentHighlightColumnIndex]);
|
|
12659
12821
|
return /*#__PURE__*/React__default.createElement(MemoedDisplayCell, Object.assign({}, memoedProps, {
|
|
12660
|
-
highlighted:
|
|
12661
|
-
highlightedAsCurrent:
|
|
12822
|
+
highlighted: highlighted,
|
|
12823
|
+
highlightedAsCurrent: highlightedAsCurrent
|
|
12662
12824
|
}));
|
|
12663
12825
|
}
|
|
12664
12826
|
const MemoedDisplayCell = /*#__PURE__*/React__default.memo(function MemoedDisplayCell(props) {
|
|
@@ -12699,31 +12861,6 @@ const MemoedDisplayCell = /*#__PURE__*/React__default.memo(function MemoedDispla
|
|
|
12699
12861
|
tableRef: tableRef
|
|
12700
12862
|
}, content) : content);
|
|
12701
12863
|
});
|
|
12702
|
-
const Highlight = props => {
|
|
12703
|
-
const {
|
|
12704
|
-
current,
|
|
12705
|
-
frozenColumnIndex,
|
|
12706
|
-
index,
|
|
12707
|
-
tableRef,
|
|
12708
|
-
...attributes
|
|
12709
|
-
} = props;
|
|
12710
|
-
const ref = React__default.useRef(null);
|
|
12711
|
-
const className = cn('h-full flex [justify-content:inherit] [text-align:inherit]', props.className, {
|
|
12712
|
-
// normal row
|
|
12713
|
-
'bg-blue-200/25': !current,
|
|
12714
|
-
// current row
|
|
12715
|
-
'bg-blue-200/75': current
|
|
12716
|
-
});
|
|
12717
|
-
React__default.useEffect(() => {
|
|
12718
|
-
if (ref.current && current) {
|
|
12719
|
-
scrollColumnIntoView(index, frozenColumnIndex, ref.current, tableRef.current);
|
|
12720
|
-
}
|
|
12721
|
-
}, [current]);
|
|
12722
|
-
return /*#__PURE__*/React__default.createElement("div", Object.assign({}, attributes, {
|
|
12723
|
-
className: className,
|
|
12724
|
-
ref: ref
|
|
12725
|
-
}));
|
|
12726
|
-
};
|
|
12727
12864
|
|
|
12728
12865
|
function Footer$3(props) {
|
|
12729
12866
|
const {
|
|
@@ -12753,7 +12890,7 @@ const MemoedFooter = /*#__PURE__*/React__default.memo(function MemoedFooter(prop
|
|
|
12753
12890
|
meta,
|
|
12754
12891
|
table
|
|
12755
12892
|
} = props;
|
|
12756
|
-
const className = cn('sticky bottom-0 border-t-2 font-bold h-10 box-content items-center group/column relative', {
|
|
12893
|
+
const className = cn('sticky bottom-0 border-t-2 font-bold h-10 box-content items-center group/column relative z-10', {
|
|
12757
12894
|
'z-30': isFrozen
|
|
12758
12895
|
});
|
|
12759
12896
|
if (table.options.debugAll) {
|
|
@@ -13686,238 +13823,701 @@ function useRowClick(onRowClick) {
|
|
|
13686
13823
|
};
|
|
13687
13824
|
}
|
|
13688
13825
|
|
|
13689
|
-
|
|
13690
|
-
(
|
|
13691
|
-
|
|
13692
|
-
|
|
13693
|
-
|
|
13694
|
-
}
|
|
13695
|
-
|
|
13696
|
-
// used to switch the table into editing mode
|
|
13697
|
-
const [isEditing, setIsEditing] = React__default.useState(false);
|
|
13698
|
-
// Saving indicator need to show saving state per row, saving state can have at lkeast two states 'saving', 'saved',
|
|
13699
|
-
// 'saved' should remain for a few seconds to show tick icon after row has been saved.
|
|
13700
|
-
const [savingStates, setSavingStates] = React__default.useState(null);
|
|
13701
|
-
// sets of row changes pending save, either they have not saved yet or they have errors
|
|
13702
|
-
const [changes, setChanges] = React__default.useState(null);
|
|
13703
|
-
const [detailModeEditing, setDetailModeEditing] = React__default.useState(false);
|
|
13704
|
-
function getCellValue(cell) {
|
|
13705
|
-
var _changes$cell$row$id;
|
|
13706
|
-
return changes ? (_changes$cell$row$id = changes[cell.row.id]) === null || _changes$cell$row$id === void 0 ? void 0 : _changes$cell$row$id[cell.column.id] : undefined;
|
|
13707
|
-
}
|
|
13708
|
-
// Saves editing cell value into editing state.
|
|
13709
|
-
function setCellValue(cell, value) {
|
|
13710
|
-
setChanges(currentChanges => {
|
|
13711
|
-
const nextChanges = {
|
|
13712
|
-
...currentChanges
|
|
13713
|
-
};
|
|
13714
|
-
if (nextChanges[cell.row.id]) {
|
|
13715
|
-
nextChanges[cell.row.id][cell.column.id] = value;
|
|
13716
|
-
// we should probably delete the cell if it has just reverted back to its original value
|
|
13717
|
-
} else {
|
|
13718
|
-
nextChanges[cell.row.id] = {
|
|
13719
|
-
...cell.row.original,
|
|
13720
|
-
[cell.column.id]: value
|
|
13721
|
-
};
|
|
13722
|
-
}
|
|
13723
|
-
return nextChanges;
|
|
13724
|
-
});
|
|
13826
|
+
const focussableNodeNames = ['A', 'BUTTON', 'INPUT', 'TEXTAREA', 'SELECT', 'DETAILS'];
|
|
13827
|
+
const focusableSelector = /*#__PURE__*/focussableNodeNames.join(', ');
|
|
13828
|
+
const hasChanged = (value, newValue) => {
|
|
13829
|
+
if (dateFns.isDate(value) && dateFns.isDate(newValue)) {
|
|
13830
|
+
return !isWeakEqual(value, newValue);
|
|
13831
|
+
} else if (Array.isArray(value)) {
|
|
13832
|
+
return JSON.stringify(value) !== JSON.stringify(newValue);
|
|
13725
13833
|
}
|
|
13726
|
-
|
|
13727
|
-
|
|
13728
|
-
|
|
13729
|
-
|
|
13730
|
-
|
|
13731
|
-
|
|
13732
|
-
|
|
13733
|
-
|
|
13734
|
-
|
|
13735
|
-
if (changeset.length === 0) {
|
|
13736
|
-
currentChanges = null;
|
|
13834
|
+
return value !== newValue;
|
|
13835
|
+
};
|
|
13836
|
+
const willRowMoveAfterSorting = (value, cell, rowIndex, rows, desc) => {
|
|
13837
|
+
var _resortedRows$index;
|
|
13838
|
+
const miniSortRows = [{
|
|
13839
|
+
...cell.row,
|
|
13840
|
+
original: {
|
|
13841
|
+
...cell.row.original,
|
|
13842
|
+
[cell.column.id]: value
|
|
13737
13843
|
}
|
|
13738
|
-
|
|
13844
|
+
}];
|
|
13845
|
+
// getValue is used by the built-in sort functons, so we need to make sure it returns the changed value
|
|
13846
|
+
miniSortRows[0].getValue = () => value;
|
|
13847
|
+
let index = 0;
|
|
13848
|
+
if (rowIndex > 0) {
|
|
13849
|
+
miniSortRows.unshift(rows[rowIndex - 1]);
|
|
13850
|
+
index = 1;
|
|
13739
13851
|
}
|
|
13740
|
-
|
|
13741
|
-
|
|
13852
|
+
if (rowIndex < rows.length - 1) {
|
|
13853
|
+
miniSortRows.push(rows[rowIndex + 1]);
|
|
13854
|
+
}
|
|
13855
|
+
let resortedRows = [...miniSortRows].sort((a, b) => cell.column.getSortingFn()(a, b, cell.column.id));
|
|
13856
|
+
if (desc) {
|
|
13857
|
+
resortedRows = resortedRows.reverse();
|
|
13858
|
+
}
|
|
13859
|
+
return ((_resortedRows$index = resortedRows[index]) === null || _resortedRows$index === void 0 ? void 0 : _resortedRows$index.id) !== cell.row.id;
|
|
13860
|
+
};
|
|
13861
|
+
// Last focused cell state (not react state)
|
|
13862
|
+
class LastCellIndex {
|
|
13863
|
+
constructor() {
|
|
13864
|
+
this._value = '0';
|
|
13865
|
+
}
|
|
13866
|
+
get value() {
|
|
13867
|
+
return this._value;
|
|
13868
|
+
}
|
|
13869
|
+
set value(val) {
|
|
13870
|
+
this._value = val;
|
|
13871
|
+
}
|
|
13872
|
+
}
|
|
13873
|
+
// Returns index of a closest parent column
|
|
13874
|
+
function getColumnIndex(element) {
|
|
13875
|
+
if (element) {
|
|
13876
|
+
var _element$closest;
|
|
13877
|
+
return (_element$closest = element.closest('[role=cell]')) === null || _element$closest === void 0 ? void 0 : _element$closest.getAttribute('data-column-index');
|
|
13878
|
+
}
|
|
13879
|
+
return null;
|
|
13880
|
+
}
|
|
13881
|
+
|
|
13882
|
+
const FOCUS_MANAGER_OPTIONS = {
|
|
13883
|
+
tabbable: true,
|
|
13884
|
+
// Filter out all focusable elelemnts which are not in current row
|
|
13885
|
+
accept: element => !!element.closest('[role="row"][data-current="true"]')
|
|
13886
|
+
};
|
|
13887
|
+
function Row$1(props) {
|
|
13888
|
+
var _tableMeta$validation, _tableMeta$validation2;
|
|
13889
|
+
const focusManager = focus.useFocusManager();
|
|
13890
|
+
const tableMeta = props.table.options.meta;
|
|
13891
|
+
const isCurrentRow = tableMeta.currentRow.currentRowIndex === props.index;
|
|
13892
|
+
const isDraggingRow = tableMeta.rowDrag.dragging[props.row.id];
|
|
13893
|
+
const isFirstRow = props.index === 0;
|
|
13894
|
+
// we use non-css hovered state to determine whether to render actions or not, for performance
|
|
13895
|
+
const [isHovered, setIsHovered] = React__default.useState(false);
|
|
13896
|
+
// tab behaviour is consistent across normal mode and edit mode, handle it here
|
|
13897
|
+
const handleKeyDown = event => {
|
|
13898
|
+
if (event.isDefaultPrevented() || event.isPropagationStopped()) {
|
|
13742
13899
|
return;
|
|
13743
13900
|
}
|
|
13744
|
-
if (
|
|
13745
|
-
|
|
13746
|
-
|
|
13747
|
-
|
|
13748
|
-
|
|
13749
|
-
|
|
13750
|
-
|
|
13751
|
-
|
|
13752
|
-
|
|
13753
|
-
|
|
13754
|
-
|
|
13755
|
-
|
|
13756
|
-
|
|
13757
|
-
|
|
13758
|
-
|
|
13759
|
-
|
|
13760
|
-
const handleBlur = React__default.useCallback(event => {
|
|
13761
|
-
if (event.target === event.currentTarget) {
|
|
13762
|
-
saveChangesIfNeeded();
|
|
13763
|
-
}
|
|
13764
|
-
}, []);
|
|
13765
|
-
// Creates initial saving states from changes object
|
|
13766
|
-
const addSavingStates = () => {
|
|
13767
|
-
const changeset = Object.keys(changes || {});
|
|
13768
|
-
const additionalSavingStates = _.reduce(changeset, (result, value) => {
|
|
13769
|
-
return {
|
|
13770
|
-
...result,
|
|
13771
|
-
[value]: {
|
|
13772
|
-
state: SavingStateValue.Saving
|
|
13773
|
-
}
|
|
13774
|
-
};
|
|
13775
|
-
}, {});
|
|
13776
|
-
setSavingStates({
|
|
13777
|
-
...savingStates,
|
|
13778
|
-
...additionalSavingStates
|
|
13779
|
-
});
|
|
13780
|
-
};
|
|
13781
|
-
// Repoves edititng state by row is. Used in delayed saving indicator.
|
|
13782
|
-
const removeSavingState = rowId => {
|
|
13783
|
-
const newSavingStates = {
|
|
13784
|
-
...savingStates
|
|
13785
|
-
};
|
|
13786
|
-
delete newSavingStates[rowId];
|
|
13787
|
-
setSavingStates(newSavingStates);
|
|
13788
|
-
};
|
|
13789
|
-
// Checks if we have changes, then saves them
|
|
13790
|
-
const saveChangesIfNeeded = function () {
|
|
13791
|
-
try {
|
|
13792
|
-
if (!changes) {
|
|
13793
|
-
return Promise.resolve();
|
|
13794
|
-
}
|
|
13795
|
-
const changeset = Object.keys(changes);
|
|
13796
|
-
const _temp = function () {
|
|
13797
|
-
if (onSave && changeset.length) {
|
|
13798
|
-
addSavingStates();
|
|
13799
|
-
return Promise.resolve(Promise.allSettled(changeset.map(rowId => onSave(changes[rowId])))).then(function (responses) {
|
|
13800
|
-
setChanges(currentChanges => {
|
|
13801
|
-
const nextChanges = {
|
|
13802
|
-
...currentChanges
|
|
13803
|
-
};
|
|
13804
|
-
responses.forEach((response, index) => {
|
|
13805
|
-
const rowId = changeset[index];
|
|
13806
|
-
if (response.status === 'fulfilled') {
|
|
13807
|
-
delete nextChanges[rowId];
|
|
13808
|
-
}
|
|
13809
|
-
});
|
|
13810
|
-
return nextChanges;
|
|
13811
|
-
});
|
|
13812
|
-
setSavingStates(savingStates => {
|
|
13813
|
-
const nextSavingStates = savingStates ? {
|
|
13814
|
-
...savingStates
|
|
13815
|
-
} : {};
|
|
13816
|
-
responses.forEach((response, index) => {
|
|
13817
|
-
const rowId = changeset[index];
|
|
13818
|
-
if (response.status === 'fulfilled') {
|
|
13819
|
-
nextSavingStates[rowId] = {
|
|
13820
|
-
state: SavingStateValue.Saved
|
|
13821
|
-
};
|
|
13822
|
-
} else {
|
|
13823
|
-
// add the error when validation is added
|
|
13824
|
-
nextSavingStates[rowId] = {
|
|
13825
|
-
state: SavingStateValue.Error
|
|
13826
|
-
};
|
|
13827
|
-
}
|
|
13828
|
-
});
|
|
13829
|
-
return nextSavingStates;
|
|
13830
|
-
});
|
|
13831
|
-
});
|
|
13901
|
+
if (event.key === 'Tab') {
|
|
13902
|
+
tableMeta.hoverState.pause(true);
|
|
13903
|
+
let focusedElement;
|
|
13904
|
+
if (event.shiftKey) {
|
|
13905
|
+
// looping backwards
|
|
13906
|
+
focusedElement = focusManager.focusPrevious(FOCUS_MANAGER_OPTIONS);
|
|
13907
|
+
if (focusedElement) {
|
|
13908
|
+
// override default behaviour, since we're handling focus internally now
|
|
13909
|
+
event.preventDefault();
|
|
13910
|
+
} else {
|
|
13911
|
+
// there are no previous elements to focus, go up a row or go outside the table
|
|
13912
|
+
if (!isFirstRow) {
|
|
13913
|
+
event.preventDefault();
|
|
13914
|
+
tableMeta.currentRow.setCurrentRowIndex(props.index - 1);
|
|
13915
|
+
setTimeout(() => focusManager.focusLast(FOCUS_MANAGER_OPTIONS), 1);
|
|
13916
|
+
}
|
|
13832
13917
|
}
|
|
13833
|
-
}
|
|
13834
|
-
|
|
13835
|
-
|
|
13836
|
-
|
|
13918
|
+
} else {
|
|
13919
|
+
// looping forwards
|
|
13920
|
+
focusedElement = focusManager.focusNext(FOCUS_MANAGER_OPTIONS);
|
|
13921
|
+
if (focusedElement) {
|
|
13922
|
+
// override default behaviour, since we're handling focus internally now
|
|
13923
|
+
event.preventDefault();
|
|
13924
|
+
} else {
|
|
13925
|
+
// there are no next elements to focus, go down a row or go outside the table
|
|
13926
|
+
if (!props.isLastRow) {
|
|
13927
|
+
event.preventDefault();
|
|
13928
|
+
tableMeta.currentRow.setCurrentRowIndex(props.index + 1);
|
|
13929
|
+
setTimeout(() => focusManager.focusFirst(FOCUS_MANAGER_OPTIONS), 1);
|
|
13930
|
+
}
|
|
13931
|
+
}
|
|
13932
|
+
}
|
|
13837
13933
|
}
|
|
13838
13934
|
};
|
|
13839
|
-
const
|
|
13840
|
-
|
|
13841
|
-
|
|
13842
|
-
|
|
13843
|
-
|
|
13844
|
-
|
|
13845
|
-
|
|
13846
|
-
|
|
13935
|
+
const hasError = !!Object.keys((_tableMeta$validation = (_tableMeta$validation2 = tableMeta.validation.errors) === null || _tableMeta$validation2 === void 0 ? void 0 : _tableMeta$validation2[props.row.id]) !== null && _tableMeta$validation !== void 0 ? _tableMeta$validation : {}).length;
|
|
13936
|
+
// rows are heavily memoized because performance in our table is critical
|
|
13937
|
+
// be careful and selective about props that you pass to the row
|
|
13938
|
+
const memoedProps = {
|
|
13939
|
+
// aria-grabbed is being deprecated but there is no current alternative api, we use it until there is
|
|
13940
|
+
'aria-grabbed': isDraggingRow ? true : tableMeta.rowDrag.isEnabled ? false : undefined,
|
|
13941
|
+
'data-current': isCurrentRow,
|
|
13942
|
+
'data-selected': props.row.getIsSelected(),
|
|
13943
|
+
'data-invalid': hasError,
|
|
13944
|
+
draggable: tableMeta.rowDrag.isEnabled,
|
|
13945
|
+
index: props.index,
|
|
13946
|
+
onClick: tableMeta.rowClick.handleClick,
|
|
13947
|
+
onDrop: tableMeta.rowDrop.isEnabled ? tableMeta.rowDrop.handleDrop : undefined,
|
|
13948
|
+
onKeyDown: handleKeyDown
|
|
13949
|
+
};
|
|
13950
|
+
let output = /*#__PURE__*/React__default.createElement(MemoedRow, Object.assign({}, props, memoedProps));
|
|
13951
|
+
if (tableMeta.editing.isEditing && (isCurrentRow || isHovered && !tableMeta.hoverState.isPaused)) {
|
|
13952
|
+
output = /*#__PURE__*/React__default.createElement(EditingRow, Object.assign({}, props, memoedProps, {
|
|
13953
|
+
isFirstRow: isFirstRow,
|
|
13954
|
+
setCurrentRowIndex: tableMeta.currentRow.setCurrentRowIndex
|
|
13955
|
+
}));
|
|
13956
|
+
}
|
|
13957
|
+
// we store the row index in context because in a virtualised table the row index and the
|
|
13958
|
+
// react table row index do not match when, for example, sorting is applied
|
|
13959
|
+
const contextValue = React__default.useMemo(() => ({
|
|
13960
|
+
isHovered,
|
|
13961
|
+
setIsHovered,
|
|
13962
|
+
rowIndex: props.index,
|
|
13963
|
+
hasError
|
|
13964
|
+
}), [isHovered, hasError, props.index]);
|
|
13965
|
+
return /*#__PURE__*/React__default.createElement(RowContext.Provider, {
|
|
13966
|
+
value: contextValue
|
|
13967
|
+
}, output);
|
|
13968
|
+
}
|
|
13969
|
+
// turns out we might need some kind of "state" for the focused column, but it doesn't need to be react state that re-renders
|
|
13970
|
+
const lastCellIndex = /*#__PURE__*/new LastCellIndex();
|
|
13971
|
+
// This code is needed to avoid multiple rows being hovered at the same time (it happens since we use non-css hovering)
|
|
13972
|
+
let previouslyHoveredIndex;
|
|
13973
|
+
const unhoverPreviousRow = tableRef => {
|
|
13974
|
+
if (previouslyHoveredIndex !== undefined) {
|
|
13975
|
+
var _tableRef$current;
|
|
13976
|
+
const mouseoutEvent = new MouseEvent('mouseout', {
|
|
13977
|
+
view: window,
|
|
13978
|
+
bubbles: true,
|
|
13979
|
+
cancelable: true
|
|
13847
13980
|
});
|
|
13981
|
+
const previouslyHovered = tableRef === null || tableRef === void 0 ? void 0 : (_tableRef$current = tableRef.current) === null || _tableRef$current === void 0 ? void 0 : _tableRef$current.querySelector(`[data-row-index="${previouslyHoveredIndex}"]`);
|
|
13982
|
+
previouslyHovered === null || previouslyHovered === void 0 ? void 0 : previouslyHovered.dispatchEvent(mouseoutEvent);
|
|
13983
|
+
}
|
|
13984
|
+
};
|
|
13985
|
+
function EditingRow(props) {
|
|
13986
|
+
const {
|
|
13987
|
+
isFirstRow,
|
|
13988
|
+
isLastRow,
|
|
13989
|
+
onKeyDown,
|
|
13990
|
+
setCurrentRowIndex,
|
|
13991
|
+
virtualiser,
|
|
13992
|
+
...attributes
|
|
13993
|
+
} = props;
|
|
13994
|
+
const focusManager = focus.useFocusManager();
|
|
13995
|
+
const tableMeta = props.table.options.meta;
|
|
13996
|
+
const handleClickCapture = event => {
|
|
13997
|
+
lastCellIndex.value = getColumnIndex(event.target);
|
|
13848
13998
|
};
|
|
13849
|
-
const
|
|
13850
|
-
|
|
13851
|
-
|
|
13852
|
-
|
|
13999
|
+
const handleArrowLeftKey = event => {
|
|
14000
|
+
let focusedElement;
|
|
14001
|
+
if (event.key === 'ArrowLeft') {
|
|
14002
|
+
// We need to perform special behaviour when focus reaches the end of the row,
|
|
14003
|
+
// so we don't need default browser behaviour.
|
|
14004
|
+
event.stopPropagation();
|
|
14005
|
+
event.preventDefault();
|
|
14006
|
+
tableMeta.hoverState.pause(true);
|
|
14007
|
+
// "CTRL + ArrowLeft" or "META + ArrowLeft" should focus first focusable element of the row
|
|
14008
|
+
if (event.ctrlKey || event.metaKey) {
|
|
14009
|
+
event.target.blur();
|
|
14010
|
+
focusedElement = focusManager.focusFirst(FOCUS_MANAGER_OPTIONS);
|
|
14011
|
+
lastCellIndex.value = getColumnIndex(focusedElement);
|
|
14012
|
+
} else {
|
|
14013
|
+
// looping backwards
|
|
14014
|
+
focusedElement = focusManager.focusPrevious(FOCUS_MANAGER_OPTIONS);
|
|
14015
|
+
if (focusedElement) {
|
|
14016
|
+
lastCellIndex.value = getColumnIndex(focusedElement);
|
|
14017
|
+
} else {
|
|
14018
|
+
// there are no previous elements to focus, go up a row (if there are rows above)
|
|
14019
|
+
if (!isFirstRow || !event.currentTarget.contains(focusedElement)) {
|
|
14020
|
+
event.preventDefault();
|
|
14021
|
+
tableMeta.hoverState.pause(true);
|
|
14022
|
+
tableMeta.currentRow.setCurrentRowIndex(props.index - 1);
|
|
14023
|
+
setTimeout(() => {
|
|
14024
|
+
focusedElement = focusManager.focusLast(FOCUS_MANAGER_OPTIONS);
|
|
14025
|
+
// Need to update lastIndex when row got changed and last element got selected.
|
|
14026
|
+
lastCellIndex.value = getColumnIndex(focusedElement);
|
|
14027
|
+
}, 1);
|
|
14028
|
+
}
|
|
14029
|
+
}
|
|
14030
|
+
}
|
|
13853
14031
|
}
|
|
13854
|
-
|
|
13855
|
-
|
|
14032
|
+
};
|
|
14033
|
+
const handleArrowRightKey = event => {
|
|
14034
|
+
let focusedElement;
|
|
14035
|
+
if (event.key === 'ArrowRight') {
|
|
14036
|
+
// We need to perform special behaviour when focus reaches the end of the row,
|
|
14037
|
+
// so we don't need default browser behaviour.
|
|
14038
|
+
event.stopPropagation();
|
|
14039
|
+
event.preventDefault();
|
|
14040
|
+
tableMeta.hoverState.pause(true);
|
|
14041
|
+
// "CTRL + ArrowRight" or "META + ArrowRight" should focus last focusable element of the row
|
|
14042
|
+
if (event.ctrlKey || event.metaKey) {
|
|
14043
|
+
event.target.blur();
|
|
14044
|
+
focusedElement = focusManager.focusLast(FOCUS_MANAGER_OPTIONS);
|
|
14045
|
+
lastCellIndex.value = getColumnIndex(focusedElement);
|
|
14046
|
+
} else {
|
|
14047
|
+
// looping forwards
|
|
14048
|
+
focusedElement = focusManager.focusNext(FOCUS_MANAGER_OPTIONS);
|
|
14049
|
+
if (focusedElement) {
|
|
14050
|
+
lastCellIndex.value = getColumnIndex(focusedElement);
|
|
14051
|
+
} else {
|
|
14052
|
+
// there are no next elements to focus, go down a row or go outside the table
|
|
14053
|
+
if (!props.isLastRow && !event.currentTarget.contains(focusedElement)) {
|
|
14054
|
+
event.preventDefault();
|
|
14055
|
+
tableMeta.hoverState.pause(true);
|
|
14056
|
+
tableMeta.currentRow.setCurrentRowIndex(props.index + 1);
|
|
14057
|
+
setTimeout(() => {
|
|
14058
|
+
focusedElement = focusManager.focusFirst(FOCUS_MANAGER_OPTIONS);
|
|
14059
|
+
// Need to update lastIndex when row got changed and last element got selected.
|
|
14060
|
+
lastCellIndex.value = getColumnIndex(focusedElement);
|
|
14061
|
+
}, 1);
|
|
14062
|
+
}
|
|
14063
|
+
}
|
|
14064
|
+
}
|
|
14065
|
+
}
|
|
14066
|
+
};
|
|
13856
14067
|
React__default.useEffect(() => {
|
|
13857
|
-
|
|
13858
|
-
|
|
13859
|
-
|
|
13860
|
-
}
|
|
13861
|
-
}, [
|
|
13862
|
-
|
|
13863
|
-
|
|
13864
|
-
|
|
13865
|
-
|
|
13866
|
-
|
|
13867
|
-
|
|
13868
|
-
|
|
13869
|
-
saveChangesIfNeeded,
|
|
13870
|
-
detailModeEditing,
|
|
13871
|
-
setDetailModeEditing,
|
|
13872
|
-
rowMoveReason,
|
|
13873
|
-
setRowMoveReason,
|
|
13874
|
-
removeRowMoveReason,
|
|
13875
|
-
handleKeyDown,
|
|
13876
|
-
handleBlur,
|
|
13877
|
-
resetChange,
|
|
13878
|
-
savingStates,
|
|
13879
|
-
removeSavingState
|
|
14068
|
+
// if some row stuck in hovered state, we heed to unhover it when hover state is paused
|
|
14069
|
+
if (tableMeta.hoverState.isPaused) {
|
|
14070
|
+
unhoverPreviousRow(props.tableRef);
|
|
14071
|
+
}
|
|
14072
|
+
}, [tableMeta.hoverState.isPaused]);
|
|
14073
|
+
const handleKeyDown = event => {
|
|
14074
|
+
if (event.isDefaultPrevented() || event.isPropagationStopped() || tableMeta.editing.detailModeEditing || tableMeta.shortcutsState.isPaused) {
|
|
14075
|
+
return;
|
|
14076
|
+
}
|
|
14077
|
+
onKeyDown(event); // handles tab behaviour
|
|
14078
|
+
handleArrowLeftKey(event);
|
|
14079
|
+
handleArrowRightKey(event);
|
|
13880
14080
|
};
|
|
14081
|
+
// this ensures we focus either on a field or on the same column when keyboard navigating up/down
|
|
14082
|
+
React__default.useEffect(() => {
|
|
14083
|
+
// When table in searching state, whe should prevent editing control to be focused, because it will cause search field to loose focus.
|
|
14084
|
+
if (tableMeta.currentRow.currentRowIndex === props.index && !tableMeta.search.isSearching) {
|
|
14085
|
+
if (lastCellIndex.value !== null) {
|
|
14086
|
+
var _props$tableRef$curre;
|
|
14087
|
+
const lastCellElement = (_props$tableRef$curre = props.tableRef.current) === null || _props$tableRef$curre === void 0 ? void 0 : _props$tableRef$curre.querySelector(`[role="row"][data-current="true"] [data-column-index="${lastCellIndex.value}"]`);
|
|
14088
|
+
const focusableElement = lastCellElement === null || lastCellElement === void 0 ? void 0 : lastCellElement.querySelector(focusableSelector);
|
|
14089
|
+
if (focusableElement) {
|
|
14090
|
+
focusableElement.focus();
|
|
14091
|
+
// if we found a cell but it doesn't contain focusable element, then we'll focus the first one in a row.
|
|
14092
|
+
} else if (lastCellElement) {
|
|
14093
|
+
const focusedElement = focusManager.focusFirst(FOCUS_MANAGER_OPTIONS);
|
|
14094
|
+
lastCellIndex.value = getColumnIndex(focusedElement);
|
|
14095
|
+
}
|
|
14096
|
+
} else {
|
|
14097
|
+
const focusedElement = focusManager.focusFirst(FOCUS_MANAGER_OPTIONS);
|
|
14098
|
+
lastCellIndex.value = getColumnIndex(focusedElement);
|
|
14099
|
+
}
|
|
14100
|
+
}
|
|
14101
|
+
// Need to subscribe to current row index and check is it a current row,
|
|
14102
|
+
// for a situation where hovered row is the next row after current row...
|
|
14103
|
+
// In this case row will not be re-rendered if user switch to next row, because hovered row also renders EditingRow.
|
|
14104
|
+
}, [tableMeta.currentRow.currentRowIndex, tableMeta.search.isSearching]);
|
|
14105
|
+
return /*#__PURE__*/React__default.createElement(MemoedRow, Object.assign({}, attributes, {
|
|
14106
|
+
onClickCapture: handleClickCapture,
|
|
14107
|
+
onKeyDown: handleKeyDown
|
|
14108
|
+
}));
|
|
13881
14109
|
}
|
|
13882
|
-
|
|
13883
|
-
const
|
|
13884
|
-
const COLUMN_ID$1 = '__editing_actions';
|
|
13885
|
-
const MemoedCell$1 = /*#__PURE__*/React__default.memo(function MemoedCell(props) {
|
|
14110
|
+
const clickableElements = ['input', 'button', 'a', 'select', 'option', 'label', 'textarea'];
|
|
14111
|
+
const MemoedRow = /*#__PURE__*/React__default.memo(function MemoedRow(props) {
|
|
13886
14112
|
const {
|
|
13887
|
-
|
|
13888
|
-
|
|
13889
|
-
|
|
14113
|
+
index,
|
|
14114
|
+
isLastRow: _1,
|
|
14115
|
+
measureRef,
|
|
14116
|
+
onClick,
|
|
14117
|
+
onClickCapture,
|
|
14118
|
+
onDrop,
|
|
13890
14119
|
row,
|
|
13891
|
-
table
|
|
14120
|
+
table,
|
|
14121
|
+
tableRef,
|
|
14122
|
+
...attributes
|
|
13892
14123
|
} = props;
|
|
14124
|
+
const ref = React__default.useRef(null);
|
|
13893
14125
|
const tableMeta = table.options.meta;
|
|
13894
|
-
const savingState = tableMeta.editing.savingStates && tableMeta.editing.savingStates[row.id];
|
|
13895
|
-
const [isSavedIndicatorVisible, setIsSavingIndicatorVisible] = React__default.useState(false);
|
|
13896
14126
|
const {
|
|
13897
|
-
|
|
13898
|
-
} =
|
|
13899
|
-
|
|
13900
|
-
setIsSavingIndicatorVisible(false);
|
|
13901
|
-
tableMeta.editing.removeSavingState(row.id);
|
|
13902
|
-
};
|
|
13903
|
-
const timer = useTimer(savingIndicatorHideDelay, handleSaved);
|
|
14127
|
+
setIsHovered
|
|
14128
|
+
} = useRowContext();
|
|
14129
|
+
// we measure the first cell (since the row has display: contents) so that the virtualiser height is correct
|
|
13904
14130
|
React__default.useEffect(() => {
|
|
13905
|
-
|
|
13906
|
-
|
|
13907
|
-
|
|
14131
|
+
var _ref$current;
|
|
14132
|
+
const firstCell = (_ref$current = ref.current) === null || _ref$current === void 0 ? void 0 : _ref$current.querySelector('[role=cell]:first-child');
|
|
14133
|
+
if (firstCell) {
|
|
14134
|
+
measureRef(firstCell);
|
|
13908
14135
|
}
|
|
13909
|
-
}, [
|
|
13910
|
-
|
|
13911
|
-
|
|
13912
|
-
if (
|
|
13913
|
-
|
|
13914
|
-
|
|
13915
|
-
|
|
13916
|
-
|
|
13917
|
-
|
|
13918
|
-
|
|
13919
|
-
|
|
13920
|
-
|
|
14136
|
+
}, [ref.current]);
|
|
14137
|
+
// we use capture because it also picks up clicks on e.g. select checkboxes
|
|
14138
|
+
const handleClickCapture = event => {
|
|
14139
|
+
if (typeof onClickCapture === 'function') {
|
|
14140
|
+
onClickCapture(event);
|
|
14141
|
+
}
|
|
14142
|
+
// do this in the next frame, otherwise it remounts the row and prevents row actions on hover from being clickable
|
|
14143
|
+
requestAnimationFrame(() => tableMeta.currentRow.setCurrentRowIndex(index));
|
|
14144
|
+
};
|
|
14145
|
+
const handleClick = event => {
|
|
14146
|
+
if (typeof onClick === 'function') {
|
|
14147
|
+
var _ref$current2;
|
|
14148
|
+
const clickedElement = event.target;
|
|
14149
|
+
if (!((_ref$current2 = ref.current) !== null && _ref$current2 !== void 0 && _ref$current2.contains(event.target)) || clickableElements.includes(clickedElement.tagName.toLowerCase()) || clickedElement.closest(clickableElements.map(tag => `[role=row] ${tag}`).join(','))) {
|
|
14150
|
+
return;
|
|
14151
|
+
}
|
|
14152
|
+
onClick(row.original);
|
|
14153
|
+
}
|
|
14154
|
+
};
|
|
14155
|
+
const handleMouseEnter = () => {
|
|
14156
|
+
// When user moving mouse to fast, then some of the rows are getting stuck in hover state,
|
|
14157
|
+
// because mouseleave event never got triggered, to avoid this to happen we're saving the index of last hovered row,
|
|
14158
|
+
// so that we can unhover it when new row got hovered, and saving it in a variable outside of react to save in performance,
|
|
14159
|
+
// since it would be very performance heavy to use state which is bound to mouse events.
|
|
14160
|
+
if (previouslyHoveredIndex !== undefined) {
|
|
14161
|
+
if (previouslyHoveredIndex !== index) {
|
|
14162
|
+
unhoverPreviousRow(tableRef);
|
|
14163
|
+
previouslyHoveredIndex = index;
|
|
14164
|
+
}
|
|
14165
|
+
} else {
|
|
14166
|
+
previouslyHoveredIndex = index;
|
|
14167
|
+
}
|
|
14168
|
+
setIsHovered(true);
|
|
14169
|
+
};
|
|
14170
|
+
const handleMouseLeave = () => {
|
|
14171
|
+
if (previouslyHoveredIndex === index) {
|
|
14172
|
+
previouslyHoveredIndex = undefined;
|
|
14173
|
+
}
|
|
14174
|
+
setIsHovered(false);
|
|
14175
|
+
};
|
|
14176
|
+
const [isDraggedOver, dropTargetProps] = useDropTarget(event => onDrop === null || onDrop === void 0 ? void 0 : onDrop(event, row.original));
|
|
14177
|
+
const className = cn('group/row contents',
|
|
14178
|
+
// resizing column requires dragging, which means the mouse might (on rare occasions) move over rows and trigger hover state
|
|
14179
|
+
// that in turn triggers rendering of e.g. row actions, which could cause janky ui - so don't allow mouse interaction when resizing
|
|
14180
|
+
'[[role="table"][data-resizing="true"]_&]:pointer-events-none', {
|
|
14181
|
+
'hover:cursor-pointer': typeof onClick === 'function'
|
|
14182
|
+
});
|
|
14183
|
+
return /*#__PURE__*/React__default.createElement("div", Object.assign({}, attributes, onDrop ? dropTargetProps : undefined, {
|
|
14184
|
+
className: className,
|
|
14185
|
+
"data-row-index": index,
|
|
14186
|
+
"data-dragged-over": isDraggedOver,
|
|
14187
|
+
onClick: handleClick,
|
|
14188
|
+
onClickCapture: handleClickCapture,
|
|
14189
|
+
onMouseEnter: handleMouseEnter,
|
|
14190
|
+
onMouseLeave: handleMouseLeave,
|
|
14191
|
+
role: "row",
|
|
14192
|
+
ref: ref
|
|
14193
|
+
}));
|
|
14194
|
+
});
|
|
14195
|
+
|
|
14196
|
+
var SavingStatusValue;
|
|
14197
|
+
(function (SavingStatusValue) {
|
|
14198
|
+
SavingStatusValue["Saving"] = "saving";
|
|
14199
|
+
SavingStatusValue["Saved"] = "saved";
|
|
14200
|
+
SavingStatusValue["Error"] = "error";
|
|
14201
|
+
})(SavingStatusValue || (SavingStatusValue = {}));
|
|
14202
|
+
function useEditing(isEnabled, validation, onSave) {
|
|
14203
|
+
// used to switch the table into editing mode
|
|
14204
|
+
const [isEditing, setIsEditing] = React__default.useState(false);
|
|
14205
|
+
// Saving indicator need to show saving status per row, saving status can have at least two states 'saving', 'saved',
|
|
14206
|
+
// 'saved' should remain for a few seconds to show tick icon after row has been saved.
|
|
14207
|
+
const [savingStatuses, dispatchSavingStatusAction] = React__default.useReducer(savingStatusesReducer, null);
|
|
14208
|
+
// sets of row changes pending save, either they have not saved yet or they have errors
|
|
14209
|
+
const [editingState, dispatchEditingAction] = React__default.useReducer((state, action) => editingReducer(state, action), null);
|
|
14210
|
+
const [detailModeEditing, setDetailModeEditing] = React__default.useState(false);
|
|
14211
|
+
function getCellValue(cell) {
|
|
14212
|
+
var _editingState$cell$ro;
|
|
14213
|
+
return editingState ? (_editingState$cell$ro = editingState[cell.row.id]) === null || _editingState$cell$ro === void 0 ? void 0 : _editingState$cell$ro[cell.column.id] : undefined;
|
|
14214
|
+
}
|
|
14215
|
+
// Saves editing cell value into editing state.
|
|
14216
|
+
function setCellValue(cell, value) {
|
|
14217
|
+
dispatchEditingAction({
|
|
14218
|
+
type: EditingActionType.SET_CELL_VALUE,
|
|
14219
|
+
payload: {
|
|
14220
|
+
rowId: cell.row.id,
|
|
14221
|
+
cellId: cell.column.id,
|
|
14222
|
+
value,
|
|
14223
|
+
originalValues: cell.row.original
|
|
14224
|
+
}
|
|
14225
|
+
});
|
|
14226
|
+
}
|
|
14227
|
+
// Removes changes from editing state by row id
|
|
14228
|
+
function resetChange(rowId) {
|
|
14229
|
+
dispatchEditingAction({
|
|
14230
|
+
type: EditingActionType.RESET_CHANGE,
|
|
14231
|
+
payload: {
|
|
14232
|
+
rowId
|
|
14233
|
+
}
|
|
14234
|
+
});
|
|
14235
|
+
validation.resetErrors(rowId);
|
|
14236
|
+
}
|
|
14237
|
+
const handleKeyDown = React__default.useCallback(event => {
|
|
14238
|
+
if (event.defaultPrevented) {
|
|
14239
|
+
return;
|
|
14240
|
+
}
|
|
14241
|
+
if (shouldTriggerShortcut(event, {
|
|
14242
|
+
key: 'e',
|
|
14243
|
+
meta: true,
|
|
14244
|
+
shift: false
|
|
14245
|
+
})) {
|
|
14246
|
+
setIsEditing(editing => !editing);
|
|
14247
|
+
} else if (shouldTriggerShortcut(event, {
|
|
14248
|
+
key: 's',
|
|
14249
|
+
meta: true,
|
|
14250
|
+
shift: false
|
|
14251
|
+
})) {
|
|
14252
|
+
// Prevent default browser save
|
|
14253
|
+
event.preventDefault();
|
|
14254
|
+
saveChangesIfNeeded();
|
|
14255
|
+
}
|
|
14256
|
+
}, [isEditing]);
|
|
14257
|
+
const handleBlur = React__default.useCallback(event => {
|
|
14258
|
+
if (event.target === event.currentTarget) {
|
|
14259
|
+
saveChangesIfNeeded();
|
|
14260
|
+
}
|
|
14261
|
+
}, []);
|
|
14262
|
+
// Creates initial saving statuses from changes object
|
|
14263
|
+
const addSavingStatuses = () => {
|
|
14264
|
+
const changeset = Object.keys(editingState || {});
|
|
14265
|
+
const additionalSavingStatuses = _.reduce(changeset, (result, rowId) => {
|
|
14266
|
+
return {
|
|
14267
|
+
...result,
|
|
14268
|
+
[rowId]: SavingStatusValue.Saving
|
|
14269
|
+
};
|
|
14270
|
+
}, {});
|
|
14271
|
+
dispatchSavingStatusAction({
|
|
14272
|
+
type: SavingStatusActionType.SET_SAVING_STATUSES,
|
|
14273
|
+
payload: {
|
|
14274
|
+
states: additionalSavingStatuses
|
|
14275
|
+
}
|
|
14276
|
+
});
|
|
14277
|
+
};
|
|
14278
|
+
// Resets/removes saving status by row id. Used in delayed saving indicator.
|
|
14279
|
+
const resetSavingStatus = rowId => {
|
|
14280
|
+
dispatchSavingStatusAction({
|
|
14281
|
+
type: SavingStatusActionType.RESET_SAVING_STATUS,
|
|
14282
|
+
payload: {
|
|
14283
|
+
rowId
|
|
14284
|
+
}
|
|
14285
|
+
});
|
|
14286
|
+
};
|
|
14287
|
+
// Checks if we have changes, then saves them
|
|
14288
|
+
const saveChangesIfNeeded = function () {
|
|
14289
|
+
try {
|
|
14290
|
+
if (!editingState) {
|
|
14291
|
+
return Promise.resolve();
|
|
14292
|
+
}
|
|
14293
|
+
const changeset = Object.keys(editingState);
|
|
14294
|
+
const _temp = function () {
|
|
14295
|
+
if (onSave && changeset.length) {
|
|
14296
|
+
addSavingStatuses();
|
|
14297
|
+
return Promise.resolve(Promise.allSettled(changeset.map(rowId => {
|
|
14298
|
+
const validationSavePromise = new Promise((resolve, reject) => {
|
|
14299
|
+
const changedRow = editingState === null || editingState === void 0 ? void 0 : editingState[rowId];
|
|
14300
|
+
if (changedRow) {
|
|
14301
|
+
var _validation$validate;
|
|
14302
|
+
(_validation$validate = validation.validate(rowId, changedRow)) === null || _validation$validate === void 0 ? void 0 : _validation$validate.then(() => {
|
|
14303
|
+
const savePromise = onSave(changedRow);
|
|
14304
|
+
savePromise.then(() => {
|
|
14305
|
+
resolve();
|
|
14306
|
+
}).catch(reason => {
|
|
14307
|
+
if (reason.errors) {
|
|
14308
|
+
validation.setRowErrors(rowId, reason.errors);
|
|
14309
|
+
}
|
|
14310
|
+
reject(reason);
|
|
14311
|
+
});
|
|
14312
|
+
}).catch(() => {
|
|
14313
|
+
validation.confirmErrors(rowId);
|
|
14314
|
+
dispatchSavingStatusAction({
|
|
14315
|
+
type: SavingStatusActionType.SET_SAVING_STATUS,
|
|
14316
|
+
payload: {
|
|
14317
|
+
rowId,
|
|
14318
|
+
state: SavingStatusValue.Error
|
|
14319
|
+
}
|
|
14320
|
+
});
|
|
14321
|
+
reject();
|
|
14322
|
+
});
|
|
14323
|
+
} else {
|
|
14324
|
+
reject();
|
|
14325
|
+
}
|
|
14326
|
+
});
|
|
14327
|
+
return validationSavePromise;
|
|
14328
|
+
}))).then(function (responses) {
|
|
14329
|
+
responses.forEach((response, index) => {
|
|
14330
|
+
const rowId = changeset[index];
|
|
14331
|
+
if (response.status === 'fulfilled') {
|
|
14332
|
+
resetChange(rowId);
|
|
14333
|
+
dispatchSavingStatusAction({
|
|
14334
|
+
type: SavingStatusActionType.SET_SAVING_STATUS,
|
|
14335
|
+
payload: {
|
|
14336
|
+
rowId,
|
|
14337
|
+
state: SavingStatusValue.Saved
|
|
14338
|
+
}
|
|
14339
|
+
});
|
|
14340
|
+
} else {
|
|
14341
|
+
dispatchSavingStatusAction({
|
|
14342
|
+
type: SavingStatusActionType.SET_SAVING_STATUS,
|
|
14343
|
+
payload: {
|
|
14344
|
+
rowId,
|
|
14345
|
+
state: SavingStatusValue.Error
|
|
14346
|
+
}
|
|
14347
|
+
});
|
|
14348
|
+
}
|
|
14349
|
+
});
|
|
14350
|
+
});
|
|
14351
|
+
}
|
|
14352
|
+
}();
|
|
14353
|
+
return Promise.resolve(_temp && _temp.then ? _temp.then(function () {}) : void 0);
|
|
14354
|
+
} catch (e) {
|
|
14355
|
+
return Promise.reject(e);
|
|
14356
|
+
}
|
|
14357
|
+
};
|
|
14358
|
+
const [rowMoveReason, setRowMoveReason] = React__default.useState(null);
|
|
14359
|
+
const removeRowMoveReason = () => {
|
|
14360
|
+
setRowMoveReason(null);
|
|
14361
|
+
};
|
|
14362
|
+
const showWarning = React__default.useCallback(event => {
|
|
14363
|
+
if (isEditing && editingState && Object.keys(editingState).length > 0) {
|
|
14364
|
+
event.returnValue = true;
|
|
14365
|
+
return true;
|
|
14366
|
+
}
|
|
14367
|
+
return false;
|
|
14368
|
+
}, [isEditing, editingState]);
|
|
14369
|
+
function getSavingStatus(rowId) {
|
|
14370
|
+
return savingStatuses && savingStatuses[rowId];
|
|
14371
|
+
}
|
|
14372
|
+
React__default.useEffect(() => {
|
|
14373
|
+
window.addEventListener('beforeunload', showWarning);
|
|
14374
|
+
return () => {
|
|
14375
|
+
window.removeEventListener('beforeunload', showWarning);
|
|
14376
|
+
};
|
|
14377
|
+
}, [showWarning]);
|
|
14378
|
+
React__default.useEffect(() => {
|
|
14379
|
+
if (!isEditing) {
|
|
14380
|
+
setDetailModeEditing(false);
|
|
14381
|
+
lastCellIndex.value = null;
|
|
14382
|
+
}
|
|
14383
|
+
}, [isEditing]);
|
|
14384
|
+
return {
|
|
14385
|
+
isEnabled,
|
|
14386
|
+
isEditing,
|
|
14387
|
+
toggleEditing: setIsEditing,
|
|
14388
|
+
changes: editingState,
|
|
14389
|
+
getCellValue,
|
|
14390
|
+
setCellValue,
|
|
14391
|
+
saveChangesIfNeeded,
|
|
14392
|
+
detailModeEditing,
|
|
14393
|
+
setDetailModeEditing,
|
|
14394
|
+
rowMoveReason,
|
|
14395
|
+
setRowMoveReason,
|
|
14396
|
+
removeRowMoveReason,
|
|
14397
|
+
handleKeyDown,
|
|
14398
|
+
handleBlur,
|
|
14399
|
+
resetChange,
|
|
14400
|
+
getSavingStatus,
|
|
14401
|
+
resetSavingStatus
|
|
14402
|
+
};
|
|
14403
|
+
}
|
|
14404
|
+
var EditingActionType;
|
|
14405
|
+
(function (EditingActionType) {
|
|
14406
|
+
EditingActionType[EditingActionType["SET_CELL_VALUE"] = 0] = "SET_CELL_VALUE";
|
|
14407
|
+
EditingActionType[EditingActionType["RESET_CHANGE"] = 1] = "RESET_CHANGE";
|
|
14408
|
+
})(EditingActionType || (EditingActionType = {}));
|
|
14409
|
+
function editingReducer(state, action) {
|
|
14410
|
+
switch (action.type) {
|
|
14411
|
+
// Set cell value of the row
|
|
14412
|
+
case EditingActionType.SET_CELL_VALUE:
|
|
14413
|
+
return {
|
|
14414
|
+
...state,
|
|
14415
|
+
[action.payload.rowId]: {
|
|
14416
|
+
...((state === null || state === void 0 ? void 0 : state[action.payload.rowId]) || action.payload.originalValues),
|
|
14417
|
+
[action.payload.cellId]: action.payload.value
|
|
14418
|
+
}
|
|
14419
|
+
};
|
|
14420
|
+
// Reset changes for the row
|
|
14421
|
+
case EditingActionType.RESET_CHANGE:
|
|
14422
|
+
{
|
|
14423
|
+
let currentChanges = {
|
|
14424
|
+
...state
|
|
14425
|
+
};
|
|
14426
|
+
if (currentChanges) {
|
|
14427
|
+
delete currentChanges[action.payload.rowId];
|
|
14428
|
+
}
|
|
14429
|
+
const changeset = Object.keys(currentChanges);
|
|
14430
|
+
if (changeset.length === 0) {
|
|
14431
|
+
currentChanges = null;
|
|
14432
|
+
}
|
|
14433
|
+
return currentChanges;
|
|
14434
|
+
}
|
|
14435
|
+
default:
|
|
14436
|
+
return state;
|
|
14437
|
+
}
|
|
14438
|
+
}
|
|
14439
|
+
var SavingStatusActionType;
|
|
14440
|
+
(function (SavingStatusActionType) {
|
|
14441
|
+
SavingStatusActionType[SavingStatusActionType["SET_SAVING_STATUS"] = 0] = "SET_SAVING_STATUS";
|
|
14442
|
+
SavingStatusActionType[SavingStatusActionType["SET_SAVING_STATUSES"] = 1] = "SET_SAVING_STATUSES";
|
|
14443
|
+
SavingStatusActionType[SavingStatusActionType["RESET_SAVING_STATUS"] = 2] = "RESET_SAVING_STATUS";
|
|
14444
|
+
})(SavingStatusActionType || (SavingStatusActionType = {}));
|
|
14445
|
+
function savingStatusesReducer(state, action) {
|
|
14446
|
+
switch (action.type) {
|
|
14447
|
+
// Set single saving status for the row
|
|
14448
|
+
case SavingStatusActionType.SET_SAVING_STATUS:
|
|
14449
|
+
return {
|
|
14450
|
+
...state,
|
|
14451
|
+
[action.payload.rowId]: action.payload.state
|
|
14452
|
+
};
|
|
14453
|
+
// Set multiple saving statuses for multiple rows at the same time
|
|
14454
|
+
case SavingStatusActionType.SET_SAVING_STATUSES:
|
|
14455
|
+
return {
|
|
14456
|
+
...state,
|
|
14457
|
+
...action.payload.states
|
|
14458
|
+
};
|
|
14459
|
+
// Reset/remove saving status for particular row
|
|
14460
|
+
case SavingStatusActionType.RESET_SAVING_STATUS:
|
|
14461
|
+
{
|
|
14462
|
+
const newSavingStatus = {
|
|
14463
|
+
...state
|
|
14464
|
+
};
|
|
14465
|
+
newSavingStatus === null || newSavingStatus === void 0 ? true : delete newSavingStatus[action.payload.rowId];
|
|
14466
|
+
return newSavingStatus;
|
|
14467
|
+
}
|
|
14468
|
+
default:
|
|
14469
|
+
return state;
|
|
14470
|
+
}
|
|
14471
|
+
}
|
|
14472
|
+
|
|
14473
|
+
const savingIndicatorHideDelay = 3000;
|
|
14474
|
+
const COLUMN_ID$1 = '__editing_actions';
|
|
14475
|
+
const MemoedCell$1 = /*#__PURE__*/React__default.memo(function MemoedCell(props) {
|
|
14476
|
+
var _column$columnDef$met;
|
|
14477
|
+
const {
|
|
14478
|
+
hasChanges,
|
|
14479
|
+
isCurrentRow,
|
|
14480
|
+
row,
|
|
14481
|
+
editing,
|
|
14482
|
+
rowIdentifier,
|
|
14483
|
+
table
|
|
14484
|
+
} = props;
|
|
14485
|
+
const savingStatus = editing.getSavingStatus(row.id);
|
|
14486
|
+
const [isSavedIndicatorVisible, setIsSavingIndicatorVisible] = React__default.useState(false);
|
|
14487
|
+
const {
|
|
14488
|
+
texts
|
|
14489
|
+
} = useLocalization();
|
|
14490
|
+
const [clearConfirmationOpen, setClearConfirmationOpen] = React__default.useState(false);
|
|
14491
|
+
const columns = table.getAllFlatColumns();
|
|
14492
|
+
const column = columns.find(column => column.id === rowIdentifier);
|
|
14493
|
+
const rowIdentifierHeader = column === null || column === void 0 ? void 0 : (_column$columnDef$met = column.columnDef.meta) === null || _column$columnDef$met === void 0 ? void 0 : _column$columnDef$met.header;
|
|
14494
|
+
const edititngActionsRef = React__default.useRef(null);
|
|
14495
|
+
const tableMeta = table.options.meta;
|
|
14496
|
+
const handleSaved = () => {
|
|
14497
|
+
setIsSavingIndicatorVisible(false);
|
|
14498
|
+
editing.resetSavingStatus(row.id);
|
|
14499
|
+
};
|
|
14500
|
+
const timer = useTimer(savingIndicatorHideDelay, handleSaved);
|
|
14501
|
+
React__default.useEffect(() => {
|
|
14502
|
+
if (savingStatus && savingStatus === SavingStatusValue.Saved && !isSavedIndicatorVisible) {
|
|
14503
|
+
setIsSavingIndicatorVisible(true);
|
|
14504
|
+
timer.start();
|
|
14505
|
+
}
|
|
14506
|
+
}, [savingStatus]);
|
|
14507
|
+
React__default.useEffect(() => {
|
|
14508
|
+
tableMeta.shortcutsState.pause(clearConfirmationOpen);
|
|
14509
|
+
}, [clearConfirmationOpen]);
|
|
14510
|
+
let content;
|
|
14511
|
+
if (savingStatus) {
|
|
14512
|
+
if (savingStatus === SavingStatusValue.Saving) {
|
|
14513
|
+
content = /*#__PURE__*/React__default.createElement(Tooltip, {
|
|
14514
|
+
title: texts.table3.editing.saving.progress
|
|
14515
|
+
}, /*#__PURE__*/React__default.createElement(Spinner, {
|
|
14516
|
+
delay: 0,
|
|
14517
|
+
className: "!text-grey-700 mr-1 !h-5 !w-5"
|
|
14518
|
+
}));
|
|
14519
|
+
} else if (isSavedIndicatorVisible) {
|
|
14520
|
+
content = /*#__PURE__*/React__default.createElement(Tooltip, {
|
|
13921
14521
|
title: texts.table3.editing.saving.complete
|
|
13922
14522
|
}, /*#__PURE__*/React__default.createElement(Icon, {
|
|
13923
14523
|
name: "tick",
|
|
@@ -13925,25 +14525,48 @@ const MemoedCell$1 = /*#__PURE__*/React__default.memo(function MemoedCell(props)
|
|
|
13925
14525
|
}));
|
|
13926
14526
|
}
|
|
13927
14527
|
}
|
|
13928
|
-
if (isEditing && isCurrentRow) {
|
|
14528
|
+
if (editing.isEditing && isCurrentRow) {
|
|
13929
14529
|
content = /*#__PURE__*/React__default.createElement(React__default.Fragment, null, content, /*#__PURE__*/React__default.createElement(IconButton, {
|
|
14530
|
+
ref: edititngActionsRef,
|
|
13930
14531
|
appearance: "transparent",
|
|
13931
14532
|
"aria-label": texts.table3.editing.actions.tooltip,
|
|
13932
14533
|
icon: "more",
|
|
13933
14534
|
menu: menuProps => /*#__PURE__*/React__default.createElement(Menu$1, Object.assign({}, menuProps), /*#__PURE__*/React__default.createElement(Menu$1.Content, null, /*#__PURE__*/React__default.createElement(Menu$1.Item, {
|
|
13934
14535
|
icon: "tick",
|
|
13935
14536
|
disabled: !hasChanges,
|
|
13936
|
-
onClick: () =>
|
|
14537
|
+
onClick: () => editing.saveChangesIfNeeded()
|
|
13937
14538
|
}, texts.table3.editing.actions.save), /*#__PURE__*/React__default.createElement(Menu$1.Item, {
|
|
13938
14539
|
icon: "close",
|
|
13939
14540
|
disabled: !hasChanges,
|
|
13940
|
-
onClick: () =>
|
|
14541
|
+
onClick: () => setClearConfirmationOpen(true)
|
|
13941
14542
|
}, texts.table3.editing.actions.clear), /*#__PURE__*/React__default.createElement(Menu$1.Item, {
|
|
13942
14543
|
icon: "undo",
|
|
13943
|
-
onClick: () =>
|
|
14544
|
+
onClick: () => editing.toggleEditing(false)
|
|
13944
14545
|
}, texts.table3.editing.actions.exit))),
|
|
13945
14546
|
tabIndex: isCurrentRow ? 0 : -1
|
|
13946
|
-
})
|
|
14547
|
+
}), /*#__PURE__*/React__default.createElement(Dialog, {
|
|
14548
|
+
size: "xs",
|
|
14549
|
+
open: clearConfirmationOpen,
|
|
14550
|
+
onClose: () => {
|
|
14551
|
+
setClearConfirmationOpen(false);
|
|
14552
|
+
requestAnimationFrame(() => {
|
|
14553
|
+
if (edititngActionsRef.current) {
|
|
14554
|
+
edititngActionsRef.current.focus();
|
|
14555
|
+
// When table looses focus, we need to re-set the last column index
|
|
14556
|
+
lastCellIndex.value = getColumnIndex(edititngActionsRef.current);
|
|
14557
|
+
}
|
|
14558
|
+
});
|
|
14559
|
+
}
|
|
14560
|
+
}, /*#__PURE__*/React__default.createElement(Dialog.Content, {
|
|
14561
|
+
"aria-label": texts.table3.editing.clearChangesConfirmationDialog.title
|
|
14562
|
+
}, /*#__PURE__*/React__default.createElement(Dialog.Title, null, texts.table3.editing.clearChangesConfirmationDialog.title), /*#__PURE__*/React__default.createElement("p", null, texts.table3.editing.clearChangesConfirmationDialog.description.replace('[ROW_IDENTIFIER]', rowIdentifier && rowIdentifierHeader ? rowIdentifierHeader : texts.table3.validation.index).replace('[ROW_IDENTIFIER_VALUE]', rowIdentifier && rowIdentifierHeader ? row.original[rowIdentifier] : row.index)), /*#__PURE__*/React__default.createElement(Dialog.Footer, null, /*#__PURE__*/React__default.createElement(Group, null, /*#__PURE__*/React__default.createElement(Dialog.Close, null, /*#__PURE__*/React__default.createElement(Button$1, {
|
|
14563
|
+
tabIndex: 0
|
|
14564
|
+
}, texts.table3.editing.clearChangesConfirmationDialog.cancel)), /*#__PURE__*/React__default.createElement(Dialog.Close, null, /*#__PURE__*/React__default.createElement(Button$1, {
|
|
14565
|
+
tabIndex: 0,
|
|
14566
|
+
appearance: "primary",
|
|
14567
|
+
autoFocus: true,
|
|
14568
|
+
onClick: () => editing.resetChange(row.id)
|
|
14569
|
+
}, texts.table3.editing.clearChangesConfirmationDialog.confirm)))))));
|
|
13947
14570
|
}
|
|
13948
14571
|
const contentClassName = cn('flex items-center justify-end text-right', {
|
|
13949
14572
|
'-mb-2 -mt-2': isCurrentRow
|
|
@@ -13965,15 +14588,17 @@ function Cell$1(props) {
|
|
|
13965
14588
|
return /*#__PURE__*/React__default.createElement(MemoedCell$1, Object.assign({}, props, {
|
|
13966
14589
|
hasChanges: changeset.indexOf(props.row.id) >= 0,
|
|
13967
14590
|
isCurrentRow: tableMeta.currentRow.currentRowIndex === rowIndex,
|
|
13968
|
-
|
|
14591
|
+
editing: tableMeta.editing
|
|
13969
14592
|
}));
|
|
13970
14593
|
}
|
|
13971
14594
|
const EDITING_ACTIONS_WIDTH = 60;
|
|
13972
|
-
function createRowEditingActionsColumn() {
|
|
14595
|
+
function createRowEditingActionsColumn(rowIdentifier) {
|
|
13973
14596
|
return {
|
|
13974
14597
|
id: COLUMN_ID$1,
|
|
13975
14598
|
header: Header$1,
|
|
13976
|
-
cell: Cell$1,
|
|
14599
|
+
cell: context => /*#__PURE__*/React__default.createElement(Cell$1, Object.assign({}, context, {
|
|
14600
|
+
rowIdentifier: rowIdentifier
|
|
14601
|
+
})),
|
|
13977
14602
|
footer: Footer$3,
|
|
13978
14603
|
meta: {
|
|
13979
14604
|
align: 'right',
|
|
@@ -14104,42 +14729,6 @@ const Indicator = ({
|
|
|
14104
14729
|
}), indicatorText.title)), container);
|
|
14105
14730
|
};
|
|
14106
14731
|
|
|
14107
|
-
const focussableNodeNames = ['A', 'BUTTON', 'INPUT', 'TEXTAREA', 'SELECT', 'DETAILS'];
|
|
14108
|
-
const focusableSelector = /*#__PURE__*/focussableNodeNames.join(', ');
|
|
14109
|
-
const hasChanged = (value, newValue) => {
|
|
14110
|
-
if (dateFns.isDate(value) && dateFns.isDate(newValue)) {
|
|
14111
|
-
return !isWeakEqual(value, newValue);
|
|
14112
|
-
} else if (Array.isArray(value)) {
|
|
14113
|
-
return JSON.stringify(value) !== JSON.stringify(newValue);
|
|
14114
|
-
}
|
|
14115
|
-
return value !== newValue;
|
|
14116
|
-
};
|
|
14117
|
-
const willRowMoveAfterSorting = (value, cell, rowIndex, rows, desc) => {
|
|
14118
|
-
var _resortedRows$index;
|
|
14119
|
-
const miniSortRows = [{
|
|
14120
|
-
...cell.row,
|
|
14121
|
-
original: {
|
|
14122
|
-
...cell.row.original,
|
|
14123
|
-
[cell.column.id]: value
|
|
14124
|
-
}
|
|
14125
|
-
}];
|
|
14126
|
-
// getValue is used by the built-in sort functons, so we need to make sure it returns the changed value
|
|
14127
|
-
miniSortRows[0].getValue = () => value;
|
|
14128
|
-
let index = 0;
|
|
14129
|
-
if (rowIndex > 0) {
|
|
14130
|
-
miniSortRows.unshift(rows[rowIndex - 1]);
|
|
14131
|
-
index = 1;
|
|
14132
|
-
}
|
|
14133
|
-
if (rowIndex < rows.length - 1) {
|
|
14134
|
-
miniSortRows.push(rows[rowIndex + 1]);
|
|
14135
|
-
}
|
|
14136
|
-
let resortedRows = [...miniSortRows].sort((a, b) => cell.column.getSortingFn()(a, b, cell.column.id));
|
|
14137
|
-
if (desc) {
|
|
14138
|
-
resortedRows = resortedRows.reverse();
|
|
14139
|
-
}
|
|
14140
|
-
return ((_resortedRows$index = resortedRows[index]) === null || _resortedRows$index === void 0 ? void 0 : _resortedRows$index.id) !== cell.row.id;
|
|
14141
|
-
};
|
|
14142
|
-
|
|
14143
14732
|
const Textarea = /*#__PURE__*/React.forwardRef(function Textarea(props, ref) {
|
|
14144
14733
|
const {
|
|
14145
14734
|
defaultValue: _,
|
|
@@ -14183,7 +14772,7 @@ const heights = {
|
|
|
14183
14772
|
max: 86
|
|
14184
14773
|
},
|
|
14185
14774
|
medium: {
|
|
14186
|
-
min:
|
|
14775
|
+
min: 32,
|
|
14187
14776
|
max: 100
|
|
14188
14777
|
},
|
|
14189
14778
|
large: {
|
|
@@ -14195,6 +14784,7 @@ const TextareaControl = /*#__PURE__*/React__default.forwardRef(function Textarea
|
|
|
14195
14784
|
const {
|
|
14196
14785
|
onKeyDown: handleKeyDown,
|
|
14197
14786
|
onChange: handleChange,
|
|
14787
|
+
onBlur,
|
|
14198
14788
|
column,
|
|
14199
14789
|
isCellInDetailMode,
|
|
14200
14790
|
align,
|
|
@@ -14250,7 +14840,7 @@ const TextareaControl = /*#__PURE__*/React__default.forwardRef(function Textarea
|
|
|
14250
14840
|
resizeTextArea(e.target);
|
|
14251
14841
|
};
|
|
14252
14842
|
const textareaContainerClassName = cn('w-full', {
|
|
14253
|
-
'focus-within:absolute focus-within:left-0 focus-within:top-0 focus-within:z-
|
|
14843
|
+
'focus-within:absolute focus-within:left-0 focus-within:top-0 focus-within:z-[9]': columnMeta === null || columnMeta === void 0 ? void 0 : columnMeta.enableTruncate
|
|
14254
14844
|
});
|
|
14255
14845
|
const handleTextareaKeyDown = event => {
|
|
14256
14846
|
// By default Shift + Enter in textarea makes a new line, we want to keep this behaviour
|
|
@@ -14260,9 +14850,23 @@ const TextareaControl = /*#__PURE__*/React__default.forwardRef(function Textarea
|
|
|
14260
14850
|
handleKeyDown(event);
|
|
14261
14851
|
}
|
|
14262
14852
|
};
|
|
14853
|
+
const handleBlur = event => {
|
|
14854
|
+
// If truncation is enabled, then textarea should shring back to min height, when loosing focus.
|
|
14855
|
+
if (columnMeta !== null && columnMeta !== void 0 && columnMeta.enableTruncate) {
|
|
14856
|
+
const textareaElement = event.currentTarget;
|
|
14857
|
+
textareaElement.style.height = `${minMaxHeight.min}px`;
|
|
14858
|
+
}
|
|
14859
|
+
onBlur(event);
|
|
14860
|
+
};
|
|
14263
14861
|
return /*#__PURE__*/React__default.createElement("div", {
|
|
14264
|
-
className: textareaContainerClassName,
|
|
14265
14862
|
"data-taco": "input-container"
|
|
14863
|
+
}, /*#__PURE__*/React__default.createElement("div", {
|
|
14864
|
+
style: {
|
|
14865
|
+
minHeight: `${minMaxHeight.min}px`
|
|
14866
|
+
},
|
|
14867
|
+
className: "relative"
|
|
14868
|
+
}, /*#__PURE__*/React__default.createElement("div", {
|
|
14869
|
+
className: textareaContainerClassName
|
|
14266
14870
|
}, /*#__PURE__*/React__default.createElement(Textarea, Object.assign({}, attributes, {
|
|
14267
14871
|
onChange: event => {
|
|
14268
14872
|
handleChange(event.target.value);
|
|
@@ -14272,14 +14876,8 @@ const TextareaControl = /*#__PURE__*/React__default.forwardRef(function Textarea
|
|
|
14272
14876
|
onKeyDown: e => {
|
|
14273
14877
|
handleTextareaKeyDown(e);
|
|
14274
14878
|
},
|
|
14275
|
-
onBlur:
|
|
14276
|
-
|
|
14277
|
-
if (columnMeta !== null && columnMeta !== void 0 && columnMeta.enableTruncate) {
|
|
14278
|
-
const textareaElement = event.currentTarget;
|
|
14279
|
-
textareaElement.style.height = `${minMaxHeight.min}px`;
|
|
14280
|
-
}
|
|
14281
|
-
},
|
|
14282
|
-
className: cn(getCellAlignmentClasses(align), `z-20 h-fit resize-none`, {
|
|
14879
|
+
onBlur: handleBlur,
|
|
14880
|
+
className: cn(getCellAlignmentClasses(align), `h-fit resize-none`, {
|
|
14283
14881
|
[`!min-h-[${minMaxHeight.min}px]`]: columnMeta === null || columnMeta === void 0 ? void 0 : columnMeta.enableTruncate,
|
|
14284
14882
|
'!yt-focus-dark': isCellInDetailMode,
|
|
14285
14883
|
[`h-[${minMaxHeight.min}px]`]: !isCellInDetailMode && (columnMeta === null || columnMeta === void 0 ? void 0 : columnMeta.enableTruncate),
|
|
@@ -14288,7 +14886,7 @@ const TextareaControl = /*#__PURE__*/React__default.forwardRef(function Textarea
|
|
|
14288
14886
|
}),
|
|
14289
14887
|
ref: ref,
|
|
14290
14888
|
value: String(value !== null && value !== void 0 ? value : '')
|
|
14291
|
-
})));
|
|
14889
|
+
})))));
|
|
14292
14890
|
});
|
|
14293
14891
|
|
|
14294
14892
|
const EditingControl = /*#__PURE__*/React__default.forwardRef(function Control(props, externalRef) {
|
|
@@ -14303,6 +14901,7 @@ const EditingControl = /*#__PURE__*/React__default.forwardRef(function Control(p
|
|
|
14303
14901
|
tableRef,
|
|
14304
14902
|
value,
|
|
14305
14903
|
cell,
|
|
14904
|
+
error,
|
|
14306
14905
|
isCurrentRow,
|
|
14307
14906
|
...attributes
|
|
14308
14907
|
} = props;
|
|
@@ -14312,6 +14911,8 @@ const EditingControl = /*#__PURE__*/React__default.forwardRef(function Control(p
|
|
|
14312
14911
|
const columnMeta = column.columnDef.meta;
|
|
14313
14912
|
const controlRenderer = columnMeta === null || columnMeta === void 0 ? void 0 : columnMeta.control;
|
|
14314
14913
|
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));
|
|
14914
|
+
const originalRow = cell.row.original;
|
|
14915
|
+
// Revert to initial value if escape was pressed
|
|
14315
14916
|
const handleKeyDown = event => {
|
|
14316
14917
|
// For some reason keydown event handler is not propogated to the table when input or other control element is
|
|
14317
14918
|
// in focus so we need to check for shortcut that toggles the editing.
|
|
@@ -14371,7 +14972,7 @@ const EditingControl = /*#__PURE__*/React__default.forwardRef(function Control(p
|
|
|
14371
14972
|
return;
|
|
14372
14973
|
}
|
|
14373
14974
|
};
|
|
14374
|
-
const isNumber =
|
|
14975
|
+
const isNumber = (columnMeta === null || columnMeta === void 0 ? void 0 : columnMeta.dataType) === 'number';
|
|
14375
14976
|
const handleInputKeyDown = event => {
|
|
14376
14977
|
handleKeyDown(event);
|
|
14377
14978
|
// Switching to editing mode, when key pressed any alphabetical character or number
|
|
@@ -14379,19 +14980,11 @@ const EditingControl = /*#__PURE__*/React__default.forwardRef(function Control(p
|
|
|
14379
14980
|
tableMeta.editing.setDetailModeEditing(true);
|
|
14380
14981
|
}
|
|
14381
14982
|
};
|
|
14382
|
-
const handleDatepickerChange = event => {
|
|
14383
|
-
// When datepicker looses focus, it triggers change event, even if date wasn't changed,
|
|
14384
|
-
// so adding additional check here to prevent adding change to the edititng state.
|
|
14385
|
-
const originalDate = cell.row.original[cell.column.id];
|
|
14386
|
-
const changedDate = event.detail;
|
|
14387
|
-
if (hasChanged(originalDate, changedDate)) {
|
|
14388
|
-
handleChange(changedDate);
|
|
14389
|
-
}
|
|
14390
|
-
};
|
|
14391
14983
|
if (typeof controlRenderer === 'function') {
|
|
14392
14984
|
return controlRenderer({
|
|
14393
14985
|
...attributes,
|
|
14394
|
-
ref:
|
|
14986
|
+
ref: refCallback,
|
|
14987
|
+
invalid: !!error,
|
|
14395
14988
|
setValue: nextValue => {
|
|
14396
14989
|
if (nextValue !== value) {
|
|
14397
14990
|
handleChange(nextValue);
|
|
@@ -14400,19 +14993,22 @@ const EditingControl = /*#__PURE__*/React__default.forwardRef(function Control(p
|
|
|
14400
14993
|
value
|
|
14401
14994
|
}, data);
|
|
14402
14995
|
} else if (controlRenderer === 'datepicker') {
|
|
14403
|
-
const
|
|
14404
|
-
|
|
14405
|
-
|
|
14406
|
-
|
|
14407
|
-
|
|
14996
|
+
const handleDatepickerChange = event => {
|
|
14997
|
+
// When datepicker looses focus, it triggers change event, even if date wasn't changed,
|
|
14998
|
+
// so adding additional check here to prevent adding change to the edititng state.
|
|
14999
|
+
const originalDate = originalRow[cell.column.id];
|
|
15000
|
+
const changedDate = event.detail;
|
|
15001
|
+
if (hasChanged(originalDate, changedDate)) {
|
|
15002
|
+
handleChange(changedDate);
|
|
14408
15003
|
}
|
|
14409
15004
|
};
|
|
14410
15005
|
return /*#__PURE__*/React__default.createElement(Datepicker, Object.assign({}, attributes, {
|
|
15006
|
+
invalid: !!error,
|
|
14411
15007
|
className: cn({
|
|
14412
15008
|
'[&_input]:!yt-focus-dark': isCellInDetailMode
|
|
14413
15009
|
}),
|
|
14414
15010
|
onChange: handleDatepickerChange,
|
|
14415
|
-
onKeyDown:
|
|
15011
|
+
onKeyDown: handleInputKeyDown,
|
|
14416
15012
|
ref: refCallback,
|
|
14417
15013
|
value: value
|
|
14418
15014
|
}));
|
|
@@ -14424,6 +15020,7 @@ const EditingControl = /*#__PURE__*/React__default.forwardRef(function Control(p
|
|
|
14424
15020
|
}));
|
|
14425
15021
|
} else if (controlRenderer === 'textarea') {
|
|
14426
15022
|
return /*#__PURE__*/React__default.createElement(TextareaControl, Object.assign({}, props, {
|
|
15023
|
+
invalid: !!error,
|
|
14427
15024
|
isCellInDetailMode: isCellInDetailMode,
|
|
14428
15025
|
onKeyDown: handleInputKeyDown,
|
|
14429
15026
|
ref: refCallback,
|
|
@@ -14431,6 +15028,7 @@ const EditingControl = /*#__PURE__*/React__default.forwardRef(function Control(p
|
|
|
14431
15028
|
}));
|
|
14432
15029
|
}
|
|
14433
15030
|
return /*#__PURE__*/React__default.createElement(Input, Object.assign({}, attributes, {
|
|
15031
|
+
invalid: !!error,
|
|
14434
15032
|
className: cn(getInputAppearanceClassnames(), getCellAlignmentClasses(align), {
|
|
14435
15033
|
'!yt-focus-dark': isCellInDetailMode
|
|
14436
15034
|
}),
|
|
@@ -14445,12 +15043,18 @@ const EditingControl = /*#__PURE__*/React__default.forwardRef(function Control(p
|
|
|
14445
15043
|
});
|
|
14446
15044
|
|
|
14447
15045
|
function EditingCell(props) {
|
|
15046
|
+
const {
|
|
15047
|
+
cell,
|
|
15048
|
+
table
|
|
15049
|
+
} = props;
|
|
14448
15050
|
const {
|
|
14449
15051
|
isHovered
|
|
14450
15052
|
} = useRowContext();
|
|
14451
15053
|
// Need to explicitly pass tableMeta, because just passing the table object will not trigger editing change since table object is not mutatable.
|
|
14452
|
-
const tableMeta =
|
|
15054
|
+
const tableMeta = table.options.meta;
|
|
15055
|
+
const error = tableMeta.validation.getCellError(cell);
|
|
14453
15056
|
return /*#__PURE__*/React__default.createElement(MemoedEditingCell, Object.assign({}, props, {
|
|
15057
|
+
error: error,
|
|
14454
15058
|
isHovered: isHovered,
|
|
14455
15059
|
tableMeta: tableMeta
|
|
14456
15060
|
}));
|
|
@@ -14465,8 +15069,10 @@ const MemoedEditingCell = /*#__PURE__*/React__default.memo(function MemoedEditin
|
|
|
14465
15069
|
table,
|
|
14466
15070
|
tableRef,
|
|
14467
15071
|
row,
|
|
14468
|
-
|
|
14469
|
-
|
|
15072
|
+
tableMeta,
|
|
15073
|
+
error,
|
|
15074
|
+
highlighted,
|
|
15075
|
+
highlightedAsCurrent
|
|
14470
15076
|
} = props;
|
|
14471
15077
|
const columnMeta = column.columnDef.meta;
|
|
14472
15078
|
const cellRef = React__default.useRef(null);
|
|
@@ -14503,31 +15109,38 @@ const MemoedEditingCell = /*#__PURE__*/React__default.memo(function MemoedEditin
|
|
|
14503
15109
|
}
|
|
14504
15110
|
};
|
|
14505
15111
|
const handleBlur = () => {
|
|
15112
|
+
var _tableMeta$editing$ch;
|
|
14506
15113
|
tableMeta.editing.setDetailModeEditing(false);
|
|
15114
|
+
if ((_tableMeta$editing$ch = tableMeta.editing.changes) !== null && _tableMeta$editing$ch !== void 0 && _tableMeta$editing$ch[cell.row.id]) {
|
|
15115
|
+
tableMeta.validation.validate(cell.row.id, tableMeta.editing.changes[cell.row.id], cell.column.id);
|
|
15116
|
+
}
|
|
14507
15117
|
};
|
|
14508
15118
|
// row move indicator
|
|
14509
|
-
const moveReason = (_tableMeta$editing$ro = tableMeta.editing.rowMoveReason
|
|
15119
|
+
const moveReason = ((_tableMeta$editing$ro = tableMeta.editing.rowMoveReason) === null || _tableMeta$editing$ro === void 0 ? void 0 : _tableMeta$editing$ro[cell.column.id]) || null;
|
|
14510
15120
|
const rows = table.getRowModel().rows;
|
|
14511
15121
|
const currentRowIndex = tableMeta.currentRow.currentRowIndex;
|
|
14512
15122
|
const isCurrentRow = currentRowIndex !== undefined && ((_rows$currentRowIndex = rows[currentRowIndex]) === null || _rows$currentRowIndex === void 0 ? void 0 : _rows$currentRowIndex.id) === row.id;
|
|
14513
15123
|
const mountNode = React__default.useMemo(() => {
|
|
14514
|
-
if (moveReason) {
|
|
15124
|
+
if (moveReason !== null && isCurrentRow && !error) {
|
|
14515
15125
|
var _cellRef$current2, _cellRef$current2$par;
|
|
14516
15126
|
return (_cellRef$current2 = cellRef.current) === null || _cellRef$current2 === void 0 ? void 0 : (_cellRef$current2$par = _cellRef$current2.parentElement) === null || _cellRef$current2$par === void 0 ? void 0 : _cellRef$current2$par.firstChild;
|
|
14517
15127
|
}
|
|
14518
15128
|
return null;
|
|
14519
|
-
}, [moveReason, cellRef]);
|
|
15129
|
+
}, [moveReason, isCurrentRow, error, cellRef]);
|
|
14520
15130
|
const removeMoveReason = () => {
|
|
14521
|
-
tableMeta.editing.removeRowMoveReason(
|
|
15131
|
+
tableMeta.editing.removeRowMoveReason();
|
|
14522
15132
|
};
|
|
14523
15133
|
React__default.useEffect(() => {
|
|
14524
15134
|
// To avoid reseting move reason on another row hover,
|
|
14525
15135
|
// we need to check for changes only if value got changed in the current row.
|
|
14526
|
-
if (!isCurrentRow) {
|
|
15136
|
+
if (!isCurrentRow || error) {
|
|
15137
|
+
if (tableMeta.editing.rowMoveReason) {
|
|
15138
|
+
removeMoveReason();
|
|
15139
|
+
}
|
|
14527
15140
|
return;
|
|
14528
15141
|
}
|
|
14529
15142
|
if (hasChanged(getValue(), value)) {
|
|
14530
|
-
const moveReason = getRowMoveReason(table, row.index, row.original, cell, value);
|
|
15143
|
+
const moveReason = getRowMoveReason(table, row.index, row.original, cell, value, tableMeta.search.excludeUnmatchedResults);
|
|
14531
15144
|
tableMeta.editing.setRowMoveReason({
|
|
14532
15145
|
[cell.column.id]: moveReason
|
|
14533
15146
|
});
|
|
@@ -14535,28 +15148,19 @@ const MemoedEditingCell = /*#__PURE__*/React__default.memo(function MemoedEditin
|
|
|
14535
15148
|
removeMoveReason();
|
|
14536
15149
|
}
|
|
14537
15150
|
return removeMoveReason;
|
|
14538
|
-
}, [value]);
|
|
15151
|
+
}, [value, tableMeta.currentRow.currentRowIndex, tableMeta.search.excludeUnmatchedResults, error]);
|
|
14539
15152
|
const controlRenderer = (_column$columnDef$met = column.columnDef.meta) === null || _column$columnDef$met === void 0 ? void 0 : _column$columnDef$met.control;
|
|
14540
15153
|
const className = cn('py-[calc(var(--table3-cell-padding-y)_-_0.06rem)]', {
|
|
14541
|
-
|
|
14542
|
-
|
|
14543
|
-
|
|
14544
|
-
|
|
14545
|
-
|
|
14546
|
-
|
|
14547
|
-
|
|
14548
|
-
|
|
14549
|
-
|
|
14550
|
-
|
|
14551
|
-
mountNode: mountNode,
|
|
14552
|
-
validationErrors: []
|
|
14553
|
-
}), /*#__PURE__*/React__default.createElement("div", {
|
|
14554
|
-
className: className,
|
|
14555
|
-
"data-align": columnMeta.align,
|
|
14556
|
-
"data-column-index": index,
|
|
14557
|
-
"data-editable": true,
|
|
14558
|
-
role: "cell",
|
|
14559
|
-
ref: cellRef
|
|
15154
|
+
// Textarea control is positioned absolute, when column is in enableTruncate mode, so the cell need to be positioned relative
|
|
15155
|
+
relative: controlRenderer === 'textarea' && columnMeta.enableTruncate
|
|
15156
|
+
}, typeof columnMeta.className === 'function' ? columnMeta.className(row.original) : columnMeta.className);
|
|
15157
|
+
const fieldClassName = cn('!min-h-0 w-full !pb-0', {
|
|
15158
|
+
'!pb-3': !!error
|
|
15159
|
+
});
|
|
15160
|
+
const content = /*#__PURE__*/React__default.createElement(Field, {
|
|
15161
|
+
message: error,
|
|
15162
|
+
invalid: !!error,
|
|
15163
|
+
className: fieldClassName
|
|
14560
15164
|
}, /*#__PURE__*/React__default.createElement(EditingControl, {
|
|
14561
15165
|
align: columnMeta.align,
|
|
14562
15166
|
column: cell.column,
|
|
@@ -14570,22 +15174,46 @@ const MemoedEditingCell = /*#__PURE__*/React__default.memo(function MemoedEditin
|
|
|
14570
15174
|
tableRef: tableRef,
|
|
14571
15175
|
value: value,
|
|
14572
15176
|
cell: cell,
|
|
15177
|
+
error: error,
|
|
15178
|
+
tabIndex: isCurrentRow ? 0 : -1,
|
|
14573
15179
|
isCurrentRow: isCurrentRow
|
|
14574
|
-
}))
|
|
15180
|
+
}));
|
|
15181
|
+
return /*#__PURE__*/React__default.createElement(React__default.Fragment, null, moveReason !== null && mountNode && !error ? /*#__PURE__*/React__default.createElement(Indicator, {
|
|
15182
|
+
reason: moveReason,
|
|
15183
|
+
columnName: String(cell.column.columnDef.header),
|
|
15184
|
+
mountNode: mountNode,
|
|
15185
|
+
validationErrors: []
|
|
15186
|
+
}) : null, /*#__PURE__*/React__default.createElement("div", {
|
|
15187
|
+
className: !highlighted ? className : undefined,
|
|
15188
|
+
"data-align": columnMeta.align,
|
|
15189
|
+
"data-column-index": index,
|
|
15190
|
+
role: "cell",
|
|
15191
|
+
"data-editable": true,
|
|
15192
|
+
ref: cellRef,
|
|
15193
|
+
"data-invalid": !!error,
|
|
15194
|
+
"data-highlighted": highlighted
|
|
15195
|
+
}, highlighted ? /*#__PURE__*/React__default.createElement(Highlight, {
|
|
15196
|
+
current: highlightedAsCurrent,
|
|
15197
|
+
className: className,
|
|
15198
|
+
frozenColumnIndex: tableMeta.columnFreezing.frozenColumnIndex,
|
|
15199
|
+
index: index,
|
|
15200
|
+
tableRef: tableRef
|
|
15201
|
+
}, content) : content));
|
|
14575
15202
|
});
|
|
14576
|
-
function getRowMoveReason(table, rowIndex, rowValues, cell, newValue) {
|
|
15203
|
+
function getRowMoveReason(table, rowIndex, rowValues, cell, newValue, excludeUnmatchedResults) {
|
|
14577
15204
|
var _table$getState$sorti;
|
|
14578
15205
|
let rowMoveReason = null;
|
|
14579
15206
|
const {
|
|
14580
15207
|
globalFilter
|
|
14581
15208
|
} = table.getState();
|
|
14582
|
-
const isFilteredByGlobalFilter = Object.values({
|
|
15209
|
+
const isFilteredByGlobalFilter = excludeUnmatchedResults ? Object.values({
|
|
14583
15210
|
...rowValues,
|
|
14584
15211
|
[cell.id]: newValue
|
|
14585
|
-
}).some(
|
|
14586
|
-
|
|
14587
|
-
|
|
14588
|
-
|
|
15212
|
+
}).some(() => {
|
|
15213
|
+
// Global filter can be undefined when there is no text being searched so we pass an empty string to
|
|
15214
|
+
// globalFilterFn as query in that case.
|
|
15215
|
+
return globalFilterFn(String(newValue), globalFilter ? String(globalFilter) : '');
|
|
15216
|
+
}) : true;
|
|
14589
15217
|
if (!isFilteredByGlobalFilter) {
|
|
14590
15218
|
rowMoveReason = IndicatorReason.SEARCH;
|
|
14591
15219
|
} else if (cell.column.getIsFiltered() && !columnFilterFn(newValue, cell.column.getFilterValue())) {
|
|
@@ -14601,20 +15229,64 @@ function Cell$2(props) {
|
|
|
14601
15229
|
const {
|
|
14602
15230
|
column,
|
|
14603
15231
|
row,
|
|
14604
|
-
table
|
|
15232
|
+
table,
|
|
15233
|
+
index,
|
|
15234
|
+
getValue,
|
|
15235
|
+
cell
|
|
14605
15236
|
} = props;
|
|
14606
15237
|
const {
|
|
14607
|
-
isHovered: isHoveredRow
|
|
15238
|
+
isHovered: isHoveredRow,
|
|
15239
|
+
hasError
|
|
14608
15240
|
} = useRowContext();
|
|
14609
15241
|
const rows = table.getRowModel().rows;
|
|
14610
15242
|
const tableMeta = table.options.meta;
|
|
14611
15243
|
const columnMeta = column.columnDef.meta;
|
|
15244
|
+
const rowErrors = tableMeta.validation.errors ? tableMeta.validation.errors[row.id] : null;
|
|
15245
|
+
const isColumnError = hasError && rowErrors && !!rowErrors[column.id];
|
|
14612
15246
|
const currentRowIndex = tableMeta.currentRow.currentRowIndex;
|
|
14613
15247
|
const isCurrentRow = currentRowIndex !== undefined && ((_rows$currentRowIndex = rows[currentRowIndex]) === null || _rows$currentRowIndex === void 0 ? void 0 : _rows$currentRowIndex.id) === row.id;
|
|
14614
|
-
|
|
14615
|
-
|
|
15248
|
+
let value = getValue();
|
|
15249
|
+
// When row has changes we always need to show the editing state value, end revert it to original value only when row got saved successfully.
|
|
15250
|
+
// Otherwise it might confuse user because it will look like display value is getting reverted everytime user leaves the row.
|
|
15251
|
+
if (tableMeta.editing.isEditing) {
|
|
15252
|
+
const editingValue = tableMeta.editing.getCellValue(cell);
|
|
15253
|
+
value = editingValue !== null && editingValue !== void 0 ? editingValue : value;
|
|
15254
|
+
}
|
|
15255
|
+
const {
|
|
15256
|
+
rowIndex
|
|
15257
|
+
} = React__default.useContext(RowContext);
|
|
15258
|
+
const memoedHighlight = React__default.useMemo(() => {
|
|
15259
|
+
var _tableMeta$search$que;
|
|
15260
|
+
if (!tableMeta.search.isHighlightingEnabled || !columnMeta.enableSearch) {
|
|
15261
|
+
return false;
|
|
15262
|
+
}
|
|
15263
|
+
if ((_tableMeta$search$que = tableMeta.search.query) !== null && _tableMeta$search$que !== void 0 && _tableMeta$search$que.length) {
|
|
15264
|
+
return isCellHighlighted(tableMeta.search.query, value, columnMeta.dataType);
|
|
15265
|
+
}
|
|
15266
|
+
return false;
|
|
15267
|
+
}, [value, tableMeta.search.isHighlightingEnabled, tableMeta.search.excludeUnmatchedResults, tableMeta.search.query]);
|
|
15268
|
+
const memoedHighlightCurrent = React__default.useMemo(() => {
|
|
15269
|
+
if (!tableMeta.search.isHighlightingEnabled || !memoedHighlight || tableMeta.search.currentHighlightColumnIndex === undefined) {
|
|
15270
|
+
return false;
|
|
15271
|
+
}
|
|
15272
|
+
const [currentRowIndex, currentColumnIndex] = tableMeta.search.highlightedColumnIndexes[tableMeta.search.currentHighlightColumnIndex];
|
|
15273
|
+
if (currentRowIndex === rowIndex && currentColumnIndex === index) {
|
|
15274
|
+
return true;
|
|
15275
|
+
}
|
|
15276
|
+
return false;
|
|
15277
|
+
}, [memoedHighlight, tableMeta.search.highlightedColumnIndexes.length, tableMeta.search.currentHighlightColumnIndex]);
|
|
15278
|
+
const highlightProps = {
|
|
15279
|
+
highlighted: memoedHighlight,
|
|
15280
|
+
highlightedAsCurrent: memoedHighlightCurrent
|
|
15281
|
+
};
|
|
15282
|
+
if (tableMeta.editing.isEditing && columnMeta.control && (isCurrentRow || isHoveredRow && !tableMeta.hoverState.isPaused ||
|
|
15283
|
+
// When cell has error, we renderimg it in edit mode (UX reqirement)
|
|
15284
|
+
isColumnError)) {
|
|
15285
|
+
return /*#__PURE__*/React__default.createElement(EditingCell, Object.assign({}, props, highlightProps));
|
|
14616
15286
|
}
|
|
14617
|
-
return /*#__PURE__*/React__default.createElement(DisplayCell, Object.assign({}, props
|
|
15287
|
+
return /*#__PURE__*/React__default.createElement(DisplayCell, Object.assign({}, props, highlightProps, {
|
|
15288
|
+
value: value
|
|
15289
|
+
}));
|
|
14618
15290
|
}
|
|
14619
15291
|
|
|
14620
15292
|
const COLUMN_ID$2 = '__select';
|
|
@@ -14944,11 +15616,11 @@ const MemoedGroup = /*#__PURE__*/React__default.memo(function MemoedGroup(props)
|
|
|
14944
15616
|
meta,
|
|
14945
15617
|
table
|
|
14946
15618
|
} = props;
|
|
14947
|
-
const containerClassName = cn('
|
|
14948
|
-
|
|
14949
|
-
}
|
|
15619
|
+
const containerClassName = cn('px-2 z-10 hover:z-20', colSpan > 1 ? `col-span-${colSpan}` : '', {
|
|
15620
|
+
sticky: !isPrinting
|
|
15621
|
+
});
|
|
14950
15622
|
const innerClassName = cn('font-bold box-content group/column relative', 'px-[var(--table3-cell-padding-x)]', {
|
|
14951
|
-
'h-
|
|
15623
|
+
'h-10 items-center': !isPrinting,
|
|
14952
15624
|
'pb-2': isPrinting,
|
|
14953
15625
|
'border-b-2': !!children
|
|
14954
15626
|
}, meta.headerClassName);
|
|
@@ -14958,7 +15630,8 @@ const MemoedGroup = /*#__PURE__*/React__default.memo(function MemoedGroup(props)
|
|
|
14958
15630
|
return /*#__PURE__*/React__default.createElement("div", {
|
|
14959
15631
|
className: containerClassName,
|
|
14960
15632
|
"data-taco": "table3-column-group",
|
|
14961
|
-
"data-align": align
|
|
15633
|
+
"data-align": align,
|
|
15634
|
+
role: "columnheader"
|
|
14962
15635
|
}, /*#__PURE__*/React__default.createElement("div", {
|
|
14963
15636
|
className: innerClassName
|
|
14964
15637
|
}, /*#__PURE__*/React__default.createElement(Tooltip, {
|
|
@@ -15089,7 +15762,7 @@ function useConvertChildrenToColumns(props, options, editing) {
|
|
|
15089
15762
|
columns.push(columnHelper.display(createRowActionsColumn()));
|
|
15090
15763
|
}
|
|
15091
15764
|
if (editing.isEnabled && editing.isEditing) {
|
|
15092
|
-
columns.push(columnHelper.display(createRowEditingActionsColumn()));
|
|
15765
|
+
columns.push(columnHelper.display(createRowEditingActionsColumn(props.rowIdentifier)));
|
|
15093
15766
|
}
|
|
15094
15767
|
return {
|
|
15095
15768
|
columns,
|
|
@@ -15183,584 +15856,469 @@ function useEditingStateListener(table) {
|
|
|
15183
15856
|
});
|
|
15184
15857
|
}
|
|
15185
15858
|
}, [meta.currentRow.currentRowIndex]);
|
|
15186
|
-
// save if editing gets toggled off
|
|
15187
|
-
React__default.useEffect(() => {
|
|
15188
|
-
if (meta.editing.isEnabled) {
|
|
15189
|
-
if (!meta.editing.isEditing) {
|
|
15190
|
-
requestAnimationFrame(() => {
|
|
15191
|
-
meta.editing.saveChangesIfNeeded();
|
|
15192
|
-
});
|
|
15193
|
-
} else if (meta.currentRow.currentRowIndex === undefined) {
|
|
15194
|
-
meta.currentRow.setCurrentRowIndex(0);
|
|
15195
|
-
}
|
|
15196
|
-
}
|
|
15197
|
-
}, [meta.editing.isEditing]);
|
|
15198
|
-
}
|
|
15199
|
-
|
|
15200
|
-
function useSearch(isEnabled, excludeUnmatchedResultsInSearch = false, loadAll) {
|
|
15201
|
-
const [query, setQuery] = React__default.useState();
|
|
15202
|
-
const [enableHighlighting, setEnableHighlighting] = React__default.useState(true);
|
|
15203
|
-
const [excludeUnmatchedResults, setExcludeUnmatchedResults] = React__default.useState(excludeUnmatchedResultsInSearch);
|
|
15204
|
-
// highlighting
|
|
15205
|
-
const [highlightedColumnIndexes, setHighlightedColumnIndexes] = React__default.useState([]);
|
|
15206
|
-
const [currentHighlightColumnIndex, setCurrentHighlightColumnIndex] = React__default.useState(undefined);
|
|
15207
|
-
return {
|
|
15208
|
-
isEnabled,
|
|
15209
|
-
isHighlightingEnabled: enableHighlighting,
|
|
15210
|
-
toggleHighlighting: setEnableHighlighting,
|
|
15211
|
-
excludeUnmatchedResults,
|
|
15212
|
-
toggleExcludeUnmatchedResults: setExcludeUnmatchedResults,
|
|
15213
|
-
query,
|
|
15214
|
-
setQuery: isEnabled ? setQuery : () => undefined,
|
|
15215
|
-
highlightedColumnIndexes,
|
|
15216
|
-
setHighlightedColumnIndexes,
|
|
15217
|
-
currentHighlightColumnIndex,
|
|
15218
|
-
setCurrentHighlightColumnIndex,
|
|
15219
|
-
loadAll
|
|
15220
|
-
};
|
|
15221
|
-
}
|
|
15222
|
-
|
|
15223
|
-
const ACTIONS_ON_ROW_LENGTH = 4;
|
|
15224
|
-
function useRowActions$1(actionsForRow, actionsForRowLength = ACTIONS_ON_ROW_LENGTH) {
|
|
15225
|
-
return {
|
|
15226
|
-
actionsForRow,
|
|
15227
|
-
actionsForRowLength
|
|
15228
|
-
};
|
|
15229
|
-
}
|
|
15230
|
-
|
|
15231
|
-
const useLocalStorage = (key, initialValue) => {
|
|
15232
|
-
const [state, setState] = React__default.useState(() => {
|
|
15233
|
-
if (!key) {
|
|
15234
|
-
return initialValue;
|
|
15235
|
-
}
|
|
15236
|
-
try {
|
|
15237
|
-
const localStorageValue = localStorage.getItem(key);
|
|
15238
|
-
if (typeof localStorageValue !== 'string') {
|
|
15239
|
-
localStorage.setItem(key, JSON.stringify(initialValue));
|
|
15240
|
-
return initialValue;
|
|
15241
|
-
} else {
|
|
15242
|
-
return JSON.parse(localStorageValue || 'null');
|
|
15243
|
-
}
|
|
15244
|
-
} catch {
|
|
15245
|
-
// If user is in private mode or has storage restriction
|
|
15246
|
-
// localStorage can throw. JSON.parse and JSON.stringify
|
|
15247
|
-
// can throw, too.
|
|
15248
|
-
return initialValue;
|
|
15249
|
-
}
|
|
15250
|
-
});
|
|
15251
|
-
React__default.useEffect(() => {
|
|
15252
|
-
if (!key) {
|
|
15253
|
-
return;
|
|
15254
|
-
}
|
|
15255
|
-
try {
|
|
15256
|
-
const serializedState = JSON.stringify(state);
|
|
15257
|
-
localStorage.setItem(key, serializedState);
|
|
15258
|
-
} catch {
|
|
15259
|
-
// If user is in private mode or has storage restriction
|
|
15260
|
-
// localStorage can throw. Also JSON.stringify can throw.
|
|
15261
|
-
}
|
|
15262
|
-
}, [key, state]);
|
|
15263
|
-
const clear = () => {
|
|
15264
|
-
if (key) {
|
|
15265
|
-
localStorage.removeItem(key);
|
|
15266
|
-
}
|
|
15267
|
-
};
|
|
15268
|
-
return [state, setState, clear];
|
|
15269
|
-
};
|
|
15270
|
-
|
|
15271
|
-
function useTacoSettings() {
|
|
15272
|
-
return React__default.useContext(TacoContext);
|
|
15273
|
-
}
|
|
15274
|
-
|
|
15275
|
-
function useUniqueTableId(tableId) {
|
|
15276
|
-
const tacoSettings = useTacoSettings();
|
|
15277
|
-
return `taco.${tacoSettings.uniqueUserIdentifier}.table3.${tableId}.settings`;
|
|
15278
|
-
}
|
|
15279
|
-
function useSettings(id, defaultSettings = {}, onChangeSettings) {
|
|
15280
|
-
const uniqueId = useUniqueTableId(id);
|
|
15281
|
-
// If the onChangeSettings prop is provided, we intend to handle settings changes externally rather than saving them
|
|
15282
|
-
// to local storage.
|
|
15283
|
-
const [persistedSettings, setPersistedSettings] = useLocalStorage(uniqueId, defaultSettings);
|
|
15284
|
-
useLazyEffect(() => {
|
|
15285
|
-
if (onChangeSettings) {
|
|
15286
|
-
onChangeSettings(persistedSettings);
|
|
15287
|
-
}
|
|
15288
|
-
}, [persistedSettings]);
|
|
15289
|
-
return [persistedSettings, setPersistedSettings];
|
|
15290
|
-
}
|
|
15291
|
-
|
|
15292
|
-
function useTable$1(props) {
|
|
15293
|
-
var _ref, _defaultSettings$colu, _defaultSettings$rowH, _props$length;
|
|
15294
|
-
// options
|
|
15295
|
-
const options = useTablePreset(props);
|
|
15296
|
-
const tableOptions = {
|
|
15297
|
-
enableColumnFilters: options.enableFiltering,
|
|
15298
|
-
enableColumnResizing: options.enableColumnResizing,
|
|
15299
|
-
enableExpanding: options.enableRowExpansion,
|
|
15300
|
-
enableGlobalFilter: options.enableSearch,
|
|
15301
|
-
enableHiding: options.enableColumnHiding,
|
|
15302
|
-
enableRowSelection: options.enableRowSelection,
|
|
15303
|
-
enableMultiRowSelection: !options.enableRowSelectionSingle,
|
|
15304
|
-
enableSorting: options.enableSorting
|
|
15305
|
-
};
|
|
15306
|
-
// resizing
|
|
15307
|
-
if (tableOptions.enableColumnResizing) {
|
|
15308
|
-
tableOptions.columnResizeMode = 'onChange';
|
|
15309
|
-
}
|
|
15310
|
-
// filtering
|
|
15311
|
-
if (tableOptions.enableColumnFilters) {
|
|
15312
|
-
if (!props.onFilter) {
|
|
15313
|
-
tableOptions.filterFns = {
|
|
15314
|
-
tacoFilter: (row, columnId, filter) => columnFilterFn(row.getValue(columnId), filter)
|
|
15315
|
-
};
|
|
15316
|
-
tableOptions.getFilteredRowModel = reactTable$1.getFilteredRowModel();
|
|
15317
|
-
}
|
|
15318
|
-
// we don't tableOptions.manualFiltering = true; because it breaks global filtering, server filtering still works :shrug:
|
|
15319
|
-
}
|
|
15320
|
-
// search
|
|
15321
|
-
if (tableOptions.enableGlobalFilter) {
|
|
15322
|
-
// search is always client side, since we call loadAll when searching
|
|
15323
|
-
tableOptions.globalFilterFn = (row, columnId, searchQuery) => {
|
|
15324
|
-
try {
|
|
15325
|
-
if (row.original) {
|
|
15326
|
-
const cell = row.getAllCells().find(cell => cell.column.id === columnId);
|
|
15327
|
-
const columnMeta = cell === null || cell === void 0 ? void 0 : cell.column.columnDef.meta;
|
|
15328
|
-
if (cell && cell.column.getIsVisible() && columnMeta !== null && columnMeta !== void 0 && columnMeta.enableSearch) {
|
|
15329
|
-
const cellValue = getCellValueAsString(row.original[columnId], columnMeta === null || columnMeta === void 0 ? void 0 : columnMeta.dataType);
|
|
15330
|
-
if (cellValue !== undefined) {
|
|
15331
|
-
return globalFilterFn(cellValue, searchQuery);
|
|
15332
|
-
}
|
|
15333
|
-
}
|
|
15334
|
-
return false;
|
|
15335
|
-
}
|
|
15336
|
-
} catch {
|
|
15337
|
-
//
|
|
15338
|
-
}
|
|
15339
|
-
return false;
|
|
15340
|
-
};
|
|
15341
|
-
tableOptions.getFilteredRowModel = reactTable$1.getFilteredRowModel();
|
|
15342
|
-
tableOptions.getColumnCanGlobalFilter = column => {
|
|
15343
|
-
var _column$columnDef$met;
|
|
15344
|
-
return (_column$columnDef$met = column.columnDef.meta.enableSearch) !== null && _column$columnDef$met !== void 0 ? _column$columnDef$met : true;
|
|
15345
|
-
};
|
|
15346
|
-
}
|
|
15347
|
-
// sorting
|
|
15348
|
-
if (options.enableSorting) {
|
|
15349
|
-
if (props.onSort) {
|
|
15350
|
-
tableOptions.manualSorting = true;
|
|
15351
|
-
// onSort is called as a listener to let the consumer update their data, so we don't use onSortingChange
|
|
15352
|
-
} else {
|
|
15353
|
-
tableOptions.getSortedRowModel = reactTable$1.getSortedRowModel();
|
|
15354
|
-
}
|
|
15355
|
-
}
|
|
15356
|
-
const [defaultSettings, setSettings] = useSettings(props.id, props.defaultSettings, props.onChangeSettings);
|
|
15357
|
-
// custom features
|
|
15358
|
-
const columnFreezing = useColumnFreezing( // temporarily see if deprecated frozenColumnCount is there
|
|
15359
|
-
(_ref = (_defaultSettings$colu = defaultSettings.columnFreezingIndex) !== null && _defaultSettings$colu !== void 0 ? _defaultSettings$colu : defaultSettings === null || defaultSettings === void 0 ? void 0 : defaultSettings.frozenColumnCount) !== null && _ref !== void 0 ? _ref : props.defaultColumnFreezingIndex, options);
|
|
15360
|
-
const columnOrdering = useColumnOrdering(options);
|
|
15361
|
-
const currentRow = useCurrentRow(props.defaultCurrentRowIndex);
|
|
15362
|
-
const editing = useEditing(options.enableEditing, props.onSave);
|
|
15363
|
-
const fontSize = useFontSize(options.enableFontSize, defaultSettings.fontSize);
|
|
15364
|
-
const hoverState = usePauseHoverState();
|
|
15365
|
-
const printing = usePrinting(options.enablePrinting, props.loadAll, defaultSettings.showWarningWhenPrintingLargeDataset);
|
|
15366
|
-
const rowActions = useRowActions$1(props.actionsForRow, props.actionsForRowLength);
|
|
15367
|
-
const rowClick = useRowClick(props.onRowClick);
|
|
15368
|
-
const rowDrag = useRowDrag(options.enableRowDrag);
|
|
15369
|
-
const rowDrop = useRowDrop(options.enableRowDrop, props.onRowDrop);
|
|
15370
|
-
const rowGoto = useRowGoto(options.enableRowGoto, props.onRowGoto);
|
|
15371
|
-
const rowHeight = useRowHeight(options.enableRowHeight, // temporarily see if deprecated rowDensity is there
|
|
15372
|
-
(_defaultSettings$rowH = defaultSettings.rowHeight) !== null && _defaultSettings$rowH !== void 0 ? _defaultSettings$rowH : defaultSettings === null || defaultSettings === void 0 ? void 0 : defaultSettings.rowDensity);
|
|
15373
|
-
const rowSelection = useRowSelection();
|
|
15374
|
-
const search = useSearch(options.enableSearch, defaultSettings.excludeUnmatchedRecordsInSearch, props.loadAll);
|
|
15375
|
-
// columns
|
|
15376
|
-
const {
|
|
15377
|
-
columns,
|
|
15378
|
-
defaultColumnSizing,
|
|
15379
|
-
defaultColumnVisibility,
|
|
15380
|
-
defaultSorting
|
|
15381
|
-
} = useConvertChildrenToColumns(props, options, editing);
|
|
15382
|
-
// built-in features
|
|
15383
|
-
const initialState = React__default.useMemo(() => {
|
|
15384
|
-
var _defaultSettings$colu2, _defaultSettings$colu3, _props$defaultSetting, _props$defaultSetting3;
|
|
15385
|
-
const sanitizeSortedColumns = column => columns.find(definedColumn => definedColumn.id === column.id);
|
|
15386
|
-
const state = {
|
|
15387
|
-
columnOrder: ensureOrdering(columns, defaultSettings.columnOrder),
|
|
15388
|
-
columnSizing: (_defaultSettings$colu2 = defaultSettings.columnSizing) !== null && _defaultSettings$colu2 !== void 0 ? _defaultSettings$colu2 : defaultColumnSizing,
|
|
15389
|
-
columnVisibility: (_defaultSettings$colu3 = defaultSettings.columnVisibility) !== null && _defaultSettings$colu3 !== void 0 ? _defaultSettings$colu3 : defaultColumnVisibility,
|
|
15390
|
-
sorting: defaultSettings.sorting ? defaultSettings.sorting.filter(sanitizeSortedColumns) : defaultSorting
|
|
15391
|
-
};
|
|
15392
|
-
// we don't save these outside the table, but they need to be here for print to inherit them - see PrintButton.tsx
|
|
15393
|
-
if ((_props$defaultSetting = props.defaultSettings) !== null && _props$defaultSetting !== void 0 && _props$defaultSetting.columnFilters) {
|
|
15394
|
-
var _props$defaultSetting2;
|
|
15395
|
-
state.columnFilters = (_props$defaultSetting2 = props.defaultSettings) === null || _props$defaultSetting2 === void 0 ? void 0 : _props$defaultSetting2.columnFilters;
|
|
15396
|
-
}
|
|
15397
|
-
if ((_props$defaultSetting3 = props.defaultSettings) !== null && _props$defaultSetting3 !== void 0 && _props$defaultSetting3.globalFilter) {
|
|
15398
|
-
var _props$defaultSetting4;
|
|
15399
|
-
state.globalFilter = (_props$defaultSetting4 = props.defaultSettings) === null || _props$defaultSetting4 === void 0 ? void 0 : _props$defaultSetting4.globalFilter;
|
|
15400
|
-
}
|
|
15401
|
-
return state;
|
|
15402
|
-
}, []);
|
|
15403
|
-
const getSettings = () => {
|
|
15404
|
-
const state = table.getState();
|
|
15405
|
-
return {
|
|
15406
|
-
columnFreezingIndex: columnFreezing.frozenColumnIndex,
|
|
15407
|
-
columnOrder: columnOrdering.isEnabled ? state.columnOrder : undefined,
|
|
15408
|
-
columnSizing: table.options.enableColumnResizing ? state.columnSizing : undefined,
|
|
15409
|
-
columnVisibility: table.options.enableHiding ? state.columnVisibility : undefined,
|
|
15410
|
-
excludeUnmatchedRecordsInSearch: search.excludeUnmatchedResults,
|
|
15411
|
-
fontSize: fontSize.isEnabled ? fontSize.size : undefined,
|
|
15412
|
-
rowHeight: rowHeight.isEnabled ? rowHeight.height : undefined,
|
|
15413
|
-
showWarningWhenPrintingLargeDataset: printing.printWarningDialogVisibility,
|
|
15414
|
-
sorting: state.sorting
|
|
15415
|
-
};
|
|
15416
|
-
};
|
|
15417
|
-
const table = reactTable$1.useReactTable({
|
|
15418
|
-
data: props.data,
|
|
15419
|
-
columns,
|
|
15420
|
-
getCoreRowModel: reactTable$1.getCoreRowModel(),
|
|
15421
|
-
initialState,
|
|
15422
|
-
...tableOptions,
|
|
15423
|
-
//debugAll: true,
|
|
15424
|
-
meta: {
|
|
15425
|
-
columnFreezing,
|
|
15426
|
-
columnOrdering,
|
|
15427
|
-
currentRow,
|
|
15428
|
-
editing,
|
|
15429
|
-
enableFooter: options.enableFooter,
|
|
15430
|
-
fontSize,
|
|
15431
|
-
getSettings,
|
|
15432
|
-
hoverState,
|
|
15433
|
-
isPrinting: props.id.endsWith('_print'),
|
|
15434
|
-
isUsingServer: !!props.loadPage,
|
|
15435
|
-
printing,
|
|
15436
|
-
rowActions: rowActions,
|
|
15437
|
-
rowClick: rowClick,
|
|
15438
|
-
rowDrag,
|
|
15439
|
-
rowDrop,
|
|
15440
|
-
rowGoto,
|
|
15441
|
-
rowHeight,
|
|
15442
|
-
rowSelection,
|
|
15443
|
-
search
|
|
15444
|
-
}
|
|
15445
|
-
});
|
|
15446
|
-
// listeners
|
|
15447
|
-
useCurrentRowListener(table);
|
|
15448
|
-
useEditingStateListener(table);
|
|
15449
|
-
useFilteringStateListener(table, props.onFilter);
|
|
15450
|
-
useRowSelectionListener(table, props.onRowSelect);
|
|
15451
|
-
useSettingsStateListener(table, setSettings);
|
|
15452
|
-
useShortcutsListener(table, props.shortcuts);
|
|
15453
|
-
useServerLoadingListener(table, props.loadPage);
|
|
15454
|
-
useSortingStateListener(table, props.onSort);
|
|
15455
|
-
return {
|
|
15456
|
-
table,
|
|
15457
|
-
length: (_props$length = props.length) !== null && _props$length !== void 0 ? _props$length : props.data.length
|
|
15458
|
-
};
|
|
15459
|
-
}
|
|
15460
|
-
|
|
15461
|
-
const FOCUS_MANAGER_OPTIONS = {
|
|
15462
|
-
tabbable: true
|
|
15463
|
-
};
|
|
15464
|
-
function Row$1(props) {
|
|
15465
|
-
const focusManager = focus.useFocusManager();
|
|
15466
|
-
const tableMeta = props.table.options.meta;
|
|
15467
|
-
const isCurrentRow = tableMeta.currentRow.currentRowIndex === props.index;
|
|
15468
|
-
const isDraggingRow = tableMeta.rowDrag.dragging[props.row.id];
|
|
15469
|
-
const isFirstRow = props.index === 0;
|
|
15470
|
-
// we use non-css hovered state to determine whether to render actions or not, for performance
|
|
15471
|
-
const [isHovered, setIsHovered] = React__default.useState(false);
|
|
15472
|
-
// tab behaviour is consistent across normal mode and edit mode, handle it here
|
|
15473
|
-
const handleKeyDown = event => {
|
|
15474
|
-
if (event.isDefaultPrevented() || event.isPropagationStopped()) {
|
|
15475
|
-
return;
|
|
15476
|
-
}
|
|
15477
|
-
if (event.key === 'Tab') {
|
|
15478
|
-
tableMeta.hoverState.pause(true);
|
|
15479
|
-
let focusedElement;
|
|
15480
|
-
if (event.shiftKey) {
|
|
15481
|
-
// looping backwards
|
|
15482
|
-
focusedElement = focusManager.focusPrevious(FOCUS_MANAGER_OPTIONS);
|
|
15483
|
-
if (focusedElement) {
|
|
15484
|
-
// override default behaviour, since we're handling focus internally now
|
|
15485
|
-
event.preventDefault();
|
|
15486
|
-
} else {
|
|
15487
|
-
// there are no previous elements to focus, go up a row or go outside the table
|
|
15488
|
-
if (!isFirstRow) {
|
|
15489
|
-
event.preventDefault();
|
|
15490
|
-
tableMeta.currentRow.setCurrentRowIndex(props.index - 1);
|
|
15491
|
-
setTimeout(() => focusManager.focusLast(FOCUS_MANAGER_OPTIONS), 1);
|
|
15492
|
-
}
|
|
15493
|
-
}
|
|
15494
|
-
} else {
|
|
15495
|
-
// looping forwards
|
|
15496
|
-
focusedElement = focusManager.focusNext(FOCUS_MANAGER_OPTIONS);
|
|
15497
|
-
if (focusedElement) {
|
|
15498
|
-
// override default behaviour, since we're handling focus internally now
|
|
15499
|
-
event.preventDefault();
|
|
15500
|
-
} else {
|
|
15501
|
-
// there are no next elements to focus, go down a row or go outside the table
|
|
15502
|
-
if (!props.isLastRow) {
|
|
15503
|
-
event.preventDefault();
|
|
15504
|
-
tableMeta.currentRow.setCurrentRowIndex(props.index + 1);
|
|
15505
|
-
setTimeout(() => focusManager.focusFirst(FOCUS_MANAGER_OPTIONS), 1);
|
|
15506
|
-
}
|
|
15507
|
-
}
|
|
15508
|
-
}
|
|
15509
|
-
}
|
|
15510
|
-
};
|
|
15511
|
-
// rows are heavily memoized because performance in our table is critical
|
|
15512
|
-
// be careful and selective about props that you pass to the row
|
|
15513
|
-
const memoedProps = {
|
|
15514
|
-
// aria-grabbed is being deprecated but there is no current alternative api, we use it until there is
|
|
15515
|
-
'aria-grabbed': isDraggingRow ? true : tableMeta.rowDrag.isEnabled ? false : undefined,
|
|
15516
|
-
'data-current': isCurrentRow,
|
|
15517
|
-
'data-selected': props.row.getIsSelected(),
|
|
15518
|
-
draggable: tableMeta.rowDrag.isEnabled,
|
|
15519
|
-
index: props.index,
|
|
15520
|
-
onClick: tableMeta.rowClick.handleClick,
|
|
15521
|
-
onDrop: tableMeta.rowDrop.isEnabled ? tableMeta.rowDrop.handleDrop : undefined,
|
|
15522
|
-
onKeyDown: handleKeyDown
|
|
15523
|
-
};
|
|
15524
|
-
let output = /*#__PURE__*/React__default.createElement(MemoedRow, Object.assign({}, props, memoedProps));
|
|
15525
|
-
if (tableMeta.editing.isEditing && (isCurrentRow || isHovered && !tableMeta.hoverState.isPaused)) {
|
|
15526
|
-
output = /*#__PURE__*/React__default.createElement(EditingRow, Object.assign({}, props, memoedProps, {
|
|
15527
|
-
isFirstRow: isFirstRow,
|
|
15528
|
-
setCurrentRowIndex: tableMeta.currentRow.setCurrentRowIndex
|
|
15529
|
-
}));
|
|
15530
|
-
}
|
|
15531
|
-
// we store the row index in context because in a virtualised table the row index and the
|
|
15532
|
-
// react table row index do not match when, for example, sorting is applied
|
|
15533
|
-
const contextValue = React__default.useMemo(() => ({
|
|
15534
|
-
isHovered,
|
|
15535
|
-
setIsHovered,
|
|
15536
|
-
rowIndex: props.index
|
|
15537
|
-
}), [isHovered, props.index]);
|
|
15538
|
-
return /*#__PURE__*/React__default.createElement(RowContext.Provider, {
|
|
15539
|
-
value: contextValue
|
|
15540
|
-
}, output);
|
|
15541
|
-
}
|
|
15542
|
-
// turns out we might need some kind of "state" for the focused column, but it doesn't need to be react state that re-renders
|
|
15543
|
-
let lastIndex;
|
|
15544
|
-
function getColumnIndex(focusedElement) {
|
|
15545
|
-
if (focusedElement) {
|
|
15546
|
-
var _focusedElement$close;
|
|
15547
|
-
return (_focusedElement$close = focusedElement.closest('[role=cell]')) === null || _focusedElement$close === void 0 ? void 0 : _focusedElement$close.getAttribute('data-column-index');
|
|
15548
|
-
}
|
|
15549
|
-
return null;
|
|
15550
|
-
}
|
|
15551
|
-
// This code is needed to avoid multiple rows being hovered at the same time (it happens since we use non-css hovering)
|
|
15552
|
-
let previouslyHoveredIndex;
|
|
15553
|
-
const unhoverPreviousRow = tableRef => {
|
|
15554
|
-
if (previouslyHoveredIndex !== undefined) {
|
|
15555
|
-
var _tableRef$current;
|
|
15556
|
-
const mouseoutEvent = new MouseEvent('mouseout', {
|
|
15557
|
-
view: window,
|
|
15558
|
-
bubbles: true,
|
|
15559
|
-
cancelable: true
|
|
15560
|
-
});
|
|
15561
|
-
const previouslyHovered = tableRef === null || tableRef === void 0 ? void 0 : (_tableRef$current = tableRef.current) === null || _tableRef$current === void 0 ? void 0 : _tableRef$current.querySelector(`[data-row-index="${previouslyHoveredIndex}"]`);
|
|
15562
|
-
previouslyHovered === null || previouslyHovered === void 0 ? void 0 : previouslyHovered.dispatchEvent(mouseoutEvent);
|
|
15563
|
-
}
|
|
15564
|
-
};
|
|
15565
|
-
function EditingRow(props) {
|
|
15566
|
-
const {
|
|
15567
|
-
isFirstRow,
|
|
15568
|
-
isLastRow,
|
|
15569
|
-
onKeyDown,
|
|
15570
|
-
setCurrentRowIndex,
|
|
15571
|
-
virtualiser,
|
|
15572
|
-
...attributes
|
|
15573
|
-
} = props;
|
|
15574
|
-
const focusManager = focus.useFocusManager();
|
|
15575
|
-
const tableMeta = props.table.options.meta;
|
|
15576
|
-
const handleClickCapture = event => {
|
|
15577
|
-
lastIndex = getColumnIndex(event.target);
|
|
15578
|
-
};
|
|
15579
|
-
const handleArrowLeftKey = event => {
|
|
15580
|
-
let focusedElement;
|
|
15581
|
-
if (event.key === 'ArrowLeft') {
|
|
15582
|
-
// We need to perform special behaviour when focus reaches the end of the row,
|
|
15583
|
-
// so we don't need default browser behaviour.
|
|
15584
|
-
event.stopPropagation();
|
|
15585
|
-
event.preventDefault();
|
|
15586
|
-
// "CTRL + ArrowLeft" or "META + ArrowLeft" should focus first focusable element of the row
|
|
15587
|
-
if (event.ctrlKey || event.metaKey) {
|
|
15588
|
-
event.target.blur();
|
|
15589
|
-
focusedElement = focusManager.focusFirst(FOCUS_MANAGER_OPTIONS);
|
|
15590
|
-
lastIndex = getColumnIndex(focusedElement);
|
|
15591
|
-
} else {
|
|
15592
|
-
// looping backwards
|
|
15593
|
-
focusedElement = focusManager.focusPrevious(FOCUS_MANAGER_OPTIONS);
|
|
15594
|
-
if (focusedElement) {
|
|
15595
|
-
lastIndex = getColumnIndex(focusedElement);
|
|
15596
|
-
} else {
|
|
15597
|
-
// there are no previous elements to focus, go up a row (if there are rows above)
|
|
15598
|
-
if (!isFirstRow) {
|
|
15599
|
-
event.preventDefault();
|
|
15600
|
-
tableMeta.hoverState.pause(true);
|
|
15601
|
-
tableMeta.currentRow.setCurrentRowIndex(props.index - 1);
|
|
15602
|
-
setTimeout(() => {
|
|
15603
|
-
focusManager.focusLast(FOCUS_MANAGER_OPTIONS);
|
|
15604
|
-
// Need to update lastIndex when row got changed and last element got selected.
|
|
15605
|
-
lastIndex = getColumnIndex(focusedElement);
|
|
15606
|
-
}, 1);
|
|
15607
|
-
}
|
|
15608
|
-
}
|
|
15859
|
+
// save if editing gets toggled off
|
|
15860
|
+
React__default.useEffect(() => {
|
|
15861
|
+
if (meta.editing.isEnabled) {
|
|
15862
|
+
if (!meta.editing.isEditing) {
|
|
15863
|
+
requestAnimationFrame(() => {
|
|
15864
|
+
meta.editing.saveChangesIfNeeded();
|
|
15865
|
+
});
|
|
15866
|
+
} else if (meta.currentRow.currentRowIndex === undefined) {
|
|
15867
|
+
meta.currentRow.setCurrentRowIndex(0);
|
|
15609
15868
|
}
|
|
15610
15869
|
}
|
|
15870
|
+
}, [meta.editing.isEditing]);
|
|
15871
|
+
}
|
|
15872
|
+
|
|
15873
|
+
function useSearch(isEnabled, excludeUnmatchedResultsInSearch = false, loadAll) {
|
|
15874
|
+
const [isSearching, setIsSearching] = React__default.useState(false);
|
|
15875
|
+
const [query, setQuery] = React__default.useState();
|
|
15876
|
+
const [enableHighlighting, setEnableHighlighting] = React__default.useState(true);
|
|
15877
|
+
const [excludeUnmatchedResults, setExcludeUnmatchedResults] = React__default.useState(excludeUnmatchedResultsInSearch);
|
|
15878
|
+
// highlighting
|
|
15879
|
+
const [highlightedColumnIndexes, setHighlightedColumnIndexes] = React__default.useState([]);
|
|
15880
|
+
const [currentHighlightColumnIndex, setCurrentHighlightColumnIndex] = React__default.useState(undefined);
|
|
15881
|
+
return {
|
|
15882
|
+
isEnabled,
|
|
15883
|
+
isHighlightingEnabled: enableHighlighting,
|
|
15884
|
+
toggleHighlighting: setEnableHighlighting,
|
|
15885
|
+
excludeUnmatchedResults,
|
|
15886
|
+
toggleExcludeUnmatchedResults: setExcludeUnmatchedResults,
|
|
15887
|
+
query,
|
|
15888
|
+
setQuery: isEnabled ? setQuery : () => undefined,
|
|
15889
|
+
highlightedColumnIndexes,
|
|
15890
|
+
setHighlightedColumnIndexes,
|
|
15891
|
+
currentHighlightColumnIndex,
|
|
15892
|
+
setCurrentHighlightColumnIndex,
|
|
15893
|
+
loadAll,
|
|
15894
|
+
isSearching,
|
|
15895
|
+
setIsSearching
|
|
15611
15896
|
};
|
|
15612
|
-
|
|
15613
|
-
|
|
15614
|
-
|
|
15615
|
-
|
|
15616
|
-
|
|
15617
|
-
|
|
15618
|
-
|
|
15619
|
-
|
|
15620
|
-
|
|
15621
|
-
|
|
15622
|
-
|
|
15623
|
-
|
|
15897
|
+
}
|
|
15898
|
+
|
|
15899
|
+
const ACTIONS_ON_ROW_LENGTH = 4;
|
|
15900
|
+
function useRowActions$1(actionsForRow, actionsForRowLength = ACTIONS_ON_ROW_LENGTH) {
|
|
15901
|
+
return {
|
|
15902
|
+
actionsForRow,
|
|
15903
|
+
actionsForRowLength
|
|
15904
|
+
};
|
|
15905
|
+
}
|
|
15906
|
+
|
|
15907
|
+
const useLocalStorage = (key, initialValue) => {
|
|
15908
|
+
const [state, setState] = React__default.useState(() => {
|
|
15909
|
+
if (!key) {
|
|
15910
|
+
return initialValue;
|
|
15911
|
+
}
|
|
15912
|
+
try {
|
|
15913
|
+
const localStorageValue = localStorage.getItem(key);
|
|
15914
|
+
if (typeof localStorageValue !== 'string') {
|
|
15915
|
+
localStorage.setItem(key, JSON.stringify(initialValue));
|
|
15916
|
+
return initialValue;
|
|
15624
15917
|
} else {
|
|
15625
|
-
|
|
15626
|
-
focusedElement = focusManager.focusNext(FOCUS_MANAGER_OPTIONS);
|
|
15627
|
-
if (focusedElement) {
|
|
15628
|
-
lastIndex = getColumnIndex(focusedElement);
|
|
15629
|
-
} else {
|
|
15630
|
-
// there are no next elements to focus, go down a row or go outside the table
|
|
15631
|
-
if (!props.isLastRow) {
|
|
15632
|
-
event.preventDefault();
|
|
15633
|
-
tableMeta.hoverState.pause(true);
|
|
15634
|
-
tableMeta.currentRow.setCurrentRowIndex(props.index + 1);
|
|
15635
|
-
setTimeout(() => {
|
|
15636
|
-
focusManager.focusFirst(FOCUS_MANAGER_OPTIONS);
|
|
15637
|
-
// Need to update lastIndex when row got changed and last element got selected.
|
|
15638
|
-
lastIndex = getColumnIndex(focusedElement);
|
|
15639
|
-
}, 1);
|
|
15640
|
-
}
|
|
15641
|
-
}
|
|
15918
|
+
return JSON.parse(localStorageValue || 'null');
|
|
15642
15919
|
}
|
|
15920
|
+
} catch {
|
|
15921
|
+
// If user is in private mode or has storage restriction
|
|
15922
|
+
// localStorage can throw. JSON.parse and JSON.stringify
|
|
15923
|
+
// can throw, too.
|
|
15924
|
+
return initialValue;
|
|
15643
15925
|
}
|
|
15644
|
-
};
|
|
15926
|
+
});
|
|
15645
15927
|
React__default.useEffect(() => {
|
|
15646
|
-
|
|
15647
|
-
if (tableMeta.hoverState.isPaused) {
|
|
15648
|
-
unhoverPreviousRow(props.tableRef);
|
|
15649
|
-
}
|
|
15650
|
-
}, [tableMeta.hoverState.isPaused]);
|
|
15651
|
-
const handleKeyDown = event => {
|
|
15652
|
-
if (event.isDefaultPrevented() || event.isPropagationStopped() || tableMeta.editing.detailModeEditing) {
|
|
15928
|
+
if (!key) {
|
|
15653
15929
|
return;
|
|
15654
15930
|
}
|
|
15655
|
-
|
|
15656
|
-
|
|
15657
|
-
|
|
15931
|
+
try {
|
|
15932
|
+
const serializedState = JSON.stringify(state);
|
|
15933
|
+
localStorage.setItem(key, serializedState);
|
|
15934
|
+
} catch {
|
|
15935
|
+
// If user is in private mode or has storage restriction
|
|
15936
|
+
// localStorage can throw. Also JSON.stringify can throw.
|
|
15937
|
+
}
|
|
15938
|
+
}, [key, state]);
|
|
15939
|
+
const clear = () => {
|
|
15940
|
+
if (key) {
|
|
15941
|
+
localStorage.removeItem(key);
|
|
15942
|
+
}
|
|
15658
15943
|
};
|
|
15659
|
-
|
|
15660
|
-
|
|
15661
|
-
|
|
15662
|
-
|
|
15663
|
-
|
|
15664
|
-
|
|
15665
|
-
|
|
15666
|
-
|
|
15667
|
-
|
|
15668
|
-
|
|
15944
|
+
return [state, setState, clear];
|
|
15945
|
+
};
|
|
15946
|
+
|
|
15947
|
+
function useTacoSettings() {
|
|
15948
|
+
return React__default.useContext(TacoContext);
|
|
15949
|
+
}
|
|
15950
|
+
|
|
15951
|
+
function useUniqueTableId(tableId) {
|
|
15952
|
+
const tacoSettings = useTacoSettings();
|
|
15953
|
+
return `taco.${tacoSettings.uniqueUserIdentifier}.table3.${tableId}.settings`;
|
|
15954
|
+
}
|
|
15955
|
+
function useSettings(id, defaultSettings = {}, onChangeSettings) {
|
|
15956
|
+
const uniqueId = useUniqueTableId(id);
|
|
15957
|
+
// If the onChangeSettings prop is provided, we intend to handle settings changes externally rather than saving them
|
|
15958
|
+
// to local storage.
|
|
15959
|
+
const [persistedSettings, setPersistedSettings] = useLocalStorage(uniqueId, defaultSettings);
|
|
15960
|
+
useLazyEffect(() => {
|
|
15961
|
+
if (onChangeSettings) {
|
|
15962
|
+
onChangeSettings(persistedSettings);
|
|
15669
15963
|
}
|
|
15670
|
-
|
|
15671
|
-
|
|
15672
|
-
// In this case row will not be re-rendered if user switch to next row, because hovered row also renders EditingRow.
|
|
15673
|
-
}, [tableMeta.currentRow.currentRowIndex]);
|
|
15674
|
-
return /*#__PURE__*/React__default.createElement(MemoedRow, Object.assign({}, attributes, {
|
|
15675
|
-
onClickCapture: handleClickCapture,
|
|
15676
|
-
onKeyDown: handleKeyDown
|
|
15677
|
-
}));
|
|
15964
|
+
}, [persistedSettings]);
|
|
15965
|
+
return [persistedSettings, setPersistedSettings];
|
|
15678
15966
|
}
|
|
15679
|
-
|
|
15680
|
-
|
|
15681
|
-
const {
|
|
15682
|
-
|
|
15683
|
-
|
|
15684
|
-
|
|
15685
|
-
|
|
15686
|
-
|
|
15687
|
-
|
|
15688
|
-
|
|
15689
|
-
|
|
15690
|
-
|
|
15691
|
-
|
|
15692
|
-
|
|
15693
|
-
|
|
15694
|
-
|
|
15695
|
-
|
|
15696
|
-
|
|
15697
|
-
|
|
15698
|
-
|
|
15699
|
-
|
|
15700
|
-
|
|
15701
|
-
|
|
15702
|
-
|
|
15703
|
-
|
|
15967
|
+
|
|
15968
|
+
function useValidation(onCellValidate, onRowValidate) {
|
|
15969
|
+
const [validationState, dispatch] = React__default.useReducer(validationReducer, {
|
|
15970
|
+
errors: null,
|
|
15971
|
+
draftErrors: null
|
|
15972
|
+
});
|
|
15973
|
+
function getCellError(cell) {
|
|
15974
|
+
var _validationState$draf, _validationState$erro;
|
|
15975
|
+
return validationState.draftErrors && ((_validationState$draf = validationState.draftErrors[cell.row.id]) === null || _validationState$draf === void 0 ? void 0 : _validationState$draf[cell.column.id]) || (validationState.errors ? (_validationState$erro = validationState.errors[cell.row.id]) === null || _validationState$erro === void 0 ? void 0 : _validationState$erro[cell.column.id] : undefined);
|
|
15976
|
+
}
|
|
15977
|
+
function setCellError(rowId, cellId, error) {
|
|
15978
|
+
dispatch({
|
|
15979
|
+
type: ValidationActionType.SET_CELL_ERROR,
|
|
15980
|
+
payload: {
|
|
15981
|
+
rowId,
|
|
15982
|
+
cellId,
|
|
15983
|
+
error
|
|
15984
|
+
}
|
|
15985
|
+
});
|
|
15986
|
+
}
|
|
15987
|
+
function setRowErrors(rowId, errors) {
|
|
15988
|
+
dispatch({
|
|
15989
|
+
type: ValidationActionType.SET_ROW_ERROR,
|
|
15990
|
+
payload: {
|
|
15991
|
+
rowId,
|
|
15992
|
+
errors
|
|
15993
|
+
}
|
|
15994
|
+
});
|
|
15995
|
+
}
|
|
15996
|
+
function confirmErrors(rowId) {
|
|
15997
|
+
dispatch({
|
|
15998
|
+
type: ValidationActionType.CONFIRN_ERRORS,
|
|
15999
|
+
payload: {
|
|
16000
|
+
rowId
|
|
16001
|
+
}
|
|
16002
|
+
});
|
|
16003
|
+
}
|
|
16004
|
+
function resetErrors(rowId, cellId) {
|
|
16005
|
+
dispatch({
|
|
16006
|
+
type: ValidationActionType.RESET_ERRORS,
|
|
16007
|
+
payload: {
|
|
16008
|
+
rowId,
|
|
16009
|
+
cellId
|
|
16010
|
+
}
|
|
16011
|
+
});
|
|
16012
|
+
}
|
|
16013
|
+
const setErrors = (errors, rowId, cellId) => {
|
|
16014
|
+
if (cellId) {
|
|
16015
|
+
setCellError(rowId, cellId, errors[cellId]);
|
|
16016
|
+
} else {
|
|
16017
|
+
setRowErrors(rowId, errors);
|
|
15704
16018
|
}
|
|
15705
|
-
}
|
|
15706
|
-
|
|
15707
|
-
|
|
15708
|
-
if (
|
|
15709
|
-
|
|
16019
|
+
};
|
|
16020
|
+
const validate = (rowId, row, cellId) => {
|
|
16021
|
+
let validationPromise;
|
|
16022
|
+
if (cellId && onCellValidate) {
|
|
16023
|
+
validationPromise = onCellValidate(row[cellId], cellId, row);
|
|
16024
|
+
} else if (onRowValidate) {
|
|
16025
|
+
validationPromise = onRowValidate(row);
|
|
16026
|
+
} else {
|
|
16027
|
+
validationPromise = new Promise(resolve => {
|
|
16028
|
+
resolve();
|
|
16029
|
+
});
|
|
15710
16030
|
}
|
|
15711
|
-
|
|
15712
|
-
|
|
16031
|
+
validationPromise.then(() => {
|
|
16032
|
+
// Need to reset previous errors,
|
|
16033
|
+
// since promise resolve is the only place where we consider that previous errors is not relevant anymore.
|
|
16034
|
+
resetErrors(rowId, cellId);
|
|
16035
|
+
}).catch(errors => {
|
|
16036
|
+
setErrors(errors, rowId, cellId);
|
|
16037
|
+
});
|
|
16038
|
+
return validationPromise;
|
|
15713
16039
|
};
|
|
15714
|
-
|
|
15715
|
-
|
|
15716
|
-
|
|
15717
|
-
|
|
15718
|
-
|
|
15719
|
-
|
|
16040
|
+
return {
|
|
16041
|
+
validate,
|
|
16042
|
+
setCellError,
|
|
16043
|
+
setRowErrors,
|
|
16044
|
+
confirmErrors,
|
|
16045
|
+
getCellError,
|
|
16046
|
+
resetErrors,
|
|
16047
|
+
errors: validationState.errors,
|
|
16048
|
+
draftErrors: validationState.draftErrors
|
|
16049
|
+
};
|
|
16050
|
+
}
|
|
16051
|
+
// Taking care of reseting/removing errors for particular cell/row and reseting errors object to null, when no errors at all.
|
|
16052
|
+
function _resetErrors(errors, rowId, columnId) {
|
|
16053
|
+
let currentErrors = errors ? {
|
|
16054
|
+
...errors
|
|
16055
|
+
} : {};
|
|
16056
|
+
if (currentErrors && currentErrors[rowId]) {
|
|
16057
|
+
if (columnId) {
|
|
16058
|
+
delete currentErrors[rowId][columnId];
|
|
16059
|
+
const rowErrorsSet = Object.keys(currentErrors[rowId]);
|
|
16060
|
+
if (rowErrorsSet.length === 0) {
|
|
16061
|
+
delete currentErrors[rowId];
|
|
15720
16062
|
}
|
|
15721
|
-
|
|
16063
|
+
} else {
|
|
16064
|
+
delete currentErrors[rowId];
|
|
16065
|
+
}
|
|
16066
|
+
}
|
|
16067
|
+
const errorsSet = Object.keys(currentErrors);
|
|
16068
|
+
if (errorsSet.length === 0) {
|
|
16069
|
+
currentErrors = null;
|
|
16070
|
+
}
|
|
16071
|
+
return currentErrors;
|
|
16072
|
+
}
|
|
16073
|
+
var ValidationActionType;
|
|
16074
|
+
(function (ValidationActionType) {
|
|
16075
|
+
ValidationActionType[ValidationActionType["SET_CELL_ERROR"] = 0] = "SET_CELL_ERROR";
|
|
16076
|
+
ValidationActionType[ValidationActionType["SET_ROW_ERROR"] = 1] = "SET_ROW_ERROR";
|
|
16077
|
+
ValidationActionType[ValidationActionType["CONFIRN_ERRORS"] = 2] = "CONFIRN_ERRORS";
|
|
16078
|
+
ValidationActionType[ValidationActionType["RESET_ERRORS"] = 3] = "RESET_ERRORS";
|
|
16079
|
+
})(ValidationActionType || (ValidationActionType = {}));
|
|
16080
|
+
function validationReducer(state, action) {
|
|
16081
|
+
var _state$draftErrors, _state$draftErrors2;
|
|
16082
|
+
switch (action.type) {
|
|
16083
|
+
// Saves cell error into draft errors state.
|
|
16084
|
+
case ValidationActionType.SET_CELL_ERROR:
|
|
16085
|
+
return {
|
|
16086
|
+
...state,
|
|
16087
|
+
draftErrors: {
|
|
16088
|
+
...state.draftErrors,
|
|
16089
|
+
[action.payload.rowId]: {
|
|
16090
|
+
...((_state$draftErrors = state.draftErrors) === null || _state$draftErrors === void 0 ? void 0 : _state$draftErrors[action.payload.rowId]),
|
|
16091
|
+
[action.payload.cellId]: action.payload.error
|
|
16092
|
+
}
|
|
16093
|
+
}
|
|
16094
|
+
};
|
|
16095
|
+
// Saves row errors into draft errors state.
|
|
16096
|
+
case ValidationActionType.SET_ROW_ERROR:
|
|
16097
|
+
return {
|
|
16098
|
+
...state,
|
|
16099
|
+
draftErrors: {
|
|
16100
|
+
...state.draftErrors,
|
|
16101
|
+
[action.payload.rowId]: {
|
|
16102
|
+
...((_state$draftErrors2 = state.draftErrors) === null || _state$draftErrors2 === void 0 ? void 0 : _state$draftErrors2[action.payload.rowId]),
|
|
16103
|
+
...action.payload.errors
|
|
16104
|
+
}
|
|
16105
|
+
}
|
|
16106
|
+
};
|
|
16107
|
+
// Promotes errors from draft into confirmed state (When user moves to next/prev row)
|
|
16108
|
+
case ValidationActionType.CONFIRN_ERRORS:
|
|
16109
|
+
{
|
|
16110
|
+
const newDraftErrors = {
|
|
16111
|
+
...state.draftErrors
|
|
16112
|
+
};
|
|
16113
|
+
const confirmedRow = {
|
|
16114
|
+
...newDraftErrors[action.payload.rowId]
|
|
16115
|
+
};
|
|
16116
|
+
delete newDraftErrors[action.payload.rowId];
|
|
16117
|
+
return {
|
|
16118
|
+
draftErrors: newDraftErrors,
|
|
16119
|
+
errors: {
|
|
16120
|
+
...state.errors,
|
|
16121
|
+
[action.payload.rowId]: confirmedRow
|
|
16122
|
+
}
|
|
16123
|
+
};
|
|
16124
|
+
}
|
|
16125
|
+
// Resets all errors for particular row or cell if cell id is passed.
|
|
16126
|
+
// We need to reset both confirmed and draft errors, for the situations,
|
|
16127
|
+
// when user is getting back to the row wich already had error.
|
|
16128
|
+
case ValidationActionType.RESET_ERRORS:
|
|
16129
|
+
{
|
|
16130
|
+
const newDraftErrors = _resetErrors(state.draftErrors, action.payload.rowId, action.payload.cellId);
|
|
16131
|
+
const newErrors = _resetErrors(state.errors, action.payload.rowId, action.payload.cellId);
|
|
16132
|
+
return {
|
|
16133
|
+
errors: newErrors,
|
|
16134
|
+
draftErrors: newDraftErrors
|
|
16135
|
+
};
|
|
16136
|
+
}
|
|
16137
|
+
default:
|
|
16138
|
+
return state;
|
|
16139
|
+
}
|
|
16140
|
+
}
|
|
16141
|
+
|
|
16142
|
+
function usePauseShortcuts() {
|
|
16143
|
+
const [isShortcutsPaused, setIsShortcutsPaused] = React__default.useState(false);
|
|
16144
|
+
return {
|
|
16145
|
+
isPaused: isShortcutsPaused,
|
|
16146
|
+
pause: setIsShortcutsPaused
|
|
16147
|
+
};
|
|
16148
|
+
}
|
|
16149
|
+
|
|
16150
|
+
function useTable$1(props) {
|
|
16151
|
+
var _ref, _defaultSettings$colu, _defaultSettings$rowH, _props$length;
|
|
16152
|
+
// options
|
|
16153
|
+
const options = useTablePreset(props);
|
|
16154
|
+
const tableOptions = {
|
|
16155
|
+
enableColumnFilters: options.enableFiltering,
|
|
16156
|
+
enableColumnResizing: options.enableColumnResizing,
|
|
16157
|
+
enableExpanding: options.enableRowExpansion,
|
|
16158
|
+
enableGlobalFilter: options.enableSearch,
|
|
16159
|
+
enableHiding: options.enableColumnHiding,
|
|
16160
|
+
enableRowSelection: options.enableRowSelection,
|
|
16161
|
+
enableMultiRowSelection: !options.enableRowSelectionSingle,
|
|
16162
|
+
enableSorting: options.enableSorting
|
|
16163
|
+
};
|
|
16164
|
+
// resizing
|
|
16165
|
+
if (tableOptions.enableColumnResizing) {
|
|
16166
|
+
tableOptions.columnResizeMode = 'onChange';
|
|
16167
|
+
}
|
|
16168
|
+
// filtering
|
|
16169
|
+
if (tableOptions.enableColumnFilters) {
|
|
16170
|
+
if (!props.onFilter) {
|
|
16171
|
+
tableOptions.filterFns = {
|
|
16172
|
+
tacoFilter: (row, columnId, filter) => columnFilterFn(row.getValue(columnId), filter)
|
|
16173
|
+
};
|
|
16174
|
+
tableOptions.getFilteredRowModel = reactTable$1.getFilteredRowModel();
|
|
15722
16175
|
}
|
|
15723
|
-
|
|
15724
|
-
|
|
15725
|
-
|
|
15726
|
-
|
|
15727
|
-
//
|
|
15728
|
-
|
|
15729
|
-
|
|
15730
|
-
|
|
15731
|
-
|
|
15732
|
-
|
|
16176
|
+
// we don't tableOptions.manualFiltering = true; because it breaks global filtering, server filtering still works :shrug:
|
|
16177
|
+
}
|
|
16178
|
+
// search
|
|
16179
|
+
if (tableOptions.enableGlobalFilter) {
|
|
16180
|
+
// search is always client side, since we call loadAll when searching
|
|
16181
|
+
tableOptions.globalFilterFn = (row, columnId, searchQuery) => {
|
|
16182
|
+
try {
|
|
16183
|
+
if (row.original) {
|
|
16184
|
+
const cell = row.getAllCells().find(cell => cell.column.id === columnId);
|
|
16185
|
+
const columnMeta = cell === null || cell === void 0 ? void 0 : cell.column.columnDef.meta;
|
|
16186
|
+
if (cell && cell.column.getIsVisible() && columnMeta !== null && columnMeta !== void 0 && columnMeta.enableSearch) {
|
|
16187
|
+
const cellValue = getCellValueAsString(row.original[columnId], columnMeta === null || columnMeta === void 0 ? void 0 : columnMeta.dataType);
|
|
16188
|
+
if (cellValue !== undefined) {
|
|
16189
|
+
return globalFilterFn(cellValue, searchQuery);
|
|
16190
|
+
}
|
|
16191
|
+
}
|
|
16192
|
+
return false;
|
|
16193
|
+
}
|
|
16194
|
+
} catch {
|
|
16195
|
+
//
|
|
15733
16196
|
}
|
|
16197
|
+
return false;
|
|
16198
|
+
};
|
|
16199
|
+
tableOptions.getFilteredRowModel = reactTable$1.getFilteredRowModel();
|
|
16200
|
+
tableOptions.getColumnCanGlobalFilter = column => {
|
|
16201
|
+
var _column$columnDef$met;
|
|
16202
|
+
return (_column$columnDef$met = column.columnDef.meta.enableSearch) !== null && _column$columnDef$met !== void 0 ? _column$columnDef$met : true;
|
|
16203
|
+
};
|
|
16204
|
+
}
|
|
16205
|
+
// sorting
|
|
16206
|
+
if (options.enableSorting) {
|
|
16207
|
+
if (props.onSort) {
|
|
16208
|
+
tableOptions.manualSorting = true;
|
|
16209
|
+
// onSort is called as a listener to let the consumer update their data, so we don't use onSortingChange
|
|
15734
16210
|
} else {
|
|
15735
|
-
|
|
16211
|
+
tableOptions.getSortedRowModel = reactTable$1.getSortedRowModel();
|
|
15736
16212
|
}
|
|
15737
|
-
|
|
15738
|
-
|
|
15739
|
-
|
|
15740
|
-
|
|
15741
|
-
|
|
16213
|
+
}
|
|
16214
|
+
const [defaultSettings, setSettings] = useSettings(props.id, props.defaultSettings, props.onChangeSettings);
|
|
16215
|
+
// custom features
|
|
16216
|
+
const columnFreezing = useColumnFreezing( // temporarily see if deprecated frozenColumnCount is there
|
|
16217
|
+
(_ref = (_defaultSettings$colu = defaultSettings.columnFreezingIndex) !== null && _defaultSettings$colu !== void 0 ? _defaultSettings$colu : defaultSettings === null || defaultSettings === void 0 ? void 0 : defaultSettings.frozenColumnCount) !== null && _ref !== void 0 ? _ref : props.defaultColumnFreezingIndex, options);
|
|
16218
|
+
const columnOrdering = useColumnOrdering(options);
|
|
16219
|
+
const currentRow = useCurrentRow(props.defaultCurrentRowIndex);
|
|
16220
|
+
const validation = useValidation(props.onCellValidate, props.onRowValidate);
|
|
16221
|
+
const editing = useEditing(options.enableEditing, validation, props.onSave);
|
|
16222
|
+
const fontSize = useFontSize(options.enableFontSize, defaultSettings.fontSize);
|
|
16223
|
+
const hoverState = usePauseHoverState();
|
|
16224
|
+
const printing = usePrinting(options.enablePrinting, props.loadAll, defaultSettings.showWarningWhenPrintingLargeDataset);
|
|
16225
|
+
const rowActions = useRowActions$1(props.actionsForRow, props.actionsForRowLength);
|
|
16226
|
+
const rowClick = useRowClick(props.onRowClick);
|
|
16227
|
+
const rowDrag = useRowDrag(options.enableRowDrag);
|
|
16228
|
+
const rowDrop = useRowDrop(options.enableRowDrop, props.onRowDrop);
|
|
16229
|
+
const rowGoto = useRowGoto(options.enableRowGoto, props.onRowGoto);
|
|
16230
|
+
const rowHeight = useRowHeight(options.enableRowHeight, // temporarily see if deprecated rowDensity is there
|
|
16231
|
+
(_defaultSettings$rowH = defaultSettings.rowHeight) !== null && _defaultSettings$rowH !== void 0 ? _defaultSettings$rowH : defaultSettings === null || defaultSettings === void 0 ? void 0 : defaultSettings.rowDensity);
|
|
16232
|
+
const rowSelection = useRowSelection();
|
|
16233
|
+
const search = useSearch(options.enableSearch, defaultSettings.excludeUnmatchedRecordsInSearch, props.loadAll);
|
|
16234
|
+
const shortcutsState = usePauseShortcuts();
|
|
16235
|
+
// columns
|
|
16236
|
+
const {
|
|
16237
|
+
columns,
|
|
16238
|
+
defaultColumnSizing,
|
|
16239
|
+
defaultColumnVisibility,
|
|
16240
|
+
defaultSorting
|
|
16241
|
+
} = useConvertChildrenToColumns(props, options, editing);
|
|
16242
|
+
// built-in features
|
|
16243
|
+
const initialState = React__default.useMemo(() => {
|
|
16244
|
+
var _defaultSettings$colu2, _defaultSettings$colu3, _props$defaultSetting, _props$defaultSetting3;
|
|
16245
|
+
const sanitizeSortedColumns = column => columns.find(definedColumn => definedColumn.id === column.id);
|
|
16246
|
+
const state = {
|
|
16247
|
+
columnOrder: ensureOrdering(columns, defaultSettings.columnOrder),
|
|
16248
|
+
columnSizing: (_defaultSettings$colu2 = defaultSettings.columnSizing) !== null && _defaultSettings$colu2 !== void 0 ? _defaultSettings$colu2 : defaultColumnSizing,
|
|
16249
|
+
columnVisibility: (_defaultSettings$colu3 = defaultSettings.columnVisibility) !== null && _defaultSettings$colu3 !== void 0 ? _defaultSettings$colu3 : defaultColumnVisibility,
|
|
16250
|
+
sorting: defaultSettings.sorting ? defaultSettings.sorting.filter(sanitizeSortedColumns) : defaultSorting
|
|
16251
|
+
};
|
|
16252
|
+
// we don't save these outside the table, but they need to be here for print to inherit them - see PrintButton.tsx
|
|
16253
|
+
if ((_props$defaultSetting = props.defaultSettings) !== null && _props$defaultSetting !== void 0 && _props$defaultSetting.columnFilters) {
|
|
16254
|
+
var _props$defaultSetting2;
|
|
16255
|
+
state.columnFilters = (_props$defaultSetting2 = props.defaultSettings) === null || _props$defaultSetting2 === void 0 ? void 0 : _props$defaultSetting2.columnFilters;
|
|
15742
16256
|
}
|
|
15743
|
-
|
|
16257
|
+
if ((_props$defaultSetting3 = props.defaultSettings) !== null && _props$defaultSetting3 !== void 0 && _props$defaultSetting3.globalFilter) {
|
|
16258
|
+
var _props$defaultSetting4;
|
|
16259
|
+
state.globalFilter = (_props$defaultSetting4 = props.defaultSettings) === null || _props$defaultSetting4 === void 0 ? void 0 : _props$defaultSetting4.globalFilter;
|
|
16260
|
+
}
|
|
16261
|
+
return state;
|
|
16262
|
+
}, []);
|
|
16263
|
+
const getSettings = () => {
|
|
16264
|
+
const state = table.getState();
|
|
16265
|
+
return {
|
|
16266
|
+
columnFreezingIndex: columnFreezing.frozenColumnIndex,
|
|
16267
|
+
columnOrder: columnOrdering.isEnabled ? state.columnOrder : undefined,
|
|
16268
|
+
columnSizing: table.options.enableColumnResizing ? state.columnSizing : undefined,
|
|
16269
|
+
columnVisibility: table.options.enableHiding ? state.columnVisibility : undefined,
|
|
16270
|
+
excludeUnmatchedRecordsInSearch: search.excludeUnmatchedResults,
|
|
16271
|
+
fontSize: fontSize.isEnabled ? fontSize.size : undefined,
|
|
16272
|
+
rowHeight: rowHeight.isEnabled ? rowHeight.height : undefined,
|
|
16273
|
+
showWarningWhenPrintingLargeDataset: printing.printWarningDialogVisibility,
|
|
16274
|
+
sorting: state.sorting
|
|
16275
|
+
};
|
|
15744
16276
|
};
|
|
15745
|
-
const
|
|
15746
|
-
|
|
15747
|
-
|
|
15748
|
-
|
|
15749
|
-
|
|
15750
|
-
|
|
16277
|
+
const table = reactTable$1.useReactTable({
|
|
16278
|
+
data: props.data,
|
|
16279
|
+
columns,
|
|
16280
|
+
getCoreRowModel: reactTable$1.getCoreRowModel(),
|
|
16281
|
+
initialState,
|
|
16282
|
+
...tableOptions,
|
|
16283
|
+
//debugAll: true,
|
|
16284
|
+
meta: {
|
|
16285
|
+
columnFreezing,
|
|
16286
|
+
columnOrdering,
|
|
16287
|
+
currentRow,
|
|
16288
|
+
editing,
|
|
16289
|
+
enableFooter: options.enableFooter,
|
|
16290
|
+
fontSize,
|
|
16291
|
+
getSettings,
|
|
16292
|
+
hoverState,
|
|
16293
|
+
isPrinting: props.id.endsWith('_print'),
|
|
16294
|
+
isUsingServer: !!props.loadPage,
|
|
16295
|
+
printing,
|
|
16296
|
+
rowActions: rowActions,
|
|
16297
|
+
rowClick: rowClick,
|
|
16298
|
+
rowDrag,
|
|
16299
|
+
rowDrop,
|
|
16300
|
+
rowGoto,
|
|
16301
|
+
rowHeight,
|
|
16302
|
+
rowSelection,
|
|
16303
|
+
search,
|
|
16304
|
+
shortcutsState,
|
|
16305
|
+
validation
|
|
16306
|
+
}
|
|
15751
16307
|
});
|
|
15752
|
-
|
|
15753
|
-
|
|
15754
|
-
|
|
15755
|
-
|
|
15756
|
-
|
|
15757
|
-
|
|
15758
|
-
|
|
15759
|
-
|
|
15760
|
-
|
|
15761
|
-
|
|
15762
|
-
|
|
15763
|
-
|
|
16308
|
+
// listeners
|
|
16309
|
+
useCurrentRowListener(table);
|
|
16310
|
+
useEditingStateListener(table);
|
|
16311
|
+
useFilteringStateListener(table, props.onFilter);
|
|
16312
|
+
useRowSelectionListener(table, props.onRowSelect);
|
|
16313
|
+
useSettingsStateListener(table, setSettings);
|
|
16314
|
+
useShortcutsListener(table, props.shortcuts);
|
|
16315
|
+
useServerLoadingListener(table, props.loadPage);
|
|
16316
|
+
useSortingStateListener(table, props.onSort);
|
|
16317
|
+
return {
|
|
16318
|
+
table,
|
|
16319
|
+
length: (_props$length = props.length) !== null && _props$length !== void 0 ? _props$length : props.data.length
|
|
16320
|
+
};
|
|
16321
|
+
}
|
|
15764
16322
|
|
|
15765
16323
|
const ExpandedRow = /*#__PURE__*/React__default.memo(function ExpandedRow(props) {
|
|
15766
16324
|
var _renderer;
|
|
@@ -15970,6 +16528,7 @@ function Search$2(props) {
|
|
|
15970
16528
|
const tableMeta = table.options.meta;
|
|
15971
16529
|
const [query, setQuery] = React__default.useState(tableMeta.search.query);
|
|
15972
16530
|
const [loading, setLoading] = React__default.useState(LoadingState.Incomplete);
|
|
16531
|
+
const [rowIdToNavigate, setRowIdToNavigate] = React__default.useState(null);
|
|
15973
16532
|
const scrollTo = rowIndex => scrollToIndex(rowIndex, {
|
|
15974
16533
|
align: 'center'
|
|
15975
16534
|
});
|
|
@@ -15981,6 +16540,12 @@ function Search$2(props) {
|
|
|
15981
16540
|
scrollTo(firstRowIndex);
|
|
15982
16541
|
}
|
|
15983
16542
|
}, [tableMeta.search.query, tableMeta.search.excludeUnmatchedResults, table.getRowModel().rows.length, JSON.stringify(table.getState().sorting), JSON.stringify(table.getState().columnVisibility), loading]);
|
|
16543
|
+
// Reseting internal search state if search.query is changed from the outside.
|
|
16544
|
+
React__default.useEffect(() => {
|
|
16545
|
+
if (tableMeta.search.query !== query) {
|
|
16546
|
+
setQuery(tableMeta.search.query);
|
|
16547
|
+
}
|
|
16548
|
+
}, [tableMeta.search.query]);
|
|
15984
16549
|
// update the table search and filtering on a debounce
|
|
15985
16550
|
useDebouncedEffect(() => {
|
|
15986
16551
|
tableMeta.search.setQuery(query);
|
|
@@ -15994,6 +16559,9 @@ function Search$2(props) {
|
|
|
15994
16559
|
}, [query]);
|
|
15995
16560
|
const handleFocus = function () {
|
|
15996
16561
|
try {
|
|
16562
|
+
// While Search input is focused, we'll switch into searching mode
|
|
16563
|
+
tableMeta.search.setIsSearching(true);
|
|
16564
|
+
// load all data if that is possible
|
|
15997
16565
|
const _temp = function () {
|
|
15998
16566
|
if (tableMeta.search.loadAll && loading === LoadingState.Incomplete) {
|
|
15999
16567
|
setLoading(LoadingState.Loading);
|
|
@@ -16003,15 +16571,48 @@ function Search$2(props) {
|
|
|
16003
16571
|
});
|
|
16004
16572
|
}
|
|
16005
16573
|
}();
|
|
16006
|
-
// load all data if that is possible
|
|
16007
16574
|
return Promise.resolve(_temp && _temp.then ? _temp.then(function () {}) : void 0);
|
|
16008
16575
|
} catch (e) {
|
|
16009
16576
|
return Promise.reject(e);
|
|
16010
16577
|
}
|
|
16011
16578
|
};
|
|
16579
|
+
const handleBlur = () => {
|
|
16580
|
+
// As soon as search input loose a focus, we'll turn of searching mode.
|
|
16581
|
+
tableMeta.search.setIsSearching(false);
|
|
16582
|
+
};
|
|
16012
16583
|
const handleChange = query => {
|
|
16013
16584
|
setQuery(String(query !== null && query !== void 0 ? query : ''));
|
|
16014
16585
|
};
|
|
16586
|
+
const handleClear = () => {
|
|
16587
|
+
var _rows$rowIndex;
|
|
16588
|
+
const [rowIndex, cellIndex] = tableMeta.search.highlightedColumnIndexes[tableMeta.search.currentHighlightColumnIndex || 0];
|
|
16589
|
+
const rows = table.getRowModel().rows;
|
|
16590
|
+
const rowId = ((_rows$rowIndex = rows[rowIndex]) === null || _rows$rowIndex === void 0 ? void 0 : _rows$rowIndex.id) || null;
|
|
16591
|
+
tableMeta.search.setQuery('');
|
|
16592
|
+
// Need to save row id and cell index, to be able to find the row in the table with updated indexes, after global filter will be reset.
|
|
16593
|
+
lastCellIndex.value = String(cellIndex);
|
|
16594
|
+
setRowIdToNavigate(rowId);
|
|
16595
|
+
};
|
|
16596
|
+
const handleKeyDown = event => {
|
|
16597
|
+
if (event.key === 'Escape') {
|
|
16598
|
+
handleClear();
|
|
16599
|
+
event.preventDefault();
|
|
16600
|
+
}
|
|
16601
|
+
};
|
|
16602
|
+
const {
|
|
16603
|
+
globalFilter
|
|
16604
|
+
} = table.getState();
|
|
16605
|
+
React__default.useEffect(() => {
|
|
16606
|
+
// need to wait when table global filter will be reset and rows will be re-rendered
|
|
16607
|
+
if (rowIdToNavigate !== null && !globalFilter) {
|
|
16608
|
+
const rows = table.getRowModel().rows;
|
|
16609
|
+
const rowIndex = rows.findIndex(row => row.id === rowIdToNavigate);
|
|
16610
|
+
tableMeta.search.setIsSearching(false);
|
|
16611
|
+
tableMeta.currentRow.setCurrentRowIndex(rowIndex);
|
|
16612
|
+
scrollTo(rowIndex);
|
|
16613
|
+
setRowIdToNavigate(null);
|
|
16614
|
+
}
|
|
16615
|
+
}, [rowIdToNavigate, globalFilter]);
|
|
16015
16616
|
const handleToggleExcludeUnmatchedResults = enabled => {
|
|
16016
16617
|
tableMeta.search.toggleExcludeUnmatchedResults(enabled);
|
|
16017
16618
|
if (enabled) {
|
|
@@ -16061,6 +16662,9 @@ function Search$2(props) {
|
|
|
16061
16662
|
onClickFindNext: handleNextResult,
|
|
16062
16663
|
onChange: handleChange,
|
|
16063
16664
|
onFocus: handleFocus,
|
|
16665
|
+
onBlur: handleBlur,
|
|
16666
|
+
onKeyDown: handleKeyDown,
|
|
16667
|
+
onClear: handleClear,
|
|
16064
16668
|
placeholder: texts.table3.search.placeholder,
|
|
16065
16669
|
settingsContent: settings,
|
|
16066
16670
|
ref: ref,
|
|
@@ -16513,7 +17117,7 @@ function FiltersButton(props) {
|
|
|
16513
17117
|
(_ref$current = ref.current) === null || _ref$current === void 0 ? void 0 : _ref$current.click();
|
|
16514
17118
|
});
|
|
16515
17119
|
// state, since we "apply" filters
|
|
16516
|
-
const [filters, setFilters] = React__default.useState(
|
|
17120
|
+
const [filters, setFilters] = React__default.useState(appliedFilters);
|
|
16517
17121
|
const [placeholderCount, setPlaceholderCount] = React__default.useState(1);
|
|
16518
17122
|
// filters
|
|
16519
17123
|
const handleChangeFilter = (currentId, filter) => {
|
|
@@ -16570,6 +17174,13 @@ function FiltersButton(props) {
|
|
|
16570
17174
|
setFilters([]);
|
|
16571
17175
|
setPlaceholderCount(1);
|
|
16572
17176
|
};
|
|
17177
|
+
// Because filters can be reset from outside
|
|
17178
|
+
React__default.useEffect(() => {
|
|
17179
|
+
if (appliedFilters.length === 0) {
|
|
17180
|
+
setFilters([]);
|
|
17181
|
+
setPlaceholderCount(1);
|
|
17182
|
+
}
|
|
17183
|
+
}, [appliedFilters]);
|
|
16573
17184
|
const buttonProps = {
|
|
16574
17185
|
'aria-label': texts.table3.filters.tooltip,
|
|
16575
17186
|
className: cn({
|
|
@@ -16683,7 +17294,8 @@ const PRINT_STYLES = `
|
|
|
16683
17294
|
overflow-y: hidden !important;
|
|
16684
17295
|
}
|
|
16685
17296
|
|
|
16686
|
-
|
|
17297
|
+
// all column headers except column group column header
|
|
17298
|
+
[role="table"] [role="columnheader"]:not([data-taco='table3-column-group']) {
|
|
16687
17299
|
border-bottom-width: 1px !important;
|
|
16688
17300
|
}
|
|
16689
17301
|
|
|
@@ -17402,10 +18014,10 @@ function SettingsButton(props) {
|
|
|
17402
18014
|
icon: "sliders",
|
|
17403
18015
|
menu: popoverElement ? undefined : menuProps => /*#__PURE__*/React__default.createElement(Menu$1, Object.assign({}, menuProps), /*#__PURE__*/React__default.createElement(Menu$1.Content, {
|
|
17404
18016
|
align: "end"
|
|
17405
|
-
}, table.options.enableHiding || tableMeta.columnOrdering.isEnabled ? /*#__PURE__*/React__default.createElement(
|
|
18017
|
+
}, table.options.enableHiding || tableMeta.columnOrdering.isEnabled ? /*#__PURE__*/React__default.createElement(Menu$1.Item, {
|
|
17406
18018
|
icon: "columns",
|
|
17407
18019
|
onClick: () => setPopover('columnSettings')
|
|
17408
|
-
}, texts.table3.columnSettings.button), /*#__PURE__*/React__default.createElement(Menu$1.Separator, null)
|
|
18020
|
+
}, texts.table3.columnSettings.button) : null, tableMeta.rowHeight.isEnabled || tableMeta.fontSize.isEnabled ? /*#__PURE__*/React__default.createElement(Menu$1.Separator, null) : null, tableMeta.rowHeight.isEnabled ? /*#__PURE__*/React__default.createElement(Menu$1.Item, {
|
|
17409
18021
|
icon: `height-${tableMeta.rowHeight.height}`,
|
|
17410
18022
|
subMenu: () => /*#__PURE__*/React__default.createElement(RowHeight, {
|
|
17411
18023
|
table: table
|
|
@@ -17465,7 +18077,7 @@ function isSettingsVisible(props) {
|
|
|
17465
18077
|
table
|
|
17466
18078
|
} = props;
|
|
17467
18079
|
const tableMeta = table.options.meta;
|
|
17468
|
-
return tableMeta.fontSize.isEnabled || tableMeta.rowHeight.isEnabled;
|
|
18080
|
+
return tableMeta.fontSize.isEnabled || tableMeta.rowHeight.isEnabled || tableMeta.columnOrdering.isEnabled;
|
|
17469
18081
|
}
|
|
17470
18082
|
function isToolbarVisible(props) {
|
|
17471
18083
|
const {
|
|
@@ -17621,6 +18233,149 @@ function useHeaderOffsetStyle(tableId, table) {
|
|
|
17621
18233
|
return style;
|
|
17622
18234
|
}
|
|
17623
18235
|
|
|
18236
|
+
function ErrorAlert(props) {
|
|
18237
|
+
var _column$columnDef$met;
|
|
18238
|
+
const {
|
|
18239
|
+
table,
|
|
18240
|
+
tableRef,
|
|
18241
|
+
scrollToIndex,
|
|
18242
|
+
rowIdentifier
|
|
18243
|
+
} = props;
|
|
18244
|
+
const tableMeta = table.options.meta;
|
|
18245
|
+
const errors = tableMeta.validation.errors;
|
|
18246
|
+
const errorsRowIds = errors ? Object.keys(errors) : [];
|
|
18247
|
+
const rows = table.getRowModel().rows;
|
|
18248
|
+
const coreRows = table.getCoreRowModel().rows;
|
|
18249
|
+
const {
|
|
18250
|
+
texts
|
|
18251
|
+
} = useLocalization();
|
|
18252
|
+
const [resetFiltersConfirmationOpen, setResetFiltersConfirmationOpen] = React__default.useState(false);
|
|
18253
|
+
const [internalRowId, setInternalRowId] = React__default.useState(null);
|
|
18254
|
+
const [internalRowIndex, setInternalRowIndex] = React__default.useState(null);
|
|
18255
|
+
const [isFiltersReset, setIsFiltersReset] = React__default.useState(false);
|
|
18256
|
+
const columns = table.getAllFlatColumns();
|
|
18257
|
+
const column = columns.find(column => column.id === rowIdentifier);
|
|
18258
|
+
const rowIdentifierHeader = column === null || column === void 0 ? void 0 : (_column$columnDef$met = column.columnDef.meta) === null || _column$columnDef$met === void 0 ? void 0 : _column$columnDef$met.header;
|
|
18259
|
+
// Find and focus first invalid cell
|
|
18260
|
+
const navigateToFirstInvalidCell = () => {
|
|
18261
|
+
var _tableRef$current;
|
|
18262
|
+
const firstInvalidCell = (_tableRef$current = tableRef.current) === null || _tableRef$current === void 0 ? void 0 : _tableRef$current.querySelector('[role="row"][data-current="true"] [role="cell"][data-invalid="true"]');
|
|
18263
|
+
const firstInvalidElement = firstInvalidCell === null || firstInvalidCell === void 0 ? void 0 : firstInvalidCell.querySelector(focusableSelector);
|
|
18264
|
+
if (firstInvalidElement) {
|
|
18265
|
+
firstInvalidElement === null || firstInvalidElement === void 0 ? void 0 : firstInvalidElement.focus();
|
|
18266
|
+
lastCellIndex.value = firstInvalidCell === null || firstInvalidCell === void 0 ? void 0 : firstInvalidCell.getAttribute('data-column-index');
|
|
18267
|
+
}
|
|
18268
|
+
};
|
|
18269
|
+
// Navigate to row and focus first invalid cell
|
|
18270
|
+
const navigateToRow = rowIndex => {
|
|
18271
|
+
tableMeta.currentRow.setCurrentRowIndex(rowIndex);
|
|
18272
|
+
scrollToIndex(rowIndex, {
|
|
18273
|
+
align: 'center'
|
|
18274
|
+
});
|
|
18275
|
+
lastCellIndex.value = undefined;
|
|
18276
|
+
// Need to request animation frame here, because newly selected row is not rendered yet.
|
|
18277
|
+
requestAnimationFrame(() => {
|
|
18278
|
+
navigateToFirstInvalidCell();
|
|
18279
|
+
});
|
|
18280
|
+
};
|
|
18281
|
+
// When internal row index is changed after click on row link, we should navigate to the row.
|
|
18282
|
+
React__default.useEffect(() => {
|
|
18283
|
+
if (internalRowIndex !== null && internalRowIndex >= 0) {
|
|
18284
|
+
navigateToRow(internalRowIndex);
|
|
18285
|
+
}
|
|
18286
|
+
}, [internalRowIndex]);
|
|
18287
|
+
// When filters are reset, we're able to get the real row index by rowId
|
|
18288
|
+
React__default.useEffect(() => {
|
|
18289
|
+
if (isFiltersReset) {
|
|
18290
|
+
const rowIndex = rows.findIndex(row => row.id === internalRowId);
|
|
18291
|
+
if (rowIndex === -1) {
|
|
18292
|
+
return;
|
|
18293
|
+
}
|
|
18294
|
+
setInternalRowIndex(rowIndex);
|
|
18295
|
+
}
|
|
18296
|
+
}, [isFiltersReset]);
|
|
18297
|
+
const onRowNumberClick = React__default.useCallback(rowId => {
|
|
18298
|
+
// When row is hidden due filtering it will not be present in rows (but it still will be present in coreRows)
|
|
18299
|
+
const foundIndex = rows.findIndex(row => row.id === rowId);
|
|
18300
|
+
if (foundIndex === -1) {
|
|
18301
|
+
setIsFiltersReset(false);
|
|
18302
|
+
setResetFiltersConfirmationOpen(true);
|
|
18303
|
+
// Since row indexes changed due filtering, we need to save row id, so that we can find it when filters will be reset
|
|
18304
|
+
setInternalRowId(rowId);
|
|
18305
|
+
return;
|
|
18306
|
+
}
|
|
18307
|
+
// In cases when user clicked on a row link multiple times we still need to navigate to the row, and focus the cell,
|
|
18308
|
+
// because row/cell will loose focus on next click, but row index will not change.
|
|
18309
|
+
if (foundIndex === internalRowIndex) {
|
|
18310
|
+
navigateToRow(foundIndex);
|
|
18311
|
+
} else {
|
|
18312
|
+
setInternalRowIndex(foundIndex);
|
|
18313
|
+
}
|
|
18314
|
+
}, [rows, internalRowIndex]);
|
|
18315
|
+
const onResetFiltersConfirm = () => {
|
|
18316
|
+
setIsFiltersReset(true);
|
|
18317
|
+
};
|
|
18318
|
+
// Getting the row from core rows (ignoring search and filtering)
|
|
18319
|
+
const getCoreRow = React__default.useCallback(rowId => coreRows.find(coreRow => coreRow.id === rowId), [coreRows]);
|
|
18320
|
+
return /*#__PURE__*/React__default.createElement("div", {
|
|
18321
|
+
className: "mb-4"
|
|
18322
|
+
}, errorsRowIds.length ? /*#__PURE__*/React__default.createElement(Alert, {
|
|
18323
|
+
state: "error",
|
|
18324
|
+
className: "mb-1"
|
|
18325
|
+
}, /*#__PURE__*/React__default.createElement(React__default.Fragment, null, /*#__PURE__*/React__default.createElement("b", null, errorsRowIds.length, " ", texts.table3.validation.alert.unsavedEntries(errorsRowIds.length)), ' '), rowIdentifierHeader || texts.table3.validation.index, ' ', errorsRowIds.map((rowId, index) => {
|
|
18326
|
+
const coreRow = getCoreRow(rowId);
|
|
18327
|
+
return /*#__PURE__*/React__default.createElement(React__default.Fragment, null, /*#__PURE__*/React__default.createElement(Button$1, {
|
|
18328
|
+
key: rowId,
|
|
18329
|
+
className: "!min-h-[theme(spacing.2)] !min-w-[theme(spacing.2)] !px-1",
|
|
18330
|
+
appearance: "discrete",
|
|
18331
|
+
onClick: () => {
|
|
18332
|
+
onRowNumberClick(rowId);
|
|
18333
|
+
}
|
|
18334
|
+
}, rowIdentifier ? coreRow === null || coreRow === void 0 ? void 0 : coreRow.original[rowIdentifier] : coreRow === null || coreRow === void 0 ? void 0 : coreRow.index), /*#__PURE__*/React__default.createElement("span", {
|
|
18335
|
+
key: `${rowId}_comma`
|
|
18336
|
+
}, index < errorsRowIds.length - 1 ? ',' : ''));
|
|
18337
|
+
}), texts.table3.validation.alert.incompleteAndHavntBeenSaved(errorsRowIds.length)) : null, /*#__PURE__*/React__default.createElement(FilterResetDialog, {
|
|
18338
|
+
open: resetFiltersConfirmationOpen,
|
|
18339
|
+
onClose: () => {
|
|
18340
|
+
setResetFiltersConfirmationOpen(false);
|
|
18341
|
+
},
|
|
18342
|
+
onConfirm: onResetFiltersConfirm,
|
|
18343
|
+
table: table
|
|
18344
|
+
}));
|
|
18345
|
+
}
|
|
18346
|
+
function FilterResetDialog(props) {
|
|
18347
|
+
const {
|
|
18348
|
+
open,
|
|
18349
|
+
onClose,
|
|
18350
|
+
onConfirm,
|
|
18351
|
+
table
|
|
18352
|
+
} = props;
|
|
18353
|
+
const tableMeta = table.options.meta;
|
|
18354
|
+
const {
|
|
18355
|
+
texts
|
|
18356
|
+
} = useLocalization();
|
|
18357
|
+
const resetFilters = React__default.useCallback(() => {
|
|
18358
|
+
tableMeta.search.setQuery('');
|
|
18359
|
+
table.resetGlobalFilter();
|
|
18360
|
+
table.resetColumnFilters();
|
|
18361
|
+
}, [table, tableMeta.search]);
|
|
18362
|
+
const handleConfirmClick = () => {
|
|
18363
|
+
resetFilters();
|
|
18364
|
+
onConfirm();
|
|
18365
|
+
onClose();
|
|
18366
|
+
};
|
|
18367
|
+
return /*#__PURE__*/React__default.createElement(Dialog, {
|
|
18368
|
+
open: open,
|
|
18369
|
+
onClose: onClose,
|
|
18370
|
+
size: "xs"
|
|
18371
|
+
}, /*#__PURE__*/React__default.createElement(Dialog.Content, {
|
|
18372
|
+
"aria-label": "Create a new account"
|
|
18373
|
+
}, /*#__PURE__*/React__default.createElement(Dialog.Title, null, texts.table3.validation.resetFiltersDialog.title), /*#__PURE__*/React__default.createElement("p", null, texts.table3.validation.resetFiltersDialog.description), /*#__PURE__*/React__default.createElement(Dialog.Footer, null, /*#__PURE__*/React__default.createElement(Group, null, /*#__PURE__*/React__default.createElement(Dialog.Close, null, /*#__PURE__*/React__default.createElement(Button$1, null, texts.table3.validation.resetFiltersDialog.cancel)), /*#__PURE__*/React__default.createElement(Button$1, {
|
|
18374
|
+
appearance: "primary",
|
|
18375
|
+
onClick: handleConfirmClick
|
|
18376
|
+
}, texts.table3.validation.resetFiltersDialog.confirm)))));
|
|
18377
|
+
}
|
|
18378
|
+
|
|
17624
18379
|
function useTable3DataLoader(fetch, fetchAll, options = {
|
|
17625
18380
|
pageSize: 100
|
|
17626
18381
|
}) {
|
|
@@ -17761,7 +18516,8 @@ const Table$1 = /*#__PURE__*/fixedForwardRef(function Table3(props, ref) {
|
|
|
17761
18516
|
emptyState: EmptyState,
|
|
17762
18517
|
customSettings,
|
|
17763
18518
|
toolbarLeft,
|
|
17764
|
-
toolbarRight
|
|
18519
|
+
toolbarRight,
|
|
18520
|
+
defaultCurrentRowIndex
|
|
17765
18521
|
} = props;
|
|
17766
18522
|
const internalRef = useMergedRef(ref);
|
|
17767
18523
|
const {
|
|
@@ -17782,6 +18538,20 @@ const Table$1 = /*#__PURE__*/fixedForwardRef(function Table3(props, ref) {
|
|
|
17782
18538
|
const tableMeta = table.options.meta;
|
|
17783
18539
|
const state = table.getState();
|
|
17784
18540
|
const bodyRef = React__default.useRef(null);
|
|
18541
|
+
React__default.useEffect(() => {
|
|
18542
|
+
// On a very first render, the tanstack table rendered without any rows,
|
|
18543
|
+
// so we delaying default row scrolling logic with using of requestAnimation frame
|
|
18544
|
+
const animationFrameId = requestAnimationFrame(() => {
|
|
18545
|
+
if (defaultCurrentRowIndex) {
|
|
18546
|
+
scrollToIndex(defaultCurrentRowIndex, {
|
|
18547
|
+
align: 'center'
|
|
18548
|
+
});
|
|
18549
|
+
}
|
|
18550
|
+
});
|
|
18551
|
+
return () => {
|
|
18552
|
+
cancelAnimationFrame(animationFrameId);
|
|
18553
|
+
};
|
|
18554
|
+
}, []);
|
|
17785
18555
|
React__default.useEffect(() => {
|
|
17786
18556
|
const handleKeyDown = event => {
|
|
17787
18557
|
const target = event.target;
|
|
@@ -17789,7 +18559,7 @@ const Table$1 = /*#__PURE__*/fixedForwardRef(function Table3(props, ref) {
|
|
|
17789
18559
|
const eventOriginatedFromCombobox = !!target.closest('[role="combobox"]');
|
|
17790
18560
|
// Don't trigger global shortcuts on the table if event originated from a combobox or if table is
|
|
17791
18561
|
// outside the dialog
|
|
17792
|
-
if (eventOriginatedFromCombobox || dialog && !(dialog !== null && dialog !== void 0 && dialog.contains(internalRef.current))) {
|
|
18562
|
+
if (eventOriginatedFromCombobox || dialog && !(dialog !== null && dialog !== void 0 && dialog.contains(internalRef.current)) || tableMeta.shortcutsState.isPaused) {
|
|
17793
18563
|
return;
|
|
17794
18564
|
}
|
|
17795
18565
|
tableMeta.hoverState.handleKeyDown(event);
|
|
@@ -17848,9 +18618,10 @@ const Table$1 = /*#__PURE__*/fixedForwardRef(function Table3(props, ref) {
|
|
|
17848
18618
|
const columnFreezingStyle = useColumnFreezingStyle(props.id, table);
|
|
17849
18619
|
const headerOffsetStyle = useHeaderOffsetStyle(props.id, table);
|
|
17850
18620
|
const isServerLoadingAndNotReady = tableMeta.isUsingServer && props.length === undefined;
|
|
18621
|
+
const isPrinting = tableMeta.isPrinting;
|
|
17851
18622
|
return /*#__PURE__*/React__default.createElement(React__default.Fragment, null, columnFreezingStyle ? /*#__PURE__*/React__default.createElement("style", {
|
|
17852
18623
|
"data-taco": "table3-column-freezing-styles"
|
|
17853
|
-
}, columnFreezingStyle) : null, headerOffsetStyle ? /*#__PURE__*/React__default.createElement("style", {
|
|
18624
|
+
}, columnFreezingStyle) : null, headerOffsetStyle && !isPrinting ? /*#__PURE__*/React__default.createElement("style", {
|
|
17854
18625
|
"data-taco": "table3-column-header-offset-styles"
|
|
17855
18626
|
}, headerOffsetStyle) : null, /*#__PURE__*/React__default.createElement(Toolbar, {
|
|
17856
18627
|
table: table,
|
|
@@ -17860,6 +18631,11 @@ const Table$1 = /*#__PURE__*/fixedForwardRef(function Table3(props, ref) {
|
|
|
17860
18631
|
right: toolbarRight,
|
|
17861
18632
|
customSettings: customSettings,
|
|
17862
18633
|
scrollToIndex: scrollToIndex
|
|
18634
|
+
}), /*#__PURE__*/React__default.createElement(ErrorAlert, {
|
|
18635
|
+
table: table,
|
|
18636
|
+
tableRef: internalRef,
|
|
18637
|
+
scrollToIndex: scrollToIndex,
|
|
18638
|
+
rowIdentifier: props.rowIdentifier
|
|
17863
18639
|
}), /*#__PURE__*/React__default.createElement("div", {
|
|
17864
18640
|
className: className,
|
|
17865
18641
|
id: props.id,
|
|
@@ -17910,7 +18686,9 @@ const Table$1 = /*#__PURE__*/fixedForwardRef(function Table3(props, ref) {
|
|
|
17910
18686
|
className: "group/footer contents",
|
|
17911
18687
|
"data-taco": "table2-footer",
|
|
17912
18688
|
role: "rowgroup"
|
|
17913
|
-
},
|
|
18689
|
+
},
|
|
18690
|
+
// Render the footer cell only for individual columns, excluding column groups.
|
|
18691
|
+
table.getFooterGroups().slice(0, 1).map(footerGroup => /*#__PURE__*/React__default.createElement("div", {
|
|
17914
18692
|
className: "contents",
|
|
17915
18693
|
key: footerGroup.id,
|
|
17916
18694
|
role: "row"
|