@teppen/react-ui 2.1.0 → 2.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (79) hide show
  1. package/README.md +14 -1
  2. package/dist/cjs/src/search-bar/condition-search-bar/input-form.js +1 -1
  3. package/dist/cjs/src/search-bar/condition-search-bar/input-form.js.map +1 -1
  4. package/dist/cjs/src/share/text/normalize.js +2 -0
  5. package/dist/cjs/src/share/text/normalize.js.map +1 -0
  6. package/dist/cjs/src/table/copy/components.js +1 -1
  7. package/dist/cjs/src/table/copy/components.js.map +1 -1
  8. package/dist/cjs/src/table/edit/ui/select-input.js +1 -1
  9. package/dist/cjs/src/table/edit/ui/select-input.js.map +1 -1
  10. package/dist/cjs/src/table/filter-v2/hook.js +1 -1
  11. package/dist/cjs/src/table/filter-v2/hook.js.map +1 -1
  12. package/dist/cjs/src/table/libs/generate-validate-function.js +1 -1
  13. package/dist/cjs/src/table/libs/generate-validate-function.js.map +1 -1
  14. package/dist/cjs/src/table/locale/messages.js +2 -0
  15. package/dist/cjs/src/table/locale/messages.js.map +1 -0
  16. package/dist/cjs/src/table/locale/provider.js +2 -0
  17. package/dist/cjs/src/table/locale/provider.js.map +1 -0
  18. package/dist/cjs/src/table/operation/components/key-catcher.js +2 -0
  19. package/dist/cjs/src/table/operation/components/key-catcher.js.map +1 -0
  20. package/dist/cjs/src/table/operation/components/keyboard-setting.js +1 -1
  21. package/dist/cjs/src/table/operation/components/keyboard-setting.js.map +1 -1
  22. package/dist/cjs/src/table/operation/editor-input.js +2 -0
  23. package/dist/cjs/src/table/operation/editor-input.js.map +1 -0
  24. package/dist/cjs/src/table/operation/event-target.js +1 -1
  25. package/dist/cjs/src/table/operation/event-target.js.map +1 -1
  26. package/dist/cjs/src/table/paste/hooks.js +1 -1
  27. package/dist/cjs/src/table/paste/hooks.js.map +1 -1
  28. package/dist/cjs/src/table/paste/logic.js +1 -1
  29. package/dist/cjs/src/table/paste/logic.js.map +1 -1
  30. package/dist/cjs/src/table/sheet/providers.js +1 -1
  31. package/dist/cjs/src/table/sheet/providers.js.map +1 -1
  32. package/dist/cjs/src/table/sort/hooks.js +1 -1
  33. package/dist/cjs/src/table/sort/hooks.js.map +1 -1
  34. package/dist/cjs/src/table/sort/provider.js +1 -1
  35. package/dist/cjs/src/table/sort/provider.js.map +1 -1
  36. package/dist/cjs/src/table/table/base.js +1 -1
  37. package/dist/cjs/src/table/table/base.js.map +1 -1
  38. package/dist/cjs/src/table/table/hook.js +1 -1
  39. package/dist/cjs/src/table/table/hook.js.map +1 -1
  40. package/dist/esm/src/search-bar/condition-search-bar/input-form.js +1 -1
  41. package/dist/esm/src/search-bar/condition-search-bar/input-form.js.map +1 -1
  42. package/dist/esm/src/share/text/normalize.js +2 -0
  43. package/dist/esm/src/share/text/normalize.js.map +1 -0
  44. package/dist/esm/src/table/copy/components.js +1 -1
  45. package/dist/esm/src/table/copy/components.js.map +1 -1
  46. package/dist/esm/src/table/edit/ui/select-input.js +1 -1
  47. package/dist/esm/src/table/edit/ui/select-input.js.map +1 -1
  48. package/dist/esm/src/table/filter-v2/hook.js +1 -1
  49. package/dist/esm/src/table/filter-v2/hook.js.map +1 -1
  50. package/dist/esm/src/table/libs/generate-validate-function.js +1 -1
  51. package/dist/esm/src/table/libs/generate-validate-function.js.map +1 -1
  52. package/dist/esm/src/table/locale/messages.js +2 -0
  53. package/dist/esm/src/table/locale/messages.js.map +1 -0
  54. package/dist/esm/src/table/locale/provider.js +2 -0
  55. package/dist/esm/src/table/locale/provider.js.map +1 -0
  56. package/dist/esm/src/table/operation/components/key-catcher.js +2 -0
  57. package/dist/esm/src/table/operation/components/key-catcher.js.map +1 -0
  58. package/dist/esm/src/table/operation/components/keyboard-setting.js +1 -1
  59. package/dist/esm/src/table/operation/components/keyboard-setting.js.map +1 -1
  60. package/dist/esm/src/table/operation/editor-input.js +2 -0
  61. package/dist/esm/src/table/operation/editor-input.js.map +1 -0
  62. package/dist/esm/src/table/operation/event-target.js +1 -1
  63. package/dist/esm/src/table/operation/event-target.js.map +1 -1
  64. package/dist/esm/src/table/paste/hooks.js +1 -1
  65. package/dist/esm/src/table/paste/hooks.js.map +1 -1
  66. package/dist/esm/src/table/paste/logic.js +1 -1
  67. package/dist/esm/src/table/paste/logic.js.map +1 -1
  68. package/dist/esm/src/table/sheet/providers.js +1 -1
  69. package/dist/esm/src/table/sheet/providers.js.map +1 -1
  70. package/dist/esm/src/table/sort/hooks.js +1 -1
  71. package/dist/esm/src/table/sort/hooks.js.map +1 -1
  72. package/dist/esm/src/table/sort/provider.js +1 -1
  73. package/dist/esm/src/table/sort/provider.js.map +1 -1
  74. package/dist/esm/src/table/table/base.js +1 -1
  75. package/dist/esm/src/table/table/base.js.map +1 -1
  76. package/dist/esm/src/table/table/hook.js +1 -1
  77. package/dist/esm/src/table/table/hook.js.map +1 -1
  78. package/dist/index.d.ts +39 -26
  79. package/package.json +1 -1
package/README.md CHANGED
@@ -213,6 +213,9 @@ A component that displays a table based on the row and column information passed
213
213
  - Pagination function
214
214
  - Sorting function (except for columns that use `render` while `editable` is false, or that set `disableSort`)
215
215
  - Filtering function (only when `label` is set in the column information; the same columns as sorting are excluded, and `disableFilter` turns it off)
216
+
217
+ Sorting compares numbers and dates by value and text in Japanese order (`"2"` before `"10"`, hiragana and katakana together in kana order). Select columns are sorted by their labels. Empty values stay at the end in both orders.
218
+ The `like` / `not like` filters ignore differences between upper and lower case, full-width and half-width characters, and hiragana and katakana (`"tokyo"` matches `"Tokyo"`, `"とうきょう"` matches `"トウキョウ"`). `=` and `≠` compare the text exactly.
216
219
  - Editing function (only when `editable` is true and `onCellBlur` is set in the column information)
217
220
  - Checkbox function
218
221
  - Paste function
@@ -220,7 +223,7 @@ A component that displays a table based on the row and column information passed
220
223
 
221
224
  #### Arguments
222
225
 
223
- The table component accepts the arguments `id`, `rows`, `cols`, `initialCondition`, `onClickRow`, `onUpdateRow`, `onPasteError`, `errorHandler`, `applyRowFormatting`, `checkbox`, `conditionalFormattings`, `maxHeight` and `maxWidth`. Details for each argument are described below.
226
+ The table component accepts the arguments `id`, `rows`, `cols`, `initialCondition`, `onClickRow`, `onUpdateRow`, `onPasteError`, `errorHandler`, `locale`, `applyRowFormatting`, `checkbox`, `conditionalFormattings`, `maxHeight` and `maxWidth`. Details for each argument are described below.
224
227
 
225
228
  All of these types are exported from the package, e.g. `import type { TTableColumn, TPropsTable } from "@teppen/react-ui";`.
226
229
 
