matsuri-ui 16.4.1-alpha-1731090738472-ae2cccf.0 → 16.5.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.
@@ -1 +1 @@
1
- export declare const hasOwnProp: <T extends string>(props: unknown, property: T) => props is { [key in T]: unknown; };
1
+ export declare const hasOwnProp: <T extends string>(props: unknown, property: T) => props is Record<T, unknown>;
@@ -1 +1 @@
1
- {"version":3,"file":"hasOwnProp.js","names":["hasOwnProp","props","property","Object","hasOwnProperty","call"],"sources":["../../../src/@utils/hasOwnProp.tsx"],"sourcesContent":["export const hasOwnProp = <T extends string>(\n props: unknown,\n property: T,\n): props is {\n [key in T]: unknown;\n} => {\n return (\n typeof props === \"object\" && Object.hasOwnProperty.call(props, property)\n );\n};\n"],"mappings":"AAAA,OAAO,IAAMA,UAAU,GAAGA,CACxBC,KAAc,EACdC,QAAW,KAGR;EACH,OACE,OAAOD,KAAK,KAAK,QAAQ,IAAIE,MAAM,CAACC,cAAc,CAACC,IAAI,CAACJ,KAAK,EAAEC,QAAQ,CAAC;AAE5E,CAAC","ignoreList":[]}
1
+ {"version":3,"file":"hasOwnProp.js","names":["hasOwnProp","props","property","Object","hasOwnProperty","call"],"sources":["../../../src/@utils/hasOwnProp.tsx"],"sourcesContent":["export const hasOwnProp = <T extends string>(\n props: unknown,\n property: T,\n): props is Record<T, unknown> => {\n return (\n typeof props === \"object\" && Object.hasOwnProperty.call(props, property)\n );\n};\n"],"mappings":"AAAA,OAAO,IAAMA,UAAU,GAAGA,CACxBC,KAAc,EACdC,QAAW,KACqB;EAChC,OACE,OAAOD,KAAK,KAAK,QAAQ,IAAIE,MAAM,CAACC,cAAc,CAACC,IAAI,CAACJ,KAAK,EAAEC,QAAQ,CAAC;AAE5E,CAAC","ignoreList":[]}
@@ -27,11 +27,9 @@ export interface CSVImportUIRenderSearchFieldProps<Row> {
27
27
  onChange: (args: Row[]) => void;
28
28
  }
29
29
  type OptionByLabel<Columns extends CSVImportUIColumns> = {
30
- [Key in keyof Columns]: {
31
- [Label in Columns[Key]["label"]]: Columns[Key] extends {
32
- options: readonly (infer Option)[];
33
- } ? Option extends string ? Option : never : string;
34
- };
30
+ [Key in keyof Columns]: Record<Columns[Key]["label"], Columns[Key] extends {
31
+ options: readonly (infer Option)[];
32
+ } ? Option extends string ? Option : never : string>;
35
33
  }[keyof Columns];
36
34
  export type CSVImportUIRow<Columns extends CSVImportUIColumns> = AssertType<UnionToIntersection<OptionByLabel<Columns>>, Record<string, string>>;
