@leav/ui 1.9.0-3dd39b32 → 1.9.0-860fe4a6

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.
Files changed (55) hide show
  1. package/dist/_gqlTypes/index.d.ts +100 -9
  2. package/dist/_gqlTypes/index.js +43 -8
  3. package/dist/_gqlTypes/index.js.map +1 -1
  4. package/dist/components/Explorer/Explorer.d.ts +2 -1
  5. package/dist/components/Explorer/Explorer.js +31 -13
  6. package/dist/components/Explorer/Explorer.js.map +1 -1
  7. package/dist/components/Explorer/_queries/useExplorerCountData.d.ts +16 -0
  8. package/dist/components/Explorer/_queries/useExplorerCountData.js +26 -0
  9. package/dist/components/Explorer/_queries/useExplorerCountData.js.map +1 -0
  10. package/dist/components/Explorer/_queries/useExplorerData.js +18 -20
  11. package/dist/components/Explorer/_queries/useExplorerData.js.map +1 -1
  12. package/dist/components/Explorer/actions-mass/ResultsCount.d.ts +10 -0
  13. package/dist/components/Explorer/actions-mass/ResultsCount.js +8 -0
  14. package/dist/components/Explorer/actions-mass/ResultsCount.js.map +1 -0
  15. package/dist/components/Explorer/actions-mass/edit-attribute/EditAttributeMassActionModal.js +1 -1
  16. package/dist/components/Explorer/actions-mass/edit-attribute/EditAttributeMassActionModal.js.map +1 -1
  17. package/dist/components/Explorer/actions-mass/edit-attribute/useCountValuesOccurrencesHook.d.ts +9 -2
  18. package/dist/components/Explorer/actions-mass/edit-attribute/useCountValuesOccurrencesHook.js +18 -4
  19. package/dist/components/Explorer/actions-mass/edit-attribute/useCountValuesOccurrencesHook.js.map +1 -1
  20. package/dist/components/Explorer/actions-mass/generate-previews/GeneratePreviewsModal.d.ts +10 -0
  21. package/dist/components/Explorer/actions-mass/generate-previews/GeneratePreviewsModal.js +69 -0
  22. package/dist/components/Explorer/actions-mass/generate-previews/GeneratePreviewsModal.js.map +1 -0
  23. package/dist/components/Explorer/actions-mass/generate-previews/useGetPreviewSizesData.d.ts +18 -0
  24. package/dist/components/Explorer/actions-mass/generate-previews/useGetPreviewSizesData.js +57 -0
  25. package/dist/components/Explorer/actions-mass/generate-previews/useGetPreviewSizesData.js.map +1 -0
  26. package/dist/components/Explorer/actions-mass/useGeneratePreviewsMassAction.d.ts +19 -0
  27. package/dist/components/Explorer/actions-mass/useGeneratePreviewsMassAction.js +94 -0
  28. package/dist/components/Explorer/actions-mass/useGeneratePreviewsMassAction.js.map +1 -0
  29. package/dist/components/Explorer/actions-mass/useMassActions.d.ts +5 -3
  30. package/dist/components/Explorer/actions-mass/useMassActions.js +19 -13
  31. package/dist/components/Explorer/actions-mass/useMassActions.js.map +1 -1
  32. package/dist/components/Explorer/actions-primary/useCreatePrimaryAction.d.ts +3 -1
  33. package/dist/components/Explorer/actions-primary/useCreatePrimaryAction.js +5 -1
  34. package/dist/components/Explorer/actions-primary/useCreatePrimaryAction.js.map +1 -1
  35. package/dist/components/Explorer/manage-view-settings/configure-display/view-type/SelectViewType.js +1 -1
  36. package/dist/components/Explorer/manage-view-settings/configure-display/view-type/SelectViewType.js.map +1 -1
  37. package/dist/components/RecordEdition/EditRecord/EditRecord.d.ts +1 -0
  38. package/dist/components/RecordEdition/EditRecord/EditRecord.js +3 -3
  39. package/dist/components/RecordEdition/EditRecord/EditRecord.js.map +1 -1
  40. package/dist/components/RecordEdition/EditRecordModal/EditRecordModal.js +2 -2
  41. package/dist/components/RecordEdition/EditRecordModal/EditRecordModal.js.map +1 -1
  42. package/dist/components/RecordEdition/EditRecordPage/EditRecordPage.d.ts +1 -0
  43. package/dist/components/RecordEdition/EditRecordPage/EditRecordPage.js +4 -4
  44. package/dist/components/RecordEdition/EditRecordPage/EditRecordPage.js.map +1 -1
  45. package/dist/components/RecordEdition/_types.d.ts +1 -1
  46. package/dist/components/RecordEdition/_types.js.map +1 -1
  47. package/dist/components/RecordEdition/hooks/useGetSubmitButtons.d.ts +1 -1
  48. package/dist/components/RecordEdition/hooks/useGetSubmitButtons.js +6 -2
  49. package/dist/components/RecordEdition/hooks/useGetSubmitButtons.js.map +1 -1
  50. package/dist/hooks/useIFrameMessenger/schema.d.ts +2 -2
  51. package/dist/hooks/useIFrameMessenger/schema.js +1 -1
  52. package/dist/hooks/useIFrameMessenger/schema.js.map +1 -1
  53. package/dist/locales/en/shared.json +11 -4
  54. package/dist/locales/fr/shared.json +11 -4
  55. package/package.json +9 -13
