@mittwald/flow-react-components 0.2.0-alpha.564 → 0.2.0-alpha.566
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/CHANGELOG.md +13 -0
- package/dist/assets/doc-properties.json +23370 -23370
- package/dist/js/@mittwald/password-tools-js.mjs +1 -1
- package/dist/js/components/src/components/List/List.mjs.map +1 -1
- package/dist/js/components/src/components/List/components/Header/components/ActiveFilters/ActiveFilters.mjs +1 -0
- package/dist/js/components/src/components/List/components/Header/components/ActiveFilters/ActiveFilters.mjs.map +1 -1
- package/dist/js/components/src/components/List/components/Header/components/Filters/CombinedFilterMenu.mjs +2 -0
- package/dist/js/components/src/components/List/components/Header/components/Filters/CombinedFilterMenu.mjs.map +1 -1
- package/dist/js/components/src/components/List/components/Header/components/Filters/FilterMenuList.mjs +2 -0
- package/dist/js/components/src/components/List/components/Header/components/Filters/FilterMenuList.mjs.map +1 -1
- package/dist/js/components/src/components/List/components/Header/components/Settings/SortingMenuItem.mjs +2 -0
- package/dist/js/components/src/components/List/components/Header/components/Settings/SortingMenuItem.mjs.map +1 -1
- package/dist/js/components/src/components/List/components/Header/components/Settings/ViewModeMenu.mjs +2 -0
- package/dist/js/components/src/components/List/components/Header/components/Settings/ViewModeMenu.mjs.map +1 -1
- package/dist/js/components/src/components/List/components/Header/components/Settings/ViewModeMenuItem.mjs +2 -0
- package/dist/js/components/src/components/List/components/Header/components/Settings/ViewModeMenuItem.mjs.map +1 -1
- package/dist/js/components/src/components/List/components/Header/lib.mjs +2 -0
- package/dist/js/components/src/components/List/components/Header/lib.mjs.map +1 -1
- package/dist/js/components/src/components/List/components/Items/Items.mjs +2 -0
- package/dist/js/components/src/components/List/components/Items/Items.mjs.map +1 -1
- package/dist/js/components/src/components/List/components/Items/components/Item/hooks/useGridItemProps.mjs +2 -0
- package/dist/js/components/src/components/List/components/Items/components/Item/hooks/useGridItemProps.mjs.map +1 -1
- package/dist/js/components/src/components/List/components/ListItemView/ListItemView.mjs +2 -0
- package/dist/js/components/src/components/List/components/ListItemView/ListItemView.mjs.map +1 -1
- package/dist/js/components/src/components/List/components/Table/Table.mjs +2 -0
- package/dist/js/components/src/components/List/components/Table/Table.mjs.map +1 -1
- package/dist/js/components/src/components/List/hooks/useAriaAnnounceSearchState.mjs +1 -0
- package/dist/js/components/src/components/List/hooks/useAriaAnnounceSearchState.mjs.map +1 -1
- package/dist/js/components/src/components/List/hooks/useListMetadata.mjs +16 -0
- package/dist/js/components/src/components/List/hooks/useListMetadata.mjs.map +1 -0
- package/dist/js/components/src/components/List/model/List.mjs +1 -0
- package/dist/js/components/src/components/List/model/List.mjs.map +1 -1
- package/dist/js/components/src/components/List/model/ReactTable.mjs.map +1 -1
- package/dist/js/components/src/components/List/model/loading/IncrementalLoader.mjs +2 -1
- package/dist/js/components/src/components/List/model/loading/IncrementalLoader.mjs.map +1 -1
- package/dist/js/components/src/components/List/model/loading/IncrementalLoaderState.mjs +7 -1
- package/dist/js/components/src/components/List/model/loading/IncrementalLoaderState.mjs.map +1 -1
- package/dist/js/components/src/components/List/model/types.mjs.map +1 -1
- package/dist/js/components/src/components/List/typedList.mjs +3 -1
- package/dist/js/components/src/components/List/typedList.mjs.map +1 -1
- package/dist/js/components/src/components/PasswordCreationField/PasswordCreationField.mjs +0 -1
- package/dist/js/components/src/components/PasswordCreationField/PasswordCreationField.mjs.map +1 -1
- package/dist/js/components/src/components/PasswordCreationField/lib/generateValidationTranslation.mjs +0 -1
- package/dist/js/components/src/components/PasswordCreationField/lib/generateValidationTranslation.mjs.map +1 -1
- package/dist/js/components/src/components/PasswordCreationField/lib/getStateFromLatestPolicyValidationResult.mjs +0 -1
- package/dist/js/components/src/components/PasswordCreationField/lib/getStateFromLatestPolicyValidationResult.mjs.map +1 -1
- package/dist/js/components/src/components/PasswordCreationField/worker/generatePassword.mjs +0 -1
- package/dist/js/components/src/components/PasswordCreationField/worker/generatePassword.mjs.map +1 -1
- package/dist/js/components/src/integrations/@mittwald/password-tools-js/usePasswordCreationFieldValidation.mjs +38 -0
- package/dist/js/components/src/integrations/@mittwald/password-tools-js/usePasswordCreationFieldValidation.mjs.map +1 -0
- package/dist/js/components/src/integrations/react-hook-form/components/Form/Form.mjs +1 -3
- package/dist/js/components/src/integrations/react-hook-form/components/Form/Form.mjs.map +1 -1
- package/dist/js/components/src/integrations/react-hook-form/components/Form/lib/useRegisterActionStateContext.mjs +11 -9
- package/dist/js/components/src/integrations/react-hook-form/components/Form/lib/useRegisterActionStateContext.mjs.map +1 -1
- package/dist/js/components/src/integrations/react-hook-form/components/SubmitButton/SubmitButton.mjs +35 -29
- package/dist/js/components/src/integrations/react-hook-form/components/SubmitButton/SubmitButton.mjs.map +1 -1
- package/dist/js/default.mjs +1 -0
- package/dist/js/default.mjs.map +1 -1
- package/dist/js/flr-universal.mjs +1 -1
- package/dist/types/components/ActionGroup/stories/Default.stories.d.ts.map +1 -1
- package/dist/types/components/List/List.d.ts +2 -2
- package/dist/types/components/List/List.d.ts.map +1 -1
- package/dist/types/components/List/hooks/useListMetadata.d.ts +2 -0
- package/dist/types/components/List/hooks/useListMetadata.d.ts.map +1 -0
- package/dist/types/components/List/index.d.ts +1 -0
- package/dist/types/components/List/index.d.ts.map +1 -1
- package/dist/types/components/List/model/List.d.ts +4 -3
- package/dist/types/components/List/model/List.d.ts.map +1 -1
- package/dist/types/components/List/model/ReactTable.d.ts +3 -3
- package/dist/types/components/List/model/ReactTable.d.ts.map +1 -1
- package/dist/types/components/List/model/loading/IncrementalLoader.d.ts.map +1 -1
- package/dist/types/components/List/model/loading/IncrementalLoaderState.d.ts +2 -0
- package/dist/types/components/List/model/loading/IncrementalLoaderState.d.ts.map +1 -1
- package/dist/types/components/List/model/loading/types.d.ts +1 -0
- package/dist/types/components/List/model/loading/types.d.ts.map +1 -1
- package/dist/types/components/List/model/types.d.ts +3 -3
- package/dist/types/components/List/model/types.d.ts.map +1 -1
- package/dist/types/components/List/typedList.d.ts +4 -3
- package/dist/types/components/List/typedList.d.ts.map +1 -1
- package/dist/types/integrations/@mittwald/password-tools-js/index.d.ts +1 -1
- package/dist/types/integrations/@mittwald/password-tools-js/index.d.ts.map +1 -1
- package/dist/types/integrations/@mittwald/password-tools-js/usePasswordCreationFieldValidation.d.ts +6 -0
- package/dist/types/integrations/@mittwald/password-tools-js/usePasswordCreationFieldValidation.d.ts.map +1 -0
- package/dist/types/integrations/react-hook-form/components/Form/Form.d.ts +1 -1
- package/dist/types/integrations/react-hook-form/components/Form/Form.d.ts.map +1 -1
- package/dist/types/integrations/react-hook-form/components/Form/lib/useRegisterActionStateContext.d.ts +0 -1
- package/dist/types/integrations/react-hook-form/components/Form/lib/useRegisterActionStateContext.d.ts.map +1 -1
- package/dist/types/integrations/react-hook-form/components/SubmitButton/SubmitButton.d.ts.map +1 -1
- package/package.json +4 -4
- package/dist/js/components/src/integrations/@mittwald/password-tools-js/generatePasswordCreationFieldValidation.mjs +0 -32
- package/dist/js/components/src/integrations/@mittwald/password-tools-js/generatePasswordCreationFieldValidation.mjs.map +0 -1
- package/dist/types/integrations/@mittwald/password-tools-js/generatePasswordCreationFieldValidation.d.ts +0 -3
- package/dist/types/integrations/@mittwald/password-tools-js/generatePasswordCreationFieldValidation.d.ts.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"IncrementalLoader.mjs","sources":["../../../../../../../../src/components/List/model/loading/IncrementalLoader.ts"],"sourcesContent":["import type List from \"@/components/List/model/List\";\nimport type {\n DataLoaderOptions,\n DataLoaderResult,\n DataSource,\n IncrementalLoaderShape,\n LoaderInvocationHook,\n} from \"@/components/List/model/loading/types\";\nimport type { AsyncResource } from \"@mittwald/react-use-promise\";\nimport { getAsyncResource, usePromise } from \"@mittwald/react-use-promise\";\nimport { useEffect } from \"react\";\nimport { times } from \"remeda\";\nimport { IncrementalLoaderState } from \"@/components/List/model/loading/IncrementalLoaderState\";\nimport { hash } from \"object-code\";\nimport type { PropertyName } from \"@/components/List/model/types\";\nimport { useMemo } from \"react\";\n\nconst emptyData: never[] = [];\n\nexport class IncrementalLoader<T> {\n private readonly list: List<T>;\n private readonly dataSource: DataSource<T>;\n public readonly manualSorting: boolean;\n public readonly manualFiltering: boolean;\n public readonly manualPagination: boolean;\n public readonly loaderState: IncrementalLoaderState<T>;\n public readonly staticDataProperties: PropertyName<T>[] = [];\n\n private constructor(list: List<T>, shape: IncrementalLoaderShape<T> = {}) {\n const { source } = shape;\n\n this.dataSource = source ?? { staticData: emptyData };\n\n const manualPagination =\n \"manualPagination\" in this.dataSource\n ? this.dataSource.manualPagination\n : undefined;\n\n const manualFiltering =\n \"manualFiltering\" in this.dataSource\n ? this.dataSource.manualFiltering\n : undefined;\n\n const manualSorting =\n \"manualSorting\" in this.dataSource\n ? this.dataSource.manualSorting\n : undefined;\n\n this.list = list;\n this.loaderState = IncrementalLoaderState.useNew<T>(list);\n\n this.manualPagination = manualPagination ?? false;\n this.manualFiltering = manualFiltering ?? this.manualPagination;\n this.manualSorting = manualSorting ?? this.manualPagination;\n this.list.filters.forEach((f) => f.onFilterUpdated(() => this.reset()));\n this.list.search?.onUpdated(() => this.reset());\n\n this.initStaticDataProperties();\n }\n\n public static useNew<T>(\n list: List<T>,\n shape: IncrementalLoaderShape<T> = {},\n ): IncrementalLoader<T> {\n return new IncrementalLoader(list, shape);\n }\n\n private initStaticDataProperties() {\n const addPropertiesOfDataEntry = (data: unknown) => {\n if (typeof data !== \"object\" || data === null) {\n return;\n }\n\n (Object.keys(data) as PropertyName<T>[])\n .filter((p) => !this.staticDataProperties.includes(p))\n .forEach((p) => {\n this.staticDataProperties.push(p);\n });\n };\n\n if (\"staticData\" in this.dataSource) {\n this.dataSource.staticData\n // collect properties from just the first 100 items\n .slice(0, 100)\n .forEach(addPropertiesOfDataEntry);\n }\n }\n\n private reset(): void {\n this.loaderState.reset();\n }\n\n public useIsLoading(): boolean {\n return this.loaderState.useIsLoading();\n }\n\n public useIsInitiallyLoading(): boolean {\n return this.useIsLoading() && this.list.batches.getBatchIndex() === 0;\n }\n\n public useData(): T[] {\n return this.loaderState.useMergedData();\n }\n\n private getUseData(): (options: DataLoaderOptions<T>) => DataLoaderResult<T> {\n const dataSource = this.dataSource;\n\n return (options: DataLoaderOptions<T>) => {\n if (\"staticData\" in dataSource) {\n return useMemo(\n () => ({\n data: dataSource.staticData,\n itemTotalCount: dataSource.staticData.length,\n }),\n [dataSource.staticData],\n );\n }\n\n if (\"useData\" in dataSource) {\n return dataSource.useData(options);\n }\n\n if (\"asyncLoader\" in dataSource) {\n const asyncLoader = dataSource.asyncLoader;\n const dependencies = dataSource.dependencies;\n const loaderId = dependencies\n ? hash(dependencies).toString()\n : undefined;\n\n return usePromise(asyncLoader, [options], {\n loaderId,\n });\n }\n\n if (\"asyncResourceFactory\" in dataSource) {\n return dataSource.asyncResourceFactory(options).use();\n }\n\n return useMemo(\n () => ({\n data: [],\n itemTotalCount: 0,\n }),\n [],\n );\n };\n }\n\n public getLoaderInvocationHooks(): LoaderInvocationHook[] {\n const batchesCount = times(this.list.batches.getBatchIndex() + 1, (i) => i);\n const useData = this.getUseData();\n\n return batchesCount.map((batchIndex) => ({\n useLoadBatch: () => {\n const loaderOptions = this.getDataLoaderOptions(batchIndex);\n const loaderResult = useData(loaderOptions);\n const { data, itemTotalCount } = loaderResult;\n\n useEffect(() => {\n this.loaderState.setDataBatch(batchIndex, data);\n\n if (itemTotalCount !== undefined) {\n this.list.batches.updateItemTotalCount(itemTotalCount);\n }\n\n this.loaderState.setBatchLoadingState(batchIndex, \"loaded\");\n }, [loaderResult]);\n },\n\n useRenderSuspense: () => {\n useEffect(() => {\n this.loaderState.setBatchLoadingState(batchIndex, \"loading\");\n }, [batchIndex]);\n },\n }));\n }\n\n private getDataLoaderOptions(batchIndex: number): DataLoaderOptions<T> {\n return {\n pagination: this.manualPagination\n ? {\n limit: this.list.batches.batchSize,\n offset: this.list.batches.batchSize * batchIndex,\n }\n : undefined,\n\n sorting: this.manualSorting\n ? (Object.fromEntries(\n this.list.sorting\n .filter((s) => s.isSorted())\n .map((s) => [s.property, s.direction]),\n ) as DataLoaderOptions<T>[\"sorting\"])\n : undefined,\n\n filtering: this.manualFiltering\n ? (Object.fromEntries(\n this.list.filters\n .filter((f) => f.getValue() !== null)\n .map((f) => [\n f.property,\n {\n mode: f.mode,\n values: f.getArrayValue().map((v) => v.value),\n },\n ]),\n ) as DataLoaderOptions<T>[\"filtering\"])\n : undefined,\n\n searchString: this.manualFiltering\n ? this.list.reactTable.searchString\n : undefined,\n };\n }\n\n private getBatchDataAsyncResource(\n batchIndex: number,\n ): AsyncResource<DataLoaderResult<T>> {\n const dataSource = this.dataSource;\n const loaderOptions = this.getDataLoaderOptions(batchIndex);\n\n if (\"staticData\" in dataSource) {\n return getAsyncResource(\n async (staticData) => ({\n data: staticData as T[],\n itemTotalCount: staticData.length,\n }),\n [dataSource.staticData],\n );\n }\n\n if (\"asyncLoader\" in dataSource) {\n const asyncLoader = dataSource.asyncLoader;\n const dependencies = dataSource.dependencies;\n const loaderId = dependencies ? hash(dependencies).toString() : undefined;\n return getAsyncResource(asyncLoader, [loaderOptions], {\n loaderId,\n });\n }\n\n if (\"asyncResourceFactory\" in dataSource) {\n const asyncResourceFactory = dataSource.asyncResourceFactory;\n return asyncResourceFactory(loaderOptions);\n }\n\n throw new Error(\"Unknown data source\");\n }\n}\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"IncrementalLoader.mjs","sources":["../../../../../../../../src/components/List/model/loading/IncrementalLoader.ts"],"sourcesContent":["import type List from \"@/components/List/model/List\";\nimport type {\n DataLoaderOptions,\n DataLoaderResult,\n DataSource,\n IncrementalLoaderShape,\n LoaderInvocationHook,\n} from \"@/components/List/model/loading/types\";\nimport type { AsyncResource } from \"@mittwald/react-use-promise\";\nimport { getAsyncResource, usePromise } from \"@mittwald/react-use-promise\";\nimport { useEffect } from \"react\";\nimport { times } from \"remeda\";\nimport { IncrementalLoaderState } from \"@/components/List/model/loading/IncrementalLoaderState\";\nimport { hash } from \"object-code\";\nimport type { PropertyName } from \"@/components/List/model/types\";\nimport { useMemo } from \"react\";\n\nconst emptyData: never[] = [];\n\nexport class IncrementalLoader<T> {\n private readonly list: List<T>;\n private readonly dataSource: DataSource<T>;\n public readonly manualSorting: boolean;\n public readonly manualFiltering: boolean;\n public readonly manualPagination: boolean;\n public readonly loaderState: IncrementalLoaderState<T>;\n public readonly staticDataProperties: PropertyName<T>[] = [];\n\n private constructor(list: List<T>, shape: IncrementalLoaderShape<T> = {}) {\n const { source } = shape;\n\n this.dataSource = source ?? { staticData: emptyData };\n\n const manualPagination =\n \"manualPagination\" in this.dataSource\n ? this.dataSource.manualPagination\n : undefined;\n\n const manualFiltering =\n \"manualFiltering\" in this.dataSource\n ? this.dataSource.manualFiltering\n : undefined;\n\n const manualSorting =\n \"manualSorting\" in this.dataSource\n ? this.dataSource.manualSorting\n : undefined;\n\n this.list = list;\n this.loaderState = IncrementalLoaderState.useNew<T>(list);\n\n this.manualPagination = manualPagination ?? false;\n this.manualFiltering = manualFiltering ?? this.manualPagination;\n this.manualSorting = manualSorting ?? this.manualPagination;\n this.list.filters.forEach((f) => f.onFilterUpdated(() => this.reset()));\n this.list.search?.onUpdated(() => this.reset());\n\n this.initStaticDataProperties();\n }\n\n public static useNew<T>(\n list: List<T>,\n shape: IncrementalLoaderShape<T> = {},\n ): IncrementalLoader<T> {\n return new IncrementalLoader(list, shape);\n }\n\n private initStaticDataProperties() {\n const addPropertiesOfDataEntry = (data: unknown) => {\n if (typeof data !== \"object\" || data === null) {\n return;\n }\n\n (Object.keys(data) as PropertyName<T>[])\n .filter((p) => !this.staticDataProperties.includes(p))\n .forEach((p) => {\n this.staticDataProperties.push(p);\n });\n };\n\n if (\"staticData\" in this.dataSource) {\n this.dataSource.staticData\n // collect properties from just the first 100 items\n .slice(0, 100)\n .forEach(addPropertiesOfDataEntry);\n }\n }\n\n private reset(): void {\n this.loaderState.reset();\n }\n\n public useIsLoading(): boolean {\n return this.loaderState.useIsLoading();\n }\n\n public useIsInitiallyLoading(): boolean {\n return this.useIsLoading() && this.list.batches.getBatchIndex() === 0;\n }\n\n public useData(): T[] {\n return this.loaderState.useMergedData();\n }\n\n private getUseData(): (options: DataLoaderOptions<T>) => DataLoaderResult<T> {\n const dataSource = this.dataSource;\n\n return (options: DataLoaderOptions<T>) => {\n if (\"staticData\" in dataSource) {\n return useMemo(\n () => ({\n data: dataSource.staticData,\n itemTotalCount: dataSource.staticData.length,\n }),\n [dataSource.staticData],\n );\n }\n\n if (\"useData\" in dataSource) {\n return dataSource.useData(options);\n }\n\n if (\"asyncLoader\" in dataSource) {\n const asyncLoader = dataSource.asyncLoader;\n const dependencies = dataSource.dependencies;\n const loaderId = dependencies\n ? hash(dependencies).toString()\n : undefined;\n\n return usePromise(asyncLoader, [options], {\n loaderId,\n });\n }\n\n if (\"asyncResourceFactory\" in dataSource) {\n return dataSource.asyncResourceFactory(options).use();\n }\n\n return useMemo(\n () => ({\n data: [],\n itemTotalCount: 0,\n }),\n [],\n );\n };\n }\n\n public getLoaderInvocationHooks(): LoaderInvocationHook[] {\n const batchesCount = times(this.list.batches.getBatchIndex() + 1, (i) => i);\n const useData = this.getUseData();\n\n return batchesCount.map((batchIndex) => ({\n useLoadBatch: () => {\n const loaderOptions = this.getDataLoaderOptions(batchIndex);\n const loaderResult = useData(loaderOptions);\n const { data, itemTotalCount, metadata } = loaderResult;\n\n useEffect(() => {\n this.loaderState.setDataBatch(batchIndex, data);\n\n if (itemTotalCount !== undefined) {\n this.list.batches.updateItemTotalCount(itemTotalCount);\n }\n\n this.loaderState.setMetadata(metadata);\n\n this.loaderState.setBatchLoadingState(batchIndex, \"loaded\");\n }, [loaderResult]);\n },\n\n useRenderSuspense: () => {\n useEffect(() => {\n this.loaderState.setBatchLoadingState(batchIndex, \"loading\");\n }, [batchIndex]);\n },\n }));\n }\n\n private getDataLoaderOptions(batchIndex: number): DataLoaderOptions<T> {\n return {\n pagination: this.manualPagination\n ? {\n limit: this.list.batches.batchSize,\n offset: this.list.batches.batchSize * batchIndex,\n }\n : undefined,\n\n sorting: this.manualSorting\n ? (Object.fromEntries(\n this.list.sorting\n .filter((s) => s.isSorted())\n .map((s) => [s.property, s.direction]),\n ) as DataLoaderOptions<T>[\"sorting\"])\n : undefined,\n\n filtering: this.manualFiltering\n ? (Object.fromEntries(\n this.list.filters\n .filter((f) => f.getValue() !== null)\n .map((f) => [\n f.property,\n {\n mode: f.mode,\n values: f.getArrayValue().map((v) => v.value),\n },\n ]),\n ) as DataLoaderOptions<T>[\"filtering\"])\n : undefined,\n\n searchString: this.manualFiltering\n ? this.list.reactTable.searchString\n : undefined,\n };\n }\n\n private getBatchDataAsyncResource(\n batchIndex: number,\n ): AsyncResource<DataLoaderResult<T>> {\n const dataSource = this.dataSource;\n const loaderOptions = this.getDataLoaderOptions(batchIndex);\n\n if (\"staticData\" in dataSource) {\n return getAsyncResource(\n async (staticData) => ({\n data: staticData as T[],\n itemTotalCount: staticData.length,\n }),\n [dataSource.staticData],\n );\n }\n\n if (\"asyncLoader\" in dataSource) {\n const asyncLoader = dataSource.asyncLoader;\n const dependencies = dataSource.dependencies;\n const loaderId = dependencies ? hash(dependencies).toString() : undefined;\n return getAsyncResource(asyncLoader, [loaderOptions], {\n loaderId,\n });\n }\n\n if (\"asyncResourceFactory\" in dataSource) {\n const asyncResourceFactory = dataSource.asyncResourceFactory;\n return asyncResourceFactory(loaderOptions);\n }\n\n throw new Error(\"Unknown data source\");\n }\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -9,6 +9,7 @@ class IncrementalLoaderState {
|
|
|
9
9
|
dataBatches = [];
|
|
10
10
|
prevDataBatches = [];
|
|
11
11
|
batchLoadingStates = ["void"];
|
|
12
|
+
metadata = void 0;
|
|
12
13
|
list;
|
|
13
14
|
constructor(list) {
|
|
14
15
|
this.list = list;
|
|
@@ -18,11 +19,13 @@ class IncrementalLoaderState {
|
|
|
18
19
|
useIsLoading: false,
|
|
19
20
|
dataBatches: observable.shallow,
|
|
20
21
|
batchLoadingStates: observable.shallow,
|
|
22
|
+
metadata: observable,
|
|
21
23
|
mergedData: computed,
|
|
22
24
|
isLoading: computed,
|
|
23
25
|
reset: action.bound,
|
|
24
26
|
setDataBatch: action.bound,
|
|
25
|
-
setBatchLoadingState: action.bound
|
|
27
|
+
setBatchLoadingState: action.bound,
|
|
28
|
+
setMetadata: action.bound
|
|
26
29
|
});
|
|
27
30
|
}
|
|
28
31
|
static useNew(list) {
|
|
@@ -46,6 +49,9 @@ class IncrementalLoaderState {
|
|
|
46
49
|
this.batchLoadingStates[index] = state;
|
|
47
50
|
}
|
|
48
51
|
}
|
|
52
|
+
setMetadata(metadata) {
|
|
53
|
+
this.metadata = metadata;
|
|
54
|
+
}
|
|
49
55
|
get mergedData() {
|
|
50
56
|
const dataBatches = this.dataBatches.length === 0 ? this.prevDataBatches : this.dataBatches;
|
|
51
57
|
const merged = dataBatches.flatMap((d) => d);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"IncrementalLoaderState.mjs","sources":["../../../../../../../../src/components/List/model/loading/IncrementalLoaderState.ts"],"sourcesContent":["import type { ListData } from \"@/components/List/model/loading/types\";\nimport useSelector from \"@/lib/mobx/useSelector\";\nimport type { AsyncResource } from \"@mittwald/react-use-promise\";\nimport { action, computed, makeObservable, observable } from \"mobx\";\nimport { useStatic } from \"@/lib/hooks/useStatic\";\nimport type List from \"@/components/List/model/List\";\nimport { uniqueBy } from \"remeda\";\n\ntype AsyncResourceLoadingState = AsyncResource[\"state\"][\"value\"];\ntype DataBatches<T> = ListData<T>[];\ntype BatchesLoadingState = AsyncResourceLoadingState[];\n\nexport class IncrementalLoaderState<T> {\n public dataBatches: DataBatches<T> = [];\n public prevDataBatches: DataBatches<T> = [];\n public batchLoadingStates: BatchesLoadingState = [\"void\"];\n public readonly list: List<T>;\n\n private constructor(list: List<T>) {\n this.list = list;\n makeObservable(this, {\n prevDataBatches: false,\n useMergedData: false,\n useIsLoading: false,\n dataBatches: observable.shallow,\n batchLoadingStates: observable.shallow,\n mergedData: computed,\n isLoading: computed,\n reset: action.bound,\n setDataBatch: action.bound,\n setBatchLoadingState: action.bound,\n });\n }\n\n public static useNew<T>(list: List<T>): IncrementalLoaderState<T> {\n return useStatic(() => new IncrementalLoaderState<T>(list));\n }\n\n public reset(): void {\n this.batchLoadingStates = [];\n this.dataBatches = [];\n }\n\n public setDataBatch(index: number, data: ListData<T>): void {\n if (this.dataBatches.length === 0) {\n this.prevDataBatches = [];\n }\n\n if (this.dataBatches[index] !== data) {\n this.dataBatches[index] = data;\n this.prevDataBatches[index] = data;\n }\n }\n\n public setBatchLoadingState(\n index: number,\n state: AsyncResourceLoadingState,\n ): void {\n if (this.batchLoadingStates[index] !== state) {\n this.batchLoadingStates[index] = state;\n }\n }\n\n public get mergedData(): T[] {\n const dataBatches =\n this.dataBatches.length === 0 ? this.prevDataBatches : this.dataBatches;\n\n const merged = dataBatches.flatMap((d) => d);\n if (this.list.getItemId) {\n return uniqueBy(merged, this.list.getItemId);\n } else {\n return merged;\n }\n }\n\n public useMergedData(): T[] {\n return useSelector(() => this.mergedData, [this.prevDataBatches]);\n }\n\n public get isLoading(): boolean {\n return this.batchLoadingStates.some((s) => s === \"loading\" || s === \"void\");\n }\n\n public useIsLoading(): boolean {\n return useSelector(() => this.isLoading);\n }\n\n public isBatchLoaded(batchIndex: number) {\n return batchIndex in this.dataBatches;\n }\n}\n"],"names":[],"mappings":";;;;;AAYO,MAAM,sBAAA,CAA0B;AAAA,EAC9B,cAA8B,EAAC;AAAA,EAC/B,kBAAkC,EAAC;AAAA,EACnC,kBAAA,GAA0C,CAAC,MAAM,CAAA;AAAA,
|
|
1
|
+
{"version":3,"file":"IncrementalLoaderState.mjs","sources":["../../../../../../../../src/components/List/model/loading/IncrementalLoaderState.ts"],"sourcesContent":["import type { ListData } from \"@/components/List/model/loading/types\";\nimport useSelector from \"@/lib/mobx/useSelector\";\nimport type { AsyncResource } from \"@mittwald/react-use-promise\";\nimport { action, computed, makeObservable, observable } from \"mobx\";\nimport { useStatic } from \"@/lib/hooks/useStatic\";\nimport type List from \"@/components/List/model/List\";\nimport { uniqueBy } from \"remeda\";\n\ntype AsyncResourceLoadingState = AsyncResource[\"state\"][\"value\"];\ntype DataBatches<T> = ListData<T>[];\ntype BatchesLoadingState = AsyncResourceLoadingState[];\n\nexport class IncrementalLoaderState<T> {\n public dataBatches: DataBatches<T> = [];\n public prevDataBatches: DataBatches<T> = [];\n public batchLoadingStates: BatchesLoadingState = [\"void\"];\n public metadata?: unknown = undefined;\n public readonly list: List<T>;\n\n private constructor(list: List<T>) {\n this.list = list;\n makeObservable(this, {\n prevDataBatches: false,\n useMergedData: false,\n useIsLoading: false,\n dataBatches: observable.shallow,\n batchLoadingStates: observable.shallow,\n metadata: observable,\n mergedData: computed,\n isLoading: computed,\n reset: action.bound,\n setDataBatch: action.bound,\n setBatchLoadingState: action.bound,\n setMetadata: action.bound,\n });\n }\n\n public static useNew<T>(list: List<T>): IncrementalLoaderState<T> {\n return useStatic(() => new IncrementalLoaderState<T>(list));\n }\n\n public reset(): void {\n this.batchLoadingStates = [];\n this.dataBatches = [];\n }\n\n public setDataBatch(index: number, data: ListData<T>): void {\n if (this.dataBatches.length === 0) {\n this.prevDataBatches = [];\n }\n\n if (this.dataBatches[index] !== data) {\n this.dataBatches[index] = data;\n this.prevDataBatches[index] = data;\n }\n }\n\n public setBatchLoadingState(\n index: number,\n state: AsyncResourceLoadingState,\n ): void {\n if (this.batchLoadingStates[index] !== state) {\n this.batchLoadingStates[index] = state;\n }\n }\n\n public setMetadata(metadata?: unknown): void {\n this.metadata = metadata;\n }\n\n public get mergedData(): T[] {\n const dataBatches =\n this.dataBatches.length === 0 ? this.prevDataBatches : this.dataBatches;\n\n const merged = dataBatches.flatMap((d) => d);\n if (this.list.getItemId) {\n return uniqueBy(merged, this.list.getItemId);\n } else {\n return merged;\n }\n }\n\n public useMergedData(): T[] {\n return useSelector(() => this.mergedData, [this.prevDataBatches]);\n }\n\n public get isLoading(): boolean {\n return this.batchLoadingStates.some((s) => s === \"loading\" || s === \"void\");\n }\n\n public useIsLoading(): boolean {\n return useSelector(() => this.isLoading);\n }\n\n public isBatchLoaded(batchIndex: number) {\n return batchIndex in this.dataBatches;\n }\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.mjs","sources":["../../../../../../../src/components/List/model/types.ts"],"sourcesContent":["import type { FilterShape } from \"@/components/List/model/filter/types\";\nimport type { ItemViewShape } from \"@/components/List/model/item/ItemView\";\nimport type List from \"@/components/List/model/List\";\nimport type { IncrementalLoaderShape } from \"@/components/List/model/loading/types\";\nimport type { BatchesControllerShape } from \"@/components/List/model/pagination/types\";\nimport type { SearchShape } from \"@/components/List/model/search/types\";\nimport type { SortingShape } from \"@/components/List/model/sorting/types\";\nimport type { TableShape } from \"@/components/List/model/table/types\";\nimport type { ItemType } from \"@/lib/types/array\";\nimport type { MultipleSelection, SelectionBehavior } from \"@react-types/shared\";\nimport type { DeepKeys, DeepValue } from \"@tanstack/react-table\";\nimport type { ReactNode } from \"react\";\n\nexport const customPropertyPrefix = \"$\" as const;\nexport type CustomPropertyName = `${typeof customPropertyPrefix}${string}`;\n\nexport type PropertyName<T> = DeepKeys<T> | CustomPropertyName;\nexport type PropertyValue<T, TProp> = TProp extends CustomPropertyName\n ? T\n : DeepValue<T, TProp>;\nexport type PropertyValueRenderMethod<TMatcherValue> = (\n prop: NonNullable<ItemType<TMatcherValue>>,\n) => ReactNode;\n\nexport type OnListChanged<T> = (list: List<T>) => void;\n\nexport interface ListSupportedComponentProps extends MultipleSelection {\n \"aria-labelledby\"?: string;\n \"aria-label\"?: string;\n selectionBehavior?: SelectionBehavior;\n}\n\nexport interface ListShape<T
|
|
1
|
+
{"version":3,"file":"types.mjs","sources":["../../../../../../../src/components/List/model/types.ts"],"sourcesContent":["import type { FilterShape } from \"@/components/List/model/filter/types\";\nimport type { ItemViewShape } from \"@/components/List/model/item/ItemView\";\nimport type List from \"@/components/List/model/List\";\nimport type { IncrementalLoaderShape } from \"@/components/List/model/loading/types\";\nimport type { BatchesControllerShape } from \"@/components/List/model/pagination/types\";\nimport type { SearchShape } from \"@/components/List/model/search/types\";\nimport type { SortingShape } from \"@/components/List/model/sorting/types\";\nimport type { TableShape } from \"@/components/List/model/table/types\";\nimport type { ItemType } from \"@/lib/types/array\";\nimport type { MultipleSelection, SelectionBehavior } from \"@react-types/shared\";\nimport type { DeepKeys, DeepValue } from \"@tanstack/react-table\";\nimport type { ReactNode } from \"react\";\n\nexport const customPropertyPrefix = \"$\" as const;\nexport type CustomPropertyName = `${typeof customPropertyPrefix}${string}`;\n\nexport type PropertyName<T> = DeepKeys<T> | CustomPropertyName;\nexport type PropertyValue<T, TProp> = TProp extends CustomPropertyName\n ? T\n : DeepValue<T, TProp>;\nexport type PropertyValueRenderMethod<TMatcherValue> = (\n prop: NonNullable<ItemType<TMatcherValue>>,\n) => ReactNode;\n\nexport type OnListChanged<T, TMeta = unknown> = (list: List<T, TMeta>) => void;\n\nexport interface ListSupportedComponentProps extends MultipleSelection {\n \"aria-labelledby\"?: string;\n \"aria-label\"?: string;\n selectionBehavior?: SelectionBehavior;\n}\n\nexport interface ListShape<T, TMeta = unknown>\n extends ListSupportedComponentProps {\n settingStorageKey?: string;\n\n loader?: IncrementalLoaderShape<T>;\n filters?: FilterShape<T, never, never>[];\n itemView?: ItemViewShape<T>;\n search?: SearchShape<T>;\n sorting?: SortingShape<T>[];\n batchesController?: BatchesControllerShape;\n table?: TableShape<T>;\n\n onAction?: ItemActionFn<T>;\n accordion?: boolean;\n getItemId?: GetItemId<T>;\n onChange?: OnListChanged<T, TMeta>;\n defaultViewMode?: ListViewMode;\n}\n\nexport type PropertyRecord<T, TValue> = Partial<\n Record<PropertyName<T>, TValue>\n>;\n\nexport type ListViewMode = \"table\" | \"list\" | \"tiles\";\nexport type ItemActionFn<T> = (data: T) => void;\nexport type GetItemId<T> = (data: T) => string;\n"],"names":[],"mappings":"AAaO,MAAM,oBAAA,GAAuB;;;;"}
|
|
@@ -16,6 +16,7 @@ import { TableRow } from './setupComponents/TableRow.mjs';
|
|
|
16
16
|
import { TableBody } from './setupComponents/TableBody.mjs';
|
|
17
17
|
import { Table } from './setupComponents/Table.mjs';
|
|
18
18
|
import { TypedListLoaderHooks } from './setupComponents/ListLoaderHooks.mjs';
|
|
19
|
+
import { useListMetadata } from './hooks/useListMetadata.mjs';
|
|
19
20
|
|
|
20
21
|
const TypedList = () => List;
|
|
21
22
|
const typedList = () => ({
|
|
@@ -34,7 +35,8 @@ const typedList = () => ({
|
|
|
34
35
|
StaticData: TypedListStaticData(),
|
|
35
36
|
LoaderAsync: TypedListLoaderAsync(),
|
|
36
37
|
LoaderHooks: TypedListLoaderHooks(),
|
|
37
|
-
LoaderAsyncResource: TypedListLoaderAsyncResource()
|
|
38
|
+
LoaderAsyncResource: TypedListLoaderAsyncResource(),
|
|
39
|
+
useMetadata: () => useListMetadata()
|
|
38
40
|
});
|
|
39
41
|
|
|
40
42
|
export { TypedList, typedList };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"typedList.mjs","sources":["../../../../../../src/components/List/typedList.ts"],"sourcesContent":["import type { ListProps } from \"@/components/List/List\";\nimport List from \"@/components/List/List\";\nimport { TypedListFilter } from \"@/components/List/setupComponents/ListFilter\";\nimport { TypedListSorting } from \"@/components/List/setupComponents/ListSorting\";\nimport { TypedListItem } from \"@/components/List/setupComponents/ListItem\";\nimport { TypedListLoaderAsync } from \"@/components/List/setupComponents/ListLoaderAsync\";\nimport { TypedListLoaderAsyncResource } from \"@/components/List/setupComponents/ListLoaderAsyncResource\";\nimport { TypedListStaticData } from \"@/components/List/setupComponents/ListStaticData\";\nimport { TypedListSearch } from \"@/components/List/setupComponents/ListSearch\";\nimport { ListItemView } from \"@/components/List/components/ListItemView/ListItemView\";\nimport type { ComponentType } from \"react\";\nimport { TableColumn } from \"@/components/List/setupComponents/TableColumn\";\nimport { TableCell } from \"@/components/List/setupComponents/TableCell\";\nimport { TableHeader } from \"@/components/List/setupComponents/TableHeader\";\nimport { TableRow } from \"@/components/List/setupComponents/TableRow\";\nimport { TableBody } from \"@/components/List/setupComponents/TableBody\";\nimport { Table } from \"@/components/List/setupComponents/Table\";\nimport { TypedListLoaderHooks } from \"@/components/List/setupComponents/ListLoaderHooks\";\n\nexport const TypedList = <T>() =>\n List as unknown as ComponentType<ListProps<T>>;\n\nexport const typedList = <T>() => ({\n List: TypedList<T>(),\n Filter: TypedListFilter<T>(),\n Search: TypedListSearch<T>(),\n Sorting: TypedListSorting<T>(),\n Item: TypedListItem<T>(),\n ItemView: ListItemView,\n TableHeader: TableHeader<T>,\n TableColumn: TableColumn<T>,\n TableBody: TableBody<T>,\n TableRow: TableRow<T>,\n TableCell: TableCell<T>,\n Table: Table<T>,\n StaticData: TypedListStaticData<T>(),\n LoaderAsync: TypedListLoaderAsync<T>(),\n LoaderHooks: TypedListLoaderHooks<T>(),\n LoaderAsyncResource: TypedListLoaderAsyncResource<T>(),\n});\n"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"typedList.mjs","sources":["../../../../../../src/components/List/typedList.ts"],"sourcesContent":["import type { ListProps } from \"@/components/List/List\";\nimport List from \"@/components/List/List\";\nimport { TypedListFilter } from \"@/components/List/setupComponents/ListFilter\";\nimport { TypedListSorting } from \"@/components/List/setupComponents/ListSorting\";\nimport { TypedListItem } from \"@/components/List/setupComponents/ListItem\";\nimport { TypedListLoaderAsync } from \"@/components/List/setupComponents/ListLoaderAsync\";\nimport { TypedListLoaderAsyncResource } from \"@/components/List/setupComponents/ListLoaderAsyncResource\";\nimport { TypedListStaticData } from \"@/components/List/setupComponents/ListStaticData\";\nimport { TypedListSearch } from \"@/components/List/setupComponents/ListSearch\";\nimport { ListItemView } from \"@/components/List/components/ListItemView/ListItemView\";\nimport type { ComponentType } from \"react\";\nimport { TableColumn } from \"@/components/List/setupComponents/TableColumn\";\nimport { TableCell } from \"@/components/List/setupComponents/TableCell\";\nimport { TableHeader } from \"@/components/List/setupComponents/TableHeader\";\nimport { TableRow } from \"@/components/List/setupComponents/TableRow\";\nimport { TableBody } from \"@/components/List/setupComponents/TableBody\";\nimport { Table } from \"@/components/List/setupComponents/Table\";\nimport { TypedListLoaderHooks } from \"@/components/List/setupComponents/ListLoaderHooks\";\nimport { useListMetadata } from \"@/components/List/hooks/useListMetadata\";\n\nexport const TypedList = <T, TMeta = unknown>() =>\n List as unknown as ComponentType<ListProps<T, TMeta>>;\n\nexport const typedList = <T, TMeta = unknown>() => ({\n List: TypedList<T, TMeta>(),\n Filter: TypedListFilter<T>(),\n Search: TypedListSearch<T>(),\n Sorting: TypedListSorting<T>(),\n Item: TypedListItem<T>(),\n ItemView: ListItemView,\n TableHeader: TableHeader<T>,\n TableColumn: TableColumn<T>,\n TableBody: TableBody<T>,\n TableRow: TableRow<T>,\n TableCell: TableCell<T>,\n Table: Table<T>,\n StaticData: TypedListStaticData<T>(),\n LoaderAsync: TypedListLoaderAsync<T>(),\n LoaderHooks: TypedListLoaderHooks<T>(),\n LoaderAsyncResource: TypedListLoaderAsyncResource<T>(),\n useMetadata: () => useListMetadata<TMeta>(),\n});\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;AAoBO,MAAM,YAAY,MACvB;AAEK,MAAM,YAAY,OAA2B;AAAA,EAClD,MAAM,SAAA,EAAoB;AAAA,EAC1B,QAAQ,eAAA,EAAmB;AAAA,EAC3B,QAAQ,eAAA,EAAmB;AAAA,EAC3B,SAAS,gBAAA,EAAoB;AAAA,EAC7B,MAAM,aAAA,EAAiB;AAAA,EACvB,QAAA,EAAU,YAAA;AAAA,EACV,WAAA;AAAA,EACA,WAAA;AAAA,EACA,SAAA;AAAA,EACA,QAAA;AAAA,EACA,SAAA;AAAA,EACA,KAAA;AAAA,EACA,YAAY,mBAAA,EAAuB;AAAA,EACnC,aAAa,oBAAA,EAAwB;AAAA,EACrC,aAAa,oBAAA,EAAwB;AAAA,EACrC,qBAAqB,4BAAA,EAAgC;AAAA,EACrD,WAAA,EAAa,MAAM,eAAA;AACrB,CAAA;;;;"}
|
|
@@ -26,7 +26,6 @@ import { PasswordGenerateButton } from './components/PasswordGenerateButton/Pass
|
|
|
26
26
|
import { useLocalizedContextStringFormatter } from '../TranslationProvider/useLocalizedContextStringFormatter.mjs';
|
|
27
27
|
import { defaultPasswordCreationPolicy } from '../../integrations/@mittwald/password-tools-js/defaultPasswordCreationPolicy.mjs';
|
|
28
28
|
import { Policy } from '@mittwald/password-tools-js/policy';
|
|
29
|
-
import 'remeda';
|
|
30
29
|
import '@mittwald/password-tools-js/rules';
|
|
31
30
|
import '@mittwald/password-tools-js/generator';
|
|
32
31
|
import { usePolicyValidationResult } from './lib/usePolicyValidationResult.mjs';
|
package/dist/js/components/src/components/PasswordCreationField/PasswordCreationField.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PasswordCreationField.mjs","sources":["../../../../../../src/components/PasswordCreationField/PasswordCreationField.tsx"],"sourcesContent":["import {\n type PropsWithChildren,\n useState,\n type ClipboardEvent,\n useDeferredValue,\n useMemo,\n} from \"react\";\nimport {\n dynamic,\n type PropsContext,\n PropsContextProvider,\n} from \"@/lib/propsContext\";\nimport {\n flowComponent,\n type FlowComponentProps,\n} from \"@/lib/componentFactory/flowComponent\";\nimport styles from \"./PasswordCreationField.module.scss\";\nimport * as Aria from \"react-aria-components\";\nimport clsx from \"clsx\";\nimport { TunnelExit, TunnelProvider } from \"@mittwald/react-tunnel\";\nimport { type ActionFn } from \"@/components/Action\";\nimport getStateFromLatestPolicyValidationResult from \"@/components/PasswordCreationField/lib/getStateFromLatestPolicyValidationResult\";\nimport locales from \"./locales/*.locale.json\";\nimport generateValidationTranslation from \"@/components/PasswordCreationField/lib/generateValidationTranslation\";\nimport FieldDescription from \"@/components/FieldDescription\";\nimport ComplexityIndicator from \"@/components/PasswordCreationField/components/ComplexityIndicator/ComplexityIndicator\";\nimport { generatePassword } from \"@/components/PasswordCreationField/worker/generatePassword\";\nimport TogglePasswordVisibilityButton from \"@/components/PasswordCreationField/components/TogglePasswordVisibilityButton/TogglePasswordVisibilityButton\";\nimport { ReactAriaControlledValueFix } from \"@/lib/react/ReactAriaControlledValueFix\";\nimport { ValidationResultButton } from \"@/components/PasswordCreationField/components/ValidationResultButton/ValidationResultButton\";\nimport { PasswordGenerateButton } from \"@/components/PasswordCreationField/components/PasswordGenerateButton/PasswordGenerateButton\";\nimport { useLocalizedContextStringFormatter } from \"@/components/TranslationProvider/useLocalizedContextStringFormatter\";\nimport type {\n PolicyValidationResult,\n PolicyGenericDeclaration,\n RuleValidationResult,\n} from \"@/integrations/@mittwald/password-tools-js\";\nimport {\n defaultPasswordCreationPolicy,\n Policy,\n} from \"@/integrations/@mittwald/password-tools-js\";\nimport { usePolicyValidationResult } from \"@/components/PasswordCreationField/lib/usePolicyValidationResult\";\nimport { useManagedValue } from \"@/lib/hooks/useManagedValue\";\nimport { useFieldComponent } from \"@/lib/hooks/useFieldComponent\";\nimport { FieldError } from \"@/components/FieldError\";\n\nexport interface PasswordCreationFieldProps\n extends PropsWithChildren<\n Omit<Aria.TextFieldProps, \"children\" | \"value\" | \"defaultValue\"> &\n Partial<Pick<Aria.FieldErrorRenderProps, \"validationErrors\">>\n >,\n FlowComponentProps<HTMLInputElement> {\n value?: string;\n onValidationResult?: (result: { password: string; isValid: boolean }) => void;\n defaultValue?: string;\n placeholder?: string;\n validationPolicy?: PolicyGenericDeclaration;\n}\n\nexport interface ResolvedPolicyValidationResult\n extends Omit<PolicyValidationResult, \"isValid\"> {\n isValid: boolean | \"indeterminate\";\n ruleResults: RuleValidationResult[];\n}\n\n/** @flr-generate all */\nexport const PasswordCreationField = flowComponent(\n \"PasswordCreationField\",\n (props) => {\n const {\n children,\n className,\n ref,\n isDisabled,\n onValidationResult,\n isInvalid: invalidFromProps,\n validationPolicy:\n validationPolicyFromProps = defaultPasswordCreationPolicy,\n isRequired,\n ...rest\n } = props;\n\n const {\n FieldErrorView,\n FieldErrorCaptureContext,\n fieldProps,\n fieldPropsContext,\n } = useFieldComponent(props);\n\n const [isLoading, setIsLoading] = useState(false);\n const translate = useLocalizedContextStringFormatter(locales);\n\n const validationPolicy = useMemo(\n () => Policy.fromDeclaration(validationPolicyFromProps),\n [validationPolicyFromProps],\n );\n\n const { value, handleOnChange } = useManagedValue(props);\n const deferredValue = useDeferredValue(value);\n\n const [isPasswordRevealed, setIsPasswordRevealed] = useState(false);\n const initialPolicyValidationState: ResolvedPolicyValidationResult = {\n isValid: true,\n complexity: {\n min: validationPolicy.minComplexity,\n actual: 4,\n warning: null,\n },\n ruleResults: [],\n };\n\n const [policyValidationResult, setPolicyValidationResult] = useState(\n initialPolicyValidationState,\n );\n usePolicyValidationResult(\n validationPolicy,\n deferredValue,\n () => {\n if (isEmptyValue) {\n return;\n }\n\n setIsLoading(() => true);\n },\n ({ password, isValid, results }) => {\n if (isEmptyValue) {\n setPolicyValidationResult(() => ({\n ...results,\n isValid: true,\n }));\n return;\n }\n\n setIsLoading(() => false);\n setPolicyValidationResult(() => results);\n onValidationResult?.({ password, isValid });\n },\n );\n\n const isEmptyValue = !value;\n const stateFromValidationResult = getStateFromLatestPolicyValidationResult(\n isEmptyValue,\n policyValidationResult,\n );\n let latestValidationErrorText = undefined;\n if (stateFromValidationResult) {\n const [translationKey, translationValues] = generateValidationTranslation(\n stateFromValidationResult,\n );\n latestValidationErrorText = translate.format(\n translationKey,\n translationValues,\n );\n }\n\n const isValidFromValidationResult =\n !isEmptyValue && stateFromValidationResult?.isValid;\n const isInvalidFromValidationResult =\n !isEmptyValue && !stateFromValidationResult?.isValid;\n const isInvalid = invalidFromProps || isInvalidFromValidationResult;\n\n const setOptimisticPolicyValidationResult = (\n state: Partial<ResolvedPolicyValidationResult> = {},\n ) => {\n setIsLoading(() => false);\n setPolicyValidationResult(() => ({\n ...initialPolicyValidationState,\n ...state,\n isValid: true,\n }));\n };\n\n const onPasswordGenerateHandler: ActionFn = async () => {\n const generatedPassword = await generatePassword(validationPolicy);\n setOptimisticPolicyValidationResult();\n setIsPasswordRevealed(true);\n handleOnChange(generatedPassword);\n };\n\n const onPasswordPasteHandler = (event: ClipboardEvent) => {\n const pastedValue = event.clipboardData.getData(\"text\");\n if (pastedValue !== value) {\n setOptimisticPolicyValidationResult({\n isValid: \"indeterminate\",\n });\n }\n };\n\n const togglePasswordVisibilityHandler = () => {\n setIsPasswordRevealed((old) => !old);\n };\n\n const propsContext: PropsContext = {\n ...fieldPropsContext,\n Button: {\n tunnelId: \"button\",\n size: \"m\",\n variant: \"plain\",\n color: \"secondary\",\n isDisabled: isDisabled,\n className: styles.button,\n },\n CopyButton: {\n tunnelId: \"button\",\n size: \"m\",\n variant: \"plain\",\n color: \"secondary\",\n isDisabled: isDisabled,\n className: styles.button,\n text: value,\n },\n Label: {\n ...fieldPropsContext.Label,\n tunnelId: \"label\",\n children: dynamic((localProps) => {\n return (\n <>\n {localProps.children}\n <PasswordGenerateButton\n isDisabled={isDisabled}\n onGeneratePasswordAction={onPasswordGenerateHandler}\n />\n <ValidationResultButton\n isEmptyValue={isEmptyValue}\n isDisabled={isDisabled}\n policyValidationResult={policyValidationResult}\n />\n </>\n );\n }),\n },\n };\n\n return (\n <Aria.TextField\n {...rest}\n value={value}\n type={isPasswordRevealed ? \"text\" : \"password\"}\n onChange={handleOnChange}\n onPaste={onPasswordPasteHandler}\n className={clsx(className, fieldProps.className)}\n isDisabled={isDisabled}\n isInvalid={isInvalid}\n isRequired={isRequired}\n >\n <TunnelProvider>\n <FieldErrorCaptureContext>\n <FieldError>{latestValidationErrorText}</FieldError>\n <PropsContextProvider\n props={propsContext}\n dependencies={[\n isDisabled,\n isRequired,\n value,\n policyValidationResult,\n ]}\n >\n <TunnelExit id=\"label\" />\n <Aria.Group\n isDisabled={isDisabled}\n className={clsx(styles.inputGroup)}\n >\n <ReactAriaControlledValueFix\n inputContext={Aria.InputContext}\n props={{ ...props, value }}\n >\n <Aria.Input ref={ref} className={styles.input} />\n </ReactAriaControlledValueFix>\n <Aria.Group className={styles.buttonContainer}>\n <TogglePasswordVisibilityButton\n className={styles.button}\n isVisible={isPasswordRevealed}\n isDisabled={isDisabled}\n onPress={togglePasswordVisibilityHandler}\n />\n <TunnelExit id=\"button\" />\n </Aria.Group>\n <ComplexityIndicator\n isEmptyValue={isEmptyValue}\n isLoading={isLoading}\n policyValidationResult={policyValidationResult}\n validationResultState={stateFromValidationResult}\n />\n </Aria.Group>\n {children}\n {isValidFromValidationResult && (\n <FieldDescription>{latestValidationErrorText}</FieldDescription>\n )}\n </PropsContextProvider>\n </FieldErrorCaptureContext>\n <FieldErrorView />\n </TunnelProvider>\n </Aria.TextField>\n );\n },\n);\n\nexport default PasswordCreationField;\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"PasswordCreationField.mjs","sources":["../../../../../../src/components/PasswordCreationField/PasswordCreationField.tsx"],"sourcesContent":["import {\n type PropsWithChildren,\n useState,\n type ClipboardEvent,\n useDeferredValue,\n useMemo,\n} from \"react\";\nimport {\n dynamic,\n type PropsContext,\n PropsContextProvider,\n} from \"@/lib/propsContext\";\nimport {\n flowComponent,\n type FlowComponentProps,\n} from \"@/lib/componentFactory/flowComponent\";\nimport styles from \"./PasswordCreationField.module.scss\";\nimport * as Aria from \"react-aria-components\";\nimport clsx from \"clsx\";\nimport { TunnelExit, TunnelProvider } from \"@mittwald/react-tunnel\";\nimport { type ActionFn } from \"@/components/Action\";\nimport getStateFromLatestPolicyValidationResult from \"@/components/PasswordCreationField/lib/getStateFromLatestPolicyValidationResult\";\nimport locales from \"./locales/*.locale.json\";\nimport generateValidationTranslation from \"@/components/PasswordCreationField/lib/generateValidationTranslation\";\nimport FieldDescription from \"@/components/FieldDescription\";\nimport ComplexityIndicator from \"@/components/PasswordCreationField/components/ComplexityIndicator/ComplexityIndicator\";\nimport { generatePassword } from \"@/components/PasswordCreationField/worker/generatePassword\";\nimport TogglePasswordVisibilityButton from \"@/components/PasswordCreationField/components/TogglePasswordVisibilityButton/TogglePasswordVisibilityButton\";\nimport { ReactAriaControlledValueFix } from \"@/lib/react/ReactAriaControlledValueFix\";\nimport { ValidationResultButton } from \"@/components/PasswordCreationField/components/ValidationResultButton/ValidationResultButton\";\nimport { PasswordGenerateButton } from \"@/components/PasswordCreationField/components/PasswordGenerateButton/PasswordGenerateButton\";\nimport { useLocalizedContextStringFormatter } from \"@/components/TranslationProvider/useLocalizedContextStringFormatter\";\nimport type {\n PolicyValidationResult,\n PolicyGenericDeclaration,\n RuleValidationResult,\n} from \"@/integrations/@mittwald/password-tools-js\";\nimport {\n defaultPasswordCreationPolicy,\n Policy,\n} from \"@/integrations/@mittwald/password-tools-js\";\nimport { usePolicyValidationResult } from \"@/components/PasswordCreationField/lib/usePolicyValidationResult\";\nimport { useManagedValue } from \"@/lib/hooks/useManagedValue\";\nimport { useFieldComponent } from \"@/lib/hooks/useFieldComponent\";\nimport { FieldError } from \"@/components/FieldError\";\n\nexport interface PasswordCreationFieldProps\n extends PropsWithChildren<\n Omit<Aria.TextFieldProps, \"children\" | \"value\" | \"defaultValue\"> &\n Partial<Pick<Aria.FieldErrorRenderProps, \"validationErrors\">>\n >,\n FlowComponentProps<HTMLInputElement> {\n value?: string;\n onValidationResult?: (result: { password: string; isValid: boolean }) => void;\n defaultValue?: string;\n placeholder?: string;\n validationPolicy?: PolicyGenericDeclaration;\n}\n\nexport interface ResolvedPolicyValidationResult\n extends Omit<PolicyValidationResult, \"isValid\"> {\n isValid: boolean | \"indeterminate\";\n ruleResults: RuleValidationResult[];\n}\n\n/** @flr-generate all */\nexport const PasswordCreationField = flowComponent(\n \"PasswordCreationField\",\n (props) => {\n const {\n children,\n className,\n ref,\n isDisabled,\n onValidationResult,\n isInvalid: invalidFromProps,\n validationPolicy:\n validationPolicyFromProps = defaultPasswordCreationPolicy,\n isRequired,\n ...rest\n } = props;\n\n const {\n FieldErrorView,\n FieldErrorCaptureContext,\n fieldProps,\n fieldPropsContext,\n } = useFieldComponent(props);\n\n const [isLoading, setIsLoading] = useState(false);\n const translate = useLocalizedContextStringFormatter(locales);\n\n const validationPolicy = useMemo(\n () => Policy.fromDeclaration(validationPolicyFromProps),\n [validationPolicyFromProps],\n );\n\n const { value, handleOnChange } = useManagedValue(props);\n const deferredValue = useDeferredValue(value);\n\n const [isPasswordRevealed, setIsPasswordRevealed] = useState(false);\n const initialPolicyValidationState: ResolvedPolicyValidationResult = {\n isValid: true,\n complexity: {\n min: validationPolicy.minComplexity,\n actual: 4,\n warning: null,\n },\n ruleResults: [],\n };\n\n const [policyValidationResult, setPolicyValidationResult] = useState(\n initialPolicyValidationState,\n );\n usePolicyValidationResult(\n validationPolicy,\n deferredValue,\n () => {\n if (isEmptyValue) {\n return;\n }\n\n setIsLoading(() => true);\n },\n ({ password, isValid, results }) => {\n if (isEmptyValue) {\n setPolicyValidationResult(() => ({\n ...results,\n isValid: true,\n }));\n return;\n }\n\n setIsLoading(() => false);\n setPolicyValidationResult(() => results);\n onValidationResult?.({ password, isValid });\n },\n );\n\n const isEmptyValue = !value;\n const stateFromValidationResult = getStateFromLatestPolicyValidationResult(\n isEmptyValue,\n policyValidationResult,\n );\n let latestValidationErrorText = undefined;\n if (stateFromValidationResult) {\n const [translationKey, translationValues] = generateValidationTranslation(\n stateFromValidationResult,\n );\n latestValidationErrorText = translate.format(\n translationKey,\n translationValues,\n );\n }\n\n const isValidFromValidationResult =\n !isEmptyValue && stateFromValidationResult?.isValid;\n const isInvalidFromValidationResult =\n !isEmptyValue && !stateFromValidationResult?.isValid;\n const isInvalid = invalidFromProps || isInvalidFromValidationResult;\n\n const setOptimisticPolicyValidationResult = (\n state: Partial<ResolvedPolicyValidationResult> = {},\n ) => {\n setIsLoading(() => false);\n setPolicyValidationResult(() => ({\n ...initialPolicyValidationState,\n ...state,\n isValid: true,\n }));\n };\n\n const onPasswordGenerateHandler: ActionFn = async () => {\n const generatedPassword = await generatePassword(validationPolicy);\n setOptimisticPolicyValidationResult();\n setIsPasswordRevealed(true);\n handleOnChange(generatedPassword);\n };\n\n const onPasswordPasteHandler = (event: ClipboardEvent) => {\n const pastedValue = event.clipboardData.getData(\"text\");\n if (pastedValue !== value) {\n setOptimisticPolicyValidationResult({\n isValid: \"indeterminate\",\n });\n }\n };\n\n const togglePasswordVisibilityHandler = () => {\n setIsPasswordRevealed((old) => !old);\n };\n\n const propsContext: PropsContext = {\n ...fieldPropsContext,\n Button: {\n tunnelId: \"button\",\n size: \"m\",\n variant: \"plain\",\n color: \"secondary\",\n isDisabled: isDisabled,\n className: styles.button,\n },\n CopyButton: {\n tunnelId: \"button\",\n size: \"m\",\n variant: \"plain\",\n color: \"secondary\",\n isDisabled: isDisabled,\n className: styles.button,\n text: value,\n },\n Label: {\n ...fieldPropsContext.Label,\n tunnelId: \"label\",\n children: dynamic((localProps) => {\n return (\n <>\n {localProps.children}\n <PasswordGenerateButton\n isDisabled={isDisabled}\n onGeneratePasswordAction={onPasswordGenerateHandler}\n />\n <ValidationResultButton\n isEmptyValue={isEmptyValue}\n isDisabled={isDisabled}\n policyValidationResult={policyValidationResult}\n />\n </>\n );\n }),\n },\n };\n\n return (\n <Aria.TextField\n {...rest}\n value={value}\n type={isPasswordRevealed ? \"text\" : \"password\"}\n onChange={handleOnChange}\n onPaste={onPasswordPasteHandler}\n className={clsx(className, fieldProps.className)}\n isDisabled={isDisabled}\n isInvalid={isInvalid}\n isRequired={isRequired}\n >\n <TunnelProvider>\n <FieldErrorCaptureContext>\n <FieldError>{latestValidationErrorText}</FieldError>\n <PropsContextProvider\n props={propsContext}\n dependencies={[\n isDisabled,\n isRequired,\n value,\n policyValidationResult,\n ]}\n >\n <TunnelExit id=\"label\" />\n <Aria.Group\n isDisabled={isDisabled}\n className={clsx(styles.inputGroup)}\n >\n <ReactAriaControlledValueFix\n inputContext={Aria.InputContext}\n props={{ ...props, value }}\n >\n <Aria.Input ref={ref} className={styles.input} />\n </ReactAriaControlledValueFix>\n <Aria.Group className={styles.buttonContainer}>\n <TogglePasswordVisibilityButton\n className={styles.button}\n isVisible={isPasswordRevealed}\n isDisabled={isDisabled}\n onPress={togglePasswordVisibilityHandler}\n />\n <TunnelExit id=\"button\" />\n </Aria.Group>\n <ComplexityIndicator\n isEmptyValue={isEmptyValue}\n isLoading={isLoading}\n policyValidationResult={policyValidationResult}\n validationResultState={stateFromValidationResult}\n />\n </Aria.Group>\n {children}\n {isValidFromValidationResult && (\n <FieldDescription>{latestValidationErrorText}</FieldDescription>\n )}\n </PropsContextProvider>\n </FieldErrorCaptureContext>\n <FieldErrorView />\n </TunnelProvider>\n </Aria.TextField>\n );\n },\n);\n\nexport default PasswordCreationField;\n"],"names":[],"mappings":"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"}
|
|
@@ -2,7 +2,6 @@
|
|
|
2
2
|
/* */
|
|
3
3
|
import '../../../integrations/@mittwald/password-tools-js/defaultPasswordCreationPolicy.mjs';
|
|
4
4
|
import '@mittwald/password-tools-js/policy';
|
|
5
|
-
import 'remeda';
|
|
6
5
|
import 'react';
|
|
7
6
|
import { RuleType } from '@mittwald/password-tools-js/rules';
|
|
8
7
|
import '@mittwald/password-tools-js/generator';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"generateValidationTranslation.mjs","sources":["../../../../../../../src/components/PasswordCreationField/lib/generateValidationTranslation.ts"],"sourcesContent":["import {\n RuleType,\n type RuleValidationResult,\n} from \"@/integrations/@mittwald/password-tools-js\";\n\nconst generateTranslationString = (\n rule: Partial<RuleValidationResult> & { translationKey?: string },\n shortVersion = false,\n): string => {\n if (rule.translationKey) {\n return `validation.${rule.translationKey}`;\n }\n const translateString = `validation.${rule.ruleType ?? \"general\"}`;\n let finalTranslationString = \"\";\n\n if (\n (\"min\" in rule && rule.min !== undefined) ||\n (\"max\" in rule && rule.max !== undefined)\n ) {\n const breakingBoundaryProperty = rule.failingBoundary\n ? rule.failingBoundary\n : rule.min\n ? \"min\"\n : \"max\";\n\n if (rule.identifier) {\n finalTranslationString = `${translateString}.${rule.identifier}.${breakingBoundaryProperty}`;\n } else {\n finalTranslationString = `${translateString}.${breakingBoundaryProperty}`;\n }\n } else if (rule.identifier) {\n finalTranslationString = `${translateString}.${rule.identifier}`;\n } else {\n finalTranslationString = translateString;\n }\n\n return shortVersion\n ? `${finalTranslationString}.short`\n : finalTranslationString;\n};\n\nexport const generateValidationTranslation = (\n r: Partial<RuleValidationResult>,\n shotVersion = false,\n): [string, Record<string, string | number | boolean> | undefined] => {\n const translationKey = generateTranslationString(r, shotVersion);\n\n if (r.ruleType === RuleType.char && r.chars) {\n return [\n translationKey,\n { ...r, chars: r.chars.map((c) => c.char).join(\"\") },\n ];\n }\n\n return [\n translationKey,\n r as unknown as Record<string, string | number | boolean> | undefined,\n ];\n};\n\nexport default generateValidationTranslation;\n"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"generateValidationTranslation.mjs","sources":["../../../../../../../src/components/PasswordCreationField/lib/generateValidationTranslation.ts"],"sourcesContent":["import {\n RuleType,\n type RuleValidationResult,\n} from \"@/integrations/@mittwald/password-tools-js\";\n\nconst generateTranslationString = (\n rule: Partial<RuleValidationResult> & { translationKey?: string },\n shortVersion = false,\n): string => {\n if (rule.translationKey) {\n return `validation.${rule.translationKey}`;\n }\n const translateString = `validation.${rule.ruleType ?? \"general\"}`;\n let finalTranslationString = \"\";\n\n if (\n (\"min\" in rule && rule.min !== undefined) ||\n (\"max\" in rule && rule.max !== undefined)\n ) {\n const breakingBoundaryProperty = rule.failingBoundary\n ? rule.failingBoundary\n : rule.min\n ? \"min\"\n : \"max\";\n\n if (rule.identifier) {\n finalTranslationString = `${translateString}.${rule.identifier}.${breakingBoundaryProperty}`;\n } else {\n finalTranslationString = `${translateString}.${breakingBoundaryProperty}`;\n }\n } else if (rule.identifier) {\n finalTranslationString = `${translateString}.${rule.identifier}`;\n } else {\n finalTranslationString = translateString;\n }\n\n return shortVersion\n ? `${finalTranslationString}.short`\n : finalTranslationString;\n};\n\nexport const generateValidationTranslation = (\n r: Partial<RuleValidationResult>,\n shotVersion = false,\n): [string, Record<string, string | number | boolean> | undefined] => {\n const translationKey = generateTranslationString(r, shotVersion);\n\n if (r.ruleType === RuleType.char && r.chars) {\n return [\n translationKey,\n { ...r, chars: r.chars.map((c) => c.char).join(\"\") },\n ];\n }\n\n return [\n translationKey,\n r as unknown as Record<string, string | number | boolean> | undefined,\n ];\n};\n\nexport default generateValidationTranslation;\n"],"names":[],"mappings":";;;;;;AAKA,MAAM,yBAAA,GAA4B,CAChC,IAAA,EACA,YAAA,GAAe,KAAA,KACJ;AACX,EAAA,IAAI,KAAK,cAAA,EAAgB;AACvB,IAAA,OAAO,CAAA,WAAA,EAAc,KAAK,cAAc,CAAA,CAAA;AAAA,EAC1C;AACA,EAAA,MAAM,eAAA,GAAkB,CAAA,WAAA,EAAc,IAAA,CAAK,QAAA,IAAY,SAAS,CAAA,CAAA;AAChE,EAAA,IAAI,sBAAA,GAAyB,EAAA;AAE7B,EAAA,IACG,KAAA,IAAS,QAAQ,IAAA,CAAK,GAAA,KAAQ,UAC9B,KAAA,IAAS,IAAA,IAAQ,IAAA,CAAK,GAAA,KAAQ,MAAA,EAC/B;AACA,IAAA,MAAM,2BAA2B,IAAA,CAAK,eAAA,GAClC,KAAK,eAAA,GACL,IAAA,CAAK,MACH,KAAA,GACA,KAAA;AAEN,IAAA,IAAI,KAAK,UAAA,EAAY;AACnB,MAAA,sBAAA,GAAyB,GAAG,eAAe,CAAA,CAAA,EAAI,IAAA,CAAK,UAAU,IAAI,wBAAwB,CAAA,CAAA;AAAA,IAC5F,CAAA,MAAO;AACL,MAAA,sBAAA,GAAyB,CAAA,EAAG,eAAe,CAAA,CAAA,EAAI,wBAAwB,CAAA,CAAA;AAAA,IACzE;AAAA,EACF,CAAA,MAAA,IAAW,KAAK,UAAA,EAAY;AAC1B,IAAA,sBAAA,GAAyB,CAAA,EAAG,eAAe,CAAA,CAAA,EAAI,IAAA,CAAK,UAAU,CAAA,CAAA;AAAA,EAChE,CAAA,MAAO;AACL,IAAA,sBAAA,GAAyB,eAAA;AAAA,EAC3B;AAEA,EAAA,OAAO,YAAA,GACH,CAAA,EAAG,sBAAsB,CAAA,MAAA,CAAA,GACzB,sBAAA;AACN,CAAA;AAEO,MAAM,6BAAA,GAAgC,CAC3C,CAAA,EACA,WAAA,GAAc,KAAA,KACsD;AACpE,EAAA,MAAM,cAAA,GAAiB,yBAAA,CAA0B,CAAA,EAAG,WAAW,CAAA;AAE/D,EAAA,IAAI,CAAA,CAAE,QAAA,KAAa,QAAA,CAAS,IAAA,IAAQ,EAAE,KAAA,EAAO;AAC3C,IAAA,OAAO;AAAA,MACL,cAAA;AAAA,MACA,EAAE,GAAG,CAAA,EAAG,KAAA,EAAO,EAAE,KAAA,CAAM,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,IAAI,CAAA,CAAE,IAAA,CAAK,EAAE,CAAA;AAAE,KACrD;AAAA,EACF;AAEA,EAAA,OAAO;AAAA,IACL,cAAA;AAAA,IACA;AAAA,GACF;AACF;;;;"}
|
|
@@ -2,7 +2,6 @@
|
|
|
2
2
|
/* */
|
|
3
3
|
import '../../../integrations/@mittwald/password-tools-js/defaultPasswordCreationPolicy.mjs';
|
|
4
4
|
import '@mittwald/password-tools-js/policy';
|
|
5
|
-
import 'remeda';
|
|
6
5
|
import 'react';
|
|
7
6
|
import '@mittwald/password-tools-js/rules';
|
|
8
7
|
import '@mittwald/password-tools-js/generator';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"getStateFromLatestPolicyValidationResult.mjs","sources":["../../../../../../../src/components/PasswordCreationField/lib/getStateFromLatestPolicyValidationResult.ts"],"sourcesContent":["import { type RuleValidationResult } from \"@/integrations/@mittwald/password-tools-js\";\nimport type { ResolvedPolicyValidationResult } from \"@/components/PasswordCreationField/PasswordCreationField\";\n\nexport type StateFromLatestPolicyValidationResult =\n | undefined\n | Partial<RuleValidationResult>;\n\n/** @internal */\nexport const getStateFromLatestPolicyValidationResult = (\n isEmptyValue: boolean,\n result: ResolvedPolicyValidationResult,\n): StateFromLatestPolicyValidationResult => {\n if (result.ruleResults.length >= 1) {\n const failingRule = result.ruleResults.find((r) => !r.isValid);\n if (failingRule) {\n return failingRule;\n }\n }\n\n if (result.isValid === \"indeterminate\") {\n return undefined;\n }\n\n if (!isEmptyValue) {\n if (result.complexity.actual < result.complexity.min) {\n return {\n isValid: false,\n identifier: \"failingComplexity\",\n };\n }\n\n if (result.complexity.actual === result.complexity.min) {\n return {\n isValid: result.isValid,\n identifier: \"optimizeComplexity\",\n };\n }\n }\n\n return {\n isValid: true,\n identifier: \"securePassword\",\n };\n};\n\nexport default getStateFromLatestPolicyValidationResult;\n"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"getStateFromLatestPolicyValidationResult.mjs","sources":["../../../../../../../src/components/PasswordCreationField/lib/getStateFromLatestPolicyValidationResult.ts"],"sourcesContent":["import { type RuleValidationResult } from \"@/integrations/@mittwald/password-tools-js\";\nimport type { ResolvedPolicyValidationResult } from \"@/components/PasswordCreationField/PasswordCreationField\";\n\nexport type StateFromLatestPolicyValidationResult =\n | undefined\n | Partial<RuleValidationResult>;\n\n/** @internal */\nexport const getStateFromLatestPolicyValidationResult = (\n isEmptyValue: boolean,\n result: ResolvedPolicyValidationResult,\n): StateFromLatestPolicyValidationResult => {\n if (result.ruleResults.length >= 1) {\n const failingRule = result.ruleResults.find((r) => !r.isValid);\n if (failingRule) {\n return failingRule;\n }\n }\n\n if (result.isValid === \"indeterminate\") {\n return undefined;\n }\n\n if (!isEmptyValue) {\n if (result.complexity.actual < result.complexity.min) {\n return {\n isValid: false,\n identifier: \"failingComplexity\",\n };\n }\n\n if (result.complexity.actual === result.complexity.min) {\n return {\n isValid: result.isValid,\n identifier: \"optimizeComplexity\",\n };\n }\n }\n\n return {\n isValid: true,\n identifier: \"securePassword\",\n };\n};\n\nexport default getStateFromLatestPolicyValidationResult;\n"],"names":[],"mappings":";;;;;;AAQO,MAAM,wCAAA,GAA2C,CACtD,YAAA,EACA,MAAA,KAC0C;AAC1C,EAAA,IAAI,MAAA,CAAO,WAAA,CAAY,MAAA,IAAU,CAAA,EAAG;AAClC,IAAA,MAAM,WAAA,GAAc,OAAO,WAAA,CAAY,IAAA,CAAK,CAAC,CAAA,KAAM,CAAC,EAAE,OAAO,CAAA;AAC7D,IAAA,IAAI,WAAA,EAAa;AACf,MAAA,OAAO,WAAA;AAAA,IACT;AAAA,EACF;AAEA,EAAA,IAAI,MAAA,CAAO,YAAY,eAAA,EAAiB;AACtC,IAAA,OAAO,MAAA;AAAA,EACT;AAEA,EAAA,IAAI,CAAC,YAAA,EAAc;AACjB,IAAA,IAAI,MAAA,CAAO,UAAA,CAAW,MAAA,GAAS,MAAA,CAAO,WAAW,GAAA,EAAK;AACpD,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,KAAA;AAAA,QACT,UAAA,EAAY;AAAA,OACd;AAAA,IACF;AAEA,IAAA,IAAI,MAAA,CAAO,UAAA,CAAW,MAAA,KAAW,MAAA,CAAO,WAAW,GAAA,EAAK;AACtD,MAAA,OAAO;AAAA,QACL,SAAS,MAAA,CAAO,OAAA;AAAA,QAChB,UAAA,EAAY;AAAA,OACd;AAAA,IACF;AAAA,EACF;AAEA,EAAA,OAAO;AAAA,IACL,OAAA,EAAS,IAAA;AAAA,IACT,UAAA,EAAY;AAAA,GACd;AACF;;;;"}
|
|
@@ -2,7 +2,6 @@
|
|
|
2
2
|
/* */
|
|
3
3
|
import '../../../integrations/@mittwald/password-tools-js/defaultPasswordCreationPolicy.mjs';
|
|
4
4
|
import '@mittwald/password-tools-js/policy';
|
|
5
|
-
import 'remeda';
|
|
6
5
|
import 'react';
|
|
7
6
|
import '@mittwald/password-tools-js/rules';
|
|
8
7
|
import { Generator } from '@mittwald/password-tools-js/generator';
|
package/dist/js/components/src/components/PasswordCreationField/worker/generatePassword.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"generatePassword.mjs","sources":["../../../../../../../src/components/PasswordCreationField/worker/generatePassword.ts"],"sourcesContent":["import {\n Generator,\n type Policy,\n} from \"@/integrations/@mittwald/password-tools-js\";\n\nexport const generatePassword = async (\n validationPolicy: Policy,\n): Promise<string> => {\n return new Generator(validationPolicy).generatePassword();\n};\n"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"generatePassword.mjs","sources":["../../../../../../../src/components/PasswordCreationField/worker/generatePassword.ts"],"sourcesContent":["import {\n Generator,\n type Policy,\n} from \"@/integrations/@mittwald/password-tools-js\";\n\nexport const generatePassword = async (\n validationPolicy: Policy,\n): Promise<string> => {\n return new Generator(validationPolicy).generatePassword();\n};\n"],"names":[],"mappings":";;;;;;AAKO,MAAM,gBAAA,GAAmB,OAC9B,gBAAA,KACoB;AACpB,EAAA,OAAO,IAAI,SAAA,CAAU,gBAAgB,CAAA,CAAE,gBAAA,EAAiB;AAC1D;;;;"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
"use client"
|
|
2
|
+
/* */
|
|
3
|
+
import { Policy } from '@mittwald/password-tools-js/policy';
|
|
4
|
+
import { defaultPasswordCreationPolicy } from './defaultPasswordCreationPolicy.mjs';
|
|
5
|
+
import { useMemo, useRef } from 'react';
|
|
6
|
+
import '@mittwald/password-tools-js/rules';
|
|
7
|
+
import '@mittwald/password-tools-js/generator';
|
|
8
|
+
|
|
9
|
+
const usePasswordCreationFieldValidation = (genericValidationPolicy = defaultPasswordCreationPolicy) => {
|
|
10
|
+
const validationPolicy = useMemo(
|
|
11
|
+
() => Policy.fromDeclaration(genericValidationPolicy),
|
|
12
|
+
[genericValidationPolicy]
|
|
13
|
+
);
|
|
14
|
+
const cache = useRef(null);
|
|
15
|
+
return async (value) => {
|
|
16
|
+
if (value === "") {
|
|
17
|
+
return;
|
|
18
|
+
}
|
|
19
|
+
if (cache.current?.password === value) {
|
|
20
|
+
return cache.current.isValid;
|
|
21
|
+
}
|
|
22
|
+
try {
|
|
23
|
+
const validationResult = await validationPolicy.validate(value);
|
|
24
|
+
const isValid = await validationResult.isValid;
|
|
25
|
+
cache.current = {
|
|
26
|
+
password: value,
|
|
27
|
+
isValid
|
|
28
|
+
};
|
|
29
|
+
return isValid;
|
|
30
|
+
} catch (ignoredError) {
|
|
31
|
+
return false;
|
|
32
|
+
}
|
|
33
|
+
};
|
|
34
|
+
};
|
|
35
|
+
const generatePasswordCreationFieldValidation = usePasswordCreationFieldValidation;
|
|
36
|
+
|
|
37
|
+
export { generatePasswordCreationFieldValidation, usePasswordCreationFieldValidation };
|
|
38
|
+
//# sourceMappingURL=usePasswordCreationFieldValidation.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"usePasswordCreationFieldValidation.mjs","sources":["../../../../../../../src/integrations/@mittwald/password-tools-js/usePasswordCreationFieldValidation.ts"],"sourcesContent":["import type { PolicyGenericDeclaration } from \"@mittwald/password-tools-js/policy\";\nimport { Policy } from \"@mittwald/password-tools-js/policy\";\nimport { defaultPasswordCreationPolicy } from \".\";\nimport { useMemo, useRef } from \"react\";\nimport type { Validate } from \"react-hook-form\";\n\nexport const usePasswordCreationFieldValidation = (\n genericValidationPolicy: PolicyGenericDeclaration = defaultPasswordCreationPolicy,\n): Validate<string, unknown> => {\n const validationPolicy = useMemo(\n () => Policy.fromDeclaration(genericValidationPolicy),\n [genericValidationPolicy],\n );\n\n const cache = useRef<{\n password: string;\n isValid: boolean;\n } | null>(null);\n\n return async (value) => {\n if (value === \"\") {\n return;\n }\n\n if (cache.current?.password === value) {\n return cache.current.isValid;\n }\n\n try {\n const validationResult = await validationPolicy.validate(value);\n const isValid = await validationResult.isValid;\n\n cache.current = {\n password: value,\n isValid,\n };\n return isValid;\n } catch (ignoredError) {\n return false;\n }\n };\n};\n\n/** @deprecated Use `usePasswordCreationFieldValidation` instead. */\nexport const generatePasswordCreationFieldValidation =\n usePasswordCreationFieldValidation;\n"],"names":[],"mappings":";;;;;;AAMO,MAAM,kCAAA,GAAqC,CAChD,uBAAA,GAAoD,6BAAA,KACtB;AAC9B,EAAA,MAAM,gBAAA,GAAmB,OAAA;AAAA,IACvB,MAAM,MAAA,CAAO,eAAA,CAAgB,uBAAuB,CAAA;AAAA,IACpD,CAAC,uBAAuB;AAAA,GAC1B;AAEA,EAAA,MAAM,KAAA,GAAQ,OAGJ,IAAI,CAAA;AAEd,EAAA,OAAO,OAAO,KAAA,KAAU;AACtB,IAAA,IAAI,UAAU,EAAA,EAAI;AAChB,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,KAAA,CAAM,OAAA,EAAS,QAAA,KAAa,KAAA,EAAO;AACrC,MAAA,OAAO,MAAM,OAAA,CAAQ,OAAA;AAAA,IACvB;AAEA,IAAA,IAAI;AACF,MAAA,MAAM,gBAAA,GAAmB,MAAM,gBAAA,CAAiB,QAAA,CAAS,KAAK,CAAA;AAC9D,MAAA,MAAM,OAAA,GAAU,MAAM,gBAAA,CAAiB,OAAA;AAEvC,MAAA,KAAA,CAAM,OAAA,GAAU;AAAA,QACd,QAAA,EAAU,KAAA;AAAA,QACV;AAAA,OACF;AACA,MAAA,OAAO,OAAA;AAAA,IACT,SAAS,YAAA,EAAc;AACrB,MAAA,OAAO,KAAA;AAAA,IACT;AAAA,EACF,CAAA;AACF;AAGO,MAAM,uCAAA,GACX;;;;"}
|
|
@@ -23,9 +23,8 @@ function Form(props) {
|
|
|
23
23
|
const FormViewComponent = useMemo(() => FormView, [formId]);
|
|
24
24
|
const formRef = useObjectRef(ref);
|
|
25
25
|
const submitButtonRef = useRef(null);
|
|
26
|
-
const submitHandlerResultRef = useRef(null);
|
|
27
26
|
const isReadOnly = isReadOnlyFromProps || readonlyContextState;
|
|
28
|
-
const { action, registerSubmitResult
|
|
27
|
+
const { action, registerSubmitResult } = useRegisterActionStateContext(form);
|
|
29
28
|
const handleOnSubmit = (e) => {
|
|
30
29
|
const { isSubmitting, isValidating } = form.control._formState;
|
|
31
30
|
const formEvent = e && "nativeEvent" in e ? e : void 0;
|
|
@@ -41,7 +40,6 @@ function Form(props) {
|
|
|
41
40
|
return result;
|
|
42
41
|
});
|
|
43
42
|
return submit(formEvent).finally(() => {
|
|
44
|
-
callAfterSubmitFunction(submitHandlerResultRef.current);
|
|
45
43
|
setReadOnlyContextState(false);
|
|
46
44
|
});
|
|
47
45
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Form.mjs","sources":["../../../../../../../../src/integrations/react-hook-form/components/Form/Form.tsx"],"sourcesContent":["import { FormContextProvider } from \"@/integrations/react-hook-form/components/context/formContext\";\nimport {\n type ComponentProps,\n type FormEvent,\n type FormEventHandler,\n type PropsWithChildren,\n type RefObject,\n useId,\n useMemo,\n
|
|
1
|
+
{"version":3,"file":"Form.mjs","sources":["../../../../../../../../src/integrations/react-hook-form/components/Form/Form.tsx"],"sourcesContent":["import { FormContextProvider } from \"@/integrations/react-hook-form/components/context/formContext\";\nimport {\n type ComponentProps,\n type FC,\n type FormEvent,\n type FormEventHandler,\n type PropsWithChildren,\n type RefObject,\n useId,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport type {\n FieldValues,\n SubmitHandler,\n UseFormReturn,\n} from \"react-hook-form\";\nimport { FormProvider as RhfFormContextProvider } from \"react-hook-form\";\nimport { useObjectRef } from \"@react-aria/utils\";\nimport { useRegisterActionStateContext } from \"@/integrations/react-hook-form/components/Form/lib/useRegisterActionStateContext\";\n\nexport type FormOnSubmitHandler<F extends FieldValues> = SubmitHandler<F>;\n\ntype FormComponentType = FC<\n PropsWithChildren<{\n id: string;\n onSubmit?: FormEventHandler | FormOnSubmitHandler<never>;\n ref?: RefObject<HTMLFormElement | null>;\n }>\n>;\n\nexport interface FormProps<F extends FieldValues>\n extends Omit<ComponentProps<\"form\">, \"onSubmit\">,\n PropsWithChildren {\n form: UseFormReturn<F>;\n onSubmit: FormOnSubmitHandler<F>;\n formComponent?: FC<Omit<FormComponentType, \"ref\">>;\n isReadOnly?: boolean;\n}\n\nconst DefaultFormComponent: FormComponentType = (p) => <form {...p} />;\n\nexport function Form<F extends FieldValues>(props: FormProps<F>) {\n const {\n form,\n children,\n onSubmit,\n formComponent: FormView = DefaultFormComponent,\n isReadOnly: isReadOnlyFromProps,\n ref,\n ...formProps\n } = props;\n\n const [readonlyContextState, setReadOnlyContextState] =\n useState(!!isReadOnlyFromProps);\n\n const formId = useId();\n const FormViewComponent = useMemo(() => FormView, [formId]);\n\n const formRef = useObjectRef(ref);\n const submitButtonRef = useRef<HTMLButtonElement>(null);\n\n const isReadOnly = isReadOnlyFromProps || readonlyContextState;\n const { action, registerSubmitResult } = useRegisterActionStateContext(form);\n\n const handleOnSubmit = (e?: FormEvent<HTMLFormElement> | F) => {\n const { isSubmitting, isValidating } = form.control._formState;\n const formEvent =\n e && \"nativeEvent\" in e ? (e as FormEvent<HTMLFormElement>) : undefined;\n\n formEvent?.stopPropagation();\n\n if (isSubmitting || isValidating) {\n formEvent?.preventDefault();\n return;\n }\n\n const submit = form.handleSubmit((values) => {\n setReadOnlyContextState(true);\n const result = onSubmit(values, formEvent);\n registerSubmitResult(result);\n return result;\n });\n\n return submit(formEvent).finally(() => {\n setReadOnlyContextState(false);\n });\n };\n\n return (\n <RhfFormContextProvider {...form}>\n <FormContextProvider\n value={{\n form,\n id: formId,\n isReadOnly,\n setReadOnly: setReadOnlyContextState,\n submit: handleOnSubmit,\n submitButtonRef: submitButtonRef,\n formActionModel: action,\n }}\n >\n <FormViewComponent\n {...formProps}\n ref={formRef}\n id={formId}\n onSubmit={handleOnSubmit}\n >\n {children}\n </FormViewComponent>\n </FormContextProvider>\n </RhfFormContextProvider>\n );\n}\n\nexport default Form;\n"],"names":["RhfFormContextProvider"],"mappings":";;;;;;;AAyCA,MAAM,uBAA0C,CAAC,CAAA,qBAAM,GAAA,CAAC,MAAA,EAAA,EAAM,GAAG,CAAA,EAAG,CAAA;AAE7D,SAAS,KAA4B,KAAA,EAAqB;AAC/D,EAAA,MAAM;AAAA,IACJ,IAAA;AAAA,IACA,QAAA;AAAA,IACA,QAAA;AAAA,IACA,eAAe,QAAA,GAAW,oBAAA;AAAA,IAC1B,UAAA,EAAY,mBAAA;AAAA,IACZ,GAAA;AAAA,IACA,GAAG;AAAA,GACL,GAAI,KAAA;AAEJ,EAAA,MAAM,CAAC,oBAAA,EAAsB,uBAAuB,IAClD,QAAA,CAAS,CAAC,CAAC,mBAAmB,CAAA;AAEhC,EAAA,MAAM,SAAS,KAAA,EAAM;AACrB,EAAA,MAAM,oBAAoB,OAAA,CAAQ,MAAM,QAAA,EAAU,CAAC,MAAM,CAAC,CAAA;AAE1D,EAAA,MAAM,OAAA,GAAU,aAAa,GAAG,CAAA;AAChC,EAAA,MAAM,eAAA,GAAkB,OAA0B,IAAI,CAAA;AAEtD,EAAA,MAAM,aAAa,mBAAA,IAAuB,oBAAA;AAC1C,EAAA,MAAM,EAAE,MAAA,EAAQ,oBAAA,EAAqB,GAAI,8BAA8B,IAAI,CAAA;AAE3E,EAAA,MAAM,cAAA,GAAiB,CAAC,CAAA,KAAuC;AAC7D,IAAA,MAAM,EAAE,YAAA,EAAc,YAAA,EAAa,GAAI,KAAK,OAAA,CAAQ,UAAA;AACpD,IAAA,MAAM,SAAA,GACJ,CAAA,IAAK,aAAA,IAAiB,CAAA,GAAK,CAAA,GAAmC,MAAA;AAEhE,IAAA,SAAA,EAAW,eAAA,EAAgB;AAE3B,IAAA,IAAI,gBAAgB,YAAA,EAAc;AAChC,MAAA,SAAA,EAAW,cAAA,EAAe;AAC1B,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,YAAA,CAAa,CAAC,MAAA,KAAW;AAC3C,MAAA,uBAAA,CAAwB,IAAI,CAAA;AAC5B,MAAA,MAAM,MAAA,GAAS,QAAA,CAAS,MAAA,EAAQ,SAAS,CAAA;AACzC,MAAA,oBAAA,CAAqB,MAAM,CAAA;AAC3B,MAAA,OAAO,MAAA;AAAA,IACT,CAAC,CAAA;AAED,IAAA,OAAO,MAAA,CAAO,SAAS,CAAA,CAAE,OAAA,CAAQ,MAAM;AACrC,MAAA,uBAAA,CAAwB,KAAK,CAAA;AAAA,IAC/B,CAAC,CAAA;AAAA,EACH,CAAA;AAEA,EAAA,uBACE,GAAA,CAACA,YAAA,EAAA,EAAwB,GAAG,IAAA,EAC1B,QAAA,kBAAA,GAAA;AAAA,IAAC,mBAAA;AAAA,IAAA;AAAA,MACC,KAAA,EAAO;AAAA,QACL,IAAA;AAAA,QACA,EAAA,EAAI,MAAA;AAAA,QACJ,UAAA;AAAA,QACA,WAAA,EAAa,uBAAA;AAAA,QACb,MAAA,EAAQ,cAAA;AAAA,QACR,eAAA;AAAA,QACA,eAAA,EAAiB;AAAA,OACnB;AAAA,MAEA,QAAA,kBAAA,GAAA;AAAA,QAAC,iBAAA;AAAA,QAAA;AAAA,UACE,GAAG,SAAA;AAAA,UACJ,GAAA,EAAK,OAAA;AAAA,UACL,EAAA,EAAI,MAAA;AAAA,UACJ,QAAA,EAAU,cAAA;AAAA,UAET;AAAA;AAAA;AACH;AAAA,GACF,EACF,CAAA;AAEJ;;;;"}
|
|
@@ -20,14 +20,20 @@ const useRegisterActionStateContext = (form) => {
|
|
|
20
20
|
const action = ActionModel.useNew({});
|
|
21
21
|
const trackedSubmitCount = useRef(0);
|
|
22
22
|
const submitHandlerResultRef = useRef(null);
|
|
23
|
+
const currentActionState = action.state.useValue();
|
|
24
|
+
const lastActionState = useRef(currentActionState);
|
|
25
|
+
useEffect(() => {
|
|
26
|
+
if (currentActionState === "isIdle" && lastActionState.current === "isSucceeded") {
|
|
27
|
+
callAfterSubmitFunction(submitHandlerResultRef.current);
|
|
28
|
+
}
|
|
29
|
+
lastActionState.current = currentActionState;
|
|
30
|
+
}, [currentActionState]);
|
|
23
31
|
useEffect(() => {
|
|
24
32
|
return form.subscribe({
|
|
25
33
|
formState: {
|
|
26
|
-
errors: true
|
|
27
|
-
isValid: true
|
|
34
|
+
errors: true
|
|
28
35
|
},
|
|
29
36
|
callback: ({
|
|
30
|
-
isValid,
|
|
31
37
|
isSubmitted = false,
|
|
32
38
|
isSubmitSuccessful = false,
|
|
33
39
|
submitCount = 0,
|
|
@@ -43,9 +49,6 @@ const useRegisterActionStateContext = (form) => {
|
|
|
43
49
|
if (isSubmitted) {
|
|
44
50
|
if (isSubmitSuccessful) {
|
|
45
51
|
void action.state.onSucceeded();
|
|
46
|
-
if (isValid) {
|
|
47
|
-
callAfterSubmitFunction(submitHandlerResultRef.current);
|
|
48
|
-
}
|
|
49
52
|
} else {
|
|
50
53
|
const hasFailedWithError = isSubmitted && errors && Object.entries(errors).length > 0 ? errors : void 0;
|
|
51
54
|
void action.state.onFailed(hasFailedWithError);
|
|
@@ -53,7 +56,7 @@ const useRegisterActionStateContext = (form) => {
|
|
|
53
56
|
}
|
|
54
57
|
}
|
|
55
58
|
});
|
|
56
|
-
}, [form.subscribe
|
|
59
|
+
}, [form.subscribe]);
|
|
57
60
|
const registerSubmitResult = (result) => {
|
|
58
61
|
if (isPromise(result)) {
|
|
59
62
|
void action.state.onAsyncStart();
|
|
@@ -66,8 +69,7 @@ const useRegisterActionStateContext = (form) => {
|
|
|
66
69
|
};
|
|
67
70
|
return {
|
|
68
71
|
action,
|
|
69
|
-
registerSubmitResult
|
|
70
|
-
callAfterSubmitFunction
|
|
72
|
+
registerSubmitResult
|
|
71
73
|
};
|
|
72
74
|
};
|
|
73
75
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useRegisterActionStateContext.mjs","sources":["../../../../../../../../../src/integrations/react-hook-form/components/Form/lib/useRegisterActionStateContext.ts"],"sourcesContent":["import { ActionModel } from \"@/components/Action/models/ActionModel\";\nimport { useEffect, useRef } from \"react\";\nimport { isPromise } from \"remeda\";\nimport type { FieldValues, UseFormReturn } from \"react-hook-form\";\n\nconst callAfterSubmitFunction = (result: unknown) => {\n const callFn = (something: unknown) => {\n if (typeof something === \"function\") {\n something();\n }\n };\n\n if (result instanceof Promise) {\n result.then(callFn);\n } else {\n callFn(result);\n }\n};\n\nexport const useRegisterActionStateContext = <T extends FieldValues>(\n form: UseFormReturn<T>,\n) => {\n const action = ActionModel.useNew({});\n const trackedSubmitCount = useRef(0);\n const submitHandlerResultRef = useRef<unknown>(null);\n\n useEffect(() => {\n return form.subscribe({\n formState: {\n errors: true,\n
|
|
1
|
+
{"version":3,"file":"useRegisterActionStateContext.mjs","sources":["../../../../../../../../../src/integrations/react-hook-form/components/Form/lib/useRegisterActionStateContext.ts"],"sourcesContent":["import { ActionModel } from \"@/components/Action/models/ActionModel\";\nimport { useEffect, useRef } from \"react\";\nimport { isPromise } from \"remeda\";\nimport type { FieldValues, UseFormReturn } from \"react-hook-form\";\n\nconst callAfterSubmitFunction = (result: unknown) => {\n const callFn = (something: unknown) => {\n if (typeof something === \"function\") {\n something();\n }\n };\n\n if (result instanceof Promise) {\n result.then(callFn);\n } else {\n callFn(result);\n }\n};\n\nexport const useRegisterActionStateContext = <T extends FieldValues>(\n form: UseFormReturn<T>,\n) => {\n const action = ActionModel.useNew({});\n const trackedSubmitCount = useRef(0);\n const submitHandlerResultRef = useRef<unknown>(null);\n\n const currentActionState = action.state.useValue();\n const lastActionState = useRef<string>(currentActionState);\n\n useEffect(() => {\n if (\n currentActionState === \"isIdle\" &&\n lastActionState.current === \"isSucceeded\"\n ) {\n callAfterSubmitFunction(submitHandlerResultRef.current);\n }\n lastActionState.current = currentActionState;\n }, [currentActionState]);\n\n useEffect(() => {\n return form.subscribe({\n formState: {\n errors: true,\n },\n callback: ({\n isSubmitted = false,\n isSubmitSuccessful = false,\n submitCount = 0,\n errors,\n }) => {\n if (submitCount === 0 && trackedSubmitCount.current > 0) {\n trackedSubmitCount.current = 0;\n }\n\n if (trackedSubmitCount.current === submitCount) {\n return;\n }\n trackedSubmitCount.current = submitCount;\n\n if (isSubmitted) {\n if (isSubmitSuccessful) {\n void action.state.onSucceeded();\n } else {\n const hasFailedWithError =\n isSubmitted && errors && Object.entries(errors).length > 0\n ? errors\n : undefined;\n\n void action.state.onFailed(hasFailedWithError);\n }\n }\n },\n });\n }, [form.subscribe]);\n\n const registerSubmitResult = (result: unknown) => {\n if (isPromise(result)) {\n void action.state.onAsyncStart();\n result.then((submitResult) => {\n submitHandlerResultRef.current = submitResult;\n });\n } else {\n submitHandlerResultRef.current = result;\n }\n };\n\n return {\n action,\n registerSubmitResult,\n } as const;\n};\n"],"names":[],"mappings":"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"}
|
package/dist/js/components/src/integrations/react-hook-form/components/SubmitButton/SubmitButton.mjs
CHANGED
|
@@ -23,35 +23,41 @@ import '../ResetButton/ResetButton.mjs';
|
|
|
23
23
|
import { Action } from '../../../../components/Action/Action.mjs';
|
|
24
24
|
import '@react-aria/live-announcer';
|
|
25
25
|
|
|
26
|
-
const SubmitButton = flowComponent(
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
submitButtonRefFromProps
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
{
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
}
|
|
26
|
+
const SubmitButton = flowComponent(
|
|
27
|
+
"SubmitButton",
|
|
28
|
+
(props) => {
|
|
29
|
+
const {
|
|
30
|
+
children,
|
|
31
|
+
ref,
|
|
32
|
+
buttonComponent: ButtonComponent = Button,
|
|
33
|
+
...rest
|
|
34
|
+
} = props;
|
|
35
|
+
const {
|
|
36
|
+
id: formId = props.form,
|
|
37
|
+
formActionModel,
|
|
38
|
+
submitButtonRef: submitButtonRefFromFormContext
|
|
39
|
+
} = useFormContext();
|
|
40
|
+
const ButtonViewComponent = useMemo(() => ButtonComponent, [formId]);
|
|
41
|
+
const submitButtonRefFromProps = useObjectRef(ref);
|
|
42
|
+
const submitButtonRef = useMergeRefs([
|
|
43
|
+
submitButtonRefFromProps,
|
|
44
|
+
submitButtonRefFromFormContext
|
|
45
|
+
]);
|
|
46
|
+
return /* @__PURE__ */ jsx(Action, { actionModel: formActionModel, children: /* @__PURE__ */ jsx(
|
|
47
|
+
ButtonViewComponent,
|
|
48
|
+
{
|
|
49
|
+
...rest,
|
|
50
|
+
ref: submitButtonRef,
|
|
51
|
+
type: "submit",
|
|
52
|
+
form: formId,
|
|
53
|
+
children
|
|
54
|
+
}
|
|
55
|
+
) });
|
|
56
|
+
},
|
|
57
|
+
{
|
|
58
|
+
type: "provider"
|
|
59
|
+
}
|
|
60
|
+
);
|
|
55
61
|
|
|
56
62
|
export { SubmitButton, SubmitButton as default };
|
|
57
63
|
//# sourceMappingURL=SubmitButton.mjs.map
|