@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.
- package/dist/_gqlTypes/index.d.ts +100 -9
- package/dist/_gqlTypes/index.js +43 -8
- package/dist/_gqlTypes/index.js.map +1 -1
- package/dist/components/Explorer/Explorer.d.ts +2 -1
- package/dist/components/Explorer/Explorer.js +31 -13
- package/dist/components/Explorer/Explorer.js.map +1 -1
- package/dist/components/Explorer/_queries/useExplorerCountData.d.ts +16 -0
- package/dist/components/Explorer/_queries/useExplorerCountData.js +26 -0
- package/dist/components/Explorer/_queries/useExplorerCountData.js.map +1 -0
- package/dist/components/Explorer/_queries/useExplorerData.js +18 -20
- package/dist/components/Explorer/_queries/useExplorerData.js.map +1 -1
- package/dist/components/Explorer/actions-mass/ResultsCount.d.ts +10 -0
- package/dist/components/Explorer/actions-mass/ResultsCount.js +8 -0
- package/dist/components/Explorer/actions-mass/ResultsCount.js.map +1 -0
- package/dist/components/Explorer/actions-mass/edit-attribute/EditAttributeMassActionModal.js +1 -1
- package/dist/components/Explorer/actions-mass/edit-attribute/EditAttributeMassActionModal.js.map +1 -1
- package/dist/components/Explorer/actions-mass/edit-attribute/useCountValuesOccurrencesHook.d.ts +9 -2
- package/dist/components/Explorer/actions-mass/edit-attribute/useCountValuesOccurrencesHook.js +18 -4
- package/dist/components/Explorer/actions-mass/edit-attribute/useCountValuesOccurrencesHook.js.map +1 -1
- package/dist/components/Explorer/actions-mass/generate-previews/GeneratePreviewsModal.d.ts +10 -0
- package/dist/components/Explorer/actions-mass/generate-previews/GeneratePreviewsModal.js +69 -0
- package/dist/components/Explorer/actions-mass/generate-previews/GeneratePreviewsModal.js.map +1 -0
- package/dist/components/Explorer/actions-mass/generate-previews/useGetPreviewSizesData.d.ts +18 -0
- package/dist/components/Explorer/actions-mass/generate-previews/useGetPreviewSizesData.js +57 -0
- package/dist/components/Explorer/actions-mass/generate-previews/useGetPreviewSizesData.js.map +1 -0
- package/dist/components/Explorer/actions-mass/useGeneratePreviewsMassAction.d.ts +19 -0
- package/dist/components/Explorer/actions-mass/useGeneratePreviewsMassAction.js +94 -0
- package/dist/components/Explorer/actions-mass/useGeneratePreviewsMassAction.js.map +1 -0
- package/dist/components/Explorer/actions-mass/useMassActions.d.ts +5 -3
- package/dist/components/Explorer/actions-mass/useMassActions.js +19 -13
- package/dist/components/Explorer/actions-mass/useMassActions.js.map +1 -1
- package/dist/components/Explorer/actions-primary/useCreatePrimaryAction.d.ts +3 -1
- package/dist/components/Explorer/actions-primary/useCreatePrimaryAction.js +5 -1
- package/dist/components/Explorer/actions-primary/useCreatePrimaryAction.js.map +1 -1
- package/dist/components/Explorer/manage-view-settings/configure-display/view-type/SelectViewType.js +1 -1
- package/dist/components/Explorer/manage-view-settings/configure-display/view-type/SelectViewType.js.map +1 -1
- package/dist/components/RecordEdition/EditRecord/EditRecord.d.ts +1 -0
- package/dist/components/RecordEdition/EditRecord/EditRecord.js +3 -3
- package/dist/components/RecordEdition/EditRecord/EditRecord.js.map +1 -1
- package/dist/components/RecordEdition/EditRecordModal/EditRecordModal.js +2 -2
- package/dist/components/RecordEdition/EditRecordModal/EditRecordModal.js.map +1 -1
- package/dist/components/RecordEdition/EditRecordPage/EditRecordPage.d.ts +1 -0
- package/dist/components/RecordEdition/EditRecordPage/EditRecordPage.js +4 -4
- package/dist/components/RecordEdition/EditRecordPage/EditRecordPage.js.map +1 -1
- package/dist/components/RecordEdition/_types.d.ts +1 -1
- package/dist/components/RecordEdition/_types.js.map +1 -1
- package/dist/components/RecordEdition/hooks/useGetSubmitButtons.d.ts +1 -1
- package/dist/components/RecordEdition/hooks/useGetSubmitButtons.js +6 -2
- package/dist/components/RecordEdition/hooks/useGetSubmitButtons.js.map +1 -1
- package/dist/hooks/useIFrameMessenger/schema.d.ts +2 -2
- package/dist/hooks/useIFrameMessenger/schema.js +1 -1
- package/dist/hooks/useIFrameMessenger/schema.js.map +1 -1
- package/dist/locales/en/shared.json +11 -4
- package/dist/locales/fr/shared.json +11 -4
- package/package.json +9 -13
package/dist/components/Explorer/actions-mass/edit-attribute/useCountValuesOccurrencesHook.js.map
CHANGED
|
@@ -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,
|
|
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
|
|
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 },
|
|
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
|
-
|
|
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 {
|
|
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
|
|
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 },
|
|
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 ?
|
|
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,
|
|
72
|
+
}, [view.massSelection, filters, totalCountFiltered]);
|
|
67
73
|
useEffect(() => () => closeKitSnackBar(snackbarId), []);
|
|
68
|
-
const isOnePage = view.pageSize >
|
|
69
|
-
const hasSelectedAllAvailableItems = view.massSelection === MASS_SELECTION_ALL || view.massSelection.length ===
|
|
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 <
|
|
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:
|
|
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:
|
|
95
|
-
: t('explorer.massAction.toggle_selection.select_all', { count:
|
|
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: "
|
|
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":"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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, 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
|
}
|