@@ -1 +1 @@
1
- {"version":3,"file":"useCountValuesOccurrencesHook.js","sourceRoot":"","sources":["../../../../../src/components/Explorer/actions-mass/edit-attribute/useCountValuesOccurrencesHook.tsx"],"names":[],"mappings":"AAAA,oFAAoF;AACpF,sCAAsC;AACtC,sEAAsE;AACtE,OAAO,EAGH,kCAAkC,GACrC,MAAM,eAAe,CAAC;AACvB,OAAO,EAAC,SAAS,EAAC,MAAM,OAAO,CAAC;AAMhC,MAAM,CAAC,MAAM,6BAA6B,GAAG,CAAC,EAC1C,WAAW,EACX,SAAS,EACT,aAAa,GAKhB,EAAqB,EAAE;IACpB,MAAM,CAAC,sBAAsB,EAAE,EAAC,IAAI,EAAE,iBAAiB,EAAE,OAAO,EAAC,CAAC,GAAG,kCAAkC,CAAC;QACpG,WAAW,EAAE,UAAU;QACvB,eAAe,EAAE,UAAU;KAC9B,CAAC,CAAC;IAEH,SAAS,CAAC,GAAG,EAAE;QACX,IAAI,WAAW,EAAE,CAAC;YACd,sBAAsB,CAAC;gBACnB,SAAS,EAAE;oBACP,SAAS,EAAE,WAAW;oBACtB,OAAO,EAAE,SAAS;oBAClB,aAAa;iBAChB;aACJ,CAAC,CAAC;QACP,CAAC;IACL,CAAC,EAAE,CAAC,WAAW,EAAE,SAAS,EAAE,aAAa,CAAC,CAAC,CAAC;IAE5C,OAAO;QACH,WAAW,EAAE,iBAAiB,EAAE,sBAAsB,EAAE,WAAW,IAAI,EAAE;QACzE,YAAY,EAAE,iBAAiB,EAAE,sBAAsB,EAAE,YAAY,IAAI,CAAC;QAC1E,OAAO;KACV,CAAC;AACN,CAAC,CAAC","sourcesContent":["// Copyright LEAV Solutions 2017 until 2023/11/05, Copyright Aristid from 2023/11/06\n// This file is released under LGPL V3\n// License text available at https://www.gnu.org/licenses/lgpl-3.0.txt\nimport {\n type CountValuesOccurrencesQuery,\n type RecordFilterInput,\n useCountValuesOccurrencesLazyQuery,\n} from '_ui/_gqlTypes';\nimport {useEffect} from 'react';\n\nexport type ValuesOccurrences = NonNullable<CountValuesOccurrencesQuery['countValuesOccurrences']> & {\n loading?: boolean;\n};\nexport type ValueOccurrence = ValuesOccurrences['occurrences'][0];\nexport const useCountValuesOccurrencesHook = ({\n attributeId,\n libraryId,\n recordFilters,\n}: {\n attributeId?: string;\n libraryId: string;\n recordFilters: RecordFilterInput[];\n}): ValuesOccurrences => {\n const [countValuesOccurrences, {data: valuesOccurrences, loading}] = useCountValuesOccurrencesLazyQuery({\n fetchPolicy: 'no-cache',\n nextFetchPolicy: 'no-cache',\n });\n\n useEffect(() => {\n if (attributeId) {\n countValuesOccurrences({\n variables: {\n attribute: attributeId,\n library: libraryId,\n recordFilters,\n },\n });\n }\n }, [attributeId, libraryId, recordFilters]);\n\n return {\n occurrences: valuesOccurrences?.countValuesOccurrences?.occurrences || [],\n noValueCount: valuesOccurrences?.countValuesOccurrences?.noValueCount || 0,\n loading,\n };\n};\n"]}
1
+ {"version":3,"file":"useCountValuesOccurrencesHook.js","sourceRoot":"","sources":["../../../../../src/components/Explorer/actions-mass/edit-attribute/useCountValuesOccurrencesHook.tsx"],"names":[],"mappings":"AAAA,oFAAoF;AACpF,sCAAsC;AACtC,sEAAsE;AACtE,OAAO,EAAyB,kCAAkC,EAAC,MAAM,eAAe,CAAC;AACzF,OAAO,EAAC,SAAS,EAAE,OAAO,EAAC,MAAM,OAAO,CAAC;AAQzC,MAAM,CAAC,MAAM,6BAA6B,GAAG,CAAC,EAC1C,WAAW,EACX,SAAS,EACT,aAAa,GAKhB,EAAqB,EAAE;IACpB,MAAM,CAAC,sBAAsB,EAAE,EAAC,IAAI,EAAE,iBAAiB,EAAE,OAAO,EAAC,CAAC,GAAG,kCAAkC,CAAC;QACpG,WAAW,EAAE,UAAU;QACvB,eAAe,EAAE,UAAU;KAC9B,CAAC,CAAC;IAEH,SAAS,CAAC,GAAG,EAAE;QACX,IAAI,WAAW,EAAE,CAAC;YACd,sBAAsB,CAAC;gBACnB,SAAS,EAAE;oBACP,SAAS,EAAE,WAAW;oBACtB,OAAO,EAAE,SAAS;oBAClB,aAAa;iBAChB;aACJ,CAAC,CAAC;QACP,CAAC;IACL,CAAC,EAAE,CAAC,WAAW,EAAE,SAAS,EAAE,aAAa,CAAC,CAAC,CAAC;IAE5C,MAAM,YAAY,GAAG,OAAO,CAAC,GAAG,EAAE;QAC9B,IAAI,CAAC,iBAAiB,EAAE,CAAC;YACrB,OAAO,CAAC,CAAC;QACb,CAAC;QACD,OAAO,iBAAiB,CAAC,kBAAkB,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,UAAU,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,QAAQ,KAAK,IAAI,CAAC,EAAE,KAAK,IAAI,CAAC,CAAC;IAClH,CAAC,EAAE,CAAC,iBAAiB,CAAC,CAAC,CAAC;IAExB,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,EAAE;QAC7B,IAAI,CAAC,iBAAiB,EAAE,CAAC;YACrB,OAAO,EAAE,CAAC;QACd,CAAC;QACD,OAAO,CACH,iBAAiB,CAAC,kBAAkB;YAChC,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,UAAU,IAAI,CAAC,IAAI,CAAC,CAAC,QAAQ,KAAK,IAAI,CAAC;aACpD,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAC,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,EAAC,EAAE,EAAG,CAA8B,CAAC,QAAQ,CAAC,EAAE,EAAC,EAAC,CAAC,CAAC,IAAI,EAAE,CACpG,CAAC;IACN,CAAC,EAAE,CAAC,iBAAiB,CAAC,CAAC,CAAC;IAExB,OAAO;QACH,WAAW;QACX,YAAY;QACZ,OAAO;KACV,CAAC;AACN,CAAC,CAAC","sourcesContent":["// Copyright LEAV Solutions 2017 until 2023/11/05, Copyright Aristid from 2023/11/06\n// This file is released under LGPL V3\n// License text available at https://www.gnu.org/licenses/lgpl-3.0.txt\nimport {type RecordFilterInput, useCountValuesOccurrencesLazyQuery} from '_ui/_gqlTypes';\nimport {useEffect, useMemo} from 'react';\n\nexport type ValuesOccurrences = {\n noValueCount: number;\n occurrences: Array<{count: number; value: {id: string}}>;\n loading?: boolean;\n};\nexport type ValueOccurrence = ValuesOccurrences['occurrences'][0];\nexport const useCountValuesOccurrencesHook = ({\n attributeId,\n libraryId,\n recordFilters,\n}: {\n attributeId?: string;\n libraryId: string;\n recordFilters: RecordFilterInput[];\n}): ValuesOccurrences => {\n const [countValuesOccurrences, {data: valuesOccurrences, loading}] = useCountValuesOccurrencesLazyQuery({\n fetchPolicy: 'no-cache',\n nextFetchPolicy: 'no-cache',\n });\n\n useEffect(() => {\n if (attributeId) {\n countValuesOccurrences({\n variables: {\n attribute: attributeId,\n library: libraryId,\n recordFilters,\n },\n });\n }\n }, [attributeId, libraryId, recordFilters]);\n\n const noValueCount = useMemo(() => {\n if (!valuesOccurrences) {\n return 0;\n }\n return valuesOccurrences.listDistinctValues?.find(v => !('treeNode' in v) || v.treeNode === null)?.count || 0;\n }, [valuesOccurrences]);\n\n const occurrences = useMemo(() => {\n if (!valuesOccurrences) {\n return [];\n }\n return (\n valuesOccurrences.listDistinctValues\n ?.filter(v => 'treeNode' in v && v.treeNode !== null)\n .map(v => ({count: v.count, value: {id: (v as {treeNode: {id: string}}).treeNode.id}})) || []\n );\n }, [valuesOccurrences]);\n\n return {\n occurrences,\n noValueCount,\n loading,\n };\n};\n"]}
@@ -0,0 +1,10 @@
1
+ import { type Key } from 'react';
2
+ interface IGeneratePreviewsModalProps {
3
+ open: boolean;
4
+ libraryId: string;
5
+ isGeneratingPreviews: boolean;
6
+ onClose: () => void;
7
+ onConfirm: (previewSizes: Key[], isFailedOnly: boolean) => void;
8
+ }
9
+ export declare const GeneratePreviewsModal: ({ open, libraryId, isGeneratingPreviews, onClose, onConfirm, }: IGeneratePreviewsModalProps) => JSX.Element;
10
+ export {};
@@ -0,0 +1,69 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ // Copyright LEAV Solutions 2017 until 2023/11/05, Copyright Aristid from 2023/11/06
3
+ // This file is released under LGPL V3
4
+ // License text available at https://www.gnu.org/licenses/lgpl-3.0.txt
5
+ import { useState } from 'react';
6
+ import { KitButton, KitSpace, KitModal, KitTree, KitIdCard, KitSwitch, useKitTheme, KitLoader } from 'aristid-ds';
7
+ import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
8
+ import { faXmark, faCircleInfo, faCheck } from '@fortawesome/free-solid-svg-icons';
9
+ import { useSharedTranslation } from '../../../../hooks/useSharedTranslation';
10
+ import styled from 'styled-components';
11
+ import { ErrorDisplay } from '../../../../components/ErrorDisplay';
12
+ import { SELECT_ALL_KEY, useGetPreviewSizesData } from './useGetPreviewSizesData';
13
+ const StyledKitSpace = styled(KitSpace) `
14
+ width: 100%;
15
+ `;
16
+ const StyledKitTree = styled(KitTree) `
17
+ max-height: 448px;
18
+ overflow-y: auto;
19
+ `;
20
+ const SettingCard = styled.div `
21
+ padding: calc(var(--general-spacing-s) * 1px);
22
+ border-radius: calc(var(--general-border-radius-s) * 1px);
23
+ border: 1px solid var(--general-utilities-border);
24
+ background: var(--general-colors-neutral-grey-100);
25
+ `;
26
+ const SettingRow = styled.div `
27
+ display: flex;
28
+ align-items: center;
29
+ justify-content: space-between;
30
+ gap: calc(var(--general-spacing-s) * 1px);
31
+
32
+ > *:first-child {
33
+ flex: 1;
34
+ }
35
+ `;
36
+ export const GeneratePreviewsModal = ({ open, libraryId, isGeneratingPreviews, onClose, onConfirm, }) => {
37
+ const { t } = useSharedTranslation();
38
+ const { theme } = useKitTheme();
39
+ const [isFailedOnly, setIsFailedOnly] = useState(false);
40
+ const [checkedPreviewSizes, setCheckedPreviewSizes] = useState([]);
41
+ const { previewSizesTreeData, allPreviewSizes, loading: libraryPreviewsSettingsLoading, error: libraryPreviewsSettingsError, } = useGetPreviewSizesData(libraryId);
42
+ const _handleConfirm = () => {
43
+ onConfirm(checkedPreviewSizes, isFailedOnly);
44
+ onClose();
45
+ };
46
+ const _handleClose = () => {
47
+ onClose();
48
+ };
49
+ const _onPreviewSizesCheck = (checked, info) => {
50
+ if (info.node.key !== SELECT_ALL_KEY) {
51
+ setCheckedPreviewSizes(checked);
52
+ return;
53
+ }
54
+ if (info.checked) {
55
+ setCheckedPreviewSizes(allPreviewSizes);
56
+ }
57
+ else {
58
+ setCheckedPreviewSizes([]);
59
+ }
60
+ };
61
+ const canGeneratePreviews = checkedPreviewSizes.length > 0;
62
+ return (_jsxs(KitModal, { appElement: document.getElementById('root'), isOpen: open, close: _handleClose, title: t('explorer.generate_previews_modal.title'), width: "656px", height: "auto", closeIcon: _jsx(FontAwesomeIcon, { icon: faXmark }), showCloseIcon: true, destroyOnClose: true, footer: _jsxs(KitSpace, { children: [_jsx(KitButton, { size: "m", icon: _jsx(FontAwesomeIcon, { icon: faXmark }), onClick: _handleClose, children: t('global.cancel') }), _jsx(KitButton, { type: "primary", size: "m", disabled: !canGeneratePreviews, loading: isGeneratingPreviews, icon: _jsx(FontAwesomeIcon, { icon: faCheck }), onClick: _handleConfirm, children: t('explorer.generate_previews_modal.generate_button') })] }), children: [libraryPreviewsSettingsLoading && _jsx(KitLoader, {}), libraryPreviewsSettingsError && _jsx(ErrorDisplay, { message: libraryPreviewsSettingsError.message }), !libraryPreviewsSettingsLoading && !libraryPreviewsSettingsError && (_jsxs(StyledKitSpace, { direction: "vertical", size: "s", children: [_jsx(StyledKitTree, { checkable: true, onCheck: _onPreviewSizesCheck, selectable: false, checkStrictly: false, treeData: previewSizesTreeData, defaultExpandAll: true }), _jsx(SettingCard, { children: _jsxs(SettingRow, { children: [_jsx(KitIdCard, { avatarProps: {
63
+ shape: 'square',
64
+ title: 'test',
65
+ icon: (_jsx(FontAwesomeIcon, { icon: faCircleInfo, color: "var(--general-colors-neutral-white)" })),
66
+ color: theme.colors.secondary.warning[400], // We need to use the real hex color from the theme as css variables are not supported
67
+ }, title: t('files.conditional_processing'), description: t('files.previews_generation_failed_only') }), _jsx(KitSwitch, { checked: isFailedOnly, onChange: () => setIsFailedOnly(prev => !prev) })] }) })] }))] }));
68
+ };
69
+ //# sourceMappingURL=GeneratePreviewsModal.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GeneratePreviewsModal.js","sourceRoot":"","sources":["../../../../../src/components/Explorer/actions-mass/generate-previews/GeneratePreviewsModal.tsx"],"names":[],"mappings":"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","sourcesContent":["// Copyright LEAV Solutions 2017 until 2023/11/05, Copyright Aristid from 2023/11/06\n// This file is released under LGPL V3\n// License text available at https://www.gnu.org/licenses/lgpl-3.0.txt\nimport {type Key, useState, type ComponentProps, type FunctionComponent} from 'react';\nimport {KitButton, KitSpace, KitModal, KitTree, KitIdCard, KitSwitch, useKitTheme, KitLoader} from 'aristid-ds';\nimport {FontAwesomeIcon} from '@fortawesome/react-fontawesome';\nimport {faXmark, faCircleInfo, faCheck} from '@fortawesome/free-solid-svg-icons';\nimport {useSharedTranslation} from '_ui/hooks/useSharedTranslation';\nimport styled from 'styled-components';\nimport {ErrorDisplay} from '_ui/components/ErrorDisplay';\nimport {SELECT_ALL_KEY, useGetPreviewSizesData} from './useGetPreviewSizesData';\n\ninterface IGeneratePreviewsModalProps {\n open: boolean;\n libraryId: string;\n isGeneratingPreviews: boolean;\n onClose: () => void;\n onConfirm: (previewSizes: Key[], isFailedOnly: boolean) => void;\n}\n\nconst StyledKitSpace = styled(KitSpace)`\n width: 100%;\n`;\n\nconst StyledKitTree = styled(KitTree)`\n max-height: 448px;\n overflow-y: auto;\n`;\n\nconst SettingCard = styled.div`\n padding: calc(var(--general-spacing-s) * 1px);\n border-radius: calc(var(--general-border-radius-s) * 1px);\n border: 1px solid var(--general-utilities-border);\n background: var(--general-colors-neutral-grey-100);\n`;\n\nconst SettingRow = styled.div`\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: calc(var(--general-spacing-s) * 1px);\n\n > *:first-child {\n flex: 1;\n }\n`;\n\nexport const GeneratePreviewsModal = ({\n open,\n libraryId,\n isGeneratingPreviews,\n onClose,\n onConfirm,\n}: IGeneratePreviewsModalProps) => {\n const {t} = useSharedTranslation();\n const {theme} = useKitTheme();\n\n const [isFailedOnly, setIsFailedOnly] = useState(false);\n const [checkedPreviewSizes, setCheckedPreviewSizes] = useState<Key[]>([]);\n\n const {\n previewSizesTreeData,\n allPreviewSizes,\n loading: libraryPreviewsSettingsLoading,\n error: libraryPreviewsSettingsError,\n } = useGetPreviewSizesData(libraryId);\n\n const _handleConfirm = () => {\n onConfirm(checkedPreviewSizes, isFailedOnly);\n onClose();\n };\n\n const _handleClose = () => {\n onClose();\n };\n\n const _onPreviewSizesCheck: ComponentProps<typeof KitTree>['onCheck'] = (checked, info) => {\n if (info.node.key !== SELECT_ALL_KEY) {\n setCheckedPreviewSizes(checked as Key[]);\n return;\n }\n\n if (info.checked) {\n setCheckedPreviewSizes(allPreviewSizes);\n } else {\n setCheckedPreviewSizes([]);\n }\n };\n\n const canGeneratePreviews = checkedPreviewSizes.length > 0;\n\n return (\n <KitModal\n appElement={document.getElementById('root')}\n isOpen={open}\n close={_handleClose}\n title={t('explorer.generate_previews_modal.title')}\n width=\"656px\"\n height=\"auto\"\n closeIcon={<FontAwesomeIcon icon={faXmark} />}\n showCloseIcon\n destroyOnClose\n footer={\n <KitSpace>\n <KitButton size=\"m\" icon={<FontAwesomeIcon icon={faXmark} />} onClick={_handleClose}>\n {t('global.cancel')}\n </KitButton>\n <KitButton\n type=\"primary\"\n size=\"m\"\n disabled={!canGeneratePreviews}\n loading={isGeneratingPreviews}\n icon={<FontAwesomeIcon icon={faCheck} />}\n onClick={_handleConfirm}\n >\n {t('explorer.generate_previews_modal.generate_button')}\n </KitButton>\n </KitSpace>\n }\n >\n {libraryPreviewsSettingsLoading && <KitLoader />}\n {libraryPreviewsSettingsError && <ErrorDisplay message={libraryPreviewsSettingsError.message} />}\n {!libraryPreviewsSettingsLoading && !libraryPreviewsSettingsError && (\n <StyledKitSpace direction=\"vertical\" size=\"s\">\n <StyledKitTree\n checkable\n onCheck={_onPreviewSizesCheck}\n selectable={false}\n checkStrictly={false}\n treeData={previewSizesTreeData}\n defaultExpandAll\n />\n <SettingCard>\n <SettingRow>\n <KitIdCard\n avatarProps={{\n shape: 'square',\n title: 'test',\n icon: (\n <FontAwesomeIcon\n icon={faCircleInfo}\n color=\"var(--general-colors-neutral-white)\"\n />\n ),\n color: theme.colors.secondary.warning[400], // We need to use the real hex color from the theme as css variables are not supported\n }}\n title={t('files.conditional_processing')}\n description={t('files.previews_generation_failed_only')}\n />\n <KitSwitch checked={isFailedOnly} onChange={() => setIsFailedOnly(prev => !prev)} />\n </SettingRow>\n </SettingCard>\n </StyledKitSpace>\n )}\n </KitModal>\n );\n};\n"]}
@@ -0,0 +1,18 @@
1
+ export declare const SELECT_ALL_KEY = "select-all";
2
+ export type PreviewSizesTreeNode = {
3
+ title: string;
4
+ key: string;
5
+ children?: PreviewSizesTreeNode[];
6
+ };
7
+ interface IUseGetPreviewSizesDataReturn {
8
+ previewSizesTreeData: PreviewSizesTreeNode[];
9
+ allPreviewSizes: string[];
10
+ loading: boolean;
11
+ error: Error | undefined;
12
+ }
13
+ /**
14
+ * Hook that fetches library preview settings and transforms them into tree data
15
+ * for the preview sizes selection in the GeneratePreviewsModal
16
+ */
17
+ export declare const useGetPreviewSizesData: (libraryId: string) => IUseGetPreviewSizesDataReturn;
18
+ export {};
@@ -0,0 +1,57 @@
1
+ // Copyright LEAV Solutions 2017 until 2023/11/05, Copyright Aristid from 2023/11/06
2
+ // This file is released under LGPL V3
3
+ // License text available at https://www.gnu.org/licenses/lgpl-3.0.txt
4
+ import { useEffect, useState } from 'react';
5
+ import { useGetLibraryPreviewsSettingsQuery } from '../../../../_gqlTypes';
6
+ import { localizedTranslation } from '@leav/utils';
7
+ import { useLang } from '../../../../hooks';
8
+ import { useSharedTranslation } from '../../../../hooks/useSharedTranslation';
9
+ export const SELECT_ALL_KEY = 'select-all';
10
+ /**
11
+ * Hook that fetches library preview settings and transforms them into tree data
12
+ * for the preview sizes selection in the GeneratePreviewsModal
13
+ */
14
+ export const useGetPreviewSizesData = (libraryId) => {
15
+ const { t } = useSharedTranslation();
16
+ const { lang } = useLang();
17
+ const [previewSizesTreeData, setPreviewSizesTreeData] = useState([]);
18
+ const [allPreviewSizes, setAllPreviewSizes] = useState([]);
19
+ const { data: libraryPreviewsSettingsData, error: libraryPreviewsSettingsError, loading: libraryPreviewsSettingsLoading, } = useGetLibraryPreviewsSettingsQuery({
20
+ variables: {
21
+ id: libraryId,
22
+ },
23
+ });
24
+ useEffect(() => {
25
+ if (libraryPreviewsSettingsData?.libraries?.list) {
26
+ const selectAllPreviewSizesNode = {
27
+ title: t('files.previews_generation_select_all'),
28
+ key: SELECT_ALL_KEY,
29
+ };
30
+ const libraryPreviewSettings = libraryPreviewsSettingsData.libraries.list?.[0]?.previewsSettings || [];
31
+ const previewSizes = [];
32
+ const libraryPreviewSizesTreeData = libraryPreviewSettings.map(s => {
33
+ const children = s.versions.sizes.map(vs => ({ title: `${vs.name} (${vs.size}px)`, key: vs.name }));
34
+ previewSizes.push(...children.map(c => c.key));
35
+ return {
36
+ title: localizedTranslation(s.label, lang),
37
+ key: localizedTranslation(s.label, lang) + Math.random(),
38
+ children,
39
+ };
40
+ });
41
+ setPreviewSizesTreeData([
42
+ {
43
+ ...selectAllPreviewSizesNode,
44
+ children: libraryPreviewSizesTreeData,
45
+ },
46
+ ]);
47
+ setAllPreviewSizes(previewSizes);
48
+ }
49
+ }, [libraryPreviewsSettingsData, lang, t]);
50
+ return {
51
+ previewSizesTreeData,
52
+ allPreviewSizes,
53
+ loading: libraryPreviewsSettingsLoading,
54
+ error: libraryPreviewsSettingsError,
55
+ };
56
+ };
57
+ //# sourceMappingURL=useGetPreviewSizesData.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useGetPreviewSizesData.js","sourceRoot":"","sources":["../../../../../src/components/Explorer/actions-mass/generate-previews/useGetPreviewSizesData.ts"],"names":[],"mappings":"AAAA,oFAAoF;AACpF,sCAAsC;AACtC,sEAAsE;AACtE,OAAO,EAAC,SAAS,EAAE,QAAQ,EAAC,MAAM,OAAO,CAAC;AAC1C,OAAO,EAAC,kCAAkC,EAAC,MAAM,eAAe,CAAC;AACjE,OAAO,EAAC,oBAAoB,EAAC,MAAM,aAAa,CAAC;AACjD,OAAO,EAAC,OAAO,EAAC,MAAM,WAAW,CAAC;AAClC,OAAO,EAAC,oBAAoB,EAAC,MAAM,gCAAgC,CAAC;AAEpE,MAAM,CAAC,MAAM,cAAc,GAAG,YAAY,CAAC;AAe3C;;;GAGG;AACH,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAAC,SAAiB,EAAiC,EAAE;IACvF,MAAM,EAAC,CAAC,EAAC,GAAG,oBAAoB,EAAE,CAAC;IACnC,MAAM,EAAC,IAAI,EAAC,GAAG,OAAO,EAAE,CAAC;IAEzB,MAAM,CAAC,oBAAoB,EAAE,uBAAuB,CAAC,GAAG,QAAQ,CAAyB,EAAE,CAAC,CAAC;IAC7F,MAAM,CAAC,eAAe,EAAE,kBAAkB,CAAC,GAAG,QAAQ,CAAW,EAAE,CAAC,CAAC;IAErE,MAAM,EACF,IAAI,EAAE,2BAA2B,EACjC,KAAK,EAAE,4BAA4B,EACnC,OAAO,EAAE,8BAA8B,GAC1C,GAAG,kCAAkC,CAAC;QACnC,SAAS,EAAE;YACP,EAAE,EAAE,SAAS;SAChB;KACJ,CAAC,CAAC;IAEH,SAAS,CAAC,GAAG,EAAE;QACX,IAAI,2BAA2B,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;YAC/C,MAAM,yBAAyB,GAAG;gBAC9B,KAAK,EAAE,CAAC,CAAC,sCAAsC,CAAC;gBAChD,GAAG,EAAE,cAAc;aACtB,CAAC;YACF,MAAM,sBAAsB,GAAG,2BAA2B,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,gBAAgB,IAAI,EAAE,CAAC;YACvG,MAAM,YAAY,GAAa,EAAE,CAAC;YAElC,MAAM,2BAA2B,GAAG,sBAAsB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE;gBAC/D,MAAM,QAAQ,GAAG,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAC,KAAK,EAAE,GAAG,EAAE,CAAC,IAAI,KAAK,EAAE,CAAC,IAAI,KAAK,EAAE,GAAG,EAAE,EAAE,CAAC,IAAI,EAAC,CAAC,CAAC,CAAC;gBAClG,YAAY,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;gBAE/C,OAAO;oBACH,KAAK,EAAE,oBAAoB,CAAC,CAAC,CAAC,KAAK,EAAE,IAAI,CAAC;oBAC1C,GAAG,EAAE,oBAAoB,CAAC,CAAC,CAAC,KAAK,EAAE,IAAI,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE;oBACxD,QAAQ;iBACX,CAAC;YACN,CAAC,CAAC,CAAC;YAEH,uBAAuB,CAAC;gBACpB;oBACI,GAAG,yBAAyB;oBAC5B,QAAQ,EAAE,2BAA2B;iBACxC;aACJ,CAAC,CAAC;YACH,kBAAkB,CAAC,YAAY,CAAC,CAAC;QACrC,CAAC;IACL,CAAC,EAAE,CAAC,2BAA2B,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IAE3C,OAAO;QACH,oBAAoB;QACpB,eAAe;QACf,OAAO,EAAE,8BAA8B;QACvC,KAAK,EAAE,4BAA4B;KACtC,CAAC;AACN,CAAC,CAAC","sourcesContent":["// Copyright LEAV Solutions 2017 until 2023/11/05, Copyright Aristid from 2023/11/06\n// This file is released under LGPL V3\n// License text available at https://www.gnu.org/licenses/lgpl-3.0.txt\nimport {useEffect, useState} from 'react';\nimport {useGetLibraryPreviewsSettingsQuery} from '_ui/_gqlTypes';\nimport {localizedTranslation} from '@leav/utils';\nimport {useLang} from '_ui/hooks';\nimport {useSharedTranslation} from '_ui/hooks/useSharedTranslation';\n\nexport const SELECT_ALL_KEY = 'select-all';\n\nexport type PreviewSizesTreeNode = {\n title: string;\n key: string;\n children?: PreviewSizesTreeNode[];\n};\n\ninterface IUseGetPreviewSizesDataReturn {\n previewSizesTreeData: PreviewSizesTreeNode[];\n allPreviewSizes: string[];\n loading: boolean;\n error: Error | undefined;\n}\n\n/**\n * Hook that fetches library preview settings and transforms them into tree data\n * for the preview sizes selection in the GeneratePreviewsModal\n */\nexport const useGetPreviewSizesData = (libraryId: string): IUseGetPreviewSizesDataReturn => {\n const {t} = useSharedTranslation();\n const {lang} = useLang();\n\n const [previewSizesTreeData, setPreviewSizesTreeData] = useState<PreviewSizesTreeNode[]>([]);\n const [allPreviewSizes, setAllPreviewSizes] = useState<string[]>([]);\n\n const {\n data: libraryPreviewsSettingsData,\n error: libraryPreviewsSettingsError,\n loading: libraryPreviewsSettingsLoading,\n } = useGetLibraryPreviewsSettingsQuery({\n variables: {\n id: libraryId,\n },\n });\n\n useEffect(() => {\n if (libraryPreviewsSettingsData?.libraries?.list) {\n const selectAllPreviewSizesNode = {\n title: t('files.previews_generation_select_all'),\n key: SELECT_ALL_KEY,\n };\n const libraryPreviewSettings = libraryPreviewsSettingsData.libraries.list?.[0]?.previewsSettings || [];\n const previewSizes: string[] = [];\n\n const libraryPreviewSizesTreeData = libraryPreviewSettings.map(s => {\n const children = s.versions.sizes.map(vs => ({title: `${vs.name} (${vs.size}px)`, key: vs.name}));\n previewSizes.push(...children.map(c => c.key));\n\n return {\n title: localizedTranslation(s.label, lang),\n key: localizedTranslation(s.label, lang) + Math.random(),\n children,\n };\n });\n\n setPreviewSizesTreeData([\n {\n ...selectAllPreviewSizesNode,\n children: libraryPreviewSizesTreeData,\n },\n ]);\n setAllPreviewSizes(previewSizes);\n }\n }, [libraryPreviewsSettingsData, lang, t]);\n\n return {\n previewSizesTreeData,\n allPreviewSizes,\n loading: libraryPreviewsSettingsLoading,\n error: libraryPreviewsSettingsError,\n };\n};\n"]}
@@ -0,0 +1,19 @@
1
+ import { type ReactElement } from 'react';
2
+ import { type FeatureHook, type IMassActions } from '../_types';
3
+ import { type IViewSettingsState } from '../manage-view-settings';
4
+ interface IUseGeneratePreviewsMassActionReturn {
5
+ generatePreviewsMassAction: IMassActions | null;
6
+ GeneratePreviewsModal: ReactElement | null;
7
+ }
8
+ /**
9
+ * Hook that provides a mass action configuration for generating previews for selected or all items
10
+ * from a view/data set
11
+ */
12
+ export declare const useGeneratePreviewsMassAction: ({ isEnabled, store: { view }, totalCount, onGeneratePreviews, }: FeatureHook<{
13
+ store: {
14
+ view: IViewSettingsState;
15
+ };
16
+ totalCount: number;
17
+ onGeneratePreviews?: IMassActions["callback"];
18
+ }>) => IUseGeneratePreviewsMassActionReturn;
19
+ export {};
@@ -0,0 +1,94 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ // Copyright LEAV Solutions 2017 until 2023/11/05, Copyright Aristid from 2023/11/06
3
+ // This file is released under LGPL V3
4
+ // License text available at https://www.gnu.org/licenses/lgpl-3.0.txt
5
+ import { useCallback, useMemo, useState } from 'react';
6
+ import { LibraryBehavior, useForcePreviewsGenerationMutation, useGetLibraryByIdQuery, } from '../../../_gqlTypes';
7
+ import { useSharedTranslation } from '../../../hooks/useSharedTranslation';
8
+ import { MASS_SELECTION_ALL } from '../_constants';
9
+ import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
10
+ import { faImage } from '@fortawesome/free-solid-svg-icons';
11
+ import { GeneratePreviewsModal } from './generate-previews/GeneratePreviewsModal';
12
+ import { KitAlert } from 'aristid-ds';
13
+ import { ERROR_ALERT_DURATION, SUCCESS_NOTIFICATION_DURATION } from '../../../constants';
14
+ /**
15
+ * Hook that provides a mass action configuration for generating previews for selected or all items
16
+ * from a view/data set
17
+ */
18
+ export const useGeneratePreviewsMassAction = ({ isEnabled, store: { view }, totalCount, onGeneratePreviews, }) => {
19
+ const { t } = useSharedTranslation();
20
+ const [isModalOpen, setIsModalOpen] = useState(false);
21
+ const [massSelectionFilter, setMassSelectionFilter] = useState();
22
+ const [startPreviewsGeneration, { loading: isGeneratingPreviews }] = useForcePreviewsGenerationMutation();
23
+ const { data: libraryData } = useGetLibraryByIdQuery({
24
+ variables: {
25
+ id: view.libraryId,
26
+ },
27
+ });
28
+ const _handleConfirmGeneratePreviews = useCallback(async (previewSizes, isFailedOnly) => {
29
+ if (!massSelectionFilter) {
30
+ return;
31
+ }
32
+ const total = view.massSelection === MASS_SELECTION_ALL ? totalCount : view.massSelection.length;
33
+ try {
34
+ const result = await startPreviewsGeneration({
35
+ variables: {
36
+ libraryId: view.libraryId,
37
+ filters: massSelectionFilter ?? null,
38
+ failedOnly: isFailedOnly,
39
+ previewVersionSizeNames: previewSizes,
40
+ },
41
+ });
42
+ const isSuccess = result.data?.forcePreviewsGeneration ?? false;
43
+ if (isSuccess) {
44
+ KitAlert.success({
45
+ showIcon: true,
46
+ duration: SUCCESS_NOTIFICATION_DURATION,
47
+ closable: true,
48
+ message: t('files.previews_generation_success'),
49
+ description: null,
50
+ });
51
+ }
52
+ else {
53
+ KitAlert.info({
54
+ showIcon: true,
55
+ duration: ERROR_ALERT_DURATION,
56
+ closable: true,
57
+ message: t('files.previews_generation_nothing_to_do'),
58
+ description: null,
59
+ });
60
+ }
61
+ onGeneratePreviews?.(massSelectionFilter, view.massSelection);
62
+ setIsModalOpen(false);
63
+ }
64
+ catch (e) {
65
+ KitAlert.error({
66
+ showIcon: true,
67
+ duration: ERROR_ALERT_DURATION,
68
+ message: t('error.error_occurred'),
69
+ description: t('explorer.massAction.generate_previews_error_description', { count: total }),
70
+ closable: true,
71
+ });
72
+ }
73
+ }, [view.libraryId, view.massSelection, totalCount, massSelectionFilter, onGeneratePreviews, t]);
74
+ const _handleCloseModal = useCallback(() => {
75
+ setIsModalOpen(false);
76
+ setMassSelectionFilter(undefined);
77
+ }, []);
78
+ const _generatePreviewsMassAction = useMemo(() => ({
79
+ label: t('explorer.massAction.generate_previews'),
80
+ icon: _jsx(FontAwesomeIcon, { icon: faImage }),
81
+ deselectAll: false,
82
+ callback: filter => {
83
+ setMassSelectionFilter(filter);
84
+ setIsModalOpen(true);
85
+ },
86
+ }), [t]);
87
+ const generatePreviewsModal = isEnabled ? (_jsx(GeneratePreviewsModal, { open: isModalOpen, libraryId: view.libraryId, isGeneratingPreviews: isGeneratingPreviews, onClose: _handleCloseModal, onConfirm: _handleConfirmGeneratePreviews })) : null;
88
+ const isLibraryFileBehavior = libraryData?.libraries?.list?.[0]?.behavior === LibraryBehavior.files;
89
+ return {
90
+ generatePreviewsMassAction: isEnabled && isLibraryFileBehavior ? _generatePreviewsMassAction : null,
91
+ GeneratePreviewsModal: isLibraryFileBehavior ? generatePreviewsModal : null,
92
+ };
93
+ };
94
+ //# sourceMappingURL=useGeneratePreviewsMassAction.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useGeneratePreviewsMassAction.js","sourceRoot":"","sources":["../../../../src/components/Explorer/actions-mass/useGeneratePreviewsMassAction.tsx"],"names":[],"mappings":"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","sourcesContent":["// Copyright LEAV Solutions 2017 until 2023/11/05, Copyright Aristid from 2023/11/06\n// This file is released under LGPL V3\n// License text available at https://www.gnu.org/licenses/lgpl-3.0.txt\nimport {type Key, type ReactElement, useCallback, useMemo, useState} from 'react';\nimport {\n LibraryBehavior,\n useForcePreviewsGenerationMutation,\n useGetLibraryByIdQuery,\n type RecordFilterInput,\n} from '_ui/_gqlTypes';\nimport {useSharedTranslation} from '_ui/hooks/useSharedTranslation';\nimport {type FeatureHook, type IMassActions} from '../_types';\nimport {type IViewSettingsState} from '../manage-view-settings';\nimport {MASS_SELECTION_ALL} from '../_constants';\nimport {FontAwesomeIcon} from '@fortawesome/react-fontawesome';\nimport {faImage} from '@fortawesome/free-solid-svg-icons';\nimport {GeneratePreviewsModal} from './generate-previews/GeneratePreviewsModal';\nimport {KitAlert} from 'aristid-ds';\nimport {ERROR_ALERT_DURATION, SUCCESS_NOTIFICATION_DURATION} from '_ui/constants';\n\ninterface IUseGeneratePreviewsMassActionReturn {\n generatePreviewsMassAction: IMassActions | null;\n GeneratePreviewsModal: ReactElement | null;\n}\n\n/**\n * Hook that provides a mass action configuration for generating previews for selected or all items\n * from a view/data set\n */\nexport const useGeneratePreviewsMassAction = ({\n isEnabled,\n store: {view},\n totalCount,\n onGeneratePreviews,\n}: FeatureHook<{\n store: {\n view: IViewSettingsState;\n };\n totalCount: number;\n onGeneratePreviews?: IMassActions['callback'];\n}>): IUseGeneratePreviewsMassActionReturn => {\n const {t} = useSharedTranslation();\n\n const [isModalOpen, setIsModalOpen] = useState(false);\n const [massSelectionFilter, setMassSelectionFilter] = useState<RecordFilterInput[] | undefined>();\n const [startPreviewsGeneration, {loading: isGeneratingPreviews}] = useForcePreviewsGenerationMutation();\n const {data: libraryData} = useGetLibraryByIdQuery({\n variables: {\n id: view.libraryId,\n },\n });\n\n const _handleConfirmGeneratePreviews = useCallback(\n async (previewSizes: Key[], isFailedOnly: boolean) => {\n if (!massSelectionFilter) {\n return;\n }\n\n const total = view.massSelection === MASS_SELECTION_ALL ? totalCount : view.massSelection.length;\n\n try {\n const result = await startPreviewsGeneration({\n variables: {\n libraryId: view.libraryId,\n filters: massSelectionFilter ?? null,\n failedOnly: isFailedOnly,\n previewVersionSizeNames: previewSizes as string[],\n },\n });\n\n const isSuccess = result.data?.forcePreviewsGeneration ?? false;\n\n if (isSuccess) {\n KitAlert.success({\n showIcon: true,\n duration: SUCCESS_NOTIFICATION_DURATION,\n closable: true,\n message: t('files.previews_generation_success'),\n description: null,\n });\n } else {\n KitAlert.info({\n showIcon: true,\n duration: ERROR_ALERT_DURATION,\n closable: true,\n message: t('files.previews_generation_nothing_to_do'),\n description: null,\n });\n }\n\n onGeneratePreviews?.(massSelectionFilter, view.massSelection);\n setIsModalOpen(false);\n } catch (e) {\n KitAlert.error({\n showIcon: true,\n duration: ERROR_ALERT_DURATION,\n message: t('error.error_occurred'),\n description: t('explorer.massAction.generate_previews_error_description', {count: total}),\n closable: true,\n });\n }\n },\n [view.libraryId, view.massSelection, totalCount, massSelectionFilter, onGeneratePreviews, t],\n );\n\n const _handleCloseModal = useCallback(() => {\n setIsModalOpen(false);\n setMassSelectionFilter(undefined);\n }, []);\n\n const _generatePreviewsMassAction: IMassActions = useMemo(\n () => ({\n label: t('explorer.massAction.generate_previews'),\n icon: <FontAwesomeIcon icon={faImage} />,\n deselectAll: false,\n callback: filter => {\n setMassSelectionFilter(filter);\n setIsModalOpen(true);\n },\n }),\n [t],\n );\n\n const generatePreviewsModal = isEnabled ? (\n <GeneratePreviewsModal\n open={isModalOpen}\n libraryId={view.libraryId}\n isGeneratingPreviews={isGeneratingPreviews}\n onClose={_handleCloseModal}\n onConfirm={_handleConfirmGeneratePreviews}\n />\n ) : null;\n\n const isLibraryFileBehavior = libraryData?.libraries?.list?.[0]?.behavior === LibraryBehavior.files;\n\n return {\n generatePreviewsMassAction: isEnabled && isLibraryFileBehavior ? _generatePreviewsMassAction : null,\n GeneratePreviewsModal: isLibraryFileBehavior ? generatePreviewsModal : null,\n };\n};\n"]}
@@ -8,19 +8,21 @@ import { type IUIFiltersState } from '../../../components/Filters/context/filter
8
8
  * @param isEnabled - whether the selection is present
