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