@@ -298,6 +301,8 @@ type TInitialCondition = {
298
301
 
299
302
  ※ `pagenation` (the earlier spelling) still works but is deprecated. If both are set, `pagination` is used.
300
303
 
304
+ `rowCountPerPage` defaults to 50. With pagination, the table stays fast regardless of the number of rows (all operations took under 50 ms with 10,000 rows in our measurements). `"all"` renders every row at once, so it gets slower as rows increase: with 1,000 rows sorting takes about 0.6 s, and with 10,000 rows the first render and sorting take several seconds. For more than about 1,000 rows, use pagination.
305
+
301
306
  ##### onClickRow
302
307
 
303
308
  In `onClickRow`, you may define the behavior when a row is clicked. This is optional.
@@ -336,6 +341,14 @@ In `errorHandler`, you can handle values that break a column's `constraints` (wh
336
341
  type TErrorHandler = (errors: TErrorValidation[]) => void;
337
342
  ```
338
343
 
344
+ ##### locale
345
+
346
+ `locale` sets the language of the messages the table shows by itself: the default `errorHandler` alert, paste error messages, the "copied" notice and the empty option of select cells. `"ja"` (default) or `"en"`.
347
+
348
+ ```ts
349
+ type TLocale = "ja" | "en";
350
+ ```
351
+
339
352
  ##### maxHeight / maxWidth
340
353
 
341
354
  CSS sizes (e.g. `"600px"`) that limit the table area. The table scrolls inside it.
@@ -1,2 +1,2 @@
1
- "use client";"use strict";var e=require("react/jsx-runtime"),t=require("react"),n=require("../../select-box/index.js"),i=require("./condition-input-management/context.js");require("../../../node_modules/tslib/tslib.es6.js");var o=require("../id-generator/context.js"),r=require("../../../node_modules/react-icons/ti/index.js");function u(){var t=o.useIdGenerator().generateId,r=i.useConditionInputState().targets,u=i.useConditionInputAction().inputTarget;return e.jsx(n.SelectBox,{id:t("TargetInput"),onSelect:function(e){u(e)},options:r.map((function(e){return{value:e.key,label:e.label}})),placeholder:"Select target",no_appearance:!0,no_icon:!0})}function a(){var t=o.useIdGenerator().generateId,r=i.useConditionInputState(),u=i.useConditionInputAction(),a=u.inputOperator,l=u.removeInputedTarget;if("inputted target"!==r.status)return null;var p=r.inputtingCondition.target,s=r.useableOperators;return e.jsxs(e.Fragment,{children:[e.jsx(f,{label:p.label,onClickDelete:function(){l()}}),e.jsx("div",{className:"w-full min-w-64",children:e.jsx(n.SelectBox,{id:t("OperatorInput"),onSelect:function(e){a(e),setTimeout((function(){var e=document.getElementById(t("ValueInput"));e&&e.focus()}),10)},options:s.map((function(e){return{value:e.key,label:e.label}})),defaultIsOpen:!0,placeholder:"Select operator",no_appearance:!0,no_icon:!0})})]})}function l(t){var n=i.useConditionInputState(),o=i.useConditionInputAction(),r=o.removeInputedOperator,u=o.removeInputedTarget;if("inputted operator"!==n.status)return null;var a=n.inputtingCondition.target,l=n.inputtingCondition.operator;return e.jsxs(e.Fragment,{children:[e.jsx(f,{label:a.label,onClickDelete:function(){u()}}),e.jsx(f,{label:l.label,onClickDelete:function(){r()}}),"single string"===n.inputtingCondition.operator.inputType?e.jsx(p,{inputType:n.inputtingCondition.operator.inputType,size:t.size}):"single number"===n.inputtingCondition.operator.inputType?e.jsx(s,{inputType:n.inputtingCondition.operator.inputType,size:t.size}):"select"===n.inputtingCondition.operator.inputType?e.jsx(c,{inputType:n.inputtingCondition.operator.inputType,options:"select"===n.inputtingCondition.target.type?n.inputtingCondition.target.options:[]}):"single datetime"===n.inputtingCondition.operator.inputType?e.jsx(d,{inputType:n.inputtingCondition.operator.inputType,size:t.size}):"single date"===n.inputtingCondition.operator.inputType?e.jsx(g,{inputType:n.inputtingCondition.operator.inputType,size:t.size}):console.error("Not implemented")]})}function p(n){var r=o.useIdGenerator().generateId,u=t.useState(""),a=u[0],l=u[1],p=i.useConditionInputAction().inputValue;return e.jsx("input",{id:r("ValueInput"),className:"appearance-none w-full min-w-64 border-none px-2 py-1 placeholder:text-gray-400 focus:outline-none focus-visible:outline-none bg-transparent ".concat("small"===n.size?"text-sm":"large"===n.size?"text-lg":""),type:"text",placeholder:"Search text",value:a,onChange:function(e){l(e.target.value)},onKeyDown:function(e){"Enter"===e.key&&(p({type:n.inputType,payload:{value:a}}),l(""))}})}function s(n){var r=o.useIdGenerator().generateId,u=t.useState(""),a=u[0],l=u[1],p=i.useConditionInputAction().inputValue;return e.jsx("input",{id:r("ValueInput"),className:"appearance-none w-full min-w-64 border-none px-2 py-1 placeholder:text-gray-400 focus:outline-none focus-visible:outline-none bg-transparent ".concat("small"===n.size?"text-sm":"large"===n.size?"text-lg":""),type:"text",placeholder:"Search text",value:a,onChange:function(e){l(e.target.value)},onKeyDown:function(e){"Enter"===e.key&&(p({type:n.inputType,payload:{value:Number(a)}}),l(""))}})}function c(t){var r=i.useConditionInputAction().inputValue,u=o.useIdGenerator().generateId;return e.jsx("div",{className:"w-full min-w-64",children:e.jsx(n.SelectBox,{id:u("ValueInput"),onSelect:function(e){r({type:t.inputType,payload:{value:e}})},options:t.options,defaultIsOpen:!0,placeholder:"Select value",no_appearance:!0,no_icon:!0})})}function d(n){var r=o.useIdGenerator().generateId,u=i.useConditionInputAction().inputValue,a=t.useRef(null);return t.useEffect((function(){if(a.current){var e=a.current;e.focus(),e.scrollIntoView(),e.click()}}),[]),e.jsx("input",{ref:a,id:r("ValueInput"),className:"appearance-none w-fit min-w-64 border-none px-2 py-1 focus:outline-none focus-visible:outline-none bg-transparent ".concat("small"===n.size?"text-sm":"large"===n.size?"text-lg":""),type:"datetime-local",defaultValue:new Date((new Date).getTime()-6e4*(new Date).getTimezoneOffset()).toISOString().slice(0,16),onKeyDown:function(e){var t,i;if("Enter"===e.key){var o=new Date(null!==(i=null===(t=a.current)||void 0===t?void 0:t.value)&&void 0!==i?i:"");if(isNaN(o.getTime()))return;u({type:n.inputType,payload:{value:o}})}},onClick:function(e){e.currentTarget.showPicker()}})}function g(n){var r=o.useIdGenerator().generateId,u=i.useConditionInputAction().inputValue,a=t.useRef(null),l=t.useRef(!1);return t.useEffect((function(){if(a.current){var e=a.current;e.focus(),e.scrollIntoView(),e.click()}}),[]),e.jsx("input",{ref:a,id:r("ValueInput"),className:"appearance-none w-fit min-w-64 border-none px-2 py-1 focus:outline-none focus-visible:outline-none bg-transparent ".concat("small"===n.size?"text-sm":"large"===n.size?"text-lg":""),type:"date",defaultValue:new Date((new Date).getTime()-6e4*(new Date).getTimezoneOffset()).toISOString().slice(0,10),onKeyDown:function(e){var t;if("Enter"===e.key){if(!(null===(t=a.current)||void 0===t?void 0:t.value))return;var i=a.current.value.split("-"),o=i[0],r=i[1],l=i[2],p=new Date(Number(o),Number(r)-1,Number(l));if(isNaN(p.getTime()))return;u({type:n.inputType,payload:{value:p}})}},onClick:function(e){l.current||(e.currentTarget.showPicker(),l.current=!0)}})}function f(t){return e.jsxs("div",{className:"flex items-center gap-2 w-fit px-2 border border-gray-200 rounded bg-slate-100",children:[e.jsx("p",{className:"whitespace-nowrap",children:t.label}),t.onClickDelete&&e.jsx("div",{children:e.jsx(r.TiDeleteOutline,{className:"bg-white hover:bg-slate-300 rounded-full cursor-pointer",onClick:t.onClickDelete})})]})}exports.SearchBarInputForm=function(t){switch(i.useConditionInputState().status){case"waiting for input":return e.jsx(u,{});case"inputted target":return e.jsx(a,{});case"inputted operator":return e.jsx(l,{size:t.size})}};
1
+ "use client";"use strict";var e=require("react/jsx-runtime"),t=require("react"),n=require("../../select-box/index.js"),i=require("./condition-input-management/context.js");require("../../../node_modules/tslib/tslib.es6.js");var o=require("../id-generator/context.js"),r=require("../../../node_modules/react-icons/ti/index.js"),u=require("../../share/text/normalize.js"),a=require("../../table/operation/event-target.js");function l(){var t=o.useIdGenerator().generateId,r=i.useConditionInputState().targets,u=i.useConditionInputAction().inputTarget;return e.jsx(n.SelectBox,{id:t("TargetInput"),onSelect:function(e){u(e)},options:r.map((function(e){return{value:e.key,label:e.label}})),placeholder:"Select target",no_appearance:!0,no_icon:!0})}function s(){var t=o.useIdGenerator().generateId,r=i.useConditionInputState(),u=i.useConditionInputAction(),a=u.inputOperator,l=u.removeInputedTarget;if("inputted target"!==r.status)return null;var s=r.inputtingCondition.target,p=r.useableOperators;return e.jsxs(e.Fragment,{children:[e.jsx(x,{label:s.label,onClickDelete:function(){l()}}),e.jsx("div",{className:"w-full min-w-64",children:e.jsx(n.SelectBox,{id:t("OperatorInput"),onSelect:function(e){a(e),setTimeout((function(){var e=document.getElementById(t("ValueInput"));e&&e.focus()}),10)},options:p.map((function(e){return{value:e.key,label:e.label}})),defaultIsOpen:!0,placeholder:"Select operator",no_appearance:!0,no_icon:!0})})]})}function p(t){var n=i.useConditionInputState(),o=i.useConditionInputAction(),r=o.removeInputedOperator,u=o.removeInputedTarget;if("inputted operator"!==n.status)return null;var a=n.inputtingCondition.target,l=n.inputtingCondition.operator;return e.jsxs(e.Fragment,{children:[e.jsx(x,{label:a.label,onClickDelete:function(){u()}}),e.jsx(x,{label:l.label,onClickDelete:function(){r()}}),"single string"===n.inputtingCondition.operator.inputType?e.jsx(c,{inputType:n.inputtingCondition.operator.inputType,size:t.size}):"single number"===n.inputtingCondition.operator.inputType?e.jsx(d,{inputType:n.inputtingCondition.operator.inputType,size:t.size}):"select"===n.inputtingCondition.operator.inputType?e.jsx(g,{inputType:n.inputtingCondition.operator.inputType,options:"select"===n.inputtingCondition.target.type?n.inputtingCondition.target.options:[]}):"single datetime"===n.inputtingCondition.operator.inputType?e.jsx(f,{inputType:n.inputtingCondition.operator.inputType,size:t.size}):"single date"===n.inputtingCondition.operator.inputType?e.jsx(v,{inputType:n.inputtingCondition.operator.inputType,size:t.size}):console.error("Not implemented")]})}function c(n){var r=o.useIdGenerator().generateId,u=t.useState(""),l=u[0],s=u[1],p=i.useConditionInputAction().inputValue;return e.jsx("input",{id:r("ValueInput"),className:"appearance-none w-full min-w-64 border-none px-2 py-1 placeholder:text-gray-400 focus:outline-none focus-visible:outline-none bg-transparent ".concat("small"===n.size?"text-sm":"large"===n.size?"text-lg":""),type:"text",placeholder:"Search text",value:l,onChange:function(e){s(e.target.value)},onKeyDown:function(e){"Enter"!==e.key||a.isComposingKey(e.nativeEvent)||(p({type:n.inputType,payload:{value:l}}),s(""))}})}function d(n){var r=o.useIdGenerator().generateId,l=t.useState(""),s=l[0],p=l[1],c=t.useState(!1),d=c[0],g=c[1],f=i.useConditionInputAction().inputValue;return e.jsx("input",{id:r("ValueInput"),"aria-invalid":d,className:"appearance-none w-full min-w-64 border-none px-2 py-1 placeholder:text-gray-400 focus:outline-none focus-visible:outline-none bg-transparent ".concat(d?"text-red-600 underline decoration-wavy":""," ").concat("small"===n.size?"text-sm":"large"===n.size?"text-lg":""),type:"text",placeholder:"Search text",value:s,onChange:function(e){p(e.target.value),g(!1)},onKeyDown:function(e){if("Enter"===e.key&&!a.isComposingKey(e.nativeEvent)){var t=u.parseNumberText(s);if(null===t)return void g(!0);f({type:n.inputType,payload:{value:t}}),p("")}}})}function g(t){var r=i.useConditionInputAction().inputValue,u=o.useIdGenerator().generateId;return e.jsx("div",{className:"w-full min-w-64",children:e.jsx(n.SelectBox,{id:u("ValueInput"),onSelect:function(e){r({type:t.inputType,payload:{value:e}})},options:t.options,defaultIsOpen:!0,placeholder:"Select value",no_appearance:!0,no_icon:!0})})}function f(n){var r=o.useIdGenerator().generateId,u=i.useConditionInputAction().inputValue,a=t.useRef(null);return t.useEffect((function(){if(a.current){var e=a.current;e.focus(),e.scrollIntoView(),e.click()}}),[]),e.jsx("input",{ref:a,id:r("ValueInput"),className:"appearance-none w-fit min-w-64 border-none px-2 py-1 focus:outline-none focus-visible:outline-none bg-transparent ".concat("small"===n.size?"text-sm":"large"===n.size?"text-lg":""),type:"datetime-local",defaultValue:new Date((new Date).getTime()-6e4*(new Date).getTimezoneOffset()).toISOString().slice(0,16),onKeyDown:function(e){var t,i;if("Enter"===e.key){var o=new Date(null!==(i=null===(t=a.current)||void 0===t?void 0:t.value)&&void 0!==i?i:"");if(isNaN(o.getTime()))return;u({type:n.inputType,payload:{value:o}})}},onClick:function(e){e.currentTarget.showPicker()}})}function v(n){var r=o.useIdGenerator().generateId,u=i.useConditionInputAction().inputValue,a=t.useRef(null),l=t.useRef(!1);return t.useEffect((function(){if(a.current){var e=a.current;e.focus(),e.scrollIntoView(),e.click()}}),[]),e.jsx("input",{ref:a,id:r("ValueInput"),className:"appearance-none w-fit min-w-64 border-none px-2 py-1 focus:outline-none focus-visible:outline-none bg-transparent ".concat("small"===n.size?"text-sm":"large"===n.size?"text-lg":""),type:"date",defaultValue:new Date((new Date).getTime()-6e4*(new Date).getTimezoneOffset()).toISOString().slice(0,10),onKeyDown:function(e){var t;if("Enter"===e.key){if(!(null===(t=a.current)||void 0===t?void 0:t.value))return;var i=a.current.value.split("-"),o=i[0],r=i[1],l=i[2],s=new Date(Number(o),Number(r)-1,Number(l));if(isNaN(s.getTime()))return;u({type:n.inputType,payload:{value:s}})}},onClick:function(e){l.current||(e.currentTarget.showPicker(),l.current=!0)}})}function x(t){return e.jsxs("div",{className:"flex items-center gap-2 w-fit px-2 border border-gray-200 rounded bg-slate-100",children:[e.jsx("p",{className:"whitespace-nowrap",children:t.label}),t.onClickDelete&&e.jsx("div",{children:e.jsx(r.TiDeleteOutline,{className:"bg-white hover:bg-slate-300 rounded-full cursor-pointer",onClick:t.onClickDelete})})]})}exports.SearchBarInputForm=function(t){switch(i.useConditionInputState().status){case"waiting for input":return e.jsx(l,{});case"inputted target":return e.jsx(s,{});case"inputted operator":return e.jsx(p,{size:t.size})}};
2
2
  //# sourceMappingURL=input-form.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"input-form.js","sources":["../../../../../src/search-bar/condition-search-bar/input-form.tsx"],"sourcesContent":["\"use client\";\n\nimport { useEffect, useRef, useState } from \"react\";\nimport { Options, SelectBox } from \"../../select-box\";\nimport {\n useConditionInputAction,\n useConditionInputState,\n} from \"./condition-input-management\";\nimport { useIdGenerator } from \"../id-generator\";\nimport { TiDeleteOutline } from \"react-icons/ti\";\n\nexport function SearchBarInputForm(props: {\n size?: \"small\" | \"medium\" | \"large\";\n}) {\n const { status } = useConditionInputState();\n\n switch (status) {\n case \"waiting for input\":\n return <TargetInputForm />;\n case \"inputted target\":\n return <OperatorInputForm />;\n case \"inputted operator\":\n return <SearchValueInputForm size={props.size} />;\n }\n}\n\nfunction TargetInputForm() {\n const { generateId } = useIdGenerator();\n const { targets } = useConditionInputState();\n const { inputTarget } = useConditionInputAction();\n\n return (\n <SelectBox\n id={generateId(\"TargetInput\")}\n onSelect={(value) => {\n inputTarget(value);\n }}\n options={targets.map((t) => ({\n value: t.key,\n label: t.label,\n }))}\n placeholder=\"Select target\"\n no_appearance\n no_icon\n />\n );\n}\n\nfunction OperatorInputForm() {\n const { generateId } = useIdGenerator();\n const state = useConditionInputState();\n const { inputOperator, removeInputedTarget } = useConditionInputAction();\n\n if (state.status !== \"inputted target\") {\n return null;\n }\n\n const target = state.inputtingCondition.target;\n const operators = state.useableOperators;\n\n return (\n <>\n <FixedValue\n label={target.label}\n onClickDelete={() => {\n removeInputedTarget();\n }}\n />\n <div className=\"w-full min-w-64\">\n <SelectBox\n id={generateId(\"OperatorInput\")}\n onSelect={(value) => {\n inputOperator(value);\n\n setTimeout(() => {\n const element = document.getElementById(generateId(\"ValueInput\"));\n\n if (element) {\n element.focus();\n }\n }, 10);\n }}\n options={operators.map((t) => ({\n value: t.key,\n label: t.label,\n }))}\n defaultIsOpen\n placeholder=\"Select operator\"\n no_appearance\n no_icon\n />\n </div>\n </>\n );\n}\n\nfunction SearchValueInputForm(props: { size?: \"small\" | \"medium\" | \"large\" }) {\n const state = useConditionInputState();\n const { removeInputedOperator, removeInputedTarget } =\n useConditionInputAction();\n\n if (state.status !== \"inputted operator\") {\n return null;\n }\n\n const target = state.inputtingCondition.target;\n const operator = state.inputtingCondition.operator;\n\n return (\n <>\n <FixedValue\n label={target.label}\n onClickDelete={() => {\n removeInputedTarget();\n }}\n />\n <FixedValue\n label={operator.label}\n onClickDelete={() => {\n removeInputedOperator();\n }}\n />\n {state.inputtingCondition.operator.inputType === \"single string\" ? (\n <InputSingleString\n inputType={state.inputtingCondition.operator.inputType}\n size={props.size}\n />\n ) : state.inputtingCondition.operator.inputType === \"single number\" ? (\n <InputSingleNumber\n inputType={state.inputtingCondition.operator.inputType}\n size={props.size}\n />\n ) : state.inputtingCondition.operator.inputType === \"select\" ? (\n <InputSingleSelect\n inputType={state.inputtingCondition.operator.inputType}\n options={\n state.inputtingCondition.target.type === \"select\"\n ? state.inputtingCondition.target.options\n : []\n }\n />\n ) : state.inputtingCondition.operator.inputType === \"single datetime\" ? (\n <InputSingleDatetime\n inputType={state.inputtingCondition.operator.inputType}\n size={props.size}\n />\n ) : state.inputtingCondition.operator.inputType === \"single date\" ? (\n <InputSingleDate\n inputType={state.inputtingCondition.operator.inputType}\n size={props.size}\n />\n ) : (\n console.error(\"Not implemented\")\n )}\n </>\n );\n}\n\nfunction InputSingleString(props: {\n inputType: \"single string\";\n size?: \"small\" | \"medium\" | \"large\";\n}) {\n const { generateId } = useIdGenerator();\n const [value, setValue] = useState(\"\");\n const { inputValue } = useConditionInputAction();\n\n return (\n <input\n id={generateId(\"ValueInput\")}\n className={`appearance-none w-full min-w-64 border-none px-2 py-1 placeholder:text-gray-400 focus:outline-none focus-visible:outline-none bg-transparent ${\n props.size === \"small\"\n ? \"text-sm\"\n : props.size === \"large\"\n ? \"text-lg\"\n : \"\"\n }`}\n type=\"text\"\n placeholder=\"Search text\"\n value={value}\n onChange={(e) => {\n setValue(e.target.value);\n }}\n // 文字列が確定し、Enterキーが押されたら値を入力する\n onKeyDown={(e) => {\n if (e.key === \"Enter\") {\n inputValue({\n type: props.inputType,\n payload: {\n value: value,\n },\n });\n setValue(\"\");\n }\n }}\n />\n );\n}\n\nfunction InputSingleNumber(props: {\n inputType: \"single number\";\n size?: \"small\" | \"medium\" | \"large\";\n}) {\n const { generateId } = useIdGenerator();\n const [value, setValue] = useState(\"\");\n const { inputValue } = useConditionInputAction();\n\n return (\n <input\n id={generateId(\"ValueInput\")}\n className={`appearance-none w-full min-w-64 border-none px-2 py-1 placeholder:text-gray-400 focus:outline-none focus-visible:outline-none bg-transparent ${\n props.size === \"small\"\n ? \"text-sm\"\n : props.size === \"large\"\n ? \"text-lg\"\n : \"\"\n }`}\n type=\"text\"\n placeholder=\"Search text\"\n value={value}\n onChange={(e) => {\n setValue(e.target.value);\n }}\n // 文字列が確定し、Enterキーが押されたら値を入力する\n onKeyDown={(e) => {\n if (e.key === \"Enter\") {\n inputValue({\n type: props.inputType,\n payload: {\n value: Number(value),\n },\n });\n setValue(\"\");\n }\n }}\n />\n );\n}\n\nfunction InputSingleSelect(props: { inputType: \"select\"; options: Options[] }) {\n const { inputValue } = useConditionInputAction();\n const { generateId } = useIdGenerator();\n\n return (\n <div className=\"w-full min-w-64\">\n <SelectBox\n id={generateId(\"ValueInput\")}\n onSelect={(value) => {\n inputValue({\n type: props.inputType,\n payload: {\n value: value,\n },\n });\n }}\n options={props.options}\n defaultIsOpen\n placeholder=\"Select value\"\n no_appearance\n no_icon\n />\n </div>\n );\n}\n\nfunction InputSingleDatetime(props: {\n inputType: \"single datetime\";\n size?: \"small\" | \"medium\" | \"large\";\n}) {\n const { generateId } = useIdGenerator();\n const { inputValue } = useConditionInputAction();\n const ref = useRef<HTMLInputElement>(null);\n\n useEffect(() => {\n if (ref.current) {\n const element = ref.current;\n\n element.focus();\n element.scrollIntoView();\n element.click();\n }\n }, []);\n\n return (\n <input\n ref={ref}\n id={generateId(\"ValueInput\")}\n className={`appearance-none w-fit min-w-64 border-none px-2 py-1 focus:outline-none focus-visible:outline-none bg-transparent ${\n props.size === \"small\"\n ? \"text-sm\"\n : props.size === \"large\"\n ? \"text-lg\"\n : \"\"\n }`}\n type=\"datetime-local\"\n defaultValue={new Date(\n new Date().getTime() - new Date().getTimezoneOffset() * 60000\n )\n .toISOString()\n .slice(0, 16)}\n // Enterキーが押されたら値を入力する\n onKeyDown={(e) => {\n if (e.key === \"Enter\") {\n const value = new Date(ref.current?.value ?? \"\");\n\n if (isNaN(value.getTime())) {\n return;\n }\n\n inputValue({\n type: props.inputType,\n payload: {\n value,\n },\n });\n }\n }}\n onClick={(e) => {\n e.currentTarget.showPicker();\n }}\n />\n );\n}\n\nfunction InputSingleDate(props: {\n inputType: \"single date\";\n size?: \"small\" | \"medium\" | \"large\";\n}) {\n const { generateId } = useIdGenerator();\n const { inputValue } = useConditionInputAction();\n const ref = useRef<HTMLInputElement>(null);\n const isClicked = useRef(false);\n\n useEffect(() => {\n if (ref.current) {\n const element = ref.current;\n\n element.focus();\n element.scrollIntoView();\n element.click();\n }\n }, []);\n\n return (\n <input\n ref={ref}\n id={generateId(\"ValueInput\")}\n className={`appearance-none w-fit min-w-64 border-none px-2 py-1 focus:outline-none focus-visible:outline-none bg-transparent ${\n props.size === \"small\"\n ? \"text-sm\"\n : props.size === \"large\"\n ? \"text-lg\"\n : \"\"\n }`}\n type=\"date\"\n defaultValue={new Date(\n new Date().getTime() - new Date().getTimezoneOffset() * 60000\n )\n .toISOString()\n .slice(0, 10)}\n // Enterキーが押されたら値を入力する\n onKeyDown={(e) => {\n if (e.key === \"Enter\") {\n if (!ref.current?.value) {\n return;\n }\n\n const [year, month, date] = ref.current.value.split(\"-\");\n const value = new Date(Number(year), Number(month) - 1, Number(date));\n\n if (isNaN(value.getTime())) {\n return;\n }\n\n inputValue({\n type: props.inputType,\n payload: {\n value,\n },\n });\n }\n }}\n onClick={(e) => {\n if (isClicked.current) {\n return;\n }\n\n e.currentTarget.showPicker();\n isClicked.current = true;\n }}\n />\n );\n}\n\nfunction FixedValue(props: { label: string; onClickDelete?: () => void }) {\n return (\n <div className=\"flex items-center gap-2 w-fit px-2 border border-gray-200 rounded bg-slate-100\">\n <p className=\"whitespace-nowrap\">{props.label}</p>\n {props.onClickDelete && (\n <div>\n <TiDeleteOutline\n className=\"bg-white hover:bg-slate-300 rounded-full cursor-pointer\"\n onClick={props.onClickDelete}\n />\n </div>\n )}\n </div>\n );\n}\n"],"names":["TargetInputForm","generateId","useIdGenerator","targets","useConditionInputState","inputTarget","useConditionInputAction","_jsx","SelectBox","id","onSelect","value","options","map","t","key","label","placeholder","no_appearance","no_icon","OperatorInputForm","state","_a","inputOperator","removeInputedTarget","status","target","inputtingCondition","operators","useableOperators","_jsxs","_Fragment","children","FixedValue","onClickDelete","className","setTimeout","element","document","getElementById","focus","defaultIsOpen","SearchValueInputForm","props","removeInputedOperator","operator","inputType","InputSingleString","size","InputSingleNumber","InputSingleSelect","type","InputSingleDatetime","InputSingleDate","console","error","useState","setValue","inputValue","concat","onChange","e","onKeyDown","payload","Number","ref","useRef","useEffect","current","scrollIntoView","click","defaultValue","Date","getTime","getTimezoneOffset","toISOString","slice","_b","isNaN","onClick","currentTarget","showPicker","isClicked","split","year","month","date","TiDeleteOutline"],"mappings":"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"}