9
9
  * @param view - represent the current view
10
10
  * @param dispatch - method to change the current view
11
- * @param totalCount - used for display only
11
+ * @param totalCountFiltered - number of results with the current filters
12
+ * @param totalCountLibrary - number of total items in the library (without filters)
12
13
  * @param allVisibleKeys - list of all ids currently selected
13
14
  * @param massActions - array of all actions available on mass selection
14
15
  * @param snackbarId - id of the snackbar displayed
15
16
  */
16
- export declare const useMassActions: ({ isEnabled, store: { dispatch, view }, filtersStore: { filters, filtersOperator }, totalCount, allVisibleKeys, massActions, snackbarId, }: {
17
+ export declare const useMassActions: ({ isEnabled, store: { dispatch, view }, filtersStore: { filters, filtersOperator }, totalCountFiltered, totalCountLibrary, allVisibleKeys, massActions, snackbarId, }: {
17
18
  isEnabled: boolean;
18
19
  store: {
19
20
  view: IViewSettingsState;
20
21
  dispatch: Dispatch<IViewSettingsAction>;
21
22
  };
22
23
  filtersStore: IUIFiltersState;
23
- totalCount: number;
24
+ totalCountFiltered: number;
25
+ totalCountLibrary: number;
24
26
  allVisibleKeys: string[];
25
27
  massActions: IMassActions[];
26
28
  snackbarId: string;
@@ -3,7 +3,7 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
3
  // This file is released under LGPL V3
4
4
  // License text available at https://www.gnu.org/licenses/lgpl-3.0.txt
5
5
  import { closeKitSnackBar, KitCheckbox, KitDropDown, KitSpace, openKitSnackBar } from 'aristid-ds';
6
- import { useCallback, useEffect } from 'react';
6
+ import { useCallback, useEffect, useState } from 'react';
7
7
  import { RecordFilterCondition, RecordFilterOperator } from '../../../_gqlTypes';
8
8
  import { useSharedTranslation } from '../../../hooks/useSharedTranslation';
9
9
  import { interleaveElement } from '../../../_utils/interleaveElement';
@@ -11,20 +11,26 @@ import { MASS_SELECTION_ALL } from '../_constants';
11
11
  import { ViewSettingsActionTypes } from '../manage-view-settings';
12
12
  import { prepareFiltersForRequest } from '../../../components/Filters';
13
13
  import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
14
- import { faChevronDown } from '@fortawesome/free-solid-svg-icons';
14
+ import { faCaretDown } from '@fortawesome/free-solid-svg-icons';
15
+ import { ResultsCount } from './ResultsCount';
15
16
  /**
16
17
  * Hook used to manage mass selection as the snackbar and all kind of selection (manual, all in page, all in filters)
17
18
  *
18
19
  * @param isEnabled - whether the selection is present
19
20
  * @param view - represent the current view
20
21
  * @param dispatch - method to change the current view
21
- * @param totalCount - used for display only
22
+ * @param totalCountFiltered - number of results with the current filters
23
+ * @param totalCountLibrary - number of total items in the library (without filters)
22
24
  * @param allVisibleKeys - list of all ids currently selected
23
25
  * @param massActions - array of all actions available on mass selection
24
26
  * @param snackbarId - id of the snackbar displayed
25
27
  */
26
- export const useMassActions = ({ isEnabled, store: { dispatch, view }, filtersStore: { filters, filtersOperator }, totalCount, allVisibleKeys, massActions, snackbarId, }) => {
28
+ export const useMassActions = ({ isEnabled, store: { dispatch, view }, filtersStore: { filters, filtersOperator }, totalCountFiltered, totalCountLibrary, allVisibleKeys, massActions, snackbarId, }) => {
27
29
  const { t } = useSharedTranslation();
30
+ const [isInactive, setIsInactive] = useState(false);
31
+ useEffect(() => {
32
+ setIsInactive(filters.filter(f => f.field === 'active')?.[0]?.value === 'false');
33
+ }, [filters]);
28
34
  useEffect(() => {
29
35
  if (view.massSelection === MASS_SELECTION_ALL || view.massSelection.length !== 0) {
30
36
  openKitSnackBar({
@@ -34,7 +40,7 @@ export const useMassActions = ({ isEnabled, store: { dispatch, view }, filtersSt
34
40
  toasterId: snackbarId,
35
41
  onClose: () => _setSelectedKeys([]),
36
42
  message: t('explorer.massAction.selectedItems', {
37
- count: view.massSelection === MASS_SELECTION_ALL ? totalCount : view.massSelection.length,
43
+ count: view.massSelection === MASS_SELECTION_ALL ? totalCountFiltered : view.massSelection.length,
38
44
  }),
39
45
  actions: massActions.map(({ label, icon, deselectAll, callback }, index) => ({
40
46
  key: index,
@@ -63,13 +69,13 @@ export const useMassActions = ({ isEnabled, store: { dispatch, view }, filtersSt
63
69
  else {
64
70
  closeKitSnackBar(snackbarId);
65
71
  }
66
- }, [view.massSelection, filters, totalCount]);
72
+ }, [view.massSelection, filters, totalCountFiltered]);
67
73
  useEffect(() => () => closeKitSnackBar(snackbarId), []);
68
- const isOnePage = view.pageSize > totalCount;
69
- const hasSelectedAllAvailableItems = view.massSelection === MASS_SELECTION_ALL || view.massSelection.length === totalCount;
74
+ const isOnePage = view.pageSize > totalCountFiltered;
75
+ const hasSelectedAllAvailableItems = view.massSelection === MASS_SELECTION_ALL || view.massSelection.length === totalCountFiltered;
70
76
  const hasSelectedSomeItems = view.massSelection !== MASS_SELECTION_ALL &&
71
77
  view.massSelection.length > 0 &&
72
- view.massSelection.length < totalCount;
78
+ view.massSelection.length < totalCountFiltered;
73
79
  const _selectAllButton = isOnePage ? (_jsx(KitCheckbox, { "aria-checked": hasSelectedSomeItems ? 'mixed' : hasSelectedAllAvailableItems ? 'true' : 'false', indeterminate: hasSelectedSomeItems, checked: hasSelectedAllAvailableItems, onChange: _ => {
74
80
  if (hasSelectedAllAvailableItems) {
75
81
  _setSelectedKeys([]);
@@ -77,7 +83,7 @@ export const useMassActions = ({ isEnabled, store: { dispatch, view }, filtersSt
77
83
  else {
78
84
  _setSelectedKeys(allVisibleKeys);
79
85
  }
80
- }, children: t('explorer.massAction.itemsTotal', { count: totalCount }) })) : (_jsx(KitDropDown, { trigger: ['click'], menu: {
86
+ }, children: _jsx(ResultsCount, { t: t, isInactive: isInactive, totalCountFiltered: totalCountFiltered, totalCountLibrary: totalCountLibrary }) })) : (_jsx(KitDropDown, { trigger: ['click'], menu: {
81
87
  items: [
82
88
  hasSelectedAllAvailableItems
83
89
  ? null
@@ -91,8 +97,8 @@ export const useMassActions = ({ isEnabled, store: { dispatch, view }, filtersSt
91
97
  {
92
98
  key: 'toggle_all_selection',
93
99
  label: hasSelectedAllAvailableItems
94
- ? t('explorer.massAction.toggle_selection.deselect_all', { count: totalCount })
95
- : t('explorer.massAction.toggle_selection.select_all', { count: totalCount }),
100
+ ? t('explorer.massAction.toggle_selection.deselect_all', { count: totalCountFiltered })
101
+ : t('explorer.massAction.toggle_selection.select_all', { count: totalCountFiltered }),
96
102
  onClick: async () => {
97
103
  if (hasSelectedAllAvailableItems) {
98
104
  _setSelectedKeys([]);
@@ -103,7 +109,7 @@ export const useMassActions = ({ isEnabled, store: { dispatch, view }, filtersSt
103
109
  },
104
110
  },
105
111
  ],
106
- }, children: _jsx(KitCheckbox, { "aria-checked": hasSelectedSomeItems ? 'mixed' : hasSelectedAllAvailableItems ? 'true' : 'false', indeterminate: hasSelectedSomeItems, checked: hasSelectedAllAvailableItems, children: _jsxs(KitSpace, { size: "s", children: [t('explorer.massAction.itemsTotal', { count: totalCount }), _jsx(FontAwesomeIcon, { icon: faChevronDown })] }) }) }));
112
+ }, children: _jsx(KitCheckbox, { "aria-checked": hasSelectedSomeItems ? 'mixed' : hasSelectedAllAvailableItems ? 'true' : 'false', indeterminate: hasSelectedSomeItems, checked: hasSelectedAllAvailableItems, children: _jsxs(KitSpace, { size: "xxs", children: [_jsx(ResultsCount, { t: t, isInactive: isInactive, totalCountFiltered: totalCountFiltered, totalCountLibrary: totalCountLibrary }), _jsx(FontAwesomeIcon, { icon: faCaretDown, size: "2xs" })] }) }) }));
107
113
  const _setSelectedKeys = useCallback((keys) => dispatch({
108
114
  type: ViewSettingsActionTypes.SET_SELECTED_KEYS,
109
115
  payload: keys,
@@ -1 +1 @@
1
- {"version":3,"file":"useMassActions.js","sourceRoot":"","sources":["../../../../src/components/Explorer/actions-mass/useMassActions.tsx"],"names":[],"mappings":"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","sourcesContent":["// Copyright LEAV Solutions 2017 until 2023/11/05, Copyright Aristid from 2023/11/06\n// This file is released under LGPL V3\n// License text available at https://www.gnu.org/licenses/lgpl-3.0.txt\nimport {closeKitSnackBar, KitCheckbox, KitDropDown, KitSpace, openKitSnackBar} from 'aristid-ds';\nimport {type Dispatch, useCallback, useEffect, useRef} from 'react';\nimport {RecordFilterCondition, RecordFilterOperator} from '_ui/_gqlTypes';\nimport {useSharedTranslation} from '_ui/hooks/useSharedTranslation';\nimport {interleaveElement} from '_ui/_utils/interleaveElement';\nimport {type IMassActions, type MassSelection} from '../_types';\nimport {MASS_SELECTION_ALL} from '../_constants';\nimport {type IViewSettingsAction, type IViewSettingsState, ViewSettingsActionTypes} from '../manage-view-settings';\nimport {prepareFiltersForRequest} from '_ui/components/Filters';\nimport {type IUIFiltersState} from '_ui/components/Filters/context/filtersReducer';\nimport {FontAwesomeIcon} from '@fortawesome/react-fontawesome';\nimport {faChevronDown} from '@fortawesome/free-solid-svg-icons';\n\n/**\n * Hook used to manage mass selection as the snackbar and all kind of selection (manual, all in page, all in filters)\n *\n * @param isEnabled - whether the selection is present\n * @param view - represent the current view\n * @param dispatch - method to change the current view\n * @param totalCount - used for display only\n * @param allVisibleKeys - list of all ids currently selected\n * @param massActions - array of all actions available on mass selection\n * @param snackbarId - id of the snackbar displayed\n */\nexport const useMassActions = ({\n isEnabled,\n store: {dispatch, view},\n filtersStore: {filters, filtersOperator},\n totalCount,\n allVisibleKeys,\n massActions,\n snackbarId,\n}: {\n isEnabled: boolean;\n store: {\n view: IViewSettingsState;\n dispatch: Dispatch<IViewSettingsAction>;\n };\n filtersStore: IUIFiltersState;\n totalCount: number;\n allVisibleKeys: string[];\n massActions: IMassActions[];\n snackbarId: string;\n}) => {\n const {t} = useSharedTranslation();\n\n useEffect(() => {\n if (view.massSelection === MASS_SELECTION_ALL || view.massSelection.length !== 0) {\n openKitSnackBar({\n duration: 0,\n closable: true,\n snackbarId,\n toasterId: snackbarId,\n onClose: () => _setSelectedKeys([]),\n message: t('explorer.massAction.selectedItems', {\n count: view.massSelection === MASS_SELECTION_ALL ? totalCount : view.massSelection.length,\n }),\n actions: massActions.map(({label, icon, deselectAll, callback}, index) => ({\n key: index,\n label,\n icon,\n onClick: async () => {\n await callback(\n view.massSelection === MASS_SELECTION_ALL\n ? prepareFiltersForRequest(filters, filtersOperator)\n : interleaveElement(\n {operator: RecordFilterOperator.OR},\n view.massSelection.map(key => [\n {\n field: 'id',\n condition: RecordFilterCondition.EQUAL,\n value: String(key),\n },\n ]),\n ),\n view.massSelection,\n );\n if (deselectAll) {\n dispatch({\n type: ViewSettingsActionTypes.SET_SELECTED_KEYS,\n payload: [],\n });\n }\n },\n })),\n });\n } else {\n closeKitSnackBar(snackbarId);\n }\n }, [view.massSelection, filters, totalCount]);\n\n useEffect(() => () => closeKitSnackBar(snackbarId), []);\n\n const isOnePage = view.pageSize > totalCount;\n const hasSelectedAllAvailableItems =\n view.massSelection === MASS_SELECTION_ALL || view.massSelection.length === totalCount;\n const hasSelectedSomeItems =\n view.massSelection !== MASS_SELECTION_ALL &&\n view.massSelection.length > 0 &&\n view.massSelection.length < totalCount;\n\n const _selectAllButton = isOnePage ? (\n <KitCheckbox\n aria-checked={hasSelectedSomeItems ? 'mixed' : hasSelectedAllAvailableItems ? 'true' : 'false'}\n indeterminate={hasSelectedSomeItems}\n checked={hasSelectedAllAvailableItems}\n onChange={_ => {\n if (hasSelectedAllAvailableItems) {\n _setSelectedKeys([]);\n } else {\n _setSelectedKeys(allVisibleKeys);\n }\n }}\n >\n {t('explorer.massAction.itemsTotal', {count: totalCount})}\n </KitCheckbox>\n ) : (\n <KitDropDown\n trigger={['click']}\n menu={{\n items: [\n hasSelectedAllAvailableItems\n ? null\n : {\n key: 'toggle_page_selection',\n label: t('explorer.massAction.toggle_selection.select_page', {count: view.pageSize}),\n onClick: () => {\n _setSelectedKeys([...new Set([...view.massSelection, ...allVisibleKeys])]);\n },\n },\n {\n key: 'toggle_all_selection',\n label: hasSelectedAllAvailableItems\n ? t('explorer.massAction.toggle_selection.deselect_all', {count: totalCount})\n : t('explorer.massAction.toggle_selection.select_all', {count: totalCount}),\n onClick: async () => {\n if (hasSelectedAllAvailableItems) {\n _setSelectedKeys([]);\n } else {\n _setSelectedKeys(MASS_SELECTION_ALL);\n }\n },\n },\n ],\n }}\n >\n <KitCheckbox\n aria-checked={hasSelectedSomeItems ? 'mixed' : hasSelectedAllAvailableItems ? 'true' : 'false'}\n indeterminate={hasSelectedSomeItems}\n checked={hasSelectedAllAvailableItems}\n >\n <KitSpace size=\"s\">\n {t('explorer.massAction.itemsTotal', {count: totalCount})}\n <FontAwesomeIcon icon={faChevronDown} />\n </KitSpace>\n </KitCheckbox>\n </KitDropDown>\n );\n\n const _setSelectedKeys = useCallback(\n (keys: MassSelection) =>\n dispatch({\n type: ViewSettingsActionTypes.SET_SELECTED_KEYS,\n payload: keys,\n }),\n [dispatch],\n );\n\n return {\n selectAllButton: isEnabled ? _selectAllButton : null,\n setSelectedKeys: isEnabled ? _setSelectedKeys : null,\n };\n};\n"]}
1
+ {"version":3,"file":"useMassActions.js","sourceRoot":"","sources":["../../../../src/components/Explorer/actions-mass/useMassActions.tsx"],"names":[],"mappings":";AAAA,oFAAoF;AACpF,sCAAsC;AACtC,sEAAsE;AACtE,OAAO,EAAC,gBAAgB,EAAE,WAAW,EAAE,WAAW,EAAE,QAAQ,EAAiB,eAAe,EAAC,MAAM,YAAY,CAAC;AAChH,OAAO,EAAgB,WAAW,EAAE,SAAS,EAAU,QAAQ,EAAC,MAAM,OAAO,CAAC;AAC9E,OAAO,EAAC,qBAAqB,EAAE,oBAAoB,EAAC,MAAM,eAAe,CAAC;AAC1E,OAAO,EAAC,oBAAoB,EAAC,MAAM,gCAAgC,CAAC;AACpE,OAAO,EAAC,iBAAiB,EAAC,MAAM,8BAA8B,CAAC;AAE/D,OAAO,EAAC,kBAAkB,EAAC,MAAM,eAAe,CAAC;AACjD,OAAO,EAAoD,uBAAuB,EAAC,MAAM,yBAAyB,CAAC;AACnH,OAAO,EAAC,wBAAwB,EAAC,MAAM,wBAAwB,CAAC;AAEhE,OAAO,EAAC,eAAe,EAAC,MAAM,gCAAgC,CAAC;AAC/D,OAAO,EAAC,WAAW,EAAC,MAAM,mCAAmC,CAAC;AAC9D,OAAO,EAAC,YAAY,EAAC,MAAM,gBAAgB,CAAC;AAE5C;;;;;;;;;;;GAWG;AACH,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,EAC3B,SAAS,EACT,KAAK,EAAE,EAAC,QAAQ,EAAE,IAAI,EAAC,EACvB,YAAY,EAAE,EAAC,OAAO,EAAE,eAAe,EAAC,EACxC,kBAAkB,EAClB,iBAAiB,EACjB,cAAc,EACd,WAAW,EACX,UAAU,GAab,EAAE,EAAE;IACD,MAAM,EAAC,CAAC,EAAC,GAAG,oBAAoB,EAAE,CAAC;IACnC,MAAM,CAAC,UAAU,EAAE,aAAa,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAEpD,SAAS,CAAC,GAAG,EAAE;QACX,aAAa,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,KAAK,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,KAAK,OAAO,CAAC,CAAC;IACrF,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC;IAEd,SAAS,CAAC,GAAG,EAAE;QACX,IAAI,IAAI,CAAC,aAAa,KAAK,kBAAkB,IAAI,IAAI,CAAC,aAAa,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC/E,eAAe,CAAC;gBACZ,QAAQ,EAAE,CAAC;gBACX,QAAQ,EAAE,IAAI;gBACd,UAAU;gBACV,SAAS,EAAE,UAAU;gBACrB,OAAO,EAAE,GAAG,EAAE,CAAC,gBAAgB,CAAC,EAAE,CAAC;gBACnC,OAAO,EAAE,CAAC,CAAC,mCAAmC,EAAE;oBAC5C,KAAK,EAAE,IAAI,CAAC,aAAa,KAAK,kBAAkB,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,MAAM;iBACpG,CAAC;gBACF,OAAO,EAAE,WAAW,CAAC,GAAG,CAAC,CAAC,EAAC,KAAK,EAAE,IAAI,EAAE,WAAW,EAAE,QAAQ,EAAC,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC;oBACvE,GAAG,EAAE,KAAK;oBACV,KAAK;oBACL,IAAI;oBACJ,OAAO,EAAE,KAAK,IAAI,EAAE;wBAChB,MAAM,QAAQ,CACV,IAAI,CAAC,aAAa,KAAK,kBAAkB;4BACrC,CAAC,CAAC,wBAAwB,CAAC,OAAO,EAAE,eAAe,CAAC;4BACpD,CAAC,CAAC,iBAAiB,CACb,EAAC,QAAQ,EAAE,oBAAoB,CAAC,EAAE,EAAC,EACnC,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;gCAC1B;oCACI,KAAK,EAAE,IAAI;oCACX,SAAS,EAAE,qBAAqB,CAAC,KAAK;oCACtC,KAAK,EAAE,MAAM,CAAC,GAAG,CAAC;iCACrB;6BACJ,CAAC,CACL,EACP,IAAI,CAAC,aAAa,CACrB,CAAC;wBACF,IAAI,WAAW,EAAE,CAAC;4BACd,QAAQ,CAAC;gCACL,IAAI,EAAE,uBAAuB,CAAC,iBAAiB;gCAC/C,OAAO,EAAE,EAAE;6BACd,CAAC,CAAC;wBACP,CAAC;oBACL,CAAC;iBACJ,CAAC,CAAC;aACN,CAAC,CAAC;QACP,CAAC;aAAM,CAAC;YACJ,gBAAgB,CAAC,UAAU,CAAC,CAAC;QACjC,CAAC;IACL,CAAC,EAAE,CAAC,IAAI,CAAC,aAAa,EAAE,OAAO,EAAE,kBAAkB,CAAC,CAAC,CAAC;IAEtD,SAAS,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE,CAAC,gBAAgB,CAAC,UAAU,CAAC,EAAE,EAAE,CAAC,CAAC;IAExD,MAAM,SAAS,GAAG,IAAI,CAAC,QAAQ,GAAG,kBAAkB,CAAC;IACrD,MAAM,4BAA4B,GAC9B,IAAI,CAAC,aAAa,KAAK,kBAAkB,IAAI,IAAI,CAAC,aAAa,CAAC,MAAM,KAAK,kBAAkB,CAAC;IAClG,MAAM,oBAAoB,GACtB,IAAI,CAAC,aAAa,KAAK,kBAAkB;QACzC,IAAI,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC;QAC7B,IAAI,CAAC,aAAa,CAAC,MAAM,GAAG,kBAAkB,CAAC;IAEnD,MAAM,gBAAgB,GAAG,SAAS,CAAC,CAAC,CAAC,CACjC,KAAC,WAAW,oBACM,oBAAoB,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,4BAA4B,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,EAC9F,aAAa,EAAE,oBAAoB,EACnC,OAAO,EAAE,4BAA4B,EACrC,QAAQ,EAAE,CAAC,CAAC,EAAE;YACV,IAAI,4BAA4B,EAAE,CAAC;gBAC/B,gBAAgB,CAAC,EAAE,CAAC,CAAC;YACzB,CAAC;iBAAM,CAAC;gBACJ,gBAAgB,CAAC,cAAc,CAAC,CAAC;YACrC,CAAC;QACL,CAAC,YAED,KAAC,YAAY,IACT,CAAC,EAAE,CAAC,EACJ,UAAU,EAAE,UAAU,EACtB,kBAAkB,EAAE,kBAAkB,EACtC,iBAAiB,EAAE,iBAAiB,GACtC,GACQ,CACjB,CAAC,CAAC,CAAC,CACA,KAAC,WAAW,IACR,OAAO,EAAE,CAAC,OAAO,CAAC,EAClB,IAAI,EAAE;YACF,KAAK,EAAE;gBACH,4BAA4B;oBACxB,CAAC,CAAC,IAAI;oBACN,CAAC,CAAC;wBACI,GAAG,EAAE,uBAAuB;wBAC5B,KAAK,EAAE,CAAC,CAAC,kDAAkD,EAAE,EAAC,KAAK,EAAE,IAAI,CAAC,QAAQ,EAAC,CAAC;wBACpF,OAAO,EAAE,GAAG,EAAE;4BACV,gBAAgB,CAAC,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,aAAa,EAAE,GAAG,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC;wBAC/E,CAAC;qBACJ;gBACP;oBACI,GAAG,EAAE,sBAAsB;oBAC3B,KAAK,EAAE,4BAA4B;wBAC/B,CAAC,CAAC,CAAC,CAAC,mDAAmD,EAAE,EAAC,KAAK,EAAE,kBAAkB,EAAC,CAAC;wBACrF,CAAC,CAAC,CAAC,CAAC,iDAAiD,EAAE,EAAC,KAAK,EAAE,kBAAkB,EAAC,CAAC;oBACvF,OAAO,EAAE,KAAK,IAAI,EAAE;wBAChB,IAAI,4BAA4B,EAAE,CAAC;4BAC/B,gBAAgB,CAAC,EAAE,CAAC,CAAC;wBACzB,CAAC;6BAAM,CAAC;4BACJ,gBAAgB,CAAC,kBAAkB,CAAC,CAAC;wBACzC,CAAC;oBACL,CAAC;iBACJ;aACJ;SACJ,YAED,KAAC,WAAW,oBACM,oBAAoB,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,4BAA4B,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,EAC9F,aAAa,EAAE,oBAAoB,EACnC,OAAO,EAAE,4BAA4B,YAErC,MAAC,QAAQ,IAAC,IAAI,EAAC,KAAK,aAChB,KAAC,YAAY,IACT,CAAC,EAAE,CAAC,EACJ,UAAU,EAAE,UAAU,EACtB,kBAAkB,EAAE,kBAAkB,EACtC,iBAAiB,EAAE,iBAAiB,GACtC,EACF,KAAC,eAAe,IAAC,IAAI,EAAE,WAAW,EAAE,IAAI,EAAC,KAAK,GAAG,IAC1C,GACD,GACJ,CACjB,CAAC;IAEF,MAAM,gBAAgB,GAAG,WAAW,CAChC,CAAC,IAAmB,EAAE,EAAE,CACpB,QAAQ,CAAC;QACL,IAAI,EAAE,uBAAuB,CAAC,iBAAiB;QAC/C,OAAO,EAAE,IAAI;KAChB,CAAC,EACN,CAAC,QAAQ,CAAC,CACb,CAAC;IAEF,OAAO;QACH,eAAe,EAAE,SAAS,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,IAAI;QACpD,eAAe,EAAE,SAAS,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,IAAI;KACvD,CAAC;AACN,CAAC,CAAC","sourcesContent":["// Copyright LEAV Solutions 2017 until 2023/11/05, Copyright Aristid from 2023/11/06\n// This file is released under LGPL V3\n// License text available at https://www.gnu.org/licenses/lgpl-3.0.txt\nimport {closeKitSnackBar, KitCheckbox, KitDropDown, KitSpace, KitTypography, openKitSnackBar} from 'aristid-ds';\nimport {type Dispatch, useCallback, useEffect, useRef, useState} from 'react';\nimport {RecordFilterCondition, RecordFilterOperator} from '_ui/_gqlTypes';\nimport {useSharedTranslation} from '_ui/hooks/useSharedTranslation';\nimport {interleaveElement} from '_ui/_utils/interleaveElement';\nimport {type IMassActions, type MassSelection} from '../_types';\nimport {MASS_SELECTION_ALL} from '../_constants';\nimport {type IViewSettingsAction, type IViewSettingsState, ViewSettingsActionTypes} from '../manage-view-settings';\nimport {prepareFiltersForRequest} from '_ui/components/Filters';\nimport {type IUIFiltersState} from '_ui/components/Filters/context/filtersReducer';\nimport {FontAwesomeIcon} from '@fortawesome/react-fontawesome';\nimport {faCaretDown} from '@fortawesome/free-solid-svg-icons';\nimport {ResultsCount} from './ResultsCount';\n\n/**\n * Hook used to manage mass selection as the snackbar and all kind of selection (manual, all in page, all in filters)\n *\n * @param isEnabled - whether the selection is present\n * @param view - represent the current view\n * @param dispatch - method to change the current view\n * @param totalCountFiltered - number of results with the current filters\n * @param totalCountLibrary - number of total items in the library (without filters)\n * @param allVisibleKeys - list of all ids currently selected\n * @param massActions - array of all actions available on mass selection\n * @param snackbarId - id of the snackbar displayed\n */\nexport const useMassActions = ({\n isEnabled,\n store: {dispatch, view},\n filtersStore: {filters, filtersOperator},\n totalCountFiltered,\n totalCountLibrary,\n allVisibleKeys,\n massActions,\n snackbarId,\n}: {\n isEnabled: boolean;\n store: {\n view: IViewSettingsState;\n dispatch: Dispatch<IViewSettingsAction>;\n };\n filtersStore: IUIFiltersState;\n totalCountFiltered: number;\n totalCountLibrary: number;\n allVisibleKeys: string[];\n massActions: IMassActions[];\n snackbarId: string;\n}) => {\n const {t} = useSharedTranslation();\n const [isInactive, setIsInactive] = useState(false);\n\n useEffect(() => {\n setIsInactive(filters.filter(f => f.field === 'active')?.[0]?.value === 'false');\n }, [filters]);\n\n useEffect(() => {\n if (view.massSelection === MASS_SELECTION_ALL || view.massSelection.length !== 0) {\n openKitSnackBar({\n duration: 0,\n closable: true,\n snackbarId,\n toasterId: snackbarId,\n onClose: () => _setSelectedKeys([]),\n message: t('explorer.massAction.selectedItems', {\n count: view.massSelection === MASS_SELECTION_ALL ? totalCountFiltered : view.massSelection.length,\n }),\n actions: massActions.map(({label, icon, deselectAll, callback}, index) => ({\n key: index,\n label,\n icon,\n onClick: async () => {\n await callback(\n view.massSelection === MASS_SELECTION_ALL\n ? prepareFiltersForRequest(filters, filtersOperator)\n : interleaveElement(\n {operator: RecordFilterOperator.OR},\n view.massSelection.map(key => [\n {\n field: 'id',\n condition: RecordFilterCondition.EQUAL,\n value: String(key),\n },\n ]),\n ),\n view.massSelection,\n );\n if (deselectAll) {\n dispatch({\n type: ViewSettingsActionTypes.SET_SELECTED_KEYS,\n payload: [],\n });\n }\n },\n })),\n });\n } else {\n closeKitSnackBar(snackbarId);\n }\n }, [view.massSelection, filters, totalCountFiltered]);\n\n useEffect(() => () => closeKitSnackBar(snackbarId), []);\n\n const isOnePage = view.pageSize > totalCountFiltered;\n const hasSelectedAllAvailableItems =\n view.massSelection === MASS_SELECTION_ALL || view.massSelection.length === totalCountFiltered;\n const hasSelectedSomeItems =\n view.massSelection !== MASS_SELECTION_ALL &&\n view.massSelection.length > 0 &&\n view.massSelection.length < totalCountFiltered;\n\n const _selectAllButton = isOnePage ? (\n <KitCheckbox\n aria-checked={hasSelectedSomeItems ? 'mixed' : hasSelectedAllAvailableItems ? 'true' : 'false'}\n indeterminate={hasSelectedSomeItems}\n checked={hasSelectedAllAvailableItems}\n onChange={_ => {\n if (hasSelectedAllAvailableItems) {\n _setSelectedKeys([]);\n } else {\n _setSelectedKeys(allVisibleKeys);\n }\n }}\n >\n <ResultsCount\n t={t}\n isInactive={isInactive}\n totalCountFiltered={totalCountFiltered}\n totalCountLibrary={totalCountLibrary}\n />\n </KitCheckbox>\n ) : (\n <KitDropDown\n trigger={['click']}\n menu={{\n items: [\n hasSelectedAllAvailableItems\n ? null\n : {\n key: 'toggle_page_selection',\n label: t('explorer.massAction.toggle_selection.select_page', {count: view.pageSize}),\n onClick: () => {\n _setSelectedKeys([...new Set([...view.massSelection, ...allVisibleKeys])]);\n },\n },\n {\n key: 'toggle_all_selection',\n label: hasSelectedAllAvailableItems\n ? t('explorer.massAction.toggle_selection.deselect_all', {count: totalCountFiltered})\n : t('explorer.massAction.toggle_selection.select_all', {count: totalCountFiltered}),\n onClick: async () => {\n if (hasSelectedAllAvailableItems) {\n _setSelectedKeys([]);\n } else {\n _setSelectedKeys(MASS_SELECTION_ALL);\n }\n },\n },\n ],\n }}\n >\n <KitCheckbox\n aria-checked={hasSelectedSomeItems ? 'mixed' : hasSelectedAllAvailableItems ? 'true' : 'false'}\n indeterminate={hasSelectedSomeItems}\n checked={hasSelectedAllAvailableItems}\n >\n <KitSpace size=\"xxs\">\n <ResultsCount\n t={t}\n isInactive={isInactive}\n totalCountFiltered={totalCountFiltered}\n totalCountLibrary={totalCountLibrary}\n />\n <FontAwesomeIcon icon={faCaretDown} size=\"2xs\" />\n </KitSpace>\n </KitCheckbox>\n </KitDropDown>\n );\n\n const _setSelectedKeys = useCallback(\n (keys: MassSelection) =>\n dispatch({\n type: ViewSettingsActionTypes.SET_SELECTED_KEYS,\n payload: keys,\n }),\n [dispatch],\n );\n\n return {\n selectAllButton: isEnabled ? _selectAllButton : null,\n setSelectedKeys: isEnabled ? _setSelectedKeys : null,\n };\n};\n"]}
@@ -16,8 +16,9 @@ import { type FeatureHook, type Entrypoint, type IPrimaryAction } from '../_type
16
16
  * @param totalCount - used for display purpose only
17
17
  * @param onCreate - callback to let outside world known about creating item (and linking)
18
18
  * @param refetch - method to call to refresh the list. A new item will be visible if it matches filters and sorts
19
+ * @param refetchCount - method to call to refresh the count of the library. A new item will be visible if it matches filters and sorts
19
20
  */
20
- export declare const useCreatePrimaryAction: ({ isEnabled, isVisible, libraryId, entrypoint, totalCount, canCreateAndLinkValue, isMultivalue, onCreate, formId, joinLibraryContext, refetch, }: FeatureHook<{
21
+ export declare const useCreatePrimaryAction: ({ isEnabled, isVisible, libraryId, entrypoint, totalCount, canCreateAndLinkValue, isMultivalue, onCreate, formId, joinLibraryContext, refetch, refetchCount, }: FeatureHook<{
21
22
  libraryId: string;
22
23
  entrypoint: Entrypoint;
23
24
  totalCount: number;
@@ -30,6 +31,7 @@ export declare const useCreatePrimaryAction: ({ isEnabled, isVisible, libraryId,
30
31
  joinLibraryContext?: JoinLibraryContextFragment;
31
32
  formId?: string;
32
33
  refetch: () => void;
34
+ refetchCount: () => void;
33
35
  }>) => {
34
36
  createPrimaryAction: IPrimaryAction;
35
37
  createModal: ReactElement<any, string | import("react").JSXElementConstructor<any>>;
@@ -28,8 +28,9 @@ import { faPlus } from '@fortawesome/free-solid-svg-icons';
28
28
  * @param totalCount - used for display purpose only
29
29
  * @param onCreate - callback to let outside world known about creating item (and linking)
30
30
  * @param refetch - method to call to refresh the list. A new item will be visible if it matches filters and sorts
31
+ * @param refetchCount - method to call to refresh the count of the library. A new item will be visible if it matches filters and sorts
31
32
  */
32
- export const useCreatePrimaryAction = ({ isEnabled, isVisible, libraryId, entrypoint, totalCount, canCreateAndLinkValue, isMultivalue, onCreate, formId, joinLibraryContext, refetch, }) => {
33
+ export const useCreatePrimaryAction = ({ isEnabled, isVisible, libraryId, entrypoint, totalCount, canCreateAndLinkValue, isMultivalue, onCreate, formId, joinLibraryContext, refetch, refetchCount, }) => {
33
34
  const { t } = useSharedTranslation();
34
35
  const { lang } = useLang();
35
36
  const [isModalCreationVisible, setIsModalCreationVisible] = useState(false);
@@ -85,6 +86,7 @@ export const useCreatePrimaryAction = ({ isEnabled, isVisible, libraryId, entryp
85
86
  case LibraryBehavior.files:
86
87
  _createModal = (_jsx(UploadFiles, { libraryId: _getLibraryId(), multiple: true, onClose: () => setIsModalCreationVisible(false), onCompleted: () => {
87
88
  refetch();
89
+ refetchCount();
88
90
  _notifyNewCreation(t('upload.file'));
89
91
  setIsModalCreationVisible(false);
90
92
  } }));
@@ -92,6 +94,7 @@ export const useCreatePrimaryAction = ({ isEnabled, isVisible, libraryId, entryp
92
94
  case LibraryBehavior.directories:
93
95
  _createModal = (_jsx(CreateDirectory, { libraryId: _getLibraryId(), onClose: () => setIsModalCreationVisible(false), onCompleted: () => {
94
96
  refetch();
97
+ refetchCount();
95
98
  _notifyNewCreation(t('upload.folder'));
96
99
  setIsModalCreationVisible(false);
97
100
  } }));
@@ -124,6 +127,7 @@ export const useCreatePrimaryAction = ({ isEnabled, isVisible, libraryId, entryp
124
127
  await Promise.resolve(onCreate?.({ recordIdCreated: newRecord.id }));
125
128
  }
126
129
  refetch();
130
+ refetchCount();
127
131
  }, submitButtons: ['create'] }));
128
132
  break;
129
133
  }