@teppen/react-ui 2.1.0 → 2.2.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 +11 -1
- 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/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/table/base.js +1 -1
- package/dist/cjs/src/table/table/base.js.map +1 -1
- 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/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/table/base.js +1 -1
- package/dist/esm/src/table/table/base.js.map +1 -1
- package/dist/index.d.ts +39 -26
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -220,7 +220,7 @@ A component that displays a table based on the row and column information passed
|
|
|
220
220
|
|
|
221
221
|
#### Arguments
|
|
222
222
|
|
|
223
|
-
The table component accepts the arguments `id`, `rows`, `cols`, `initialCondition`, `onClickRow`, `onUpdateRow`, `onPasteError`, `errorHandler`, `applyRowFormatting`, `checkbox`, `conditionalFormattings`, `maxHeight` and `maxWidth`. Details for each argument are described below.
|
|
223
|
+
The table component accepts the arguments `id`, `rows`, `cols`, `initialCondition`, `onClickRow`, `onUpdateRow`, `onPasteError`, `errorHandler`, `locale`, `applyRowFormatting`, `checkbox`, `conditionalFormattings`, `maxHeight` and `maxWidth`. Details for each argument are described below.
|
|
224
224
|
|
|
225
225
|
All of these types are exported from the package, e.g. `import type { TTableColumn, TPropsTable } from "@teppen/react-ui";`.
|
|
226
226
|
|
|
@@ -298,6 +298,8 @@ type TInitialCondition = {
|
|
|
298
298
|
|
|
299
299
|
※ `pagenation` (the earlier spelling) still works but is deprecated. If both are set, `pagination` is used.
|
|
300
300
|
|
|
301
|
+
`rowCountPerPage` defaults to 50. With pagination, the table stays fast regardless of the number of rows (all operations took under 50 ms with 10,000 rows in our measurements). `"all"` renders every row at once, so it gets slower as rows increase: with 1,000 rows sorting takes about 0.6 s, and with 10,000 rows the first render and sorting take several seconds. For more than about 1,000 rows, use pagination.
|
|
302
|
+
|
|
301
303
|
##### onClickRow
|
|
302
304
|
|
|
303
305
|
In `onClickRow`, you may define the behavior when a row is clicked. This is optional.
|
|
@@ -336,6 +338,14 @@ In `errorHandler`, you can handle values that break a column's `constraints` (wh
|
|
|
336
338
|
type TErrorHandler = (errors: TErrorValidation[]) => void;
|
|
337
339
|
```
|
|
338
340
|
|
|
341
|
+
##### locale
|
|
342
|
+
|
|
343
|
+
`locale` sets the language of the messages the table shows by itself: the default `errorHandler` alert, paste error messages, the "copied" notice and the empty option of select cells. `"ja"` (default) or `"en"`.
|
|
344
|
+
|
|
345
|
+
```ts
|
|
346
|
+
type TLocale = "ja" | "en";
|
|
347
|
+
```
|
|
348
|
+
|
|
339
349
|
##### maxHeight / maxWidth
|
|
340
350
|
|
|
341
351
|
CSS sizes (e.g. `"600px"`) that limit the table area. The table scrolls inside it.
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";var e=require("react/jsx-runtime"),t=require("react"),r=require("./provider.js"),i=require("../id/provider.js");exports.CopiedMessage=function(){var
|
|
1
|
+
"use strict";var e=require("react/jsx-runtime"),t=require("react"),r=require("./provider.js"),i=require("../id/provider.js"),n=require("../locale/provider.js");exports.CopiedMessage=function(){var s=i.useTableIdGenerator(),o=t.useState(!1),a=o[0],u=o[1],c=r.useCopyStateContext().copiedAt,d=n.useMessages();if(t.useEffect((function(){if(c){u(!0);var e=setTimeout((function(){u(!1)}),1e3);return function(){u(!1),clearTimeout(e)}}}),[c]),!a)return e.jsx(e.Fragment,{});var p=document.getElementById(s.getTableId());if(!p)return e.jsx(e.Fragment,{});var l=p.getBoundingClientRect(),f=l.right-120,g=l.bottom-50;return e.jsx("div",{className:"fixed z-[100] p-1 bg-gray-800 duration-300 pointer-events-none ".concat(a?"opacity-100":"opacity-0"),style:{top:g,left:f},children:e.jsx("p",{className:"text-white text-xs",children:d.copied})})};
|
|
2
2
|
//# sourceMappingURL=components.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"components.js","sources":["../../../../../src/table/copy/components.tsx"],"sourcesContent":["import { useEffect, useState } from \"react\";\nimport { useCopyStateContext } from \"./provider\";\nimport { useTableIdGenerator } from \"../id\";\n\nexport function CopiedMessage() {\n const IdGenerator = useTableIdGenerator();\n const [isDisplay, setIsDisplay] = useState(false);\n const { copiedAt } = useCopyStateContext();\n\n useEffect(() => {\n if (copiedAt) {\n setIsDisplay(true);\n\n const timer = setTimeout(() => {\n setIsDisplay(false);\n }, 1000);\n\n return () => {\n setIsDisplay(false);\n clearTimeout(timer);\n };\n }\n }, [copiedAt]);\n\n if (!isDisplay) {\n return <></>;\n }\n\n const tableElement = document.getElementById(IdGenerator.getTableId());\n\n if (!tableElement) {\n return <></>;\n }\n\n // テーブルの右下の位置を取得\n const rect = tableElement.getBoundingClientRect();\n const x = rect.right - 120;\n const y = rect.bottom - 50;\n\n return (\n <div\n className={`fixed z-[100] p-1 bg-gray-800 duration-300 pointer-events-none ${\n isDisplay ? \"opacity-100\" : \"opacity-0\"\n }`}\n style={{ top: y, left: x }}\n >\n <p className=\"text-white text-xs\"
|
|
1
|
+
{"version":3,"file":"components.js","sources":["../../../../../src/table/copy/components.tsx"],"sourcesContent":["import { useEffect, useState } from \"react\";\nimport { useCopyStateContext } from \"./provider\";\nimport { useTableIdGenerator } from \"../id\";\nimport { useMessages } from \"../locale/provider\";\n\nexport function CopiedMessage() {\n const IdGenerator = useTableIdGenerator();\n const [isDisplay, setIsDisplay] = useState(false);\n const { copiedAt } = useCopyStateContext();\n const messages = useMessages();\n\n useEffect(() => {\n if (copiedAt) {\n setIsDisplay(true);\n\n const timer = setTimeout(() => {\n setIsDisplay(false);\n }, 1000);\n\n return () => {\n setIsDisplay(false);\n clearTimeout(timer);\n };\n }\n }, [copiedAt]);\n\n if (!isDisplay) {\n return <></>;\n }\n\n const tableElement = document.getElementById(IdGenerator.getTableId());\n\n if (!tableElement) {\n return <></>;\n }\n\n // テーブルの右下の位置を取得\n const rect = tableElement.getBoundingClientRect();\n const x = rect.right - 120;\n const y = rect.bottom - 50;\n\n return (\n <div\n className={`fixed z-[100] p-1 bg-gray-800 duration-300 pointer-events-none ${\n isDisplay ? \"opacity-100\" : \"opacity-0\"\n }`}\n style={{ top: y, left: x }}\n >\n <p className=\"text-white text-xs\">{messages.copied}</p>\n </div>\n );\n}\n"],"names":["IdGenerator","useTableIdGenerator","_a","useState","isDisplay","setIsDisplay","copiedAt","useCopyStateContext","messages","useMessages","useEffect","timer_1","setTimeout","clearTimeout","_jsx","tableElement","document","getElementById","getTableId","rect","getBoundingClientRect","x","right","y","bottom","className","concat","style","top","left","copied"],"mappings":"iMAME,IAAMA,EAAcC,EAAAA,sBACdC,EAA4BC,EAAAA,UAAS,GAApCC,EAASF,EAAA,GAAEG,EAAYH,EAAA,GACtBI,EAAaC,EAAAA,+BACfC,EAAWC,EAAAA,cAiBjB,GAfAC,EAAAA,WAAU,WACR,GAAIJ,EAAU,CACZD,GAAa,GAEb,IAAMM,EAAQC,YAAW,WACvBP,GAAa,EACf,GAAG,KAEH,OAAO,WACLA,GAAa,GACbQ,aAAaF,EACf,CACF,CACF,GAAG,CAACL,KAECF,EACH,OAAOU,EAAAA,mBAGT,IAAMC,EAAeC,SAASC,eAAejB,EAAYkB,cAEzD,IAAKH,EACH,OAAOD,EAAAA,mBAIT,IAAMK,EAAOJ,EAAaK,wBACpBC,EAAIF,EAAKG,MAAQ,IACjBC,EAAIJ,EAAKK,OAAS,GAExB,OACEV,MAAA,MAAA,CACEW,UAAW,kEAAAC,OACTtB,EAAY,cAAgB,aAE9BuB,MAAO,CAAEC,IAAKL,EAAGM,KAAMR,YAEvBP,EAAAA,IAAA,IAAA,CAAGW,UAAU,8BAAsBjB,EAASsB,UAGlD"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use client";"use strict";var e=require("../../../../node_modules/tslib/tslib.es6.js"),t=require("react/jsx-runtime"),n=require("react"),r=require("../provider.js"),o=require("../../../icon/cancel-icon.js"),
|
|
1
|
+
"use client";"use strict";var e=require("../../../../node_modules/tslib/tslib.es6.js"),t=require("react/jsx-runtime"),n=require("react"),r=require("../provider.js"),o=require("../../../icon/cancel-icon.js"),s=require("../../../select-box/index.js"),i=require("../../id/provider.js"),u=require("../../locale/provider.js");exports.SelectCellInput=function(l){var c=i.useTableIdGenerator(),a=u.useMessages(),d=l.col,f=r.useEditActionContext().endEditing,p=l.row[d.key],v=!!d.editable&&d.allowEmpty,m=n.useState(p),j=m[0],x=m[1],b=n.useRef(null),q=n.useRef(null);n.useEffect((function(){q.current&&q.current.focus()}),[q]);var w=function(e){d.editable&&d.onCellBlur(d.key,e,l.row,f)};n.useEffect((function(){var e=function(e){var t=b.current,n=e.target;n instanceof Node&&(null==t?void 0:t.contains(n))||(j!==p?w(j):f())};return document.addEventListener("mousedown",e),function(){document.removeEventListener("mousedown",e)}}),[j,w,f,p]);var E=n.useMemo((function(){return v?e.__spreadArray([{value:"",label:""===p?a.selectNone:a.selectClear}],d.options,!0):d.options}),[d.options,v,p,a]);return d.editable?t.jsxs("div",{ref:b,className:"flex justify-between gap-1 w-full items-center",children:[t.jsx(s.SelectBox,{id:c.getEditorId(),inputRef:q,value:j,defaultIsOpen:!0,options:E,placeholder:a.selectPlaceholder,onSelect:function(e){x(e),w(e)}}),t.jsx("button",{className:"cursor-pointer",onMouseDown:function(e){e.preventDefault(),e.stopPropagation(),setTimeout((function(){x(p),f()}),300)},children:t.jsx(o.CancelIcon,{size:16})})]}):t.jsx(t.Fragment,{})};
|
|
2
2
|
//# sourceMappingURL=select-input.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"select-input.js","sources":["../../../../../../src/table/edit/ui/select-input.tsx"],"sourcesContent":["\"use client\";\n\nimport { useEffect, useMemo, useRef, useState } from \"react\";\nimport { useEditActionContext } from \"../provider\";\nimport { CancelIcon } from \"../../../icon/cancel-icon\";\nimport {\n DataObject,\n DataRecord,\n TColumnProperty,\n TSelectCellEditingCondition,\n} from \"../../table/type\";\nimport { SelectBox } from \"../../../select-box\";\nimport { useTableIdGenerator } from \"../../id\";\n\ntype TPropsCellInput = {\n col: TColumnProperty<DataRecord> & TSelectCellEditingCondition<DataRecord>;\n row: DataObject<DataRecord>;\n};\n\nexport function SelectCellInput(props: TPropsCellInput) {\n const IdGenerator = useTableIdGenerator();\n const col = props.col;\n const { endEditing } = useEditActionContext();\n const prevValue = props.row[col.key] as string;\n const allowEmpty = col.editable ? col.allowEmpty : false;\n const [value, setValue] = useState(prevValue);\n const ref = useRef<HTMLDivElement>(null);\n const inputRef = useRef<HTMLInputElement>(null);\n\n useEffect(() => {\n if (inputRef.current) {\n inputRef.current.focus();\n }\n }, [inputRef]);\n\n const updateCellValue = (value: string) => {\n if (col.editable) {\n col.onCellBlur(col.key, value, props.row, endEditing);\n }\n };\n\n useEffect(() => {\n const onClickOutOfSelectBox = (e: MouseEvent) => {\n const selectInputElement = ref.current;\n const ele = e.target;\n\n if (ele instanceof Node && selectInputElement?.contains(ele)) return;\n\n if (value === prevValue) {\n endEditing();\n return;\n }\n\n updateCellValue(value);\n };\n\n document.addEventListener(\"mousedown\", onClickOutOfSelectBox);\n\n return () => {\n document.removeEventListener(\"mousedown\", onClickOutOfSelectBox);\n };\n }, [value, updateCellValue, endEditing, prevValue]);\n\n const options = useMemo(() => {\n if (allowEmpty) {\n return [\n {\n value: \"\",\n label: prevValue === \"\" ?
|
|
1
|
+
{"version":3,"file":"select-input.js","sources":["../../../../../../src/table/edit/ui/select-input.tsx"],"sourcesContent":["\"use client\";\n\nimport { useEffect, useMemo, useRef, useState } from \"react\";\nimport { useEditActionContext } from \"../provider\";\nimport { CancelIcon } from \"../../../icon/cancel-icon\";\nimport {\n DataObject,\n DataRecord,\n TColumnProperty,\n TSelectCellEditingCondition,\n} from \"../../table/type\";\nimport { SelectBox } from \"../../../select-box\";\nimport { useTableIdGenerator } from \"../../id\";\nimport { useMessages } from \"../../locale/provider\";\n\ntype TPropsCellInput = {\n col: TColumnProperty<DataRecord> & TSelectCellEditingCondition<DataRecord>;\n row: DataObject<DataRecord>;\n};\n\nexport function SelectCellInput(props: TPropsCellInput) {\n const IdGenerator = useTableIdGenerator();\n const messages = useMessages();\n const col = props.col;\n const { endEditing } = useEditActionContext();\n const prevValue = props.row[col.key] as string;\n const allowEmpty = col.editable ? col.allowEmpty : false;\n const [value, setValue] = useState(prevValue);\n const ref = useRef<HTMLDivElement>(null);\n const inputRef = useRef<HTMLInputElement>(null);\n\n useEffect(() => {\n if (inputRef.current) {\n inputRef.current.focus();\n }\n }, [inputRef]);\n\n const updateCellValue = (value: string) => {\n if (col.editable) {\n col.onCellBlur(col.key, value, props.row, endEditing);\n }\n };\n\n useEffect(() => {\n const onClickOutOfSelectBox = (e: MouseEvent) => {\n const selectInputElement = ref.current;\n const ele = e.target;\n\n if (ele instanceof Node && selectInputElement?.contains(ele)) return;\n\n if (value === prevValue) {\n endEditing();\n return;\n }\n\n updateCellValue(value);\n };\n\n document.addEventListener(\"mousedown\", onClickOutOfSelectBox);\n\n return () => {\n document.removeEventListener(\"mousedown\", onClickOutOfSelectBox);\n };\n }, [value, updateCellValue, endEditing, prevValue]);\n\n const options = useMemo(() => {\n if (allowEmpty) {\n return [\n {\n value: \"\",\n label: prevValue === \"\" ? messages.selectNone : messages.selectClear,\n },\n ...col.options,\n ];\n } else {\n return col.options;\n }\n }, [col.options, allowEmpty, prevValue, messages]);\n\n // Return only after every hook has run, so hooks are always called in the\n // same order.\n if (!col.editable) return <></>;\n\n return (\n <div ref={ref} className=\"flex justify-between gap-1 w-full items-center\">\n <SelectBox\n id={IdGenerator.getEditorId()}\n inputRef={inputRef}\n value={value}\n defaultIsOpen={true}\n options={options}\n placeholder={messages.selectPlaceholder}\n onSelect={(value) => {\n setValue(value);\n updateCellValue(value);\n }}\n />\n <button\n className=\"cursor-pointer\"\n onMouseDown={(e) => {\n e.preventDefault();\n e.stopPropagation();\n setTimeout(() => {\n setValue(prevValue);\n endEditing();\n }, 300);\n }}\n >\n <CancelIcon size={16} />\n </button>\n </div>\n );\n}\n"],"names":["props","IdGenerator","useTableIdGenerator","messages","useMessages","col","endEditing","useEditActionContext","prevValue","row","key","allowEmpty","editable","_a","useState","value","setValue","ref","useRef","inputRef","useEffect","current","focus","updateCellValue","onCellBlur","onClickOutOfSelectBox","e","selectInputElement","ele","target","Node","contains","document","addEventListener","removeEventListener","options","useMemo","__spreadArray","label","selectNone","selectClear","_jsxs","className","children","_jsx","SelectBox","id","getEditorId","defaultIsOpen","placeholder","selectPlaceholder","onSelect","onMouseDown","preventDefault","stopPropagation","setTimeout","CancelIcon","size"],"mappings":"yVAoBM,SAA0BA,GAC9B,IAAMC,EAAcC,EAAAA,sBACdC,EAAWC,EAAAA,cACXC,EAAML,EAAMK,IACVC,EAAeC,EAAAA,kCACjBC,EAAYR,EAAMS,IAAIJ,EAAIK,KAC1BC,IAAaN,EAAIO,UAAWP,EAAIM,WAChCE,EAAoBC,EAAAA,SAASN,GAA5BO,EAAKF,EAAA,GAAEG,EAAQH,EAAA,GAChBI,EAAMC,EAAAA,OAAuB,MAC7BC,EAAWD,EAAAA,OAAyB,MAE1CE,EAAAA,WAAU,WACJD,EAASE,SACXF,EAASE,QAAQC,OAErB,GAAG,CAACH,IAEJ,IAAMI,EAAkB,SAACR,GACnBV,EAAIO,UACNP,EAAImB,WAAWnB,EAAIK,IAAKK,EAAOf,EAAMS,IAAKH,EAE9C,EAEAc,EAAAA,WAAU,WACR,IAAMK,EAAwB,SAACC,GAC7B,IAAMC,EAAqBV,EAAII,QACzBO,EAAMF,EAAEG,OAEVD,aAAeE,OAAQH,aAAkB,EAAlBA,EAAoBI,SAASH,MAEpDb,IAAUP,EAKde,EAAgBR,GAJdT,IAKJ,EAIA,OAFA0B,SAASC,iBAAiB,YAAaR,GAEhC,WACLO,SAASE,oBAAoB,YAAaT,EAC5C,CACF,GAAG,CAACV,EAAOQ,EAAiBjB,EAAYE,IAExC,IAAM2B,EAAUC,EAAAA,SAAQ,WACtB,OAAIzB,EACF0B,gBAAA,CACE,CACEtB,MAAO,GACPuB,MAAqB,KAAd9B,EAAmBL,EAASoC,WAAapC,EAASqC,cAExDnC,EAAI8B,SAAO,GAGT9B,EAAI8B,OAEf,GAAG,CAAC9B,EAAI8B,QAASxB,EAAYH,EAAWL,IAIxC,OAAKE,EAAIO,SAGP6B,EAAAA,YAAKxB,IAAKA,EAAKyB,UAAU,iDAAgDC,SAAA,CACvEC,EAAAA,IAACC,EAAAA,UAAS,CACRC,GAAI7C,EAAY8C,cAChB5B,SAAUA,EACVJ,MAAOA,EACPiC,eAAe,EACfb,QAASA,EACTc,YAAa9C,EAAS+C,kBACtBC,SAAU,SAACpC,GACTC,EAASD,GACTQ,EAAgBR,EAClB,IAEF6B,EAAAA,IAAA,SAAA,CACEF,UAAU,iBACVU,YAAa,SAAC1B,GACZA,EAAE2B,iBACF3B,EAAE4B,kBACFC,YAAW,WACTvC,EAASR,GACTF,GACF,GAAG,IACL,EAACqC,SAEDC,EAAAA,IAACY,aAAU,CAACC,KAAM,UA3BEb,EAAAA,kBA+B5B"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";
|
|
1
|
+
"use strict";var e=require("../locale/messages.js");function t(t){alert(e.MESSAGES.ja.validation(t))}exports.generateValidateFunction=function(e,n){if("string"===e.type)return function(e,n,r,l){return function(e){var a=[];return(null==r?void 0:r.maxLength)&&e.length>r.maxLength&&a.push({type:"STRING_IS_TOO_LONG",label:n,maxLength:r.maxLength,currentLength:e.length,value:e}),(null==r?void 0:r.minLength)&&e.length<r.minLength&&a.push({type:"STRING_IS_TOO_SHORT",label:n,minLength:r.minLength,currentLength:e.length,value:e}),(null==r?void 0:r.pattern)&&(new RegExp(r.pattern).test(e)||a.push({type:"STRING_PATTERN_NOT_MATCH",label:n,pattern:r.pattern,value:e})),!(a.length>0&&(l?l(a):t(a),1))}}(e.key,e.label,e.constraints,n);if("number"===e.type)return function(e,n,r,l){return function(e){var a=[];return"string"!=typeof e||/^-?[0-9]+(\.[0-9]+)?$/.test(e)?(e=Number(e),"number"==typeof(null==r?void 0:r.max)&&e>r.max&&a.push({type:"NUMBER_IS_TOO_LARGE",label:n,max:r.max,value:e}),"number"==typeof(null==r?void 0:r.min)&&e<r.min&&a.push({type:"NUMBER_IS_TOO_SMALL",label:n,min:r.min,value:e}),!(a.length>0&&(l?l(a):t(a),1))):(a.push({type:"NOT_NUMBER",label:n,value:e}),l?l(a):t(a),!1)}}(e.key,e.label,e.constraints,n);if("select"===e.type)return function(e,n,r,l,a){var u=new Set(r.map((function(e){return e.label})));return function(e){if(l&&""===e)return!0;var r=[];return u.has(e)||r.push({type:"NOT_IN_OPTIONS",label:n,value:e,options:Array.from(u)}),!(r.length>0&&(a?a(r):t(r),1))}}(e.key,e.label,e.options,e.allowEmpty,n);if("date"===e.type)return function(e,n,r){return function(e){var l=[];return isNaN(new Date(e).getTime())&&l.push({type:"NOT_DATE",label:n,value:e}),!(l.length>0&&(r?r(l):t(l),1))}}(e.key,e.label,n);if("datetime"===e.type)return function(e,n,r){return function(e){var l=[];return isNaN(new Date(e).getTime())&&l.push({type:"NOT_DATETIME",label:n,value:e}),!(l.length>0&&(r?r(l):t(l),1))}}(e.key,e.label,n);throw new Error("Invalid type")};
|
|
2
2
|
//# sourceMappingURL=generate-validate-function.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"generate-validate-function.js","sources":["../../../../../src/table/libs/generate-validate-function.ts"],"sourcesContent":["export type TStringValidateOption = {\n maxLength?: number;\n minLength?: number;\n pattern?: string;\n};\n\nexport type TNumberValidateOption = {\n max?: number;\n min?: number;\n};\n\ntype TPropsGenerateValidateFunction = {\n key: string;\n label: string;\n} & (\n | {\n type: \"string\";\n constraints?: TStringValidateOption;\n }\n | {\n type: \"number\";\n constraints?: TNumberValidateOption;\n }\n | {\n type: \"select\";\n options: { value: string; label: string }[];\n allowEmpty?: boolean;\n }\n | {\n type: \"date\";\n }\n | {\n type: \"datetime\";\n }\n);\n\ntype TStringValidateFunction = (value: string) => boolean;\n\nexport type TErrorValidation = {\n label: string;\n value: string | number;\n} & (\n | {\n type: \"STRING_IS_TOO_LONG\";\n maxLength: number;\n currentLength: number;\n }\n | {\n type: \"STRING_IS_TOO_SHORT\";\n minLength: number;\n currentLength: number;\n }\n | {\n type: \"STRING_PATTERN_NOT_MATCH\";\n pattern: string;\n }\n | {\n type: \"NUMBER_IS_TOO_LARGE\";\n max: number;\n }\n | {\n type: \"NUMBER_IS_TOO_SMALL\";\n min: number;\n }\n | {\n type: \"NOT_NUMBER\";\n }\n | {\n type: \"NOT_IN_OPTIONS\";\n options: string[];\n }\n | {\n type: \"NOT_DATE\";\n }\n | {\n type: \"NOT_DATETIME\";\n }\n);\n\nfunction defaultErrorHandler(errors: TErrorValidation[]) {\n let message = `入力値が不正のため、エラーを確認し修正してください。\\n\\n`;\n message += `[対象の列名]: ${errors[0].label}\\n`;\n message += `[入力値] : ${errors[0].value}\\n\\n`;\n message += `[エラー内容]:`;\n\n message += errors.reduce((acc, error) => {\n switch (error.type) {\n case \"STRING_IS_TOO_LONG\":\n return (\n acc +\n `\\n・文字数が最大の長さ${error.maxLength}文字を超えています。(現在${error.currentLength}文字)`\n );\n case \"STRING_IS_TOO_SHORT\":\n return (\n acc +\n `\\n・文字数が最小の長さ${error.minLength}文字に満たないです。(現在${error.currentLength}文字)`\n );\n case \"STRING_PATTERN_NOT_MATCH\":\n return acc + `\\n・パターンに一致しません。(パターン${error.pattern})`;\n case \"NUMBER_IS_TOO_LARGE\":\n return (\n acc + `\\n・最大値${error.max}を超えています。(入力値${error.value})`\n );\n case \"NUMBER_IS_TOO_SMALL\":\n return (\n acc + `\\n・最小値${error.min}を下回っています。(入力値${error.value})`\n );\n case \"NOT_NUMBER\":\n return acc + `\\n・数値ではない値が入力されています。`;\n case \"NOT_IN_OPTIONS\":\n return acc + `\\n・選択肢に含まれていない値です。`;\n case \"NOT_DATE\":\n return acc + `\\n・日付の形式ではありません。`;\n case \"NOT_DATETIME\":\n return acc + `\\n・日時の形式ではありません。`;\n }\n }, \"\");\n\n alert(message);\n}\n\nfunction generateStringValidateFunction(\n key: string,\n label: string,\n constraints?: TStringValidateOption,\n errorHandler?: (errors: TErrorValidation[]) => void\n): TStringValidateFunction {\n return (value: string) => {\n const errors: TErrorValidation[] = [];\n\n if (constraints?.maxLength) {\n if (value.length > constraints.maxLength) {\n errors.push({\n type: \"STRING_IS_TOO_LONG\",\n label,\n maxLength: constraints.maxLength,\n currentLength: value.length,\n value,\n });\n }\n }\n\n if (constraints?.minLength) {\n if (value.length < constraints.minLength) {\n errors.push({\n type: \"STRING_IS_TOO_SHORT\",\n label,\n minLength: constraints.minLength,\n currentLength: value.length,\n value,\n });\n }\n }\n\n if (constraints?.pattern) {\n if (!new RegExp(constraints.pattern).test(value)) {\n errors.push({\n type: \"STRING_PATTERN_NOT_MATCH\",\n label,\n pattern: constraints.pattern,\n value,\n });\n }\n }\n\n if (errors.length > 0) {\n if (errorHandler) {\n errorHandler(errors);\n } else {\n defaultErrorHandler(errors);\n }\n return false;\n }\n\n return true;\n };\n}\n\ntype TNumberValidateFunction = (value: number) => boolean;\n\nfunction generateNumberValidateFunction(\n key: string,\n label: string,\n constraints?: TNumberValidateOption,\n errorHandler?: (errors: TErrorValidation[]) => void\n): TNumberValidateFunction {\n return (value: number | string) => {\n const errors: TErrorValidation[] = [];\n\n if (typeof value === \"string\") {\n // 小数も含めて数値に変換可能な値かを検査\n if (!/^-?[0-9]+(\\.[0-9]+)?$/.test(value)) {\n errors.push({\n type: \"NOT_NUMBER\",\n label,\n value,\n });\n\n if (errorHandler) {\n errorHandler(errors);\n } else {\n defaultErrorHandler(errors);\n }\n return false;\n }\n }\n\n value = Number(value);\n\n if (typeof constraints?.max === \"number\") {\n if (value > constraints.max) {\n errors.push({\n type: \"NUMBER_IS_TOO_LARGE\",\n label,\n max: constraints.max,\n value,\n });\n }\n }\n\n if (typeof constraints?.min === \"number\") {\n if (value < constraints.min) {\n errors.push({\n type: \"NUMBER_IS_TOO_SMALL\",\n label,\n min: constraints.min,\n value,\n });\n }\n }\n\n if (errors.length > 0) {\n if (errorHandler) {\n errorHandler(errors);\n } else {\n defaultErrorHandler(errors);\n }\n return false;\n }\n\n return true;\n };\n}\n\ntype TSelectValidateFunction = (label: string) => boolean;\n\nfunction generatSelectValidateFunction(\n key: string,\n columnLabel: string,\n options: { value: string; label: string }[],\n allowEmpty?: boolean,\n errorHandler?: (errors: TErrorValidation[]) => void\n): TSelectValidateFunction {\n const labelSets = new Set(options.map((option) => option.label));\n return (label: string) => {\n if (allowEmpty && label === \"\") {\n return true;\n }\n\n const errors: TErrorValidation[] = [];\n\n if (!labelSets.has(label)) {\n errors.push({\n type: \"NOT_IN_OPTIONS\",\n label: columnLabel,\n value: label,\n options: Array.from(labelSets),\n });\n }\n\n if (errors.length > 0) {\n if (errorHandler) {\n errorHandler(errors);\n } else {\n defaultErrorHandler(errors);\n }\n return false;\n }\n\n return true;\n };\n}\n\ntype TDateValidateFunction = (label: string) => boolean;\n\nfunction generatDateValidateFunction(\n key: string,\n columnLabel: string,\n errorHandler?: (errors: TErrorValidation[]) => void\n): TDateValidateFunction {\n return (value: string) => {\n const errors: TErrorValidation[] = [];\n\n if (isNaN(new Date(value).getTime())) {\n errors.push({\n type: \"NOT_DATE\",\n label: columnLabel,\n value,\n });\n }\n\n if (errors.length > 0) {\n if (errorHandler) {\n errorHandler(errors);\n } else {\n defaultErrorHandler(errors);\n }\n return false;\n }\n\n return true;\n };\n}\n\ntype TDatetimeValidateFunction = (label: string) => boolean;\n\nfunction generatDatetimeValidateFunction(\n key: string,\n columnLabel: string,\n errorHandler?: (errors: TErrorValidation[]) => void\n): TDatetimeValidateFunction {\n return (value: string) => {\n const errors: TErrorValidation[] = [];\n\n if (isNaN(new Date(value).getTime())) {\n errors.push({\n type: \"NOT_DATETIME\",\n label: columnLabel,\n value,\n });\n }\n\n if (errors.length > 0) {\n if (errorHandler) {\n errorHandler(errors);\n } else {\n defaultErrorHandler(errors);\n }\n return false;\n }\n\n return true;\n };\n}\n\nexport function generateValidateFunction(\n props: TPropsGenerateValidateFunction,\n errorHandler?: (errors: TErrorValidation[]) => void\n) {\n if (props.type === \"string\") {\n return generateStringValidateFunction(\n props.key,\n props.label,\n props.constraints,\n errorHandler\n );\n } else if (props.type === \"number\") {\n return generateNumberValidateFunction(\n props.key,\n props.label,\n props.constraints,\n errorHandler\n );\n } else if (props.type === \"select\") {\n return generatSelectValidateFunction(\n props.key,\n props.label,\n props.options,\n props.allowEmpty,\n errorHandler\n );\n } else if (props.type === \"date\") {\n return generatDateValidateFunction(props.key, props.label, errorHandler);\n } else if (props.type === \"datetime\") {\n return generatDatetimeValidateFunction(\n props.key,\n props.label,\n errorHandler\n );\n } else {\n throw new Error(\"Invalid type\");\n }\n}\n"],"names":["defaultErrorHandler","errors","message","label","value","reduce","acc","error","type","concat","maxLength","currentLength","minLength","pattern","max","min","alert","props","errorHandler","key","constraints","length","push","RegExp","test","generateStringValidateFunction","Number","generateNumberValidateFunction","columnLabel","options","allowEmpty","labelSets","Set","map","option","has","Array","from","generatSelectValidateFunction","isNaN","Date","getTime","generatDateValidateFunction","generatDatetimeValidateFunction","Error"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"generate-validate-function.js","sources":["../../../../../src/table/libs/generate-validate-function.ts"],"sourcesContent":["import { MESSAGES } from \"../locale/messages\";\n\nexport type TStringValidateOption = {\n maxLength?: number;\n minLength?: number;\n pattern?: string;\n};\n\nexport type TNumberValidateOption = {\n max?: number;\n min?: number;\n};\n\ntype TPropsGenerateValidateFunction = {\n key: string;\n label: string;\n} & (\n | {\n type: \"string\";\n constraints?: TStringValidateOption;\n }\n | {\n type: \"number\";\n constraints?: TNumberValidateOption;\n }\n | {\n type: \"select\";\n options: { value: string; label: string }[];\n allowEmpty?: boolean;\n }\n | {\n type: \"date\";\n }\n | {\n type: \"datetime\";\n }\n);\n\ntype TStringValidateFunction = (value: string) => boolean;\n\nexport type TErrorValidation = {\n label: string;\n value: string | number;\n} & (\n | {\n type: \"STRING_IS_TOO_LONG\";\n maxLength: number;\n currentLength: number;\n }\n | {\n type: \"STRING_IS_TOO_SHORT\";\n minLength: number;\n currentLength: number;\n }\n | {\n type: \"STRING_PATTERN_NOT_MATCH\";\n pattern: string;\n }\n | {\n type: \"NUMBER_IS_TOO_LARGE\";\n max: number;\n }\n | {\n type: \"NUMBER_IS_TOO_SMALL\";\n min: number;\n }\n | {\n type: \"NOT_NUMBER\";\n }\n | {\n type: \"NOT_IN_OPTIONS\";\n options: string[];\n }\n | {\n type: \"NOT_DATE\";\n }\n | {\n type: \"NOT_DATETIME\";\n }\n);\n\n// Used when no errorHandler is given. The table passes its own handler with\n// the messages of its locale, so this is only a fallback.\nfunction defaultErrorHandler(errors: TErrorValidation[]) {\n alert(MESSAGES.ja.validation(errors));\n}\n\nfunction generateStringValidateFunction(\n key: string,\n label: string,\n constraints?: TStringValidateOption,\n errorHandler?: (errors: TErrorValidation[]) => void\n): TStringValidateFunction {\n return (value: string) => {\n const errors: TErrorValidation[] = [];\n\n if (constraints?.maxLength) {\n if (value.length > constraints.maxLength) {\n errors.push({\n type: \"STRING_IS_TOO_LONG\",\n label,\n maxLength: constraints.maxLength,\n currentLength: value.length,\n value,\n });\n }\n }\n\n if (constraints?.minLength) {\n if (value.length < constraints.minLength) {\n errors.push({\n type: \"STRING_IS_TOO_SHORT\",\n label,\n minLength: constraints.minLength,\n currentLength: value.length,\n value,\n });\n }\n }\n\n if (constraints?.pattern) {\n if (!new RegExp(constraints.pattern).test(value)) {\n errors.push({\n type: \"STRING_PATTERN_NOT_MATCH\",\n label,\n pattern: constraints.pattern,\n value,\n });\n }\n }\n\n if (errors.length > 0) {\n if (errorHandler) {\n errorHandler(errors);\n } else {\n defaultErrorHandler(errors);\n }\n return false;\n }\n\n return true;\n };\n}\n\ntype TNumberValidateFunction = (value: number) => boolean;\n\nfunction generateNumberValidateFunction(\n key: string,\n label: string,\n constraints?: TNumberValidateOption,\n errorHandler?: (errors: TErrorValidation[]) => void\n): TNumberValidateFunction {\n return (value: number | string) => {\n const errors: TErrorValidation[] = [];\n\n if (typeof value === \"string\") {\n // 小数も含めて数値に変換可能な値かを検査\n if (!/^-?[0-9]+(\\.[0-9]+)?$/.test(value)) {\n errors.push({\n type: \"NOT_NUMBER\",\n label,\n value,\n });\n\n if (errorHandler) {\n errorHandler(errors);\n } else {\n defaultErrorHandler(errors);\n }\n return false;\n }\n }\n\n value = Number(value);\n\n if (typeof constraints?.max === \"number\") {\n if (value > constraints.max) {\n errors.push({\n type: \"NUMBER_IS_TOO_LARGE\",\n label,\n max: constraints.max,\n value,\n });\n }\n }\n\n if (typeof constraints?.min === \"number\") {\n if (value < constraints.min) {\n errors.push({\n type: \"NUMBER_IS_TOO_SMALL\",\n label,\n min: constraints.min,\n value,\n });\n }\n }\n\n if (errors.length > 0) {\n if (errorHandler) {\n errorHandler(errors);\n } else {\n defaultErrorHandler(errors);\n }\n return false;\n }\n\n return true;\n };\n}\n\ntype TSelectValidateFunction = (label: string) => boolean;\n\nfunction generatSelectValidateFunction(\n key: string,\n columnLabel: string,\n options: { value: string; label: string }[],\n allowEmpty?: boolean,\n errorHandler?: (errors: TErrorValidation[]) => void\n): TSelectValidateFunction {\n const labelSets = new Set(options.map((option) => option.label));\n return (label: string) => {\n if (allowEmpty && label === \"\") {\n return true;\n }\n\n const errors: TErrorValidation[] = [];\n\n if (!labelSets.has(label)) {\n errors.push({\n type: \"NOT_IN_OPTIONS\",\n label: columnLabel,\n value: label,\n options: Array.from(labelSets),\n });\n }\n\n if (errors.length > 0) {\n if (errorHandler) {\n errorHandler(errors);\n } else {\n defaultErrorHandler(errors);\n }\n return false;\n }\n\n return true;\n };\n}\n\ntype TDateValidateFunction = (label: string) => boolean;\n\nfunction generatDateValidateFunction(\n key: string,\n columnLabel: string,\n errorHandler?: (errors: TErrorValidation[]) => void\n): TDateValidateFunction {\n return (value: string) => {\n const errors: TErrorValidation[] = [];\n\n if (isNaN(new Date(value).getTime())) {\n errors.push({\n type: \"NOT_DATE\",\n label: columnLabel,\n value,\n });\n }\n\n if (errors.length > 0) {\n if (errorHandler) {\n errorHandler(errors);\n } else {\n defaultErrorHandler(errors);\n }\n return false;\n }\n\n return true;\n };\n}\n\ntype TDatetimeValidateFunction = (label: string) => boolean;\n\nfunction generatDatetimeValidateFunction(\n key: string,\n columnLabel: string,\n errorHandler?: (errors: TErrorValidation[]) => void\n): TDatetimeValidateFunction {\n return (value: string) => {\n const errors: TErrorValidation[] = [];\n\n if (isNaN(new Date(value).getTime())) {\n errors.push({\n type: \"NOT_DATETIME\",\n label: columnLabel,\n value,\n });\n }\n\n if (errors.length > 0) {\n if (errorHandler) {\n errorHandler(errors);\n } else {\n defaultErrorHandler(errors);\n }\n return false;\n }\n\n return true;\n };\n}\n\nexport function generateValidateFunction(\n props: TPropsGenerateValidateFunction,\n errorHandler?: (errors: TErrorValidation[]) => void\n) {\n if (props.type === \"string\") {\n return generateStringValidateFunction(\n props.key,\n props.label,\n props.constraints,\n errorHandler\n );\n } else if (props.type === \"number\") {\n return generateNumberValidateFunction(\n props.key,\n props.label,\n props.constraints,\n errorHandler\n );\n } else if (props.type === \"select\") {\n return generatSelectValidateFunction(\n props.key,\n props.label,\n props.options,\n props.allowEmpty,\n errorHandler\n );\n } else if (props.type === \"date\") {\n return generatDateValidateFunction(props.key, props.label, errorHandler);\n } else if (props.type === \"datetime\") {\n return generatDatetimeValidateFunction(\n props.key,\n props.label,\n errorHandler\n );\n } else {\n throw new Error(\"Invalid type\");\n }\n}\n"],"names":["defaultErrorHandler","errors","alert","MESSAGES","ja","validation","props","errorHandler","type","key","label","constraints","value","maxLength","length","push","currentLength","minLength","pattern","RegExp","test","generateStringValidateFunction","Number","max","min","generateNumberValidateFunction","columnLabel","options","allowEmpty","labelSets","Set","map","option","has","Array","from","generatSelectValidateFunction","isNaN","Date","getTime","generatDateValidateFunction","generatDatetimeValidateFunction","Error"],"mappings":"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"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";var n={ja:{validation:function(n){var e="入力値が不正のため、エラーを確認し修正してください。\n\n";return e+="[対象の列名]: ".concat(n[0].label,"\n"),e+="[入力値] : ".concat(n[0].value,"\n\n"),(e+="[エラー内容]:")+n.map((function(n){switch(n.type){case"STRING_IS_TOO_LONG":return"\n・文字数が最大の長さ".concat(n.maxLength,"文字を超えています。(現在").concat(n.currentLength,"文字)");case"STRING_IS_TOO_SHORT":return"\n・文字数が最小の長さ".concat(n.minLength,"文字に満たないです。(現在").concat(n.currentLength,"文字)");case"STRING_PATTERN_NOT_MATCH":return"\n・パターンに一致しません。(パターン".concat(n.pattern,")");case"NUMBER_IS_TOO_LARGE":return"\n・最大値".concat(n.max,"を超えています。(入力値").concat(n.value,")");case"NUMBER_IS_TOO_SMALL":return"\n・最小値".concat(n.min,"を下回っています。(入力値").concat(n.value,")");case"NOT_NUMBER":return"\n・数値ではない値が入力されています。";case"NOT_IN_OPTIONS":return"\n・選択肢に含まれていない値です。";case"NOT_DATE":return"\n・日付の形式ではありません。";case"NOT_DATETIME":return"\n・日時の形式ではありません。"}})).join("")},paste:{noData:"ペーストデータがありません。",notEnoughRows:"貼り付け先の行数が足りません。",notEnoughColumns:"貼り付け先の列数が足りません。",notEditableColumn:function(n){return"編集できない列にデータを貼り付けることはできません。\n\n編集不可列: ".concat(n)},invalidValue:function(n){return"バリデーションエラー: ".concat(n)}},copied:"コピーしました!!!",selectNone:"-- 未選択 --",selectClear:"-- 選択解除 --",selectPlaceholder:"選択してください"},en:{validation:function(n){var e="The value is not valid. Please check the errors and fix it.\n\n";return e+="[Column]: ".concat(n[0].label,"\n"),e+="[Value] : ".concat(n[0].value,"\n\n"),(e+="[Errors]:")+n.map((function(n){switch(n.type){case"STRING_IS_TOO_LONG":return"\n- Must be at most ".concat(n.maxLength," characters (currently ").concat(n.currentLength,").");case"STRING_IS_TOO_SHORT":return"\n- Must be at least ".concat(n.minLength," characters (currently ").concat(n.currentLength,").");case"STRING_PATTERN_NOT_MATCH":return"\n- Does not match the pattern ".concat(n.pattern,".");case"NUMBER_IS_TOO_LARGE":return"\n- Must be ".concat(n.max," or less (got ").concat(n.value,").");case"NUMBER_IS_TOO_SMALL":return"\n- Must be ".concat(n.min," or more (got ").concat(n.value,").");case"NOT_NUMBER":return"\n- Must be a number.";case"NOT_IN_OPTIONS":return"\n- Must be one of the options.";case"NOT_DATE":return"\n- Must be a date.";case"NOT_DATETIME":return"\n- Must be a date and time."}})).join("")},paste:{noData:"There is no data to paste.",notEnoughRows:"There are not enough rows to paste into.",notEnoughColumns:"There are not enough columns to paste into.",notEditableColumn:function(n){return"Data cannot be pasted into a column that is not editable.\n\nColumn: ".concat(n)},invalidValue:function(n){return"Invalid value: ".concat(n)}},copied:"Copied!",selectNone:"-- None --",selectClear:"-- Clear --",selectPlaceholder:"Select..."}};exports.MESSAGES=n;
|
|
2
|
+
//# sourceMappingURL=messages.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"messages.js","sources":["../../../../../src/table/locale/messages.ts"],"sourcesContent":["import type { TErrorValidation } from \"../libs/generate-validate-function\";\n\n/** Language of the messages the table shows by itself. */\nexport type TLocale = \"ja\" | \"en\";\n\nexport type TMessages = {\n /** Message shown by the default errorHandler (window.alert). */\n validation: (errors: TErrorValidation[]) => string;\n paste: {\n noData: string;\n notEnoughRows: string;\n notEnoughColumns: string;\n notEditableColumn: (column: string) => string;\n invalidValue: (value: string) => string;\n };\n copied: string;\n /** Empty option of a select cell when the cell is empty / has a value. */\n selectNone: string;\n selectClear: string;\n selectPlaceholder: string;\n};\n\nconst ja: TMessages = {\n validation: (errors) => {\n let message = `入力値が不正のため、エラーを確認し修正してください。\\n\\n`;\n message += `[対象の列名]: ${errors[0].label}\\n`;\n message += `[入力値] : ${errors[0].value}\\n\\n`;\n message += `[エラー内容]:`;\n return (\n message +\n errors\n .map((error) => {\n switch (error.type) {\n case \"STRING_IS_TOO_LONG\":\n return `\\n・文字数が最大の長さ${error.maxLength}文字を超えています。(現在${error.currentLength}文字)`;\n case \"STRING_IS_TOO_SHORT\":\n return `\\n・文字数が最小の長さ${error.minLength}文字に満たないです。(現在${error.currentLength}文字)`;\n case \"STRING_PATTERN_NOT_MATCH\":\n return `\\n・パターンに一致しません。(パターン${error.pattern})`;\n case \"NUMBER_IS_TOO_LARGE\":\n return `\\n・最大値${error.max}を超えています。(入力値${error.value})`;\n case \"NUMBER_IS_TOO_SMALL\":\n return `\\n・最小値${error.min}を下回っています。(入力値${error.value})`;\n case \"NOT_NUMBER\":\n return `\\n・数値ではない値が入力されています。`;\n case \"NOT_IN_OPTIONS\":\n return `\\n・選択肢に含まれていない値です。`;\n case \"NOT_DATE\":\n return `\\n・日付の形式ではありません。`;\n case \"NOT_DATETIME\":\n return `\\n・日時の形式ではありません。`;\n }\n })\n .join(\"\")\n );\n },\n paste: {\n noData: \"ペーストデータがありません。\",\n notEnoughRows: \"貼り付け先の行数が足りません。\",\n notEnoughColumns: \"貼り付け先の列数が足りません。\",\n notEditableColumn: (column) =>\n `編集できない列にデータを貼り付けることはできません。\\n\\n編集不可列: ${column}`,\n invalidValue: (value) => `バリデーションエラー: ${value}`,\n },\n copied: \"コピーしました!!!\",\n selectNone: \"-- 未選択 --\",\n selectClear: \"-- 選択解除 --\",\n selectPlaceholder: \"選択してください\",\n};\n\nconst en: TMessages = {\n validation: (errors) => {\n let message = `The value is not valid. Please check the errors and fix it.\\n\\n`;\n message += `[Column]: ${errors[0].label}\\n`;\n message += `[Value] : ${errors[0].value}\\n\\n`;\n message += `[Errors]:`;\n return (\n message +\n errors\n .map((error) => {\n switch (error.type) {\n case \"STRING_IS_TOO_LONG\":\n return `\\n- Must be at most ${error.maxLength} characters (currently ${error.currentLength}).`;\n case \"STRING_IS_TOO_SHORT\":\n return `\\n- Must be at least ${error.minLength} characters (currently ${error.currentLength}).`;\n case \"STRING_PATTERN_NOT_MATCH\":\n return `\\n- Does not match the pattern ${error.pattern}.`;\n case \"NUMBER_IS_TOO_LARGE\":\n return `\\n- Must be ${error.max} or less (got ${error.value}).`;\n case \"NUMBER_IS_TOO_SMALL\":\n return `\\n- Must be ${error.min} or more (got ${error.value}).`;\n case \"NOT_NUMBER\":\n return `\\n- Must be a number.`;\n case \"NOT_IN_OPTIONS\":\n return `\\n- Must be one of the options.`;\n case \"NOT_DATE\":\n return `\\n- Must be a date.`;\n case \"NOT_DATETIME\":\n return `\\n- Must be a date and time.`;\n }\n })\n .join(\"\")\n );\n },\n paste: {\n noData: \"There is no data to paste.\",\n notEnoughRows: \"There are not enough rows to paste into.\",\n notEnoughColumns: \"There are not enough columns to paste into.\",\n notEditableColumn: (column) =>\n `Data cannot be pasted into a column that is not editable.\\n\\nColumn: ${column}`,\n invalidValue: (value) => `Invalid value: ${value}`,\n },\n copied: \"Copied!\",\n selectNone: \"-- None --\",\n selectClear: \"-- Clear --\",\n selectPlaceholder: \"Select...\",\n};\n\nexport const MESSAGES: Record<TLocale, TMessages> = { ja, en };\n"],"names":["MESSAGES","ja","validation","errors","message","label","value","map","error","type","concat","maxLength","currentLength","minLength","pattern","max","min","join","paste","noData","notEnoughRows","notEnoughColumns","notEditableColumn","column","invalidValue","copied","selectNone","selectClear","selectPlaceholder","en"],"mappings":"aAsBA,IAgGaA,EAAuC,CAAEC,GAhGhC,CACpBC,WAAY,SAACC,GACX,IAAIC,EAAU,iCAId,OAHAA,GAAW,mBAAYD,EAAO,GAAGE,MAAK,MACtCD,GAAW,mBAAYD,EAAO,GAAGG,MAAK,SACtCF,GAAW,YAGTD,EACGI,KAAI,SAACC,GACJ,OAAQA,EAAMC,MACZ,IAAK,qBACH,MAAO,eAAAC,OAAeF,EAAMG,kCAAyBH,EAAMI,cAAa,OAC1E,IAAK,sBACH,MAAO,eAAAF,OAAeF,EAAMK,kCAAyBL,EAAMI,cAAa,OAC1E,IAAK,2BACH,MAAO,uBAAAF,OAAuBF,EAAMM,aACtC,IAAK,sBACH,MAAO,SAAAJ,OAASF,EAAMO,2BAAkBP,EAAMF,MAAK,KACrD,IAAK,sBACH,MAAO,SAAAI,OAASF,EAAMQ,4BAAmBR,EAAMF,MAAK,KACtD,IAAK,aACH,MAAO,uBACT,IAAK,iBACH,MAAO,qBACT,IAAK,WACH,MAAO,mBACT,IAAK,eACH,MAAO,mBAEb,IACCW,KAAK,GAEZ,EACAC,MAAO,CACLC,OAAQ,iBACRC,cAAe,kBACfC,iBAAkB,kBAClBC,kBAAmB,SAACC,GAClB,MAAA,wCAAAb,OAAwCa,EAAxC,EACFC,aAAc,SAAClB,GAAU,MAAA,eAAAI,OAAeJ,EAAf,GAE3BmB,OAAQ,aACRC,WAAY,YACZC,YAAa,aACbC,kBAAmB,YAmDqCC,GAhDpC,CACpB3B,WAAY,SAACC,GACX,IAAIC,EAAU,kEAId,OAHAA,GAAW,oBAAaD,EAAO,GAAGE,MAAK,MACvCD,GAAW,oBAAaD,EAAO,GAAGG,MAAK,SACvCF,GAAW,aAGTD,EACGI,KAAI,SAACC,GACJ,OAAQA,EAAMC,MACZ,IAAK,qBACH,MAAO,uBAAAC,OAAuBF,EAAMG,4CAAmCH,EAAMI,cAAa,MAC5F,IAAK,sBACH,MAAO,wBAAAF,OAAwBF,EAAMK,4CAAmCL,EAAMI,cAAa,MAC7F,IAAK,2BACH,MAAO,kCAAAF,OAAkCF,EAAMM,aACjD,IAAK,sBACH,MAAO,eAAAJ,OAAeF,EAAMO,6BAAoBP,EAAMF,MAAK,MAC7D,IAAK,sBACH,MAAO,eAAAI,OAAeF,EAAMQ,6BAAoBR,EAAMF,MAAK,MAC7D,IAAK,aACH,MAAO,wBACT,IAAK,iBACH,MAAO,kCACT,IAAK,WACH,MAAO,sBACT,IAAK,eACH,MAAO,+BAEb,IACCW,KAAK,GAEZ,EACAC,MAAO,CACLC,OAAQ,6BACRC,cAAe,2CACfC,iBAAkB,8CAClBC,kBAAmB,SAACC,GAClB,MAAA,wEAAAb,OAAwEa,EAAxE,EACFC,aAAc,SAAClB,GAAU,MAAA,kBAAAI,OAAkBJ,EAAlB,GAE3BmB,OAAQ,UACRC,WAAY,aACZC,YAAa,cACbC,kBAAmB"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";var e=require("react/jsx-runtime"),r=require("react"),t=require("./messages.js"),s=r.createContext("ja");exports.LocaleProvider=function(r){var t;return e.jsx(s.Provider,{value:null!==(t=r.locale)&&void 0!==t?t:"ja",children:r.children})},exports.useMessages=function(){return t.MESSAGES[r.useContext(s)]};
|
|
2
|
+
//# sourceMappingURL=provider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"provider.js","sources":["../../../../../src/table/locale/provider.tsx"],"sourcesContent":["import { createContext, useContext } from \"react\";\nimport { MESSAGES, TLocale, TMessages } from \"./messages\";\n\nconst LocaleContext = createContext<TLocale>(\"ja\");\n\nexport function LocaleProvider(props: {\n locale?: TLocale;\n children: React.ReactNode;\n}) {\n return (\n <LocaleContext.Provider value={props.locale ?? \"ja\"}>\n {props.children}\n </LocaleContext.Provider>\n );\n}\n\n/** Messages in the table's locale (Japanese by default). */\nexport function useMessages(): TMessages {\n return MESSAGES[useContext(LocaleContext)];\n}\n"],"names":["LocaleContext","createContext","props","_jsx","Provider","value","_a","locale","children","MESSAGES","useContext"],"mappings":"8FAGMA,EAAgBC,EAAAA,cAAuB,6BAEvC,SAAyBC,SAI7B,OACEC,EAAAA,IAACH,EAAcI,SAAQ,CAACC,MAAmB,QAAZC,EAAAJ,EAAMK,cAAM,IAAAD,EAAAA,EAAI,KAAIE,SAChDN,EAAMM,UAGb,iCAIE,OAAOC,EAAAA,SAASC,aAAWV,GAC7B"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use client";"use strict";var e=require("react/jsx-runtime"),t=require("react"),r=require("../../range/provider.js"),n=require("../../edit/provider.js"),i=require("../../sheet/providers.js"),o=require("../../id/provider.js"),u=require("../event-target.js"),a=require("../editor-input.js");exports.KeyCatcher=function(){var l,s,d,c=o.useTableIdGenerator(),v=r.useRangeStateContext(),p=n.useEditStateContext().isEditing,f=n.useEditActionContext().startEditing,g=i.useColumnsContext(),E=t.useRef(null),x=t.useState(!1),S=x[0],C=x[1],b=v.isSelecting&&!p;if(t.useEffect((function(){var e;b&&document.activeElement!==E.current&&(null===(e=E.current)||void 0===e||e.focus({preventScroll:!0}))}),[b,v]),!v.isSelecting||p)return null;var m=g[v.start.colIndex],y=v.start;return e.jsx("input",((l={ref:E})[u.KEY_CATCHER_ATTRIBUTE]="",l["aria-label"]=null!==(s=null==m?void 0:m.label)&&void 0!==s?s:String(null!==(d=null==m?void 0:m.key)&&void 0!==d?d:""),l.autoComplete="off",l.tabIndex=-1,l.className="absolute z-10 px-2 text-gray-900 outline-none ".concat(S?"bg-white border border-gray-500":"opacity-0"),l.style={top:y.yStart,left:y.xStart,width:y.xEnd-y.xStart,height:y.yEnd-y.yStart,pointerEvents:"none"},l.onCompositionStart=function(){C(!0)},l.onCompositionEnd=function(e){var t=e.data;C(!1),e.currentTarget.value="",t&&(null==m?void 0:m.editable)&&(f(),setTimeout((function(){a.setEditorInitialValue(t,c.getEditorId())}),10))},l.onInput=function(e){S||(e.currentTarget.value="")},l))};
|
|
2
|
+
//# sourceMappingURL=key-catcher.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"key-catcher.js","sources":["../../../../../../src/table/operation/components/key-catcher.tsx"],"sourcesContent":["\"use client\";\n\nimport { useEffect, useRef, useState } from \"react\";\nimport { useRangeStateContext } from \"../../range/provider\";\nimport { useEditActionContext, useEditStateContext } from \"../../edit/provider\";\nimport { useColumnsContext } from \"../../sheet/providers\";\nimport { useTableIdGenerator } from \"../../id\";\nimport { KEY_CATCHER_ATTRIBUTE } from \"../event-target\";\nimport { setEditorInitialValue } from \"../editor-input\";\n\n/**\n * A hidden input placed over the selected cell that holds the focus while a\n * cell is selected (and not being edited).\n *\n * Browsers only run an IME (e.g. Japanese input) while a text field has the\n * focus. Without this input, typing Japanese on a selected cell sent plain\n * letters and the first one was entered as is. While text is being composed\n * the input is shown over the cell, and when the composition is confirmed,\n * editing starts with the confirmed text.\n *\n * Other keys (arrows, copy, paste, ...) still reach the table's handlers.\n */\nexport function KeyCatcher() {\n const IdGenerator = useTableIdGenerator();\n const range = useRangeStateContext();\n const { isEditing } = useEditStateContext();\n const { startEditing } = useEditActionContext();\n const cols = useColumnsContext();\n const ref = useRef<HTMLInputElement>(null);\n const [isComposing, setIsComposing] = useState(false);\n\n const active = range.isSelecting && !isEditing;\n\n useEffect(() => {\n if (active && document.activeElement !== ref.current) {\n ref.current?.focus({ preventScroll: true });\n }\n }, [active, range]);\n\n if (!range.isSelecting || isEditing) {\n return null;\n }\n\n const col = cols[range.start.colIndex];\n const { start } = range;\n\n return (\n <input\n ref={ref}\n {...{ [KEY_CATCHER_ATTRIBUTE]: \"\" }}\n aria-label={col?.label ?? String(col?.key ?? \"\")}\n autoComplete=\"off\"\n tabIndex={-1}\n className={`absolute z-10 px-2 text-gray-900 outline-none ${\n isComposing ? \"bg-white border border-gray-500\" : \"opacity-0\"\n }`}\n style={{\n top: start.yStart,\n left: start.xStart,\n width: start.xEnd - start.xStart,\n height: start.yEnd - start.yStart,\n pointerEvents: \"none\",\n }}\n onCompositionStart={() => {\n setIsComposing(true);\n }}\n onCompositionEnd={(e) => {\n const text = e.data;\n setIsComposing(false);\n e.currentTarget.value = \"\";\n\n if (text && col?.editable) {\n startEditing();\n setTimeout(() => {\n setEditorInitialValue(text, IdGenerator.getEditorId());\n }, 10);\n }\n }}\n onInput={(e) => {\n // Outside of IME composition every typed key is handled on keydown,\n // so nothing should stay in this input.\n if (!isComposing) {\n e.currentTarget.value = \"\";\n }\n }}\n />\n );\n}\n"],"names":["IdGenerator","useTableIdGenerator","range","useRangeStateContext","isEditing","useEditStateContext","startEditing","useEditActionContext","cols","useColumnsContext","ref","useRef","_d","useState","isComposing","setIsComposing","active","isSelecting","useEffect","document","activeElement","current","_a","focus","preventScroll","col","start","colIndex","_jsx","KEY_CATCHER_ATTRIBUTE","_b","label","String","_c","key","autoComplete","tabIndex","className","concat","style","top","yStart","left","xStart","width","xEnd","height","yEnd","pointerEvents","onCompositionEnd","e","text","data","currentTarget","value","editable","setTimeout","setEditorInitialValue","getEditorId","onInput"],"mappings":"yUAuBQA,EAAcC,EAAAA,sBACdC,EAAQC,EAAAA,uBACNC,EAAcC,EAAAA,gCACdC,EAAiBC,EAAAA,oCACnBC,EAAOC,EAAAA,oBACPC,EAAMC,EAAAA,OAAyB,MAC/BC,EAAgCC,EAAAA,UAAS,GAAxCC,EAAWF,EAAA,GAAEG,EAAcH,EAAA,GAE5BI,EAASd,EAAMe,cAAgBb,EAQrC,GANAc,EAAAA,WAAU,iBACJF,GAAUG,SAASC,gBAAkBV,EAAIW,UAChC,QAAXC,EAAAZ,EAAIW,eAAO,IAAAC,GAAAA,EAAEC,MAAM,CAAEC,eAAe,IAExC,GAAG,CAACR,EAAQd,KAEPA,EAAMe,aAAeb,EACxB,OAAO,KAGT,IAAMqB,EAAMjB,EAAKN,EAAMwB,MAAMC,UACrBD,EAAUxB,EAAKwB,MAEvB,OACEE,EAAAA,IAAA,UAAAN,EAAA,CACEZ,IAAKA,IACEmB,EAAAA,uBAAwB,GAAEP,EAAA,cACX,QAAVQ,EAAAL,aAAG,EAAHA,EAAKM,aAAK,IAAAD,EAAAA,EAAIE,OAAe,QAARC,EAAAR,aAAG,EAAHA,EAAKS,WAAG,IAAAD,EAAAA,EAAI,IAC7CX,EAAAa,aAAa,MACbb,EAAAc,YACAd,EAAAe,UAAW,iDAAAC,OACTxB,EAAc,kCAAoC,aAEpDQ,EAAAiB,MAAO,CACLC,IAAKd,EAAMe,OACXC,KAAMhB,EAAMiB,OACZC,MAAOlB,EAAMmB,KAAOnB,EAAMiB,OAC1BG,OAAQpB,EAAMqB,KAAOrB,EAAMe,OAC3BO,cAAe,QAEjB1B,qBAAoB,WAClBP,GAAe,EACjB,EACAO,EAAA2B,iBAAkB,SAACC,GACjB,IAAMC,EAAOD,EAAEE,KACfrC,GAAe,GACfmC,EAAEG,cAAcC,MAAQ,GAEpBH,IAAQ1B,aAAG,EAAHA,EAAK8B,YACfjD,IACAkD,YAAW,WACTC,EAAAA,sBAAsBN,EAAMnD,EAAY0D,cAC1C,GAAG,IAEP,EACApC,EAAAqC,QAAS,SAACT,GAGHpC,IACHoC,EAAEG,cAAcC,MAAQ,GAE5B,EAAChC,GAGP"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use client";"use strict";var e=require("react/jsx-runtime"),t=require("react"),r=require("../../edit/provider.js"),n=require("../../sheet/providers.js"),i=require("../../range/provider.js"),o=require("../../copy/provider.js"),s=require("../../id/provider.js"),a=require("../event-target.js"),d=
|
|
1
|
+
"use client";"use strict";var e=require("react/jsx-runtime"),t=require("react"),r=require("../../edit/provider.js"),n=require("../../sheet/providers.js"),i=require("../../range/provider.js"),o=require("../../copy/provider.js"),s=require("../../id/provider.js"),a=require("../event-target.js"),d=require("../editor-input.js");exports.KeyboardSetting=function(u){var y=s.useTableIdGenerator(),l=r.useEditContext(),c=i.useRangeContext(),p=o.useCopyActionContext().copy,f=n.useColumnsContext()[c.isSelecting?c.start.colIndex:0];return t.useEffect((function(){var e=function(e){a.isComposingKey(e)||(l.isEditing?"Escape"===e.key&&(e.preventDefault(),l.endEditing()):c.isSelecting&&!a.isTextEntryTarget(e.target)&&("Enter"===e.key?(e.preventDefault(),c.moveDown()):"Escape"===e.key?(e.preventDefault(),c.reset()):"ArrowRight"===e.key?(e.preventDefault(),e.ctrlKey&&e.shiftKey?c.extendRightEnd():e.ctrlKey?c.moveRightEnd():e.shiftKey?c.extendRight():c.moveRight()):"ArrowLeft"===e.key?(e.preventDefault(),e.ctrlKey&&e.shiftKey?c.extendLeftEnd():e.ctrlKey?c.moveLeftEnd():e.shiftKey?c.extendLeft():c.moveLeft()):"ArrowUp"===e.key?(e.preventDefault(),e.ctrlKey&&e.shiftKey?c.extendTop():e.ctrlKey?c.moveTop():e.shiftKey?c.extendUp():c.moveUp()):"ArrowDown"===e.key?(e.preventDefault(),e.ctrlKey&&e.shiftKey?c.extendBottom():e.ctrlKey?c.moveBottom():e.shiftKey?c.extendDown():c.moveDown()):"F2"===e.key?(e.preventDefault(),l.startEditing()):(e.ctrlKey||e.metaKey)&&"c"===e.key.toLowerCase()?(e.preventDefault(),p({enableDeprecatedCopy:null==u?void 0:u.enableDeprecatedCopy})):e.altKey||e.ctrlKey||e.metaKey||1!==Array.from(e.key).length?"Backspace"!==e.key&&"Delete"!==e.key||(e.preventDefault(),e.stopPropagation(),l.startEditing(),setTimeout((function(){d.setEditorInitialValue("",y.getEditorId())}),10)):(e.preventDefault(),e.stopPropagation(),l.startEditing(),setTimeout((function(){d.setEditorInitialValue(e.key,y.getEditorId())}),10))))};return document.addEventListener("keydown",e),function(){document.removeEventListener("keydown",e)}}),[c,l.isEditing]),t.useEffect((function(){l.isEditing&&!f.editable&&l.endEditing()}),[l,f]),e.jsx(e.Fragment,{})};
|
|
2
2
|
//# sourceMappingURL=keyboard-setting.js.map
|
|
@@ -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":["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":"6VAWM,SAA0BA,GAC9B,IAAMC,EAAcC,EAAAA,sBACdC,EAAOC,EAAAA,iBACPC,EAAQC,EAAAA,kBACNC,EAASC,EAAAA,4BACXC,EAAMC,EAAAA,oBAAoBL,EAAMM,YAAcN,EAAMO,MAAMC,SAAW,GAkH3E,OAhHAC,EAAAA,WAAU,WACR,IAAMC,EAAW,SAACC,GACZC,EAAAA,eAAeD,KAIfb,EAAKe,UACO,WAAVF,EAAEG,MACJH,EAAEI,iBACFjB,EAAKkB,cAEEhB,EAAMM,cAAgBW,EAAAA,kBAAkBN,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,EAAAA,sBAAsB,GAAIpD,EAAYqD,cACxC,GAAG,MAdHtC,EAAEI,iBACFJ,EAAEmC,kBACFhD,EAAKwC,eAELS,YAAW,WACTC,EAAAA,sBAAsBrC,EAAEG,IAAKlB,EAAYqD,cAC3C,GAAG,MAWT,EAIA,OAFAC,SAASC,iBAAiB,UAAWzC,GAE9B,WACLwC,SAASE,oBAAoB,UAAW1C,EAC1C,CACF,GAAG,CAACV,EAAOF,EAAKe,YAEhBJ,EAAAA,WAAU,WACJX,EAAKe,YAAcT,EAAIiD,UACzBvD,EAAKkB,YAET,GAAG,CAAClB,EAAMM,IAEHkD,EAAAA,kBACT"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";exports.setEditorInitialValue=function(t,e){var n,i=document.getElementById(e);if(i instanceof HTMLInputElement){var l=null===(n=Object.getOwnPropertyDescriptor(window.HTMLInputElement.prototype,"value"))||void 0===n?void 0:n.set;null==l||l.call(i,t),i.dispatchEvent(new Event("input",{bubbles:!0}))}};
|
|
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":["text","id","inputElement","document","getElementById","HTMLInputElement","nativeInputValueSetter","_a","Object","getOwnPropertyDescriptor","window","prototype","set","call","dispatchEvent","Event","bubbles"],"mappings":"2CAIM,SAAgCA,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
|
-
"use strict";exports.isComposingKey=function(e){return e.isComposing||229===e.keyCode},exports.isTextEntryTarget=function(
|
|
1
|
+
"use strict";var e="data-react-ui-key-catcher";exports.KEY_CATCHER_ATTRIBUTE=e,exports.isComposingKey=function(e){return e.isComposing||229===e.keyCode},exports.isTextEntryTarget=function(t){return t instanceof HTMLElement&&(!t.hasAttribute(e)&&(!!t.isContentEditable||(t instanceof HTMLInputElement||t instanceof HTMLTextAreaElement||t instanceof HTMLSelectElement)))};
|
|
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":["e","isComposing","keyCode","target","HTMLElement","isContentEditable","HTMLInputElement","HTMLTextAreaElement","HTMLSelectElement"],"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","e","isComposing","keyCode","target","HTMLElement","hasAttribute","isContentEditable","HTMLInputElement","HTMLTextAreaElement","HTMLSelectElement"],"mappings":"aACO,IAAMA,EAAwB,mFA6B/B,SAAyBC,GAC7B,OAAOA,EAAEC,aAA6B,MAAdD,EAAEE,OAC5B,4BAxBM,SAA4BC,GAChC,OAAMA,aAAkBC,eAKpBD,EAAOE,aAAaN,OAIpBI,EAAOG,oBAKTH,aAAkBI,kBAClBJ,aAAkBK,qBAClBL,aAAkBM,oBAEtB"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";var e=require("../../../node_modules/tslib/tslib.es6.js"),t=require("react"),r=require("../sheet/providers.js"),a=require("../range/provider.js"),
|
|
1
|
+
"use strict";var e=require("../../../node_modules/tslib/tslib.es6.js"),t=require("react"),r=require("../sheet/providers.js"),a=require("../range/provider.js"),s=require("./logic.js"),n=require("./parse.js"),o=require("../operation/event-target.js"),i=require("../locale/provider.js");exports.usePasteReducer=function(u){var c=a.useRangeActionContext().setRange,d=r.useColumnValidatesContext(),l=a.useRangeStateContext(),g=i.useMessages(),p=t.useRef(u.rows),v=t.useRef(e.__assign(e.__assign({},u),{validators:d,range:l,messages:g}));t.useEffect((function(){v.current=e.__assign(e.__assign({},u),{validators:d,range:l,messages:g})}));var x=t.useCallback((function(e){p.current=e}),[]),f=t.useCallback((function(e){var t=v.current,r=t.cols,a=t.validators,n=t.range,o=t.messages,i=t.onUpdateRowFunction,u=t.onPasteError;if(n.isSelecting&&i){var d=s.paste({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:p.current,currentCols:r,validators:a,messages:o.paste});if(d.isError){if("ValidationError"===d.type||"NoPasteData"===d.type)return;var l={type:d.type,message:d.message};u?u(l):alert(l.message)}else d.updateArgument.forEach((function(e){var t=e.newRow,r=e.oldRow;i(t,r)})),c(d.pasteRange)}}),[c]);return t.useEffect((function(){var e=function(e){var t=v.current,r=t.range,a=t.onUpdateRowFunction;r.isSelecting&&a&&(o.isTextEntryTarget(e.target)||e.clipboardData&&(e.preventDefault(),f(n.parseClipboardText(e.clipboardData.getData("Text")))))};return document.addEventListener("paste",e),function(){document.removeEventListener("paste",e)}}),[f]),t.useMemo((function(){return{setRows:x,onPaste:f}}),[x,f])};
|
|
2
2
|
//# sourceMappingURL=hooks.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hooks.js","sources":["../../../../../src/table/paste/hooks.ts"],"sourcesContent":["import { useCallback, useEffect, useMemo, useRef } from \"react\";\nimport { TPasteHookArguments, TPasteReducerReturn } from \"./types\";\nimport { useColumnValidatesContext } from \"../sheet/providers\";\nimport { useRangeActionContext, useRangeStateContext } from \"../range/provider\";\nimport { paste } from \"./logic\";\nimport { parseClipboardText } from \"./parse\";\nimport { isTextEntryTarget } from \"../operation/event-target\";\n\nexport function usePasteReducer(args: TPasteHookArguments): TPasteReducerReturn {\n const { setRange } = useRangeActionContext();\n const validators = useColumnValidatesContext();\n const range = useRangeStateContext();\n const rowsRef = useRef(args.rows);\n\n // Read the latest props when a paste happens, so callbacks passed in later\n // renders are the ones that get called.\n const latest = useRef({ ...args, validators, range });\n useEffect(() => {\n latest.current = { ...args, validators, range };\n });\n\n const setRows = useCallback((rows: any[]) => {\n rowsRef.current = rows;\n }, []);\n\n const onPaste = useCallback(\n (pasteData: string[][]) => {\n const {
|
|
1
|
+
{"version":3,"file":"hooks.js","sources":["../../../../../src/table/paste/hooks.ts"],"sourcesContent":["import { useCallback, useEffect, useMemo, useRef } from \"react\";\nimport { TPasteHookArguments, TPasteReducerReturn } from \"./types\";\nimport { useColumnValidatesContext } from \"../sheet/providers\";\nimport { useRangeActionContext, useRangeStateContext } from \"../range/provider\";\nimport { paste } from \"./logic\";\nimport { parseClipboardText } from \"./parse\";\nimport { isTextEntryTarget } from \"../operation/event-target\";\nimport { useMessages } from \"../locale/provider\";\n\nexport function usePasteReducer(args: TPasteHookArguments): TPasteReducerReturn {\n const { setRange } = useRangeActionContext();\n const validators = useColumnValidatesContext();\n const range = useRangeStateContext();\n const messages = useMessages();\n const rowsRef = useRef(args.rows);\n\n // Read the latest props when a paste happens, so callbacks passed in later\n // renders are the ones that get called.\n const latest = useRef({ ...args, validators, range, messages });\n useEffect(() => {\n latest.current = { ...args, validators, range, messages };\n });\n\n const setRows = useCallback((rows: any[]) => {\n rowsRef.current = rows;\n }, []);\n\n const onPaste = useCallback(\n (pasteData: string[][]) => {\n const {\n cols,\n validators,\n range,\n messages,\n onUpdateRowFunction,\n onPasteError,\n } = latest.current;\n\n if (!range.isSelecting || !onUpdateRowFunction) {\n return;\n }\n\n const res = paste({\n pasteData,\n // The selection may have been made bottom-up or right-to-left, so\n // paste from its top-left cell.\n pasteArea: {\n start: {\n rowIndex: Math.min(range.start.rowIndex, range.end.rowIndex),\n colIndex: Math.min(range.start.colIndex, range.end.colIndex),\n },\n end: {\n rowIndex: Math.max(range.start.rowIndex, range.end.rowIndex),\n colIndex: Math.max(range.start.colIndex, range.end.colIndex),\n },\n },\n currentRows: rowsRef.current,\n currentCols: cols,\n validators,\n messages: messages.paste,\n });\n\n if (res.isError) {\n // Validation errors are already reported by the column validators.\n if (res.type === \"ValidationError\" || res.type === \"NoPasteData\") {\n return;\n }\n\n const error = { type: res.type, message: res.message };\n if (onPasteError) {\n onPasteError(error);\n } else {\n alert(error.message);\n }\n return;\n }\n\n res.updateArgument.forEach(({ newRow, oldRow }) => {\n onUpdateRowFunction(newRow, oldRow);\n });\n setRange(res.pasteRange);\n },\n [setRange]\n );\n\n useEffect(() => {\n const listener = (e: ClipboardEvent) => {\n const { range, onUpdateRowFunction } = latest.current;\n\n if (!range.isSelecting || !onUpdateRowFunction) {\n return;\n }\n\n // Leave pastes into text fields (including the cell editor) to them.\n if (isTextEntryTarget(e.target)) {\n return;\n }\n\n if (e.clipboardData) {\n e.preventDefault();\n onPaste(parseClipboardText(e.clipboardData.getData(\"Text\")));\n }\n };\n\n document.addEventListener(\"paste\", listener);\n\n return () => {\n document.removeEventListener(\"paste\", listener);\n };\n }, [onPaste]);\n\n return useMemo(() => ({ setRows, onPaste }), [setRows, onPaste]);\n}\n"],"names":["args","setRange","useRangeActionContext","validators","useColumnValidatesContext","range","useRangeStateContext","messages","useMessages","rowsRef","useRef","rows","latest","__assign","useEffect","current","setRows","useCallback","onPaste","pasteData","_a","cols","onUpdateRowFunction","onPasteError","isSelecting","res","paste","pasteArea","start","rowIndex","Math","min","end","colIndex","max","currentRows","currentCols","isError","type","error","message","alert","updateArgument","forEach","newRow","oldRow","pasteRange","listener","e","isTextEntryTarget","target","clipboardData","preventDefault","parseClipboardText","getData","document","addEventListener","removeEventListener","useMemo"],"mappings":"oTASM,SAA0BA,GACtB,IAAAC,EAAaC,EAAAA,iCACfC,EAAaC,EAAAA,4BACbC,EAAQC,EAAAA,uBACRC,EAAWC,EAAAA,cACXC,EAAUC,EAAAA,OAAOV,EAAKW,MAItBC,EAASF,EAAAA,OAAMG,EAAAA,SAAAA,EAAAA,SAAA,CAAA,EAAMb,GAAI,CAAEG,WAAUA,EAAEE,MAAKA,EAAEE,SAAQA,KAC5DO,EAAAA,WAAU,WACRF,EAAOG,QAAOF,EAAAA,SAAAA,EAAAA,SAAA,CAAA,EAAQb,IAAMG,WAAUA,EAAEE,MAAKA,EAAEE,SAAQA,GACzD,IAEA,IAAMS,EAAUC,eAAY,SAACN,GAC3BF,EAAQM,QAAUJ,CACpB,GAAG,IAEGO,EAAUD,eACd,SAACE,GACO,IAAAC,EAOFR,EAAOG,QANTM,EAAID,EAAAC,KACJlB,EAAUiB,EAAAjB,WACVE,EAAKe,EAAAf,MACLE,EAAQa,EAAAb,SACRe,EAAmBF,EAAAE,oBACnBC,EAAYH,EAAAG,aAGd,GAAKlB,EAAMmB,aAAgBF,EAA3B,CAIA,IAAMG,EAAMC,EAAAA,MAAM,CAChBP,UAASA,EAGTQ,UAAW,CACTC,MAAO,CACLC,SAAUC,KAAKC,IAAI1B,EAAMuB,MAAMC,SAAUxB,EAAM2B,IAAIH,UACnDI,SAAUH,KAAKC,IAAI1B,EAAMuB,MAAMK,SAAU5B,EAAM2B,IAAIC,WAErDD,IAAK,CACHH,SAAUC,KAAKI,IAAI7B,EAAMuB,MAAMC,SAAUxB,EAAM2B,IAAIH,UACnDI,SAAUH,KAAKI,IAAI7B,EAAMuB,MAAMK,SAAU5B,EAAM2B,IAAIC,YAGvDE,YAAa1B,EAAQM,QACrBqB,YAAaf,EACblB,WAAUA,EACVI,SAAUA,EAASmB,QAGrB,GAAID,EAAIY,QAAR,CAEE,GAAiB,oBAAbZ,EAAIa,MAA2C,gBAAbb,EAAIa,KACxC,OAGF,IAAMC,EAAQ,CAAED,KAAMb,EAAIa,KAAME,QAASf,EAAIe,SACzCjB,EACFA,EAAagB,GAEbE,MAAMF,EAAMC,QAGhB,MAEAf,EAAIiB,eAAeC,SAAQ,SAACvB,OAAEwB,EAAMxB,EAAAwB,OAAEC,EAAMzB,EAAAyB,OAC1CvB,EAAoBsB,EAAQC,EAC9B,IACA5C,EAASwB,EAAIqB,WAxCb,CAyCF,GACA,CAAC7C,IA6BH,OA1BAa,EAAAA,WAAU,WACR,IAAMiC,EAAW,SAACC,GACV,IAAA5B,EAAiCR,EAAOG,QAAtCV,EAAKe,EAAAf,MAAEiB,EAAmBF,EAAAE,oBAE7BjB,EAAMmB,aAAgBF,IAKvB2B,EAAAA,kBAAkBD,EAAEE,SAIpBF,EAAEG,gBACJH,EAAEI,iBACFlC,EAAQmC,EAAAA,mBAAmBL,EAAEG,cAAcG,QAAQ,WAEvD,EAIA,OAFAC,SAASC,iBAAiB,QAAST,GAE5B,WACLQ,SAASE,oBAAoB,QAASV,EACxC,CACF,GAAG,CAAC7B,IAEGwC,EAAAA,SAAQ,WAAM,OAAG1C,QAAOA,EAAEE,QAAOA,EAAnB,GAAwB,CAACF,EAASE,GACzD"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";var e=require("../../../node_modules/tslib/tslib.es6.js"),r=/^-?\d{1,3}(,\d{3})+(\.\d+)?$/;function
|
|
1
|
+
"use strict";var e=require("../../../node_modules/tslib/tslib.es6.js"),r=require("../locale/messages.js"),t=/^-?\d{1,3}(,\d{3})+(\.\d+)?$/;function a(e,r){if("number"!==e.type)return r;var a=r.trim();return t.test(a)?a.replace(/,/g,""):a}exports.paste=function(t){var s,n,o=null!==(s=t.messages)&&void 0!==s?s:r.MESSAGES.ja.paste,l=t.pasteData.length,u=Math.max.apply(Math,t.pasteData.map((function(e){return e.length})));if(0===l||0===u)return{isError:!0,type:"NoPasteData",message:o.noData};var p=t.pasteArea.end.rowIndex-t.pasteArea.start.rowIndex+1,d=t.pasteArea.end.colIndex-t.pasteArea.start.colIndex+1,i=p<l?l:p,c=d<u?u:d;if(i+t.pasteArea.start.rowIndex>t.currentRows.length)return{isError:!0,type:"NOT_ENOUGH_ROWS",message:o.notEnoughRows};if(c+t.pasteArea.start.colIndex>t.currentCols.length)return{isError:!0,type:"NOT_ENOUGH_COLUMNS",message:o.notEnoughColumns};for(var x=0;x<c;x++){if(!(A=t.currentCols[t.pasteArea.start.colIndex+x]).editable)return{isError:!0,type:"NOT_EDITABLE_COLUMN",message:o.notEditableColumn(null!==(n=A.label)&&void 0!==n?n:A.key)}}for(x=0;x<l;x++)for(var I=t.pasteData[x],g=0;g<c;g++){var A,f=g%I.length,m=a(A=t.currentCols[t.pasteArea.start.colIndex+g],I[f]);if(!(0,t.validators[A.key])(m))return{isError:!0,type:"ValidationError",message:o.invalidValue(m)}}var w=[];for(x=0;x<i;x++){I=t.pasteData[x%l];var E=e.__assign({},t.currentRows[t.pasteArea.start.rowIndex+x]),v=!1,y=function(e){var r=t.currentCols[t.pasteArea.start.colIndex+e],s=a(r,I[e%I.length]),n="number"===r.type?Number(s):"select"===r.type?""===s?"":r.options.find((function(e){return e.label===s})).value:s;E[r.key]!==n&&(v=!0,E[r.key]=n)};for(g=0;g<c;g++)y(g);v&&w.push({newRow:E,oldRow:t.currentRows[t.pasteArea.start.rowIndex+x]})}return{isError:!1,updateArgument:w,pasteRange:{start:{rowIndex:t.pasteArea.start.rowIndex,colIndex:t.pasteArea.start.colIndex},end:{rowIndex:t.pasteArea.start.rowIndex+i-1,colIndex:t.pasteArea.start.colIndex+c-1}}}};
|
|
2
2
|
//# sourceMappingURL=logic.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"logic.js","sources":["../../../../../src/table/paste/logic.ts"],"sourcesContent":["import { TTableColumn } from \"../table/type\";\n\ntype TPasteArgument = {\n pasteData: string[][];\n currentRows: any[];\n currentCols: TTableColumn<any>[];\n tableArea?: {\n start: {\n rowIndex: number;\n colIndex: number;\n };\n end: {\n rowIndex: number;\n colIndex: number;\n };\n };\n pasteArea: {\n start: {\n rowIndex: number;\n colIndex: number;\n };\n end: {\n rowIndex: number;\n colIndex: number;\n };\n };\n validators: {\n [key: string]: (value: any) => boolean;\n };\n};\n\ntype TPasteResult =\n | {\n isError: true;\n type:\n | \"ValidationError\"\n | \"NoPasteData\"\n | \"NOT_ENOUGH_ROWS\"\n | \"NOT_ENOUGH_COLUMNS\"\n | \"NOT_EDITABLE_COLUMN\";\n message: string;\n }\n | {\n isError: false;\n updateArgument: {\n newRow: any;\n oldRow: any;\n }[];\n pasteRange: {\n start: {\n rowIndex: number;\n colIndex: number;\n };\n end: {\n rowIndex: number;\n colIndex: number;\n };\n };\n };\n\n// A number with thousands separators, as Excel copies formatted numbers.\nconst GROUPED_NUMBER = /^-?\\d{1,3}(,\\d{3})+(\\.\\d+)?$/;\n\n/**\n * Turns pasted text into the form the column's validator expects. For number\n * columns, surrounding spaces and thousands separators (\"1,000\") are removed.\n */\nfunction normalizePastedValue(col: TTableColumn<any>, value: string): string {\n if (col.type !== \"number\") {\n return value;\n }\n\n const trimmed = value.trim();\n return GROUPED_NUMBER.test(trimmed) ? trimmed.replace(/,/g, \"\") : trimmed;\n}\n\nexport function paste(args: TPasteArgument): TPasteResult {\n // ペーストデータの行数と列数を取得\n const pasteDataRowLength = args.pasteData.length;\n const pasteDataColLength = Math.max(\n ...args.pasteData.map((row) => row.length)\n );\n\n // ペーストデータが空の場合は何もしない\n if (pasteDataRowLength === 0 || pasteDataColLength === 0) {\n return {\n isError: true,\n type: \"NoPasteData\",\n message:
|
|
1
|
+
{"version":3,"file":"logic.js","sources":["../../../../../src/table/paste/logic.ts"],"sourcesContent":["import { MESSAGES, TMessages } from \"../locale/messages\";\nimport { TTableColumn } from \"../table/type\";\n\ntype TPasteArgument = {\n pasteData: string[][];\n currentRows: any[];\n currentCols: TTableColumn<any>[];\n tableArea?: {\n start: {\n rowIndex: number;\n colIndex: number;\n };\n end: {\n rowIndex: number;\n colIndex: number;\n };\n };\n pasteArea: {\n start: {\n rowIndex: number;\n colIndex: number;\n };\n end: {\n rowIndex: number;\n colIndex: number;\n };\n };\n validators: {\n [key: string]: (value: any) => boolean;\n };\n /** Messages for the errors. Japanese when omitted. */\n messages?: TMessages[\"paste\"];\n};\n\ntype TPasteResult =\n | {\n isError: true;\n type:\n | \"ValidationError\"\n | \"NoPasteData\"\n | \"NOT_ENOUGH_ROWS\"\n | \"NOT_ENOUGH_COLUMNS\"\n | \"NOT_EDITABLE_COLUMN\";\n message: string;\n }\n | {\n isError: false;\n updateArgument: {\n newRow: any;\n oldRow: any;\n }[];\n pasteRange: {\n start: {\n rowIndex: number;\n colIndex: number;\n };\n end: {\n rowIndex: number;\n colIndex: number;\n };\n };\n };\n\n// A number with thousands separators, as Excel copies formatted numbers.\nconst GROUPED_NUMBER = /^-?\\d{1,3}(,\\d{3})+(\\.\\d+)?$/;\n\n/**\n * Turns pasted text into the form the column's validator expects. For number\n * columns, surrounding spaces and thousands separators (\"1,000\") are removed.\n */\nfunction normalizePastedValue(col: TTableColumn<any>, value: string): string {\n if (col.type !== \"number\") {\n return value;\n }\n\n const trimmed = value.trim();\n return GROUPED_NUMBER.test(trimmed) ? trimmed.replace(/,/g, \"\") : trimmed;\n}\n\nexport function paste(args: TPasteArgument): TPasteResult {\n const messages = args.messages ?? MESSAGES.ja.paste;\n\n // ペーストデータの行数と列数を取得\n const pasteDataRowLength = args.pasteData.length;\n const pasteDataColLength = Math.max(\n ...args.pasteData.map((row) => row.length)\n );\n\n // ペーストデータが空の場合は何もしない\n if (pasteDataRowLength === 0 || pasteDataColLength === 0) {\n return {\n isError: true,\n type: \"NoPasteData\",\n message: messages.noData,\n };\n }\n\n // Rangeの種類を取得\n const rangeRowLength =\n args.pasteArea.end.rowIndex - args.pasteArea.start.rowIndex + 1;\n const rangeColLength =\n args.pasteArea.end.colIndex - args.pasteArea.start.colIndex + 1;\n\n const pasteRowLength =\n rangeRowLength < pasteDataRowLength ? pasteDataRowLength : rangeRowLength;\n const pasteColLength =\n rangeColLength < pasteDataColLength ? pasteDataColLength : rangeColLength;\n\n // ペースト先の行数が足りない場合はエラー\n if (\n pasteRowLength + args.pasteArea.start.rowIndex >\n args.currentRows.length\n ) {\n return {\n isError: true,\n type: \"NOT_ENOUGH_ROWS\",\n message: messages.notEnoughRows,\n };\n }\n // ペースト先の列数が足りない場合はエラー\n if (\n pasteColLength + args.pasteArea.start.colIndex >\n args.currentCols.length\n ) {\n return {\n isError: true,\n type: \"NOT_ENOUGH_COLUMNS\",\n message: messages.notEnoughColumns,\n };\n }\n\n // ペースト先の列に編集不可列が含まれている場合はエラー\n for (let i = 0; i < pasteColLength; i++) {\n const col = args.currentCols[args.pasteArea.start.colIndex + i];\n\n if (!col.editable) {\n return {\n isError: true,\n type: \"NOT_EDITABLE_COLUMN\",\n message: messages.notEditableColumn(\n col.label ?? (col.key as string)\n ),\n };\n }\n }\n\n // ペーストデータのバリデーション\n for (let i = 0; i < pasteDataRowLength; i++) {\n const pasteRow = args.pasteData[i];\n\n for (let j = 0; j < pasteColLength; j++) {\n const colIndexForData = j % pasteRow.length;\n const col = args.currentCols[args.pasteArea.start.colIndex + j];\n const pasteValue = normalizePastedValue(col, pasteRow[colIndexForData]);\n const validate = args.validators[col.key as string];\n\n if (!validate(pasteValue)) {\n return {\n isError: true,\n type: \"ValidationError\",\n message: messages.invalidValue(pasteValue),\n };\n }\n }\n }\n\n const updateArguments: { newRow: any; oldRow: any }[] = [];\n\n // ペーストデータを反映\n for (let i = 0; i < pasteRowLength; i++) {\n const pasteRow = args.pasteData[i % pasteDataRowLength];\n const newRow = { ...args.currentRows[args.pasteArea.start.rowIndex + i] };\n let checkUpdatedRow = false;\n\n for (let j = 0; j < pasteColLength; j++) {\n const col = args.currentCols[args.pasteArea.start.colIndex + j];\n const pasteValue = normalizePastedValue(col, pasteRow[j % pasteRow.length]);\n const value =\n col.type === \"number\"\n ? Number(pasteValue)\n : col.type === \"select\"\n ? pasteValue === \"\"\n ? \"\"\n : col.options.find((option) => option.label === pasteValue)!.value\n : pasteValue;\n if (newRow[col.key] !== value) {\n checkUpdatedRow = true;\n newRow[col.key] = value;\n }\n }\n\n if (checkUpdatedRow) {\n updateArguments.push({\n newRow,\n oldRow: args.currentRows[args.pasteArea.start.rowIndex + i],\n });\n }\n }\n\n return {\n isError: false,\n updateArgument: updateArguments,\n pasteRange: {\n start: {\n rowIndex: args.pasteArea.start.rowIndex,\n colIndex: args.pasteArea.start.colIndex,\n },\n end: {\n rowIndex: args.pasteArea.start.rowIndex + pasteRowLength - 1,\n colIndex: args.pasteArea.start.colIndex + pasteColLength - 1,\n },\n },\n };\n}\n"],"names":["GROUPED_NUMBER","normalizePastedValue","col","value","type","trimmed","trim","test","replace","args","messages","_a","MESSAGES","ja","paste","pasteDataRowLength","pasteData","length","pasteDataColLength","Math","max","map","row","isError","message","noData","rangeRowLength","pasteArea","end","rowIndex","start","rangeColLength","colIndex","pasteRowLength","pasteColLength","currentRows","notEnoughRows","currentCols","notEnoughColumns","i","editable","notEditableColumn","_b","label","key","pasteRow","j","colIndexForData","pasteValue","validate","validators","invalidValue","updateArguments","newRow","__assign","checkUpdatedRow","Number","options","find","option","push","oldRow","updateArgument","pasteRange"],"mappings":"0GAgEMA,EAAiB,+BAMvB,SAASC,EAAqBC,EAAwBC,GACpD,GAAiB,WAAbD,EAAIE,KACN,OAAOD,EAGT,IAAME,EAAUF,EAAMG,OACtB,OAAON,EAAeO,KAAKF,GAAWA,EAAQG,QAAQ,KAAM,IAAMH,CACpE,eAEM,SAAgBI,WACdC,EAAwB,QAAbC,EAAAF,EAAKC,gBAAQ,IAAAC,EAAAA,EAAIC,EAAAA,SAASC,GAAGC,MAGxCC,EAAqBN,EAAKO,UAAUC,OACpCC,EAAqBC,KAAKC,UAALD,KACtBV,EAAKO,UAAUK,KAAI,SAACC,GAAQ,OAAAA,EAAIL,MAAJ,KAIjC,GAA2B,IAAvBF,GAAmD,IAAvBG,EAC9B,MAAO,CACLK,SAAS,EACTnB,KAAM,cACNoB,QAASd,EAASe,QAKtB,IAAMC,EACJjB,EAAKkB,UAAUC,IAAIC,SAAWpB,EAAKkB,UAAUG,MAAMD,SAAW,EAC1DE,EACJtB,EAAKkB,UAAUC,IAAII,SAAWvB,EAAKkB,UAAUG,MAAME,SAAW,EAE1DC,EACJP,EAAiBX,EAAqBA,EAAqBW,EACvDQ,EACJH,EAAiBb,EAAqBA,EAAqBa,EAG7D,GACEE,EAAiBxB,EAAKkB,UAAUG,MAAMD,SACtCpB,EAAK0B,YAAYlB,OAEjB,MAAO,CACLM,SAAS,EACTnB,KAAM,kBACNoB,QAASd,EAAS0B,eAItB,GACEF,EAAiBzB,EAAKkB,UAAUG,MAAME,SACtCvB,EAAK4B,YAAYpB,OAEjB,MAAO,CACLM,SAAS,EACTnB,KAAM,qBACNoB,QAASd,EAAS4B,kBAKtB,IAAK,IAAIC,EAAI,EAAGA,EAAIL,EAAgBK,IAAK,CAGvC,KAFMrC,EAAMO,EAAK4B,YAAY5B,EAAKkB,UAAUG,MAAME,SAAWO,IAEpDC,SACP,MAAO,CACLjB,SAAS,EACTnB,KAAM,sBACNoB,QAASd,EAAS+B,kBACP,QAATC,EAAAxC,EAAIyC,aAAK,IAAAD,EAAAA,EAAKxC,EAAI0C,KAI1B,CAGA,IAASL,EAAI,EAAGA,EAAIxB,EAAoBwB,IAGtC,IAFA,IAAMM,EAAWpC,EAAKO,UAAUuB,GAEvBO,EAAI,EAAGA,EAAIZ,EAAgBY,IAAK,CACvC,IACM5C,EADA6C,EAAkBD,EAAID,EAAS5B,OAE/B+B,EAAa/C,EADbC,EAAMO,EAAK4B,YAAY5B,EAAKkB,UAAUG,MAAME,SAAWc,GAChBD,EAASE,IAGtD,KAAKE,EAFYxC,EAAKyC,WAAWhD,EAAI0C,MAEvBI,GACZ,MAAO,CACLzB,SAAS,EACTnB,KAAM,kBACNoB,QAASd,EAASyC,aAAaH,GAGrC,CAGF,IAAMI,EAAkD,GAGxD,IAASb,EAAI,EAAGA,EAAIN,EAAgBM,IAAK,CACjCM,EAAWpC,EAAKO,UAAUuB,EAAIxB,GAApC,IACMsC,EAAMC,EAAAA,SAAA,CAAA,EAAQ7C,EAAK0B,YAAY1B,EAAKkB,UAAUG,MAAMD,SAAWU,IACjEgB,GAAkB,aAEbT,GACP,IAAM5C,EAAMO,EAAK4B,YAAY5B,EAAKkB,UAAUG,MAAME,SAAWc,GACvDE,EAAa/C,EAAqBC,EAAK2C,EAASC,EAAID,EAAS5B,SAC7Dd,EACS,WAAbD,EAAIE,KACAoD,OAAOR,GACM,WAAb9C,EAAIE,KACW,KAAf4C,EACE,GACA9C,EAAIuD,QAAQC,MAAK,SAACC,GAAW,OAAAA,EAAOhB,QAAUK,CAAjB,IAA8B7C,MAC7D6C,EACFK,EAAOnD,EAAI0C,OAASzC,IACtBoD,GAAkB,EAClBF,EAAOnD,EAAI0C,KAAOzC,IAbtB,IAAS2C,EAAI,EAAGA,EAAIZ,EAAgBY,MAA3BA,GAiBLS,GACFH,EAAgBQ,KAAK,CACnBP,OAAMA,EACNQ,OAAQpD,EAAK0B,YAAY1B,EAAKkB,UAAUG,MAAMD,SAAWU,IAG/D,CAEA,MAAO,CACLhB,SAAS,EACTuC,eAAgBV,EAChBW,WAAY,CACVjC,MAAO,CACLD,SAAUpB,EAAKkB,UAAUG,MAAMD,SAC/BG,SAAUvB,EAAKkB,UAAUG,MAAME,UAEjCJ,IAAK,CACHC,SAAUpB,EAAKkB,UAAUG,MAAMD,SAAWI,EAAiB,EAC3DD,SAAUvB,EAAKkB,UAAUG,MAAME,SAAWE,EAAiB,IAInE"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use client";"use strict";var e=require("react/jsx-runtime"),t=require("react"),r=require("../libs/generate-validate-function.js"),n=t.createContext({cols:[],validates:{}});exports.ColumnsProvider=function(
|
|
1
|
+
"use client";"use strict";var e=require("react/jsx-runtime"),t=require("react"),r=require("../libs/generate-validate-function.js"),n=require("../locale/provider.js"),u=t.createContext({cols:[],validates:{}});exports.ColumnsProvider=function(o){var s=o.children,i=o.cols,a=o.errorHandler,c=n.useMessages(),l=t.useRef(a);t.useEffect((function(){l.current=a}));var d=t.useMemo((function(){var e=function(e){l.current?l.current(e):alert(c.validation(e))};return i.reduce((function(t,n){return t[n.key]=r.generateValidateFunction(n,e),t}),{})}),[i,c]),v=t.useMemo((function(){return{cols:i,validates:d}}),[i,d]);return e.jsx(u.Provider,{value:v,children:s})},exports.useColumnValidateContext=function(e){return t.useContext(u).validates[e]},exports.useColumnValidatesContext=function(){return t.useContext(u).validates},exports.useColumnsContext=function(){return t.useContext(u).cols};
|
|
2
2
|
//# sourceMappingURL=providers.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"providers.js","sources":["../../../../../src/table/sheet/providers.tsx"],"sourcesContent":["\"use client\";\n\nimport React, { createContext, useContext, useMemo } from \"react\";\nimport { DataRecord, TTableColumn } from \"../table/type\";\nimport {\n generateValidateFunction,\n TErrorValidation,\n} from \"../libs/generate-validate-function\";\n\nconst ColsContext = createContext<{\n cols: TTableColumn<DataRecord>[];\n validates: { [key: string]: (value: any) => boolean };\n}>({\n cols: [],\n validates: {},\n});\n\nexport function ColumnsProvider<T extends DataRecord>({\n children,\n cols,\n errorHandler,\n}: {\n children: React.ReactNode;\n cols: TTableColumn<T>[];\n errorHandler?: (errors: TErrorValidation[]) => void;\n}) {\n const validates = useMemo(\n ()
|
|
1
|
+
{"version":3,"file":"providers.js","sources":["../../../../../src/table/sheet/providers.tsx"],"sourcesContent":["\"use client\";\n\nimport React, { createContext, useContext, useEffect, useMemo, useRef } from \"react\";\nimport { DataRecord, TTableColumn } from \"../table/type\";\nimport {\n generateValidateFunction,\n TErrorValidation,\n} from \"../libs/generate-validate-function\";\nimport { useMessages } from \"../locale/provider\";\n\nconst ColsContext = createContext<{\n cols: TTableColumn<DataRecord>[];\n validates: { [key: string]: (value: any) => boolean };\n}>({\n cols: [],\n validates: {},\n});\n\nexport function ColumnsProvider<T extends DataRecord>({\n children,\n cols,\n errorHandler,\n}: {\n children: React.ReactNode;\n cols: TTableColumn<T>[];\n errorHandler?: (errors: TErrorValidation[]) => void;\n}) {\n const messages = useMessages();\n\n // Call the latest errorHandler without rebuilding the validators (and\n // re-rendering every cell) when the app passes a new function.\n const errorHandlerRef = useRef(errorHandler);\n useEffect(() => {\n errorHandlerRef.current = errorHandler;\n });\n\n const validates = useMemo(() => {\n const handleErrors = (errors: TErrorValidation[]) => {\n if (errorHandlerRef.current) {\n errorHandlerRef.current(errors);\n } else {\n alert(messages.validation(errors));\n }\n };\n\n return cols.reduce((acc, col) => {\n const { key } = col;\n\n acc[key] = generateValidateFunction(col as any, handleErrors);\n\n return acc;\n }, {} as { [key in keyof T]: (value: any) => boolean });\n }, [cols, messages]);\n\n const state = useMemo(() => ({ cols, validates }), [cols, validates]);\n\n return (\n <ColsContext.Provider\n value={\n state as {\n cols: TTableColumn<DataRecord>[];\n validates: { [key: string]: (value: any) => boolean };\n }\n }\n >\n {children}\n </ColsContext.Provider>\n );\n}\n\nexport function useColumnsContext() {\n return useContext(ColsContext).cols;\n}\n\nexport function useColumnValidateContext(key: string) {\n return useContext(ColsContext).validates[key];\n}\n\nexport function useColumnValidatesContext() {\n return useContext(ColsContext).validates;\n}\n"],"names":["ColsContext","createContext","cols","validates","_a","children","errorHandler","messages","useMessages","errorHandlerRef","useRef","useEffect","current","useMemo","handleErrors","errors","alert","validation","reduce","acc","col","key","generateValidateFunction","state","_jsx","Provider","value","useContext"],"mappings":"sKAUMA,EAAcC,EAAAA,cAGjB,CACDC,KAAM,GACNC,UAAW,CAAA,4BAGP,SAAgDC,GACpD,IAAAC,aACAH,EAAIE,EAAAF,KACJI,EAAYF,EAAAE,aAMNC,EAAWC,EAAAA,cAIXC,EAAkBC,EAAAA,OAAOJ,GAC/BK,EAAAA,WAAU,WACRF,EAAgBG,QAAUN,CAC5B,IAEA,IAAMH,EAAYU,EAAAA,SAAQ,WACxB,IAAMC,EAAe,SAACC,GAChBN,EAAgBG,QAClBH,EAAgBG,QAAQG,GAExBC,MAAMT,EAASU,WAAWF,GAE9B,EAEA,OAAOb,EAAKgB,QAAO,SAACC,EAAKC,GAKvB,OAFAD,EAFgBC,EAAGC,KAERC,2BAAyBF,EAAYN,GAEzCK,CACT,GAAG,CAAA,EACL,GAAG,CAACjB,EAAMK,IAEJgB,EAAQV,EAAAA,SAAQ,WAAM,MAAA,CAAGX,KAAIA,EAAEC,YAAT,GAAuB,CAACD,EAAMC,IAE1D,OACEqB,EAAAA,IAACxB,EAAYyB,SAAQ,CACnBC,MACEH,EAGClB,SAGFA,GAGP,mCAMM,SAAmCgB,GACvC,OAAOM,aAAW3B,GAAaG,UAAUkB,EAC3C,+CAGE,OAAOM,EAAAA,WAAW3B,GAAaG,SACjC,uCATE,OAAOwB,EAAAA,WAAW3B,GAAaE,IACjC"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use client";"use strict";var e=require("../../../node_modules/tslib/tslib.es6.js"),r=require("react/jsx-runtime"),o=require("./hook.js"),i=require("../header/header.js"),s=require("../pagenation/providers.js"),n=require("../pagenation/components.js");require("../filter-v2/context.js");var t=require("../filter-v2/provider.js");require("../sort/icon.js");var d=require("../sort/provider.js"),
|
|
1
|
+
"use client";"use strict";var e=require("../../../node_modules/tslib/tslib.es6.js"),r=require("react/jsx-runtime"),o=require("./hook.js"),i=require("../header/header.js"),s=require("../pagenation/providers.js"),n=require("../pagenation/components.js");require("../filter-v2/context.js");var t=require("../filter-v2/provider.js");require("../sort/icon.js");var d=require("../sort/provider.js"),l=require("../sheet/providers.js"),a=require("../checkbox/provider.js"),c=require("../edit/provider.js"),x=require("../table-property/provider.js"),j=require("../operation/components/keyboard-setting.js"),h=require("../operation/components/key-catcher.js"),u=require("../sheet/components.js"),p=require("../paste/provider.js"),v=require("../libs/conditional-formatting.js"),m=require("../edit/ui/editor.js"),g=require("../range/provider.js"),b=require("../copy/provider.js"),q=require("../copy/components.js"),w=require("../id/provider.js"),P=require("../header/header-v2.js");require("../header/columns-width/context.js");var C=require("../header/columns-width/provider.js");require("../header/x-scroll-position/context.js");var y=require("../header/x-scroll-position/provider.js"),k=require("../frame/frame.js"),S=require("./component-provider/provider.js"),f=require("../../select-box/provider.js"),R=require("../locale/provider.js");function T(e){var s=o.useTable(e),t=s.cols,d=s.rowMaps,l=s.pageRowIds,a=w.useTableIdGenerator(),c=S.useGenerateSortButton();return r.jsxs("div",{className:"w-full max-w-full max-h-full",children:[r.jsxs("div",{children:[r.jsx(P.TableHeader,{cols:t,checkbox:!!e.checkbox,rows:e.rows,maxWidth:e.maxWidth,generateSortButton:c}),r.jsx(C.ColumnsWidthStyle,{scopeId:a.getTableId()}),r.jsx(f.SelectBoxProvider,{children:r.jsxs(k.Frame,{id:a.getTableId(),maxHeight:e.maxHeight,maxWidth:e.maxWidth,displayScroll:!1,children:[r.jsxs("table",{className:"table",children:[r.jsx("thead",{children:r.jsxs("tr",{children:[e.checkbox&&r.jsx("th",{className:"p-px"}),t.map((function(e){return r.jsx(i.TableHeaderElement,{keyname:e.key.toString()},e.key.toString())}))]})}),r.jsxs("tbody",{children:[0===l.length&&r.jsx("tr",{children:r.jsx("td",{colSpan:t.length+(e.checkbox?1:0),className:"px-px py-5",children:r.jsx("p",{className:"text-center font-bold text-lg",children:"NO DATA"})})}),l.map((function(o,i){return r.jsx(u.Row,{existCheckbox:!!e.checkbox,rowIndex:i,row:d[o].data,cols:e.cols,onClickRow:e.onClickRow,applyRowFormatting:e.applyRowFormatting,conditionalFormattingString:v.generateFormattingString(d[o].data,t,e.conditionalFormattings)},o)}))]})]}),r.jsx(g.TestRange,{}),r.jsx(h.KeyCatcher,{}),r.jsx(m.Editor,{rowMaps:d,pageRowIds:l})]})})]}),r.jsxs("div",{className:"mt-1",children:[r.jsx(n.DisplayRange,{}),r.jsx("div",{className:"mt-2",children:r.jsx(n.Pagenation,{})})]})]})}module.exports=function(o){var i,n,h,u,v,m;return r.jsx(R.LocaleProvider,{locale:o.locale,children:r.jsx(S.ComponentProvider,{children:r.jsx(w.TableIdGeneratorProvider,{id:o.id,children:r.jsx(C.ColumnsWidthProvider,{cols:o.cols,children:r.jsx(t.FilterProvider,{initialConditions:[],children:r.jsx(d.SortProvider,{initialCondition:null===(i=o.initialCondition)||void 0===i?void 0:i.sort,children:r.jsx(s.PagenationProvider,{rowCount:o.rows.length,perPage:null===(v=null!==(h=null===(n=o.initialCondition)||void 0===n?void 0:n.pagination)&&void 0!==h?h:null===(u=o.initialCondition)||void 0===u?void 0:u.pagenation)||void 0===v?void 0:v.rowCountPerPage,children:r.jsx(a.CheckboxProvider,{checkbox:o.checkbox,children:r.jsx(a.CheckboxStatusProvider,{checkboxCount:o.rows.length,children:r.jsx(l.ColumnsProvider,{cols:o.cols,errorHandler:o.errorHandler,children:r.jsx(c.EditProvider,{children:r.jsx(x.TablePropertyProvider,{children:r.jsx(g.RangeProvider,{children:r.jsxs(b.CopyProvider,{rows:o.rows,cols:o.cols,children:[r.jsx(q.CopiedMessage,{}),r.jsxs(p.PasteProvider,{rows:o.rows,cols:o.cols,onUpdateRowFunction:o.onUpdateRow,onPasteError:o.onPasteError,children:[r.jsx(j.KeyboardSetting,{enableDeprecatedCopy:null===(m=o.deprecatedOptions)||void 0===m?void 0:m.enableDeprecatedCopy}),r.jsx(y.ScrollXPositionProvider,{children:r.jsx(T,e.__assign({},o))})]})]})})})})})})})})})})})})})})};
|
|
2
2
|
//# sourceMappingURL=base.js.map
|