37
35
  export interface CSVImportUIProps<Columns extends CSVImportUIColumns, Row extends Record<string, string> = CSVImportUIRow<Columns>> {
@@ -1 +1 @@
1
- {"version":3,"file":"CSVImportUI.js","names":["CompleteScreen","DownloadCreateTemplateScreen","DownloadUpdateTemplateScreen","LoadCSVScreen","ScreenProvider","useScreen","SelectModeScreen","UploadCSVScreen","useCallback","useMemo","useState","jsx","___EmotionJSX","CSVImportUIContent","_ref","columns","onDownloadCSV","searchLabel","onSearchData","renderSearchField","csvPrefix","csvParser","csvValidator","onPreUploadData","onPreUploadDataByRow","onUploadData","onUploadDataByRow","acceptMode","skipDownloadTemplate","defaultTemplateData","id","mode","setMode","uploadedData","setUploadedData","errors","setErrors","handleUpdateData","data","headers","_uploadedData$","rowKeys","Object","keys","values","filter","column","length","hiddenIfNoHeader","includes","label","map","filledData","_uploadedData$2","row","_extends","fromEntries","header","onChangeMode","onSearch","onUpdateData","onSubmitComplete","getFirstScreenId","accptMode","CSVImportUI","props","firstScreenId"],"sources":["../../../src/CSVImportUI/CSVImportUI.tsx"],"sourcesContent":["import { AlertMessageType } from \"../Alert\";\nimport { AssertType } from \"../@types/AssertType\";\nimport { CompleteScreen } from \"./screens/CompleteScreen\";\nimport { DownloadCreateTemplateScreen } from \"./screens/DownloadCreateTemplateScreen\";\nimport { DownloadUpdateTemplateScreen } from \"./screens/DownloadUpdateTemplateScreen\";\nimport { LoadCSVScreen } from \"./screens/LoadCSVScreen\";\nimport { ScreenId } from \"./screens/types\";\nimport { ScreenProvider, useScreen } from \"./ScreenProvider\";\nimport { SelectModeScreen } from \"./screens/SelectModeScreen\";\nimport { UnionToIntersection } from \"../@types/UnionToIntersection\";\nimport { UploadCSVScreen } from \"./screens/UploadCSVScreen\";\nimport { useCallback, useMemo, useState } from \"react\";\n\nexport type Mode = \"create\" | \"update\";\n\nexport type CellError = [string, string];\n\nexport type CSVImportUIColumn = Readonly<{\n label: string;\n type?: \"date\" | \"number\";\n options?: readonly string[];\n required?: boolean;\n hiddenOnCreateTemplate?: boolean;\n /**\n * アップロードされたCSVにヘッダーがなければ表示しない。\n */\n hiddenIfNoHeader?: boolean;\n renderCell?: (props: {\n value: string;\n header: string;\n row: Record<string, string>;\n }) => JSX.Element;\n}>;\n\n/**\n * ライブラリ利用者用の型\n */\nexport type CSVImportUIColumns = Record<string, CSVImportUIColumn>;\n\nexport interface CSVImportUIRenderSearchFieldProps<Row> {\n onChange: (args: Row[]) => void;\n}\n\ntype OptionByLabel<Columns extends CSVImportUIColumns> = {\n [Key in keyof Columns]: {\n [Label in Columns[Key][\"label\"]]: Columns[Key] extends {\n options: readonly (infer Option)[];\n }\n ? Option extends string\n ? Option\n : never\n : string;\n };\n}[keyof Columns];\n\nexport type CSVImportUIRow<Columns extends CSVImportUIColumns> = AssertType<\n UnionToIntersection<OptionByLabel<Columns>>,\n Record<string, string>\n>;\n\nexport interface CSVImportUIProps<\n Columns extends CSVImportUIColumns,\n Row extends Record<string, string> = CSVImportUIRow<Columns>,\n> {\n /**\n * 利用できるモードを指定する。\n */\n acceptMode: Mode[];\n /**\n * アップロード画面に進む前にトリガーされる。\n * 行ごとにデータを処理する。\n *\n * onPreUploadDataが指定されている場合、こちらは無視される。\n */\n onPreUploadDataByRow?: (args: {\n index: number;\n /**\n * 欠損したフィールドがある可能性があるため、型を緩くする。\n */\n row: Partial<Row>;\n mode: Mode;\n }) => Promise<{ error?: CellError; data?: Record<string, string> }>;\n /**\n * アップロード画面に進む前にトリガーされる。\n * 一括でデータをアップロードする。\n *\n * 現状onPreUploadDataByRowByRowとは異なり、行ごとにエラーを表示することはできない。\n * 代わりに、エラー時に表示されるアラートのメッセージをerrorMessageで指定する。\n *\n * 行毎にエラーを表示したくなった場合は、要望を出すこと。\n */\n onPreUploadData?: (args: { data: Partial<Row>[]; mode: Mode }) => Promise<{\n errorMessage?: AlertMessageType;\n data?: Record<string, string>[];\n }>;\n /**\n * CSVをパースしたデータのアップロードがトリガーされた際に呼ばれる。\n * 行ごとにデータをアップロードする。\n *\n * onUploadDataが指定されている場合、こちらは無視される。\n */\n onUploadDataByRow?: (args: {\n index: number;\n /**\n * 欠損したフィールドがある可能性があるため、型を緩くする。\n */\n row: Partial<Row>;\n mode: Mode;\n }) => Promise<{\n error?: CellError;\n data?: Record<string, string>;\n }>;\n /**\n * CSVをパースしたデータのアップロードがトリガーされた際に呼ばれる。\n * 一括でデータをアップロードする。\n *\n * 現状onUploadDataByRowとは異なり、行ごとにエラーを表示することはできない。\n * 代わりに、エラー時に表示されるアラートのメッセージをerrorMessageで指定する。\n *\n * 行毎にエラーを表示したくなった場合は、要望を出すこと。\n */\n onUploadData?: (args: { data: Partial<Row>[]; mode: Mode }) => Promise<{\n errorMessage?: AlertMessageType;\n data?: Record<string, string>[];\n }>;\n /**\n * 検索フォームのラベルとして利用される。\n * (only upload mode)\n */\n searchLabel?: string;\n /**\n * 検索が行われた際にトリガーされる。\n * ユーザーの入力した文字列に応じてデータを返却する。このデータはCSVとしてダウンロードされる。\n * (only upload mode)\n */\n onSearchData?: (args: { value: string }) => Promise<{\n data: Row[];\n }>;\n /**\n * CSVの各列をどのように表示するか指定する。\n * 各列には、次のプロパティが指定できる。\n *\n * `label` : CSVのヘッダーとして利用される。\n *\n * `type` : `date`または`number`が指定でき、それぞれ日付と数値としてアップロードされたCSVの値が正しいかどうかを検証する。\n *\n * `options` : その列が持てる値のリストを指定する。アップロードされたCSVの値がこのリストに含まれているかどうかを検証する。\n *\n * `required` : その列が必須かどうかを指定する。アップロードされたCSVの値が空でないかどうかを検証する。\n *\n * `renderCell` : その列のセルをどのように表示するかを指定する。その列の値、ヘッダー、行のデータが渡される。\n *\n * `hiddenOnCreateTemplate` : 作成用のCSVのテンプレートに、その列を表示しないかどうかを決定する。\n *\n * `hiddenIfNoHeader` : アップロードされたCSVにそのヘッダーがなければ、その列を表示しないかどうかを決定する。\n */\n columns: Columns;\n /**\n * ダウンロードされるCSVに付与されるプレフィックスを指定する\n */\n csvPrefix?: string;\n /**\n * CSVのダウンロードがトリガーされたときに呼ばれる\n */\n onDownloadCSV: (args: { data: Row[]; filename: string }) => void;\n /**\n * CSVがアップロードされたときに呼ばれる\n */\n csvParser: (args: {\n file: File;\n }) => Promise<{ data: Record<string, string>[] }>;\n /**\n * アップロードされたCSVのデータをバリデーションする。\n */\n csvValidator?: (args: {\n /**\n * ここで渡されるデータがRowと一致するとは限らない。\n */\n row: Record<string, string>;\n }) => Promise<{ errors?: CellError[] }>;\n /**\n * 更新モードで検索のカスタマイズをする。\n * 省略するとonSearchData, searchLabelを用いた単一の検索フィールドが表示される。これを指定するとonSearchData, searchLabelは無視される。\n * (only upload mode)\n */\n renderSearchField?: (\n props: CSVImportUIRenderSearchFieldProps<Row>,\n ) => JSX.Element;\n /**\n * 編集用CSVをダウンロードするページをスキップする\n */\n skipDownloadTemplate?: boolean;\n /**\n * 更新用のCSVをダウンロードする際にデフォルトで表示されるデータを指定する。\n */\n defaultTemplateData?: Row[];\n}\n\nconst CSVImportUIContent = <\n Columns extends CSVImportUIColumns,\n Row extends Record<string, string> = CSVImportUIRow<Columns>,\n>({\n columns,\n onDownloadCSV,\n searchLabel,\n onSearchData,\n renderSearchField,\n csvPrefix,\n csvParser,\n csvValidator,\n onPreUploadData,\n onPreUploadDataByRow,\n onUploadData,\n onUploadDataByRow,\n acceptMode,\n skipDownloadTemplate,\n defaultTemplateData,\n}: CSVImportUIProps<Columns, Row>) => {\n const id = useScreen();\n const [mode, setMode] = useState<Mode>(acceptMode[0]);\n const [uploadedData, setUploadedData] = useState<Row[]>([]);\n const [errors, setErrors] = useState<(CellError[] | undefined)[]>([]);\n\n const handleUpdateData = useCallback(\n (data: Row[], errors: (CellError[] | undefined)[]) => {\n setErrors(errors);\n setUploadedData(data);\n },\n [],\n );\n\n const headers = useMemo(() => {\n const rowKeys = Object.keys(uploadedData[0] ?? {});\n\n return Object.values(columns)\n .filter((column) => {\n if (rowKeys.length === 0) {\n return true;\n }\n if (column.hiddenIfNoHeader && !rowKeys.includes(column.label)) {\n return false;\n }\n return true;\n })\n .map((column) => column.label);\n }, [columns, uploadedData]);\n\n const filledData = useMemo(() => {\n return headers.length > Object.keys(uploadedData[0] ?? {}).length\n ? uploadedData.map((row) => {\n return {\n ...Object.fromEntries(headers.map((header) => [header, \"\"])),\n ...row,\n };\n })\n : uploadedData;\n }, [headers, uploadedData]);\n\n switch (id) {\n case \"selectMode\": {\n return (\n <SelectModeScreen\n skipDownloadTemplate={skipDownloadTemplate}\n onChangeMode={setMode}\n />\n );\n }\n case \"downloadCreateTemplate\": {\n return (\n <DownloadCreateTemplateScreen\n onDownloadCSV={onDownloadCSV}\n headers={headers}\n csvPrefix={csvPrefix}\n />\n );\n }\n case \"downloadUpdateTemplate\": {\n return (\n <DownloadUpdateTemplateScreen\n searchLabel={searchLabel}\n onSearch={onSearchData}\n renderSearchField={renderSearchField}\n onDownloadCSV={onDownloadCSV}\n csvPrefix={csvPrefix}\n headers={headers}\n defaultTemplateData={defaultTemplateData}\n columns={columns}\n />\n );\n }\n case \"loadCSV\": {\n return (\n <LoadCSVScreen\n mode={mode}\n columns={columns}\n data={filledData}\n headers={headers}\n errors={errors}\n csvParser={csvParser}\n csvValidator={csvValidator}\n onPreUploadData={onPreUploadData}\n onPreUploadDataByRow={onPreUploadDataByRow}\n onUpdateData={handleUpdateData}\n />\n );\n }\n case \"uploadCSV\": {\n return (\n <UploadCSVScreen\n mode={mode}\n data={filledData}\n headers={headers}\n errors={errors}\n columns={columns}\n onUploadData={onUploadData}\n onUploadDataByRow={onUploadDataByRow}\n onSubmitComplete={handleUpdateData}\n />\n );\n }\n case \"complete\": {\n return (\n <CompleteScreen\n csvPrefix={csvPrefix}\n onDownloadCSV={onDownloadCSV}\n data={filledData}\n columns={columns}\n headers={headers}\n errors={errors}\n />\n );\n }\n default: {\n return null;\n }\n }\n};\n\nconst getFirstScreenId = (\n accptMode: Mode[],\n skipDownloadTemplate?: boolean,\n): ScreenId => {\n if (accptMode.length > 1) {\n return \"selectMode\";\n }\n if (skipDownloadTemplate) {\n return \"loadCSV\";\n }\n if (accptMode[0] === \"create\") {\n return \"downloadCreateTemplate\";\n }\n if (accptMode[0] === \"update\") {\n return \"downloadUpdateTemplate\";\n }\n return \"selectMode\";\n};\n\nexport const CSVImportUI = <\n Columns extends CSVImportUIColumns,\n Row extends Record<string, string> = CSVImportUIRow<Columns>,\n>(\n props: CSVImportUIProps<Columns, Row>,\n) => {\n return (\n <ScreenProvider\n firstScreenId={getFirstScreenId(\n props.acceptMode,\n props.skipDownloadTemplate,\n )}\n >\n <CSVImportUIContent {...props} />\n </ScreenProvider>\n );\n};\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"CSVImportUI.js","names":["CompleteScreen","DownloadCreateTemplateScreen","DownloadUpdateTemplateScreen","LoadCSVScreen","ScreenProvider","useScreen","SelectModeScreen","UploadCSVScreen","useCallback","useMemo","useState","jsx","___EmotionJSX","CSVImportUIContent","_ref","columns","onDownloadCSV","searchLabel","onSearchData","renderSearchField","csvPrefix","csvParser","csvValidator","onPreUploadData","onPreUploadDataByRow","onUploadData","onUploadDataByRow","acceptMode","skipDownloadTemplate","defaultTemplateData","id","mode","setMode","uploadedData","setUploadedData","errors","setErrors","handleUpdateData","data","headers","_uploadedData$","rowKeys","Object","keys","values","filter","column","length","hiddenIfNoHeader","includes","label","map","filledData","_uploadedData$2","row","_extends","fromEntries","header","onChangeMode","onSearch","onUpdateData","onSubmitComplete","getFirstScreenId","accptMode","CSVImportUI","props","firstScreenId"],"sources":["../../../src/CSVImportUI/CSVImportUI.tsx"],"sourcesContent":["import { AlertMessageType } from \"../Alert\";\nimport { AssertType } from \"../@types/AssertType\";\nimport { CompleteScreen } from \"./screens/CompleteScreen\";\nimport { DownloadCreateTemplateScreen } from \"./screens/DownloadCreateTemplateScreen\";\nimport { DownloadUpdateTemplateScreen } from \"./screens/DownloadUpdateTemplateScreen\";\nimport { LoadCSVScreen } from \"./screens/LoadCSVScreen\";\nimport { ScreenId } from \"./screens/types\";\nimport { ScreenProvider, useScreen } from \"./ScreenProvider\";\nimport { SelectModeScreen } from \"./screens/SelectModeScreen\";\nimport { UnionToIntersection } from \"../@types/UnionToIntersection\";\nimport { UploadCSVScreen } from \"./screens/UploadCSVScreen\";\nimport { useCallback, useMemo, useState } from \"react\";\n\nexport type Mode = \"create\" | \"update\";\n\nexport type CellError = [string, string];\n\nexport type CSVImportUIColumn = Readonly<{\n label: string;\n type?: \"date\" | \"number\";\n options?: readonly string[];\n required?: boolean;\n hiddenOnCreateTemplate?: boolean;\n /**\n * アップロードされたCSVにヘッダーがなければ表示しない。\n */\n hiddenIfNoHeader?: boolean;\n renderCell?: (props: {\n value: string;\n header: string;\n row: Record<string, string>;\n }) => JSX.Element;\n}>;\n\n/**\n * ライブラリ利用者用の型\n */\nexport type CSVImportUIColumns = Record<string, CSVImportUIColumn>;\n\nexport interface CSVImportUIRenderSearchFieldProps<Row> {\n onChange: (args: Row[]) => void;\n}\n\ntype OptionByLabel<Columns extends CSVImportUIColumns> = {\n [Key in keyof Columns]: Record<\n Columns[Key][\"label\"],\n Columns[Key] extends {\n options: readonly (infer Option)[];\n }\n ? Option extends string\n ? Option\n : never\n : string\n >;\n}[keyof Columns];\n\nexport type CSVImportUIRow<Columns extends CSVImportUIColumns> = AssertType<\n UnionToIntersection<OptionByLabel<Columns>>,\n Record<string, string>\n>;\n\nexport interface CSVImportUIProps<\n Columns extends CSVImportUIColumns,\n Row extends Record<string, string> = CSVImportUIRow<Columns>,\n> {\n /**\n * 利用できるモードを指定する。\n */\n acceptMode: Mode[];\n /**\n * アップロード画面に進む前にトリガーされる。\n * 行ごとにデータを処理する。\n *\n * onPreUploadDataが指定されている場合、こちらは無視される。\n */\n onPreUploadDataByRow?: (args: {\n index: number;\n /**\n * 欠損したフィールドがある可能性があるため、型を緩くする。\n */\n row: Partial<Row>;\n mode: Mode;\n }) => Promise<{ error?: CellError; data?: Record<string, string> }>;\n /**\n * アップロード画面に進む前にトリガーされる。\n * 一括でデータをアップロードする。\n *\n * 現状onPreUploadDataByRowByRowとは異なり、行ごとにエラーを表示することはできない。\n * 代わりに、エラー時に表示されるアラートのメッセージをerrorMessageで指定する。\n *\n * 行毎にエラーを表示したくなった場合は、要望を出すこと。\n */\n onPreUploadData?: (args: { data: Partial<Row>[]; mode: Mode }) => Promise<{\n errorMessage?: AlertMessageType;\n data?: Record<string, string>[];\n }>;\n /**\n * CSVをパースしたデータのアップロードがトリガーされた際に呼ばれる。\n * 行ごとにデータをアップロードする。\n *\n * onUploadDataが指定されている場合、こちらは無視される。\n */\n onUploadDataByRow?: (args: {\n index: number;\n /**\n * 欠損したフィールドがある可能性があるため、型を緩くする。\n */\n row: Partial<Row>;\n mode: Mode;\n }) => Promise<{\n error?: CellError;\n data?: Record<string, string>;\n }>;\n /**\n * CSVをパースしたデータのアップロードがトリガーされた際に呼ばれる。\n * 一括でデータをアップロードする。\n *\n * 現状onUploadDataByRowとは異なり、行ごとにエラーを表示することはできない。\n * 代わりに、エラー時に表示されるアラートのメッセージをerrorMessageで指定する。\n *\n * 行毎にエラーを表示したくなった場合は、要望を出すこと。\n */\n onUploadData?: (args: { data: Partial<Row>[]; mode: Mode }) => Promise<{\n errorMessage?: AlertMessageType;\n data?: Record<string, string>[];\n }>;\n /**\n * 検索フォームのラベルとして利用される。\n * (only upload mode)\n */\n searchLabel?: string;\n /**\n * 検索が行われた際にトリガーされる。\n * ユーザーの入力した文字列に応じてデータを返却する。このデータはCSVとしてダウンロードされる。\n * (only upload mode)\n */\n onSearchData?: (args: { value: string }) => Promise<{\n data: Row[];\n }>;\n /**\n * CSVの各列をどのように表示するか指定する。\n * 各列には、次のプロパティが指定できる。\n *\n * `label` : CSVのヘッダーとして利用される。\n *\n * `type` : `date`または`number`が指定でき、それぞれ日付と数値としてアップロードされたCSVの値が正しいかどうかを検証する。\n *\n * `options` : その列が持てる値のリストを指定する。アップロードされたCSVの値がこのリストに含まれているかどうかを検証する。\n *\n * `required` : その列が必須かどうかを指定する。アップロードされたCSVの値が空でないかどうかを検証する。\n *\n * `renderCell` : その列のセルをどのように表示するかを指定する。その列の値、ヘッダー、行のデータが渡される。\n *\n * `hiddenOnCreateTemplate` : 作成用のCSVのテンプレートに、その列を表示しないかどうかを決定する。\n *\n * `hiddenIfNoHeader` : アップロードされたCSVにそのヘッダーがなければ、その列を表示しないかどうかを決定する。\n */\n columns: Columns;\n /**\n * ダウンロードされるCSVに付与されるプレフィックスを指定する\n */\n csvPrefix?: string;\n /**\n * CSVのダウンロードがトリガーされたときに呼ばれる\n */\n onDownloadCSV: (args: { data: Row[]; filename: string }) => void;\n /**\n * CSVがアップロードされたときに呼ばれる\n */\n csvParser: (args: {\n file: File;\n }) => Promise<{ data: Record<string, string>[] }>;\n /**\n * アップロードされたCSVのデータをバリデーションする。\n */\n csvValidator?: (args: {\n /**\n * ここで渡されるデータがRowと一致するとは限らない。\n */\n row: Record<string, string>;\n }) => Promise<{ errors?: CellError[] }>;\n /**\n * 更新モードで検索のカスタマイズをする。\n * 省略するとonSearchData, searchLabelを用いた単一の検索フィールドが表示される。これを指定するとonSearchData, searchLabelは無視される。\n * (only upload mode)\n */\n renderSearchField?: (\n props: CSVImportUIRenderSearchFieldProps<Row>,\n ) => JSX.Element;\n /**\n * 編集用CSVをダウンロードするページをスキップする\n */\n skipDownloadTemplate?: boolean;\n /**\n * 更新用のCSVをダウンロードする際にデフォルトで表示されるデータを指定する。\n */\n defaultTemplateData?: Row[];\n}\n\nconst CSVImportUIContent = <\n Columns extends CSVImportUIColumns,\n Row extends Record<string, string> = CSVImportUIRow<Columns>,\n>({\n columns,\n onDownloadCSV,\n searchLabel,\n onSearchData,\n renderSearchField,\n csvPrefix,\n csvParser,\n csvValidator,\n onPreUploadData,\n onPreUploadDataByRow,\n onUploadData,\n onUploadDataByRow,\n acceptMode,\n skipDownloadTemplate,\n defaultTemplateData,\n}: CSVImportUIProps<Columns, Row>) => {\n const id = useScreen();\n const [mode, setMode] = useState<Mode>(acceptMode[0]);\n const [uploadedData, setUploadedData] = useState<Row[]>([]);\n const [errors, setErrors] = useState<(CellError[] | undefined)[]>([]);\n\n const handleUpdateData = useCallback(\n (data: Row[], errors: (CellError[] | undefined)[]) => {\n setErrors(errors);\n setUploadedData(data);\n },\n [],\n );\n\n const headers = useMemo(() => {\n const rowKeys = Object.keys(uploadedData[0] ?? {});\n\n return Object.values(columns)\n .filter((column) => {\n if (rowKeys.length === 0) {\n return true;\n }\n if (column.hiddenIfNoHeader && !rowKeys.includes(column.label)) {\n return false;\n }\n return true;\n })\n .map((column) => column.label);\n }, [columns, uploadedData]);\n\n const filledData = useMemo(() => {\n return headers.length > Object.keys(uploadedData[0] ?? {}).length\n ? uploadedData.map((row) => {\n return {\n ...Object.fromEntries(headers.map((header) => [header, \"\"])),\n ...row,\n };\n })\n : uploadedData;\n }, [headers, uploadedData]);\n\n switch (id) {\n case \"selectMode\": {\n return (\n <SelectModeScreen\n skipDownloadTemplate={skipDownloadTemplate}\n onChangeMode={setMode}\n />\n );\n }\n case \"downloadCreateTemplate\": {\n return (\n <DownloadCreateTemplateScreen\n onDownloadCSV={onDownloadCSV}\n headers={headers}\n csvPrefix={csvPrefix}\n />\n );\n }\n case \"downloadUpdateTemplate\": {\n return (\n <DownloadUpdateTemplateScreen\n searchLabel={searchLabel}\n onSearch={onSearchData}\n renderSearchField={renderSearchField}\n onDownloadCSV={onDownloadCSV}\n csvPrefix={csvPrefix}\n headers={headers}\n defaultTemplateData={defaultTemplateData}\n columns={columns}\n />\n );\n }\n case \"loadCSV\": {\n return (\n <LoadCSVScreen\n mode={mode}\n columns={columns}\n data={filledData}\n headers={headers}\n errors={errors}\n csvParser={csvParser}\n csvValidator={csvValidator}\n onPreUploadData={onPreUploadData}\n onPreUploadDataByRow={onPreUploadDataByRow}\n onUpdateData={handleUpdateData}\n />\n );\n }\n case \"uploadCSV\": {\n return (\n <UploadCSVScreen\n mode={mode}\n data={filledData}\n headers={headers}\n errors={errors}\n columns={columns}\n onUploadData={onUploadData}\n onUploadDataByRow={onUploadDataByRow}\n onSubmitComplete={handleUpdateData}\n />\n );\n }\n case \"complete\": {\n return (\n <CompleteScreen\n csvPrefix={csvPrefix}\n onDownloadCSV={onDownloadCSV}\n data={filledData}\n columns={columns}\n headers={headers}\n errors={errors}\n />\n );\n }\n default: {\n return null;\n }\n }\n};\n\nconst getFirstScreenId = (\n accptMode: Mode[],\n skipDownloadTemplate?: boolean,\n): ScreenId => {\n if (accptMode.length > 1) {\n return \"selectMode\";\n }\n if (skipDownloadTemplate) {\n return \"loadCSV\";\n }\n if (accptMode[0] === \"create\") {\n return \"downloadCreateTemplate\";\n }\n if (accptMode[0] === \"update\") {\n return \"downloadUpdateTemplate\";\n }\n return \"selectMode\";\n};\n\nexport const CSVImportUI = <\n Columns extends CSVImportUIColumns,\n Row extends Record<string, string> = CSVImportUIRow<Columns>,\n>(\n props: CSVImportUIProps<Columns, Row>,\n) => {\n return (\n <ScreenProvider\n firstScreenId={getFirstScreenId(\n props.acceptMode,\n props.skipDownloadTemplate,\n )}\n >\n <CSVImportUIContent {...props} />\n </ScreenProvider>\n );\n};\n"],"mappings":"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","ignoreList":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"hasOwnProp.js","names":["hasOwnProp","props","property","Object","hasOwnProperty","call","exports"],"sources":["../../../src/@utils/hasOwnProp.tsx"],"sourcesContent":["export const hasOwnProp = <T extends string>(\n props: unknown,\n property: T,\n): props is {\n [key in T]: unknown;\n} => {\n return (\n typeof props === \"object\" && Object.hasOwnProperty.call(props, property)\n );\n};\n"],"mappings":";;;;AAAO,MAAMA,UAAU,GAAGA,CACxBC,KAAc,EACdC,QAAW,KAGR;EACH,OACE,OAAOD,KAAK,KAAK,QAAQ,IAAIE,MAAM,CAACC,cAAc,CAACC,IAAI,CAACJ,KAAK,EAAEC,QAAQ,CAAC;AAE5E,CAAC;AAACI,OAAA,CAAAN,UAAA,GAAAA,UAAA","ignoreList":[]}
1
+ {"version":3,"file":"hasOwnProp.js","names":["hasOwnProp","props","property","Object","hasOwnProperty","call","exports"],"sources":["../../../src/@utils/hasOwnProp.tsx"],"sourcesContent":["export const hasOwnProp = <T extends string>(\n props: unknown,\n property: T,\n): props is Record<T, unknown> => {\n return (\n typeof props === \"object\" && Object.hasOwnProperty.call(props, property)\n );\n};\n"],"mappings":";;;;AAAO,MAAMA,UAAU,GAAGA,CACxBC,KAAc,EACdC,QAAW,KACqB;EAChC,OACE,OAAOD,KAAK,KAAK,QAAQ,IAAIE,MAAM,CAACC,cAAc,CAACC,IAAI,CAACJ,KAAK,EAAEC,QAAQ,CAAC;AAE5E,CAAC;AAACI,OAAA,CAAAN,UAAA,GAAAA,UAAA","ignoreList":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"CSVImportUI.js","names":["_CompleteScreen","require","_DownloadCreateTemplateScreen","_DownloadUpdateTemplateScreen","_LoadCSVScreen","_ScreenProvider","_SelectModeScreen","_UploadCSVScreen","_react","_react2","CSVImportUIContent","columns","onDownloadCSV","searchLabel","onSearchData","renderSearchField","csvPrefix","csvParser","csvValidator","onPreUploadData","onPreUploadDataByRow","onUploadData","onUploadDataByRow","acceptMode","skipDownloadTemplate","defaultTemplateData","id","useScreen","mode","setMode","useState","uploadedData","setUploadedData","errors","setErrors","handleUpdateData","useCallback","data","headers","useMemo","rowKeys","Object","keys","values","filter","column","length","hiddenIfNoHeader","includes","label","map","filledData","row","fromEntries","header","jsx","SelectModeScreen","onChangeMode","DownloadCreateTemplateScreen","DownloadUpdateTemplateScreen","onSearch","LoadCSVScreen","onUpdateData","UploadCSVScreen","onSubmitComplete","CompleteScreen","getFirstScreenId","accptMode","CSVImportUI","props","ScreenProvider","firstScreenId","exports"],"sources":["../../../src/CSVImportUI/CSVImportUI.tsx"],"sourcesContent":["import { AlertMessageType } from \"../Alert\";\nimport { AssertType } from \"../@types/AssertType\";\nimport { CompleteScreen } from \"./screens/CompleteScreen\";\nimport { DownloadCreateTemplateScreen } from \"./screens/DownloadCreateTemplateScreen\";\nimport { DownloadUpdateTemplateScreen } from \"./screens/DownloadUpdateTemplateScreen\";\nimport { LoadCSVScreen } from \"./screens/LoadCSVScreen\";\nimport { ScreenId } from \"./screens/types\";\nimport { ScreenProvider, useScreen } from \"./ScreenProvider\";\nimport { SelectModeScreen } from \"./screens/SelectModeScreen\";\nimport { UnionToIntersection } from \"../@types/UnionToIntersection\";\nimport { UploadCSVScreen } from \"./screens/UploadCSVScreen\";\nimport { useCallback, useMemo, useState } from \"react\";\n\nexport type Mode = \"create\" | \"update\";\n\nexport type CellError = [string, string];\n\nexport type CSVImportUIColumn = Readonly<{\n label: string;\n type?: \"date\" | \"number\";\n options?: readonly string[];\n required?: boolean;\n hiddenOnCreateTemplate?: boolean;\n /**\n * アップロードされたCSVにヘッダーがなければ表示しない。\n */\n hiddenIfNoHeader?: boolean;\n renderCell?: (props: {\n value: string;\n header: string;\n row: Record<string, string>;\n }) => JSX.Element;\n}>;\n\n/**\n * ライブラリ利用者用の型\n */\nexport type CSVImportUIColumns = Record<string, CSVImportUIColumn>;\n\nexport interface CSVImportUIRenderSearchFieldProps<Row> {\n onChange: (args: Row[]) => void;\n}\n\ntype OptionByLabel<Columns extends CSVImportUIColumns> = {\n [Key in keyof Columns]: {\n [Label in Columns[Key][\"label\"]]: Columns[Key] extends {\n options: readonly (infer Option)[];\n }\n ? Option extends string\n ? Option\n : never\n : string;\n };\n}[keyof Columns];\n\nexport type CSVImportUIRow<Columns extends CSVImportUIColumns> = AssertType<\n UnionToIntersection<OptionByLabel<Columns>>,\n Record<string, string>\n>;\n\nexport interface CSVImportUIProps<\n Columns extends CSVImportUIColumns,\n Row extends Record<string, string> = CSVImportUIRow<Columns>,\n> {\n /**\n * 利用できるモードを指定する。\n */\n acceptMode: Mode[];\n /**\n * アップロード画面に進む前にトリガーされる。\n * 行ごとにデータを処理する。\n *\n * onPreUploadDataが指定されている場合、こちらは無視される。\n */\n onPreUploadDataByRow?: (args: {\n index: number;\n /**\n * 欠損したフィールドがある可能性があるため、型を緩くする。\n */\n row: Partial<Row>;\n mode: Mode;\n }) => Promise<{ error?: CellError; data?: Record<string, string> }>;\n /**\n * アップロード画面に進む前にトリガーされる。\n * 一括でデータをアップロードする。\n *\n * 現状onPreUploadDataByRowByRowとは異なり、行ごとにエラーを表示することはできない。\n * 代わりに、エラー時に表示されるアラートのメッセージをerrorMessageで指定する。\n *\n * 行毎にエラーを表示したくなった場合は、要望を出すこと。\n */\n onPreUploadData?: (args: { data: Partial<Row>[]; mode: Mode }) => Promise<{\n errorMessage?: AlertMessageType;\n data?: Record<string, string>[];\n }>;\n /**\n * CSVをパースしたデータのアップロードがトリガーされた際に呼ばれる。\n * 行ごとにデータをアップロードする。\n *\n * onUploadDataが指定されている場合、こちらは無視される。\n */\n onUploadDataByRow?: (args: {\n index: number;\n /**\n * 欠損したフィールドがある可能性があるため、型を緩くする。\n */\n row: Partial<Row>;\n mode: Mode;\n }) => Promise<{\n error?: CellError;\n data?: Record<string, string>;\n }>;\n /**\n * CSVをパースしたデータのアップロードがトリガーされた際に呼ばれる。\n * 一括でデータをアップロードする。\n *\n * 現状onUploadDataByRowとは異なり、行ごとにエラーを表示することはできない。\n * 代わりに、エラー時に表示されるアラートのメッセージをerrorMessageで指定する。\n *\n * 行毎にエラーを表示したくなった場合は、要望を出すこと。\n */\n onUploadData?: (args: { data: Partial<Row>[]; mode: Mode }) => Promise<{\n errorMessage?: AlertMessageType;\n data?: Record<string, string>[];\n }>;\n /**\n * 検索フォームのラベルとして利用される。\n * (only upload mode)\n */\n searchLabel?: string;\n /**\n * 検索が行われた際にトリガーされる。\n * ユーザーの入力した文字列に応じてデータを返却する。このデータはCSVとしてダウンロードされる。\n * (only upload mode)\n */\n onSearchData?: (args: { value: string }) => Promise<{\n data: Row[];\n }>;\n /**\n * CSVの各列をどのように表示するか指定する。\n * 各列には、次のプロパティが指定できる。\n *\n * `label` : CSVのヘッダーとして利用される。\n *\n * `type` : `date`または`number`が指定でき、それぞれ日付と数値としてアップロードされたCSVの値が正しいかどうかを検証する。\n *\n * `options` : その列が持てる値のリストを指定する。アップロードされたCSVの値がこのリストに含まれているかどうかを検証する。\n *\n * `required` : その列が必須かどうかを指定する。アップロードされたCSVの値が空でないかどうかを検証する。\n *\n * `renderCell` : その列のセルをどのように表示するかを指定する。その列の値、ヘッダー、行のデータが渡される。\n *\n * `hiddenOnCreateTemplate` : 作成用のCSVのテンプレートに、その列を表示しないかどうかを決定する。\n *\n * `hiddenIfNoHeader` : アップロードされたCSVにそのヘッダーがなければ、その列を表示しないかどうかを決定する。\n */\n columns: Columns;\n /**\n * ダウンロードされるCSVに付与されるプレフィックスを指定する\n */\n csvPrefix?: string;\n /**\n * CSVのダウンロードがトリガーされたときに呼ばれる\n */\n onDownloadCSV: (args: { data: Row[]; filename: string }) => void;\n /**\n * CSVがアップロードされたときに呼ばれる\n */\n csvParser: (args: {\n file: File;\n }) => Promise<{ data: Record<string, string>[] }>;\n /**\n * アップロードされたCSVのデータをバリデーションする。\n */\n csvValidator?: (args: {\n /**\n * ここで渡されるデータがRowと一致するとは限らない。\n */\n row: Record<string, string>;\n }) => Promise<{ errors?: CellError[] }>;\n /**\n * 更新モードで検索のカスタマイズをする。\n * 省略するとonSearchData, searchLabelを用いた単一の検索フィールドが表示される。これを指定するとonSearchData, searchLabelは無視される。\n * (only upload mode)\n */\n renderSearchField?: (\n props: CSVImportUIRenderSearchFieldProps<Row>,\n ) => JSX.Element;\n /**\n * 編集用CSVをダウンロードするページをスキップする\n */\n skipDownloadTemplate?: boolean;\n /**\n * 更新用のCSVをダウンロードする際にデフォルトで表示されるデータを指定する。\n */\n defaultTemplateData?: Row[];\n}\n\nconst CSVImportUIContent = <\n Columns extends CSVImportUIColumns,\n Row extends Record<string, string> = CSVImportUIRow<Columns>,\n>({\n columns,\n onDownloadCSV,\n searchLabel,\n onSearchData,\n renderSearchField,\n csvPrefix,\n csvParser,\n csvValidator,\n onPreUploadData,\n onPreUploadDataByRow,\n onUploadData,\n onUploadDataByRow,\n acceptMode,\n skipDownloadTemplate,\n defaultTemplateData,\n}: CSVImportUIProps<Columns, Row>) => {\n const id = useScreen();\n const [mode, setMode] = useState<Mode>(acceptMode[0]);\n const [uploadedData, setUploadedData] = useState<Row[]>([]);\n const [errors, setErrors] = useState<(CellError[] | undefined)[]>([]);\n\n const handleUpdateData = useCallback(\n (data: Row[], errors: (CellError[] | undefined)[]) => {\n setErrors(errors);\n setUploadedData(data);\n },\n [],\n );\n\n const headers = useMemo(() => {\n const rowKeys = Object.keys(uploadedData[0] ?? {});\n\n return Object.values(columns)\n .filter((column) => {\n if (rowKeys.length === 0) {\n return true;\n }\n if (column.hiddenIfNoHeader && !rowKeys.includes(column.label)) {\n return false;\n }\n return true;\n })\n .map((column) => column.label);\n }, [columns, uploadedData]);\n\n const filledData = useMemo(() => {\n return headers.length > Object.keys(uploadedData[0] ?? {}).length\n ? uploadedData.map((row) => {\n return {\n ...Object.fromEntries(headers.map((header) => [header, \"\"])),\n ...row,\n };\n })\n : uploadedData;\n }, [headers, uploadedData]);\n\n switch (id) {\n case \"selectMode\": {\n return (\n <SelectModeScreen\n skipDownloadTemplate={skipDownloadTemplate}\n onChangeMode={setMode}\n />\n );\n }\n case \"downloadCreateTemplate\": {\n return (\n <DownloadCreateTemplateScreen\n onDownloadCSV={onDownloadCSV}\n headers={headers}\n csvPrefix={csvPrefix}\n />\n );\n }\n case \"downloadUpdateTemplate\": {\n return (\n <DownloadUpdateTemplateScreen\n searchLabel={searchLabel}\n onSearch={onSearchData}\n renderSearchField={renderSearchField}\n onDownloadCSV={onDownloadCSV}\n csvPrefix={csvPrefix}\n headers={headers}\n defaultTemplateData={defaultTemplateData}\n columns={columns}\n />\n );\n }\n case \"loadCSV\": {\n return (\n <LoadCSVScreen\n mode={mode}\n columns={columns}\n data={filledData}\n headers={headers}\n errors={errors}\n csvParser={csvParser}\n csvValidator={csvValidator}\n onPreUploadData={onPreUploadData}\n onPreUploadDataByRow={onPreUploadDataByRow}\n onUpdateData={handleUpdateData}\n />\n );\n }\n case \"uploadCSV\": {\n return (\n <UploadCSVScreen\n mode={mode}\n data={filledData}\n headers={headers}\n errors={errors}\n columns={columns}\n onUploadData={onUploadData}\n onUploadDataByRow={onUploadDataByRow}\n onSubmitComplete={handleUpdateData}\n />\n );\n }\n case \"complete\": {\n return (\n <CompleteScreen\n csvPrefix={csvPrefix}\n onDownloadCSV={onDownloadCSV}\n data={filledData}\n columns={columns}\n headers={headers}\n errors={errors}\n />\n );\n }\n default: {\n return null;\n }\n }\n};\n\nconst getFirstScreenId = (\n accptMode: Mode[],\n skipDownloadTemplate?: boolean,\n): ScreenId => {\n if (accptMode.length > 1) {\n return \"selectMode\";\n }\n if (skipDownloadTemplate) {\n return \"loadCSV\";\n }\n if (accptMode[0] === \"create\") {\n return \"downloadCreateTemplate\";\n }\n if (accptMode[0] === \"update\") {\n return \"downloadUpdateTemplate\";\n }\n return \"selectMode\";\n};\n\nexport const CSVImportUI = <\n Columns extends CSVImportUIColumns,\n Row extends Record<string, string> = CSVImportUIRow<Columns>,\n>(\n props: CSVImportUIProps<Columns, Row>,\n) => {\n return (\n <ScreenProvider\n firstScreenId={getFirstScreenId(\n props.acceptMode,\n props.skipDownloadTemplate,\n )}\n >\n <CSVImportUIContent {...props} />\n </ScreenProvider>\n );\n};\n"],"mappings":";;;;AAEA,IAAAA,eAAA,GAAAC,OAAA;AACA,IAAAC,6BAAA,GAAAD,OAAA;AACA,IAAAE,6BAAA,GAAAF,OAAA;AACA,IAAAG,cAAA,GAAAH,OAAA;AAEA,IAAAI,eAAA,GAAAJ,OAAA;AACA,IAAAK,iBAAA,GAAAL,OAAA;AAEA,IAAAM,gBAAA,GAAAN,OAAA;AACA,IAAAO,MAAA,GAAAP,OAAA;AAAuD,IAAAQ,OAAA,GAAAR,OAAA;AAuBvD;AACA;AACA;;AAkKA,MAAMS,kBAAkB,GAAGA,CAGzB;EACAC,OAAO;EACPC,aAAa;EACbC,WAAW;EACXC,YAAY;EACZC,iBAAiB;EACjBC,SAAS;EACTC,SAAS;EACTC,YAAY;EACZC,eAAe;EACfC,oBAAoB;EACpBC,YAAY;EACZC,iBAAiB;EACjBC,UAAU;EACVC,oBAAoB;EACpBC;AAC8B,CAAC,KAAK;EACpC,MAAMC,EAAE,GAAG,IAAAC,yBAAS,EAAC,CAAC;EACtB,MAAM,CAACC,IAAI,EAAEC,OAAO,CAAC,GAAG,IAAAC,eAAQ,EAAOP,UAAU,CAAC,CAAC,CAAC,CAAC;EACrD,MAAM,CAACQ,YAAY,EAAEC,eAAe,CAAC,GAAG,IAAAF,eAAQ,EAAQ,EAAE,CAAC;EAC3D,MAAM,CAACG,MAAM,EAAEC,SAAS,CAAC,GAAG,IAAAJ,eAAQ,EAA8B,EAAE,CAAC;EAErE,MAAMK,gBAAgB,GAAG,IAAAC,kBAAW,EAClC,CAACC,IAAW,EAAEJ,MAAmC,KAAK;IACpDC,SAAS,CAACD,MAAM,CAAC;IACjBD,eAAe,CAACK,IAAI,CAAC;EACvB,CAAC,EACD,EACF,CAAC;EAED,MAAMC,OAAO,GAAG,IAAAC,cAAO,EAAC,MAAM;IAC5B,MAAMC,OAAO,GAAGC,MAAM,CAACC,IAAI,CAACX,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;IAElD,OAAOU,MAAM,CAACE,MAAM,CAAChC,OAAO,CAAC,CAC1BiC,MAAM,CAAEC,MAAM,IAAK;MAClB,IAAIL,OAAO,CAACM,MAAM,KAAK,CAAC,EAAE;QACxB,OAAO,IAAI;MACb;MACA,IAAID,MAAM,CAACE,gBAAgB,IAAI,CAACP,OAAO,CAACQ,QAAQ,CAACH,MAAM,CAACI,KAAK,CAAC,EAAE;QAC9D,OAAO,KAAK;MACd;MACA,OAAO,IAAI;IACb,CAAC,CAAC,CACDC,GAAG,CAAEL,MAAM,IAAKA,MAAM,CAACI,KAAK,CAAC;EAClC,CAAC,EAAE,CAACtC,OAAO,EAAEoB,YAAY,CAAC,CAAC;EAE3B,MAAMoB,UAAU,GAAG,IAAAZ,cAAO,EAAC,MAAM;IAC/B,OAAOD,OAAO,CAACQ,MAAM,GAAGL,MAAM,CAACC,IAAI,CAACX,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAACe,MAAM,GAC7Df,YAAY,CAACmB,GAAG,CAAEE,GAAG,IAAK;MACxB,OAAO;QACL,GAAGX,MAAM,CAACY,WAAW,CAACf,OAAO,CAACY,GAAG,CAAEI,MAAM,IAAK,CAACA,MAAM,EAAE,EAAE,CAAC,CAAC,CAAC;QAC5D,GAAGF;MACL,CAAC;IACH,CAAC,CAAC,GACFrB,YAAY;EAClB,CAAC,EAAE,CAACO,OAAO,EAAEP,YAAY,CAAC,CAAC;EAE3B,QAAQL,EAAE;IACR,KAAK,YAAY;MAAE;QACjB,OACE,IAAAjB,OAAA,CAAA8C,GAAA,EAACjD,iBAAA,CAAAkD,gBAAgB;UACfhC,oBAAoB,EAAEA,oBAAqB;UAC3CiC,YAAY,EAAE5B;QAAQ,CACvB,CAAC;MAEN;IACA,KAAK,wBAAwB;MAAE;QAC7B,OACE,IAAApB,OAAA,CAAA8C,GAAA,EAACrD,6BAAA,CAAAwD,4BAA4B;UAC3B9C,aAAa,EAAEA,aAAc;UAC7B0B,OAAO,EAAEA,OAAQ;UACjBtB,SAAS,EAAEA;QAAU,CACtB,CAAC;MAEN;IACA,KAAK,wBAAwB;MAAE;QAC7B,OACE,IAAAP,OAAA,CAAA8C,GAAA,EAACpD,6BAAA,CAAAwD,4BAA4B;UAC3B9C,WAAW,EAAEA,WAAY;UACzB+C,QAAQ,EAAE9C,YAAa;UACvBC,iBAAiB,EAAEA,iBAAkB;UACrCH,aAAa,EAAEA,aAAc;UAC7BI,SAAS,EAAEA,SAAU;UACrBsB,OAAO,EAAEA,OAAQ;UACjBb,mBAAmB,EAAEA,mBAAoB;UACzCd,OAAO,EAAEA;QAAQ,CAClB,CAAC;MAEN;IACA,KAAK,SAAS;MAAE;QACd,OACE,IAAAF,OAAA,CAAA8C,GAAA,EAACnD,cAAA,CAAAyD,aAAa;UACZjC,IAAI,EAAEA,IAAK;UACXjB,OAAO,EAAEA,OAAQ;UACjB0B,IAAI,EAAEc,UAAW;UACjBb,OAAO,EAAEA,OAAQ;UACjBL,MAAM,EAAEA,MAAO;UACfhB,SAAS,EAAEA,SAAU;UACrBC,YAAY,EAAEA,YAAa;UAC3BC,eAAe,EAAEA,eAAgB;UACjCC,oBAAoB,EAAEA,oBAAqB;UAC3C0C,YAAY,EAAE3B;QAAiB,CAChC,CAAC;MAEN;IACA,KAAK,WAAW;MAAE;QAChB,OACE,IAAA1B,OAAA,CAAA8C,GAAA,EAAChD,gBAAA,CAAAwD,eAAe;UACdnC,IAAI,EAAEA,IAAK;UACXS,IAAI,EAAEc,UAAW;UACjBb,OAAO,EAAEA,OAAQ;UACjBL,MAAM,EAAEA,MAAO;UACftB,OAAO,EAAEA,OAAQ;UACjBU,YAAY,EAAEA,YAAa;UAC3BC,iBAAiB,EAAEA,iBAAkB;UACrC0C,gBAAgB,EAAE7B;QAAiB,CACpC,CAAC;MAEN;IACA,KAAK,UAAU;MAAE;QACf,OACE,IAAA1B,OAAA,CAAA8C,GAAA,EAACvD,eAAA,CAAAiE,cAAc;UACbjD,SAAS,EAAEA,SAAU;UACrBJ,aAAa,EAAEA,aAAc;UAC7ByB,IAAI,EAAEc,UAAW;UACjBxC,OAAO,EAAEA,OAAQ;UACjB2B,OAAO,EAAEA,OAAQ;UACjBL,MAAM,EAAEA;QAAO,CAChB,CAAC;MAEN;IACA;MAAS;QACP,OAAO,IAAI;MACb;EACF;AACF,CAAC;AAED,MAAMiC,gBAAgB,GAAGA,CACvBC,SAAiB,EACjB3C,oBAA8B,KACjB;EACb,IAAI2C,SAAS,CAACrB,MAAM,GAAG,CAAC,EAAE;IACxB,OAAO,YAAY;EACrB;EACA,IAAItB,oBAAoB,EAAE;IACxB,OAAO,SAAS;EAClB;EACA,IAAI2C,SAAS,CAAC,CAAC,CAAC,KAAK,QAAQ,EAAE;IAC7B,OAAO,wBAAwB;EACjC;EACA,IAAIA,SAAS,CAAC,CAAC,CAAC,KAAK,QAAQ,EAAE;IAC7B,OAAO,wBAAwB;EACjC;EACA,OAAO,YAAY;AACrB,CAAC;AAEM,MAAMC,WAAW,GAItBC,KAAqC,IAClC;EACH,OACE,IAAA5D,OAAA,CAAA8C,GAAA,EAAClD,eAAA,CAAAiE,cAAc;IACbC,aAAa,EAAEL,gBAAgB,CAC7BG,KAAK,CAAC9C,UAAU,EAChB8C,KAAK,CAAC7C,oBACR;EAAE,GAEF,IAAAf,OAAA,CAAA8C,GAAA,EAAC7C,kBAAkB,EAAK2D,KAAQ,CAClB,CAAC;AAErB,CAAC;AAACG,OAAA,CAAAJ,WAAA,GAAAA,WAAA","ignoreList":[]}
1
+ {"version":3,"file":"CSVImportUI.js","names":["_CompleteScreen","require","_DownloadCreateTemplateScreen","_DownloadUpdateTemplateScreen","_LoadCSVScreen","_ScreenProvider","_SelectModeScreen","_UploadCSVScreen","_react","_react2","CSVImportUIContent","columns","onDownloadCSV","searchLabel","onSearchData","renderSearchField","csvPrefix","csvParser","csvValidator","onPreUploadData","onPreUploadDataByRow","onUploadData","onUploadDataByRow","acceptMode","skipDownloadTemplate","defaultTemplateData","id","useScreen","mode","setMode","useState","uploadedData","setUploadedData","errors","setErrors","handleUpdateData","useCallback","data","headers","useMemo","rowKeys","Object","keys","values","filter","column","length","hiddenIfNoHeader","includes","label","map","filledData","row","fromEntries","header","jsx","SelectModeScreen","onChangeMode","DownloadCreateTemplateScreen","DownloadUpdateTemplateScreen","onSearch","LoadCSVScreen","onUpdateData","UploadCSVScreen","onSubmitComplete","CompleteScreen","getFirstScreenId","accptMode","CSVImportUI","props","ScreenProvider","firstScreenId","exports"],"sources":["../../../src/CSVImportUI/CSVImportUI.tsx"],"sourcesContent":["import { AlertMessageType } from \"../Alert\";\nimport { AssertType } from \"../@types/AssertType\";\nimport { CompleteScreen } from \"./screens/CompleteScreen\";\nimport { DownloadCreateTemplateScreen } from \"./screens/DownloadCreateTemplateScreen\";\nimport { DownloadUpdateTemplateScreen } from \"./screens/DownloadUpdateTemplateScreen\";\nimport { LoadCSVScreen } from \"./screens/LoadCSVScreen\";\nimport { ScreenId } from \"./screens/types\";\nimport { ScreenProvider, useScreen } from \"./ScreenProvider\";\nimport { SelectModeScreen } from \"./screens/SelectModeScreen\";\nimport { UnionToIntersection } from \"../@types/UnionToIntersection\";\nimport { UploadCSVScreen } from \"./screens/UploadCSVScreen\";\nimport { useCallback, useMemo, useState } from \"react\";\n\nexport type Mode = \"create\" | \"update\";\n\nexport type CellError = [string, string];\n\nexport type CSVImportUIColumn = Readonly<{\n label: string;\n type?: \"date\" | \"number\";\n options?: readonly string[];\n required?: boolean;\n hiddenOnCreateTemplate?: boolean;\n /**\n * アップロードされたCSVにヘッダーがなければ表示しない。\n */\n hiddenIfNoHeader?: boolean;\n renderCell?: (props: {\n value: string;\n header: string;\n row: Record<string, string>;\n }) => JSX.Element;\n}>;\n\n/**\n * ライブラリ利用者用の型\n */\nexport type CSVImportUIColumns = Record<string, CSVImportUIColumn>;\n\nexport interface CSVImportUIRenderSearchFieldProps<Row> {\n onChange: (args: Row[]) => void;\n}\n\ntype OptionByLabel<Columns extends CSVImportUIColumns> = {\n [Key in keyof Columns]: Record<\n Columns[Key][\"label\"],\n Columns[Key] extends {\n options: readonly (infer Option)[];\n }\n ? Option extends string\n ? Option\n : never\n : string\n >;\n}[keyof Columns];\n\nexport type CSVImportUIRow<Columns extends CSVImportUIColumns> = AssertType<\n UnionToIntersection<OptionByLabel<Columns>>,\n Record<string, string>\n>;\n\nexport interface CSVImportUIProps<\n Columns extends CSVImportUIColumns,\n Row extends Record<string, string> = CSVImportUIRow<Columns>,\n> {\n /**\n * 利用できるモードを指定する。\n */\n acceptMode: Mode[];\n /**\n * アップロード画面に進む前にトリガーされる。\n * 行ごとにデータを処理する。\n *\n * onPreUploadDataが指定されている場合、こちらは無視される。\n */\n onPreUploadDataByRow?: (args: {\n index: number;\n /**\n * 欠損したフィールドがある可能性があるため、型を緩くする。\n */\n row: Partial<Row>;\n mode: Mode;\n }) => Promise<{ error?: CellError; data?: Record<string, string> }>;\n /**\n * アップロード画面に進む前にトリガーされる。\n * 一括でデータをアップロードする。\n *\n * 現状onPreUploadDataByRowByRowとは異なり、行ごとにエラーを表示することはできない。\n * 代わりに、エラー時に表示されるアラートのメッセージをerrorMessageで指定する。\n *\n * 行毎にエラーを表示したくなった場合は、要望を出すこと。\n */\n onPreUploadData?: (args: { data: Partial<Row>[]; mode: Mode }) => Promise<{\n errorMessage?: AlertMessageType;\n data?: Record<string, string>[];\n }>;\n /**\n * CSVをパースしたデータのアップロードがトリガーされた際に呼ばれる。\n * 行ごとにデータをアップロードする。\n *\n * onUploadDataが指定されている場合、こちらは無視される。\n */\n onUploadDataByRow?: (args: {\n index: number;\n /**\n * 欠損したフィールドがある可能性があるため、型を緩くする。\n */\n row: Partial<Row>;\n mode: Mode;\n }) => Promise<{\n error?: CellError;\n data?: Record<string, string>;\n }>;\n /**\n * CSVをパースしたデータのアップロードがトリガーされた際に呼ばれる。\n * 一括でデータをアップロードする。\n *\n * 現状onUploadDataByRowとは異なり、行ごとにエラーを表示することはできない。\n * 代わりに、エラー時に表示されるアラートのメッセージをerrorMessageで指定する。\n *\n * 行毎にエラーを表示したくなった場合は、要望を出すこと。\n */\n onUploadData?: (args: { data: Partial<Row>[]; mode: Mode }) => Promise<{\n errorMessage?: AlertMessageType;\n data?: Record<string, string>[];\n }>;\n /**\n * 検索フォームのラベルとして利用される。\n * (only upload mode)\n */\n searchLabel?: string;\n /**\n * 検索が行われた際にトリガーされる。\n * ユーザーの入力した文字列に応じてデータを返却する。このデータはCSVとしてダウンロードされる。\n * (only upload mode)\n */\n onSearchData?: (args: { value: string }) => Promise<{\n data: Row[];\n }>;\n /**\n * CSVの各列をどのように表示するか指定する。\n * 各列には、次のプロパティが指定できる。\n *\n * `label` : CSVのヘッダーとして利用される。\n *\n * `type` : `date`または`number`が指定でき、それぞれ日付と数値としてアップロードされたCSVの値が正しいかどうかを検証する。\n *\n * `options` : その列が持てる値のリストを指定する。アップロードされたCSVの値がこのリストに含まれているかどうかを検証する。\n *\n * `required` : その列が必須かどうかを指定する。アップロードされたCSVの値が空でないかどうかを検証する。\n *\n * `renderCell` : その列のセルをどのように表示するかを指定する。その列の値、ヘッダー、行のデータが渡される。\n *\n * `hiddenOnCreateTemplate` : 作成用のCSVのテンプレートに、その列を表示しないかどうかを決定する。\n *\n * `hiddenIfNoHeader` : アップロードされたCSVにそのヘッダーがなければ、その列を表示しないかどうかを決定する。\n */\n columns: Columns;\n /**\n * ダウンロードされるCSVに付与されるプレフィックスを指定する\n */\n csvPrefix?: string;\n /**\n * CSVのダウンロードがトリガーされたときに呼ばれる\n */\n onDownloadCSV: (args: { data: Row[]; filename: string }) => void;\n /**\n * CSVがアップロードされたときに呼ばれる\n */\n csvParser: (args: {\n file: File;\n }) => Promise<{ data: Record<string, string>[] }>;\n /**\n * アップロードされたCSVのデータをバリデーションする。\n */\n csvValidator?: (args: {\n /**\n * ここで渡されるデータがRowと一致するとは限らない。\n */\n row: Record<string, string>;\n }) => Promise<{ errors?: CellError[] }>;\n /**\n * 更新モードで検索のカスタマイズをする。\n * 省略するとonSearchData, searchLabelを用いた単一の検索フィールドが表示される。これを指定するとonSearchData, searchLabelは無視される。\n * (only upload mode)\n */\n renderSearchField?: (\n props: CSVImportUIRenderSearchFieldProps<Row>,\n ) => JSX.Element;\n /**\n * 編集用CSVをダウンロードするページをスキップする\n */\n skipDownloadTemplate?: boolean;\n /**\n * 更新用のCSVをダウンロードする際にデフォルトで表示されるデータを指定する。\n */\n defaultTemplateData?: Row[];\n}\n\nconst CSVImportUIContent = <\n Columns extends CSVImportUIColumns,\n Row extends Record<string, string> = CSVImportUIRow<Columns>,\n>({\n columns,\n onDownloadCSV,\n searchLabel,\n onSearchData,\n renderSearchField,\n csvPrefix,\n csvParser,\n csvValidator,\n onPreUploadData,\n onPreUploadDataByRow,\n onUploadData,\n onUploadDataByRow,\n acceptMode,\n skipDownloadTemplate,\n defaultTemplateData,\n}: CSVImportUIProps<Columns, Row>) => {\n const id = useScreen();\n const [mode, setMode] = useState<Mode>(acceptMode[0]);\n const [uploadedData, setUploadedData] = useState<Row[]>([]);\n const [errors, setErrors] = useState<(CellError[] | undefined)[]>([]);\n\n const handleUpdateData = useCallback(\n (data: Row[], errors: (CellError[] | undefined)[]) => {\n setErrors(errors);\n setUploadedData(data);\n },\n [],\n );\n\n const headers = useMemo(() => {\n const rowKeys = Object.keys(uploadedData[0] ?? {});\n\n return Object.values(columns)\n .filter((column) => {\n if (rowKeys.length === 0) {\n return true;\n }\n if (column.hiddenIfNoHeader && !rowKeys.includes(column.label)) {\n return false;\n }\n return true;\n })\n .map((column) => column.label);\n }, [columns, uploadedData]);\n\n const filledData = useMemo(() => {\n return headers.length > Object.keys(uploadedData[0] ?? {}).length\n ? uploadedData.map((row) => {\n return {\n ...Object.fromEntries(headers.map((header) => [header, \"\"])),\n ...row,\n };\n })\n : uploadedData;\n }, [headers, uploadedData]);\n\n switch (id) {\n case \"selectMode\": {\n return (\n <SelectModeScreen\n skipDownloadTemplate={skipDownloadTemplate}\n onChangeMode={setMode}\n />\n );\n }\n case \"downloadCreateTemplate\": {\n return (\n <DownloadCreateTemplateScreen\n onDownloadCSV={onDownloadCSV}\n headers={headers}\n csvPrefix={csvPrefix}\n />\n );\n }\n case \"downloadUpdateTemplate\": {\n return (\n <DownloadUpdateTemplateScreen\n searchLabel={searchLabel}\n onSearch={onSearchData}\n renderSearchField={renderSearchField}\n onDownloadCSV={onDownloadCSV}\n csvPrefix={csvPrefix}\n headers={headers}\n defaultTemplateData={defaultTemplateData}\n columns={columns}\n />\n );\n }\n case \"loadCSV\": {\n return (\n <LoadCSVScreen\n mode={mode}\n columns={columns}\n data={filledData}\n headers={headers}\n errors={errors}\n csvParser={csvParser}\n csvValidator={csvValidator}\n onPreUploadData={onPreUploadData}\n onPreUploadDataByRow={onPreUploadDataByRow}\n onUpdateData={handleUpdateData}\n />\n );\n }\n case \"uploadCSV\": {\n return (\n <UploadCSVScreen\n mode={mode}\n data={filledData}\n headers={headers}\n errors={errors}\n columns={columns}\n onUploadData={onUploadData}\n onUploadDataByRow={onUploadDataByRow}\n onSubmitComplete={handleUpdateData}\n />\n );\n }\n case \"complete\": {\n return (\n <CompleteScreen\n csvPrefix={csvPrefix}\n onDownloadCSV={onDownloadCSV}\n data={filledData}\n columns={columns}\n headers={headers}\n errors={errors}\n />\n );\n }\n default: {\n return null;\n }\n }\n};\n\nconst getFirstScreenId = (\n accptMode: Mode[],\n skipDownloadTemplate?: boolean,\n): ScreenId => {\n if (accptMode.length > 1) {\n return \"selectMode\";\n }\n if (skipDownloadTemplate) {\n return \"loadCSV\";\n }\n if (accptMode[0] === \"create\") {\n return \"downloadCreateTemplate\";\n }\n if (accptMode[0] === \"update\") {\n return \"downloadUpdateTemplate\";\n }\n return \"selectMode\";\n};\n\nexport const CSVImportUI = <\n Columns extends CSVImportUIColumns,\n Row extends Record<string, string> = CSVImportUIRow<Columns>,\n>(\n props: CSVImportUIProps<Columns, Row>,\n) => {\n return (\n <ScreenProvider\n firstScreenId={getFirstScreenId(\n props.acceptMode,\n props.skipDownloadTemplate,\n )}\n >\n <CSVImportUIContent {...props} />\n </ScreenProvider>\n );\n};\n"],"mappings":"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","ignoreList":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"hasOwnProp.js","names":["hasOwnProp","props","property","Object","hasOwnProperty","call"],"sources":["../../../src/@utils/hasOwnProp.tsx"],"sourcesContent":["export const hasOwnProp = <T extends string>(\n props: unknown,\n property: T,\n): props is {\n [key in T]: unknown;\n} => {\n return (\n typeof props === \"object\" && Object.hasOwnProperty.call(props, property)\n );\n};\n"],"mappings":"AAAA,OAAO,IAAMA,UAAU,GAAGA,CACxBC,KAAc,EACdC,QAAW,KAGR;EACH,OACE,OAAOD,KAAK,KAAK,QAAQ,IAAIE,MAAM,CAACC,cAAc,CAACC,IAAI,CAACJ,KAAK,EAAEC,QAAQ,CAAC;AAE5E,CAAC","ignoreList":[]}
1
+ {"version":3,"file":"hasOwnProp.js","names":["hasOwnProp","props","property","Object","hasOwnProperty","call"],"sources":["../../../src/@utils/hasOwnProp.tsx"],"sourcesContent":["export const hasOwnProp = <T extends string>(\n props: unknown,\n property: T,\n): props is Record<T, unknown> => {\n return (\n typeof props === \"object\" && Object.hasOwnProperty.call(props, property)\n );\n};\n"],"mappings":"AAAA,OAAO,IAAMA,UAAU,GAAGA,CACxBC,KAAc,EACdC,QAAW,KACqB;EAChC,OACE,OAAOD,KAAK,KAAK,QAAQ,IAAIE,MAAM,CAACC,cAAc,CAACC,IAAI,CAACJ,KAAK,EAAEC,QAAQ,CAAC;AAE5E,CAAC","ignoreList":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"CSVImportUI.js","names":["CompleteScreen","DownloadCreateTemplateScreen","DownloadUpdateTemplateScreen","LoadCSVScreen","ScreenProvider","useScreen","SelectModeScreen","UploadCSVScreen","useCallback","useMemo","useState","jsx","___EmotionJSX","CSVImportUIContent","_ref","columns","onDownloadCSV","searchLabel","onSearchData","renderSearchField","csvPrefix","csvParser","csvValidator","onPreUploadData","onPreUploadDataByRow","onUploadData","onUploadDataByRow","acceptMode","skipDownloadTemplate","defaultTemplateData","id","mode","setMode","uploadedData","setUploadedData","errors","setErrors","handleUpdateData","data","headers","_uploadedData$","rowKeys","Object","keys","values","filter","column","length","hiddenIfNoHeader","includes","label","map","filledData","_uploadedData$2","row","_extends","fromEntries","header","onChangeMode","onSearch","onUpdateData","onSubmitComplete","getFirstScreenId","accptMode","CSVImportUI","props","firstScreenId"],"sources":["../../../src/CSVImportUI/CSVImportUI.tsx"],"sourcesContent":["import { AlertMessageType } from \"../Alert\";\nimport { AssertType } from \"../@types/AssertType\";\nimport { CompleteScreen } from \"./screens/CompleteScreen\";\nimport { DownloadCreateTemplateScreen } from \"./screens/DownloadCreateTemplateScreen\";\nimport { DownloadUpdateTemplateScreen } from \"./screens/DownloadUpdateTemplateScreen\";\nimport { LoadCSVScreen } from \"./screens/LoadCSVScreen\";\nimport { ScreenId } from \"./screens/types\";\nimport { ScreenProvider, useScreen } from \"./ScreenProvider\";\nimport { SelectModeScreen } from \"./screens/SelectModeScreen\";\nimport { UnionToIntersection } from \"../@types/UnionToIntersection\";\nimport { UploadCSVScreen } from \"./screens/UploadCSVScreen\";\nimport { useCallback, useMemo, useState } from \"react\";\n\nexport type Mode = \"create\" | \"update\";\n\nexport type CellError = [string, string];\n\nexport type CSVImportUIColumn = Readonly<{\n label: string;\n type?: \"date\" | \"number\";\n options?: readonly string[];\n required?: boolean;\n hiddenOnCreateTemplate?: boolean;\n /**\n * アップロードされたCSVにヘッダーがなければ表示しない。\n */\n hiddenIfNoHeader?: boolean;\n renderCell?: (props: {\n value: string;\n header: string;\n row: Record<string, string>;\n }) => JSX.Element;\n}>;\n\n/**\n * ライブラリ利用者用の型\n */\nexport type CSVImportUIColumns = Record<string, CSVImportUIColumn>;\n\nexport interface CSVImportUIRenderSearchFieldProps<Row> {\n onChange: (args: Row[]) => void;\n}\n\ntype OptionByLabel<Columns extends CSVImportUIColumns> = {\n [Key in keyof Columns]: {\n [Label in Columns[Key][\"label\"]]: Columns[Key] extends {\n options: readonly (infer Option)[];\n }\n ? Option extends string\n ? Option\n : never\n : string;\n };\n}[keyof Columns];\n\nexport type CSVImportUIRow<Columns extends CSVImportUIColumns> = AssertType<\n UnionToIntersection<OptionByLabel<Columns>>,\n Record<string, string>\n>;\n\nexport interface CSVImportUIProps<\n Columns extends CSVImportUIColumns,\n Row extends Record<string, string> = CSVImportUIRow<Columns>,\n> {\n /**\n * 利用できるモードを指定する。\n */\n acceptMode: Mode[];\n /**\n * アップロード画面に進む前にトリガーされる。\n * 行ごとにデータを処理する。\n *\n * onPreUploadDataが指定されている場合、こちらは無視される。\n */\n onPreUploadDataByRow?: (args: {\n index: number;\n /**\n * 欠損したフィールドがある可能性があるため、型を緩くする。\n */\n row: Partial<Row>;\n mode: Mode;\n }) => Promise<{ error?: CellError; data?: Record<string, string> }>;\n /**\n * アップロード画面に進む前にトリガーされる。\n * 一括でデータをアップロードする。\n *\n * 現状onPreUploadDataByRowByRowとは異なり、行ごとにエラーを表示することはできない。\n * 代わりに、エラー時に表示されるアラートのメッセージをerrorMessageで指定する。\n *\n * 行毎にエラーを表示したくなった場合は、要望を出すこと。\n */\n onPreUploadData?: (args: { data: Partial<Row>[]; mode: Mode }) => Promise<{\n errorMessage?: AlertMessageType;\n data?: Record<string, string>[];\n }>;\n /**\n * CSVをパースしたデータのアップロードがトリガーされた際に呼ばれる。\n * 行ごとにデータをアップロードする。\n *\n * onUploadDataが指定されている場合、こちらは無視される。\n */\n onUploadDataByRow?: (args: {\n index: number;\n /**\n * 欠損したフィールドがある可能性があるため、型を緩くする。\n */\n row: Partial<Row>;\n mode: Mode;\n }) => Promise<{\n error?: CellError;\n data?: Record<string, string>;\n }>;\n /**\n * CSVをパースしたデータのアップロードがトリガーされた際に呼ばれる。\n * 一括でデータをアップロードする。\n *\n * 現状onUploadDataByRowとは異なり、行ごとにエラーを表示することはできない。\n * 代わりに、エラー時に表示されるアラートのメッセージをerrorMessageで指定する。\n *\n * 行毎にエラーを表示したくなった場合は、要望を出すこと。\n */\n onUploadData?: (args: { data: Partial<Row>[]; mode: Mode }) => Promise<{\n errorMessage?: AlertMessageType;\n data?: Record<string, string>[];\n }>;\n /**\n * 検索フォームのラベルとして利用される。\n * (only upload mode)\n */\n searchLabel?: string;\n /**\n * 検索が行われた際にトリガーされる。\n * ユーザーの入力した文字列に応じてデータを返却する。このデータはCSVとしてダウンロードされる。\n * (only upload mode)\n */\n onSearchData?: (args: { value: string }) => Promise<{\n data: Row[];\n }>;\n /**\n * CSVの各列をどのように表示するか指定する。\n * 各列には、次のプロパティが指定できる。\n *\n * `label` : CSVのヘッダーとして利用される。\n *\n * `type` : `date`または`number`が指定でき、それぞれ日付と数値としてアップロードされたCSVの値が正しいかどうかを検証する。\n *\n * `options` : その列が持てる値のリストを指定する。アップロードされたCSVの値がこのリストに含まれているかどうかを検証する。\n *\n * `required` : その列が必須かどうかを指定する。アップロードされたCSVの値が空でないかどうかを検証する。\n *\n * `renderCell` : その列のセルをどのように表示するかを指定する。その列の値、ヘッダー、行のデータが渡される。\n *\n * `hiddenOnCreateTemplate` : 作成用のCSVのテンプレートに、その列を表示しないかどうかを決定する。\n *\n * `hiddenIfNoHeader` : アップロードされたCSVにそのヘッダーがなければ、その列を表示しないかどうかを決定する。\n */\n columns: Columns;\n /**\n * ダウンロードされるCSVに付与されるプレフィックスを指定する\n */\n csvPrefix?: string;\n /**\n * CSVのダウンロードがトリガーされたときに呼ばれる\n */\n onDownloadCSV: (args: { data: Row[]; filename: string }) => void;\n /**\n * CSVがアップロードされたときに呼ばれる\n */\n csvParser: (args: {\n file: File;\n }) => Promise<{ data: Record<string, string>[] }>;\n /**\n * アップロードされたCSVのデータをバリデーションする。\n */\n csvValidator?: (args: {\n /**\n * ここで渡されるデータがRowと一致するとは限らない。\n */\n row: Record<string, string>;\n }) => Promise<{ errors?: CellError[] }>;\n /**\n * 更新モードで検索のカスタマイズをする。\n * 省略するとonSearchData, searchLabelを用いた単一の検索フィールドが表示される。これを指定するとonSearchData, searchLabelは無視される。\n * (only upload mode)\n */\n renderSearchField?: (\n props: CSVImportUIRenderSearchFieldProps<Row>,\n ) => JSX.Element;\n /**\n * 編集用CSVをダウンロードするページをスキップする\n */\n skipDownloadTemplate?: boolean;\n /**\n * 更新用のCSVをダウンロードする際にデフォルトで表示されるデータを指定する。\n */\n defaultTemplateData?: Row[];\n}\n\nconst CSVImportUIContent = <\n Columns extends CSVImportUIColumns,\n Row extends Record<string, string> = CSVImportUIRow<Columns>,\n>({\n columns,\n onDownloadCSV,\n searchLabel,\n onSearchData,\n renderSearchField,\n csvPrefix,\n csvParser,\n csvValidator,\n onPreUploadData,\n onPreUploadDataByRow,\n onUploadData,\n onUploadDataByRow,\n acceptMode,\n skipDownloadTemplate,\n defaultTemplateData,\n}: CSVImportUIProps<Columns, Row>) => {\n const id = useScreen();\n const [mode, setMode] = useState<Mode>(acceptMode[0]);\n const [uploadedData, setUploadedData] = useState<Row[]>([]);\n const [errors, setErrors] = useState<(CellError[] | undefined)[]>([]);\n\n const handleUpdateData = useCallback(\n (data: Row[], errors: (CellError[] | undefined)[]) => {\n setErrors(errors);\n setUploadedData(data);\n },\n [],\n );\n\n const headers = useMemo(() => {\n const rowKeys = Object.keys(uploadedData[0] ?? {});\n\n return Object.values(columns)\n .filter((column) => {\n if (rowKeys.length === 0) {\n return true;\n }\n if (column.hiddenIfNoHeader && !rowKeys.includes(column.label)) {\n return false;\n }\n return true;\n })\n .map((column) => column.label);\n }, [columns, uploadedData]);\n\n const filledData = useMemo(() => {\n return headers.length > Object.keys(uploadedData[0] ?? {}).length\n ? uploadedData.map((row) => {\n return {\n ...Object.fromEntries(headers.map((header) => [header, \"\"])),\n ...row,\n };\n })\n : uploadedData;\n }, [headers, uploadedData]);\n\n switch (id) {\n case \"selectMode\": {\n return (\n <SelectModeScreen\n skipDownloadTemplate={skipDownloadTemplate}\n onChangeMode={setMode}\n />\n );\n }\n case \"downloadCreateTemplate\": {\n return (\n <DownloadCreateTemplateScreen\n onDownloadCSV={onDownloadCSV}\n headers={headers}\n csvPrefix={csvPrefix}\n />\n );\n }\n case \"downloadUpdateTemplate\": {\n return (\n <DownloadUpdateTemplateScreen\n searchLabel={searchLabel}\n onSearch={onSearchData}\n renderSearchField={renderSearchField}\n onDownloadCSV={onDownloadCSV}\n csvPrefix={csvPrefix}\n headers={headers}\n defaultTemplateData={defaultTemplateData}\n columns={columns}\n />\n );\n }\n case \"loadCSV\": {\n return (\n <LoadCSVScreen\n mode={mode}\n columns={columns}\n data={filledData}\n headers={headers}\n errors={errors}\n csvParser={csvParser}\n csvValidator={csvValidator}\n onPreUploadData={onPreUploadData}\n onPreUploadDataByRow={onPreUploadDataByRow}\n onUpdateData={handleUpdateData}\n />\n );\n }\n case \"uploadCSV\": {\n return (\n <UploadCSVScreen\n mode={mode}\n data={filledData}\n headers={headers}\n errors={errors}\n columns={columns}\n onUploadData={onUploadData}\n onUploadDataByRow={onUploadDataByRow}\n onSubmitComplete={handleUpdateData}\n />\n );\n }\n case \"complete\": {\n return (\n <CompleteScreen\n csvPrefix={csvPrefix}\n onDownloadCSV={onDownloadCSV}\n data={filledData}\n columns={columns}\n headers={headers}\n errors={errors}\n />\n );\n }\n default: {\n return null;\n }\n }\n};\n\nconst getFirstScreenId = (\n accptMode: Mode[],\n skipDownloadTemplate?: boolean,\n): ScreenId => {\n if (accptMode.length > 1) {\n return \"selectMode\";\n }\n if (skipDownloadTemplate) {\n return \"loadCSV\";\n }\n if (accptMode[0] === \"create\") {\n return \"downloadCreateTemplate\";\n }\n if (accptMode[0] === \"update\") {\n return \"downloadUpdateTemplate\";\n }\n return \"selectMode\";\n};\n\nexport const CSVImportUI = <\n Columns extends CSVImportUIColumns,\n Row extends Record<string, string> = CSVImportUIRow<Columns>,\n>(\n props: CSVImportUIProps<Columns, Row>,\n) => {\n return (\n <ScreenProvider\n firstScreenId={getFirstScreenId(\n props.acceptMode,\n props.skipDownloadTemplate,\n )}\n >\n <CSVImportUIContent {...props} />\n </ScreenProvider>\n );\n};\n"],"mappings":";AAEA,SAASA,cAAc,QAAQ,0BAA0B;AACzD,SAASC,4BAA4B,QAAQ,wCAAwC;AACrF,SAASC,4BAA4B,QAAQ,wCAAwC;AACrF,SAASC,aAAa,QAAQ,yBAAyB;AAEvD,SAASC,cAAc,EAAEC,SAAS,QAAQ,kBAAkB;AAC5D,SAASC,gBAAgB,QAAQ,4BAA4B;AAE7D,SAASC,eAAe,QAAQ,2BAA2B;AAC3D,SAASC,WAAW,EAAEC,OAAO,EAAEC,QAAQ,QAAQ,OAAO;;AAuBtD;AACA;AACA;AAFA,SAAAC,GAAA,IAAAC,aAAA;AAoKA,IAAMC,kBAAkB,GAAGC,IAAA,IAmBW;EAAA,IAhBpC;IACAC,OAAO;IACPC,aAAa;IACbC,WAAW;IACXC,YAAY;IACZC,iBAAiB;IACjBC,SAAS;IACTC,SAAS;IACTC,YAAY;IACZC,eAAe;IACfC,oBAAoB;IACpBC,YAAY;IACZC,iBAAiB;IACjBC,UAAU;IACVC,oBAAoB;IACpBC;EAC8B,CAAC,GAAAf,IAAA;EAC/B,IAAMgB,EAAE,GAAGzB,SAAS,CAAC,CAAC;EACtB,IAAM,CAAC0B,IAAI,EAAEC,OAAO,CAAC,GAAGtB,QAAQ,CAAOiB,UAAU,CAAC,CAAC,CAAC,CAAC;EACrD,IAAM,CAACM,YAAY,EAAEC,eAAe,CAAC,GAAGxB,QAAQ,CAAQ,EAAE,CAAC;EAC3D,IAAM,CAACyB,MAAM,EAAEC,SAAS,CAAC,GAAG1B,QAAQ,CAA8B,EAAE,CAAC;EAErE,IAAM2B,gBAAgB,GAAG7B,WAAW,CAClC,CAAC8B,IAAW,EAAEH,MAAmC,KAAK;IACpDC,SAAS,CAACD,MAAM,CAAC;IACjBD,eAAe,CAACI,IAAI,CAAC;EACvB,CAAC,EACD,EACF,CAAC;EAED,IAAMC,OAAO,GAAG9B,OAAO,CAAC,MAAM;IAAA,IAAA+B,cAAA;IAC5B,IAAMC,OAAO,GAAGC,MAAM,CAACC,IAAI,EAAAH,cAAA,GAACP,YAAY,CAAC,CAAC,CAAC,YAAAO,cAAA,GAAI,CAAC,CAAC,CAAC;IAElD,OAAOE,MAAM,CAACE,MAAM,CAAC7B,OAAO,CAAC,CAC1B8B,MAAM,CAAEC,MAAM,IAAK;MAClB,IAAIL,OAAO,CAACM,MAAM,KAAK,CAAC,EAAE;QACxB,OAAO,IAAI;MACb;MACA,IAAID,MAAM,CAACE,gBAAgB,IAAI,CAACP,OAAO,CAACQ,QAAQ,CAACH,MAAM,CAACI,KAAK,CAAC,EAAE;QAC9D,OAAO,KAAK;MACd;MACA,OAAO,IAAI;IACb,CAAC,CAAC,CACDC,GAAG,CAAEL,MAAM,IAAKA,MAAM,CAACI,KAAK,CAAC;EAClC,CAAC,EAAE,CAACnC,OAAO,EAAEkB,YAAY,CAAC,CAAC;EAE3B,IAAMmB,UAAU,GAAG3C,OAAO,CAAC,MAAM;IAAA,IAAA4C,eAAA;IAC/B,OAAOd,OAAO,CAACQ,MAAM,GAAGL,MAAM,CAACC,IAAI,EAAAU,eAAA,GAACpB,YAAY,CAAC,CAAC,CAAC,YAAAoB,eAAA,GAAI,CAAC,CAAC,CAAC,CAACN,MAAM,GAC7Dd,YAAY,CAACkB,GAAG,CAAEG,GAAG,IAAK;MACxB,OAAAC,QAAA,KACKb,MAAM,CAACc,WAAW,CAACjB,OAAO,CAACY,GAAG,CAAEM,MAAM,IAAK,CAACA,MAAM,EAAE,EAAE,CAAC,CAAC,CAAC,EACzDH,GAAG;IAEV,CAAC,CAAC,GACFrB,YAAY;EAClB,CAAC,EAAE,CAACM,OAAO,EAAEN,YAAY,CAAC,CAAC;EAE3B,QAAQH,EAAE;IACR,KAAK,YAAY;MAAE;QACjB,OACElB,aAAA,CAACN,gBAAgB;UACfsB,oBAAoB,EAAEA,oBAAqB;UAC3C8B,YAAY,EAAE1B;QAAQ,CACvB,CAAC;MAEN;IACA,KAAK,wBAAwB;MAAE;QAC7B,OACEpB,aAAA,CAACX,4BAA4B;UAC3Be,aAAa,EAAEA,aAAc;UAC7BuB,OAAO,EAAEA,OAAQ;UACjBnB,SAAS,EAAEA;QAAU,CACtB,CAAC;MAEN;IACA,KAAK,wBAAwB;MAAE;QAC7B,OACER,aAAA,CAACV,4BAA4B;UAC3Be,WAAW,EAAEA,WAAY;UACzB0C,QAAQ,EAAEzC,YAAa;UACvBC,iBAAiB,EAAEA,iBAAkB;UACrCH,aAAa,EAAEA,aAAc;UAC7BI,SAAS,EAAEA,SAAU;UACrBmB,OAAO,EAAEA,OAAQ;UACjBV,mBAAmB,EAAEA,mBAAoB;UACzCd,OAAO,EAAEA;QAAQ,CAClB,CAAC;MAEN;IACA,KAAK,SAAS;MAAE;QACd,OACEH,aAAA,CAACT,aAAa;UACZ4B,IAAI,EAAEA,IAAK;UACXhB,OAAO,EAAEA,OAAQ;UACjBuB,IAAI,EAAEc,UAAW;UACjBb,OAAO,EAAEA,OAAQ;UACjBJ,MAAM,EAAEA,MAAO;UACfd,SAAS,EAAEA,SAAU;UACrBC,YAAY,EAAEA,YAAa;UAC3BC,eAAe,EAAEA,eAAgB;UACjCC,oBAAoB,EAAEA,oBAAqB;UAC3CoC,YAAY,EAAEvB;QAAiB,CAChC,CAAC;MAEN;IACA,KAAK,WAAW;MAAE;QAChB,OACEzB,aAAA,CAACL,eAAe;UACdwB,IAAI,EAAEA,IAAK;UACXO,IAAI,EAAEc,UAAW;UACjBb,OAAO,EAAEA,OAAQ;UACjBJ,MAAM,EAAEA,MAAO;UACfpB,OAAO,EAAEA,OAAQ;UACjBU,YAAY,EAAEA,YAAa;UAC3BC,iBAAiB,EAAEA,iBAAkB;UACrCmC,gBAAgB,EAAExB;QAAiB,CACpC,CAAC;MAEN;IACA,KAAK,UAAU;MAAE;QACf,OACEzB,aAAA,CAACZ,cAAc;UACboB,SAAS,EAAEA,SAAU;UACrBJ,aAAa,EAAEA,aAAc;UAC7BsB,IAAI,EAAEc,UAAW;UACjBrC,OAAO,EAAEA,OAAQ;UACjBwB,OAAO,EAAEA,OAAQ;UACjBJ,MAAM,EAAEA;QAAO,CAChB,CAAC;MAEN;IACA;MAAS;QACP,OAAO,IAAI;MACb;EACF;AACF,CAAC;AAED,IAAM2B,gBAAgB,GAAGA,CACvBC,SAAiB,EACjBnC,oBAA8B,KACjB;EACb,IAAImC,SAAS,CAAChB,MAAM,GAAG,CAAC,EAAE;IACxB,OAAO,YAAY;EACrB;EACA,IAAInB,oBAAoB,EAAE;IACxB,OAAO,SAAS;EAClB;EACA,IAAImC,SAAS,CAAC,CAAC,CAAC,KAAK,QAAQ,EAAE;IAC7B,OAAO,wBAAwB;EACjC;EACA,IAAIA,SAAS,CAAC,CAAC,CAAC,KAAK,QAAQ,EAAE;IAC7B,OAAO,wBAAwB;EACjC;EACA,OAAO,YAAY;AACrB,CAAC;AAED,OAAO,IAAMC,WAAW,GAItBC,KAAqC,IAClC;EACH,OACErD,aAAA,CAACR,cAAc;IACb8D,aAAa,EAAEJ,gBAAgB,CAC7BG,KAAK,CAACtC,UAAU,EAChBsC,KAAK,CAACrC,oBACR;EAAE,GAEFhB,aAAA,CAACC,kBAAkB,EAAKoD,KAAQ,CAClB,CAAC;AAErB,CAAC","ignoreList":[]}
1
+ {"version":3,"file":"CSVImportUI.js","names":["CompleteScreen","DownloadCreateTemplateScreen","DownloadUpdateTemplateScreen","LoadCSVScreen","ScreenProvider","useScreen","SelectModeScreen","UploadCSVScreen","useCallback","useMemo","useState","jsx","___EmotionJSX","CSVImportUIContent","_ref","columns","onDownloadCSV","searchLabel","onSearchData","renderSearchField","csvPrefix","csvParser","csvValidator","onPreUploadData","onPreUploadDataByRow","onUploadData","onUploadDataByRow","acceptMode","skipDownloadTemplate","defaultTemplateData","id","mode","setMode","uploadedData","setUploadedData","errors","setErrors","handleUpdateData","data","headers","_uploadedData$","rowKeys","Object","keys","values","filter","column","length","hiddenIfNoHeader","includes","label","map","filledData","_uploadedData$2","row","_extends","fromEntries","header","onChangeMode","onSearch","onUpdateData","onSubmitComplete","getFirstScreenId","accptMode","CSVImportUI","props","firstScreenId"],"sources":["../../../src/CSVImportUI/CSVImportUI.tsx"],"sourcesContent":["import { AlertMessageType } from \"../Alert\";\nimport { AssertType } from \"../@types/AssertType\";\nimport { CompleteScreen } from \"./screens/CompleteScreen\";\nimport { DownloadCreateTemplateScreen } from \"./screens/DownloadCreateTemplateScreen\";\nimport { DownloadUpdateTemplateScreen } from \"./screens/DownloadUpdateTemplateScreen\";\nimport { LoadCSVScreen } from \"./screens/LoadCSVScreen\";\nimport { ScreenId } from \"./screens/types\";\nimport { ScreenProvider, useScreen } from \"./ScreenProvider\";\nimport { SelectModeScreen } from \"./screens/SelectModeScreen\";\nimport { UnionToIntersection } from \"../@types/UnionToIntersection\";\nimport { UploadCSVScreen } from \"./screens/UploadCSVScreen\";\nimport { useCallback, useMemo, useState } from \"react\";\n\nexport type Mode = \"create\" | \"update\";\n\nexport type CellError = [string, string];\n\nexport type CSVImportUIColumn = Readonly<{\n label: string;\n type?: \"date\" | \"number\";\n options?: readonly string[];\n required?: boolean;\n hiddenOnCreateTemplate?: boolean;\n /**\n * アップロードされたCSVにヘッダーがなければ表示しない。\n */\n hiddenIfNoHeader?: boolean;\n renderCell?: (props: {\n value: string;\n header: string;\n row: Record<string, string>;\n }) => JSX.Element;\n}>;\n\n/**\n * ライブラリ利用者用の型\n */\nexport type CSVImportUIColumns = Record<string, CSVImportUIColumn>;\n\nexport interface CSVImportUIRenderSearchFieldProps<Row> {\n onChange: (args: Row[]) => void;\n}\n\ntype OptionByLabel<Columns extends CSVImportUIColumns> = {\n [Key in keyof Columns]: Record<\n Columns[Key][\"label\"],\n Columns[Key] extends {\n options: readonly (infer Option)[];\n }\n ? Option extends string\n ? Option\n : never\n : string\n >;\n}[keyof Columns];\n\nexport type CSVImportUIRow<Columns extends CSVImportUIColumns> = AssertType<\n UnionToIntersection<OptionByLabel<Columns>>,\n Record<string, string>\n>;\n\nexport interface CSVImportUIProps<\n Columns extends CSVImportUIColumns,\n Row extends Record<string, string> = CSVImportUIRow<Columns>,\n> {\n /**\n * 利用できるモードを指定する。\n */\n acceptMode: Mode[];\n /**\n * アップロード画面に進む前にトリガーされる。\n * 行ごとにデータを処理する。\n *\n * onPreUploadDataが指定されている場合、こちらは無視される。\n */\n onPreUploadDataByRow?: (args: {\n index: number;\n /**\n * 欠損したフィールドがある可能性があるため、型を緩くする。\n */\n row: Partial<Row>;\n mode: Mode;\n }) => Promise<{ error?: CellError; data?: Record<string, string> }>;\n /**\n * アップロード画面に進む前にトリガーされる。\n * 一括でデータをアップロードする。\n *\n * 現状onPreUploadDataByRowByRowとは異なり、行ごとにエラーを表示することはできない。\n * 代わりに、エラー時に表示されるアラートのメッセージをerrorMessageで指定する。\n *\n * 行毎にエラーを表示したくなった場合は、要望を出すこと。\n */\n onPreUploadData?: (args: { data: Partial<Row>[]; mode: Mode }) => Promise<{\n errorMessage?: AlertMessageType;\n data?: Record<string, string>[];\n }>;\n /**\n * CSVをパースしたデータのアップロードがトリガーされた際に呼ばれる。\n * 行ごとにデータをアップロードする。\n *\n * onUploadDataが指定されている場合、こちらは無視される。\n */\n onUploadDataByRow?: (args: {\n index: number;\n /**\n * 欠損したフィールドがある可能性があるため、型を緩くする。\n */\n row: Partial<Row>;\n mode: Mode;\n }) => Promise<{\n error?: CellError;\n data?: Record<string, string>;\n }>;\n /**\n * CSVをパースしたデータのアップロードがトリガーされた際に呼ばれる。\n * 一括でデータをアップロードする。\n *\n * 現状onUploadDataByRowとは異なり、行ごとにエラーを表示することはできない。\n * 代わりに、エラー時に表示されるアラートのメッセージをerrorMessageで指定する。\n *\n * 行毎にエラーを表示したくなった場合は、要望を出すこと。\n */\n onUploadData?: (args: { data: Partial<Row>[]; mode: Mode }) => Promise<{\n errorMessage?: AlertMessageType;\n data?: Record<string, string>[];\n }>;\n /**\n * 検索フォームのラベルとして利用される。\n * (only upload mode)\n */\n searchLabel?: string;\n /**\n * 検索が行われた際にトリガーされる。\n * ユーザーの入力した文字列に応じてデータを返却する。このデータはCSVとしてダウンロードされる。\n * (only upload mode)\n */\n onSearchData?: (args: { value: string }) => Promise<{\n data: Row[];\n }>;\n /**\n * CSVの各列をどのように表示するか指定する。\n * 各列には、次のプロパティが指定できる。\n *\n * `label` : CSVのヘッダーとして利用される。\n *\n * `type` : `date`または`number`が指定でき、それぞれ日付と数値としてアップロードされたCSVの値が正しいかどうかを検証する。\n *\n * `options` : その列が持てる値のリストを指定する。アップロードされたCSVの値がこのリストに含まれているかどうかを検証する。\n *\n * `required` : その列が必須かどうかを指定する。アップロードされたCSVの値が空でないかどうかを検証する。\n *\n * `renderCell` : その列のセルをどのように表示するかを指定する。その列の値、ヘッダー、行のデータが渡される。\n *\n * `hiddenOnCreateTemplate` : 作成用のCSVのテンプレートに、その列を表示しないかどうかを決定する。\n *\n * `hiddenIfNoHeader` : アップロードされたCSVにそのヘッダーがなければ、その列を表示しないかどうかを決定する。\n */\n columns: Columns;\n /**\n * ダウンロードされるCSVに付与されるプレフィックスを指定する\n */\n csvPrefix?: string;\n /**\n * CSVのダウンロードがトリガーされたときに呼ばれる\n */\n onDownloadCSV: (args: { data: Row[]; filename: string }) => void;\n /**\n * CSVがアップロードされたときに呼ばれる\n */\n csvParser: (args: {\n file: File;\n }) => Promise<{ data: Record<string, string>[] }>;\n /**\n * アップロードされたCSVのデータをバリデーションする。\n */\n csvValidator?: (args: {\n /**\n * ここで渡されるデータがRowと一致するとは限らない。\n */\n row: Record<string, string>;\n }) => Promise<{ errors?: CellError[] }>;\n /**\n * 更新モードで検索のカスタマイズをする。\n * 省略するとonSearchData, searchLabelを用いた単一の検索フィールドが表示される。これを指定するとonSearchData, searchLabelは無視される。\n * (only upload mode)\n */\n renderSearchField?: (\n props: CSVImportUIRenderSearchFieldProps<Row>,\n ) => JSX.Element;\n /**\n * 編集用CSVをダウンロードするページをスキップする\n */\n skipDownloadTemplate?: boolean;\n /**\n * 更新用のCSVをダウンロードする際にデフォルトで表示されるデータを指定する。\n */\n defaultTemplateData?: Row[];\n}\n\nconst CSVImportUIContent = <\n Columns extends CSVImportUIColumns,\n Row extends Record<string, string> = CSVImportUIRow<Columns>,\n>({\n columns,\n onDownloadCSV,\n searchLabel,\n onSearchData,\n renderSearchField,\n csvPrefix,\n csvParser,\n csvValidator,\n onPreUploadData,\n onPreUploadDataByRow,\n onUploadData,\n onUploadDataByRow,\n acceptMode,\n skipDownloadTemplate,\n defaultTemplateData,\n}: CSVImportUIProps<Columns, Row>) => {\n const id = useScreen();\n const [mode, setMode] = useState<Mode>(acceptMode[0]);\n const [uploadedData, setUploadedData] = useState<Row[]>([]);\n const [errors, setErrors] = useState<(CellError[] | undefined)[]>([]);\n\n const handleUpdateData = useCallback(\n (data: Row[], errors: (CellError[] | undefined)[]) => {\n setErrors(errors);\n setUploadedData(data);\n },\n [],\n );\n\n const headers = useMemo(() => {\n const rowKeys = Object.keys(uploadedData[0] ?? {});\n\n return Object.values(columns)\n .filter((column) => {\n if (rowKeys.length === 0) {\n return true;\n }\n if (column.hiddenIfNoHeader && !rowKeys.includes(column.label)) {\n return false;\n }\n return true;\n })\n .map((column) => column.label);\n }, [columns, uploadedData]);\n\n const filledData = useMemo(() => {\n return headers.length > Object.keys(uploadedData[0] ?? {}).length\n ? uploadedData.map((row) => {\n return {\n ...Object.fromEntries(headers.map((header) => [header, \"\"])),\n ...row,\n };\n })\n : uploadedData;\n }, [headers, uploadedData]);\n\n switch (id) {\n case \"selectMode\": {\n return (\n <SelectModeScreen\n skipDownloadTemplate={skipDownloadTemplate}\n onChangeMode={setMode}\n />\n );\n }\n case \"downloadCreateTemplate\": {\n return (\n <DownloadCreateTemplateScreen\n onDownloadCSV={onDownloadCSV}\n headers={headers}\n csvPrefix={csvPrefix}\n />\n );\n }\n case \"downloadUpdateTemplate\": {\n return (\n <DownloadUpdateTemplateScreen\n searchLabel={searchLabel}\n onSearch={onSearchData}\n renderSearchField={renderSearchField}\n onDownloadCSV={onDownloadCSV}\n csvPrefix={csvPrefix}\n headers={headers}\n defaultTemplateData={defaultTemplateData}\n columns={columns}\n />\n );\n }\n case \"loadCSV\": {\n return (\n <LoadCSVScreen\n mode={mode}\n columns={columns}\n data={filledData}\n headers={headers}\n errors={errors}\n csvParser={csvParser}\n csvValidator={csvValidator}\n onPreUploadData={onPreUploadData}\n onPreUploadDataByRow={onPreUploadDataByRow}\n onUpdateData={handleUpdateData}\n />\n );\n }\n case \"uploadCSV\": {\n return (\n <UploadCSVScreen\n mode={mode}\n data={filledData}\n headers={headers}\n errors={errors}\n columns={columns}\n onUploadData={onUploadData}\n onUploadDataByRow={onUploadDataByRow}\n onSubmitComplete={handleUpdateData}\n />\n );\n }\n case \"complete\": {\n return (\n <CompleteScreen\n csvPrefix={csvPrefix}\n onDownloadCSV={onDownloadCSV}\n data={filledData}\n columns={columns}\n headers={headers}\n errors={errors}\n />\n );\n }\n default: {\n return null;\n }\n }\n};\n\nconst getFirstScreenId = (\n accptMode: Mode[],\n skipDownloadTemplate?: boolean,\n): ScreenId => {\n if (accptMode.length > 1) {\n return \"selectMode\";\n }\n if (skipDownloadTemplate) {\n return \"loadCSV\";\n }\n if (accptMode[0] === \"create\") {\n return \"downloadCreateTemplate\";\n }\n if (accptMode[0] === \"update\") {\n return \"downloadUpdateTemplate\";\n }\n return \"selectMode\";\n};\n\nexport const CSVImportUI = <\n Columns extends CSVImportUIColumns,\n Row extends Record<string, string> = CSVImportUIRow<Columns>,\n>(\n props: CSVImportUIProps<Columns, Row>,\n) => {\n return (\n <ScreenProvider\n firstScreenId={getFirstScreenId(\n props.acceptMode,\n props.skipDownloadTemplate,\n )}\n >\n <CSVImportUIContent {...props} />\n </ScreenProvider>\n );\n};\n"],"mappings":"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","ignoreList":[]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "matsuri-ui",
3
- "version": "16.4.1-alpha-1731090738472-ae2cccf.0",
3
+ "version": "16.5.0",
4
4
  "repository": {
5
5
  "type": "git",
6
6
  "url": "git+https://github.com/matsuri-tech/matsuri-ui.git"
@@ -1 +1 @@
1
- export declare const hasOwnProp: <T extends string>(props: unknown, property: T) => props is { [key in T]: unknown; };
1
+ export declare const hasOwnProp: <T extends string>(props: unknown, property: T) => props is Record<T, unknown>;
@@ -27,11 +27,9 @@ export interface CSVImportUIRenderSearchFieldProps<Row> {
27
27
  onChange: (args: Row[]) => void;
28
28
  }
29
29
  type OptionByLabel<Columns extends CSVImportUIColumns> = {
30
- [Key in keyof Columns]: {
31
- [Label in Columns[Key]["label"]]: Columns[Key] extends {
32
- options: readonly (infer Option)[];
33
- } ? Option extends string ? Option : never : string;
34
- };
30
+ [Key in keyof Columns]: Record<Columns[Key]["label"], Columns[Key] extends {
31
+ options: readonly (infer Option)[];
32
+ } ? Option extends string ? Option : never : string>;
35
33
  }[keyof Columns];
36
34
  export type CSVImportUIRow<Columns extends CSVImportUIColumns> = AssertType<UnionToIntersection<OptionByLabel<Columns>>, Record<string, string>>;
37
35
  export interface CSVImportUIProps<Columns extends CSVImportUIColumns, Row extends Record<string, string> = CSVImportUIRow<Columns>> {