1
+ {"version":3,"file":"input-form.js","sources":["../../../../../src/search-bar/condition-search-bar/input-form.tsx"],"sourcesContent":["\"use client\";\n\nimport { useEffect, useRef, useState } from \"react\";\nimport { Options, SelectBox } from \"../../select-box\";\nimport {\n useConditionInputAction,\n useConditionInputState,\n} from \"./condition-input-management\";\nimport { useIdGenerator } from \"../id-generator\";\nimport { TiDeleteOutline } from \"react-icons/ti\";\nimport { parseNumberText } from \"../../share/text/normalize\";\nimport { isComposingKey } from \"../../table/operation/event-target\";\n\nexport function SearchBarInputForm(props: {\n size?: \"small\" | \"medium\" | \"large\";\n}) {\n const { status } = useConditionInputState();\n\n switch (status) {\n case \"waiting for input\":\n return <TargetInputForm />;\n case \"inputted target\":\n return <OperatorInputForm />;\n case \"inputted operator\":\n return <SearchValueInputForm size={props.size} />;\n }\n}\n\nfunction TargetInputForm() {\n const { generateId } = useIdGenerator();\n const { targets } = useConditionInputState();\n const { inputTarget } = useConditionInputAction();\n\n return (\n <SelectBox\n id={generateId(\"TargetInput\")}\n onSelect={(value) => {\n inputTarget(value);\n }}\n options={targets.map((t) => ({\n value: t.key,\n label: t.label,\n }))}\n placeholder=\"Select target\"\n no_appearance\n no_icon\n />\n );\n}\n\nfunction OperatorInputForm() {\n const { generateId } = useIdGenerator();\n const state = useConditionInputState();\n const { inputOperator, removeInputedTarget } = useConditionInputAction();\n\n if (state.status !== \"inputted target\") {\n return null;\n }\n\n const target = state.inputtingCondition.target;\n const operators = state.useableOperators;\n\n return (\n <>\n <FixedValue\n label={target.label}\n onClickDelete={() => {\n removeInputedTarget();\n }}\n />\n <div className=\"w-full min-w-64\">\n <SelectBox\n id={generateId(\"OperatorInput\")}\n onSelect={(value) => {\n inputOperator(value);\n\n setTimeout(() => {\n const element = document.getElementById(generateId(\"ValueInput\"));\n\n if (element) {\n element.focus();\n }\n }, 10);\n }}\n options={operators.map((t) => ({\n value: t.key,\n label: t.label,\n }))}\n defaultIsOpen\n placeholder=\"Select operator\"\n no_appearance\n no_icon\n />\n </div>\n </>\n );\n}\n\nfunction SearchValueInputForm(props: { size?: \"small\" | \"medium\" | \"large\" }) {\n const state = useConditionInputState();\n const { removeInputedOperator, removeInputedTarget } =\n useConditionInputAction();\n\n if (state.status !== \"inputted operator\") {\n return null;\n }\n\n const target = state.inputtingCondition.target;\n const operator = state.inputtingCondition.operator;\n\n return (\n <>\n <FixedValue\n label={target.label}\n onClickDelete={() => {\n removeInputedTarget();\n }}\n />\n <FixedValue\n label={operator.label}\n onClickDelete={() => {\n removeInputedOperator();\n }}\n />\n {state.inputtingCondition.operator.inputType === \"single string\" ? (\n <InputSingleString\n inputType={state.inputtingCondition.operator.inputType}\n size={props.size}\n />\n ) : state.inputtingCondition.operator.inputType === \"single number\" ? (\n <InputSingleNumber\n inputType={state.inputtingCondition.operator.inputType}\n size={props.size}\n />\n ) : state.inputtingCondition.operator.inputType === \"select\" ? (\n <InputSingleSelect\n inputType={state.inputtingCondition.operator.inputType}\n options={\n state.inputtingCondition.target.type === \"select\"\n ? state.inputtingCondition.target.options\n : []\n }\n />\n ) : state.inputtingCondition.operator.inputType === \"single datetime\" ? (\n <InputSingleDatetime\n inputType={state.inputtingCondition.operator.inputType}\n size={props.size}\n />\n ) : state.inputtingCondition.operator.inputType === \"single date\" ? (\n <InputSingleDate\n inputType={state.inputtingCondition.operator.inputType}\n size={props.size}\n />\n ) : (\n console.error(\"Not implemented\")\n )}\n </>\n );\n}\n\nfunction InputSingleString(props: {\n inputType: \"single string\";\n size?: \"small\" | \"medium\" | \"large\";\n}) {\n const { generateId } = useIdGenerator();\n const [value, setValue] = useState(\"\");\n const { inputValue } = useConditionInputAction();\n\n return (\n <input\n id={generateId(\"ValueInput\")}\n className={`appearance-none w-full min-w-64 border-none px-2 py-1 placeholder:text-gray-400 focus:outline-none focus-visible:outline-none bg-transparent ${\n props.size === \"small\"\n ? \"text-sm\"\n : props.size === \"large\"\n ? \"text-lg\"\n : \"\"\n }`}\n type=\"text\"\n placeholder=\"Search text\"\n value={value}\n onChange={(e) => {\n setValue(e.target.value);\n }}\n // 文字列が確定し、Enterキーが押されたら値を入力する\n // (The Enter that confirms IME conversion is ignored.)\n onKeyDown={(e) => {\n if (e.key === \"Enter\" && !isComposingKey(e.nativeEvent)) {\n inputValue({\n type: props.inputType,\n payload: {\n value: value,\n },\n });\n setValue(\"\");\n }\n }}\n />\n );\n}\n\nfunction InputSingleNumber(props: {\n inputType: \"single number\";\n size?: \"small\" | \"medium\" | \"large\";\n}) {\n const { generateId } = useIdGenerator();\n const [value, setValue] = useState(\"\");\n const [isInvalid, setIsInvalid] = useState(false);\n const { inputValue } = useConditionInputAction();\n\n return (\n <input\n id={generateId(\"ValueInput\")}\n aria-invalid={isInvalid}\n className={`appearance-none w-full min-w-64 border-none px-2 py-1 placeholder:text-gray-400 focus:outline-none focus-visible:outline-none bg-transparent ${\n isInvalid ? \"text-red-600 underline decoration-wavy\" : \"\"\n } ${\n props.size === \"small\"\n ? \"text-sm\"\n : props.size === \"large\"\n ? \"text-lg\"\n : \"\"\n }`}\n type=\"text\"\n placeholder=\"Search text\"\n value={value}\n onChange={(e) => {\n setValue(e.target.value);\n setIsInvalid(false);\n }}\n // 文字列が確定し、Enterキーが押されたら値を入力する\n onKeyDown={(e) => {\n if (e.key === \"Enter\" && !isComposingKey(e.nativeEvent)) {\n // Do not add a condition for text that is not a number; before,\n // \"\" became 0 and other text NaN, which matched nothing.\n const number = parseNumberText(value);\n if (number === null) {\n setIsInvalid(true);\n return;\n }\n\n inputValue({\n type: props.inputType,\n payload: {\n value: number,\n },\n });\n setValue(\"\");\n }\n }}\n />\n );\n}\n\nfunction InputSingleSelect(props: { inputType: \"select\"; options: Options[] }) {\n const { inputValue } = useConditionInputAction();\n const { generateId } = useIdGenerator();\n\n return (\n <div className=\"w-full min-w-64\">\n <SelectBox\n id={generateId(\"ValueInput\")}\n onSelect={(value) => {\n inputValue({\n type: props.inputType,\n payload: {\n value: value,\n },\n });\n }}\n options={props.options}\n defaultIsOpen\n placeholder=\"Select value\"\n no_appearance\n no_icon\n />\n </div>\n );\n}\n\nfunction InputSingleDatetime(props: {\n inputType: \"single datetime\";\n size?: \"small\" | \"medium\" | \"large\";\n}) {\n const { generateId } = useIdGenerator();\n const { inputValue } = useConditionInputAction();\n const ref = useRef<HTMLInputElement>(null);\n\n useEffect(() => {\n if (ref.current) {\n const element = ref.current;\n\n element.focus();\n element.scrollIntoView();\n element.click();\n }\n }, []);\n\n return (\n <input\n ref={ref}\n id={generateId(\"ValueInput\")}\n className={`appearance-none w-fit min-w-64 border-none px-2 py-1 focus:outline-none focus-visible:outline-none bg-transparent ${\n props.size === \"small\"\n ? \"text-sm\"\n : props.size === \"large\"\n ? \"text-lg\"\n : \"\"\n }`}\n type=\"datetime-local\"\n defaultValue={new Date(\n new Date().getTime() - new Date().getTimezoneOffset() * 60000\n )\n .toISOString()\n .slice(0, 16)}\n // Enterキーが押されたら値を入力する\n onKeyDown={(e) => {\n if (e.key === \"Enter\") {\n const value = new Date(ref.current?.value ?? \"\");\n\n if (isNaN(value.getTime())) {\n return;\n }\n\n inputValue({\n type: props.inputType,\n payload: {\n value,\n },\n });\n }\n }}\n onClick={(e) => {\n e.currentTarget.showPicker();\n }}\n />\n );\n}\n\nfunction InputSingleDate(props: {\n inputType: \"single date\";\n size?: \"small\" | \"medium\" | \"large\";\n}) {\n const { generateId } = useIdGenerator();\n const { inputValue } = useConditionInputAction();\n const ref = useRef<HTMLInputElement>(null);\n const isClicked = useRef(false);\n\n useEffect(() => {\n if (ref.current) {\n const element = ref.current;\n\n element.focus();\n element.scrollIntoView();\n element.click();\n }\n }, []);\n\n return (\n <input\n ref={ref}\n id={generateId(\"ValueInput\")}\n className={`appearance-none w-fit min-w-64 border-none px-2 py-1 focus:outline-none focus-visible:outline-none bg-transparent ${\n props.size === \"small\"\n ? \"text-sm\"\n : props.size === \"large\"\n ? \"text-lg\"\n : \"\"\n }`}\n type=\"date\"\n defaultValue={new Date(\n new Date().getTime() - new Date().getTimezoneOffset() * 60000\n )\n .toISOString()\n .slice(0, 10)}\n // Enterキーが押されたら値を入力する\n onKeyDown={(e) => {\n if (e.key === \"Enter\") {\n if (!ref.current?.value) {\n return;\n }\n\n const [year, month, date] = ref.current.value.split(\"-\");\n const value = new Date(Number(year), Number(month) - 1, Number(date));\n\n if (isNaN(value.getTime())) {\n return;\n }\n\n inputValue({\n type: props.inputType,\n payload: {\n value,\n },\n });\n }\n }}\n onClick={(e) => {\n if (isClicked.current) {\n return;\n }\n\n e.currentTarget.showPicker();\n isClicked.current = true;\n }}\n />\n );\n}\n\nfunction FixedValue(props: { label: string; onClickDelete?: () => void }) {\n return (\n <div className=\"flex items-center gap-2 w-fit px-2 border border-gray-200 rounded bg-slate-100\">\n <p className=\"whitespace-nowrap\">{props.label}</p>\n {props.onClickDelete && (\n <div>\n <TiDeleteOutline\n className=\"bg-white hover:bg-slate-300 rounded-full cursor-pointer\"\n onClick={props.onClickDelete}\n />\n </div>\n )}\n </div>\n );\n}\n"],"names":["TargetInputForm","generateId","useIdGenerator","targets","useConditionInputState","inputTarget","useConditionInputAction","_jsx","SelectBox","id","onSelect","value","options","map","t","key","label","placeholder","no_appearance","no_icon","OperatorInputForm","state","_a","inputOperator","removeInputedTarget","status","target","inputtingCondition","operators","useableOperators","_jsxs","_Fragment","children","FixedValue","onClickDelete","className","setTimeout","element","document","getElementById","focus","defaultIsOpen","SearchValueInputForm","props","removeInputedOperator","operator","inputType","InputSingleString","size","InputSingleNumber","InputSingleSelect","type","InputSingleDatetime","InputSingleDate","console","error","useState","setValue","inputValue","concat","onChange","e","onKeyDown","isComposingKey","nativeEvent","payload","_b","isInvalid","setIsInvalid","number","parseNumberText","ref","useRef","useEffect","current","scrollIntoView","click","defaultValue","Date","getTime","getTimezoneOffset","toISOString","slice","isNaN","onClick","currentTarget","showPicker","isClicked","split","year","month","date","Number","TiDeleteOutline"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ "use strict";var r=new Intl.Collator("ja",{numeric:!0});exports.compareText=function(e,t){return r.compare(e,t)},exports.normalizeForSearch=function(r){return r.normalize("NFKC").toLowerCase().replace(/[ぁ-ゖ]/g,(function(r){return String.fromCharCode(r.charCodeAt(0)+96)}))},exports.parseNumberText=function(r){var e=r.normalize("NFKC").trim().replace(/[ー−]/g,"-"),t=/^-?\d{1,3}(,\d{3})+(\.\d+)?$/.test(e)?e.replace(/,/g,""):e;return/^-?\d+(\.\d+)?$/.test(t)?Number(t):null};
2
+ //# sourceMappingURL=normalize.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"normalize.js","sources":["../../../../../src/share/text/normalize.ts"],"sourcesContent":["/**\n * Normalizes text for matching, so that different ways of writing the same\n * text match:\n * - full-width and half-width letters, digits and katakana (NFKC):\n * \"ABC\" → \"ABC\", \"トウキョウ\" → \"トウキョウ\"\n * - upper and lower case: \"Tokyo\" → \"tokyo\"\n * - hiragana and katakana: \"とうきょう\" → \"トウキョウ\"\n */\nexport function normalizeForSearch(text: string): string {\n return text\n .normalize(\"NFKC\")\n .toLowerCase()\n .replace(/[ぁ-ゖ]/g, (ch) =>\n String.fromCharCode(ch.charCodeAt(0) + 0x60)\n );\n}\n\nconst collator = new Intl.Collator(\"ja\", { numeric: true });\n\n/**\n * Compares two strings in Japanese order: numbers by value (\"2\" < \"10\"),\n * letters alphabetically with case next to each other, and hiragana and\n * katakana together in kana order.\n */\nexport function compareText(a: string, b: string): number {\n return collator.compare(a, b);\n}\n\n/**\n * Reads a number typed by the user. Accepts full-width digits and thousands\n * separators (\"1,000\" → 1000). Returns null if it is not a number.\n */\nexport function parseNumberText(text: string): number | null {\n const t = text.normalize(\"NFKC\").trim().replace(/[ー−]/g, \"-\");\n const plain = /^-?\\d{1,3}(,\\d{3})+(\\.\\d+)?$/.test(t) ? t.replace(/,/g, \"\") : t;\n\n return /^-?\\d+(\\.\\d+)?$/.test(plain) ? Number(plain) : null;\n}\n"],"names":["collator","Intl","Collator","numeric","a","b","compare","text","normalize","toLowerCase","replace","ch","String","fromCharCode","charCodeAt","t","trim","plain","test","Number"],"mappings":"aAiBA,IAAMA,EAAW,IAAIC,KAAKC,SAAS,KAAM,CAAEC,SAAS,wBAO9C,SAAsBC,EAAWC,GACrC,OAAOL,EAASM,QAAQF,EAAGC,EAC7B,6BAlBM,SAA6BE,GACjC,OAAOA,EACJC,UAAU,QACVC,cACAC,QAAQ,UAAU,SAACC,GAClB,OAAAC,OAAOC,aAAaF,EAAGG,WAAW,GAAK,GAAvC,GAEN,0BAiBM,SAA0BP,GAC9B,IAAMQ,EAAIR,EAAKC,UAAU,QAAQQ,OAAON,QAAQ,QAAS,KACnDO,EAAQ,+BAA+BC,KAAKH,GAAKA,EAAEL,QAAQ,KAAM,IAAMK,EAE7E,MAAO,kBAAkBG,KAAKD,GAASE,OAAOF,GAAS,IACzD"}
@@ -1,2 +1,2 @@
1
- "use strict";var e=require("react/jsx-runtime"),t=require("react"),r=require("./provider.js"),i=require("../id/provider.js");exports.CopiedMessage=function(){var n=i.useTableIdGenerator(),a=t.useState(!1),o=a[0],s=a[1],u=r.useCopyStateContext().copiedAt;if(t.useEffect((function(){if(u){s(!0);var e=setTimeout((function(){s(!1)}),1e3);return function(){s(!1),clearTimeout(e)}}}),[u]),!o)return e.jsx(e.Fragment,{});var c=document.getElementById(n.getTableId());if(!c)return e.jsx(e.Fragment,{});var d=c.getBoundingClientRect(),p=d.right-120,f=d.bottom-50;return e.jsx("div",{className:"fixed z-[100] p-1 bg-gray-800 duration-300 pointer-events-none ".concat(o?"opacity-100":"opacity-0"),style:{top:f,left:p},children:e.jsx("p",{className:"text-white text-xs",children:"コピーしました!!!"})})};
1
+ "use strict";var e=require("react/jsx-runtime"),t=require("react"),r=require("./provider.js"),i=require("../id/provider.js"),n=require("../locale/provider.js");exports.CopiedMessage=function(){var s=i.useTableIdGenerator(),o=t.useState(!1),a=o[0],u=o[1],c=r.useCopyStateContext().copiedAt,d=n.useMessages();if(t.useEffect((function(){if(c){u(!0);var e=setTimeout((function(){u(!1)}),1e3);return function(){u(!1),clearTimeout(e)}}}),[c]),!a)return e.jsx(e.Fragment,{});var p=document.getElementById(s.getTableId());if(!p)return e.jsx(e.Fragment,{});var l=p.getBoundingClientRect(),f=l.right-120,g=l.bottom-50;return e.jsx("div",{className:"fixed z-[100] p-1 bg-gray-800 duration-300 pointer-events-none ".concat(a?"opacity-100":"opacity-0"),style:{top:g,left:f},children:e.jsx("p",{className:"text-white text-xs",children:d.copied})})};
2
2
  //# sourceMappingURL=components.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"components.js","sources":["../../../../../src/table/copy/components.tsx"],"sourcesContent":["import { useEffect, useState } from \"react\";\nimport { useCopyStateContext } from \"./provider\";\nimport { useTableIdGenerator } from \"../id\";\n\nexport function CopiedMessage() {\n const IdGenerator = useTableIdGenerator();\n const [isDisplay, setIsDisplay] = useState(false);\n const { copiedAt } = useCopyStateContext();\n\n useEffect(() => {\n if (copiedAt) {\n setIsDisplay(true);\n\n const timer = setTimeout(() => {\n setIsDisplay(false);\n }, 1000);\n\n return () => {\n setIsDisplay(false);\n clearTimeout(timer);\n };\n }\n }, [copiedAt]);\n\n if (!isDisplay) {\n return <></>;\n }\n\n const tableElement = document.getElementById(IdGenerator.getTableId());\n\n if (!tableElement) {\n return <></>;\n }\n\n // テーブルの右下の位置を取得\n const rect = tableElement.getBoundingClientRect();\n const x = rect.right - 120;\n const y = rect.bottom - 50;\n\n return (\n <div\n className={`fixed z-[100] p-1 bg-gray-800 duration-300 pointer-events-none ${\n isDisplay ? \"opacity-100\" : \"opacity-0\"\n }`}\n style={{ top: y, left: x }}\n >\n <p className=\"text-white text-xs\">コピーしました!!!</p>\n </div>\n );\n}\n"],"names":["IdGenerator","useTableIdGenerator","_a","useState","isDisplay","setIsDisplay","copiedAt","useCopyStateContext","useEffect","timer_1","setTimeout","clearTimeout","_jsx","tableElement","document","getElementById","getTableId","rect","getBoundingClientRect","x","right","y","bottom","className","style","top","left","children"],"mappings":"8JAKE,IAAMA,EAAcC,EAAAA,sBACdC,EAA4BC,EAAAA,UAAS,GAApCC,EAASF,EAAA,GAAEG,EAAYH,EAAA,GACtBI,EAAaC,EAAAA,+BAiBrB,GAfAC,EAAAA,WAAU,WACR,GAAIF,EAAU,CACZD,GAAa,GAEb,IAAMI,EAAQC,YAAW,WACvBL,GAAa,EACf,GAAG,KAEH,OAAO,WACLA,GAAa,GACbM,aAAaF,EACf,CACF,CACF,GAAG,CAACH,KAECF,EACH,OAAOQ,EAAAA,mBAGT,IAAMC,EAAeC,SAASC,eAAef,EAAYgB,cAEzD,IAAKH,EACH,OAAOD,EAAAA,mBAIT,IAAMK,EAAOJ,EAAaK,wBACpBC,EAAIF,EAAKG,MAAQ,IACjBC,EAAIJ,EAAKK,OAAS,GAExB,OACEV,MAAA,MAAA,CACEW,UAAW,yEACTnB,EAAY,cAAgB,aAE9BoB,MAAO,CAAEC,IAAKJ,EAAGK,KAAMP,GAAGQ,SAE1Bf,EAAAA,IAAA,IAAA,CAAGW,UAAU,qBAAoBI,SAAA,gBAGvC"}
1
+ {"version":3,"file":"components.js","sources":["../../../../../src/table/copy/components.tsx"],"sourcesContent":["import { useEffect, useState } from \"react\";\nimport { useCopyStateContext } from \"./provider\";\nimport { useTableIdGenerator } from \"../id\";\nimport { useMessages } from \"../locale/provider\";\n\nexport function CopiedMessage() {\n const IdGenerator = useTableIdGenerator();\n const [isDisplay, setIsDisplay] = useState(false);\n const { copiedAt } = useCopyStateContext();\n const messages = useMessages();\n\n useEffect(() => {\n if (copiedAt) {\n setIsDisplay(true);\n\n const timer = setTimeout(() => {\n setIsDisplay(false);\n }, 1000);\n\n return () => {\n setIsDisplay(false);\n clearTimeout(timer);\n };\n }\n }, [copiedAt]);\n\n if (!isDisplay) {\n return <></>;\n }\n\n const tableElement = document.getElementById(IdGenerator.getTableId());\n\n if (!tableElement) {\n return <></>;\n }\n\n // テーブルの右下の位置を取得\n const rect = tableElement.getBoundingClientRect();\n const x = rect.right - 120;\n const y = rect.bottom - 50;\n\n return (\n <div\n className={`fixed z-[100] p-1 bg-gray-800 duration-300 pointer-events-none ${\n isDisplay ? \"opacity-100\" : \"opacity-0\"\n }`}\n style={{ top: y, left: x }}\n >\n <p className=\"text-white text-xs\">{messages.copied}</p>\n </div>\n );\n}\n"],"names":["IdGenerator","useTableIdGenerator","_a","useState","isDisplay","setIsDisplay","copiedAt","useCopyStateContext","messages","useMessages","useEffect","timer_1","setTimeout","clearTimeout","_jsx","tableElement","document","getElementById","getTableId","rect","getBoundingClientRect","x","right","y","bottom","className","concat","style","top","left","copied"],"mappings":"iMAME,IAAMA,EAAcC,EAAAA,sBACdC,EAA4BC,EAAAA,UAAS,GAApCC,EAASF,EAAA,GAAEG,EAAYH,EAAA,GACtBI,EAAaC,EAAAA,+BACfC,EAAWC,EAAAA,cAiBjB,GAfAC,EAAAA,WAAU,WACR,GAAIJ,EAAU,CACZD,GAAa,GAEb,IAAMM,EAAQC,YAAW,WACvBP,GAAa,EACf,GAAG,KAEH,OAAO,WACLA,GAAa,GACbQ,aAAaF,EACf,CACF,CACF,GAAG,CAACL,KAECF,EACH,OAAOU,EAAAA,mBAGT,IAAMC,EAAeC,SAASC,eAAejB,EAAYkB,cAEzD,IAAKH,EACH,OAAOD,EAAAA,mBAIT,IAAMK,EAAOJ,EAAaK,wBACpBC,EAAIF,EAAKG,MAAQ,IACjBC,EAAIJ,EAAKK,OAAS,GAExB,OACEV,MAAA,MAAA,CACEW,UAAW,kEAAAC,OACTtB,EAAY,cAAgB,aAE9BuB,MAAO,CAAEC,IAAKL,EAAGM,KAAMR,YAEvBP,EAAAA,IAAA,IAAA,CAAGW,UAAU,8BAAsBjB,EAASsB,UAGlD"}
@@ -1,2 +1,2 @@
1
- "use client";"use strict";var e=require("../../../../node_modules/tslib/tslib.es6.js"),t=require("react/jsx-runtime"),n=require("react"),r=require("../provider.js"),o=require("../../../icon/cancel-icon.js"),i=require("../../../select-box/index.js"),u=require("../../id/provider.js");exports.SelectCellInput=function(s){var c=u.useTableIdGenerator(),l=s.col,a=r.useEditActionContext().endEditing,d=s.row[l.key],f=!!l.editable&&l.allowEmpty,p=n.useState(d),v=p[0],m=p[1],j=n.useRef(null),x=n.useRef(null);n.useEffect((function(){x.current&&x.current.focus()}),[x]);var b=function(e){l.editable&&l.onCellBlur(l.key,e,s.row,a)};n.useEffect((function(){var e=function(e){var t=j.current,n=e.target;n instanceof Node&&(null==t?void 0:t.contains(n))||(v!==d?b(v):a())};return document.addEventListener("mousedown",e),function(){document.removeEventListener("mousedown",e)}}),[v,b,a,d]);var w=n.useMemo((function(){return f?e.__spreadArray([{value:"",label:""===d?"-- 未選択 --":"-- 選択解除 --"}],l.options,!0):l.options}),[l.options,f,d]);return l.editable?t.jsxs("div",{ref:j,className:"flex justify-between gap-1 w-full items-center",children:[t.jsx(i.SelectBox,{id:c.getEditorId(),inputRef:x,value:v,defaultIsOpen:!0,options:w,onSelect:function(e){m(e),b(e)}}),t.jsx("button",{className:"cursor-pointer",onMouseDown:function(e){e.preventDefault(),e.stopPropagation(),setTimeout((function(){m(d),a()}),300)},children:t.jsx(o.CancelIcon,{size:16})})]}):t.jsx(t.Fragment,{})};
1
+ "use client";"use strict";var e=require("../../../../node_modules/tslib/tslib.es6.js"),t=require("react/jsx-runtime"),n=require("react"),r=require("../provider.js"),o=require("../../../icon/cancel-icon.js"),s=require("../../../select-box/index.js"),i=require("../../id/provider.js"),u=require("../../locale/provider.js");exports.SelectCellInput=function(l){var c=i.useTableIdGenerator(),a=u.useMessages(),d=l.col,f=r.useEditActionContext().endEditing,p=l.row[d.key],v=!!d.editable&&d.allowEmpty,m=n.useState(p),j=m[0],x=m[1],b=n.useRef(null),q=n.useRef(null);n.useEffect((function(){q.current&&q.current.focus()}),[q]);var w=function(e){d.editable&&d.onCellBlur(d.key,e,l.row,f)};n.useEffect((function(){var e=function(e){var t=b.current,n=e.target;n instanceof Node&&(null==t?void 0:t.contains(n))||(j!==p?w(j):f())};return document.addEventListener("mousedown",e),function(){document.removeEventListener("mousedown",e)}}),[j,w,f,p]);var E=n.useMemo((function(){return v?e.__spreadArray([{value:"",label:""===p?a.selectNone:a.selectClear}],d.options,!0):d.options}),[d.options,v,p,a]);return d.editable?t.jsxs("div",{ref:b,className:"flex justify-between gap-1 w-full items-center",children:[t.jsx(s.SelectBox,{id:c.getEditorId(),inputRef:q,value:j,defaultIsOpen:!0,options:E,placeholder:a.selectPlaceholder,onSelect:function(e){x(e),w(e)}}),t.jsx("button",{className:"cursor-pointer",onMouseDown:function(e){e.preventDefault(),e.stopPropagation(),setTimeout((function(){x(p),f()}),300)},children:t.jsx(o.CancelIcon,{size:16})})]}):t.jsx(t.Fragment,{})};
2
2
  //# sourceMappingURL=select-input.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"select-input.js","sources":["../../../../../../src/table/edit/ui/select-input.tsx"],"sourcesContent":["\"use client\";\n\nimport { useEffect, useMemo, useRef, useState } from \"react\";\nimport { useEditActionContext } from \"../provider\";\nimport { CancelIcon } from \"../../../icon/cancel-icon\";\nimport {\n DataObject,\n DataRecord,\n TColumnProperty,\n TSelectCellEditingCondition,\n} from \"../../table/type\";\nimport { SelectBox } from \"../../../select-box\";\nimport { useTableIdGenerator } from \"../../id\";\n\ntype TPropsCellInput = {\n col: TColumnProperty<DataRecord> & TSelectCellEditingCondition<DataRecord>;\n row: DataObject<DataRecord>;\n};\n\nexport function SelectCellInput(props: TPropsCellInput) {\n const IdGenerator = useTableIdGenerator();\n const col = props.col;\n const { endEditing } = useEditActionContext();\n const prevValue = props.row[col.key] as string;\n const allowEmpty = col.editable ? col.allowEmpty : false;\n const [value, setValue] = useState(prevValue);\n const ref = useRef<HTMLDivElement>(null);\n const inputRef = useRef<HTMLInputElement>(null);\n\n useEffect(() => {\n if (inputRef.current) {\n inputRef.current.focus();\n }\n }, [inputRef]);\n\n const updateCellValue = (value: string) => {\n if (col.editable) {\n col.onCellBlur(col.key, value, props.row, endEditing);\n }\n };\n\n useEffect(() => {\n const onClickOutOfSelectBox = (e: MouseEvent) => {\n const selectInputElement = ref.current;\n const ele = e.target;\n\n if (ele instanceof Node && selectInputElement?.contains(ele)) return;\n\n if (value === prevValue) {\n endEditing();\n return;\n }\n\n updateCellValue(value);\n };\n\n document.addEventListener(\"mousedown\", onClickOutOfSelectBox);\n\n return () => {\n document.removeEventListener(\"mousedown\", onClickOutOfSelectBox);\n };\n }, [value, updateCellValue, endEditing, prevValue]);\n\n const options = useMemo(() => {\n if (allowEmpty) {\n return [\n {\n value: \"\",\n label: prevValue === \"\" ? \"-- 未選択 --\" : \"-- 選択解除 --\",\n },\n ...col.options,\n ];\n } else {\n return col.options;\n }\n }, [col.options, allowEmpty, prevValue]);\n\n // Return only after every hook has run, so hooks are always called in the\n // same order.\n if (!col.editable) return <></>;\n\n return (\n <div ref={ref} className=\"flex justify-between gap-1 w-full items-center\">\n <SelectBox\n id={IdGenerator.getEditorId()}\n inputRef={inputRef}\n value={value}\n defaultIsOpen={true}\n options={options}\n onSelect={(value) => {\n setValue(value);\n updateCellValue(value);\n }}\n />\n <button\n className=\"cursor-pointer\"\n onMouseDown={(e) => {\n e.preventDefault();\n e.stopPropagation();\n setTimeout(() => {\n setValue(prevValue);\n endEditing();\n }, 300);\n }}\n >\n <CancelIcon size={16} />\n </button>\n </div>\n );\n}\n"],"names":["props","IdGenerator","useTableIdGenerator","col","endEditing","useEditActionContext","prevValue","row","key","allowEmpty","editable","_a","useState","value","setValue","ref","useRef","inputRef","useEffect","current","focus","updateCellValue","onCellBlur","onClickOutOfSelectBox","e","selectInputElement","ele","target","Node","contains","document","addEventListener","removeEventListener","options","useMemo","__spreadArray","label","_jsxs","className","children","_jsx","SelectBox","id","getEditorId","defaultIsOpen","onSelect","onMouseDown","preventDefault","stopPropagation","setTimeout","CancelIcon","size"],"mappings":"mTAmBM,SAA0BA,GAC9B,IAAMC,EAAcC,EAAAA,sBACdC,EAAMH,EAAMG,IACVC,EAAeC,EAAAA,kCACjBC,EAAYN,EAAMO,IAAIJ,EAAIK,KAC1BC,IAAaN,EAAIO,UAAWP,EAAIM,WAChCE,EAAoBC,EAAAA,SAASN,GAA5BO,EAAKF,EAAA,GAAEG,EAAQH,EAAA,GAChBI,EAAMC,EAAAA,OAAuB,MAC7BC,EAAWD,EAAAA,OAAyB,MAE1CE,EAAAA,WAAU,WACJD,EAASE,SACXF,EAASE,QAAQC,OAErB,GAAG,CAACH,IAEJ,IAAMI,EAAkB,SAACR,GACnBV,EAAIO,UACNP,EAAImB,WAAWnB,EAAIK,IAAKK,EAAOb,EAAMO,IAAKH,EAE9C,EAEAc,EAAAA,WAAU,WACR,IAAMK,EAAwB,SAACC,GAC7B,IAAMC,EAAqBV,EAAII,QACzBO,EAAMF,EAAEG,OAEVD,aAAeE,OAAQH,aAAkB,EAAlBA,EAAoBI,SAASH,MAEpDb,IAAUP,EAKde,EAAgBR,GAJdT,IAKJ,EAIA,OAFA0B,SAASC,iBAAiB,YAAaR,GAEhC,WACLO,SAASE,oBAAoB,YAAaT,EAC5C,CACF,GAAG,CAACV,EAAOQ,EAAiBjB,EAAYE,IAExC,IAAM2B,EAAUC,EAAAA,SAAQ,WACtB,OAAIzB,EACF0B,gBAAA,CACE,CACEtB,MAAO,GACPuB,MAAqB,KAAd9B,EAAmB,YAAc,eAEvCH,EAAI8B,SAAO,GAGT9B,EAAI8B,OAEf,GAAG,CAAC9B,EAAI8B,QAASxB,EAAYH,IAI7B,OAAKH,EAAIO,SAGP2B,OAAA,MAAA,CAAKtB,IAAKA,EAAKuB,UAAU,iDAAgDC,SAAA,CACvEC,MAACC,EAAAA,UAAS,CACRC,GAAIzC,EAAY0C,cAChB1B,SAAUA,EACVJ,MAAOA,EACP+B,eAAe,EACfX,QAASA,EACTY,SAAU,SAAChC,GACTC,EAASD,GACTQ,EAAgBR,EAClB,IAEF2B,EAAAA,IAAA,SAAA,CACEF,UAAU,iBACVQ,YAAa,SAACtB,GACZA,EAAEuB,iBACFvB,EAAEwB,kBACFC,YAAW,WACTnC,EAASR,GACTF,GACF,GAAG,IACL,EAACmC,SAEDC,EAAAA,IAACU,aAAU,CAACC,KAAM,UA1BEX,EAAAA,kBA8B5B"}
1
+ {"version":3,"file":"select-input.js","sources":["../../../../../../src/table/edit/ui/select-input.tsx"],"sourcesContent":["\"use client\";\n\nimport { useEffect, useMemo, useRef, useState } from \"react\";\nimport { useEditActionContext } from \"../provider\";\nimport { CancelIcon } from \"../../../icon/cancel-icon\";\nimport {\n DataObject,\n DataRecord,\n TColumnProperty,\n TSelectCellEditingCondition,\n} from \"../../table/type\";\nimport { SelectBox } from \"../../../select-box\";\nimport { useTableIdGenerator } from \"../../id\";\nimport { useMessages } from \"../../locale/provider\";\n\ntype TPropsCellInput = {\n col: TColumnProperty<DataRecord> & TSelectCellEditingCondition<DataRecord>;\n row: DataObject<DataRecord>;\n};\n\nexport function SelectCellInput(props: TPropsCellInput) {\n const IdGenerator = useTableIdGenerator();\n const messages = useMessages();\n const col = props.col;\n const { endEditing } = useEditActionContext();\n const prevValue = props.row[col.key] as string;\n const allowEmpty = col.editable ? col.allowEmpty : false;\n const [value, setValue] = useState(prevValue);\n const ref = useRef<HTMLDivElement>(null);\n const inputRef = useRef<HTMLInputElement>(null);\n\n useEffect(() => {\n if (inputRef.current) {\n inputRef.current.focus();\n }\n }, [inputRef]);\n\n const updateCellValue = (value: string) => {\n if (col.editable) {\n col.onCellBlur(col.key, value, props.row, endEditing);\n }\n };\n\n useEffect(() => {\n const onClickOutOfSelectBox = (e: MouseEvent) => {\n const selectInputElement = ref.current;\n const ele = e.target;\n\n if (ele instanceof Node && selectInputElement?.contains(ele)) return;\n\n if (value === prevValue) {\n endEditing();\n return;\n }\n\n updateCellValue(value);\n };\n\n document.addEventListener(\"mousedown\", onClickOutOfSelectBox);\n\n return () => {\n document.removeEventListener(\"mousedown\", onClickOutOfSelectBox);\n };\n }, [value, updateCellValue, endEditing, prevValue]);\n\n const options = useMemo(() => {\n if (allowEmpty) {\n return [\n {\n value: \"\",\n label: prevValue === \"\" ? messages.selectNone : messages.selectClear,\n },\n ...col.options,\n ];\n } else {\n return col.options;\n }\n }, [col.options, allowEmpty, prevValue, messages]);\n\n // Return only after every hook has run, so hooks are always called in the\n // same order.\n if (!col.editable) return <></>;\n\n return (\n <div ref={ref} className=\"flex justify-between gap-1 w-full items-center\">\n <SelectBox\n id={IdGenerator.getEditorId()}\n inputRef={inputRef}\n value={value}\n defaultIsOpen={true}\n options={options}\n placeholder={messages.selectPlaceholder}\n onSelect={(value) => {\n setValue(value);\n updateCellValue(value);\n }}\n />\n <button\n className=\"cursor-pointer\"\n onMouseDown={(e) => {\n e.preventDefault();\n e.stopPropagation();\n setTimeout(() => {\n setValue(prevValue);\n endEditing();\n }, 300);\n }}\n >\n <CancelIcon size={16} />\n </button>\n </div>\n );\n}\n"],"names":["props","IdGenerator","useTableIdGenerator","messages","useMessages","col","endEditing","useEditActionContext","prevValue","row","key","allowEmpty","editable","_a","useState","value","setValue","ref","useRef","inputRef","useEffect","current","focus","updateCellValue","onCellBlur","onClickOutOfSelectBox","e","selectInputElement","ele","target","Node","contains","document","addEventListener","removeEventListener","options","useMemo","__spreadArray","label","selectNone","selectClear","_jsxs","className","children","_jsx","SelectBox","id","getEditorId","defaultIsOpen","placeholder","selectPlaceholder","onSelect","onMouseDown","preventDefault","stopPropagation","setTimeout","CancelIcon","size"],"mappings":"yVAoBM,SAA0BA,GAC9B,IAAMC,EAAcC,EAAAA,sBACdC,EAAWC,EAAAA,cACXC,EAAML,EAAMK,IACVC,EAAeC,EAAAA,kCACjBC,EAAYR,EAAMS,IAAIJ,EAAIK,KAC1BC,IAAaN,EAAIO,UAAWP,EAAIM,WAChCE,EAAoBC,EAAAA,SAASN,GAA5BO,EAAKF,EAAA,GAAEG,EAAQH,EAAA,GAChBI,EAAMC,EAAAA,OAAuB,MAC7BC,EAAWD,EAAAA,OAAyB,MAE1CE,EAAAA,WAAU,WACJD,EAASE,SACXF,EAASE,QAAQC,OAErB,GAAG,CAACH,IAEJ,IAAMI,EAAkB,SAACR,GACnBV,EAAIO,UACNP,EAAImB,WAAWnB,EAAIK,IAAKK,EAAOf,EAAMS,IAAKH,EAE9C,EAEAc,EAAAA,WAAU,WACR,IAAMK,EAAwB,SAACC,GAC7B,IAAMC,EAAqBV,EAAII,QACzBO,EAAMF,EAAEG,OAEVD,aAAeE,OAAQH,aAAkB,EAAlBA,EAAoBI,SAASH,MAEpDb,IAAUP,EAKde,EAAgBR,GAJdT,IAKJ,EAIA,OAFA0B,SAASC,iBAAiB,YAAaR,GAEhC,WACLO,SAASE,oBAAoB,YAAaT,EAC5C,CACF,GAAG,CAACV,EAAOQ,EAAiBjB,EAAYE,IAExC,IAAM2B,EAAUC,EAAAA,SAAQ,WACtB,OAAIzB,EACF0B,gBAAA,CACE,CACEtB,MAAO,GACPuB,MAAqB,KAAd9B,EAAmBL,EAASoC,WAAapC,EAASqC,cAExDnC,EAAI8B,SAAO,GAGT9B,EAAI8B,OAEf,GAAG,CAAC9B,EAAI8B,QAASxB,EAAYH,EAAWL,IAIxC,OAAKE,EAAIO,SAGP6B,EAAAA,YAAKxB,IAAKA,EAAKyB,UAAU,iDAAgDC,SAAA,CACvEC,EAAAA,IAACC,EAAAA,UAAS,CACRC,GAAI7C,EAAY8C,cAChB5B,SAAUA,EACVJ,MAAOA,EACPiC,eAAe,EACfb,QAASA,EACTc,YAAa9C,EAAS+C,kBACtBC,SAAU,SAACpC,GACTC,EAASD,GACTQ,EAAgBR,EAClB,IAEF6B,EAAAA,IAAA,SAAA,CACEF,UAAU,iBACVU,YAAa,SAAC1B,GACZA,EAAE2B,iBACF3B,EAAE4B,kBACFC,YAAW,WACTvC,EAASR,GACTF,GACF,GAAG,IACL,EAACqC,SAEDC,EAAAA,IAACY,aAAU,CAACC,KAAM,UA3BEb,EAAAA,kBA+B5B"}
@@ -1,2 +1,2 @@
1
- "use strict";var e=require("react"),t=require("./reducer.js");function r(e){return null==e?"":String(e)}function n(e){if(null==e||""===e)return null;var t=e instanceof Date?e:new Date(e);return isNaN(t.getTime())?null:1e4*t.getFullYear()+100*(t.getMonth()+1)+t.getDate()}function a(e,t,a){switch(e.operator.type){case"number":if("single number"===e.operator.inputType){if(a.type!==e.operator.inputType)throw new Error("input type is not match");var i=a.payload.value;switch(e.operator.key){case"number:eq":return t===i;case"number:gt":return t>i;case"number:gte":return t>=i;case"number:lt":return t<i;case"number:lte":return t<=i;case"number:neq":return t!==i}}case"string":switch(e.operator.inputType){case"none":if(a.type!==e.operator.inputType)throw new Error("input type is not match");switch(e.operator.key){case"string:is_not_null":return null!=t&&""!==t;case"string:is_null":return null==t||""===t}case"single string":if(a.type!==e.operator.inputType)throw new Error("input type is not match");var o=a.payload.value;switch(e.operator.key){case"string:eq":return t===o;case"string:like":return r(t).includes(o);case"string:neq":return t!==o;case"string:not_like":return!r(t).includes(o)}}case"select":switch(e.operator.inputType){case"select":if(a.type!==e.operator.inputType)throw new Error("input type is not match");o=a.payload.value;switch(e.operator.key){case"select:eq":return t===o;case"select:neq":return t!==o}case"none":if(a.type!==e.operator.inputType)throw new Error("input type is not match");switch(e.operator.key){case"select:is_null":return null==t||""===t;case"select:is_not_null":return null!=t&&""!==t}}case"date":switch(e.operator.inputType){case"single date":if(a.type!==e.operator.inputType)throw new Error("input type is not match");var u=n(t),s=n(a.payload.value);if(null===u||null===s)return!1;switch(e.operator.key){case"date:eq":return u===s;case"date:neq":return u!==s;case"date:gt":return u>s;case"date:gte":return u>=s;case"date:lt":return u<s;case"date:lte":return u<=s}case"none":if(a.type!==e.operator.inputType)throw new Error("input type is not match");switch(e.operator.key){case"date:is_null":return null==t||""===t;case"date:is_not_null":return null!=t&&""!==t}}case"datetime":switch(e.operator.inputType){case"single datetime":if(a.type!==e.operator.inputType)throw new Error("input type is not match");var c=a.payload.value;switch(e.operator.key){case"datetime:gt":return t>c;case"datetime:gte":return t>=c;case"datetime:lt":return t<c;case"datetime:lte":return t<=c}case"none":if(a.type!==e.operator.inputType)throw new Error("input type is not match");switch(e.operator.key){case"datetime:is_null":return null==t||""===t;case"datetime:is_not_null":return null!=t&&""!==t}}}}exports.isMatchCondition=a,exports.useFilterHook=function(r){var n=e.useReducer(t.filterReducer,{conditions:r}),i=n[0],o=n[1],u=e.useMemo((function(){return{addFilter:function(e){o({type:"add",payload:{condition:e}})},removeFilter:function(e){o({type:"remove",payload:{index:e}})},clearFilter:function(){o({type:"clear"})}}}),[i.conditions]),s=e.useMemo((function(){return{filter:function(e){return e.filter((function(e){return i.conditions.every((function(t){return a(t,e[t.target.key],t.input)}))}))}}}),[i.conditions]);return{state:i,actions:u,functions:s}};
1
+ "use strict";var e=require("react"),t=require("./reducer.js"),r=require("../../share/text/normalize.js");function n(e){return null==e?"":String(e)}function a(e){if(null==e||""===e)return null;var t=e instanceof Date?e:new Date(e);return isNaN(t.getTime())?null:1e4*t.getFullYear()+100*(t.getMonth()+1)+t.getDate()}function i(e,t,i){switch(e.operator.type){case"number":if("single number"===e.operator.inputType){if(i.type!==e.operator.inputType)throw new Error("input type is not match");var o=i.payload.value;switch(e.operator.key){case"number:eq":return t===o;case"number:gt":return t>o;case"number:gte":return t>=o;case"number:lt":return t<o;case"number:lte":return t<=o;case"number:neq":return t!==o}}case"string":switch(e.operator.inputType){case"none":if(i.type!==e.operator.inputType)throw new Error("input type is not match");switch(e.operator.key){case"string:is_not_null":return null!=t&&""!==t;case"string:is_null":return null==t||""===t}case"single string":if(i.type!==e.operator.inputType)throw new Error("input type is not match");var u=i.payload.value;switch(e.operator.key){case"string:eq":return t===u;case"string:like":return r.normalizeForSearch(n(t)).includes(r.normalizeForSearch(u));case"string:neq":return t!==u;case"string:not_like":return!r.normalizeForSearch(n(t)).includes(r.normalizeForSearch(u))}}case"select":switch(e.operator.inputType){case"select":if(i.type!==e.operator.inputType)throw new Error("input type is not match");u=i.payload.value;switch(e.operator.key){case"select:eq":return t===u;case"select:neq":return t!==u}case"none":if(i.type!==e.operator.inputType)throw new Error("input type is not match");switch(e.operator.key){case"select:is_null":return null==t||""===t;case"select:is_not_null":return null!=t&&""!==t}}case"date":switch(e.operator.inputType){case"single date":if(i.type!==e.operator.inputType)throw new Error("input type is not match");var s=a(t),c=a(i.payload.value);if(null===s||null===c)return!1;switch(e.operator.key){case"date:eq":return s===c;case"date:neq":return s!==c;case"date:gt":return s>c;case"date:gte":return s>=c;case"date:lt":return s<c;case"date:lte":return s<=c}case"none":if(i.type!==e.operator.inputType)throw new Error("input type is not match");switch(e.operator.key){case"date:is_null":return null==t||""===t;case"date:is_not_null":return null!=t&&""!==t}}case"datetime":switch(e.operator.inputType){case"single datetime":if(i.type!==e.operator.inputType)throw new Error("input type is not match");var p=i.payload.value;switch(e.operator.key){case"datetime:gt":return t>p;case"datetime:gte":return t>=p;case"datetime:lt":return t<p;case"datetime:lte":return t<=p}case"none":if(i.type!==e.operator.inputType)throw new Error("input type is not match");switch(e.operator.key){case"datetime:is_null":return null==t||""===t;case"datetime:is_not_null":return null!=t&&""!==t}}}}exports.isMatchCondition=i,exports.useFilterHook=function(r){var n=e.useReducer(t.filterReducer,{conditions:r}),a=n[0],o=n[1],u=e.useMemo((function(){return{addFilter:function(e){o({type:"add",payload:{condition:e}})},removeFilter:function(e){o({type:"remove",payload:{index:e}})},clearFilter:function(){o({type:"clear"})}}}),[a.conditions]),s=e.useMemo((function(){return{filter:function(e){return e.filter((function(e){return a.conditions.every((function(t){return i(t,e[t.target.key],t.input)}))}))}}}),[a.conditions]);return{state:a,actions:u,functions:s}};
2
2
  //# sourceMappingURL=hook.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"hook.js","sources":["../../../../../src/table/filter-v2/hook.ts"],"sourcesContent":["import { useMemo, useReducer } from \"react\";\nimport { TFilterHook } from \"./type\";\nimport { filterReducer } from \"./reducer\";\nimport { Condition } from \"../../search-bar\";\nimport { DataObject, DataRecord } from \"../table/type\";\nimport { SearchInput } from \"../../search-bar/condition-search-bar/condition-input-management/type\";\n\nexport const useFilterHook: TFilterHook = (initialConditions) => {\n const [state, dispatch] = useReducer(filterReducer, {\n conditions: initialConditions,\n });\n\n const actions = useMemo(\n () => ({\n addFilter: (condition: Condition) => {\n dispatch({ type: \"add\", payload: { condition } });\n },\n removeFilter: (index: number) => {\n dispatch({ type: \"remove\", payload: { index } });\n },\n clearFilter: () => {\n dispatch({ type: \"clear\" });\n },\n }),\n [state.conditions]\n );\n\n const functions = useMemo(\n () => ({\n filter: <T extends DataRecord>(rows: DataObject<T>[]) => {\n return rows.filter((row) => {\n return state.conditions.every((condition) => {\n const value = row[condition.target.key];\n return isMatchCondition(condition, value, condition.input);\n });\n });\n },\n }),\n [state.conditions]\n );\n\n return {\n state,\n actions,\n functions,\n };\n};\n\nfunction toText(value: unknown): string {\n return value === null || value === undefined ? \"\" : String(value);\n}\n\n/** Returns a number like 20240101 for the local calendar day, or null. */\nfunction toDayNumber(value: unknown): number | null {\n if (value === null || value === undefined || value === \"\") return null;\n\n const date = value instanceof Date ? value : new Date(value as string);\n if (isNaN(date.getTime())) return null;\n\n return (\n date.getFullYear() * 10000 + (date.getMonth() + 1) * 100 + date.getDate()\n );\n}\n\n/** Exported for tests. */\nexport function isMatchCondition(\n condition: Condition,\n targetValue: any,\n input: SearchInput\n): boolean {\n switch (condition.operator.type) {\n case \"number\":\n switch (condition.operator.inputType) {\n case \"single number\":\n if (input.type !== condition.operator.inputType) {\n throw new Error(\"input type is not match\");\n }\n\n const numValue = input.payload.value;\n\n switch (condition.operator.key) {\n case \"number:eq\":\n return targetValue === numValue;\n case \"number:gt\":\n return targetValue > numValue;\n case \"number:gte\":\n return targetValue >= numValue;\n case \"number:lt\":\n return targetValue < numValue;\n case \"number:lte\":\n return targetValue <= numValue;\n case \"number:neq\":\n return targetValue !== numValue;\n }\n }\n\n case \"string\":\n switch (condition.operator.inputType) {\n case \"none\":\n if (input.type !== condition.operator.inputType) {\n throw new Error(\"input type is not match\");\n }\n\n switch (condition.operator.key) {\n case \"string:is_not_null\":\n return (\n targetValue !== null &&\n targetValue !== undefined &&\n targetValue !== \"\"\n );\n case \"string:is_null\":\n return (\n targetValue === null ||\n targetValue === undefined ||\n targetValue === \"\"\n );\n }\n case \"single string\":\n if (input.type !== condition.operator.inputType) {\n throw new Error(\"input type is not match\");\n }\n\n const value = input.payload.value;\n\n switch (condition.operator.key) {\n case \"string:eq\":\n return targetValue === value;\n case \"string:like\":\n return toText(targetValue).includes(value);\n case \"string:neq\":\n return targetValue !== value;\n case \"string:not_like\":\n return !toText(targetValue).includes(value);\n }\n }\n\n case \"select\":\n switch (condition.operator.inputType) {\n case \"select\":\n if (input.type !== condition.operator.inputType) {\n throw new Error(\"input type is not match\");\n }\n\n const value = input.payload.value;\n\n switch (condition.operator.key) {\n case \"select:eq\":\n return targetValue === value;\n case \"select:neq\":\n return targetValue !== value;\n }\n case \"none\":\n if (input.type !== condition.operator.inputType) {\n throw new Error(\"input type is not match\");\n }\n\n switch (condition.operator.key) {\n case \"select:is_null\":\n return (\n targetValue === null ||\n targetValue === undefined ||\n targetValue === \"\"\n );\n case \"select:is_not_null\":\n return (\n targetValue !== null &&\n targetValue !== undefined &&\n targetValue !== \"\"\n );\n }\n }\n case \"date\":\n switch (condition.operator.inputType) {\n case \"single date\":\n if (input.type !== condition.operator.inputType) {\n throw new Error(\"input type is not match\");\n }\n\n // Compare by calendar day, so a row at 10:30 on Jan 1 counts as\n // \"Jan 1\" for every operator, not only for \"=\".\n const targetDay = toDayNumber(targetValue);\n const inputDay = toDayNumber(input.payload.value);\n\n if (targetDay === null || inputDay === null) {\n return false;\n }\n\n switch (condition.operator.key) {\n case \"date:eq\":\n return targetDay === inputDay;\n case \"date:neq\":\n return targetDay !== inputDay;\n case \"date:gt\":\n return targetDay > inputDay;\n case \"date:gte\":\n return targetDay >= inputDay;\n case \"date:lt\":\n return targetDay < inputDay;\n case \"date:lte\":\n return targetDay <= inputDay;\n }\n case \"none\":\n if (input.type !== condition.operator.inputType) {\n throw new Error(\"input type is not match\");\n }\n\n switch (condition.operator.key) {\n case \"date:is_null\":\n return (\n targetValue === null ||\n targetValue === undefined ||\n targetValue === \"\"\n );\n case \"date:is_not_null\":\n return (\n targetValue !== null &&\n targetValue !== undefined &&\n targetValue !== \"\"\n );\n }\n }\n case \"datetime\":\n switch (condition.operator.inputType) {\n case \"single datetime\":\n if (input.type !== condition.operator.inputType) {\n throw new Error(\"input type is not match\");\n }\n\n const dateValue = input.payload.value;\n\n switch (condition.operator.key) {\n case \"datetime:gt\":\n return targetValue > dateValue;\n case \"datetime:gte\":\n return targetValue >= dateValue;\n case \"datetime:lt\":\n return targetValue < dateValue;\n case \"datetime:lte\":\n return targetValue <= dateValue;\n }\n case \"none\":\n if (input.type !== condition.operator.inputType) {\n throw new Error(\"input type is not match\");\n }\n\n switch (condition.operator.key) {\n case \"datetime:is_null\":\n return (\n targetValue === null ||\n targetValue === undefined ||\n targetValue === \"\"\n );\n case \"datetime:is_not_null\":\n return (\n targetValue !== null &&\n targetValue !== undefined &&\n targetValue !== \"\"\n );\n }\n }\n }\n}\n"],"names":["toText","value","String","toDayNumber","date","Date","isNaN","getTime","getFullYear","getMonth","getDate","isMatchCondition","condition","targetValue","input","operator","type","inputType","Error","numValue","payload","key","includes","targetDay","inputDay","dateValue","initialConditions","_a","useReducer","filterReducer","conditions","state","dispatch","actions","useMemo","addFilter","removeFilter","index","clearFilter","functions","filter","rows","row","every","target"],"mappings":"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"}
1
+ {"version":3,"file":"hook.js","sources":["../../../../../src/table/filter-v2/hook.ts"],"sourcesContent":["import { useMemo, useReducer } from \"react\";\nimport { TFilterHook } from \"./type\";\nimport { filterReducer } from \"./reducer\";\nimport { Condition } from \"../../search-bar\";\nimport { DataObject, DataRecord } from \"../table/type\";\nimport { normalizeForSearch } from \"../../share/text/normalize\";\nimport { SearchInput } from \"../../search-bar/condition-search-bar/condition-input-management/type\";\n\nexport const useFilterHook: TFilterHook = (initialConditions) => {\n const [state, dispatch] = useReducer(filterReducer, {\n conditions: initialConditions,\n });\n\n const actions = useMemo(\n () => ({\n addFilter: (condition: Condition) => {\n dispatch({ type: \"add\", payload: { condition } });\n },\n removeFilter: (index: number) => {\n dispatch({ type: \"remove\", payload: { index } });\n },\n clearFilter: () => {\n dispatch({ type: \"clear\" });\n },\n }),\n [state.conditions]\n );\n\n const functions = useMemo(\n () => ({\n filter: <T extends DataRecord>(rows: DataObject<T>[]) => {\n return rows.filter((row) => {\n return state.conditions.every((condition) => {\n const value = row[condition.target.key];\n return isMatchCondition(condition, value, condition.input);\n });\n });\n },\n }),\n [state.conditions]\n );\n\n return {\n state,\n actions,\n functions,\n };\n};\n\nfunction toText(value: unknown): string {\n return value === null || value === undefined ? \"\" : String(value);\n}\n\n/** Returns a number like 20240101 for the local calendar day, or null. */\nfunction toDayNumber(value: unknown): number | null {\n if (value === null || value === undefined || value === \"\") return null;\n\n const date = value instanceof Date ? value : new Date(value as string);\n if (isNaN(date.getTime())) return null;\n\n return (\n date.getFullYear() * 10000 + (date.getMonth() + 1) * 100 + date.getDate()\n );\n}\n\n/** Exported for tests. */\nexport function isMatchCondition(\n condition: Condition,\n targetValue: any,\n input: SearchInput\n): boolean {\n switch (condition.operator.type) {\n case \"number\":\n switch (condition.operator.inputType) {\n case \"single number\":\n if (input.type !== condition.operator.inputType) {\n throw new Error(\"input type is not match\");\n }\n\n const numValue = input.payload.value;\n\n switch (condition.operator.key) {\n case \"number:eq\":\n return targetValue === numValue;\n case \"number:gt\":\n return targetValue > numValue;\n case \"number:gte\":\n return targetValue >= numValue;\n case \"number:lt\":\n return targetValue < numValue;\n case \"number:lte\":\n return targetValue <= numValue;\n case \"number:neq\":\n return targetValue !== numValue;\n }\n }\n\n case \"string\":\n switch (condition.operator.inputType) {\n case \"none\":\n if (input.type !== condition.operator.inputType) {\n throw new Error(\"input type is not match\");\n }\n\n switch (condition.operator.key) {\n case \"string:is_not_null\":\n return (\n targetValue !== null &&\n targetValue !== undefined &&\n targetValue !== \"\"\n );\n case \"string:is_null\":\n return (\n targetValue === null ||\n targetValue === undefined ||\n targetValue === \"\"\n );\n }\n case \"single string\":\n if (input.type !== condition.operator.inputType) {\n throw new Error(\"input type is not match\");\n }\n\n const value = input.payload.value;\n\n switch (condition.operator.key) {\n case \"string:eq\":\n return targetValue === value;\n case \"string:like\":\n return normalizeForSearch(toText(targetValue)).includes(\n normalizeForSearch(value)\n );\n case \"string:neq\":\n return targetValue !== value;\n case \"string:not_like\":\n return !normalizeForSearch(toText(targetValue)).includes(\n normalizeForSearch(value)\n );\n }\n }\n\n case \"select\":\n switch (condition.operator.inputType) {\n case \"select\":\n if (input.type !== condition.operator.inputType) {\n throw new Error(\"input type is not match\");\n }\n\n const value = input.payload.value;\n\n switch (condition.operator.key) {\n case \"select:eq\":\n return targetValue === value;\n case \"select:neq\":\n return targetValue !== value;\n }\n case \"none\":\n if (input.type !== condition.operator.inputType) {\n throw new Error(\"input type is not match\");\n }\n\n switch (condition.operator.key) {\n case \"select:is_null\":\n return (\n targetValue === null ||\n targetValue === undefined ||\n targetValue === \"\"\n );\n case \"select:is_not_null\":\n return (\n targetValue !== null &&\n targetValue !== undefined &&\n targetValue !== \"\"\n );\n }\n }\n case \"date\":\n switch (condition.operator.inputType) {\n case \"single date\":\n if (input.type !== condition.operator.inputType) {\n throw new Error(\"input type is not match\");\n }\n\n // Compare by calendar day, so a row at 10:30 on Jan 1 counts as\n // \"Jan 1\" for every operator, not only for \"=\".\n const targetDay = toDayNumber(targetValue);\n const inputDay = toDayNumber(input.payload.value);\n\n if (targetDay === null || inputDay === null) {\n return false;\n }\n\n switch (condition.operator.key) {\n case \"date:eq\":\n return targetDay === inputDay;\n case \"date:neq\":\n return targetDay !== inputDay;\n case \"date:gt\":\n return targetDay > inputDay;\n case \"date:gte\":\n return targetDay >= inputDay;\n case \"date:lt\":\n return targetDay < inputDay;\n case \"date:lte\":\n return targetDay <= inputDay;\n }\n case \"none\":\n if (input.type !== condition.operator.inputType) {\n throw new Error(\"input type is not match\");\n }\n\n switch (condition.operator.key) {\n case \"date:is_null\":\n return (\n targetValue === null ||\n targetValue === undefined ||\n targetValue === \"\"\n );\n case \"date:is_not_null\":\n return (\n targetValue !== null &&\n targetValue !== undefined &&\n targetValue !== \"\"\n );\n }\n }\n case \"datetime\":\n switch (condition.operator.inputType) {\n case \"single datetime\":\n if (input.type !== condition.operator.inputType) {\n throw new Error(\"input type is not match\");\n }\n\n const dateValue = input.payload.value;\n\n switch (condition.operator.key) {\n case \"datetime:gt\":\n return targetValue > dateValue;\n case \"datetime:gte\":\n return targetValue >= dateValue;\n case \"datetime:lt\":\n return targetValue < dateValue;\n case \"datetime:lte\":\n return targetValue <= dateValue;\n }\n case \"none\":\n if (input.type !== condition.operator.inputType) {\n throw new Error(\"input type is not match\");\n }\n\n switch (condition.operator.key) {\n case \"datetime:is_null\":\n return (\n targetValue === null ||\n targetValue === undefined ||\n targetValue === \"\"\n );\n case \"datetime:is_not_null\":\n return (\n targetValue !== null &&\n targetValue !== undefined &&\n targetValue !== \"\"\n );\n }\n }\n }\n}\n"],"names":["toText","value","String","toDayNumber","date","Date","isNaN","getTime","getFullYear","getMonth","getDate","isMatchCondition","condition","targetValue","input","operator","type","inputType","Error","numValue","payload","key","normalizeForSearch","includes","targetDay","inputDay","dateValue","initialConditions","_a","useReducer","filterReducer","conditions","state","dispatch","actions","useMemo","addFilter","removeFilter","index","clearFilter","functions","filter","rows","row","every","target"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- "use strict";function e(e){var n="入力値が不正のため、エラーを確認し修正してください。\n\n";n+="[対象の列名]: ".concat(e[0].label,"\n"),n+="[入力値]  : ".concat(e[0].value,"\n\n"),n+="[エラー内容]:",n+=e.reduce((function(e,n){switch(n.type){case"STRING_IS_TOO_LONG":return e+"\n・文字数が最大の長さ".concat(n.maxLength,"文字を超えています。(現在").concat(n.currentLength,"文字)");case"STRING_IS_TOO_SHORT":return e+"\n・文字数が最小の長さ".concat(n.minLength,"文字に満たないです。(現在").concat(n.currentLength,"文字)");case"STRING_PATTERN_NOT_MATCH":return e+"\n・パターンに一致しません。(パターン".concat(n.pattern,")");case"NUMBER_IS_TOO_LARGE":return e+"\n・最大値".concat(n.max,"を超えています。(入力値").concat(n.value,")");case"NUMBER_IS_TOO_SMALL":return e+"\n・最小値".concat(n.min,"を下回っています。(入力値").concat(n.value,")");case"NOT_NUMBER":return e+"\n・数値ではない値が入力されています。";case"NOT_IN_OPTIONS":return e+"\n・選択肢に含まれていない値です。";case"NOT_DATE":return e+"\n・日付の形式ではありません。";case"NOT_DATETIME":return e+"\n・日時の形式ではありません。"}}),""),alert(n)}exports.generateValidateFunction=function(n,t){if("string"===n.type)return function(n,t,r,a){return function(n){var u=[];return(null==r?void 0:r.maxLength)&&n.length>r.maxLength&&u.push({type:"STRING_IS_TOO_LONG",label:t,maxLength:r.maxLength,currentLength:n.length,value:n}),(null==r?void 0:r.minLength)&&n.length<r.minLength&&u.push({type:"STRING_IS_TOO_SHORT",label:t,minLength:r.minLength,currentLength:n.length,value:n}),(null==r?void 0:r.pattern)&&(new RegExp(r.pattern).test(n)||u.push({type:"STRING_PATTERN_NOT_MATCH",label:t,pattern:r.pattern,value:n})),!(u.length>0&&(a?a(u):e(u),1))}}(n.key,n.label,n.constraints,t);if("number"===n.type)return function(n,t,r,a){return function(n){var u=[];return"string"!=typeof n||/^-?[0-9]+(\.[0-9]+)?$/.test(n)?(n=Number(n),"number"==typeof(null==r?void 0:r.max)&&n>r.max&&u.push({type:"NUMBER_IS_TOO_LARGE",label:t,max:r.max,value:n}),"number"==typeof(null==r?void 0:r.min)&&n<r.min&&u.push({type:"NUMBER_IS_TOO_SMALL",label:t,min:r.min,value:n}),!(u.length>0&&(a?a(u):e(u),1))):(u.push({type:"NOT_NUMBER",label:t,value:n}),a?a(u):e(u),!1)}}(n.key,n.label,n.constraints,t);if("select"===n.type)return function(n,t,r,a,u){var l=new Set(r.map((function(e){return e.label})));return function(n){if(a&&""===n)return!0;var r=[];return l.has(n)||r.push({type:"NOT_IN_OPTIONS",label:t,value:n,options:Array.from(l)}),!(r.length>0&&(u?u(r):e(r),1))}}(n.key,n.label,n.options,n.allowEmpty,t);if("date"===n.type)return function(n,t,r){return function(n){var a=[];return isNaN(new Date(n).getTime())&&a.push({type:"NOT_DATE",label:t,value:n}),!(a.length>0&&(r?r(a):e(a),1))}}(n.key,n.label,t);if("datetime"===n.type)return function(n,t,r){return function(n){var a=[];return isNaN(new Date(n).getTime())&&a.push({type:"NOT_DATETIME",label:t,value:n}),!(a.length>0&&(r?r(a):e(a),1))}}(n.key,n.label,t);throw new Error("Invalid type")};
1
+ "use strict";var e=require("../locale/messages.js");function t(t){alert(e.MESSAGES.ja.validation(t))}exports.generateValidateFunction=function(e,n){if("string"===e.type)return function(e,n,r,l){return function(e){var a=[];return(null==r?void 0:r.maxLength)&&e.length>r.maxLength&&a.push({type:"STRING_IS_TOO_LONG",label:n,maxLength:r.maxLength,currentLength:e.length,value:e}),(null==r?void 0:r.minLength)&&e.length<r.minLength&&a.push({type:"STRING_IS_TOO_SHORT",label:n,minLength:r.minLength,currentLength:e.length,value:e}),(null==r?void 0:r.pattern)&&(new RegExp(r.pattern).test(e)||a.push({type:"STRING_PATTERN_NOT_MATCH",label:n,pattern:r.pattern,value:e})),!(a.length>0&&(l?l(a):t(a),1))}}(e.key,e.label,e.constraints,n);if("number"===e.type)return function(e,n,r,l){return function(e){var a=[];return"string"!=typeof e||/^-?[0-9]+(\.[0-9]+)?$/.test(e)?(e=Number(e),"number"==typeof(null==r?void 0:r.max)&&e>r.max&&a.push({type:"NUMBER_IS_TOO_LARGE",label:n,max:r.max,value:e}),"number"==typeof(null==r?void 0:r.min)&&e<r.min&&a.push({type:"NUMBER_IS_TOO_SMALL",label:n,min:r.min,value:e}),!(a.length>0&&(l?l(a):t(a),1))):(a.push({type:"NOT_NUMBER",label:n,value:e}),l?l(a):t(a),!1)}}(e.key,e.label,e.constraints,n);if("select"===e.type)return function(e,n,r,l,a){var u=new Set(r.map((function(e){return e.label})));return function(e){if(l&&""===e)return!0;var r=[];return u.has(e)||r.push({type:"NOT_IN_OPTIONS",label:n,value:e,options:Array.from(u)}),!(r.length>0&&(a?a(r):t(r),1))}}(e.key,e.label,e.options,e.allowEmpty,n);if("date"===e.type)return function(e,n,r){return function(e){var l=[];return isNaN(new Date(e).getTime())&&l.push({type:"NOT_DATE",label:n,value:e}),!(l.length>0&&(r?r(l):t(l),1))}}(e.key,e.label,n);if("datetime"===e.type)return function(e,n,r){return function(e){var l=[];return isNaN(new Date(e).getTime())&&l.push({type:"NOT_DATETIME",label:n,value:e}),!(l.length>0&&(r?r(l):t(l),1))}}(e.key,e.label,n);throw new Error("Invalid type")};
2
2
  //# sourceMappingURL=generate-validate-function.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"generate-validate-function.js","sources":["../../../../../src/table/libs/generate-validate-function.ts"],"sourcesContent":["export type TStringValidateOption = {\n maxLength?: number;\n minLength?: number;\n pattern?: string;\n};\n\nexport type TNumberValidateOption = {\n max?: number;\n min?: number;\n};\n\ntype TPropsGenerateValidateFunction = {\n key: string;\n label: string;\n} & (\n | {\n type: \"string\";\n constraints?: TStringValidateOption;\n }\n | {\n type: \"number\";\n constraints?: TNumberValidateOption;\n }\n | {\n type: \"select\";\n options: { value: string; label: string }[];\n allowEmpty?: boolean;\n }\n | {\n type: \"date\";\n }\n | {\n type: \"datetime\";\n }\n);\n\ntype TStringValidateFunction = (value: string) => boolean;\n\nexport type TErrorValidation = {\n label: string;\n value: string | number;\n} & (\n | {\n type: \"STRING_IS_TOO_LONG\";\n maxLength: number;\n currentLength: number;\n }\n | {\n type: \"STRING_IS_TOO_SHORT\";\n minLength: number;\n currentLength: number;\n }\n | {\n type: \"STRING_PATTERN_NOT_MATCH\";\n pattern: string;\n }\n | {\n type: \"NUMBER_IS_TOO_LARGE\";\n max: number;\n }\n | {\n type: \"NUMBER_IS_TOO_SMALL\";\n min: number;\n }\n | {\n type: \"NOT_NUMBER\";\n }\n | {\n type: \"NOT_IN_OPTIONS\";\n options: string[];\n }\n | {\n type: \"NOT_DATE\";\n }\n | {\n type: \"NOT_DATETIME\";\n }\n);\n\nfunction defaultErrorHandler(errors: TErrorValidation[]) {\n let message = `入力値が不正のため、エラーを確認し修正してください。\\n\\n`;\n message += `[対象の列名]: ${errors[0].label}\\n`;\n message += `[入力値]  : ${errors[0].value}\\n\\n`;\n message += `[エラー内容]:`;\n\n message += errors.reduce((acc, error) => {\n switch (error.type) {\n case \"STRING_IS_TOO_LONG\":\n return (\n acc +\n `\\n・文字数が最大の長さ${error.maxLength}文字を超えています。(現在${error.currentLength}文字)`\n );\n case \"STRING_IS_TOO_SHORT\":\n return (\n acc +\n `\\n・文字数が最小の長さ${error.minLength}文字に満たないです。(現在${error.currentLength}文字)`\n );\n case \"STRING_PATTERN_NOT_MATCH\":\n return acc + `\\n・パターンに一致しません。(パターン${error.pattern})`;\n case \"NUMBER_IS_TOO_LARGE\":\n return (\n acc + `\\n・最大値${error.max}を超えています。(入力値${error.value})`\n );\n case \"NUMBER_IS_TOO_SMALL\":\n return (\n acc + `\\n・最小値${error.min}を下回っています。(入力値${error.value})`\n );\n case \"NOT_NUMBER\":\n return acc + `\\n・数値ではない値が入力されています。`;\n case \"NOT_IN_OPTIONS\":\n return acc + `\\n・選択肢に含まれていない値です。`;\n case \"NOT_DATE\":\n return acc + `\\n・日付の形式ではありません。`;\n case \"NOT_DATETIME\":\n return acc + `\\n・日時の形式ではありません。`;\n }\n }, \"\");\n\n alert(message);\n}\n\nfunction generateStringValidateFunction(\n key: string,\n label: string,\n constraints?: TStringValidateOption,\n errorHandler?: (errors: TErrorValidation[]) => void\n): TStringValidateFunction {\n return (value: string) => {\n const errors: TErrorValidation[] = [];\n\n if (constraints?.maxLength) {\n if (value.length > constraints.maxLength) {\n errors.push({\n type: \"STRING_IS_TOO_LONG\",\n label,\n maxLength: constraints.maxLength,\n currentLength: value.length,\n value,\n });\n }\n }\n\n if (constraints?.minLength) {\n if (value.length < constraints.minLength) {\n errors.push({\n type: \"STRING_IS_TOO_SHORT\",\n label,\n minLength: constraints.minLength,\n currentLength: value.length,\n value,\n });\n }\n }\n\n if (constraints?.pattern) {\n if (!new RegExp(constraints.pattern).test(value)) {\n errors.push({\n type: \"STRING_PATTERN_NOT_MATCH\",\n label,\n pattern: constraints.pattern,\n value,\n });\n }\n }\n\n if (errors.length > 0) {\n if (errorHandler) {\n errorHandler(errors);\n } else {\n defaultErrorHandler(errors);\n }\n return false;\n }\n\n return true;\n };\n}\n\ntype TNumberValidateFunction = (value: number) => boolean;\n\nfunction generateNumberValidateFunction(\n key: string,\n label: string,\n constraints?: TNumberValidateOption,\n errorHandler?: (errors: TErrorValidation[]) => void\n): TNumberValidateFunction {\n return (value: number | string) => {\n const errors: TErrorValidation[] = [];\n\n if (typeof value === \"string\") {\n // 小数も含めて数値に変換可能な値かを検査\n if (!/^-?[0-9]+(\\.[0-9]+)?$/.test(value)) {\n errors.push({\n type: \"NOT_NUMBER\",\n label,\n value,\n });\n\n if (errorHandler) {\n errorHandler(errors);\n } else {\n defaultErrorHandler(errors);\n }\n return false;\n }\n }\n\n value = Number(value);\n\n if (typeof constraints?.max === \"number\") {\n if (value > constraints.max) {\n errors.push({\n type: \"NUMBER_IS_TOO_LARGE\",\n label,\n max: constraints.max,\n value,\n });\n }\n }\n\n if (typeof constraints?.min === \"number\") {\n if (value < constraints.min) {\n errors.push({\n type: \"NUMBER_IS_TOO_SMALL\",\n label,\n min: constraints.min,\n value,\n });\n }\n }\n\n if (errors.length > 0) {\n if (errorHandler) {\n errorHandler(errors);\n } else {\n defaultErrorHandler(errors);\n }\n return false;\n }\n\n return true;\n };\n}\n\ntype TSelectValidateFunction = (label: string) => boolean;\n\nfunction generatSelectValidateFunction(\n key: string,\n columnLabel: string,\n options: { value: string; label: string }[],\n allowEmpty?: boolean,\n errorHandler?: (errors: TErrorValidation[]) => void\n): TSelectValidateFunction {\n const labelSets = new Set(options.map((option) => option.label));\n return (label: string) => {\n if (allowEmpty && label === \"\") {\n return true;\n }\n\n const errors: TErrorValidation[] = [];\n\n if (!labelSets.has(label)) {\n errors.push({\n type: \"NOT_IN_OPTIONS\",\n label: columnLabel,\n value: label,\n options: Array.from(labelSets),\n });\n }\n\n if (errors.length > 0) {\n if (errorHandler) {\n errorHandler(errors);\n } else {\n defaultErrorHandler(errors);\n }\n return false;\n }\n\n return true;\n };\n}\n\ntype TDateValidateFunction = (label: string) => boolean;\n\nfunction generatDateValidateFunction(\n key: string,\n columnLabel: string,\n errorHandler?: (errors: TErrorValidation[]) => void\n): TDateValidateFunction {\n return (value: string) => {\n const errors: TErrorValidation[] = [];\n\n if (isNaN(new Date(value).getTime())) {\n errors.push({\n type: \"NOT_DATE\",\n label: columnLabel,\n value,\n });\n }\n\n if (errors.length > 0) {\n if (errorHandler) {\n errorHandler(errors);\n } else {\n defaultErrorHandler(errors);\n }\n return false;\n }\n\n return true;\n };\n}\n\ntype TDatetimeValidateFunction = (label: string) => boolean;\n\nfunction generatDatetimeValidateFunction(\n key: string,\n columnLabel: string,\n errorHandler?: (errors: TErrorValidation[]) => void\n): TDatetimeValidateFunction {\n return (value: string) => {\n const errors: TErrorValidation[] = [];\n\n if (isNaN(new Date(value).getTime())) {\n errors.push({\n type: \"NOT_DATETIME\",\n label: columnLabel,\n value,\n });\n }\n\n if (errors.length > 0) {\n if (errorHandler) {\n errorHandler(errors);\n } else {\n defaultErrorHandler(errors);\n }\n return false;\n }\n\n return true;\n };\n}\n\nexport function generateValidateFunction(\n props: TPropsGenerateValidateFunction,\n errorHandler?: (errors: TErrorValidation[]) => void\n) {\n if (props.type === \"string\") {\n return generateStringValidateFunction(\n props.key,\n props.label,\n props.constraints,\n errorHandler\n );\n } else if (props.type === \"number\") {\n return generateNumberValidateFunction(\n props.key,\n props.label,\n props.constraints,\n errorHandler\n );\n } else if (props.type === \"select\") {\n return generatSelectValidateFunction(\n props.key,\n props.label,\n props.options,\n props.allowEmpty,\n errorHandler\n );\n } else if (props.type === \"date\") {\n return generatDateValidateFunction(props.key, props.label, errorHandler);\n } else if (props.type === \"datetime\") {\n return generatDatetimeValidateFunction(\n props.key,\n props.label,\n errorHandler\n );\n } else {\n throw new Error(\"Invalid type\");\n }\n}\n"],"names":["defaultErrorHandler","errors","message","label","value","reduce","acc","error","type","concat","maxLength","currentLength","minLength","pattern","max","min","alert","props","errorHandler","key","constraints","length","push","RegExp","test","generateStringValidateFunction","Number","generateNumberValidateFunction","columnLabel","options","allowEmpty","labelSets","Set","map","option","has","Array","from","generatSelectValidateFunction","isNaN","Date","getTime","generatDateValidateFunction","generatDatetimeValidateFunction","Error"],"mappings":"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"}
1
+ {"version":3,"file":"generate-validate-function.js","sources":["../../../../../src/table/libs/generate-validate-function.ts"],"sourcesContent":["import { MESSAGES } from \"../locale/messages\";\n\nexport type TStringValidateOption = {\n maxLength?: number;\n minLength?: number;\n pattern?: string;\n};\n\nexport type TNumberValidateOption = {\n max?: number;\n min?: number;\n};\n\ntype TPropsGenerateValidateFunction = {\n key: string;\n label: string;\n} & (\n | {\n type: \"string\";\n constraints?: TStringValidateOption;\n }\n | {\n type: \"number\";\n constraints?: TNumberValidateOption;\n }\n | {\n type: \"select\";\n options: { value: string; label: string }[];\n allowEmpty?: boolean;\n }\n | {\n type: \"date\";\n }\n | {\n type: \"datetime\";\n }\n);\n\ntype TStringValidateFunction = (value: string) => boolean;\n\nexport type TErrorValidation = {\n label: string;\n value: string | number;\n} & (\n | {\n type: \"STRING_IS_TOO_LONG\";\n maxLength: number;\n currentLength: number;\n }\n | {\n type: \"STRING_IS_TOO_SHORT\";\n minLength: number;\n currentLength: number;\n }\n | {\n type: \"STRING_PATTERN_NOT_MATCH\";\n pattern: string;\n }\n | {\n type: \"NUMBER_IS_TOO_LARGE\";\n max: number;\n }\n | {\n type: \"NUMBER_IS_TOO_SMALL\";\n min: number;\n }\n | {\n type: \"NOT_NUMBER\";\n }\n | {\n type: \"NOT_IN_OPTIONS\";\n options: string[];\n }\n | {\n type: \"NOT_DATE\";\n }\n | {\n type: \"NOT_DATETIME\";\n }\n);\n\n// Used when no errorHandler is given. The table passes its own handler with\n// the messages of its locale, so this is only a fallback.\nfunction defaultErrorHandler(errors: TErrorValidation[]) {\n alert(MESSAGES.ja.validation(errors));\n}\n\nfunction generateStringValidateFunction(\n key: string,\n label: string,\n constraints?: TStringValidateOption,\n errorHandler?: (errors: TErrorValidation[]) => void\n): TStringValidateFunction {\n return (value: string) => {\n const errors: TErrorValidation[] = [];\n\n if (constraints?.maxLength) {\n if (value.length > constraints.maxLength) {\n errors.push({\n type: \"STRING_IS_TOO_LONG\",\n label,\n maxLength: constraints.maxLength,\n currentLength: value.length,\n value,\n });\n }\n }\n\n if (constraints?.minLength) {\n if (value.length < constraints.minLength) {\n errors.push({\n type: \"STRING_IS_TOO_SHORT\",\n label,\n minLength: constraints.minLength,\n currentLength: value.length,\n value,\n });\n }\n }\n\n if (constraints?.pattern) {\n if (!new RegExp(constraints.pattern).test(value)) {\n errors.push({\n type: \"STRING_PATTERN_NOT_MATCH\",\n label,\n pattern: constraints.pattern,\n value,\n });\n }\n }\n\n if (errors.length > 0) {\n if (errorHandler) {\n errorHandler(errors);\n } else {\n defaultErrorHandler(errors);\n }\n return false;\n }\n\n return true;\n };\n}\n\ntype TNumberValidateFunction = (value: number) => boolean;\n\nfunction generateNumberValidateFunction(\n key: string,\n label: string,\n constraints?: TNumberValidateOption,\n errorHandler?: (errors: TErrorValidation[]) => void\n): TNumberValidateFunction {\n return (value: number | string) => {\n const errors: TErrorValidation[] = [];\n\n if (typeof value === \"string\") {\n // 小数も含めて数値に変換可能な値かを検査\n if (!/^-?[0-9]+(\\.[0-9]+)?$/.test(value)) {\n errors.push({\n type: \"NOT_NUMBER\",\n label,\n value,\n });\n\n if (errorHandler) {\n errorHandler(errors);\n } else {\n defaultErrorHandler(errors);\n }\n return false;\n }\n }\n\n value = Number(value);\n\n if (typeof constraints?.max === \"number\") {\n if (value > constraints.max) {\n errors.push({\n type: \"NUMBER_IS_TOO_LARGE\",\n label,\n max: constraints.max,\n value,\n });\n }\n }\n\n if (typeof constraints?.min === \"number\") {\n if (value < constraints.min) {\n errors.push({\n type: \"NUMBER_IS_TOO_SMALL\",\n label,\n min: constraints.min,\n value,\n });\n }\n }\n\n if (errors.length > 0) {\n if (errorHandler) {\n errorHandler(errors);\n } else {\n defaultErrorHandler(errors);\n }\n return false;\n }\n\n return true;\n };\n}\n\ntype TSelectValidateFunction = (label: string) => boolean;\n\nfunction generatSelectValidateFunction(\n key: string,\n columnLabel: string,\n options: { value: string; label: string }[],\n allowEmpty?: boolean,\n errorHandler?: (errors: TErrorValidation[]) => void\n): TSelectValidateFunction {\n const labelSets = new Set(options.map((option) => option.label));\n return (label: string) => {\n if (allowEmpty && label === \"\") {\n return true;\n }\n\n const errors: TErrorValidation[] = [];\n\n if (!labelSets.has(label)) {\n errors.push({\n type: \"NOT_IN_OPTIONS\",\n label: columnLabel,\n value: label,\n options: Array.from(labelSets),\n });\n }\n\n if (errors.length > 0) {\n if (errorHandler) {\n errorHandler(errors);\n } else {\n defaultErrorHandler(errors);\n }\n return false;\n }\n\n return true;\n };\n}\n\ntype TDateValidateFunction = (label: string) => boolean;\n\nfunction generatDateValidateFunction(\n key: string,\n columnLabel: string,\n errorHandler?: (errors: TErrorValidation[]) => void\n): TDateValidateFunction {\n return (value: string) => {\n const errors: TErrorValidation[] = [];\n\n if (isNaN(new Date(value).getTime())) {\n errors.push({\n type: \"NOT_DATE\",\n label: columnLabel,\n value,\n });\n }\n\n if (errors.length > 0) {\n if (errorHandler) {\n errorHandler(errors);\n } else {\n defaultErrorHandler(errors);\n }\n return false;\n }\n\n return true;\n };\n}\n\ntype TDatetimeValidateFunction = (label: string) => boolean;\n\nfunction generatDatetimeValidateFunction(\n key: string,\n columnLabel: string,\n errorHandler?: (errors: TErrorValidation[]) => void\n): TDatetimeValidateFunction {\n return (value: string) => {\n const errors: TErrorValidation[] = [];\n\n if (isNaN(new Date(value).getTime())) {\n errors.push({\n type: \"NOT_DATETIME\",\n label: columnLabel,\n value,\n });\n }\n\n if (errors.length > 0) {\n if (errorHandler) {\n errorHandler(errors);\n } else {\n defaultErrorHandler(errors);\n }\n return false;\n }\n\n return true;\n };\n}\n\nexport function generateValidateFunction(\n props: TPropsGenerateValidateFunction,\n errorHandler?: (errors: TErrorValidation[]) => void\n) {\n if (props.type === \"string\") {\n return generateStringValidateFunction(\n props.key,\n props.label,\n props.constraints,\n errorHandler\n );\n } else if (props.type === \"number\") {\n return generateNumberValidateFunction(\n props.key,\n props.label,\n props.constraints,\n errorHandler\n );\n } else if (props.type === \"select\") {\n return generatSelectValidateFunction(\n props.key,\n props.label,\n props.options,\n props.allowEmpty,\n errorHandler\n );\n } else if (props.type === \"date\") {\n return generatDateValidateFunction(props.key, props.label, errorHandler);\n } else if (props.type === \"datetime\") {\n return generatDatetimeValidateFunction(\n props.key,\n props.label,\n errorHandler\n );\n } else {\n throw new Error(\"Invalid type\");\n }\n}\n"],"names":["defaultErrorHandler","errors","alert","MESSAGES","ja","validation","props","errorHandler","type","key","label","constraints","value","maxLength","length","push","currentLength","minLength","pattern","RegExp","test","generateStringValidateFunction","Number","max","min","generateNumberValidateFunction","columnLabel","options","allowEmpty","labelSets","Set","map","option","has","Array","from","generatSelectValidateFunction","isNaN","Date","getTime","generatDateValidateFunction","generatDatetimeValidateFunction","Error"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ "use strict";var n={ja:{validation:function(n){var e="入力値が不正のため、エラーを確認し修正してください。\n\n";return e+="[対象の列名]: ".concat(n[0].label,"\n"),e+="[入力値]  : ".concat(n[0].value,"\n\n"),(e+="[エラー内容]:")+n.map((function(n){switch(n.type){case"STRING_IS_TOO_LONG":return"\n・文字数が最大の長さ".concat(n.maxLength,"文字を超えています。(現在").concat(n.currentLength,"文字)");case"STRING_IS_TOO_SHORT":return"\n・文字数が最小の長さ".concat(n.minLength,"文字に満たないです。(現在").concat(n.currentLength,"文字)");case"STRING_PATTERN_NOT_MATCH":return"\n・パターンに一致しません。(パターン".concat(n.pattern,")");case"NUMBER_IS_TOO_LARGE":return"\n・最大値".concat(n.max,"を超えています。(入力値").concat(n.value,")");case"NUMBER_IS_TOO_SMALL":return"\n・最小値".concat(n.min,"を下回っています。(入力値").concat(n.value,")");case"NOT_NUMBER":return"\n・数値ではない値が入力されています。";case"NOT_IN_OPTIONS":return"\n・選択肢に含まれていない値です。";case"NOT_DATE":return"\n・日付の形式ではありません。";case"NOT_DATETIME":return"\n・日時の形式ではありません。"}})).join("")},paste:{noData:"ペーストデータがありません。",notEnoughRows:"貼り付け先の行数が足りません。",notEnoughColumns:"貼り付け先の列数が足りません。",notEditableColumn:function(n){return"編集できない列にデータを貼り付けることはできません。\n\n編集不可列: ".concat(n)},invalidValue:function(n){return"バリデーションエラー: ".concat(n)}},copied:"コピーしました!!!",selectNone:"-- 未選択 --",selectClear:"-- 選択解除 --",selectPlaceholder:"選択してください"},en:{validation:function(n){var e="The value is not valid. Please check the errors and fix it.\n\n";return e+="[Column]: ".concat(n[0].label,"\n"),e+="[Value] : ".concat(n[0].value,"\n\n"),(e+="[Errors]:")+n.map((function(n){switch(n.type){case"STRING_IS_TOO_LONG":return"\n- Must be at most ".concat(n.maxLength," characters (currently ").concat(n.currentLength,").");case"STRING_IS_TOO_SHORT":return"\n- Must be at least ".concat(n.minLength," characters (currently ").concat(n.currentLength,").");case"STRING_PATTERN_NOT_MATCH":return"\n- Does not match the pattern ".concat(n.pattern,".");case"NUMBER_IS_TOO_LARGE":return"\n- Must be ".concat(n.max," or less (got ").concat(n.value,").");case"NUMBER_IS_TOO_SMALL":return"\n- Must be ".concat(n.min," or more (got ").concat(n.value,").");case"NOT_NUMBER":return"\n- Must be a number.";case"NOT_IN_OPTIONS":return"\n- Must be one of the options.";case"NOT_DATE":return"\n- Must be a date.";case"NOT_DATETIME":return"\n- Must be a date and time."}})).join("")},paste:{noData:"There is no data to paste.",notEnoughRows:"There are not enough rows to paste into.",notEnoughColumns:"There are not enough columns to paste into.",notEditableColumn:function(n){return"Data cannot be pasted into a column that is not editable.\n\nColumn: ".concat(n)},invalidValue:function(n){return"Invalid value: ".concat(n)}},copied:"Copied!",selectNone:"-- None --",selectClear:"-- Clear --",selectPlaceholder:"Select..."}};exports.MESSAGES=n;
2
+ //# sourceMappingURL=messages.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"messages.js","sources":["../../../../../src/table/locale/messages.ts"],"sourcesContent":["import type { TErrorValidation } from \"../libs/generate-validate-function\";\n\n/** Language of the messages the table shows by itself. */\nexport type TLocale = \"ja\" | \"en\";\n\nexport type TMessages = {\n /** Message shown by the default errorHandler (window.alert). */\n validation: (errors: TErrorValidation[]) => string;\n paste: {\n noData: string;\n notEnoughRows: string;\n notEnoughColumns: string;\n notEditableColumn: (column: string) => string;\n invalidValue: (value: string) => string;\n };\n copied: string;\n /** Empty option of a select cell when the cell is empty / has a value. */\n selectNone: string;\n selectClear: string;\n selectPlaceholder: string;\n};\n\nconst ja: TMessages = {\n validation: (errors) => {\n let message = `入力値が不正のため、エラーを確認し修正してください。\\n\\n`;\n message += `[対象の列名]: ${errors[0].label}\\n`;\n message += `[入力値]  : ${errors[0].value}\\n\\n`;\n message += `[エラー内容]:`;\n return (\n message +\n errors\n .map((error) => {\n switch (error.type) {\n case \"STRING_IS_TOO_LONG\":\n return `\\n・文字数が最大の長さ${error.maxLength}文字を超えています。(現在${error.currentLength}文字)`;\n case \"STRING_IS_TOO_SHORT\":\n return `\\n・文字数が最小の長さ${error.minLength}文字に満たないです。(現在${error.currentLength}文字)`;\n case \"STRING_PATTERN_NOT_MATCH\":\n return `\\n・パターンに一致しません。(パターン${error.pattern})`;\n case \"NUMBER_IS_TOO_LARGE\":\n return `\\n・最大値${error.max}を超えています。(入力値${error.value})`;\n case \"NUMBER_IS_TOO_SMALL\":\n return `\\n・最小値${error.min}を下回っています。(入力値${error.value})`;\n case \"NOT_NUMBER\":\n return `\\n・数値ではない値が入力されています。`;\n case \"NOT_IN_OPTIONS\":\n return `\\n・選択肢に含まれていない値です。`;\n case \"NOT_DATE\":\n return `\\n・日付の形式ではありません。`;\n case \"NOT_DATETIME\":\n return `\\n・日時の形式ではありません。`;\n }\n })\n .join(\"\")\n );\n },\n paste: {\n noData: \"ペーストデータがありません。\",\n notEnoughRows: \"貼り付け先の行数が足りません。\",\n notEnoughColumns: \"貼り付け先の列数が足りません。\",\n notEditableColumn: (column) =>\n `編集できない列にデータを貼り付けることはできません。\\n\\n編集不可列: ${column}`,\n invalidValue: (value) => `バリデーションエラー: ${value}`,\n },\n copied: \"コピーしました!!!\",\n selectNone: \"-- 未選択 --\",\n selectClear: \"-- 選択解除 --\",\n selectPlaceholder: \"選択してください\",\n};\n\nconst en: TMessages = {\n validation: (errors) => {\n let message = `The value is not valid. Please check the errors and fix it.\\n\\n`;\n message += `[Column]: ${errors[0].label}\\n`;\n message += `[Value] : ${errors[0].value}\\n\\n`;\n message += `[Errors]:`;\n return (\n message +\n errors\n .map((error) => {\n switch (error.type) {\n case \"STRING_IS_TOO_LONG\":\n return `\\n- Must be at most ${error.maxLength} characters (currently ${error.currentLength}).`;\n case \"STRING_IS_TOO_SHORT\":\n return `\\n- Must be at least ${error.minLength} characters (currently ${error.currentLength}).`;\n case \"STRING_PATTERN_NOT_MATCH\":\n return `\\n- Does not match the pattern ${error.pattern}.`;\n case \"NUMBER_IS_TOO_LARGE\":\n return `\\n- Must be ${error.max} or less (got ${error.value}).`;\n case \"NUMBER_IS_TOO_SMALL\":\n return `\\n- Must be ${error.min} or more (got ${error.value}).`;\n case \"NOT_NUMBER\":\n return `\\n- Must be a number.`;\n case \"NOT_IN_OPTIONS\":\n return `\\n- Must be one of the options.`;\n case \"NOT_DATE\":\n return `\\n- Must be a date.`;\n case \"NOT_DATETIME\":\n return `\\n- Must be a date and time.`;\n }\n })\n .join(\"\")\n );\n },\n paste: {\n noData: \"There is no data to paste.\",\n notEnoughRows: \"There are not enough rows to paste into.\",\n notEnoughColumns: \"There are not enough columns to paste into.\",\n notEditableColumn: (column) =>\n `Data cannot be pasted into a column that is not editable.\\n\\nColumn: ${column}`,\n invalidValue: (value) => `Invalid value: ${value}`,\n },\n copied: \"Copied!\",\n selectNone: \"-- None --\",\n selectClear: \"-- Clear --\",\n selectPlaceholder: \"Select...\",\n};\n\nexport const MESSAGES: Record<TLocale, TMessages> = { ja, en };\n"],"names":["MESSAGES","ja","validation","errors","message","label","value","map","error","type","concat","maxLength","currentLength","minLength","pattern","max","min","join","paste","noData","notEnoughRows","notEnoughColumns","notEditableColumn","column","invalidValue","copied","selectNone","selectClear","selectPlaceholder","en"],"mappings":"aAsBA,IAgGaA,EAAuC,CAAEC,GAhGhC,CACpBC,WAAY,SAACC,GACX,IAAIC,EAAU,iCAId,OAHAA,GAAW,mBAAYD,EAAO,GAAGE,MAAK,MACtCD,GAAW,mBAAYD,EAAO,GAAGG,MAAK,SACtCF,GAAW,YAGTD,EACGI,KAAI,SAACC,GACJ,OAAQA,EAAMC,MACZ,IAAK,qBACH,MAAO,eAAAC,OAAeF,EAAMG,kCAAyBH,EAAMI,cAAa,OAC1E,IAAK,sBACH,MAAO,eAAAF,OAAeF,EAAMK,kCAAyBL,EAAMI,cAAa,OAC1E,IAAK,2BACH,MAAO,uBAAAF,OAAuBF,EAAMM,aACtC,IAAK,sBACH,MAAO,SAAAJ,OAASF,EAAMO,2BAAkBP,EAAMF,MAAK,KACrD,IAAK,sBACH,MAAO,SAAAI,OAASF,EAAMQ,4BAAmBR,EAAMF,MAAK,KACtD,IAAK,aACH,MAAO,uBACT,IAAK,iBACH,MAAO,qBACT,IAAK,WACH,MAAO,mBACT,IAAK,eACH,MAAO,mBAEb,IACCW,KAAK,GAEZ,EACAC,MAAO,CACLC,OAAQ,iBACRC,cAAe,kBACfC,iBAAkB,kBAClBC,kBAAmB,SAACC,GAClB,MAAA,wCAAAb,OAAwCa,EAAxC,EACFC,aAAc,SAAClB,GAAU,MAAA,eAAAI,OAAeJ,EAAf,GAE3BmB,OAAQ,aACRC,WAAY,YACZC,YAAa,aACbC,kBAAmB,YAmDqCC,GAhDpC,CACpB3B,WAAY,SAACC,GACX,IAAIC,EAAU,kEAId,OAHAA,GAAW,oBAAaD,EAAO,GAAGE,MAAK,MACvCD,GAAW,oBAAaD,EAAO,GAAGG,MAAK,SACvCF,GAAW,aAGTD,EACGI,KAAI,SAACC,GACJ,OAAQA,EAAMC,MACZ,IAAK,qBACH,MAAO,uBAAAC,OAAuBF,EAAMG,4CAAmCH,EAAMI,cAAa,MAC5F,IAAK,sBACH,MAAO,wBAAAF,OAAwBF,EAAMK,4CAAmCL,EAAMI,cAAa,MAC7F,IAAK,2BACH,MAAO,kCAAAF,OAAkCF,EAAMM,aACjD,IAAK,sBACH,MAAO,eAAAJ,OAAeF,EAAMO,6BAAoBP,EAAMF,MAAK,MAC7D,IAAK,sBACH,MAAO,eAAAI,OAAeF,EAAMQ,6BAAoBR,EAAMF,MAAK,MAC7D,IAAK,aACH,MAAO,wBACT,IAAK,iBACH,MAAO,kCACT,IAAK,WACH,MAAO,sBACT,IAAK,eACH,MAAO,+BAEb,IACCW,KAAK,GAEZ,EACAC,MAAO,CACLC,OAAQ,6BACRC,cAAe,2CACfC,iBAAkB,8CAClBC,kBAAmB,SAACC,GAClB,MAAA,wEAAAb,OAAwEa,EAAxE,EACFC,aAAc,SAAClB,GAAU,MAAA,kBAAAI,OAAkBJ,EAAlB,GAE3BmB,OAAQ,UACRC,WAAY,aACZC,YAAa,cACbC,kBAAmB"}
@@ -0,0 +1,2 @@
1
+ "use strict";var e=require("react/jsx-runtime"),r=require("react"),t=require("./messages.js"),s=r.createContext("ja");exports.LocaleProvider=function(r){var t;return e.jsx(s.Provider,{value:null!==(t=r.locale)&&void 0!==t?t:"ja",children:r.children})},exports.useMessages=function(){return t.MESSAGES[r.useContext(s)]};
2
+ //# sourceMappingURL=provider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"provider.js","sources":["../../../../../src/table/locale/provider.tsx"],"sourcesContent":["import { createContext, useContext } from \"react\";\nimport { MESSAGES, TLocale, TMessages } from \"./messages\";\n\nconst LocaleContext = createContext<TLocale>(\"ja\");\n\nexport function LocaleProvider(props: {\n locale?: TLocale;\n children: React.ReactNode;\n}) {\n return (\n <LocaleContext.Provider value={props.locale ?? \"ja\"}>\n {props.children}\n </LocaleContext.Provider>\n );\n}\n\n/** Messages in the table's locale (Japanese by default). */\nexport function useMessages(): TMessages {\n return MESSAGES[useContext(LocaleContext)];\n}\n"],"names":["LocaleContext","createContext","props","_jsx","Provider","value","_a","locale","children","MESSAGES","useContext"],"mappings":"8FAGMA,EAAgBC,EAAAA,cAAuB,6BAEvC,SAAyBC,SAI7B,OACEC,EAAAA,IAACH,EAAcI,SAAQ,CAACC,MAAmB,QAAZC,EAAAJ,EAAMK,cAAM,IAAAD,EAAAA,EAAI,KAAIE,SAChDN,EAAMM,UAGb,iCAIE,OAAOC,EAAAA,SAASC,aAAWV,GAC7B"}
@@ -0,0 +1,2 @@
1
+ "use client";"use strict";var e=require("react/jsx-runtime"),t=require("react"),r=require("../../range/provider.js"),n=require("../../edit/provider.js"),i=require("../../sheet/providers.js"),o=require("../../id/provider.js"),u=require("../event-target.js"),a=require("../editor-input.js");exports.KeyCatcher=function(){var l,s,d,c=o.useTableIdGenerator(),v=r.useRangeStateContext(),p=n.useEditStateContext().isEditing,f=n.useEditActionContext().startEditing,g=i.useColumnsContext(),E=t.useRef(null),x=t.useState(!1),S=x[0],C=x[1],b=v.isSelecting&&!p;if(t.useEffect((function(){var e;b&&document.activeElement!==E.current&&(null===(e=E.current)||void 0===e||e.focus({preventScroll:!0}))}),[b,v]),!v.isSelecting||p)return null;var m=g[v.start.colIndex],y=v.start;return e.jsx("input",((l={ref:E})[u.KEY_CATCHER_ATTRIBUTE]="",l["aria-label"]=null!==(s=null==m?void 0:m.label)&&void 0!==s?s:String(null!==(d=null==m?void 0:m.key)&&void 0!==d?d:""),l.autoComplete="off",l.tabIndex=-1,l.className="absolute z-10 px-2 text-gray-900 outline-none ".concat(S?"bg-white border border-gray-500":"opacity-0"),l.style={top:y.yStart,left:y.xStart,width:y.xEnd-y.xStart,height:y.yEnd-y.yStart,pointerEvents:"none"},l.onCompositionStart=function(){C(!0)},l.onCompositionEnd=function(e){var t=e.data;C(!1),e.currentTarget.value="",t&&(null==m?void 0:m.editable)&&(f(),setTimeout((function(){a.setEditorInitialValue(t,c.getEditorId())}),10))},l.onInput=function(e){S||(e.currentTarget.value="")},l))};
2
+ //# sourceMappingURL=key-catcher.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"key-catcher.js","sources":["../../../../../../src/table/operation/components/key-catcher.tsx"],"sourcesContent":["\"use client\";\n\nimport { useEffect, useRef, useState } from \"react\";\nimport { useRangeStateContext } from \"../../range/provider\";\nimport { useEditActionContext, useEditStateContext } from \"../../edit/provider\";\nimport { useColumnsContext } from \"../../sheet/providers\";\nimport { useTableIdGenerator } from \"../../id\";\nimport { KEY_CATCHER_ATTRIBUTE } from \"../event-target\";\nimport { setEditorInitialValue } from \"../editor-input\";\n\n/**\n * A hidden input placed over the selected cell that holds the focus while a\n * cell is selected (and not being edited).\n *\n * Browsers only run an IME (e.g. Japanese input) while a text field has the\n * focus. Without this input, typing Japanese on a selected cell sent plain\n * letters and the first one was entered as is. While text is being composed\n * the input is shown over the cell, and when the composition is confirmed,\n * editing starts with the confirmed text.\n *\n * Other keys (arrows, copy, paste, ...) still reach the table's handlers.\n */\nexport function KeyCatcher() {\n const IdGenerator = useTableIdGenerator();\n const range = useRangeStateContext();\n const { isEditing } = useEditStateContext();\n const { startEditing } = useEditActionContext();\n const cols = useColumnsContext();\n const ref = useRef<HTMLInputElement>(null);\n const [isComposing, setIsComposing] = useState(false);\n\n const active = range.isSelecting && !isEditing;\n\n useEffect(() => {\n if (active && document.activeElement !== ref.current) {\n ref.current?.focus({ preventScroll: true });\n }\n }, [active, range]);\n\n if (!range.isSelecting || isEditing) {\n return null;\n }\n\n const col = cols[range.start.colIndex];\n const { start } = range;\n\n return (\n <input\n ref={ref}\n {...{ [KEY_CATCHER_ATTRIBUTE]: \"\" }}\n aria-label={col?.label ?? String(col?.key ?? \"\")}\n autoComplete=\"off\"\n tabIndex={-1}\n className={`absolute z-10 px-2 text-gray-900 outline-none ${\n isComposing ? \"bg-white border border-gray-500\" : \"opacity-0\"\n }`}\n style={{\n top: start.yStart,\n left: start.xStart,\n width: start.xEnd - start.xStart,\n height: start.yEnd - start.yStart,\n pointerEvents: \"none\",\n }}\n onCompositionStart={() => {\n setIsComposing(true);\n }}\n onCompositionEnd={(e) => {\n const text = e.data;\n setIsComposing(false);\n e.currentTarget.value = \"\";\n\n if (text && col?.editable) {\n startEditing();\n setTimeout(() => {\n setEditorInitialValue(text, IdGenerator.getEditorId());\n }, 10);\n }\n }}\n onInput={(e) => {\n // Outside of IME composition every typed key is handled on keydown,\n // so nothing should stay in this input.\n if (!isComposing) {\n e.currentTarget.value = \"\";\n }\n }}\n />\n );\n}\n"],"names":["IdGenerator","useTableIdGenerator","range","useRangeStateContext","isEditing","useEditStateContext","startEditing","useEditActionContext","cols","useColumnsContext","ref","useRef","_d","useState","isComposing","setIsComposing","active","isSelecting","useEffect","document","activeElement","current","_a","focus","preventScroll","col","start","colIndex","_jsx","KEY_CATCHER_ATTRIBUTE","_b","label","String","_c","key","autoComplete","tabIndex","className","concat","style","top","yStart","left","xStart","width","xEnd","height","yEnd","pointerEvents","onCompositionEnd","e","text","data","currentTarget","value","editable","setTimeout","setEditorInitialValue","getEditorId","onInput"],"mappings":"yUAuBQA,EAAcC,EAAAA,sBACdC,EAAQC,EAAAA,uBACNC,EAAcC,EAAAA,gCACdC,EAAiBC,EAAAA,oCACnBC,EAAOC,EAAAA,oBACPC,EAAMC,EAAAA,OAAyB,MAC/BC,EAAgCC,EAAAA,UAAS,GAAxCC,EAAWF,EAAA,GAAEG,EAAcH,EAAA,GAE5BI,EAASd,EAAMe,cAAgBb,EAQrC,GANAc,EAAAA,WAAU,iBACJF,GAAUG,SAASC,gBAAkBV,EAAIW,UAChC,QAAXC,EAAAZ,EAAIW,eAAO,IAAAC,GAAAA,EAAEC,MAAM,CAAEC,eAAe,IAExC,GAAG,CAACR,EAAQd,KAEPA,EAAMe,aAAeb,EACxB,OAAO,KAGT,IAAMqB,EAAMjB,EAAKN,EAAMwB,MAAMC,UACrBD,EAAUxB,EAAKwB,MAEvB,OACEE,EAAAA,IAAA,UAAAN,EAAA,CACEZ,IAAKA,IACEmB,EAAAA,uBAAwB,GAAEP,EAAA,cACX,QAAVQ,EAAAL,aAAG,EAAHA,EAAKM,aAAK,IAAAD,EAAAA,EAAIE,OAAe,QAARC,EAAAR,aAAG,EAAHA,EAAKS,WAAG,IAAAD,EAAAA,EAAI,IAC7CX,EAAAa,aAAa,MACbb,EAAAc,YACAd,EAAAe,UAAW,iDAAAC,OACTxB,EAAc,kCAAoC,aAEpDQ,EAAAiB,MAAO,CACLC,IAAKd,EAAMe,OACXC,KAAMhB,EAAMiB,OACZC,MAAOlB,EAAMmB,KAAOnB,EAAMiB,OAC1BG,OAAQpB,EAAMqB,KAAOrB,EAAMe,OAC3BO,cAAe,QAEjB1B,qBAAoB,WAClBP,GAAe,EACjB,EACAO,EAAA2B,iBAAkB,SAACC,GACjB,IAAMC,EAAOD,EAAEE,KACfrC,GAAe,GACfmC,EAAEG,cAAcC,MAAQ,GAEpBH,IAAQ1B,aAAG,EAAHA,EAAK8B,YACfjD,IACAkD,YAAW,WACTC,EAAAA,sBAAsBN,EAAMnD,EAAY0D,cAC1C,GAAG,IAEP,EACApC,EAAAqC,QAAS,SAACT,GAGHpC,IACHoC,EAAEG,cAAcC,MAAQ,GAE5B,EAAChC,GAGP"}
@@ -1,2 +1,2 @@
1
- "use client";"use strict";var e=require("react/jsx-runtime"),t=require("react"),r=require("../../edit/provider.js"),n=require("../../sheet/providers.js"),i=require("../../range/provider.js"),o=require("../../copy/provider.js"),s=require("../../id/provider.js"),a=require("../event-target.js"),d=function(e,t){var r,n=document.getElementById(t);if(n){var i=null===(r=Object.getOwnPropertyDescriptor(window.HTMLInputElement.prototype,"value"))||void 0===r?void 0:r.set;i&&i.call(n,e);var o=new Event("input",{bubbles:!0});n.dispatchEvent(o)}};exports.KeyboardSetting=function(u){var y=s.useTableIdGenerator(),c=r.useEditContext(),p=i.useRangeContext(),l=o.useCopyActionContext().copy,v=n.useColumnsContext()[p.isSelecting?p.start.colIndex:0];return t.useEffect((function(){var e=function(e){a.isComposingKey(e)||(c.isEditing?"Escape"===e.key&&(e.preventDefault(),c.endEditing()):p.isSelecting&&!a.isTextEntryTarget(e.target)&&("Enter"===e.key?(e.preventDefault(),p.moveDown()):"Escape"===e.key?(e.preventDefault(),p.reset()):"ArrowRight"===e.key?(e.preventDefault(),e.ctrlKey&&e.shiftKey?p.extendRightEnd():e.ctrlKey?p.moveRightEnd():e.shiftKey?p.extendRight():p.moveRight()):"ArrowLeft"===e.key?(e.preventDefault(),e.ctrlKey&&e.shiftKey?p.extendLeftEnd():e.ctrlKey?p.moveLeftEnd():e.shiftKey?p.extendLeft():p.moveLeft()):"ArrowUp"===e.key?(e.preventDefault(),e.ctrlKey&&e.shiftKey?p.extendTop():e.ctrlKey?p.moveTop():e.shiftKey?p.extendUp():p.moveUp()):"ArrowDown"===e.key?(e.preventDefault(),e.ctrlKey&&e.shiftKey?p.extendBottom():e.ctrlKey?p.moveBottom():e.shiftKey?p.extendDown():p.moveDown()):"F2"===e.key?(e.preventDefault(),c.startEditing()):(e.ctrlKey||e.metaKey)&&"c"===e.key.toLowerCase()?(e.preventDefault(),l({enableDeprecatedCopy:null==u?void 0:u.enableDeprecatedCopy})):e.altKey||e.ctrlKey||e.metaKey||!/^[a-zA-Z0-9]$/.test(e.key)?"Backspace"!==e.key&&"Delete"!==e.key||(e.preventDefault(),e.stopPropagation(),c.startEditing(),setTimeout((function(){d("",y.getEditorId())}),10)):(e.preventDefault(),e.stopPropagation(),c.startEditing(),setTimeout((function(){d(e.key,y.getEditorId())}),10))))};return document.addEventListener("keydown",e),function(){document.removeEventListener("keydown",e)}}),[p,c.isEditing]),t.useEffect((function(){c.isEditing&&!v.editable&&c.endEditing()}),[c,v]),e.jsx(e.Fragment,{})};
1
+ "use client";"use strict";var e=require("react/jsx-runtime"),t=require("react"),r=require("../../edit/provider.js"),n=require("../../sheet/providers.js"),i=require("../../range/provider.js"),o=require("../../copy/provider.js"),s=require("../../id/provider.js"),a=require("../event-target.js"),d=require("../editor-input.js");exports.KeyboardSetting=function(u){var y=s.useTableIdGenerator(),l=r.useEditContext(),c=i.useRangeContext(),p=o.useCopyActionContext().copy,f=n.useColumnsContext()[c.isSelecting?c.start.colIndex:0];return t.useEffect((function(){var e=function(e){a.isComposingKey(e)||(l.isEditing?"Escape"===e.key&&(e.preventDefault(),l.endEditing()):c.isSelecting&&!a.isTextEntryTarget(e.target)&&("Enter"===e.key?(e.preventDefault(),c.moveDown()):"Escape"===e.key?(e.preventDefault(),c.reset()):"ArrowRight"===e.key?(e.preventDefault(),e.ctrlKey&&e.shiftKey?c.extendRightEnd():e.ctrlKey?c.moveRightEnd():e.shiftKey?c.extendRight():c.moveRight()):"ArrowLeft"===e.key?(e.preventDefault(),e.ctrlKey&&e.shiftKey?c.extendLeftEnd():e.ctrlKey?c.moveLeftEnd():e.shiftKey?c.extendLeft():c.moveLeft()):"ArrowUp"===e.key?(e.preventDefault(),e.ctrlKey&&e.shiftKey?c.extendTop():e.ctrlKey?c.moveTop():e.shiftKey?c.extendUp():c.moveUp()):"ArrowDown"===e.key?(e.preventDefault(),e.ctrlKey&&e.shiftKey?c.extendBottom():e.ctrlKey?c.moveBottom():e.shiftKey?c.extendDown():c.moveDown()):"F2"===e.key?(e.preventDefault(),l.startEditing()):(e.ctrlKey||e.metaKey)&&"c"===e.key.toLowerCase()?(e.preventDefault(),p({enableDeprecatedCopy:null==u?void 0:u.enableDeprecatedCopy})):e.altKey||e.ctrlKey||e.metaKey||1!==Array.from(e.key).length?"Backspace"!==e.key&&"Delete"!==e.key||(e.preventDefault(),e.stopPropagation(),l.startEditing(),setTimeout((function(){d.setEditorInitialValue("",y.getEditorId())}),10)):(e.preventDefault(),e.stopPropagation(),l.startEditing(),setTimeout((function(){d.setEditorInitialValue(e.key,y.getEditorId())}),10))))};return document.addEventListener("keydown",e),function(){document.removeEventListener("keydown",e)}}),[c,l.isEditing]),t.useEffect((function(){l.isEditing&&!f.editable&&l.endEditing()}),[l,f]),e.jsx(e.Fragment,{})};
2
2
  //# sourceMappingURL=keyboard-setting.js.map