@teppen/react-ui 2.1.0 → 2.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +14 -1
- 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/copy/components.js +1 -1
- package/dist/cjs/src/table/copy/components.js.map +1 -1
- package/dist/cjs/src/table/edit/ui/select-input.js +1 -1
- package/dist/cjs/src/table/edit/ui/select-input.js.map +1 -1
- 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/libs/generate-validate-function.js +1 -1
- package/dist/cjs/src/table/libs/generate-validate-function.js.map +1 -1
- package/dist/cjs/src/table/locale/messages.js +2 -0
- package/dist/cjs/src/table/locale/messages.js.map +1 -0
- package/dist/cjs/src/table/locale/provider.js +2 -0
- package/dist/cjs/src/table/locale/provider.js.map +1 -0
- package/dist/cjs/src/table/operation/components/key-catcher.js +2 -0
- package/dist/cjs/src/table/operation/components/key-catcher.js.map +1 -0
- package/dist/cjs/src/table/operation/components/keyboard-setting.js +1 -1
- package/dist/cjs/src/table/operation/components/keyboard-setting.js.map +1 -1
- package/dist/cjs/src/table/operation/editor-input.js +2 -0
- package/dist/cjs/src/table/operation/editor-input.js.map +1 -0
- package/dist/cjs/src/table/operation/event-target.js +1 -1
- package/dist/cjs/src/table/operation/event-target.js.map +1 -1
- package/dist/cjs/src/table/paste/hooks.js +1 -1
- package/dist/cjs/src/table/paste/hooks.js.map +1 -1
- package/dist/cjs/src/table/paste/logic.js +1 -1
- package/dist/cjs/src/table/paste/logic.js.map +1 -1
- package/dist/cjs/src/table/sheet/providers.js +1 -1
- package/dist/cjs/src/table/sheet/providers.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/base.js +1 -1
- package/dist/cjs/src/table/table/base.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/copy/components.js +1 -1
- package/dist/esm/src/table/copy/components.js.map +1 -1
- package/dist/esm/src/table/edit/ui/select-input.js +1 -1
- package/dist/esm/src/table/edit/ui/select-input.js.map +1 -1
- 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/libs/generate-validate-function.js +1 -1
- package/dist/esm/src/table/libs/generate-validate-function.js.map +1 -1
- package/dist/esm/src/table/locale/messages.js +2 -0
- package/dist/esm/src/table/locale/messages.js.map +1 -0
- package/dist/esm/src/table/locale/provider.js +2 -0
- package/dist/esm/src/table/locale/provider.js.map +1 -0
- package/dist/esm/src/table/operation/components/key-catcher.js +2 -0
- package/dist/esm/src/table/operation/components/key-catcher.js.map +1 -0
- package/dist/esm/src/table/operation/components/keyboard-setting.js +1 -1
- package/dist/esm/src/table/operation/components/keyboard-setting.js.map +1 -1
- package/dist/esm/src/table/operation/editor-input.js +2 -0
- package/dist/esm/src/table/operation/editor-input.js.map +1 -0
- package/dist/esm/src/table/operation/event-target.js +1 -1
- package/dist/esm/src/table/operation/event-target.js.map +1 -1
- package/dist/esm/src/table/paste/hooks.js +1 -1
- package/dist/esm/src/table/paste/hooks.js.map +1 -1
- package/dist/esm/src/table/paste/logic.js +1 -1
- package/dist/esm/src/table/paste/logic.js.map +1 -1
- package/dist/esm/src/table/sheet/providers.js +1 -1
- package/dist/esm/src/table/sheet/providers.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/base.js +1 -1
- package/dist/esm/src/table/table/base.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/dist/index.d.ts +39 -26
- package/package.json +1 -1
|
@@ -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{jsx as t,Fragment as e}from"react/jsx-runtime";import{useState as r,useEffect as
|
|
1
|
+
import{jsx as t,Fragment as e}from"react/jsx-runtime";import{useState as r,useEffect as o}from"react";import{useCopyStateContext as i}from"./provider.js";import{useTableIdGenerator as n}from"../id/provider.js";import{useMessages as c}from"../locale/provider.js";function a(){var a=n(),m=r(!1),p=m[0],d=m[1],f=i().copiedAt,u=c();if(o((function(){if(f){d(!0);var t=setTimeout((function(){d(!1)}),1e3);return function(){d(!1),clearTimeout(t)}}}),[f]),!p)return t(e,{});var l=document.getElementById(a.getTableId());if(!l)return t(e,{});var s=l.getBoundingClientRect(),v=s.right-120,g=s.bottom-50;return t("div",{className:"fixed z-[100] p-1 bg-gray-800 duration-300 pointer-events-none ".concat(p?"opacity-100":"opacity-0"),style:{top:g,left:v},children:t("p",{className:"text-white text-xs",children:u.copied})})}export{a as CopiedMessage};
|
|
2
2
|
//# sourceMappingURL=components.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"components.js","sources":["../../../../../src/table/copy/components.tsx"],"sourcesContent":["import { useEffect, useState } from \"react\";\nimport { useCopyStateContext } from \"./provider\";\nimport { useTableIdGenerator } from \"../id\";\n\nexport function CopiedMessage() {\n const IdGenerator = useTableIdGenerator();\n const [isDisplay, setIsDisplay] = useState(false);\n const { copiedAt } = useCopyStateContext();\n\n useEffect(() => {\n if (copiedAt) {\n setIsDisplay(true);\n\n const timer = setTimeout(() => {\n setIsDisplay(false);\n }, 1000);\n\n return () => {\n setIsDisplay(false);\n clearTimeout(timer);\n };\n }\n }, [copiedAt]);\n\n if (!isDisplay) {\n return <></>;\n }\n\n const tableElement = document.getElementById(IdGenerator.getTableId());\n\n if (!tableElement) {\n return <></>;\n }\n\n // テーブルの右下の位置を取得\n const rect = tableElement.getBoundingClientRect();\n const x = rect.right - 120;\n const y = rect.bottom - 50;\n\n return (\n <div\n className={`fixed z-[100] p-1 bg-gray-800 duration-300 pointer-events-none ${\n isDisplay ? \"opacity-100\" : \"opacity-0\"\n }`}\n style={{ top: y, left: x }}\n >\n <p className=\"text-white text-xs\"
|
|
1
|
+
{"version":3,"file":"components.js","sources":["../../../../../src/table/copy/components.tsx"],"sourcesContent":["import { useEffect, useState } from \"react\";\nimport { useCopyStateContext } from \"./provider\";\nimport { useTableIdGenerator } from \"../id\";\nimport { useMessages } from \"../locale/provider\";\n\nexport function CopiedMessage() {\n const IdGenerator = useTableIdGenerator();\n const [isDisplay, setIsDisplay] = useState(false);\n const { copiedAt } = useCopyStateContext();\n const messages = useMessages();\n\n useEffect(() => {\n if (copiedAt) {\n setIsDisplay(true);\n\n const timer = setTimeout(() => {\n setIsDisplay(false);\n }, 1000);\n\n return () => {\n setIsDisplay(false);\n clearTimeout(timer);\n };\n }\n }, [copiedAt]);\n\n if (!isDisplay) {\n return <></>;\n }\n\n const tableElement = document.getElementById(IdGenerator.getTableId());\n\n if (!tableElement) {\n return <></>;\n }\n\n // テーブルの右下の位置を取得\n const rect = tableElement.getBoundingClientRect();\n const x = rect.right - 120;\n const y = rect.bottom - 50;\n\n return (\n <div\n className={`fixed z-[100] p-1 bg-gray-800 duration-300 pointer-events-none ${\n isDisplay ? \"opacity-100\" : \"opacity-0\"\n }`}\n style={{ top: y, left: x }}\n >\n <p className=\"text-white text-xs\">{messages.copied}</p>\n </div>\n );\n}\n"],"names":["CopiedMessage","IdGenerator","useTableIdGenerator","_a","useState","isDisplay","setIsDisplay","copiedAt","useCopyStateContext","messages","useMessages","useEffect","timer_1","setTimeout","clearTimeout","_jsx","tableElement","document","getElementById","getTableId","rect","getBoundingClientRect","x","right","y","bottom","className","concat","style","top","left","copied"],"mappings":"+QAKgBA,IACd,IAAMC,EAAcC,IACdC,EAA4BC,GAAS,GAApCC,EAASF,EAAA,GAAEG,EAAYH,EAAA,GACtBI,EAAaC,aACfC,EAAWC,IAiBjB,GAfAC,GAAU,WACR,GAAIJ,EAAU,CACZD,GAAa,GAEb,IAAMM,EAAQC,YAAW,WACvBP,GAAa,EACf,GAAG,KAEH,OAAO,WACLA,GAAa,GACbQ,aAAaF,EACf,CACF,CACF,GAAG,CAACL,KAECF,EACH,OAAOU,QAGT,IAAMC,EAAeC,SAASC,eAAejB,EAAYkB,cAEzD,IAAKH,EACH,OAAOD,QAIT,IAAMK,EAAOJ,EAAaK,wBACpBC,EAAIF,EAAKG,MAAQ,IACjBC,EAAIJ,EAAKK,OAAS,GAExB,OACEV,EAAA,MAAA,CACEW,UAAW,kEAAAC,OACTtB,EAAY,cAAgB,aAE9BuB,MAAO,CAAEC,IAAKL,EAAGM,KAAMR,YAEvBP,EAAA,IAAA,CAAGW,UAAU,8BAAsBjB,EAASsB,UAGlD"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use client";import{__spreadArray as e}from"../../../../node_modules/tslib/tslib.es6.js";import{jsx as o,Fragment as
|
|
1
|
+
"use client";import{__spreadArray as e}from"../../../../node_modules/tslib/tslib.es6.js";import{jsx as o,Fragment as t,jsxs as n}from"react/jsx-runtime";import{useState as r,useRef as i,useEffect as l,useMemo as c}from"react";import{useEditActionContext as s}from"../provider.js";import{CancelIcon as u}from"../../../icon/cancel-icon.js";import{SelectBox as a}from"../../../select-box/index.js";import{useTableIdGenerator as d}from"../../id/provider.js";import{useMessages as m}from"../../locale/provider.js";function f(f){var p=d(),v=m(),b=f.col,j=s().endEditing,w=f.row[b.key],g=!!b.editable&&b.allowEmpty,x=r(w),E=x[0],h=x[1],y=i(null),N=i(null);l((function(){N.current&&N.current.focus()}),[N]);var k=function(e){b.editable&&b.onCellBlur(b.key,e,f.row,j)};l((function(){var e=function(e){var o=y.current,t=e.target;t instanceof Node&&(null==o?void 0:o.contains(t))||(E!==w?k(E):j())};return document.addEventListener("mousedown",e),function(){document.removeEventListener("mousedown",e)}}),[E,k,j,w]);var C=c((function(){return g?e([{value:"",label:""===w?v.selectNone:v.selectClear}],b.options,!0):b.options}),[b.options,g,w,v]);return b.editable?n("div",{ref:y,className:"flex justify-between gap-1 w-full items-center",children:[o(a,{id:p.getEditorId(),inputRef:N,value:E,defaultIsOpen:!0,options:C,placeholder:v.selectPlaceholder,onSelect:function(e){h(e),k(e)}}),o("button",{className:"cursor-pointer",onMouseDown:function(e){e.preventDefault(),e.stopPropagation(),setTimeout((function(){h(w),j()}),300)},children:o(u,{size:16})})]}):o(t,{})}export{f as SelectCellInput};
|
|
2
2
|
//# sourceMappingURL=select-input.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"select-input.js","sources":["../../../../../../src/table/edit/ui/select-input.tsx"],"sourcesContent":["\"use client\";\n\nimport { useEffect, useMemo, useRef, useState } from \"react\";\nimport { useEditActionContext } from \"../provider\";\nimport { CancelIcon } from \"../../../icon/cancel-icon\";\nimport {\n DataObject,\n DataRecord,\n TColumnProperty,\n TSelectCellEditingCondition,\n} from \"../../table/type\";\nimport { SelectBox } from \"../../../select-box\";\nimport { useTableIdGenerator } from \"../../id\";\n\ntype TPropsCellInput = {\n col: TColumnProperty<DataRecord> & TSelectCellEditingCondition<DataRecord>;\n row: DataObject<DataRecord>;\n};\n\nexport function SelectCellInput(props: TPropsCellInput) {\n const IdGenerator = useTableIdGenerator();\n const col = props.col;\n const { endEditing } = useEditActionContext();\n const prevValue = props.row[col.key] as string;\n const allowEmpty = col.editable ? col.allowEmpty : false;\n const [value, setValue] = useState(prevValue);\n const ref = useRef<HTMLDivElement>(null);\n const inputRef = useRef<HTMLInputElement>(null);\n\n useEffect(() => {\n if (inputRef.current) {\n inputRef.current.focus();\n }\n }, [inputRef]);\n\n const updateCellValue = (value: string) => {\n if (col.editable) {\n col.onCellBlur(col.key, value, props.row, endEditing);\n }\n };\n\n useEffect(() => {\n const onClickOutOfSelectBox = (e: MouseEvent) => {\n const selectInputElement = ref.current;\n const ele = e.target;\n\n if (ele instanceof Node && selectInputElement?.contains(ele)) return;\n\n if (value === prevValue) {\n endEditing();\n return;\n }\n\n updateCellValue(value);\n };\n\n document.addEventListener(\"mousedown\", onClickOutOfSelectBox);\n\n return () => {\n document.removeEventListener(\"mousedown\", onClickOutOfSelectBox);\n };\n }, [value, updateCellValue, endEditing, prevValue]);\n\n const options = useMemo(() => {\n if (allowEmpty) {\n return [\n {\n value: \"\",\n label: prevValue === \"\" ?
|
|
1
|
+
{"version":3,"file":"select-input.js","sources":["../../../../../../src/table/edit/ui/select-input.tsx"],"sourcesContent":["\"use client\";\n\nimport { useEffect, useMemo, useRef, useState } from \"react\";\nimport { useEditActionContext } from \"../provider\";\nimport { CancelIcon } from \"../../../icon/cancel-icon\";\nimport {\n DataObject,\n DataRecord,\n TColumnProperty,\n TSelectCellEditingCondition,\n} from \"../../table/type\";\nimport { SelectBox } from \"../../../select-box\";\nimport { useTableIdGenerator } from \"../../id\";\nimport { useMessages } from \"../../locale/provider\";\n\ntype TPropsCellInput = {\n col: TColumnProperty<DataRecord> & TSelectCellEditingCondition<DataRecord>;\n row: DataObject<DataRecord>;\n};\n\nexport function SelectCellInput(props: TPropsCellInput) {\n const IdGenerator = useTableIdGenerator();\n const messages = useMessages();\n const col = props.col;\n const { endEditing } = useEditActionContext();\n const prevValue = props.row[col.key] as string;\n const allowEmpty = col.editable ? col.allowEmpty : false;\n const [value, setValue] = useState(prevValue);\n const ref = useRef<HTMLDivElement>(null);\n const inputRef = useRef<HTMLInputElement>(null);\n\n useEffect(() => {\n if (inputRef.current) {\n inputRef.current.focus();\n }\n }, [inputRef]);\n\n const updateCellValue = (value: string) => {\n if (col.editable) {\n col.onCellBlur(col.key, value, props.row, endEditing);\n }\n };\n\n useEffect(() => {\n const onClickOutOfSelectBox = (e: MouseEvent) => {\n const selectInputElement = ref.current;\n const ele = e.target;\n\n if (ele instanceof Node && selectInputElement?.contains(ele)) return;\n\n if (value === prevValue) {\n endEditing();\n return;\n }\n\n updateCellValue(value);\n };\n\n document.addEventListener(\"mousedown\", onClickOutOfSelectBox);\n\n return () => {\n document.removeEventListener(\"mousedown\", onClickOutOfSelectBox);\n };\n }, [value, updateCellValue, endEditing, prevValue]);\n\n const options = useMemo(() => {\n if (allowEmpty) {\n return [\n {\n value: \"\",\n label: prevValue === \"\" ? messages.selectNone : messages.selectClear,\n },\n ...col.options,\n ];\n } else {\n return col.options;\n }\n }, [col.options, allowEmpty, prevValue, messages]);\n\n // Return only after every hook has run, so hooks are always called in the\n // same order.\n if (!col.editable) return <></>;\n\n return (\n <div ref={ref} className=\"flex justify-between gap-1 w-full items-center\">\n <SelectBox\n id={IdGenerator.getEditorId()}\n inputRef={inputRef}\n value={value}\n defaultIsOpen={true}\n options={options}\n placeholder={messages.selectPlaceholder}\n onSelect={(value) => {\n setValue(value);\n updateCellValue(value);\n }}\n />\n <button\n className=\"cursor-pointer\"\n onMouseDown={(e) => {\n e.preventDefault();\n e.stopPropagation();\n setTimeout(() => {\n setValue(prevValue);\n endEditing();\n }, 300);\n }}\n >\n <CancelIcon size={16} />\n </button>\n </div>\n );\n}\n"],"names":["SelectCellInput","props","IdGenerator","useTableIdGenerator","messages","useMessages","col","endEditing","useEditActionContext","prevValue","row","key","allowEmpty","editable","_a","useState","value","setValue","ref","useRef","inputRef","useEffect","current","focus","updateCellValue","onCellBlur","onClickOutOfSelectBox","e","selectInputElement","ele","target","Node","contains","document","addEventListener","removeEventListener","options","useMemo","__spreadArray","label","selectNone","selectClear","_jsxs","className","children","_jsx","SelectBox","id","getEditorId","defaultIsOpen","placeholder","selectPlaceholder","onSelect","onMouseDown","preventDefault","stopPropagation","setTimeout","CancelIcon","size"],"mappings":"6fAoBM,SAAUA,EAAgBC,GAC9B,IAAMC,EAAcC,IACdC,EAAWC,IACXC,EAAML,EAAMK,IACVC,EAAeC,eACjBC,EAAYR,EAAMS,IAAIJ,EAAIK,KAC1BC,IAAaN,EAAIO,UAAWP,EAAIM,WAChCE,EAAoBC,EAASN,GAA5BO,EAAKF,EAAA,GAAEG,EAAQH,EAAA,GAChBI,EAAMC,EAAuB,MAC7BC,EAAWD,EAAyB,MAE1CE,GAAU,WACJD,EAASE,SACXF,EAASE,QAAQC,OAErB,GAAG,CAACH,IAEJ,IAAMI,EAAkB,SAACR,GACnBV,EAAIO,UACNP,EAAImB,WAAWnB,EAAIK,IAAKK,EAAOf,EAAMS,IAAKH,EAE9C,EAEAc,GAAU,WACR,IAAMK,EAAwB,SAACC,GAC7B,IAAMC,EAAqBV,EAAII,QACzBO,EAAMF,EAAEG,OAEVD,aAAeE,OAAQH,aAAkB,EAAlBA,EAAoBI,SAASH,MAEpDb,IAAUP,EAKde,EAAgBR,GAJdT,IAKJ,EAIA,OAFA0B,SAASC,iBAAiB,YAAaR,GAEhC,WACLO,SAASE,oBAAoB,YAAaT,EAC5C,CACF,GAAG,CAACV,EAAOQ,EAAiBjB,EAAYE,IAExC,IAAM2B,EAAUC,GAAQ,WACtB,OAAIzB,EACF0B,EAAA,CACE,CACEtB,MAAO,GACPuB,MAAqB,KAAd9B,EAAmBL,EAASoC,WAAapC,EAASqC,cAExDnC,EAAI8B,SAAO,GAGT9B,EAAI8B,OAEf,GAAG,CAAC9B,EAAI8B,QAASxB,EAAYH,EAAWL,IAIxC,OAAKE,EAAIO,SAGP6B,SAAKxB,IAAKA,EAAKyB,UAAU,iDAAgDC,SAAA,CACvEC,EAACC,EAAS,CACRC,GAAI7C,EAAY8C,cAChB5B,SAAUA,EACVJ,MAAOA,EACPiC,eAAe,EACfb,QAASA,EACTc,YAAa9C,EAAS+C,kBACtBC,SAAU,SAACpC,GACTC,EAASD,GACTQ,EAAgBR,EAClB,IAEF6B,EAAA,SAAA,CACEF,UAAU,iBACVU,YAAa,SAAC1B,GACZA,EAAE2B,iBACF3B,EAAE4B,kBACFC,YAAW,WACTvC,EAASR,GACTF,GACF,GAAG,IACL,EAACqC,SAEDC,EAACY,EAAU,CAACC,KAAM,UA3BEb,OA+B5B"}
|
|
@@ -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":"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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":["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":"gKAQO,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,OAAOe,EAAmBhB,EAAOW,IAAcM,SAC7CD,EAAmBf,IAEvB,IAAK,aACH,OAAOU,IAAgBV,EACzB,IAAK,kBACH,OAAQe,EAAmBhB,EAAOW,IAAcM,SAC9CD,EAAmBf,KAK/B,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,IAAMI,EAAYf,EAAYQ,GACxBQ,EAAWhB,EAAYJ,EAAMZ,QAAQc,OAE3C,GAAkB,OAAdiB,GAAmC,OAAbC,EACxB,OAAO,EAGT,OAAQlC,EAAU2B,SAASd,KACzB,IAAK,UACH,OAAOoB,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,GAAIpB,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,IAAMM,EAAYrB,EAAMZ,QAAQc,MAEhC,OAAQhB,EAAU2B,SAASd,KACzB,IAAK,cACH,OAAOa,EAAcS,EACvB,IAAK,eACH,OAAOT,GAAeS,EACxB,IAAK,cACH,OAAOT,EAAcS,EACvB,IAAK,eACH,OAAOT,GAAeS,EAE5B,IAAK,OACH,GAAIrB,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,2 +1,2 @@
|
|
|
1
|
-
|
|
1
|
+
import{MESSAGES as e}from"../locale/messages.js";function t(t){alert(e.ja.validation(t))}function n(e,n){if("string"===e.type)return function(e,n,r,l){return function(e){var a=[];return(null==r?void 0:r.maxLength)&&e.length>r.maxLength&&a.push({type:"STRING_IS_TOO_LONG",label:n,maxLength:r.maxLength,currentLength:e.length,value:e}),(null==r?void 0:r.minLength)&&e.length<r.minLength&&a.push({type:"STRING_IS_TOO_SHORT",label:n,minLength:r.minLength,currentLength:e.length,value:e}),(null==r?void 0:r.pattern)&&(new RegExp(r.pattern).test(e)||a.push({type:"STRING_PATTERN_NOT_MATCH",label:n,pattern:r.pattern,value:e})),!(a.length>0&&(l?l(a):t(a),1))}}(e.key,e.label,e.constraints,n);if("number"===e.type)return function(e,n,r,l){return function(e){var a=[];return"string"!=typeof e||/^-?[0-9]+(\.[0-9]+)?$/.test(e)?(e=Number(e),"number"==typeof(null==r?void 0:r.max)&&e>r.max&&a.push({type:"NUMBER_IS_TOO_LARGE",label:n,max:r.max,value:e}),"number"==typeof(null==r?void 0:r.min)&&e<r.min&&a.push({type:"NUMBER_IS_TOO_SMALL",label:n,min:r.min,value:e}),!(a.length>0&&(l?l(a):t(a),1))):(a.push({type:"NOT_NUMBER",label:n,value:e}),l?l(a):t(a),!1)}}(e.key,e.label,e.constraints,n);if("select"===e.type)return function(e,n,r,l,a){var u=new Set(r.map((function(e){return e.label})));return function(e){if(l&&""===e)return!0;var r=[];return u.has(e)||r.push({type:"NOT_IN_OPTIONS",label:n,value:e,options:Array.from(u)}),!(r.length>0&&(a?a(r):t(r),1))}}(e.key,e.label,e.options,e.allowEmpty,n);if("date"===e.type)return function(e,n,r){return function(e){var l=[];return isNaN(new Date(e).getTime())&&l.push({type:"NOT_DATE",label:n,value:e}),!(l.length>0&&(r?r(l):t(l),1))}}(e.key,e.label,n);if("datetime"===e.type)return function(e,n,r){return function(e){var l=[];return isNaN(new Date(e).getTime())&&l.push({type:"NOT_DATETIME",label:n,value:e}),!(l.length>0&&(r?r(l):t(l),1))}}(e.key,e.label,n);throw new Error("Invalid type")}export{n as generateValidateFunction};
|
|
2
2
|
//# sourceMappingURL=generate-validate-function.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"generate-validate-function.js","sources":["../../../../../src/table/libs/generate-validate-function.ts"],"sourcesContent":["export type TStringValidateOption = {\n maxLength?: number;\n minLength?: number;\n pattern?: string;\n};\n\nexport type TNumberValidateOption = {\n max?: number;\n min?: number;\n};\n\ntype TPropsGenerateValidateFunction = {\n key: string;\n label: string;\n} & (\n | {\n type: \"string\";\n constraints?: TStringValidateOption;\n }\n | {\n type: \"number\";\n constraints?: TNumberValidateOption;\n }\n | {\n type: \"select\";\n options: { value: string; label: string }[];\n allowEmpty?: boolean;\n }\n | {\n type: \"date\";\n }\n | {\n type: \"datetime\";\n }\n);\n\ntype TStringValidateFunction = (value: string) => boolean;\n\nexport type TErrorValidation = {\n label: string;\n value: string | number;\n} & (\n | {\n type: \"STRING_IS_TOO_LONG\";\n maxLength: number;\n currentLength: number;\n }\n | {\n type: \"STRING_IS_TOO_SHORT\";\n minLength: number;\n currentLength: number;\n }\n | {\n type: \"STRING_PATTERN_NOT_MATCH\";\n pattern: string;\n }\n | {\n type: \"NUMBER_IS_TOO_LARGE\";\n max: number;\n }\n | {\n type: \"NUMBER_IS_TOO_SMALL\";\n min: number;\n }\n | {\n type: \"NOT_NUMBER\";\n }\n | {\n type: \"NOT_IN_OPTIONS\";\n options: string[];\n }\n | {\n type: \"NOT_DATE\";\n }\n | {\n type: \"NOT_DATETIME\";\n }\n);\n\nfunction defaultErrorHandler(errors: TErrorValidation[]) {\n let message = `入力値が不正のため、エラーを確認し修正してください。\\n\\n`;\n message += `[対象の列名]: ${errors[0].label}\\n`;\n message += `[入力値] : ${errors[0].value}\\n\\n`;\n message += `[エラー内容]:`;\n\n message += errors.reduce((acc, error) => {\n switch (error.type) {\n case \"STRING_IS_TOO_LONG\":\n return (\n acc +\n `\\n・文字数が最大の長さ${error.maxLength}文字を超えています。(現在${error.currentLength}文字)`\n );\n case \"STRING_IS_TOO_SHORT\":\n return (\n acc +\n `\\n・文字数が最小の長さ${error.minLength}文字に満たないです。(現在${error.currentLength}文字)`\n );\n case \"STRING_PATTERN_NOT_MATCH\":\n return acc + `\\n・パターンに一致しません。(パターン${error.pattern})`;\n case \"NUMBER_IS_TOO_LARGE\":\n return (\n acc + `\\n・最大値${error.max}を超えています。(入力値${error.value})`\n );\n case \"NUMBER_IS_TOO_SMALL\":\n return (\n acc + `\\n・最小値${error.min}を下回っています。(入力値${error.value})`\n );\n case \"NOT_NUMBER\":\n return acc + `\\n・数値ではない値が入力されています。`;\n case \"NOT_IN_OPTIONS\":\n return acc + `\\n・選択肢に含まれていない値です。`;\n case \"NOT_DATE\":\n return acc + `\\n・日付の形式ではありません。`;\n case \"NOT_DATETIME\":\n return acc + `\\n・日時の形式ではありません。`;\n }\n }, \"\");\n\n alert(message);\n}\n\nfunction generateStringValidateFunction(\n key: string,\n label: string,\n constraints?: TStringValidateOption,\n errorHandler?: (errors: TErrorValidation[]) => void\n): TStringValidateFunction {\n return (value: string) => {\n const errors: TErrorValidation[] = [];\n\n if (constraints?.maxLength) {\n if (value.length > constraints.maxLength) {\n errors.push({\n type: \"STRING_IS_TOO_LONG\",\n label,\n maxLength: constraints.maxLength,\n currentLength: value.length,\n value,\n });\n }\n }\n\n if (constraints?.minLength) {\n if (value.length < constraints.minLength) {\n errors.push({\n type: \"STRING_IS_TOO_SHORT\",\n label,\n minLength: constraints.minLength,\n currentLength: value.length,\n value,\n });\n }\n }\n\n if (constraints?.pattern) {\n if (!new RegExp(constraints.pattern).test(value)) {\n errors.push({\n type: \"STRING_PATTERN_NOT_MATCH\",\n label,\n pattern: constraints.pattern,\n value,\n });\n }\n }\n\n if (errors.length > 0) {\n if (errorHandler) {\n errorHandler(errors);\n } else {\n defaultErrorHandler(errors);\n }\n return false;\n }\n\n return true;\n };\n}\n\ntype TNumberValidateFunction = (value: number) => boolean;\n\nfunction generateNumberValidateFunction(\n key: string,\n label: string,\n constraints?: TNumberValidateOption,\n errorHandler?: (errors: TErrorValidation[]) => void\n): TNumberValidateFunction {\n return (value: number | string) => {\n const errors: TErrorValidation[] = [];\n\n if (typeof value === \"string\") {\n // 小数も含めて数値に変換可能な値かを検査\n if (!/^-?[0-9]+(\\.[0-9]+)?$/.test(value)) {\n errors.push({\n type: \"NOT_NUMBER\",\n label,\n value,\n });\n\n if (errorHandler) {\n errorHandler(errors);\n } else {\n defaultErrorHandler(errors);\n }\n return false;\n }\n }\n\n value = Number(value);\n\n if (typeof constraints?.max === \"number\") {\n if (value > constraints.max) {\n errors.push({\n type: \"NUMBER_IS_TOO_LARGE\",\n label,\n max: constraints.max,\n value,\n });\n }\n }\n\n if (typeof constraints?.min === \"number\") {\n if (value < constraints.min) {\n errors.push({\n type: \"NUMBER_IS_TOO_SMALL\",\n label,\n min: constraints.min,\n value,\n });\n }\n }\n\n if (errors.length > 0) {\n if (errorHandler) {\n errorHandler(errors);\n } else {\n defaultErrorHandler(errors);\n }\n return false;\n }\n\n return true;\n };\n}\n\ntype TSelectValidateFunction = (label: string) => boolean;\n\nfunction generatSelectValidateFunction(\n key: string,\n columnLabel: string,\n options: { value: string; label: string }[],\n allowEmpty?: boolean,\n errorHandler?: (errors: TErrorValidation[]) => void\n): TSelectValidateFunction {\n const labelSets = new Set(options.map((option) => option.label));\n return (label: string) => {\n if (allowEmpty && label === \"\") {\n return true;\n }\n\n const errors: TErrorValidation[] = [];\n\n if (!labelSets.has(label)) {\n errors.push({\n type: \"NOT_IN_OPTIONS\",\n label: columnLabel,\n value: label,\n options: Array.from(labelSets),\n });\n }\n\n if (errors.length > 0) {\n if (errorHandler) {\n errorHandler(errors);\n } else {\n defaultErrorHandler(errors);\n }\n return false;\n }\n\n return true;\n };\n}\n\ntype TDateValidateFunction = (label: string) => boolean;\n\nfunction generatDateValidateFunction(\n key: string,\n columnLabel: string,\n errorHandler?: (errors: TErrorValidation[]) => void\n): TDateValidateFunction {\n return (value: string) => {\n const errors: TErrorValidation[] = [];\n\n if (isNaN(new Date(value).getTime())) {\n errors.push({\n type: \"NOT_DATE\",\n label: columnLabel,\n value,\n });\n }\n\n if (errors.length > 0) {\n if (errorHandler) {\n errorHandler(errors);\n } else {\n defaultErrorHandler(errors);\n }\n return false;\n }\n\n return true;\n };\n}\n\ntype TDatetimeValidateFunction = (label: string) => boolean;\n\nfunction generatDatetimeValidateFunction(\n key: string,\n columnLabel: string,\n errorHandler?: (errors: TErrorValidation[]) => void\n): TDatetimeValidateFunction {\n return (value: string) => {\n const errors: TErrorValidation[] = [];\n\n if (isNaN(new Date(value).getTime())) {\n errors.push({\n type: \"NOT_DATETIME\",\n label: columnLabel,\n value,\n });\n }\n\n if (errors.length > 0) {\n if (errorHandler) {\n errorHandler(errors);\n } else {\n defaultErrorHandler(errors);\n }\n return false;\n }\n\n return true;\n };\n}\n\nexport function generateValidateFunction(\n props: TPropsGenerateValidateFunction,\n errorHandler?: (errors: TErrorValidation[]) => void\n) {\n if (props.type === \"string\") {\n return generateStringValidateFunction(\n props.key,\n props.label,\n props.constraints,\n errorHandler\n );\n } else if (props.type === \"number\") {\n return generateNumberValidateFunction(\n props.key,\n props.label,\n props.constraints,\n errorHandler\n );\n } else if (props.type === \"select\") {\n return generatSelectValidateFunction(\n props.key,\n props.label,\n props.options,\n props.allowEmpty,\n errorHandler\n );\n } else if (props.type === \"date\") {\n return generatDateValidateFunction(props.key, props.label, errorHandler);\n } else if (props.type === \"datetime\") {\n return generatDatetimeValidateFunction(\n props.key,\n props.label,\n errorHandler\n );\n } else {\n throw new Error(\"Invalid type\");\n }\n}\n"],"names":["defaultErrorHandler","errors","message","label","value","reduce","acc","error","type","concat","maxLength","currentLength","minLength","pattern","max","min","alert","generateValidateFunction","props","errorHandler","key","constraints","length","push","RegExp","test","generateStringValidateFunction","Number","generateNumberValidateFunction","columnLabel","options","allowEmpty","labelSets","Set","map","option","has","Array","from","generatSelectValidateFunction","isNaN","Date","getTime","generatDateValidateFunction","generatDatetimeValidateFunction","Error"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"generate-validate-function.js","sources":["../../../../../src/table/libs/generate-validate-function.ts"],"sourcesContent":["import { MESSAGES } from \"../locale/messages\";\n\nexport type TStringValidateOption = {\n maxLength?: number;\n minLength?: number;\n pattern?: string;\n};\n\nexport type TNumberValidateOption = {\n max?: number;\n min?: number;\n};\n\ntype TPropsGenerateValidateFunction = {\n key: string;\n label: string;\n} & (\n | {\n type: \"string\";\n constraints?: TStringValidateOption;\n }\n | {\n type: \"number\";\n constraints?: TNumberValidateOption;\n }\n | {\n type: \"select\";\n options: { value: string; label: string }[];\n allowEmpty?: boolean;\n }\n | {\n type: \"date\";\n }\n | {\n type: \"datetime\";\n }\n);\n\ntype TStringValidateFunction = (value: string) => boolean;\n\nexport type TErrorValidation = {\n label: string;\n value: string | number;\n} & (\n | {\n type: \"STRING_IS_TOO_LONG\";\n maxLength: number;\n currentLength: number;\n }\n | {\n type: \"STRING_IS_TOO_SHORT\";\n minLength: number;\n currentLength: number;\n }\n | {\n type: \"STRING_PATTERN_NOT_MATCH\";\n pattern: string;\n }\n | {\n type: \"NUMBER_IS_TOO_LARGE\";\n max: number;\n }\n | {\n type: \"NUMBER_IS_TOO_SMALL\";\n min: number;\n }\n | {\n type: \"NOT_NUMBER\";\n }\n | {\n type: \"NOT_IN_OPTIONS\";\n options: string[];\n }\n | {\n type: \"NOT_DATE\";\n }\n | {\n type: \"NOT_DATETIME\";\n }\n);\n\n// Used when no errorHandler is given. The table passes its own handler with\n// the messages of its locale, so this is only a fallback.\nfunction defaultErrorHandler(errors: TErrorValidation[]) {\n alert(MESSAGES.ja.validation(errors));\n}\n\nfunction generateStringValidateFunction(\n key: string,\n label: string,\n constraints?: TStringValidateOption,\n errorHandler?: (errors: TErrorValidation[]) => void\n): TStringValidateFunction {\n return (value: string) => {\n const errors: TErrorValidation[] = [];\n\n if (constraints?.maxLength) {\n if (value.length > constraints.maxLength) {\n errors.push({\n type: \"STRING_IS_TOO_LONG\",\n label,\n maxLength: constraints.maxLength,\n currentLength: value.length,\n value,\n });\n }\n }\n\n if (constraints?.minLength) {\n if (value.length < constraints.minLength) {\n errors.push({\n type: \"STRING_IS_TOO_SHORT\",\n label,\n minLength: constraints.minLength,\n currentLength: value.length,\n value,\n });\n }\n }\n\n if (constraints?.pattern) {\n if (!new RegExp(constraints.pattern).test(value)) {\n errors.push({\n type: \"STRING_PATTERN_NOT_MATCH\",\n label,\n pattern: constraints.pattern,\n value,\n });\n }\n }\n\n if (errors.length > 0) {\n if (errorHandler) {\n errorHandler(errors);\n } else {\n defaultErrorHandler(errors);\n }\n return false;\n }\n\n return true;\n };\n}\n\ntype TNumberValidateFunction = (value: number) => boolean;\n\nfunction generateNumberValidateFunction(\n key: string,\n label: string,\n constraints?: TNumberValidateOption,\n errorHandler?: (errors: TErrorValidation[]) => void\n): TNumberValidateFunction {\n return (value: number | string) => {\n const errors: TErrorValidation[] = [];\n\n if (typeof value === \"string\") {\n // 小数も含めて数値に変換可能な値かを検査\n if (!/^-?[0-9]+(\\.[0-9]+)?$/.test(value)) {\n errors.push({\n type: \"NOT_NUMBER\",\n label,\n value,\n });\n\n if (errorHandler) {\n errorHandler(errors);\n } else {\n defaultErrorHandler(errors);\n }\n return false;\n }\n }\n\n value = Number(value);\n\n if (typeof constraints?.max === \"number\") {\n if (value > constraints.max) {\n errors.push({\n type: \"NUMBER_IS_TOO_LARGE\",\n label,\n max: constraints.max,\n value,\n });\n }\n }\n\n if (typeof constraints?.min === \"number\") {\n if (value < constraints.min) {\n errors.push({\n type: \"NUMBER_IS_TOO_SMALL\",\n label,\n min: constraints.min,\n value,\n });\n }\n }\n\n if (errors.length > 0) {\n if (errorHandler) {\n errorHandler(errors);\n } else {\n defaultErrorHandler(errors);\n }\n return false;\n }\n\n return true;\n };\n}\n\ntype TSelectValidateFunction = (label: string) => boolean;\n\nfunction generatSelectValidateFunction(\n key: string,\n columnLabel: string,\n options: { value: string; label: string }[],\n allowEmpty?: boolean,\n errorHandler?: (errors: TErrorValidation[]) => void\n): TSelectValidateFunction {\n const labelSets = new Set(options.map((option) => option.label));\n return (label: string) => {\n if (allowEmpty && label === \"\") {\n return true;\n }\n\n const errors: TErrorValidation[] = [];\n\n if (!labelSets.has(label)) {\n errors.push({\n type: \"NOT_IN_OPTIONS\",\n label: columnLabel,\n value: label,\n options: Array.from(labelSets),\n });\n }\n\n if (errors.length > 0) {\n if (errorHandler) {\n errorHandler(errors);\n } else {\n defaultErrorHandler(errors);\n }\n return false;\n }\n\n return true;\n };\n}\n\ntype TDateValidateFunction = (label: string) => boolean;\n\nfunction generatDateValidateFunction(\n key: string,\n columnLabel: string,\n errorHandler?: (errors: TErrorValidation[]) => void\n): TDateValidateFunction {\n return (value: string) => {\n const errors: TErrorValidation[] = [];\n\n if (isNaN(new Date(value).getTime())) {\n errors.push({\n type: \"NOT_DATE\",\n label: columnLabel,\n value,\n });\n }\n\n if (errors.length > 0) {\n if (errorHandler) {\n errorHandler(errors);\n } else {\n defaultErrorHandler(errors);\n }\n return false;\n }\n\n return true;\n };\n}\n\ntype TDatetimeValidateFunction = (label: string) => boolean;\n\nfunction generatDatetimeValidateFunction(\n key: string,\n columnLabel: string,\n errorHandler?: (errors: TErrorValidation[]) => void\n): TDatetimeValidateFunction {\n return (value: string) => {\n const errors: TErrorValidation[] = [];\n\n if (isNaN(new Date(value).getTime())) {\n errors.push({\n type: \"NOT_DATETIME\",\n label: columnLabel,\n value,\n });\n }\n\n if (errors.length > 0) {\n if (errorHandler) {\n errorHandler(errors);\n } else {\n defaultErrorHandler(errors);\n }\n return false;\n }\n\n return true;\n };\n}\n\nexport function generateValidateFunction(\n props: TPropsGenerateValidateFunction,\n errorHandler?: (errors: TErrorValidation[]) => void\n) {\n if (props.type === \"string\") {\n return generateStringValidateFunction(\n props.key,\n props.label,\n props.constraints,\n errorHandler\n );\n } else if (props.type === \"number\") {\n return generateNumberValidateFunction(\n props.key,\n props.label,\n props.constraints,\n errorHandler\n );\n } else if (props.type === \"select\") {\n return generatSelectValidateFunction(\n props.key,\n props.label,\n props.options,\n props.allowEmpty,\n errorHandler\n );\n } else if (props.type === \"date\") {\n return generatDateValidateFunction(props.key, props.label, errorHandler);\n } else if (props.type === \"datetime\") {\n return generatDatetimeValidateFunction(\n props.key,\n props.label,\n errorHandler\n );\n } else {\n throw new Error(\"Invalid type\");\n }\n}\n"],"names":["defaultErrorHandler","errors","alert","MESSAGES","ja","validation","generateValidateFunction","props","errorHandler","type","key","label","constraints","value","maxLength","length","push","currentLength","minLength","pattern","RegExp","test","generateStringValidateFunction","Number","max","min","generateNumberValidateFunction","columnLabel","options","allowEmpty","labelSets","Set","map","option","has","Array","from","generatSelectValidateFunction","isNaN","Date","getTime","generatDateValidateFunction","generatDatetimeValidateFunction","Error"],"mappings":"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"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
var n={ja:{validation:function(n){var e="入力値が不正のため、エラーを確認し修正してください。\n\n";return e+="[対象の列名]: ".concat(n[0].label,"\n"),e+="[入力値] : ".concat(n[0].value,"\n\n"),(e+="[エラー内容]:")+n.map((function(n){switch(n.type){case"STRING_IS_TOO_LONG":return"\n・文字数が最大の長さ".concat(n.maxLength,"文字を超えています。(現在").concat(n.currentLength,"文字)");case"STRING_IS_TOO_SHORT":return"\n・文字数が最小の長さ".concat(n.minLength,"文字に満たないです。(現在").concat(n.currentLength,"文字)");case"STRING_PATTERN_NOT_MATCH":return"\n・パターンに一致しません。(パターン".concat(n.pattern,")");case"NUMBER_IS_TOO_LARGE":return"\n・最大値".concat(n.max,"を超えています。(入力値").concat(n.value,")");case"NUMBER_IS_TOO_SMALL":return"\n・最小値".concat(n.min,"を下回っています。(入力値").concat(n.value,")");case"NOT_NUMBER":return"\n・数値ではない値が入力されています。";case"NOT_IN_OPTIONS":return"\n・選択肢に含まれていない値です。";case"NOT_DATE":return"\n・日付の形式ではありません。";case"NOT_DATETIME":return"\n・日時の形式ではありません。"}})).join("")},paste:{noData:"ペーストデータがありません。",notEnoughRows:"貼り付け先の行数が足りません。",notEnoughColumns:"貼り付け先の列数が足りません。",notEditableColumn:function(n){return"編集できない列にデータを貼り付けることはできません。\n\n編集不可列: ".concat(n)},invalidValue:function(n){return"バリデーションエラー: ".concat(n)}},copied:"コピーしました!!!",selectNone:"-- 未選択 --",selectClear:"-- 選択解除 --",selectPlaceholder:"選択してください"},en:{validation:function(n){var e="The value is not valid. Please check the errors and fix it.\n\n";return e+="[Column]: ".concat(n[0].label,"\n"),e+="[Value] : ".concat(n[0].value,"\n\n"),(e+="[Errors]:")+n.map((function(n){switch(n.type){case"STRING_IS_TOO_LONG":return"\n- Must be at most ".concat(n.maxLength," characters (currently ").concat(n.currentLength,").");case"STRING_IS_TOO_SHORT":return"\n- Must be at least ".concat(n.minLength," characters (currently ").concat(n.currentLength,").");case"STRING_PATTERN_NOT_MATCH":return"\n- Does not match the pattern ".concat(n.pattern,".");case"NUMBER_IS_TOO_LARGE":return"\n- Must be ".concat(n.max," or less (got ").concat(n.value,").");case"NUMBER_IS_TOO_SMALL":return"\n- Must be ".concat(n.min," or more (got ").concat(n.value,").");case"NOT_NUMBER":return"\n- Must be a number.";case"NOT_IN_OPTIONS":return"\n- Must be one of the options.";case"NOT_DATE":return"\n- Must be a date.";case"NOT_DATETIME":return"\n- Must be a date and time."}})).join("")},paste:{noData:"There is no data to paste.",notEnoughRows:"There are not enough rows to paste into.",notEnoughColumns:"There are not enough columns to paste into.",notEditableColumn:function(n){return"Data cannot be pasted into a column that is not editable.\n\nColumn: ".concat(n)},invalidValue:function(n){return"Invalid value: ".concat(n)}},copied:"Copied!",selectNone:"-- None --",selectClear:"-- Clear --",selectPlaceholder:"Select..."}};export{n as MESSAGES};
|
|
2
|
+
//# sourceMappingURL=messages.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"messages.js","sources":["../../../../../src/table/locale/messages.ts"],"sourcesContent":["import type { TErrorValidation } from \"../libs/generate-validate-function\";\n\n/** Language of the messages the table shows by itself. */\nexport type TLocale = \"ja\" | \"en\";\n\nexport type TMessages = {\n /** Message shown by the default errorHandler (window.alert). */\n validation: (errors: TErrorValidation[]) => string;\n paste: {\n noData: string;\n notEnoughRows: string;\n notEnoughColumns: string;\n notEditableColumn: (column: string) => string;\n invalidValue: (value: string) => string;\n };\n copied: string;\n /** Empty option of a select cell when the cell is empty / has a value. */\n selectNone: string;\n selectClear: string;\n selectPlaceholder: string;\n};\n\nconst ja: TMessages = {\n validation: (errors) => {\n let message = `入力値が不正のため、エラーを確認し修正してください。\\n\\n`;\n message += `[対象の列名]: ${errors[0].label}\\n`;\n message += `[入力値] : ${errors[0].value}\\n\\n`;\n message += `[エラー内容]:`;\n return (\n message +\n errors\n .map((error) => {\n switch (error.type) {\n case \"STRING_IS_TOO_LONG\":\n return `\\n・文字数が最大の長さ${error.maxLength}文字を超えています。(現在${error.currentLength}文字)`;\n case \"STRING_IS_TOO_SHORT\":\n return `\\n・文字数が最小の長さ${error.minLength}文字に満たないです。(現在${error.currentLength}文字)`;\n case \"STRING_PATTERN_NOT_MATCH\":\n return `\\n・パターンに一致しません。(パターン${error.pattern})`;\n case \"NUMBER_IS_TOO_LARGE\":\n return `\\n・最大値${error.max}を超えています。(入力値${error.value})`;\n case \"NUMBER_IS_TOO_SMALL\":\n return `\\n・最小値${error.min}を下回っています。(入力値${error.value})`;\n case \"NOT_NUMBER\":\n return `\\n・数値ではない値が入力されています。`;\n case \"NOT_IN_OPTIONS\":\n return `\\n・選択肢に含まれていない値です。`;\n case \"NOT_DATE\":\n return `\\n・日付の形式ではありません。`;\n case \"NOT_DATETIME\":\n return `\\n・日時の形式ではありません。`;\n }\n })\n .join(\"\")\n );\n },\n paste: {\n noData: \"ペーストデータがありません。\",\n notEnoughRows: \"貼り付け先の行数が足りません。\",\n notEnoughColumns: \"貼り付け先の列数が足りません。\",\n notEditableColumn: (column) =>\n `編集できない列にデータを貼り付けることはできません。\\n\\n編集不可列: ${column}`,\n invalidValue: (value) => `バリデーションエラー: ${value}`,\n },\n copied: \"コピーしました!!!\",\n selectNone: \"-- 未選択 --\",\n selectClear: \"-- 選択解除 --\",\n selectPlaceholder: \"選択してください\",\n};\n\nconst en: TMessages = {\n validation: (errors) => {\n let message = `The value is not valid. Please check the errors and fix it.\\n\\n`;\n message += `[Column]: ${errors[0].label}\\n`;\n message += `[Value] : ${errors[0].value}\\n\\n`;\n message += `[Errors]:`;\n return (\n message +\n errors\n .map((error) => {\n switch (error.type) {\n case \"STRING_IS_TOO_LONG\":\n return `\\n- Must be at most ${error.maxLength} characters (currently ${error.currentLength}).`;\n case \"STRING_IS_TOO_SHORT\":\n return `\\n- Must be at least ${error.minLength} characters (currently ${error.currentLength}).`;\n case \"STRING_PATTERN_NOT_MATCH\":\n return `\\n- Does not match the pattern ${error.pattern}.`;\n case \"NUMBER_IS_TOO_LARGE\":\n return `\\n- Must be ${error.max} or less (got ${error.value}).`;\n case \"NUMBER_IS_TOO_SMALL\":\n return `\\n- Must be ${error.min} or more (got ${error.value}).`;\n case \"NOT_NUMBER\":\n return `\\n- Must be a number.`;\n case \"NOT_IN_OPTIONS\":\n return `\\n- Must be one of the options.`;\n case \"NOT_DATE\":\n return `\\n- Must be a date.`;\n case \"NOT_DATETIME\":\n return `\\n- Must be a date and time.`;\n }\n })\n .join(\"\")\n );\n },\n paste: {\n noData: \"There is no data to paste.\",\n notEnoughRows: \"There are not enough rows to paste into.\",\n notEnoughColumns: \"There are not enough columns to paste into.\",\n notEditableColumn: (column) =>\n `Data cannot be pasted into a column that is not editable.\\n\\nColumn: ${column}`,\n invalidValue: (value) => `Invalid value: ${value}`,\n },\n copied: \"Copied!\",\n selectNone: \"-- None --\",\n selectClear: \"-- Clear --\",\n selectPlaceholder: \"Select...\",\n};\n\nexport const MESSAGES: Record<TLocale, TMessages> = { ja, en };\n"],"names":["MESSAGES","ja","validation","errors","message","label","value","map","error","type","concat","maxLength","currentLength","minLength","pattern","max","min","join","paste","noData","notEnoughRows","notEnoughColumns","notEditableColumn","column","invalidValue","copied","selectNone","selectClear","selectPlaceholder","en"],"mappings":"AAsBA,IAgGaA,EAAuC,CAAEC,GAhGhC,CACpBC,WAAY,SAACC,GACX,IAAIC,EAAU,iCAId,OAHAA,GAAW,mBAAYD,EAAO,GAAGE,MAAK,MACtCD,GAAW,mBAAYD,EAAO,GAAGG,MAAK,SACtCF,GAAW,YAGTD,EACGI,KAAI,SAACC,GACJ,OAAQA,EAAMC,MACZ,IAAK,qBACH,MAAO,eAAAC,OAAeF,EAAMG,kCAAyBH,EAAMI,cAAa,OAC1E,IAAK,sBACH,MAAO,eAAAF,OAAeF,EAAMK,kCAAyBL,EAAMI,cAAa,OAC1E,IAAK,2BACH,MAAO,uBAAAF,OAAuBF,EAAMM,aACtC,IAAK,sBACH,MAAO,SAAAJ,OAASF,EAAMO,2BAAkBP,EAAMF,MAAK,KACrD,IAAK,sBACH,MAAO,SAAAI,OAASF,EAAMQ,4BAAmBR,EAAMF,MAAK,KACtD,IAAK,aACH,MAAO,uBACT,IAAK,iBACH,MAAO,qBACT,IAAK,WACH,MAAO,mBACT,IAAK,eACH,MAAO,mBAEb,IACCW,KAAK,GAEZ,EACAC,MAAO,CACLC,OAAQ,iBACRC,cAAe,kBACfC,iBAAkB,kBAClBC,kBAAmB,SAACC,GAClB,MAAA,wCAAAb,OAAwCa,EAAxC,EACFC,aAAc,SAAClB,GAAU,MAAA,eAAAI,OAAeJ,EAAf,GAE3BmB,OAAQ,aACRC,WAAY,YACZC,YAAa,aACbC,kBAAmB,YAmDqCC,GAhDpC,CACpB3B,WAAY,SAACC,GACX,IAAIC,EAAU,kEAId,OAHAA,GAAW,oBAAaD,EAAO,GAAGE,MAAK,MACvCD,GAAW,oBAAaD,EAAO,GAAGG,MAAK,SACvCF,GAAW,aAGTD,EACGI,KAAI,SAACC,GACJ,OAAQA,EAAMC,MACZ,IAAK,qBACH,MAAO,uBAAAC,OAAuBF,EAAMG,4CAAmCH,EAAMI,cAAa,MAC5F,IAAK,sBACH,MAAO,wBAAAF,OAAwBF,EAAMK,4CAAmCL,EAAMI,cAAa,MAC7F,IAAK,2BACH,MAAO,kCAAAF,OAAkCF,EAAMM,aACjD,IAAK,sBACH,MAAO,eAAAJ,OAAeF,EAAMO,6BAAoBP,EAAMF,MAAK,MAC7D,IAAK,sBACH,MAAO,eAAAI,OAAeF,EAAMQ,6BAAoBR,EAAMF,MAAK,MAC7D,IAAK,aACH,MAAO,wBACT,IAAK,iBACH,MAAO,kCACT,IAAK,WACH,MAAO,sBACT,IAAK,eACH,MAAO,+BAEb,IACCW,KAAK,GAEZ,EACAC,MAAO,CACLC,OAAQ,6BACRC,cAAe,2CACfC,iBAAkB,8CAClBC,kBAAmB,SAACC,GAClB,MAAA,wEAAAb,OAAwEa,EAAxE,EACFC,aAAc,SAAClB,GAAU,MAAA,kBAAAI,OAAkBJ,EAAlB,GAE3BmB,OAAQ,UACRC,WAAY,aACZC,YAAa,cACbC,kBAAmB"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{jsx as r}from"react/jsx-runtime";import{createContext as e,useContext as o}from"react";import{MESSAGES as t}from"./messages.js";var i=e("ja");function n(e){var o;return r(i.Provider,{value:null!==(o=e.locale)&&void 0!==o?o:"ja",children:e.children})}function a(){return t[o(i)]}export{n as LocaleProvider,a as useMessages};
|
|
2
|
+
//# sourceMappingURL=provider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"provider.js","sources":["../../../../../src/table/locale/provider.tsx"],"sourcesContent":["import { createContext, useContext } from \"react\";\nimport { MESSAGES, TLocale, TMessages } from \"./messages\";\n\nconst LocaleContext = createContext<TLocale>(\"ja\");\n\nexport function LocaleProvider(props: {\n locale?: TLocale;\n children: React.ReactNode;\n}) {\n return (\n <LocaleContext.Provider value={props.locale ?? \"ja\"}>\n {props.children}\n </LocaleContext.Provider>\n );\n}\n\n/** Messages in the table's locale (Japanese by default). */\nexport function useMessages(): TMessages {\n return MESSAGES[useContext(LocaleContext)];\n}\n"],"names":["LocaleContext","createContext","LocaleProvider","props","_jsx","Provider","value","_a","locale","children","useMessages","MESSAGES","useContext"],"mappings":"uIAGA,IAAMA,EAAgBC,EAAuB,MAEvC,SAAUC,EAAeC,SAI7B,OACEC,EAACJ,EAAcK,SAAQ,CAACC,MAAmB,QAAZC,EAAAJ,EAAMK,cAAM,IAAAD,EAAAA,EAAI,KAAIE,SAChDN,EAAMM,UAGb,UAGgBC,IACd,OAAOC,EAASC,EAAWZ,GAC7B"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use client";import{jsx as t}from"react/jsx-runtime";import{useRef as r,useState as e,useEffect as o}from"react";import{useRangeStateContext as n}from"../../range/provider.js";import{useEditStateContext as i,useEditActionContext as a}from"../../edit/provider.js";import{useColumnsContext as l}from"../../sheet/providers.js";import{useTableIdGenerator as u}from"../../id/provider.js";import{KEY_CATCHER_ATTRIBUTE as d}from"../event-target.js";import{setEditorInitialValue as s}from"../editor-input.js";function c(){var c,m,p,f=u(),v=n(),g=i().isEditing,x=a().startEditing,S=l(),b=r(null),y=e(!1),E=y[0],j=y[1],h=v.isSelecting&&!g;if(o((function(){var t;h&&document.activeElement!==b.current&&(null===(t=b.current)||void 0===t||t.focus({preventScroll:!0}))}),[h,v]),!v.isSelecting||g)return null;var I=S[v.start.colIndex],C=v.start;return t("input",((c={ref:b})[d]="",c["aria-label"]=null!==(m=null==I?void 0:I.label)&&void 0!==m?m:String(null!==(p=null==I?void 0:I.key)&&void 0!==p?p:""),c.autoComplete="off",c.tabIndex=-1,c.className="absolute z-10 px-2 text-gray-900 outline-none ".concat(E?"bg-white border border-gray-500":"opacity-0"),c.style={top:C.yStart,left:C.xStart,width:C.xEnd-C.xStart,height:C.yEnd-C.yStart,pointerEvents:"none"},c.onCompositionStart=function(){j(!0)},c.onCompositionEnd=function(t){var r=t.data;j(!1),t.currentTarget.value="",r&&(null==I?void 0:I.editable)&&(x(),setTimeout((function(){s(r,f.getEditorId())}),10))},c.onInput=function(t){E||(t.currentTarget.value="")},c))}export{c as KeyCatcher};
|
|
2
|
+
//# sourceMappingURL=key-catcher.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"key-catcher.js","sources":["../../../../../../src/table/operation/components/key-catcher.tsx"],"sourcesContent":["\"use client\";\n\nimport { useEffect, useRef, useState } from \"react\";\nimport { useRangeStateContext } from \"../../range/provider\";\nimport { useEditActionContext, useEditStateContext } from \"../../edit/provider\";\nimport { useColumnsContext } from \"../../sheet/providers\";\nimport { useTableIdGenerator } from \"../../id\";\nimport { KEY_CATCHER_ATTRIBUTE } from \"../event-target\";\nimport { setEditorInitialValue } from \"../editor-input\";\n\n/**\n * A hidden input placed over the selected cell that holds the focus while a\n * cell is selected (and not being edited).\n *\n * Browsers only run an IME (e.g. Japanese input) while a text field has the\n * focus. Without this input, typing Japanese on a selected cell sent plain\n * letters and the first one was entered as is. While text is being composed\n * the input is shown over the cell, and when the composition is confirmed,\n * editing starts with the confirmed text.\n *\n * Other keys (arrows, copy, paste, ...) still reach the table's handlers.\n */\nexport function KeyCatcher() {\n const IdGenerator = useTableIdGenerator();\n const range = useRangeStateContext();\n const { isEditing } = useEditStateContext();\n const { startEditing } = useEditActionContext();\n const cols = useColumnsContext();\n const ref = useRef<HTMLInputElement>(null);\n const [isComposing, setIsComposing] = useState(false);\n\n const active = range.isSelecting && !isEditing;\n\n useEffect(() => {\n if (active && document.activeElement !== ref.current) {\n ref.current?.focus({ preventScroll: true });\n }\n }, [active, range]);\n\n if (!range.isSelecting || isEditing) {\n return null;\n }\n\n const col = cols[range.start.colIndex];\n const { start } = range;\n\n return (\n <input\n ref={ref}\n {...{ [KEY_CATCHER_ATTRIBUTE]: \"\" }}\n aria-label={col?.label ?? String(col?.key ?? \"\")}\n autoComplete=\"off\"\n tabIndex={-1}\n className={`absolute z-10 px-2 text-gray-900 outline-none ${\n isComposing ? \"bg-white border border-gray-500\" : \"opacity-0\"\n }`}\n style={{\n top: start.yStart,\n left: start.xStart,\n width: start.xEnd - start.xStart,\n height: start.yEnd - start.yStart,\n pointerEvents: \"none\",\n }}\n onCompositionStart={() => {\n setIsComposing(true);\n }}\n onCompositionEnd={(e) => {\n const text = e.data;\n setIsComposing(false);\n e.currentTarget.value = \"\";\n\n if (text && col?.editable) {\n startEditing();\n setTimeout(() => {\n setEditorInitialValue(text, IdGenerator.getEditorId());\n }, 10);\n }\n }}\n onInput={(e) => {\n // Outside of IME composition every typed key is handled on keydown,\n // so nothing should stay in this input.\n if (!isComposing) {\n e.currentTarget.value = \"\";\n }\n }}\n />\n );\n}\n"],"names":["KeyCatcher","IdGenerator","useTableIdGenerator","range","useRangeStateContext","isEditing","useEditStateContext","startEditing","useEditActionContext","cols","useColumnsContext","ref","useRef","_d","useState","isComposing","setIsComposing","active","isSelecting","useEffect","document","activeElement","current","_a","focus","preventScroll","col","start","colIndex","_jsx","KEY_CATCHER_ATTRIBUTE","_b","label","String","_c","key","autoComplete","tabIndex","className","concat","style","top","yStart","left","xStart","width","xEnd","height","yEnd","pointerEvents","onCompositionEnd","e","text","data","currentTarget","value","editable","setTimeout","setEditorInitialValue","getEditorId","onInput"],"mappings":"8fAsBgBA,cACRC,EAAcC,IACdC,EAAQC,IACNC,EAAcC,cACdC,EAAiBC,iBACnBC,EAAOC,IACPC,EAAMC,EAAyB,MAC/BC,EAAgCC,GAAS,GAAxCC,EAAWF,EAAA,GAAEG,EAAcH,EAAA,GAE5BI,EAASd,EAAMe,cAAgBb,EAQrC,GANAc,GAAU,iBACJF,GAAUG,SAASC,gBAAkBV,EAAIW,UAChC,QAAXC,EAAAZ,EAAIW,eAAO,IAAAC,GAAAA,EAAEC,MAAM,CAAEC,eAAe,IAExC,GAAG,CAACR,EAAQd,KAEPA,EAAMe,aAAeb,EACxB,OAAO,KAGT,IAAMqB,EAAMjB,EAAKN,EAAMwB,MAAMC,UACrBD,EAAUxB,EAAKwB,MAEvB,OACEE,EAAA,UAAAN,EAAA,CACEZ,IAAKA,IACEmB,GAAwB,GAAEP,EAAA,cACX,QAAVQ,EAAAL,aAAG,EAAHA,EAAKM,aAAK,IAAAD,EAAAA,EAAIE,OAAe,QAARC,EAAAR,aAAG,EAAHA,EAAKS,WAAG,IAAAD,EAAAA,EAAI,IAC7CX,EAAAa,aAAa,MACbb,EAAAc,YACAd,EAAAe,UAAW,iDAAAC,OACTxB,EAAc,kCAAoC,aAEpDQ,EAAAiB,MAAO,CACLC,IAAKd,EAAMe,OACXC,KAAMhB,EAAMiB,OACZC,MAAOlB,EAAMmB,KAAOnB,EAAMiB,OAC1BG,OAAQpB,EAAMqB,KAAOrB,EAAMe,OAC3BO,cAAe,QAEjB1B,qBAAoB,WAClBP,GAAe,EACjB,EACAO,EAAA2B,iBAAkB,SAACC,GACjB,IAAMC,EAAOD,EAAEE,KACfrC,GAAe,GACfmC,EAAEG,cAAcC,MAAQ,GAEpBH,IAAQ1B,aAAG,EAAHA,EAAK8B,YACfjD,IACAkD,YAAW,WACTC,EAAsBN,EAAMnD,EAAY0D,cAC1C,GAAG,IAEP,EACApC,EAAAqC,QAAS,SAACT,GAGHpC,IACHoC,EAAEG,cAAcC,MAAQ,GAE5B,EAAChC,GAGP"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use client";import{jsx as e,Fragment as t}from"react/jsx-runtime";import{useEffect as r}from"react";import{useEditContext as
|
|
1
|
+
"use client";import{jsx as e,Fragment as t}from"react/jsx-runtime";import{useEffect as r}from"react";import{useEditContext as o}from"../../edit/provider.js";import{useColumnsContext as n}from"../../sheet/providers.js";import{useRangeContext as i}from"../../range/provider.js";import{useCopyActionContext as d}from"../../copy/provider.js";import{useTableIdGenerator as p}from"../../id/provider.js";import{isComposingKey as a,isTextEntryTarget as f}from"../event-target.js";import{setEditorInitialValue as y}from"../editor-input.js";function s(s){var m=p(),c=o(),l=i(),v=d().copy,u=n()[l.isSelecting?l.start.colIndex:0];return r((function(){var e=function(e){a(e)||(c.isEditing?"Escape"===e.key&&(e.preventDefault(),c.endEditing()):l.isSelecting&&!f(e.target)&&("Enter"===e.key?(e.preventDefault(),l.moveDown()):"Escape"===e.key?(e.preventDefault(),l.reset()):"ArrowRight"===e.key?(e.preventDefault(),e.ctrlKey&&e.shiftKey?l.extendRightEnd():e.ctrlKey?l.moveRightEnd():e.shiftKey?l.extendRight():l.moveRight()):"ArrowLeft"===e.key?(e.preventDefault(),e.ctrlKey&&e.shiftKey?l.extendLeftEnd():e.ctrlKey?l.moveLeftEnd():e.shiftKey?l.extendLeft():l.moveLeft()):"ArrowUp"===e.key?(e.preventDefault(),e.ctrlKey&&e.shiftKey?l.extendTop():e.ctrlKey?l.moveTop():e.shiftKey?l.extendUp():l.moveUp()):"ArrowDown"===e.key?(e.preventDefault(),e.ctrlKey&&e.shiftKey?l.extendBottom():e.ctrlKey?l.moveBottom():e.shiftKey?l.extendDown():l.moveDown()):"F2"===e.key?(e.preventDefault(),c.startEditing()):(e.ctrlKey||e.metaKey)&&"c"===e.key.toLowerCase()?(e.preventDefault(),v({enableDeprecatedCopy:null==s?void 0:s.enableDeprecatedCopy})):e.altKey||e.ctrlKey||e.metaKey||1!==Array.from(e.key).length?"Backspace"!==e.key&&"Delete"!==e.key||(e.preventDefault(),e.stopPropagation(),c.startEditing(),setTimeout((function(){y("",m.getEditorId())}),10)):(e.preventDefault(),e.stopPropagation(),c.startEditing(),setTimeout((function(){y(e.key,m.getEditorId())}),10))))};return document.addEventListener("keydown",e),function(){document.removeEventListener("keydown",e)}}),[l,c.isEditing]),r((function(){c.isEditing&&!u.editable&&c.endEditing()}),[c,u]),e(t,{})}export{s as KeyboardSetting};
|
|
2
2
|
//# sourceMappingURL=keyboard-setting.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"keyboard-setting.js","sources":["../../../../../../src/table/operation/components/keyboard-setting.tsx"],"sourcesContent":["\"use client\";\n\nimport { useEffect } from \"react\";\nimport { useEditContext } from \"../../edit/provider\";\nimport { useColumnsContext } from \"../../sheet/providers\";\nimport { useRangeContext } from \"../../range/provider\";\nimport { useCopyActionContext } from \"../../copy/provider\";\nimport { useTableIdGenerator } from \"../../id\";\nimport { isComposingKey, isTextEntryTarget } from \"../event-target\";\
|
|
1
|
+
{"version":3,"file":"keyboard-setting.js","sources":["../../../../../../src/table/operation/components/keyboard-setting.tsx"],"sourcesContent":["\"use client\";\n\nimport { useEffect } from \"react\";\nimport { useEditContext } from \"../../edit/provider\";\nimport { useColumnsContext } from \"../../sheet/providers\";\nimport { useRangeContext } from \"../../range/provider\";\nimport { useCopyActionContext } from \"../../copy/provider\";\nimport { useTableIdGenerator } from \"../../id\";\nimport { isComposingKey, isTextEntryTarget } from \"../event-target\";\nimport { setEditorInitialValue } from \"../editor-input\";\n\nexport function KeyboardSetting(options?: { enableDeprecatedCopy?: boolean }) {\n const IdGenerator = useTableIdGenerator();\n const edit = useEditContext();\n const range = useRangeContext();\n const { copy } = useCopyActionContext();\n const col = useColumnsContext()[range.isSelecting ? range.start.colIndex : 0];\n\n useEffect(() => {\n const listener = (e: KeyboardEvent) => {\n if (isComposingKey(e)) {\n return;\n }\n\n if (edit.isEditing) {\n if (e.key === \"Escape\") {\n e.preventDefault();\n edit.endEditing();\n }\n } else if (range.isSelecting && !isTextEntryTarget(e.target)) {\n if (e.key === \"Enter\") {\n e.preventDefault();\n range.moveDown();\n } else if (e.key === \"Escape\") {\n e.preventDefault();\n range.reset();\n } else if (e.key === \"ArrowRight\") {\n e.preventDefault();\n\n if (e.ctrlKey && e.shiftKey) {\n range.extendRightEnd();\n } else if (e.ctrlKey) {\n range.moveRightEnd();\n } else if (e.shiftKey) {\n range.extendRight();\n } else {\n range.moveRight();\n }\n } else if (e.key === \"ArrowLeft\") {\n e.preventDefault();\n\n if (e.ctrlKey && e.shiftKey) {\n range.extendLeftEnd();\n } else if (e.ctrlKey) {\n range.moveLeftEnd();\n } else if (e.shiftKey) {\n range.extendLeft();\n } else {\n range.moveLeft();\n }\n } else if (e.key === \"ArrowUp\") {\n e.preventDefault();\n\n if (e.ctrlKey && e.shiftKey) {\n range.extendTop();\n } else if (e.ctrlKey) {\n range.moveTop();\n } else if (e.shiftKey) {\n range.extendUp();\n } else {\n range.moveUp();\n }\n } else if (e.key === \"ArrowDown\") {\n e.preventDefault();\n\n if (e.ctrlKey && e.shiftKey) {\n range.extendBottom();\n } else if (e.ctrlKey) {\n range.moveBottom();\n } else if (e.shiftKey) {\n range.extendDown();\n } else {\n range.moveDown();\n }\n } else if (e.key === \"F2\") {\n e.preventDefault();\n edit.startEditing();\n } else if ((e.ctrlKey || e.metaKey) && e.key.toLowerCase() === \"c\") {\n e.preventDefault();\n copy({ enableDeprecatedCopy: options?.enableDeprecatedCopy });\n } else if (\n !e.altKey &&\n !e.ctrlKey &&\n !e.metaKey &&\n // Any key that types one character (letters, digits, symbols,\n // space). IME input is handled by KeyCatcher instead.\n Array.from(e.key).length === 1\n ) {\n e.preventDefault();\n e.stopPropagation();\n edit.startEditing();\n\n setTimeout(() => {\n setEditorInitialValue(e.key, IdGenerator.getEditorId());\n }, 10);\n } else if (e.key === \"Backspace\" || e.key === \"Delete\") {\n e.preventDefault();\n e.stopPropagation();\n edit.startEditing();\n\n setTimeout(() => {\n setEditorInitialValue(\"\", IdGenerator.getEditorId());\n }, 10);\n }\n }\n };\n\n document.addEventListener(\"keydown\", listener);\n\n return () => {\n document.removeEventListener(\"keydown\", listener);\n };\n }, [range, edit.isEditing]);\n\n useEffect(() => {\n if (edit.isEditing && !col.editable) {\n edit.endEditing();\n }\n }, [edit, col]);\n\n return <></>;\n}\n"],"names":["KeyboardSetting","options","IdGenerator","useTableIdGenerator","edit","useEditContext","range","useRangeContext","copy","useCopyActionContext","col","useColumnsContext","isSelecting","start","colIndex","useEffect","listener","e","isComposingKey","isEditing","key","preventDefault","endEditing","isTextEntryTarget","target","moveDown","reset","ctrlKey","shiftKey","extendRightEnd","moveRightEnd","extendRight","moveRight","extendLeftEnd","moveLeftEnd","extendLeft","moveLeft","extendTop","moveTop","extendUp","moveUp","extendBottom","moveBottom","extendDown","startEditing","metaKey","toLowerCase","enableDeprecatedCopy","altKey","Array","from","length","stopPropagation","setTimeout","setEditorInitialValue","getEditorId","document","addEventListener","removeEventListener","editable","_jsx"],"mappings":"mhBAWM,SAAUA,EAAgBC,GAC9B,IAAMC,EAAcC,IACdC,EAAOC,IACPC,EAAQC,IACNC,EAASC,SACXC,EAAMC,IAAoBL,EAAMM,YAAcN,EAAMO,MAAMC,SAAW,GAkH3E,OAhHAC,GAAU,WACR,IAAMC,EAAW,SAACC,GACZC,EAAeD,KAIfb,EAAKe,UACO,WAAVF,EAAEG,MACJH,EAAEI,iBACFjB,EAAKkB,cAEEhB,EAAMM,cAAgBW,EAAkBN,EAAEO,UACrC,UAAVP,EAAEG,KACJH,EAAEI,iBACFf,EAAMmB,YACa,WAAVR,EAAEG,KACXH,EAAEI,iBACFf,EAAMoB,SACa,eAAVT,EAAEG,KACXH,EAAEI,iBAEEJ,EAAEU,SAAWV,EAAEW,SACjBtB,EAAMuB,iBACGZ,EAAEU,QACXrB,EAAMwB,eACGb,EAAEW,SACXtB,EAAMyB,cAENzB,EAAM0B,aAEW,cAAVf,EAAEG,KACXH,EAAEI,iBAEEJ,EAAEU,SAAWV,EAAEW,SACjBtB,EAAM2B,gBACGhB,EAAEU,QACXrB,EAAM4B,cACGjB,EAAEW,SACXtB,EAAM6B,aAEN7B,EAAM8B,YAEW,YAAVnB,EAAEG,KACXH,EAAEI,iBAEEJ,EAAEU,SAAWV,EAAEW,SACjBtB,EAAM+B,YACGpB,EAAEU,QACXrB,EAAMgC,UACGrB,EAAEW,SACXtB,EAAMiC,WAENjC,EAAMkC,UAEW,cAAVvB,EAAEG,KACXH,EAAEI,iBAEEJ,EAAEU,SAAWV,EAAEW,SACjBtB,EAAMmC,eACGxB,EAAEU,QACXrB,EAAMoC,aACGzB,EAAEW,SACXtB,EAAMqC,aAENrC,EAAMmB,YAEW,OAAVR,EAAEG,KACXH,EAAEI,iBACFjB,EAAKwC,iBACK3B,EAAEU,SAAWV,EAAE4B,UAAoC,MAAxB5B,EAAEG,IAAI0B,eAC3C7B,EAAEI,iBACFb,EAAK,CAAEuC,qBAAsB9C,aAAO,EAAPA,EAAS8C,wBAErC9B,EAAE+B,QACF/B,EAAEU,SACFV,EAAE4B,SAG0B,IAA7BI,MAAMC,KAAKjC,EAAEG,KAAK+B,OASC,cAAVlC,EAAEG,KAAiC,WAAVH,EAAEG,MACpCH,EAAEI,iBACFJ,EAAEmC,kBACFhD,EAAKwC,eAELS,YAAW,WACTC,EAAsB,GAAIpD,EAAYqD,cACxC,GAAG,MAdHtC,EAAEI,iBACFJ,EAAEmC,kBACFhD,EAAKwC,eAELS,YAAW,WACTC,EAAsBrC,EAAEG,IAAKlB,EAAYqD,cAC3C,GAAG,MAWT,EAIA,OAFAC,SAASC,iBAAiB,UAAWzC,GAE9B,WACLwC,SAASE,oBAAoB,UAAW1C,EAC1C,CACF,GAAG,CAACV,EAAOF,EAAKe,YAEhBJ,GAAU,WACJX,EAAKe,YAAcT,EAAIiD,UACzBvD,EAAKkB,YAET,GAAG,CAAClB,EAAMM,IAEHkD,OACT"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
function e(e,t){var n,l=document.getElementById(t);if(l instanceof HTMLInputElement){var o=null===(n=Object.getOwnPropertyDescriptor(window.HTMLInputElement.prototype,"value"))||void 0===n?void 0:n.set;null==o||o.call(l,e),l.dispatchEvent(new Event("input",{bubbles:!0}))}}export{e as setEditorInitialValue};
|
|
2
|
+
//# sourceMappingURL=editor-input.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"editor-input.js","sources":["../../../../../src/table/operation/editor-input.ts"],"sourcesContent":["/**\n * Puts text into the cell editor (`id`) as if the user had typed it, so the\n * editor's onChange runs. Used when editing starts by typing on a cell.\n */\nexport function setEditorInitialValue(text: string, id: string) {\n const inputElement = document.getElementById(id);\n if (!(inputElement instanceof HTMLInputElement)) {\n return;\n }\n\n const nativeInputValueSetter = Object.getOwnPropertyDescriptor(\n window.HTMLInputElement.prototype,\n \"value\"\n )?.set;\n nativeInputValueSetter?.call(inputElement, text);\n inputElement.dispatchEvent(new Event(\"input\", { bubbles: true }));\n}\n"],"names":["setEditorInitialValue","text","id","inputElement","document","getElementById","HTMLInputElement","nativeInputValueSetter","_a","Object","getOwnPropertyDescriptor","window","prototype","set","call","dispatchEvent","Event","bubbles"],"mappings":"AAIM,SAAUA,EAAsBC,EAAcC,SAC5CC,EAAeC,SAASC,eAAeH,GAC7C,GAAMC,aAAwBG,iBAA9B,CAIA,IAAMC,EAGL,QAH8BC,EAAAC,OAAOC,yBACpCC,OAAOL,iBAAiBM,UACxB,gBACD,IAAAJ,OAAA,EAAAA,EAAEK,IACHN,SAAAA,EAAwBO,KAAKX,EAAcF,GAC3CE,EAAaY,cAAc,IAAIC,MAAM,QAAS,CAAEC,SAAS,IAPzD,CAQF"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
function
|
|
1
|
+
var e="data-react-ui-key-catcher";function t(t){return t instanceof HTMLElement&&(!t.hasAttribute(e)&&(!!t.isContentEditable||(t instanceof HTMLInputElement||t instanceof HTMLTextAreaElement||t instanceof HTMLSelectElement)))}function n(e){return e.isComposing||229===e.keyCode}export{e as KEY_CATCHER_ATTRIBUTE,n as isComposingKey,t as isTextEntryTarget};
|
|
2
2
|
//# sourceMappingURL=event-target.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"event-target.js","sources":["../../../../../src/table/operation/event-target.ts"],"sourcesContent":["/**\n * Returns true when the event comes from an element where the user types\n * text (input, textarea, select or contenteditable). The table must not take\n * over keys or pastes aimed at such elements.\n */\nexport function isTextEntryTarget(target: EventTarget | null): boolean {\n if (!(target instanceof HTMLElement)) {\n return false;\n }\n\n if (target.isContentEditable) {\n return true;\n }\n\n return (\n target instanceof HTMLInputElement ||\n target instanceof HTMLTextAreaElement ||\n target instanceof HTMLSelectElement\n );\n}\n\n/** True while an IME (e.g. Japanese input) is composing text. */\nexport function isComposingKey(e: KeyboardEvent): boolean {\n return e.isComposing || e.keyCode === 229;\n}\n"],"names":["isTextEntryTarget","target","HTMLElement","isContentEditable","HTMLInputElement","HTMLTextAreaElement","HTMLSelectElement","isComposingKey","e","isComposing","keyCode"],"mappings":"
|
|
1
|
+
{"version":3,"file":"event-target.js","sources":["../../../../../src/table/operation/event-target.ts"],"sourcesContent":["/** Marks the hidden input that receives keys while a cell is selected. */\nexport const KEY_CATCHER_ATTRIBUTE = \"data-react-ui-key-catcher\";\n\n/**\n * Returns true when the event comes from an element where the user types\n * text (input, textarea, select or contenteditable). The table must not take\n * over keys or pastes aimed at such elements.\n */\nexport function isTextEntryTarget(target: EventTarget | null): boolean {\n if (!(target instanceof HTMLElement)) {\n return false;\n }\n\n // The table's own hidden input that receives keys for the selected cell.\n if (target.hasAttribute(KEY_CATCHER_ATTRIBUTE)) {\n return false;\n }\n\n if (target.isContentEditable) {\n return true;\n }\n\n return (\n target instanceof HTMLInputElement ||\n target instanceof HTMLTextAreaElement ||\n target instanceof HTMLSelectElement\n );\n}\n\n/** True while an IME (e.g. Japanese input) is composing text. */\nexport function isComposingKey(e: KeyboardEvent): boolean {\n return e.isComposing || e.keyCode === 229;\n}\n"],"names":["KEY_CATCHER_ATTRIBUTE","isTextEntryTarget","target","HTMLElement","hasAttribute","isContentEditable","HTMLInputElement","HTMLTextAreaElement","HTMLSelectElement","isComposingKey","e","isComposing","keyCode"],"mappings":"AACO,IAAMA,EAAwB,4BAO/B,SAAUC,EAAkBC,GAChC,OAAMA,aAAkBC,eAKpBD,EAAOE,aAAaJ,OAIpBE,EAAOG,oBAKTH,aAAkBI,kBAClBJ,aAAkBK,qBAClBL,aAAkBM,oBAEtB,CAGM,SAAUC,EAAeC,GAC7B,OAAOA,EAAEC,aAA6B,MAAdD,EAAEE,OAC5B"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{__assign as e}from"../../../node_modules/tslib/tslib.es6.js";import{useRef as
|
|
1
|
+
import{__assign as e}from"../../../node_modules/tslib/tslib.es6.js";import{useRef as r,useEffect as t,useCallback as a,useMemo as n}from"react";import{useColumnValidatesContext as o}from"../sheet/providers.js";import{useRangeActionContext as s,useRangeStateContext as i}from"../range/provider.js";import{paste as d}from"./logic.js";import{parseClipboardText as c}from"./parse.js";import{isTextEntryTarget as m}from"../operation/event-target.js";import{useMessages as p}from"../locale/provider.js";function u(u){var l=s().setRange,f=o(),g=i(),v=p(),x=r(u.rows),w=r(e(e({},u),{validators:f,range:g,messages:v}));t((function(){w.current=e(e({},u),{validators:f,range:g,messages:v})}));var I=a((function(e){x.current=e}),[]),R=a((function(e){var r=w.current,t=r.cols,a=r.validators,n=r.range,o=r.messages,s=r.onUpdateRowFunction,i=r.onPasteError;if(n.isSelecting&&s){var c=d({pasteData:e,pasteArea:{start:{rowIndex:Math.min(n.start.rowIndex,n.end.rowIndex),colIndex:Math.min(n.start.colIndex,n.end.colIndex)},end:{rowIndex:Math.max(n.start.rowIndex,n.end.rowIndex),colIndex:Math.max(n.start.colIndex,n.end.colIndex)}},currentRows:x.current,currentCols:t,validators:a,messages:o.paste});if(c.isError){if("ValidationError"===c.type||"NoPasteData"===c.type)return;var m={type:c.type,message:c.message};i?i(m):alert(m.message)}else c.updateArgument.forEach((function(e){var r=e.newRow,t=e.oldRow;s(r,t)})),l(c.pasteRange)}}),[l]);return t((function(){var e=function(e){var r=w.current,t=r.range,a=r.onUpdateRowFunction;t.isSelecting&&a&&(m(e.target)||e.clipboardData&&(e.preventDefault(),R(c(e.clipboardData.getData("Text")))))};return document.addEventListener("paste",e),function(){document.removeEventListener("paste",e)}}),[R]),n((function(){return{setRows:I,onPaste:R}}),[I,R])}export{u as usePasteReducer};
|
|
2
2
|
//# sourceMappingURL=hooks.js.map
|