@teppen/react-ui 2.2.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.
- package/README.md +3 -0
- package/dist/cjs/src/search-bar/condition-search-bar/input-form.js +1 -1
- package/dist/cjs/src/search-bar/condition-search-bar/input-form.js.map +1 -1
- package/dist/cjs/src/share/text/normalize.js +2 -0
- package/dist/cjs/src/share/text/normalize.js.map +1 -0
- package/dist/cjs/src/table/filter-v2/hook.js +1 -1
- package/dist/cjs/src/table/filter-v2/hook.js.map +1 -1
- package/dist/cjs/src/table/sort/hooks.js +1 -1
- package/dist/cjs/src/table/sort/hooks.js.map +1 -1
- package/dist/cjs/src/table/sort/provider.js +1 -1
- package/dist/cjs/src/table/sort/provider.js.map +1 -1
- package/dist/cjs/src/table/table/hook.js +1 -1
- package/dist/cjs/src/table/table/hook.js.map +1 -1
- package/dist/esm/src/search-bar/condition-search-bar/input-form.js +1 -1
- package/dist/esm/src/search-bar/condition-search-bar/input-form.js.map +1 -1
- package/dist/esm/src/share/text/normalize.js +2 -0
- package/dist/esm/src/share/text/normalize.js.map +1 -0
- package/dist/esm/src/table/filter-v2/hook.js +1 -1
- package/dist/esm/src/table/filter-v2/hook.js.map +1 -1
- package/dist/esm/src/table/sort/hooks.js +1 -1
- package/dist/esm/src/table/sort/hooks.js.map +1 -1
- package/dist/esm/src/table/sort/provider.js +1 -1
- package/dist/esm/src/table/sort/provider.js.map +1 -1
- package/dist/esm/src/table/table/hook.js +1 -1
- package/dist/esm/src/table/table/hook.js.map +1 -1
- 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
|
|
@@ -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
|
|
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"),t=require("./reducer.js");function
|
|
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";var e=require("../../../node_modules/tslib/tslib.es6.js"),
|
|
1
|
+
"use strict";var e=require("../../../node_modules/tslib/tslib.es6.js"),t=require("react"),a=require("../../share/text/normalize.js");function n(e){return null==e||""===e||"number"==typeof e&&isNaN(e)||e instanceof Date&&isNaN(e.getTime())}var r=function(t,a){switch(a.type){case"changeKey":return{key:a.payload.key,asc:!0,isUpdatedData:!1,sortTiming:t.sortTiming+1};case"changeOrder":return t.isUpdatedData?e.__assign(e.__assign({},t),{isUpdatedData:!1,sortTiming:t.sortTiming+1}):e.__assign(e.__assign({},t),{asc:!t.asc,sortTiming:t.sortTiming+1});case"updateData":return e.__assign(e.__assign({},t),{isUpdatedData:!0})}};exports.useSortReducer=function(i){var s,u,o=t.useReducer(r,{key:null!==(s=null==i?void 0:i.key)&&void 0!==s?s:"id",asc:null===(u=null==i?void 0:i.asc)||void 0===u||u,isUpdatedData:!1,sortTiming:0}),c=o[0],d=o[1],g=function(e){d({type:"changeKey",payload:{key:e}})},p=function(){d({type:"changeOrder"})},y=function(){d({type:"updateData"})},f=t.useCallback((function(t,r){return void 0===r&&(r=function(e){return e[c.key]}),e.__spreadArray([],t,!0).sort((function(e,t){var i=r(e),s=r(t);if(n(i)&&n(s))return 0;if(n(i))return 1;if(n(s))return-1;var u=function(e,t){return"number"==typeof e&&"number"==typeof t?e-t:e instanceof Date&&t instanceof Date?e.getTime()-t.getTime():a.compareText(String(e),String(t))}(i,s);return c.asc?u:-u}))}),[c.key,c.asc]);return{state:t.useMemo((function(){return{key:c.key,asc:c.asc,isUpdatedData:c.isUpdatedData}}),[c.key,c.asc,c.isUpdatedData]),actions:t.useMemo((function(){return{changeKey:g,changeOrder:p,updatedData:y,sort:f}}),[f]),sortTiming:c.sortTiming}};
|
|
2
2
|
//# sourceMappingURL=hooks.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hooks.js","sources":["../../../../../src/table/sort/hooks.ts"],"sourcesContent":["import { useCallback, useMemo, useReducer } from \"react\";\nimport { TReturnSortReducer, TSortReducer } from \"./types\";\nimport { DataObject, DataRecord } from \"../table/type\";\n\nconst reducer: TSortReducer = (state, action) => {\n switch (action.type) {\n case \"changeKey\":\n return {\n key: action.payload.key,\n asc: true,\n isUpdatedData: false,\n sortTiming: state.sortTiming + 1,\n };\n case \"changeOrder\":\n if (state.isUpdatedData) {\n return {\n ...state,\n isUpdatedData: false,\n sortTiming: state.sortTiming + 1,\n };\n } else {\n return { ...state, asc: !state.asc, sortTiming: state.sortTiming + 1 };\n }\n case \"updateData\":\n return { ...state, isUpdatedData: true };\n }\n};\n\nexport function useSortReducer<T extends DataRecord>(initial?: {\n key: string;\n asc?: boolean;\n}): TReturnSortReducer<T> {\n const [state, dispatch] = useReducer(reducer, {\n key: initial?.key ?? \"id\",\n asc: initial?.asc ?? true,\n isUpdatedData: false,\n sortTiming: 0,\n });\n\n const changeKey = (key: string) => {\n dispatch({ type: \"changeKey\", payload: { key } });\n };\n\n const changeOrder = () => {\n dispatch({ type: \"changeOrder\" });\n };\n\n const updatedData = () => {\n dispatch({ type: \"updateData\" });\n };\n\n const sort = useCallback(\n <U extends DataRecord>(rows: DataObject<U>[]) =>\n [...rows].sort((
|
|
1
|
+
{"version":3,"file":"hooks.js","sources":["../../../../../src/table/sort/hooks.ts"],"sourcesContent":["import { useCallback, useMemo, useReducer } from \"react\";\nimport { TReturnSortReducer, TSortReducer } from \"./types\";\nimport { DataObject, DataRecord } from \"../table/type\";\nimport { compareText } from \"../../share/text/normalize\";\n\nfunction isEmpty(value: unknown): boolean {\n return (\n value === null ||\n value === undefined ||\n value === \"\" ||\n (typeof value === \"number\" && isNaN(value)) ||\n (value instanceof Date && isNaN(value.getTime()))\n );\n}\n\n/** Numbers and dates by value; text in Japanese order (\"2\" before \"10\"). */\nfunction compareValues(a: unknown, b: unknown): number {\n if (typeof a === \"number\" && typeof b === \"number\") return a - b;\n if (a instanceof Date && b instanceof Date) return a.getTime() - b.getTime();\n return compareText(String(a), String(b));\n}\n\nconst reducer: TSortReducer = (state, action) => {\n switch (action.type) {\n case \"changeKey\":\n return {\n key: action.payload.key,\n asc: true,\n isUpdatedData: false,\n sortTiming: state.sortTiming + 1,\n };\n case \"changeOrder\":\n if (state.isUpdatedData) {\n return {\n ...state,\n isUpdatedData: false,\n sortTiming: state.sortTiming + 1,\n };\n } else {\n return { ...state, asc: !state.asc, sortTiming: state.sortTiming + 1 };\n }\n case \"updateData\":\n return { ...state, isUpdatedData: true };\n }\n};\n\nexport function useSortReducer<T extends DataRecord>(initial?: {\n key: string;\n asc?: boolean;\n}): TReturnSortReducer<T> {\n const [state, dispatch] = useReducer(reducer, {\n key: initial?.key ?? \"id\",\n asc: initial?.asc ?? true,\n isUpdatedData: false,\n sortTiming: 0,\n });\n\n const changeKey = (key: string) => {\n dispatch({ type: \"changeKey\", payload: { key } });\n };\n\n const changeOrder = () => {\n dispatch({ type: \"changeOrder\" });\n };\n\n const updatedData = () => {\n dispatch({ type: \"updateData\" });\n };\n\n const sort = useCallback(\n <U extends DataRecord>(\n rows: DataObject<U>[],\n getValue: (row: DataObject<U>) => unknown = (row) => row[state.key]\n ) =>\n [...rows].sort((rowA, rowB) => {\n const a = getValue(rowA);\n const b = getValue(rowB);\n\n // Empty values stay at the end in both orders.\n if (isEmpty(a) && isEmpty(b)) return 0;\n if (isEmpty(a)) return 1;\n if (isEmpty(b)) return -1;\n\n const result = compareValues(a, b);\n return state.asc ? result : -result;\n }),\n [state.key, state.asc]\n );\n\n const stateExcludeSortTiming = useMemo(\n () => ({\n key: state.key,\n asc: state.asc,\n isUpdatedData: state.isUpdatedData,\n }),\n [state.key, state.asc, state.isUpdatedData]\n );\n\n const actions = useMemo(\n () => ({ changeKey, changeOrder, updatedData, sort }),\n [sort]\n );\n\n return {\n state: stateExcludeSortTiming,\n actions,\n sortTiming: state.sortTiming,\n };\n}\n"],"names":["isEmpty","value","isNaN","Date","getTime","reducer","state","action","type","key","payload","asc","isUpdatedData","sortTiming","__assign","initial","_c","useReducer","_a","_b","dispatch","changeKey","changeOrder","updatedData","sort","useCallback","rows","getValue","row","__spreadArray","rowA","rowB","a","b","result","compareText","String","compareValues","useMemo","actions"],"mappings":"qIAKA,SAASA,EAAQC,GACf,OACEA,SAEU,KAAVA,GACkB,iBAAVA,GAAsBC,MAAMD,IACnCA,aAAiBE,MAAQD,MAAMD,EAAMG,UAE1C,CASA,IAAMC,EAAwB,SAACC,EAAOC,GACpC,OAAQA,EAAOC,MACb,IAAK,YACH,MAAO,CACLC,IAAKF,EAAOG,QAAQD,IACpBE,KAAK,EACLC,eAAe,EACfC,WAAYP,EAAMO,WAAa,GAEnC,IAAK,cACH,OAAIP,EAAMM,cACRE,WAAAA,EAAAA,SAAA,CAAA,EACKR,GAAK,CACRM,eAAe,EACfC,WAAYP,EAAMO,WAAa,IAGjCC,EAAAA,SAAAA,EAAAA,SAAA,CAAA,EAAYR,GAAK,CAAEK,KAAML,EAAMK,IAAKE,WAAYP,EAAMO,WAAa,IAEvE,IAAK,aACH,OAAAC,EAAAA,SAAAA,EAAAA,SAAA,CAAA,EAAYR,GAAK,CAAEM,eAAe,IAExC,yBAEM,SAA+CG,WAI7CC,EAAoBC,EAAAA,WAAWZ,EAAS,CAC5CI,IAAiB,QAAZS,EAAAH,eAAAA,EAASN,WAAG,IAAAS,EAAAA,EAAI,KACrBP,IAAiB,QAAZQ,EAAAJ,eAAAA,EAASJ,WAAG,IAAAQ,GAAAA,EACjBP,eAAe,EACfC,WAAY,IAJPP,EAAKU,EAAA,GAAEI,OAORC,EAAY,SAACZ,GACjBW,EAAS,CAAEZ,KAAM,YAAaE,QAAS,CAAED,IAAGA,IAC9C,EAEMa,EAAc,WAClBF,EAAS,CAAEZ,KAAM,eACnB,EAEMe,EAAc,WAClBH,EAAS,CAAEZ,KAAM,cACnB,EAEMgB,EAAOC,EAAAA,aACX,SACEC,EACAC,GAEA,YAFA,IAAAA,IAAAA,EAAA,SAA6CC,GAAQ,OAAAA,EAAItB,EAAMG,IAAV,GAErDoB,EAAAA,cAAA,GAAIH,GAAI,GAAEF,MAAK,SAACM,EAAMC,GACpB,IAAMC,EAAIL,EAASG,GACbG,EAAIN,EAASI,GAGnB,GAAI/B,EAAQgC,IAAMhC,EAAQiC,GAAI,OAAO,EACrC,GAAIjC,EAAQgC,GAAI,OAAO,EACvB,GAAIhC,EAAQiC,GAAI,OAAO,EAEvB,IAAMC,EAnEd,SAAuBF,EAAYC,GACjC,MAAiB,iBAAND,GAA+B,iBAANC,EAAuBD,EAAIC,EAC3DD,aAAa7B,MAAQ8B,aAAa9B,KAAa6B,EAAE5B,UAAY6B,EAAE7B,UAC5D+B,EAAAA,YAAYC,OAAOJ,GAAII,OAAOH,GACvC,CA+DuBI,CAAcL,EAAGC,GAChC,OAAO3B,EAAMK,IAAMuB,GAAUA,CAC/B,GAXA,GAYF,CAAC5B,EAAMG,IAAKH,EAAMK,MAiBpB,MAAO,CACLL,MAf6BgC,WAC7B,WAAM,MAAA,CACJ7B,IAAKH,EAAMG,IACXE,IAAKL,EAAMK,IACXC,cAAeN,EAAMM,cAHjB,GAKN,CAACN,EAAMG,IAAKH,EAAMK,IAAKL,EAAMM,gBAU7B2B,QAPcD,EAAAA,SACd,WAAM,MAAA,CAAGjB,UAASA,EAAEC,YAAWA,EAAEC,YAAWA,EAAEC,KAAIA,EAA5C,GACN,CAACA,IAMDX,WAAYP,EAAMO,WAEtB"}
|
|
@@ -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("./hooks.js"),o=n.createContext(0),i=n.createContext({key:"",asc:!1,isUpdatedData:!1}),s=n.createContext({changeKey:function(){throw new Error("Function not implemented.")},changeOrder:function(){throw new Error("Function not implemented.")},sort:function(){return[]},updatedData:function(){throw new Error("Function not implemented.")}});exports.SortProvider=function(e){var n=r.useSortReducer(e.initialCondition),u=n.state,c=n.actions,a=n.sortTiming;return t.jsx(o.Provider,{value:a,children:t.jsx(i.Provider,{value:u,children:t.jsx(s.Provider,{value:c,children:e.children})})})},exports.useSortActionContext=function(){return n.useContext(s)},exports.useSortContext=function(){return e.__assign(e.__assign(e.__assign({},n.useContext(i)),n.useContext(s)),{sortTiming:n.useContext(o)})},exports.useSortTimingContext=function(){return n.useContext(o)};
|
|
1
|
+
"use client";"use strict";var e=require("../../../node_modules/tslib/tslib.es6.js"),t=require("react/jsx-runtime"),n=require("react"),r=require("./hooks.js"),o=n.createContext(0),i=n.createContext({key:"",asc:!1,isUpdatedData:!1}),s=n.createContext({changeKey:function(){throw new Error("Function not implemented.")},changeOrder:function(){throw new Error("Function not implemented.")},sort:function(){return[]},updatedData:function(){throw new Error("Function not implemented.")}});exports.SortProvider=function(e){var n=r.useSortReducer(e.initialCondition),u=n.state,c=n.actions,a=n.sortTiming;return t.jsx(o.Provider,{value:a,children:t.jsx(i.Provider,{value:u,children:t.jsx(s.Provider,{value:c,children:e.children})})})},exports.useSortActionContext=function(){return n.useContext(s)},exports.useSortContext=function(){return e.__assign(e.__assign(e.__assign({},n.useContext(i)),n.useContext(s)),{sortTiming:n.useContext(o)})},exports.useSortStateContext=function(){return n.useContext(i)},exports.useSortTimingContext=function(){return n.useContext(o)};
|
|
2
2
|
//# sourceMappingURL=provider.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"provider.js","sources":["../../../../../src/table/sort/provider.tsx"],"sourcesContent":["\"use client\";\n\nimport { createContext, useContext } from \"react\";\nimport { TReturnSortReducer } from \"./types\";\nimport { useSortReducer } from \"./hooks\";\nimport { DataRecord } from \"../table/type\";\n\nconst SortTimingContext = createContext<number>(0);\n\nconst SortStateContext = createContext<TReturnSortReducer<DataRecord>[\"state\"]>(\n {\n key: \"\",\n asc: false,\n isUpdatedData: false,\n }\n);\n\nconst SortActionContext = createContext<\n TReturnSortReducer<DataRecord>[\"actions\"]\n>({\n changeKey: function (): void {\n throw new Error(\"Function not implemented.\");\n },\n changeOrder: function (): void {\n throw new Error(\"Function not implemented.\");\n },\n sort: () => [],\n updatedData: function (): void {\n throw new Error(\"Function not implemented.\");\n },\n});\n\nexport function SortProvider(props: {\n children: React.ReactNode;\n initialCondition?: { key: string; asc?: boolean };\n}) {\n const { state, actions, sortTiming } = useSortReducer(props.initialCondition);\n return (\n <SortTimingContext.Provider value={sortTiming}>\n <SortStateContext.Provider value={state}>\n <SortActionContext.Provider value={actions}>\n {props.children}\n </SortActionContext.Provider>\n </SortStateContext.Provider>\n </SortTimingContext.Provider>\n );\n}\n\nexport function useSortContext() {\n return {\n ...useContext(SortStateContext),\n ...useContext(SortActionContext),\n sortTiming: useContext(SortTimingContext),\n };\n}\n\nexport function useSortStateContext() {\n return useContext(SortStateContext);\n}\n\nexport function useSortActionContext() {\n return useContext(SortActionContext);\n}\n\nexport function useSortTimingContext() {\n return useContext(SortTimingContext);\n}\n"],"names":["SortTimingContext","createContext","SortStateContext","key","asc","isUpdatedData","SortActionContext","changeKey","Error","changeOrder","sort","updatedData","props","_a","useSortReducer","initialCondition","state","actions","sortTiming","_jsx","Provider","value","children","useContext","__assign"],"mappings":"8JAOMA,EAAoBC,EAAAA,cAAsB,GAE1CC,EAAmBD,EAAAA,cACvB,CACEE,IAAK,GACLC,KAAK,EACLC,eAAe,IAIbC,EAAoBL,EAAAA,cAExB,CACAM,UAAW,WACT,MAAM,IAAIC,MAAM,4BAClB,EACAC,YAAa,WACX,MAAM,IAAID,MAAM,4BAClB,EACAE,KAAM,WAAM,MAAA,EAAA,EACZC,YAAa,WACX,MAAM,IAAIH,MAAM,4BAClB,yBAGI,SAAuBI,GAIrB,IAAAC,EAAiCC,EAAAA,eAAeF,EAAMG,kBAApDC,EAAKH,EAAAG,MAAEC,EAAOJ,EAAAI,QAAEC,eACxB,OACEC,MAACnB,EAAkBoB,SAAQ,CAACC,MAAOH,WACjCC,MAACjB,EAAiBkB,UAASC,MAAOL,EAAKM,SACrCH,MAACb,EAAkBc,SAAQ,CAACC,MAAOJ,EAAOK,SACvCV,EAAMU,cAKjB,0CAeE,OAAOC,EAAAA,WAAWjB,EACpB,oCAbE,OAAAkB,EAAAA,SAAAA,EAAAA,SAAAA,EAAAA,SAAA,CAAA,EACKD,EAAAA,WAAWrB,IACXqB,EAAAA,WAAWjB,IAAkB,CAChCY,WAAYK,EAAAA,WAAWvB,IAE3B,
|
|
1
|
+
{"version":3,"file":"provider.js","sources":["../../../../../src/table/sort/provider.tsx"],"sourcesContent":["\"use client\";\n\nimport { createContext, useContext } from \"react\";\nimport { TReturnSortReducer } from \"./types\";\nimport { useSortReducer } from \"./hooks\";\nimport { DataRecord } from \"../table/type\";\n\nconst SortTimingContext = createContext<number>(0);\n\nconst SortStateContext = createContext<TReturnSortReducer<DataRecord>[\"state\"]>(\n {\n key: \"\",\n asc: false,\n isUpdatedData: false,\n }\n);\n\nconst SortActionContext = createContext<\n TReturnSortReducer<DataRecord>[\"actions\"]\n>({\n changeKey: function (): void {\n throw new Error(\"Function not implemented.\");\n },\n changeOrder: function (): void {\n throw new Error(\"Function not implemented.\");\n },\n sort: () => [],\n updatedData: function (): void {\n throw new Error(\"Function not implemented.\");\n },\n});\n\nexport function SortProvider(props: {\n children: React.ReactNode;\n initialCondition?: { key: string; asc?: boolean };\n}) {\n const { state, actions, sortTiming } = useSortReducer(props.initialCondition);\n return (\n <SortTimingContext.Provider value={sortTiming}>\n <SortStateContext.Provider value={state}>\n <SortActionContext.Provider value={actions}>\n {props.children}\n </SortActionContext.Provider>\n </SortStateContext.Provider>\n </SortTimingContext.Provider>\n );\n}\n\nexport function useSortContext() {\n return {\n ...useContext(SortStateContext),\n ...useContext(SortActionContext),\n sortTiming: useContext(SortTimingContext),\n };\n}\n\nexport function useSortStateContext() {\n return useContext(SortStateContext);\n}\n\nexport function useSortActionContext() {\n return useContext(SortActionContext);\n}\n\nexport function useSortTimingContext() {\n return useContext(SortTimingContext);\n}\n"],"names":["SortTimingContext","createContext","SortStateContext","key","asc","isUpdatedData","SortActionContext","changeKey","Error","changeOrder","sort","updatedData","props","_a","useSortReducer","initialCondition","state","actions","sortTiming","_jsx","Provider","value","children","useContext","__assign"],"mappings":"8JAOMA,EAAoBC,EAAAA,cAAsB,GAE1CC,EAAmBD,EAAAA,cACvB,CACEE,IAAK,GACLC,KAAK,EACLC,eAAe,IAIbC,EAAoBL,EAAAA,cAExB,CACAM,UAAW,WACT,MAAM,IAAIC,MAAM,4BAClB,EACAC,YAAa,WACX,MAAM,IAAID,MAAM,4BAClB,EACAE,KAAM,WAAM,MAAA,EAAA,EACZC,YAAa,WACX,MAAM,IAAIH,MAAM,4BAClB,yBAGI,SAAuBI,GAIrB,IAAAC,EAAiCC,EAAAA,eAAeF,EAAMG,kBAApDC,EAAKH,EAAAG,MAAEC,EAAOJ,EAAAI,QAAEC,eACxB,OACEC,MAACnB,EAAkBoB,SAAQ,CAACC,MAAOH,WACjCC,MAACjB,EAAiBkB,UAASC,MAAOL,EAAKM,SACrCH,MAACb,EAAkBc,SAAQ,CAACC,MAAOJ,EAAOK,SACvCV,EAAMU,cAKjB,0CAeE,OAAOC,EAAAA,WAAWjB,EACpB,oCAbE,OAAAkB,EAAAA,SAAAA,EAAAA,SAAAA,EAAAA,SAAA,CAAA,EACKD,EAAAA,WAAWrB,IACXqB,EAAAA,WAAWjB,IAAkB,CAChCY,WAAYK,EAAAA,WAAWvB,IAE3B,yCAGE,OAAOuB,EAAAA,WAAWrB,EACpB,0CAOE,OAAOqB,EAAAA,WAAWvB,EACpB"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";var e=require("react"),t=require("../pagenation/providers.js"),r=require("../checkbox/provider.js"),
|
|
1
|
+
"use strict";var e=require("react"),t=require("../pagenation/providers.js"),r=require("../checkbox/provider.js"),n=require("../sort/provider.js"),o=require("../table-property/provider.js"),u=require("../paste/provider.js"),s=require("../copy/provider.js"),i=require("../filter-v2/context.js");exports.useTable=function(c){var a=i.useFilterFunctions().filter,f=n.useSortActionContext(),l=f.sort,p=f.updatedData,d=n.useSortTimingContext(),v=n.useSortStateContext().key,x=t.usePageContext(),h=x.setRowCount,w=x.pageFilter,C=r.useCheckboxStatusContext().dispatchCheckboxStatus,g=u.usePasteActionContext().setRows,m=s.useCopyActionContext().setRows,y=o.useTablePropertyActionContext(),M=y.setMaxDisplayColCount,S=y.setMaxDisplayRowCount,b=e.useMemo((function(){return JSON.stringify(c.rows.map((function(e){return e.id})))}),[c.rows]),k=e.useMemo((function(){return a(c.rows)}),[a,d,b]);e.useEffect((function(){h(k.length)}),[k.length]);var q=e.useMemo((function(){return c.checkbox?c.rows.filter((function(e){var t;return null===(t=c.checkbox)||void 0===t?void 0:t.checked(e)})):[]}),[c.checkbox,c.rows]);e.useEffect((function(){C({type:"SET",payload:{checkedRecords:q}})}),[q]);var j=c.cols.find((function(e){return e.key===v})),E="select"===(null==j?void 0:j.type)?JSON.stringify(j.options.map((function(e){return[e.value,e.label]}))):"",R=e.useMemo((function(){if(""!==E){var e=new Map(JSON.parse(E));return function(t){var r,n=t[v];return null!==(r=e.get(n))&&void 0!==r?r:n}}}),[v,E]),A=e.useMemo((function(){return l(k,R)}),[k,d,R]);e.useEffect((function(){p()}),[c.rows]);var T=e.useMemo((function(){return w(A)}),[w,A]),D=e.useMemo((function(){return T.map((function(e){return e.id}))}),[T]),F=e.useMemo((function(){return new Set(D)}),[D]),J=e.useMemo((function(){return c.rows.filter((function(e){return F.has(e.id)})).reduce((function(e,t){return e[t.id]={data:t},e}),{})}),[c.rows,F]);return e.useEffect((function(){M(c.cols.length)}),[c.cols.length]),e.useEffect((function(){S(D.length)}),[D.length]),e.useEffect((function(){var e=D.map((function(e){return J[e].data}));m(e),g(e)}),[J]),{cols:c.cols,rowMaps:J,pageRowIds:D}};
|
|
2
2
|
//# sourceMappingURL=hook.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hook.js","sources":["../../../../../src/table/table/hook.ts"],"sourcesContent":["import { useEffect, useMemo } from \"react\";\nimport { DataObject, DataRecord, TPropsTable } from \"./type\";\nimport { usePageContext } from \"../pagenation/providers\";\nimport { useCheckboxStatusContext } from \"../checkbox/provider\";\nimport {
|
|
1
|
+
{"version":3,"file":"hook.js","sources":["../../../../../src/table/table/hook.ts"],"sourcesContent":["import { useEffect, useMemo } from \"react\";\nimport { DataObject, DataRecord, TPropsTable } from \"./type\";\nimport { usePageContext } from \"../pagenation/providers\";\nimport { useCheckboxStatusContext } from \"../checkbox/provider\";\nimport {\n useSortActionContext,\n useSortStateContext,\n useSortTimingContext,\n} from \"../sort/provider\";\nimport { useTablePropertyActionContext } from \"../table-property/provider\";\nimport { usePasteActionContext } from \"../paste/provider\";\nimport { useCopyActionContext } from \"../copy/provider\";\nimport { useFilterFunctions } from \"../filter-v2/context\";\n\nexport function useTable<T extends DataRecord>(props: TPropsTable<T>) {\n const { filter } = useFilterFunctions();\n const { sort, updatedData } = useSortActionContext();\n const sortTiming = useSortTimingContext();\n const { key: sortKey } = useSortStateContext();\n const { setRowCount, pageFilter } = usePageContext();\n const { dispatchCheckboxStatus } = useCheckboxStatusContext();\n const { setRows: setRowsForPaste } = usePasteActionContext();\n const { setRows: setRowsForCopy } = useCopyActionContext();\n const { setMaxDisplayColCount, setMaxDisplayRowCount } =\n useTablePropertyActionContext();\n\n // Re-run filter/sort only when the set of rows changes (rows added, removed\n // or replaced). Edits that keep the same ids keep the current order.\n const rowIdsKey = useMemo(\n () => JSON.stringify(props.rows.map((row) => row.id)),\n [props.rows]\n );\n\n const filteredRows = useMemo(\n () => filter(props.rows),\n [filter, sortTiming, rowIdsKey]\n );\n\n useEffect(() => {\n setRowCount(filteredRows.length);\n }, [filteredRows.length]);\n\n const checkBoxes = useMemo(() => {\n if (!props.checkbox) {\n return [];\n }\n\n return props.rows.filter((row) => props.checkbox?.checked(row));\n }, [props.checkbox, props.rows]);\n\n useEffect(() => {\n dispatchCheckboxStatus({\n type: \"SET\",\n payload: { checkedRecords: checkBoxes },\n });\n }, [checkBoxes]);\n\n // Select columns are sorted by the labels shown, not the stored values.\n // Keyed on the options' content so that a new cols array with the same\n // options (e.g. defined inline) does not re-sort on every render.\n const sortCol = props.cols.find((c) => c.key === sortKey);\n const sortLabelsKey =\n sortCol?.type === \"select\"\n ? JSON.stringify(sortCol.options.map((o) => [o.value, o.label]))\n : \"\";\n const getSortValue = useMemo(() => {\n if (sortLabelsKey === \"\") return undefined;\n\n const labels = new Map<unknown, string>(JSON.parse(sortLabelsKey));\n return (row: DataObject<T>) => {\n const value = row[sortKey as keyof T];\n return labels.get(value) ?? value;\n };\n }, [sortKey, sortLabelsKey]);\n\n const sortedRows = useMemo(\n () => sort(filteredRows, getSortValue),\n [filteredRows, sortTiming, getSortValue]\n );\n\n useEffect(() => {\n updatedData();\n }, [props.rows]);\n\n const pageRows = useMemo(\n () => pageFilter(sortedRows),\n [pageFilter, sortedRows]\n );\n\n const pageRowIds = useMemo(() => pageRows.map((row) => row.id), [pageRows]);\n const pageRowIdSets = useMemo(() => new Set(pageRowIds), [pageRowIds]);\n\n // Rows on the current page by id. `data` is the row object passed in\n // through props, so callbacks receive it unchanged (Date values stay Date).\n const rowMaps = useMemo(\n () =>\n props.rows\n .filter((row) => pageRowIdSets.has(row.id))\n .reduce((acc, row) => {\n acc[row.id] = { data: row };\n return acc;\n }, {} as { [id: string | number]: { data: DataObject<any> } }),\n [props.rows, pageRowIdSets]\n );\n\n useEffect(() => {\n setMaxDisplayColCount(props.cols.length);\n }, [props.cols.length]);\n\n useEffect(() => {\n setMaxDisplayRowCount(pageRowIds.length);\n }, [pageRowIds.length]);\n\n useEffect(() => {\n const rows = pageRowIds.map((id) => rowMaps[id].data);\n setRowsForCopy(rows);\n setRowsForPaste(rows);\n }, [rowMaps]);\n\n return {\n cols: props.cols,\n rowMaps,\n pageRowIds,\n };\n}\n"],"names":["props","filter","useFilterFunctions","_a","useSortActionContext","sort","updatedData","sortTiming","useSortTimingContext","sortKey","useSortStateContext","_b","usePageContext","setRowCount","pageFilter","dispatchCheckboxStatus","useCheckboxStatusContext","setRowsForPaste","usePasteActionContext","setRowsForCopy","useCopyActionContext","_c","useTablePropertyActionContext","setMaxDisplayColCount","setMaxDisplayRowCount","rowIdsKey","useMemo","JSON","stringify","rows","map","row","id","filteredRows","useEffect","length","checkBoxes","checkbox","checked","type","payload","checkedRecords","sortCol","cols","find","c","key","sortLabelsKey","options","o","value","label","getSortValue","labels","Map","parse","get","sortedRows","pageRows","pageRowIds","pageRowIdSets","Set","rowMaps","has","reduce","acc","data"],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use client";import{jsx as e,jsxs as t,Fragment as n}from"react/jsx-runtime";import{useState as i,useRef as o,useEffect as r}from"react";import{SelectBox as a}from"../../select-box/index.js";import{useConditionInputState as u,useConditionInputAction as l}from"./condition-input-management/context.js";import"../../../node_modules/tslib/tslib.es6.js";import{useIdGenerator as p}from"../id-generator/context.js";import{TiDeleteOutline as c}from"../../../node_modules/react-icons/ti/index.js";function
|
|
1
|
+
"use client";import{jsx as e,jsxs as t,Fragment as n}from"react/jsx-runtime";import{useState as i,useRef as o,useEffect as r}from"react";import{SelectBox as a}from"../../select-box/index.js";import{useConditionInputState as u,useConditionInputAction as l}from"./condition-input-management/context.js";import"../../../node_modules/tslib/tslib.es6.js";import{useIdGenerator as p}from"../id-generator/context.js";import{TiDeleteOutline as c}from"../../../node_modules/react-icons/ti/index.js";import{parseNumberText as s}from"../../share/text/normalize.js";import{isComposingKey as d}from"../../table/operation/event-target.js";function f(t){switch(u().status){case"waiting for input":return e(g,{});case"inputted target":return e(m,{});case"inputted operator":return e(v,{size:t.size})}}function g(){var t=p().generateId,n=u().targets,i=l().inputTarget;return e(a,{id:t("TargetInput"),onSelect:function(e){i(e)},options:n.map((function(e){return{value:e.key,label:e.label}})),placeholder:"Select target",no_appearance:!0,no_icon:!0})}function m(){var i=p().generateId,o=u(),r=l(),c=r.inputOperator,s=r.removeInputedTarget;if("inputted target"!==o.status)return null;var d=o.inputtingCondition.target,f=o.useableOperators;return t(n,{children:[e(h,{label:d.label,onClickDelete:function(){s()}}),e("div",{className:"w-full min-w-64",children:e(a,{id:i("OperatorInput"),onSelect:function(e){c(e),setTimeout((function(){var e=document.getElementById(i("ValueInput"));e&&e.focus()}),10)},options:f.map((function(e){return{value:e.key,label:e.label}})),defaultIsOpen:!0,placeholder:"Select operator",no_appearance:!0,no_icon:!0})})]})}function v(i){var o=u(),r=l(),a=r.removeInputedOperator,p=r.removeInputedTarget;if("inputted operator"!==o.status)return null;var c=o.inputtingCondition.target,s=o.inputtingCondition.operator;return t(n,{children:[e(h,{label:c.label,onClickDelete:function(){p()}}),e(h,{label:s.label,onClickDelete:function(){a()}}),"single string"===o.inputtingCondition.operator.inputType?e(y,{inputType:o.inputtingCondition.operator.inputType,size:i.size}):"single number"===o.inputtingCondition.operator.inputType?e(b,{inputType:o.inputtingCondition.operator.inputType,size:i.size}):"select"===o.inputtingCondition.operator.inputType?e(w,{inputType:o.inputtingCondition.operator.inputType,options:"select"===o.inputtingCondition.target.type?o.inputtingCondition.target.options:[]}):"single datetime"===o.inputtingCondition.operator.inputType?e(T,{inputType:o.inputtingCondition.operator.inputType,size:i.size}):"single date"===o.inputtingCondition.operator.inputType?e(x,{inputType:o.inputtingCondition.operator.inputType,size:i.size}):console.error("Not implemented")]})}function y(t){var n=p().generateId,o=i(""),r=o[0],a=o[1],u=l().inputValue;return e("input",{id:n("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"===t.size?"text-sm":"large"===t.size?"text-lg":""),type:"text",placeholder:"Search text",value:r,onChange:function(e){a(e.target.value)},onKeyDown:function(e){"Enter"!==e.key||d(e.nativeEvent)||(u({type:t.inputType,payload:{value:r}}),a(""))}})}function b(t){var n=p().generateId,o=i(""),r=o[0],a=o[1],u=i(!1),c=u[0],f=u[1],g=l().inputValue;return e("input",{id:n("ValueInput"),"aria-invalid":c,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(c?"text-red-600 underline decoration-wavy":""," ").concat("small"===t.size?"text-sm":"large"===t.size?"text-lg":""),type:"text",placeholder:"Search text",value:r,onChange:function(e){a(e.target.value),f(!1)},onKeyDown:function(e){if("Enter"===e.key&&!d(e.nativeEvent)){var n=s(r);if(null===n)return void f(!0);g({type:t.inputType,payload:{value:n}}),a("")}}})}function w(t){var n=l().inputValue,i=p().generateId;return e("div",{className:"w-full min-w-64",children:e(a,{id:i("ValueInput"),onSelect:function(e){n({type:t.inputType,payload:{value:e}})},options:t.options,defaultIsOpen:!0,placeholder:"Select value",no_appearance:!0,no_icon:!0})})}function T(t){var n=p().generateId,i=l().inputValue,a=o(null);return r((function(){if(a.current){var e=a.current;e.focus(),e.scrollIntoView(),e.click()}}),[]),e("input",{ref:a,id:n("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"===t.size?"text-sm":"large"===t.size?"text-lg":""),type:"datetime-local",defaultValue:new Date((new Date).getTime()-6e4*(new Date).getTimezoneOffset()).toISOString().slice(0,16),onKeyDown:function(e){var n,o;if("Enter"===e.key){var r=new Date(null!==(o=null===(n=a.current)||void 0===n?void 0:n.value)&&void 0!==o?o:"");if(isNaN(r.getTime()))return;i({type:t.inputType,payload:{value:r}})}},onClick:function(e){e.currentTarget.showPicker()}})}function x(t){var n=p().generateId,i=l().inputValue,a=o(null),u=o(!1);return r((function(){if(a.current){var e=a.current;e.focus(),e.scrollIntoView(),e.click()}}),[]),e("input",{ref:a,id:n("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"===t.size?"text-sm":"large"===t.size?"text-lg":""),type:"date",defaultValue:new Date((new Date).getTime()-6e4*(new Date).getTimezoneOffset()).toISOString().slice(0,10),onKeyDown:function(e){var n;if("Enter"===e.key){if(!(null===(n=a.current)||void 0===n?void 0:n.value))return;var o=a.current.value.split("-"),r=o[0],u=o[1],l=o[2],p=new Date(Number(r),Number(u)-1,Number(l));if(isNaN(p.getTime()))return;i({type:t.inputType,payload:{value:p}})}},onClick:function(e){u.current||(e.currentTarget.showPicker(),u.current=!0)}})}function h(n){return t("div",{className:"flex items-center gap-2 w-fit px-2 border border-gray-200 rounded bg-slate-100",children:[e("p",{className:"whitespace-nowrap",children:n.label}),n.onClickDelete&&e("div",{children:e(c,{className:"bg-white hover:bg-slate-300 rounded-full cursor-pointer",onClick:n.onClickDelete})})]})}export{f as SearchBarInputForm};
|
|
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":["SearchBarInputForm","props","useConditionInputState","_jsx","TargetInputForm","OperatorInputForm","SearchValueInputForm","size","generateId","useIdGenerator","targets","inputTarget","useConditionInputAction","SelectBox","id","onSelect","value","options","map","t","key","label","placeholder","no_appearance","no_icon","state","_a","inputOperator","removeInputedTarget","status","target","inputtingCondition","operators","useableOperators","_jsxs","_Fragment","children","FixedValue","onClickDelete","className","setTimeout","element","document","getElementById","focus","defaultIsOpen","removeInputedOperator","operator","inputType","InputSingleString","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":["SearchBarInputForm","props","useConditionInputState","_jsx","TargetInputForm","OperatorInputForm","SearchValueInputForm","size","generateId","useIdGenerator","targets","inputTarget","useConditionInputAction","SelectBox","id","onSelect","value","options","map","t","key","label","placeholder","no_appearance","no_icon","state","_a","inputOperator","removeInputedTarget","status","target","inputtingCondition","operators","useableOperators","_jsxs","_Fragment","children","FixedValue","onClickDelete","className","setTimeout","element","document","getElementById","focus","defaultIsOpen","removeInputedOperator","operator","inputType","InputSingleString","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
|
+
function r(r){return r.normalize("NFKC").toLowerCase().replace(/[ぁ-ゖ]/g,(function(r){return String.fromCharCode(r.charCodeAt(0)+96)}))}var e=new Intl.Collator("ja",{numeric:!0});function n(r,n){return e.compare(r,n)}function t(r){var e=r.normalize("NFKC").trim().replace(/[ー−]/g,"-"),n=/^-?\d{1,3}(,\d{3})+(\.\d+)?$/.test(e)?e.replace(/,/g,""):e;return/^-?\d+(\.\d+)?$/.test(n)?Number(n):null}export{n as compareText,r as normalizeForSearch,t as parseNumberText};
|
|
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":["normalizeForSearch","text","normalize","toLowerCase","replace","ch","String","fromCharCode","charCodeAt","collator","Intl","Collator","numeric","compareText","a","b","compare","parseNumberText","t","trim","plain","test","Number"],"mappings":"AAQM,SAAUA,EAAmBC,GACjC,OAAOA,EACJC,UAAU,QACVC,cACAC,QAAQ,UAAU,SAACC,GAClB,OAAAC,OAAOC,aAAaF,EAAGG,WAAW,GAAK,GAAvC,GAEN,CAEA,IAAMC,EAAW,IAAIC,KAAKC,SAAS,KAAM,CAAEC,SAAS,IAO9C,SAAUC,EAAYC,EAAWC,GACrC,OAAON,EAASO,QAAQF,EAAGC,EAC7B,CAMM,SAAUE,EAAgBhB,GAC9B,IAAMiB,EAAIjB,EAAKC,UAAU,QAAQiB,OAAOf,QAAQ,QAAS,KACnDgB,EAAQ,+BAA+BC,KAAKH,GAAKA,EAAEd,QAAQ,KAAM,IAAMc,EAE7E,MAAO,kBAAkBG,KAAKD,GAASE,OAAOF,GAAS,IACzD"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{useReducer as e,useMemo as t}from"react";import{filterReducer as r}from"./reducer.js";var
|
|
1
|
+
import{useReducer as e,useMemo as t}from"react";import{filterReducer as r}from"./reducer.js";import{normalizeForSearch as n}from"../../share/text/normalize.js";var a=function(n){var a=e(r,{conditions:n}),i=a[0],o=a[1],s=t((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]),c=t((function(){return{filter:function(e){return e.filter((function(e){return i.conditions.every((function(t){return u(t,e[t.target.key],t.input)}))}))}}}),[i.conditions]);return{state:i,actions:s,functions:c}};function i(e){return null==e?"":String(e)}function o(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 u(e,t,r){switch(e.operator.type){case"number":if("single number"===e.operator.inputType){if(r.type!==e.operator.inputType)throw new Error("input type is not match");var a=r.payload.value;switch(e.operator.key){case"number:eq":return t===a;case"number:gt":return t>a;case"number:gte":return t>=a;case"number:lt":return t<a;case"number:lte":return t<=a;case"number:neq":return t!==a}}case"string":switch(e.operator.inputType){case"none":if(r.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(r.type!==e.operator.inputType)throw new Error("input type is not match");var u=r.payload.value;switch(e.operator.key){case"string:eq":return t===u;case"string:like":return n(i(t)).includes(n(u));case"string:neq":return t!==u;case"string:not_like":return!n(i(t)).includes(n(u))}}case"select":switch(e.operator.inputType){case"select":if(r.type!==e.operator.inputType)throw new Error("input type is not match");u=r.payload.value;switch(e.operator.key){case"select:eq":return t===u;case"select:neq":return t!==u}case"none":if(r.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(r.type!==e.operator.inputType)throw new Error("input type is not match");var s=o(t),c=o(r.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(r.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(r.type!==e.operator.inputType)throw new Error("input type is not match");var p=r.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(r.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}}}}export{u as isMatchCondition,a as useFilterHook};
|
|
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":["useFilterHook","initialConditions","_a","useReducer","filterReducer","conditions","state","dispatch","actions","useMemo","addFilter","condition","type","payload","removeFilter","index","clearFilter","functions","filter","rows","row","every","isMatchCondition","target","key","input","toText","value","String","toDayNumber","date","Date","isNaN","getTime","getFullYear","getMonth","getDate","targetValue","operator","inputType","Error","numValue","includes","targetDay","inputDay","dateValue"],"mappings":"6FAOO,IAAMA,EAA6B,SAACC,GACnC,IAAAC,EAAoBC,EAAWC,EAAe,CAClDC,WAAYJ,IADPK,EAAKJ,EAAA,GAAEK,OAIRC,EAAUC,GACd,WAAM,MAAA,CACJC,UAAW,SAACC,GACVJ,EAAS,CAAEK,KAAM,MAAOC,QAAS,CAAEF,UAASA,IAC9C,EACAG,aAAc,SAACC,GACbR,EAAS,CAAEK,KAAM,SAAUC,QAAS,CAAEE,MAAKA,IAC7C,EACAC,YAAa,WACXT,EAAS,CAAEK,KAAM,SACnB,EATI,GAWN,CAACN,EAAMD,aAGHY,EAAYR,GAChB,WAAM,MAAA,CACJS,OAAQ,SAAuBC,GAC7B,OAAOA,EAAKD,QAAO,SAACE,GAClB,OAAOd,EAAMD,WAAWgB,OAAM,SAACV,GAE7B,OAAOW,EAAiBX,EADVS,EAAIT,EAAUY,OAAOC,KACOb,EAAUc,MACtD,GACF,GACF,EARI,GAUN,CAACnB,EAAMD,aAGT,MAAO,CACLC,MAAKA,EACLE,QAAOA,EACPS,UAASA,EAEb,EAEA,SAASS,EAAOC,GACd,OAAOA,QAAwC,GAAKC,OAAOD,EAC7D,CAGA,SAASE,EAAYF,GACnB,GAAIA,SAAmD,KAAVA,EAAc,OAAO,KAElE,IAAMG,EAAOH,aAAiBI,KAAOJ,EAAQ,IAAII,KAAKJ,GACtD,OAAIK,MAAMF,EAAKG,WAAmB,KAGX,IAArBH,EAAKI,cAAgD,KAAvBJ,EAAKK,WAAa,GAAWL,EAAKM,SAEpE,UAGgBd,EACdX,EACA0B,EACAZ,GAEA,OAAQd,EAAU2B,SAAS1B,MACzB,IAAK,SACH,GACO,kBADCD,EAAU2B,SAASC,UACzB,CACE,GAAId,EAAMb,OAASD,EAAU2B,SAASC,UACpC,MAAM,IAAIC,MAAM,2BAGlB,IAAMC,EAAWhB,EAAMZ,QAAQc,MAE/B,OAAQhB,EAAU2B,SAASd,KACzB,IAAK,YACH,OAAOa,IAAgBI,EACzB,IAAK,YACH,OAAOJ,EAAcI,EACvB,IAAK,aACH,OAAOJ,GAAeI,EACxB,IAAK,YACH,OAAOJ,EAAcI,EACvB,IAAK,aACH,OAAOJ,GAAeI,EACxB,IAAK,aACH,OAAOJ,IAAgBI,GAIjC,IAAK,SACH,OAAQ9B,EAAU2B,SAASC,WACzB,IAAK,OACH,GAAId,EAAMb,OAASD,EAAU2B,SAASC,UACpC,MAAM,IAAIC,MAAM,2BAGlB,OAAQ7B,EAAU2B,SAASd,KACzB,IAAK,qBACH,OACEa,SAEgB,KAAhBA,EAEJ,IAAK,iBACH,OACEA,SAEgB,KAAhBA,EAGR,IAAK,gBACH,GAAIZ,EAAMb,OAASD,EAAU2B,SAASC,UACpC,MAAM,IAAIC,MAAM,2BAGlB,IAAMb,EAAQF,EAAMZ,QAAQc,MAE5B,OAAQhB,EAAU2B,SAASd,KACzB,IAAK,YACH,OAAOa,IAAgBV,EACzB,IAAK,cACH,OAAOD,EAAOW,GAAaK,SAASf,GACtC,IAAK,aACH,OAAOU,IAAgBV,EACzB,IAAK,kBACH,OAAQD,EAAOW,GAAaK,SAASf,IAI/C,IAAK,SACH,OAAQhB,EAAU2B,SAASC,WACzB,IAAK,SACH,GAAId,EAAMb,OAASD,EAAU2B,SAASC,UACpC,MAAM,IAAIC,MAAM,2BAGZb,EAAQF,EAAMZ,QAAQc,MAE5B,OAAQhB,EAAU2B,SAASd,KACzB,IAAK,YACH,OAAOa,IAAgBV,EACzB,IAAK,aACH,OAAOU,IAAgBV,EAE7B,IAAK,OACH,GAAIF,EAAMb,OAASD,EAAU2B,SAASC,UACpC,MAAM,IAAIC,MAAM,2BAGlB,OAAQ7B,EAAU2B,SAASd,KACzB,IAAK,iBACH,OACEa,SAEgB,KAAhBA,EAEJ,IAAK,qBACH,OACEA,SAEgB,KAAhBA,GAIZ,IAAK,OACH,OAAQ1B,EAAU2B,SAASC,WACzB,IAAK,cACH,GAAId,EAAMb,OAASD,EAAU2B,SAASC,UACpC,MAAM,IAAIC,MAAM,2BAKlB,IAAMG,EAAYd,EAAYQ,GACxBO,EAAWf,EAAYJ,EAAMZ,QAAQc,OAE3C,GAAkB,OAAdgB,GAAmC,OAAbC,EACxB,OAAO,EAGT,OAAQjC,EAAU2B,SAASd,KACzB,IAAK,UACH,OAAOmB,IAAcC,EACvB,IAAK,WACH,OAAOD,IAAcC,EACvB,IAAK,UACH,OAAOD,EAAYC,EACrB,IAAK,WACH,OAAOD,GAAaC,EACtB,IAAK,UACH,OAAOD,EAAYC,EACrB,IAAK,WACH,OAAOD,GAAaC,EAE1B,IAAK,OACH,GAAInB,EAAMb,OAASD,EAAU2B,SAASC,UACpC,MAAM,IAAIC,MAAM,2BAGlB,OAAQ7B,EAAU2B,SAASd,KACzB,IAAK,eACH,OACEa,SAEgB,KAAhBA,EAEJ,IAAK,mBACH,OACEA,SAEgB,KAAhBA,GAIZ,IAAK,WACH,OAAQ1B,EAAU2B,SAASC,WACzB,IAAK,kBACH,GAAId,EAAMb,OAASD,EAAU2B,SAASC,UACpC,MAAM,IAAIC,MAAM,2BAGlB,IAAMK,EAAYpB,EAAMZ,QAAQc,MAEhC,OAAQhB,EAAU2B,SAASd,KACzB,IAAK,cACH,OAAOa,EAAcQ,EACvB,IAAK,eACH,OAAOR,GAAeQ,EACxB,IAAK,cACH,OAAOR,EAAcQ,EACvB,IAAK,eACH,OAAOR,GAAeQ,EAE5B,IAAK,OACH,GAAIpB,EAAMb,OAASD,EAAU2B,SAASC,UACpC,MAAM,IAAIC,MAAM,2BAGlB,OAAQ7B,EAAU2B,SAASd,KACzB,IAAK,mBACH,OACEa,SAEgB,KAAhBA,EAEJ,IAAK,uBACH,OACEA,SAEgB,KAAhBA,IAKhB"}
|
|
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":["useFilterHook","initialConditions","_a","useReducer","filterReducer","conditions","state","dispatch","actions","useMemo","addFilter","condition","type","payload","removeFilter","index","clearFilter","functions","filter","rows","row","every","isMatchCondition","target","key","input","toText","value","String","toDayNumber","date","Date","isNaN","getTime","getFullYear","getMonth","getDate","targetValue","operator","inputType","Error","numValue","normalizeForSearch","includes","targetDay","inputDay","dateValue"],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{__spreadArray as t,__assign as
|
|
1
|
+
import{__spreadArray as t,__assign as e}from"../../../node_modules/tslib/tslib.es6.js";import{useReducer as a,useCallback as n,useMemo as i}from"react";import{compareText as r}from"../../share/text/normalize.js";function o(t){return null==t||""===t||"number"==typeof t&&isNaN(t)||t instanceof Date&&isNaN(t.getTime())}var s=function(t,a){switch(a.type){case"changeKey":return{key:a.payload.key,asc:!0,isUpdatedData:!1,sortTiming:t.sortTiming+1};case"changeOrder":return t.isUpdatedData?e(e({},t),{isUpdatedData:!1,sortTiming:t.sortTiming+1}):e(e({},t),{asc:!t.asc,sortTiming:t.sortTiming+1});case"updateData":return e(e({},t),{isUpdatedData:!0})}};function u(e){var u,c,d=a(s,{key:null!==(u=null==e?void 0:e.key)&&void 0!==u?u:"id",asc:null===(c=null==e?void 0:e.asc)||void 0===c||c,isUpdatedData:!1,sortTiming:0}),f=d[0],p=d[1],m=function(t){p({type:"changeKey",payload:{key:t}})},y=function(){p({type:"changeOrder"})},g=function(){p({type:"updateData"})},l=n((function(e,a){return void 0===a&&(a=function(t){return t[f.key]}),t([],e,!0).sort((function(t,e){var n=a(t),i=a(e);if(o(n)&&o(i))return 0;if(o(n))return 1;if(o(i))return-1;var s=function(t,e){return"number"==typeof t&&"number"==typeof e?t-e:t instanceof Date&&e instanceof Date?t.getTime()-e.getTime():r(String(t),String(e))}(n,i);return f.asc?s:-s}))}),[f.key,f.asc]);return{state:i((function(){return{key:f.key,asc:f.asc,isUpdatedData:f.isUpdatedData}}),[f.key,f.asc,f.isUpdatedData]),actions:i((function(){return{changeKey:m,changeOrder:y,updatedData:g,sort:l}}),[l]),sortTiming:f.sortTiming}}export{u as useSortReducer};
|
|
2
2
|
//# sourceMappingURL=hooks.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hooks.js","sources":["../../../../../src/table/sort/hooks.ts"],"sourcesContent":["import { useCallback, useMemo, useReducer } from \"react\";\nimport { TReturnSortReducer, TSortReducer } from \"./types\";\nimport { DataObject, DataRecord } from \"../table/type\";\n\nconst reducer: TSortReducer = (state, action) => {\n switch (action.type) {\n case \"changeKey\":\n return {\n key: action.payload.key,\n asc: true,\n isUpdatedData: false,\n sortTiming: state.sortTiming + 1,\n };\n case \"changeOrder\":\n if (state.isUpdatedData) {\n return {\n ...state,\n isUpdatedData: false,\n sortTiming: state.sortTiming + 1,\n };\n } else {\n return { ...state, asc: !state.asc, sortTiming: state.sortTiming + 1 };\n }\n case \"updateData\":\n return { ...state, isUpdatedData: true };\n }\n};\n\nexport function useSortReducer<T extends DataRecord>(initial?: {\n key: string;\n asc?: boolean;\n}): TReturnSortReducer<T> {\n const [state, dispatch] = useReducer(reducer, {\n key: initial?.key ?? \"id\",\n asc: initial?.asc ?? true,\n isUpdatedData: false,\n sortTiming: 0,\n });\n\n const changeKey = (key: string) => {\n dispatch({ type: \"changeKey\", payload: { key } });\n };\n\n const changeOrder = () => {\n dispatch({ type: \"changeOrder\" });\n };\n\n const updatedData = () => {\n dispatch({ type: \"updateData\" });\n };\n\n const sort = useCallback(\n <U extends DataRecord>(rows: DataObject<U>[]) =>\n [...rows].sort((
|
|
1
|
+
{"version":3,"file":"hooks.js","sources":["../../../../../src/table/sort/hooks.ts"],"sourcesContent":["import { useCallback, useMemo, useReducer } from \"react\";\nimport { TReturnSortReducer, TSortReducer } from \"./types\";\nimport { DataObject, DataRecord } from \"../table/type\";\nimport { compareText } from \"../../share/text/normalize\";\n\nfunction isEmpty(value: unknown): boolean {\n return (\n value === null ||\n value === undefined ||\n value === \"\" ||\n (typeof value === \"number\" && isNaN(value)) ||\n (value instanceof Date && isNaN(value.getTime()))\n );\n}\n\n/** Numbers and dates by value; text in Japanese order (\"2\" before \"10\"). */\nfunction compareValues(a: unknown, b: unknown): number {\n if (typeof a === \"number\" && typeof b === \"number\") return a - b;\n if (a instanceof Date && b instanceof Date) return a.getTime() - b.getTime();\n return compareText(String(a), String(b));\n}\n\nconst reducer: TSortReducer = (state, action) => {\n switch (action.type) {\n case \"changeKey\":\n return {\n key: action.payload.key,\n asc: true,\n isUpdatedData: false,\n sortTiming: state.sortTiming + 1,\n };\n case \"changeOrder\":\n if (state.isUpdatedData) {\n return {\n ...state,\n isUpdatedData: false,\n sortTiming: state.sortTiming + 1,\n };\n } else {\n return { ...state, asc: !state.asc, sortTiming: state.sortTiming + 1 };\n }\n case \"updateData\":\n return { ...state, isUpdatedData: true };\n }\n};\n\nexport function useSortReducer<T extends DataRecord>(initial?: {\n key: string;\n asc?: boolean;\n}): TReturnSortReducer<T> {\n const [state, dispatch] = useReducer(reducer, {\n key: initial?.key ?? \"id\",\n asc: initial?.asc ?? true,\n isUpdatedData: false,\n sortTiming: 0,\n });\n\n const changeKey = (key: string) => {\n dispatch({ type: \"changeKey\", payload: { key } });\n };\n\n const changeOrder = () => {\n dispatch({ type: \"changeOrder\" });\n };\n\n const updatedData = () => {\n dispatch({ type: \"updateData\" });\n };\n\n const sort = useCallback(\n <U extends DataRecord>(\n rows: DataObject<U>[],\n getValue: (row: DataObject<U>) => unknown = (row) => row[state.key]\n ) =>\n [...rows].sort((rowA, rowB) => {\n const a = getValue(rowA);\n const b = getValue(rowB);\n\n // Empty values stay at the end in both orders.\n if (isEmpty(a) && isEmpty(b)) return 0;\n if (isEmpty(a)) return 1;\n if (isEmpty(b)) return -1;\n\n const result = compareValues(a, b);\n return state.asc ? result : -result;\n }),\n [state.key, state.asc]\n );\n\n const stateExcludeSortTiming = useMemo(\n () => ({\n key: state.key,\n asc: state.asc,\n isUpdatedData: state.isUpdatedData,\n }),\n [state.key, state.asc, state.isUpdatedData]\n );\n\n const actions = useMemo(\n () => ({ changeKey, changeOrder, updatedData, sort }),\n [sort]\n );\n\n return {\n state: stateExcludeSortTiming,\n actions,\n sortTiming: state.sortTiming,\n };\n}\n"],"names":["isEmpty","value","isNaN","Date","getTime","reducer","state","action","type","key","payload","asc","isUpdatedData","sortTiming","__assign","useSortReducer","initial","_c","useReducer","_a","_b","dispatch","changeKey","changeOrder","updatedData","sort","useCallback","rows","getValue","row","__spreadArray","rowA","rowB","a","b","result","compareText","String","compareValues","useMemo","actions"],"mappings":"oNAKA,SAASA,EAAQC,GACf,OACEA,SAEU,KAAVA,GACkB,iBAAVA,GAAsBC,MAAMD,IACnCA,aAAiBE,MAAQD,MAAMD,EAAMG,UAE1C,CASA,IAAMC,EAAwB,SAACC,EAAOC,GACpC,OAAQA,EAAOC,MACb,IAAK,YACH,MAAO,CACLC,IAAKF,EAAOG,QAAQD,IACpBE,KAAK,EACLC,eAAe,EACfC,WAAYP,EAAMO,WAAa,GAEnC,IAAK,cACH,OAAIP,EAAMM,cACRE,EAAAA,EAAA,CAAA,EACKR,GAAK,CACRM,eAAe,EACfC,WAAYP,EAAMO,WAAa,IAGjCC,EAAAA,EAAA,CAAA,EAAYR,GAAK,CAAEK,KAAML,EAAMK,IAAKE,WAAYP,EAAMO,WAAa,IAEvE,IAAK,aACH,OAAAC,EAAAA,EAAA,CAAA,EAAYR,GAAK,CAAEM,eAAe,IAExC,EAEM,SAAUG,EAAqCC,WAI7CC,EAAoBC,EAAWb,EAAS,CAC5CI,IAAiB,QAAZU,EAAAH,eAAAA,EAASP,WAAG,IAAAU,EAAAA,EAAI,KACrBR,IAAiB,QAAZS,EAAAJ,eAAAA,EAASL,WAAG,IAAAS,GAAAA,EACjBR,eAAe,EACfC,WAAY,IAJPP,EAAKW,EAAA,GAAEI,OAORC,EAAY,SAACb,GACjBY,EAAS,CAAEb,KAAM,YAAaE,QAAS,CAAED,IAAGA,IAC9C,EAEMc,EAAc,WAClBF,EAAS,CAAEb,KAAM,eACnB,EAEMgB,EAAc,WAClBH,EAAS,CAAEb,KAAM,cACnB,EAEMiB,EAAOC,GACX,SACEC,EACAC,GAEA,YAFA,IAAAA,IAAAA,EAAA,SAA6CC,GAAQ,OAAAA,EAAIvB,EAAMG,IAAV,GAErDqB,EAAA,GAAIH,GAAI,GAAEF,MAAK,SAACM,EAAMC,GACpB,IAAMC,EAAIL,EAASG,GACbG,EAAIN,EAASI,GAGnB,GAAIhC,EAAQiC,IAAMjC,EAAQkC,GAAI,OAAO,EACrC,GAAIlC,EAAQiC,GAAI,OAAO,EACvB,GAAIjC,EAAQkC,GAAI,OAAO,EAEvB,IAAMC,EAnEd,SAAuBF,EAAYC,GACjC,MAAiB,iBAAND,GAA+B,iBAANC,EAAuBD,EAAIC,EAC3DD,aAAa9B,MAAQ+B,aAAa/B,KAAa8B,EAAE7B,UAAY8B,EAAE9B,UAC5DgC,EAAYC,OAAOJ,GAAII,OAAOH,GACvC,CA+DuBI,CAAcL,EAAGC,GAChC,OAAO5B,EAAMK,IAAMwB,GAAUA,CAC/B,GAXA,GAYF,CAAC7B,EAAMG,IAAKH,EAAMK,MAiBpB,MAAO,CACLL,MAf6BiC,GAC7B,WAAM,MAAA,CACJ9B,IAAKH,EAAMG,IACXE,IAAKL,EAAMK,IACXC,cAAeN,EAAMM,cAHjB,GAKN,CAACN,EAAMG,IAAKH,EAAMK,IAAKL,EAAMM,gBAU7B4B,QAPcD,GACd,WAAM,MAAA,CAAGjB,UAASA,EAAEC,YAAWA,EAAEC,YAAWA,EAAEC,KAAIA,EAA5C,GACN,CAACA,IAMDZ,WAAYP,EAAMO,WAEtB"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use client";import{__assign as n}from"../../../node_modules/tslib/tslib.es6.js";import{jsx as r}from"react/jsx-runtime";import{createContext as t,useContext as e}from"react";import{useSortReducer as o}from"./hooks.js";var i=t(0),u=t({key:"",asc:!1,isUpdatedData:!1}),c=t({changeKey:function(){throw new Error("Function not implemented.")},changeOrder:function(){throw new Error("Function not implemented.")},sort:function(){return[]},updatedData:function(){throw new Error("Function not implemented.")}});function a(n){var t=o(n.initialCondition),e=t.state,a=t.actions,d=t.sortTiming;return r(i.Provider,{value:d,children:r(u.Provider,{value:e,children:r(c.Provider,{value:a,children:n.children})})})}function d(){return n(n(n({},e(u)),e(c)),{sortTiming:e(i)})}function m(){return e(
|
|
1
|
+
"use client";import{__assign as n}from"../../../node_modules/tslib/tslib.es6.js";import{jsx as r}from"react/jsx-runtime";import{createContext as t,useContext as e}from"react";import{useSortReducer as o}from"./hooks.js";var i=t(0),u=t({key:"",asc:!1,isUpdatedData:!1}),c=t({changeKey:function(){throw new Error("Function not implemented.")},changeOrder:function(){throw new Error("Function not implemented.")},sort:function(){return[]},updatedData:function(){throw new Error("Function not implemented.")}});function a(n){var t=o(n.initialCondition),e=t.state,a=t.actions,d=t.sortTiming;return r(i.Provider,{value:d,children:r(u.Provider,{value:e,children:r(c.Provider,{value:a,children:n.children})})})}function d(){return n(n(n({},e(u)),e(c)),{sortTiming:e(i)})}function m(){return e(u)}function s(){return e(c)}function l(){return e(i)}export{a as SortProvider,s as useSortActionContext,d as useSortContext,m as useSortStateContext,l as useSortTimingContext};
|
|
2
2
|
//# sourceMappingURL=provider.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"provider.js","sources":["../../../../../src/table/sort/provider.tsx"],"sourcesContent":["\"use client\";\n\nimport { createContext, useContext } from \"react\";\nimport { TReturnSortReducer } from \"./types\";\nimport { useSortReducer } from \"./hooks\";\nimport { DataRecord } from \"../table/type\";\n\nconst SortTimingContext = createContext<number>(0);\n\nconst SortStateContext = createContext<TReturnSortReducer<DataRecord>[\"state\"]>(\n {\n key: \"\",\n asc: false,\n isUpdatedData: false,\n }\n);\n\nconst SortActionContext = createContext<\n TReturnSortReducer<DataRecord>[\"actions\"]\n>({\n changeKey: function (): void {\n throw new Error(\"Function not implemented.\");\n },\n changeOrder: function (): void {\n throw new Error(\"Function not implemented.\");\n },\n sort: () => [],\n updatedData: function (): void {\n throw new Error(\"Function not implemented.\");\n },\n});\n\nexport function SortProvider(props: {\n children: React.ReactNode;\n initialCondition?: { key: string; asc?: boolean };\n}) {\n const { state, actions, sortTiming } = useSortReducer(props.initialCondition);\n return (\n <SortTimingContext.Provider value={sortTiming}>\n <SortStateContext.Provider value={state}>\n <SortActionContext.Provider value={actions}>\n {props.children}\n </SortActionContext.Provider>\n </SortStateContext.Provider>\n </SortTimingContext.Provider>\n );\n}\n\nexport function useSortContext() {\n return {\n ...useContext(SortStateContext),\n ...useContext(SortActionContext),\n sortTiming: useContext(SortTimingContext),\n };\n}\n\nexport function useSortStateContext() {\n return useContext(SortStateContext);\n}\n\nexport function useSortActionContext() {\n return useContext(SortActionContext);\n}\n\nexport function useSortTimingContext() {\n return useContext(SortTimingContext);\n}\n"],"names":["SortTimingContext","createContext","SortStateContext","key","asc","isUpdatedData","SortActionContext","changeKey","Error","changeOrder","sort","updatedData","SortProvider","props","_a","useSortReducer","initialCondition","state","actions","sortTiming","_jsx","Provider","value","children","useSortContext","__assign","useContext","useSortActionContext","useSortTimingContext"],"mappings":"2NAOA,IAAMA,EAAoBC,EAAsB,GAE1CC,EAAmBD,EACvB,CACEE,IAAK,GACLC,KAAK,EACLC,eAAe,IAIbC,EAAoBL,EAExB,CACAM,UAAW,WACT,MAAM,IAAIC,MAAM,4BAClB,EACAC,YAAa,WACX,MAAM,IAAID,MAAM,4BAClB,EACAE,KAAM,WAAM,MAAA,EAAA,EACZC,YAAa,WACX,MAAM,IAAIH,MAAM,4BAClB,IAGI,SAAUI,EAAaC,GAIrB,IAAAC,EAAiCC,EAAeF,EAAMG,kBAApDC,EAAKH,EAAAG,MAAEC,EAAOJ,EAAAI,QAAEC,eACxB,OACEC,EAACpB,EAAkBqB,SAAQ,CAACC,MAAOH,WACjCC,EAAClB,EAAiBmB,UAASC,MAAOL,EAAKM,SACrCH,EAACd,EAAkBe,SAAQ,CAACC,MAAOJ,EAAOK,SACvCV,EAAMU,cAKjB,UAEgBC,IACd,OAAAC,EAAAA,EAAAA,EAAA,CAAA,EACKC,EAAWxB,IACXwB,EAAWpB,IAAkB,CAChCa,WAAYO,EAAW1B,IAE3B,
|
|
1
|
+
{"version":3,"file":"provider.js","sources":["../../../../../src/table/sort/provider.tsx"],"sourcesContent":["\"use client\";\n\nimport { createContext, useContext } from \"react\";\nimport { TReturnSortReducer } from \"./types\";\nimport { useSortReducer } from \"./hooks\";\nimport { DataRecord } from \"../table/type\";\n\nconst SortTimingContext = createContext<number>(0);\n\nconst SortStateContext = createContext<TReturnSortReducer<DataRecord>[\"state\"]>(\n {\n key: \"\",\n asc: false,\n isUpdatedData: false,\n }\n);\n\nconst SortActionContext = createContext<\n TReturnSortReducer<DataRecord>[\"actions\"]\n>({\n changeKey: function (): void {\n throw new Error(\"Function not implemented.\");\n },\n changeOrder: function (): void {\n throw new Error(\"Function not implemented.\");\n },\n sort: () => [],\n updatedData: function (): void {\n throw new Error(\"Function not implemented.\");\n },\n});\n\nexport function SortProvider(props: {\n children: React.ReactNode;\n initialCondition?: { key: string; asc?: boolean };\n}) {\n const { state, actions, sortTiming } = useSortReducer(props.initialCondition);\n return (\n <SortTimingContext.Provider value={sortTiming}>\n <SortStateContext.Provider value={state}>\n <SortActionContext.Provider value={actions}>\n {props.children}\n </SortActionContext.Provider>\n </SortStateContext.Provider>\n </SortTimingContext.Provider>\n );\n}\n\nexport function useSortContext() {\n return {\n ...useContext(SortStateContext),\n ...useContext(SortActionContext),\n sortTiming: useContext(SortTimingContext),\n };\n}\n\nexport function useSortStateContext() {\n return useContext(SortStateContext);\n}\n\nexport function useSortActionContext() {\n return useContext(SortActionContext);\n}\n\nexport function useSortTimingContext() {\n return useContext(SortTimingContext);\n}\n"],"names":["SortTimingContext","createContext","SortStateContext","key","asc","isUpdatedData","SortActionContext","changeKey","Error","changeOrder","sort","updatedData","SortProvider","props","_a","useSortReducer","initialCondition","state","actions","sortTiming","_jsx","Provider","value","children","useSortContext","__assign","useContext","useSortStateContext","useSortActionContext","useSortTimingContext"],"mappings":"2NAOA,IAAMA,EAAoBC,EAAsB,GAE1CC,EAAmBD,EACvB,CACEE,IAAK,GACLC,KAAK,EACLC,eAAe,IAIbC,EAAoBL,EAExB,CACAM,UAAW,WACT,MAAM,IAAIC,MAAM,4BAClB,EACAC,YAAa,WACX,MAAM,IAAID,MAAM,4BAClB,EACAE,KAAM,WAAM,MAAA,EAAA,EACZC,YAAa,WACX,MAAM,IAAIH,MAAM,4BAClB,IAGI,SAAUI,EAAaC,GAIrB,IAAAC,EAAiCC,EAAeF,EAAMG,kBAApDC,EAAKH,EAAAG,MAAEC,EAAOJ,EAAAI,QAAEC,eACxB,OACEC,EAACpB,EAAkBqB,SAAQ,CAACC,MAAOH,WACjCC,EAAClB,EAAiBmB,UAASC,MAAOL,EAAKM,SACrCH,EAACd,EAAkBe,SAAQ,CAACC,MAAOJ,EAAOK,SACvCV,EAAMU,cAKjB,UAEgBC,IACd,OAAAC,EAAAA,EAAAA,EAAA,CAAA,EACKC,EAAWxB,IACXwB,EAAWpB,IAAkB,CAChCa,WAAYO,EAAW1B,IAE3B,UAEgB2B,IACd,OAAOD,EAAWxB,EACpB,UAEgB0B,IACd,OAAOF,EAAWpB,EACpB,UAEgBuB,IACd,OAAOH,EAAW1B,EACpB"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{useMemo as r,useEffect as t}from"react";import{usePageContext as
|
|
1
|
+
import{useMemo as r,useEffect as t}from"react";import{usePageContext as n}from"../pagenation/providers.js";import{useCheckboxStatusContext as o}from"../checkbox/provider.js";import{useSortActionContext as e,useSortTimingContext as i,useSortStateContext as u}from"../sort/provider.js";import{useTablePropertyActionContext as c}from"../table-property/provider.js";import{usePasteActionContext as s}from"../paste/provider.js";import{useCopyActionContext as f}from"../copy/provider.js";import{useFilterFunctions as a}from"../filter-v2/context.js";function p(p){var l=a().filter,d=e(),m=d.sort,v=d.updatedData,w=i(),h=u().key,g=n(),y=g.setRowCount,k=g.pageFilter,x=o().dispatchCheckboxStatus,b=s().setRows,j=f().setRows,R=c(),S=R.setMaxDisplayColCount,C=R.setMaxDisplayRowCount,M=r((function(){return JSON.stringify(p.rows.map((function(r){return r.id})))}),[p.rows]),D=r((function(){return l(p.rows)}),[l,w,M]);t((function(){y(D.length)}),[D.length]);var J=r((function(){return p.checkbox?p.rows.filter((function(r){var t;return null===(t=p.checkbox)||void 0===t?void 0:t.checked(r)})):[]}),[p.checkbox,p.rows]);t((function(){x({type:"SET",payload:{checkedRecords:J}})}),[J]);var N=p.cols.find((function(r){return r.key===h})),O="select"===(null==N?void 0:N.type)?JSON.stringify(N.options.map((function(r){return[r.value,r.label]}))):"",E=r((function(){if(""!==O){var r=new Map(JSON.parse(O));return function(t){var n,o=t[h];return null!==(n=r.get(o))&&void 0!==n?n:o}}}),[h,O]),F=r((function(){return m(D,E)}),[D,w,E]);t((function(){v()}),[p.rows]);var I=r((function(){return k(F)}),[k,F]),T=r((function(){return I.map((function(r){return r.id}))}),[I]),q=r((function(){return new Set(T)}),[T]),z=r((function(){return p.rows.filter((function(r){return q.has(r.id)})).reduce((function(r,t){return r[t.id]={data:t},r}),{})}),[p.rows,q]);return t((function(){S(p.cols.length)}),[p.cols.length]),t((function(){C(T.length)}),[T.length]),t((function(){var r=T.map((function(r){return z[r].data}));j(r),b(r)}),[z]),{cols:p.cols,rowMaps:z,pageRowIds:T}}export{p as useTable};
|
|
2
2
|
//# sourceMappingURL=hook.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hook.js","sources":["../../../../../src/table/table/hook.ts"],"sourcesContent":["import { useEffect, useMemo } from \"react\";\nimport { DataObject, DataRecord, TPropsTable } from \"./type\";\nimport { usePageContext } from \"../pagenation/providers\";\nimport { useCheckboxStatusContext } from \"../checkbox/provider\";\nimport {
|
|
1
|
+
{"version":3,"file":"hook.js","sources":["../../../../../src/table/table/hook.ts"],"sourcesContent":["import { useEffect, useMemo } from \"react\";\nimport { DataObject, DataRecord, TPropsTable } from \"./type\";\nimport { usePageContext } from \"../pagenation/providers\";\nimport { useCheckboxStatusContext } from \"../checkbox/provider\";\nimport {\n useSortActionContext,\n useSortStateContext,\n useSortTimingContext,\n} from \"../sort/provider\";\nimport { useTablePropertyActionContext } from \"../table-property/provider\";\nimport { usePasteActionContext } from \"../paste/provider\";\nimport { useCopyActionContext } from \"../copy/provider\";\nimport { useFilterFunctions } from \"../filter-v2/context\";\n\nexport function useTable<T extends DataRecord>(props: TPropsTable<T>) {\n const { filter } = useFilterFunctions();\n const { sort, updatedData } = useSortActionContext();\n const sortTiming = useSortTimingContext();\n const { key: sortKey } = useSortStateContext();\n const { setRowCount, pageFilter } = usePageContext();\n const { dispatchCheckboxStatus } = useCheckboxStatusContext();\n const { setRows: setRowsForPaste } = usePasteActionContext();\n const { setRows: setRowsForCopy } = useCopyActionContext();\n const { setMaxDisplayColCount, setMaxDisplayRowCount } =\n useTablePropertyActionContext();\n\n // Re-run filter/sort only when the set of rows changes (rows added, removed\n // or replaced). Edits that keep the same ids keep the current order.\n const rowIdsKey = useMemo(\n () => JSON.stringify(props.rows.map((row) => row.id)),\n [props.rows]\n );\n\n const filteredRows = useMemo(\n () => filter(props.rows),\n [filter, sortTiming, rowIdsKey]\n );\n\n useEffect(() => {\n setRowCount(filteredRows.length);\n }, [filteredRows.length]);\n\n const checkBoxes = useMemo(() => {\n if (!props.checkbox) {\n return [];\n }\n\n return props.rows.filter((row) => props.checkbox?.checked(row));\n }, [props.checkbox, props.rows]);\n\n useEffect(() => {\n dispatchCheckboxStatus({\n type: \"SET\",\n payload: { checkedRecords: checkBoxes },\n });\n }, [checkBoxes]);\n\n // Select columns are sorted by the labels shown, not the stored values.\n // Keyed on the options' content so that a new cols array with the same\n // options (e.g. defined inline) does not re-sort on every render.\n const sortCol = props.cols.find((c) => c.key === sortKey);\n const sortLabelsKey =\n sortCol?.type === \"select\"\n ? JSON.stringify(sortCol.options.map((o) => [o.value, o.label]))\n : \"\";\n const getSortValue = useMemo(() => {\n if (sortLabelsKey === \"\") return undefined;\n\n const labels = new Map<unknown, string>(JSON.parse(sortLabelsKey));\n return (row: DataObject<T>) => {\n const value = row[sortKey as keyof T];\n return labels.get(value) ?? value;\n };\n }, [sortKey, sortLabelsKey]);\n\n const sortedRows = useMemo(\n () => sort(filteredRows, getSortValue),\n [filteredRows, sortTiming, getSortValue]\n );\n\n useEffect(() => {\n updatedData();\n }, [props.rows]);\n\n const pageRows = useMemo(\n () => pageFilter(sortedRows),\n [pageFilter, sortedRows]\n );\n\n const pageRowIds = useMemo(() => pageRows.map((row) => row.id), [pageRows]);\n const pageRowIdSets = useMemo(() => new Set(pageRowIds), [pageRowIds]);\n\n // Rows on the current page by id. `data` is the row object passed in\n // through props, so callbacks receive it unchanged (Date values stay Date).\n const rowMaps = useMemo(\n () =>\n props.rows\n .filter((row) => pageRowIdSets.has(row.id))\n .reduce((acc, row) => {\n acc[row.id] = { data: row };\n return acc;\n }, {} as { [id: string | number]: { data: DataObject<any> } }),\n [props.rows, pageRowIdSets]\n );\n\n useEffect(() => {\n setMaxDisplayColCount(props.cols.length);\n }, [props.cols.length]);\n\n useEffect(() => {\n setMaxDisplayRowCount(pageRowIds.length);\n }, [pageRowIds.length]);\n\n useEffect(() => {\n const rows = pageRowIds.map((id) => rowMaps[id].data);\n setRowsForCopy(rows);\n setRowsForPaste(rows);\n }, [rowMaps]);\n\n return {\n cols: props.cols,\n rowMaps,\n pageRowIds,\n };\n}\n"],"names":["useTable","props","filter","useFilterFunctions","_a","useSortActionContext","sort","updatedData","sortTiming","useSortTimingContext","sortKey","useSortStateContext","_b","usePageContext","setRowCount","pageFilter","dispatchCheckboxStatus","useCheckboxStatusContext","setRowsForPaste","usePasteActionContext","setRowsForCopy","useCopyActionContext","_c","useTablePropertyActionContext","setMaxDisplayColCount","setMaxDisplayRowCount","rowIdsKey","useMemo","JSON","stringify","rows","map","row","id","filteredRows","useEffect","length","checkBoxes","checkbox","checked","type","payload","checkedRecords","sortCol","cols","find","c","key","sortLabelsKey","options","o","value","label","getSortValue","labels","Map","parse","get","sortedRows","pageRows","pageRowIds","pageRowIdSets","Set","rowMaps","has","reduce","acc","data"],"mappings":"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"}
|