@leav/ui 1.12.0 → 1.13.0-2d58210a
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/__mocks__/utils.d.ts +3 -0
- package/dist/__mocks__/utils.js +2 -0
- package/dist/__mocks__/utils.js.map +1 -0
- package/dist/_gqlTypes/index.d.ts +411 -90
- package/dist/_gqlTypes/index.js +276 -51
- package/dist/_gqlTypes/index.js.map +1 -1
- package/dist/_queries/attributes/attributeDetailsFragment.js +6 -0
- package/dist/_queries/attributes/attributeDetailsFragment.js.map +1 -1
- package/dist/components/Explorer/DataView.js +31 -14
- package/dist/components/Explorer/DataView.js.map +1 -1
- package/dist/components/Explorer/_constants.d.ts +0 -1
- package/dist/components/Explorer/_constants.js +0 -1
- package/dist/components/Explorer/_constants.js.map +1 -1
- package/dist/components/Explorer/actions-item/useEditStatusItemAction.js +22 -10
- package/dist/components/Explorer/actions-item/useEditStatusItemAction.js.map +1 -1
- package/dist/components/Explorer/actions-mass/ResultsCount.js +2 -2
- package/dist/components/Explorer/actions-mass/ResultsCount.js.map +1 -1
- package/dist/components/Explorer/actions-mass/edit-attribute/EditAttributeMassActionModal.d.ts +4 -9
- package/dist/components/Explorer/actions-mass/edit-attribute/EditAttributeMassActionModal.js +3 -11
- package/dist/components/Explorer/actions-mass/edit-attribute/EditAttributeMassActionModal.js.map +1 -1
- package/dist/components/Explorer/actions-mass/edit-attribute/EditTreeAttributeValuesMapping.d.ts +8 -8
- package/dist/components/Explorer/actions-mass/edit-attribute/EditTreeAttributeValuesMapping.js +26 -13
- package/dist/components/Explorer/actions-mass/edit-attribute/EditTreeAttributeValuesMapping.js.map +1 -1
- package/dist/components/Explorer/actions-mass/edit-attribute/TreeNodeRemap.d.ts +7 -0
- package/dist/components/Explorer/actions-mass/edit-attribute/TreeNodeRemap.js +30 -0
- package/dist/components/Explorer/actions-mass/edit-attribute/TreeNodeRemap.js.map +1 -0
- package/dist/components/Explorer/actions-mass/edit-attribute/_types.d.ts +23 -0
- package/dist/components/Explorer/actions-mass/edit-attribute/_types.js +2 -0
- package/dist/components/Explorer/actions-mass/edit-attribute/_types.js.map +1 -0
- package/dist/components/Explorer/actions-mass/edit-attribute/useMassEditableAttributes.d.ts +4 -0
- package/dist/components/Explorer/actions-mass/edit-attribute/useMassEditableAttributes.js +46 -0
- package/dist/components/Explorer/actions-mass/edit-attribute/useMassEditableAttributes.js.map +1 -0
- package/dist/components/Explorer/actions-mass/edit-attribute/useTreeNodeRemapping.d.ts +12 -0
- package/dist/components/Explorer/actions-mass/edit-attribute/useTreeNodeRemapping.js +24 -0
- package/dist/components/Explorer/actions-mass/edit-attribute/useTreeNodeRemapping.js.map +1 -0
- package/dist/components/Explorer/actions-mass/edit-attribute/useValuesDistribution.d.ts +13 -0
- package/dist/components/Explorer/actions-mass/edit-attribute/useValuesDistribution.js +28 -0
- package/dist/components/Explorer/actions-mass/edit-attribute/useValuesDistribution.js.map +1 -0
- package/dist/components/Explorer/actions-mass/useDeactivateMassAction.js +6 -10
- package/dist/components/Explorer/actions-mass/useDeactivateMassAction.js.map +1 -1
- package/dist/components/Explorer/actions-mass/useDeleteLinkValues.js +5 -8
- package/dist/components/Explorer/actions-mass/useDeleteLinkValues.js.map +1 -1
- package/dist/components/Explorer/actions-mass/useEditAttributeMassAction.d.ts +8 -2
- package/dist/components/Explorer/actions-mass/useEditAttributeMassAction.js +104 -72
- package/dist/components/Explorer/actions-mass/useEditAttributeMassAction.js.map +1 -1
- package/dist/components/Explorer/actions-mass/useMassActions.js +30 -19
- package/dist/components/Explorer/actions-mass/useMassActions.js.map +1 -1
- package/dist/components/Explorer/conditionsHelper.d.ts +2 -1
- package/dist/components/Explorer/conditionsHelper.js.map +1 -1
- package/dist/components/Explorer/manage-view-settings/filter-items/FilterItems.js +2 -2
- package/dist/components/Explorer/manage-view-settings/filter-items/FilterItems.js.map +1 -1
- package/dist/components/Explorer/manage-view-settings/save-view/prepareViewForRequest.js +6 -4
- package/dist/components/Explorer/manage-view-settings/save-view/prepareViewForRequest.js.map +1 -1
- package/dist/components/Filters/_types.d.ts +17 -0
- package/dist/components/Filters/_types.js +2 -1
- package/dist/components/Filters/_types.js.map +1 -1
- package/dist/components/Filters/conditionsHelper.d.ts +2 -1
- package/dist/components/Filters/conditionsHelper.js.map +1 -1
- package/dist/components/Filters/context/filtersReducer.d.ts +6 -1
- package/dist/components/Filters/context/filtersReducer.js +45 -5
- package/dist/components/Filters/context/filtersReducer.js.map +1 -1
- package/dist/components/Filters/filter-items/CommonFilterItem.js +4 -1
- package/dist/components/Filters/filter-items/CommonFilterItem.js.map +1 -1
- package/dist/components/Filters/filter-items/filter-type/FilterDropDown.js +15 -3
- package/dist/components/Filters/filter-items/filter-type/FilterDropDown.js.map +1 -1
- package/dist/components/Filters/filter-items/filter-type/FilterDropdownContent.d.ts +3 -1
- package/dist/components/Filters/filter-items/filter-type/FilterDropdownContent.js +2 -2
- package/dist/components/Filters/filter-items/filter-type/FilterDropdownContent.js.map +1 -1
- package/dist/components/Filters/filter-items/filter-type/_types.d.ts +3 -1
- package/dist/components/Filters/filter-items/filter-type/_types.js.map +1 -1
- package/dist/components/Filters/filter-items/filter-type/smart-filter/SmartFilterAttributeDropdown.js +2 -3
- package/dist/components/Filters/filter-items/filter-type/smart-filter/SmartFilterAttributeDropdown.js.map +1 -1
- package/dist/components/Filters/filter-items/filter-type/smart-filter/useGetSmartFilterData.d.ts +2 -4
- package/dist/components/Filters/filter-items/filter-type/smart-filter/useGetSmartFilterData.js +22 -16
- package/dist/components/Filters/filter-items/filter-type/smart-filter/useGetSmartFilterData.js.map +1 -1
- package/dist/components/Filters/filter-items/filter-type/tree/TreeAttributeDropDown.js +39 -83
- package/dist/components/Filters/filter-items/filter-type/tree/TreeAttributeDropDown.js.map +1 -1
- package/dist/components/Filters/filter-items/filter-type/tree/useGetTreeData.d.ts +1 -0
- package/dist/components/Filters/filter-items/filter-type/tree/useGetTreeData.js.map +1 -1
- package/dist/components/Filters/filter-items/filter-type/tree/useTreeNodeSelection.d.ts +21 -0
- package/dist/components/Filters/filter-items/filter-type/tree/useTreeNodeSelection.js +85 -0
- package/dist/components/Filters/filter-items/filter-type/tree/useTreeNodeSelection.js.map +1 -0
- package/dist/components/Filters/filter-items/filter-type/tree/useTreePermissions.d.ts +8 -0
- package/dist/components/Filters/filter-items/filter-type/tree/useTreePermissions.js +40 -0
- package/dist/components/Filters/filter-items/filter-type/tree/useTreePermissions.js.map +1 -0
- package/dist/components/Filters/filter-items/filter-type/tree/useTreesSearch.d.ts +2 -3
- package/dist/components/Filters/filter-items/filter-type/tree/useTreesSearch.js +2 -3
- package/dist/components/Filters/filter-items/filter-type/tree/useTreesSearch.js.map +1 -1
- package/dist/components/Filters/filter-items/filter-type/tree/utils/filterTreeByPermission.d.ts +1 -1
- package/dist/components/Filters/filter-items/filter-type/tree/utils/filterTreeByPermission.js +3 -4
- package/dist/components/Filters/filter-items/filter-type/tree/utils/filterTreeByPermission.js.map +1 -1
- package/dist/components/Filters/filter-items/filter-type/useConditionOptionsByType.js.map +1 -1
- package/dist/components/Filters/filter-items/shared/EmptyValueCheckbox.js +1 -7
- package/dist/components/Filters/filter-items/shared/EmptyValueCheckbox.js.map +1 -1
- package/dist/components/Filters/prepareFiltersForRequest.js +37 -14
- package/dist/components/Filters/prepareFiltersForRequest.js.map +1 -1
- package/dist/components/Filters/useFilters.d.ts +510 -0
- package/dist/components/Filters/useTransformFilters.js +5 -2
- package/dist/components/Filters/useTransformFilters.js.map +1 -1
- package/dist/components/RecordEdition/EditRecord/EditRecord.js +8 -1
- package/dist/components/RecordEdition/EditRecord/EditRecord.js.map +1 -1
- package/dist/components/RecordEdition/EditRecordContent/uiElements/LinkField/tag/unlink-record/useUnlinkRecord.d.ts +1 -4
- package/dist/components/RecordEdition/EditRecordContent/uiElements/LinkField/tag/unlink-record/useUnlinkRecord.js +5 -9
- package/dist/components/RecordEdition/EditRecordContent/uiElements/LinkField/tag/unlink-record/useUnlinkRecord.js.map +1 -1
- package/dist/components/RecordEdition/EditRecordContent/uiElements/shared/DeleteAllValuesButton.js +4 -8
- package/dist/components/RecordEdition/EditRecordContent/uiElements/shared/DeleteAllValuesButton.js.map +1 -1
- package/dist/components/RecordEdition/EditRecordModal/EditRecordModal.js +1 -1
- package/dist/components/RecordEdition/EditRecordModal/EditRecordModal.js.map +1 -1
- package/dist/components/RecordEdition/hooks/useCreateCancelConfirm/useCreateCancelConfirm.js +4 -8
- package/dist/components/RecordEdition/hooks/useCreateCancelConfirm/useCreateCancelConfirm.js.map +1 -1
- package/dist/constants.d.ts +1 -0
- package/dist/constants.js +1 -0
- package/dist/constants.js.map +1 -1
- package/dist/hooks/index.d.ts +4 -0
- package/dist/hooks/index.js +4 -0
- package/dist/hooks/index.js.map +1 -1
- package/dist/hooks/useConfirmModal/__mocks__/index.d.ts +1 -0
- package/dist/hooks/useConfirmModal/__mocks__/index.js +5 -0
- package/dist/hooks/useConfirmModal/__mocks__/index.js.map +1 -0
- package/dist/hooks/useConfirmModal/__mocks__/useConfirmModal.d.ts +3 -0
- package/dist/hooks/useConfirmModal/__mocks__/useConfirmModal.js +7 -0
- package/dist/hooks/useConfirmModal/__mocks__/useConfirmModal.js.map +1 -0
- package/dist/hooks/useConfirmModal/index.d.ts +1 -0
- package/dist/hooks/useConfirmModal/index.js +5 -0
- package/dist/hooks/useConfirmModal/index.js.map +1 -0
- package/dist/hooks/useConfirmModal/useConfirmModal.d.ts +7 -0
- package/dist/hooks/useConfirmModal/useConfirmModal.js +25 -0
- package/dist/hooks/useConfirmModal/useConfirmModal.js.map +1 -0
- package/dist/hooks/useGetRecordIdCard/index.d.ts +1 -0
- package/dist/hooks/useGetRecordIdCard/index.js +5 -0
- package/dist/hooks/useGetRecordIdCard/index.js.map +1 -0
- package/dist/hooks/useGetRecordIdCard/useGetRecordIdCard.d.ts +18 -0
- package/dist/hooks/useGetRecordIdCard/useGetRecordIdCard.js +20 -0
- package/dist/hooks/useGetRecordIdCard/useGetRecordIdCard.js.map +1 -0
- package/dist/hooks/useIFrameMessenger/iFrameMessengerContext.d.ts +6 -0
- package/dist/hooks/useIFrameMessenger/iFrameMessengerContext.js +8 -0
- package/dist/hooks/useIFrameMessenger/iFrameMessengerContext.js.map +1 -0
- package/dist/hooks/useIFrameMessenger/types.d.ts +10 -3
- package/dist/hooks/useIFrameMessenger/types.js.map +1 -1
- package/dist/hooks/useIFrameMessenger/useIFrameMessenger.d.ts +11 -2
- package/dist/hooks/useIFrameMessenger/useIFrameMessenger.js +31 -10
- package/dist/hooks/useIFrameMessenger/useIFrameMessenger.js.map +1 -1
- package/dist/hooks/useIFrameMessenger/useIFrameMessengerContext.d.ts +13 -0
- package/dist/hooks/useIFrameMessenger/useIFrameMessengerContext.js +59 -0
- package/dist/hooks/useIFrameMessenger/useIFrameMessengerContext.js.map +1 -0
- package/dist/hooks/useIFrameMessenger/useIFrameMessengerHandlers.d.ts +13 -0
- package/dist/hooks/useIFrameMessenger/useIFrameMessengerHandlers.js +29 -0
- package/dist/hooks/useIFrameMessenger/useIFrameMessengerHandlers.js.map +1 -0
- package/dist/hooks/useIFrameMessengerClient/IFrameMessengerClient.js +3 -0
- package/dist/hooks/useIFrameMessengerClient/IFrameMessengerClient.js.map +1 -1
- package/dist/hooks/useIFrameMessengerClient/iFrameMessengerClientContext.d.ts +1 -0
- package/dist/hooks/useIFrameMessengerClient/useIFrameMessengerClient.d.ts +1 -0
- package/dist/hooks/useSharedTranslation/__mocks__/useSharedTranslation.js.map +1 -1
- package/dist/locales/en/shared.json +10 -5
- package/dist/locales/fr/shared.json +12 -7
- package/package.json +17 -17
- package/dist/components/Explorer/actions-mass/edit-attribute/EditTreeAttributeValueLine.d.ts +0 -8
- package/dist/components/Explorer/actions-mass/edit-attribute/EditTreeAttributeValueLine.js +0 -40
- package/dist/components/Explorer/actions-mass/edit-attribute/EditTreeAttributeValueLine.js.map +0 -1
- package/dist/components/Explorer/actions-mass/edit-attribute/useCountValuesOccurrencesHook.d.ts +0 -17
- package/dist/components/Explorer/actions-mass/edit-attribute/useCountValuesOccurrencesHook.js +0 -42
- package/dist/components/Explorer/actions-mass/edit-attribute/useCountValuesOccurrencesHook.js.map +0 -1
- package/dist/components/Explorer/actions-mass/edit-attribute/useListEditableAttributeHook.d.ts +0 -5
- package/dist/components/Explorer/actions-mass/edit-attribute/useListEditableAttributeHook.js +0 -20
- package/dist/components/Explorer/actions-mass/edit-attribute/useListEditableAttributeHook.js.map +0 -1
- package/dist/components/Explorer/actions-mass/edit-attribute/useListTreeAttributeValuesHook.d.ts +0 -12
- package/dist/components/Explorer/actions-mass/edit-attribute/useListTreeAttributeValuesHook.js +0 -30
- package/dist/components/Explorer/actions-mass/edit-attribute/useListTreeAttributeValuesHook.js.map +0 -1
package/dist/components/Filters/filter-items/filter-type/smart-filter/useGetSmartFilterData.d.ts
CHANGED
|
@@ -2,8 +2,7 @@ import { type IUIFilterTree, type FiltersOperator, type UIFilter } from '../../.
|
|
|
2
2
|
export interface ISmartFilterNode {
|
|
3
3
|
title: string;
|
|
4
4
|
key: string;
|
|
5
|
-
|
|
6
|
-
recordId: string;
|
|
5
|
+
value: string | null;
|
|
7
6
|
count: number;
|
|
8
7
|
ghosted?: boolean;
|
|
9
8
|
}
|
|
@@ -14,9 +13,8 @@ interface IUseGetSmartFilterDataProps {
|
|
|
14
13
|
filtersOperator: FiltersOperator;
|
|
15
14
|
selectedValueIds?: string[] | null;
|
|
16
15
|
selectedFormattedValues?: Array<string | null> | null;
|
|
17
|
-
linkedLibraryId?: string;
|
|
18
16
|
}
|
|
19
|
-
export declare const useGetSmartFilterData: ({ libraryId, attributeId, filters, filtersOperator, selectedValueIds, selectedFormattedValues,
|
|
17
|
+
export declare const useGetSmartFilterData: ({ libraryId, attributeId, filters, filtersOperator, selectedValueIds, selectedFormattedValues, }: IUseGetSmartFilterDataProps) => {
|
|
20
18
|
smartFilterDataToDisplay: ISmartFilterNode[];
|
|
21
19
|
noValueNodeData: ISmartFilterNode;
|
|
22
20
|
isLoading: boolean;
|
package/dist/components/Filters/filter-items/filter-type/smart-filter/useGetSmartFilterData.js
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
// License text available at https://www.gnu.org/licenses/lgpl-3.0.txt
|
|
4
4
|
import { useSmartFilterListValuesQuery } from '../../../../../_gqlTypes';
|
|
5
5
|
import { prepareFiltersForRequest } from '../../../../../components/Filters/prepareFiltersForRequest';
|
|
6
|
-
export const useGetSmartFilterData = ({ libraryId, attributeId, filters, filtersOperator, selectedValueIds, selectedFormattedValues,
|
|
6
|
+
export const useGetSmartFilterData = ({ libraryId, attributeId, filters, filtersOperator, selectedValueIds, selectedFormattedValues, }) => {
|
|
7
7
|
const filtersWithoutCurrentAttributeFilter = filters.filter(filter => filter.attribute.id !== attributeId);
|
|
8
8
|
const preparedFilters = prepareFiltersForRequest(filtersWithoutCurrentAttributeFilter, filtersOperator, undefined);
|
|
9
9
|
const { data, loading, error } = useSmartFilterListValuesQuery({
|
|
@@ -16,21 +16,28 @@ export const useGetSmartFilterData = ({ libraryId, attributeId, filters, filters
|
|
|
16
16
|
const occurrences = data?.listDistinctValues;
|
|
17
17
|
const smartFilterData = occurrences?.length
|
|
18
18
|
? occurrences
|
|
19
|
-
.map(
|
|
19
|
+
.map(occurrence => 'standardValue' in occurrence && occurrence.standardValue !== null
|
|
20
20
|
? {
|
|
21
|
-
key:
|
|
22
|
-
title:
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
count,
|
|
21
|
+
key: occurrence.standardValue,
|
|
22
|
+
title: occurrence.standardValue,
|
|
23
|
+
value: occurrence.standardValue,
|
|
24
|
+
count: occurrence.count,
|
|
26
25
|
}
|
|
27
|
-
:
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
26
|
+
: 'recordValue' in occurrence && occurrence.recordValue !== null
|
|
27
|
+
? {
|
|
28
|
+
key: occurrence.recordValue.id,
|
|
29
|
+
title: occurrence.recordValue.whoAmI.label ??
|
|
30
|
+
occurrence.recordValue.whoAmI.id ??
|
|
31
|
+
occurrence.recordValue.id,
|
|
32
|
+
value: occurrence.recordValue.whoAmI.id,
|
|
33
|
+
count: occurrence.count,
|
|
34
|
+
}
|
|
35
|
+
: {
|
|
36
|
+
key: 'no_value',
|
|
37
|
+
title: '',
|
|
38
|
+
value: null,
|
|
39
|
+
count: occurrence.count,
|
|
40
|
+
})
|
|
34
41
|
.sort((a, b) => a.title.localeCompare(b.title, undefined, { numeric: true }))
|
|
35
42
|
: [];
|
|
36
43
|
const smartFilterDataWithoutNoValue = smartFilterData.filter(node => node.key !== 'no_value');
|
|
@@ -41,8 +48,7 @@ export const useGetSmartFilterData = ({ libraryId, attributeId, filters, filters
|
|
|
41
48
|
const formattedValue = index >= 0 && selectedFormattedValues?.[index] != null ? selectedFormattedValues[index] : nodeId;
|
|
42
49
|
return {
|
|
43
50
|
key: nodeId,
|
|
44
|
-
|
|
45
|
-
libraryId: linkedLibraryId ?? '',
|
|
51
|
+
value: nodeId,
|
|
46
52
|
title: formattedValue ?? nodeId,
|
|
47
53
|
count: 0,
|
|
48
54
|
ghosted: true,
|
package/dist/components/Filters/filter-items/filter-type/smart-filter/useGetSmartFilterData.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useGetSmartFilterData.js","sourceRoot":"","sources":["../../../../../../src/components/Filters/filter-items/filter-type/smart-filter/useGetSmartFilterData.ts"],"names":[],"mappings":"AAAA,oFAAoF;AACpF,sCAAsC;AACtC,sEAAsE;AACtE,OAAO,EAAC,6BAA6B,EAAC,MAAM,eAAe,CAAC;AAC5D,OAAO,EAAC,wBAAwB,EAAC,MAAM,iDAAiD,CAAC;
|
|
1
|
+
{"version":3,"file":"useGetSmartFilterData.js","sourceRoot":"","sources":["../../../../../../src/components/Filters/filter-items/filter-type/smart-filter/useGetSmartFilterData.ts"],"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 {useSmartFilterListValuesQuery} from '_ui/_gqlTypes';\nimport {prepareFiltersForRequest} from '_ui/components/Filters/prepareFiltersForRequest';\nimport {type IUIFilterTree, type FiltersOperator, type UIFilter} from '_ui/components/Filters/_types';\n\nexport interface ISmartFilterNode {\n title: string;\n key: string;\n value: string | null; // recordId or text value\n count: number;\n ghosted?: boolean;\n}\n\ninterface IUseGetSmartFilterDataProps {\n libraryId: string;\n attributeId: string;\n filters: UIFilter[] | IUIFilterTree[];\n filtersOperator: FiltersOperator;\n selectedValueIds?: string[] | null;\n selectedFormattedValues?: Array<string | null> | null;\n}\n\nexport const useGetSmartFilterData = ({\n libraryId,\n attributeId,\n filters,\n filtersOperator,\n selectedValueIds,\n selectedFormattedValues,\n}: IUseGetSmartFilterDataProps) => {\n const filtersWithoutCurrentAttributeFilter = filters.filter(filter => filter.attribute.id !== attributeId);\n const preparedFilters = prepareFiltersForRequest(filtersWithoutCurrentAttributeFilter, filtersOperator, undefined);\n\n const {data, loading, error} = useSmartFilterListValuesQuery({\n variables: {\n library: libraryId,\n attribute: attributeId,\n recordFilters: preparedFilters ?? undefined,\n },\n });\n\n const occurrences = data?.listDistinctValues;\n\n const smartFilterData: ISmartFilterNode[] = occurrences?.length\n ? occurrences\n .map(occurrence =>\n 'standardValue' in occurrence && occurrence.standardValue !== null\n ? {\n key: occurrence.standardValue,\n title: occurrence.standardValue,\n value: occurrence.standardValue,\n count: occurrence.count,\n }\n : 'recordValue' in occurrence && occurrence.recordValue !== null\n ? {\n key: occurrence.recordValue.id,\n title:\n occurrence.recordValue.whoAmI.label ??\n occurrence.recordValue.whoAmI.id ??\n occurrence.recordValue.id,\n value: occurrence.recordValue.whoAmI.id,\n count: occurrence.count,\n }\n : {\n key: 'no_value',\n title: '',\n value: null,\n count: occurrence.count,\n },\n )\n .sort((a, b) => a.title.localeCompare(b.title, undefined, {numeric: true}))\n : [];\n\n const smartFilterDataWithoutNoValue = smartFilterData.filter(node => node.key !== 'no_value');\n const noValueNodeData = smartFilterData.find(node => node.key === 'no_value');\n\n const selectedNodeIdsNotInSmartFilterData = (selectedValueIds ?? []).filter(\n nodeId => !smartFilterData.some(node => node.key === nodeId),\n );\n const selectedNodesNotInSmartFilterData: ISmartFilterNode[] = selectedNodeIdsNotInSmartFilterData.map(nodeId => {\n const index = selectedValueIds?.indexOf(nodeId) ?? -1;\n const formattedValue =\n index >= 0 && selectedFormattedValues?.[index] != null ? selectedFormattedValues[index] : nodeId;\n return {\n key: nodeId,\n value: nodeId,\n title: formattedValue ?? nodeId,\n count: 0,\n ghosted: true,\n };\n });\n\n const smartFilterDataToDisplay = [...smartFilterDataWithoutNoValue, ...selectedNodesNotInSmartFilterData];\n\n return {\n smartFilterDataToDisplay,\n noValueNodeData,\n isLoading: loading,\n error: error ?? null,\n };\n};\n"]}
|
|
@@ -1,104 +1,62 @@
|
|
|
1
|
-
import { jsx as _jsx, jsxs as _jsxs
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
2
|
// Copyright LEAV Solutions 2017 until 2023/11/05, Copyright Aristid from 2023/11/06
|
|
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
|
-
import {
|
|
5
|
+
import { useEffect, useState } from 'react';
|
|
6
6
|
import styled from 'styled-components';
|
|
7
|
-
import {
|
|
7
|
+
import { KitLoader, KitSpace, KitTree } from 'aristid-ds';
|
|
8
8
|
import { useGetTreeData } from './useGetTreeData';
|
|
9
9
|
import { ErrorDisplay } from '../../../../../components/ErrorDisplay';
|
|
10
|
-
import { useSharedTranslation } from '../../../../../hooks/useSharedTranslation';
|
|
11
10
|
import { useTreesSearch } from './useTreesSearch';
|
|
12
11
|
import { useFiltersContext } from '../../../../../components/Filters/useFiltersContext';
|
|
13
12
|
import { EmptyValueCheckbox } from '../../shared/EmptyValueCheckbox';
|
|
14
13
|
import { SelectAllCheckbox } from '../../shared/SelectAllCheckbox';
|
|
15
|
-
import { buildFlattenTree } from './utils/buildFlattenTreeMap';
|
|
16
|
-
import { getSelectAllState } from './utils/getSelectAllState';
|
|
17
|
-
import { filterTreeByPermission } from './utils/filterTreeByPermission';
|
|
18
14
|
import { countSelectedTreeChildren } from './utils/countSelectedTreeChildren';
|
|
19
15
|
import { FilterTreeNodeTitle } from '../../shared/FilterTreeNodeTitle';
|
|
16
|
+
import { useTreePermissions } from './useTreePermissions';
|
|
17
|
+
import { useTreeNodeSelection } from './useTreeNodeSelection';
|
|
20
18
|
const ScrollableContent = styled.div `
|
|
21
|
-
max-height:
|
|
19
|
+
max-height: 348px; /* Equal to 10.5 nodes of KitTree */
|
|
22
20
|
overflow-y: auto;
|
|
23
21
|
overflow-x: hidden;
|
|
24
22
|
width: 100%;
|
|
25
23
|
`;
|
|
26
|
-
const FilteredTreeTitle = styled(KitTypography.Text) `
|
|
27
|
-
color: var(--general-colors-neutral-grey-500);
|
|
28
|
-
`;
|
|
29
|
-
const FilteredTreeSpacer = styled(KitSpace) `
|
|
30
|
-
width: 100%;
|
|
31
|
-
`;
|
|
32
24
|
const DropdownContentWrapper = styled(KitSpace) `
|
|
33
25
|
width: 327px;
|
|
34
26
|
justify-content: center;
|
|
35
27
|
`;
|
|
36
|
-
|
|
37
|
-
|
|
28
|
+
// Applies ghosted styling to tree nodes that have data-ghosted="true" on their title wrapper.
|
|
29
|
+
// Used to visually distinguish hidden-by-default nodes when the toggle is active.
|
|
30
|
+
const StyledKitTreeWithGhostedNodes = styled(KitTree) `
|
|
31
|
+
& .ant-tree-treenode:has(div[data-ghosted='true']) {
|
|
32
|
+
.ant-typography {
|
|
33
|
+
color: var(--general-colors-neutral-grey-500);
|
|
34
|
+
font-style: italic;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
`;
|
|
38
|
+
export const TreeAttributeDropDown = ({ filter, onFilterChange, toggleHiddenRef, onPermissionConfiguredChange, }) => {
|
|
38
39
|
const { filtersData } = useFiltersContext();
|
|
39
40
|
const { treeData, isLoading, error } = useGetTreeData({
|
|
40
41
|
treeId: filter.attribute.linkedTree?.id ?? '',
|
|
41
42
|
attributeId: filter.attribute.id,
|
|
42
43
|
libraryId: filtersData.libraryId,
|
|
43
44
|
});
|
|
44
|
-
|
|
45
|
-
const
|
|
46
|
-
const
|
|
47
|
-
|
|
45
|
+
const includeHiddenOptions = filter.includeHiddenOptions ?? false;
|
|
46
|
+
const { displayTree, flattenTreeData, flattenForSelectAll, isAccessPermissionConfigured } = useTreePermissions(treeData, includeHiddenOptions);
|
|
47
|
+
const { selectedNodesIds, allSelected, indeterminate, handleOnSelectEmptyValue, handleOnSelect, handleOnSelectAll } = useTreeNodeSelection({
|
|
48
|
+
filter,
|
|
49
|
+
onFilterChange,
|
|
50
|
+
flattenTreeData,
|
|
51
|
+
flattenForSelectAll,
|
|
52
|
+
isAccessPermissionConfigured,
|
|
53
|
+
toggleHiddenRef,
|
|
54
|
+
});
|
|
55
|
+
const { filteredTree, expandedNodeIdsFromSearch, SearchInput } = useTreesSearch(displayTree);
|
|
48
56
|
const [expandedNodeIdsFromUser, setExpandedNodeIdsFromUser] = useState([]);
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
const flattenTreeData = useMemo(() => buildFlattenTree(treeData), [treeData]);
|
|
53
|
-
const flattenVisibleByDefaultTree = useMemo(() => buildFlattenTree(visibleByDefaultTree), [visibleByDefaultTree]);
|
|
54
|
-
const flattenHiddenByDefaultTree = useMemo(() => buildFlattenTree(hiddenByDefaultTree), [hiddenByDefaultTree]);
|
|
55
|
-
const _handleOnSelectEmptyValue = (selected) => {
|
|
56
|
-
onFilterChange({
|
|
57
|
-
...filter,
|
|
58
|
-
withEmptyValues: selected,
|
|
59
|
-
});
|
|
60
|
-
};
|
|
61
|
-
const _handleOnSelect = (node, selected) => {
|
|
62
|
-
let newSelectedIds;
|
|
63
|
-
if (selected) {
|
|
64
|
-
newSelectedIds = [...selectedNodesIds, node.id];
|
|
65
|
-
}
|
|
66
|
-
else {
|
|
67
|
-
newSelectedIds = selectedNodesIds.filter(selectedValue => selectedValue !== node.id);
|
|
68
|
-
}
|
|
69
|
-
const selectedNodes = newSelectedIds
|
|
70
|
-
.map(nodeId => flattenTreeData.get(nodeId))
|
|
71
|
-
.filter((selectedNode) => Boolean(selectedNode));
|
|
72
|
-
onFilterChange({
|
|
73
|
-
...filter,
|
|
74
|
-
nodes: selectedNodes.map(selectedNode => ({ nodeId: selectedNode.id, libraryId: selectedNode.libraryId })),
|
|
75
|
-
value: selectedNodes.map(selectedNode => selectedNode.recordId),
|
|
76
|
-
formattedValue: selectedNodes.map(selectedNode => selectedNode.title),
|
|
77
|
-
});
|
|
78
|
-
};
|
|
79
|
-
const _handleOnSelectAll = (treeToSelect, isSelected) => {
|
|
80
|
-
const treeNodeIds = Array.from(treeToSelect.keys());
|
|
81
|
-
// Using Set to avoid duplicates
|
|
82
|
-
const newSelectedIds = isSelected
|
|
83
|
-
? [...new Set([...selectedNodesIds, ...treeNodeIds])]
|
|
84
|
-
: selectedNodesIds.filter(id => !treeNodeIds.includes(id));
|
|
85
|
-
const selectedNodes = newSelectedIds
|
|
86
|
-
.map(nodeId => flattenTreeData.get(nodeId))
|
|
87
|
-
.filter((selectedNode) => Boolean(selectedNode));
|
|
88
|
-
onFilterChange({
|
|
89
|
-
...filter,
|
|
90
|
-
nodes: selectedNodes.map(selectedNode => ({
|
|
91
|
-
nodeId: selectedNode.id,
|
|
92
|
-
libraryId: selectedNode.libraryId,
|
|
93
|
-
})),
|
|
94
|
-
value: selectedNodes.map(selectedNode => selectedNode.recordId),
|
|
95
|
-
formattedValue: selectedNodes.map(selectedNode => selectedNode.title),
|
|
96
|
-
});
|
|
97
|
-
};
|
|
98
|
-
const _handleOnSelectAllVisibleByDefault = (isSelected) => _handleOnSelectAll(flattenVisibleByDefaultTree, isSelected);
|
|
99
|
-
const _handleOnSelectAllHiddenByDefault = (isSelected) => _handleOnSelectAll(flattenHiddenByDefaultTree, isSelected);
|
|
100
|
-
const { allSelected: allVisibleSelected, indeterminate: visibleIndeterminate } = getSelectAllState(selectedNodesIds, flattenVisibleByDefaultTree);
|
|
101
|
-
const { allSelected: allHiddenSelected, indeterminate: hiddenIndeterminate } = getSelectAllState(selectedNodesIds, flattenHiddenByDefaultTree);
|
|
57
|
+
useEffect(() => {
|
|
58
|
+
onPermissionConfiguredChange?.(isAccessPermissionConfigured);
|
|
59
|
+
}, [isAccessPermissionConfigured, onPermissionConfiguredChange]);
|
|
102
60
|
const treeCommonProps = {
|
|
103
61
|
selectedKeys: selectedNodesIds,
|
|
104
62
|
checkedKeys: selectedNodesIds,
|
|
@@ -109,23 +67,23 @@ export const TreeAttributeDropDown = ({ filter, onFilterChange, }) => {
|
|
|
109
67
|
multiple: true,
|
|
110
68
|
titleRender(node) {
|
|
111
69
|
const nodeData = node;
|
|
112
|
-
// TODO: countSelectedTreeChildren is computed here because the tree
|
|
113
|
-
//
|
|
114
|
-
//
|
|
115
|
-
// moved closer to the data fetching (e.g. in _toTreeNode in useGetTreeData).
|
|
70
|
+
// TODO: countSelectedTreeChildren is computed here because the tree may contain
|
|
71
|
+
// disabled-checkbox parents whose children are in a different permission group.
|
|
72
|
+
// This ensures the count reflects the actual selected descendants regardless of splitting.
|
|
116
73
|
const selectedChildrenCount = countSelectedTreeChildren(nodeData, selectedNodesIds);
|
|
117
|
-
|
|
74
|
+
const isHiddenByDefault = includeHiddenOptions && nodeData.accessRecordByDefaultPermission === false;
|
|
75
|
+
return (_jsx(FilterTreeNodeTitle, { title: nodeData.title, count: selectedChildrenCount > 0 ? selectedChildrenCount : undefined, ghosted: isHiddenByDefault }));
|
|
118
76
|
},
|
|
119
77
|
onExpand: expandedKeys => {
|
|
120
78
|
setExpandedNodeIdsFromUser(expandedKeys);
|
|
121
79
|
},
|
|
122
80
|
onCheck: (_, info) => {
|
|
123
81
|
const node = info.node;
|
|
124
|
-
|
|
82
|
+
handleOnSelect(node, info.checked);
|
|
125
83
|
},
|
|
126
84
|
onSelect: (_, info) => {
|
|
127
85
|
const node = info.node;
|
|
128
|
-
|
|
86
|
+
handleOnSelect(node, info.selected);
|
|
129
87
|
},
|
|
130
88
|
};
|
|
131
89
|
if (isLoading) {
|
|
@@ -134,8 +92,6 @@ export const TreeAttributeDropDown = ({ filter, onFilterChange, }) => {
|
|
|
134
92
|
if (error) {
|
|
135
93
|
return (_jsx(DropdownContentWrapper, { children: _jsx(ErrorDisplay, { message: error.message }) }));
|
|
136
94
|
}
|
|
137
|
-
return (_jsxs(DropdownContentWrapper, { direction: "vertical", size: "xs", children: [SearchInput,
|
|
138
|
-
? _handleOnSelectAllVisibleByDefault
|
|
139
|
-
: _handleOnSelectAllHiddenByDefault }), _jsx(KitTree, { treeData: visibleByDefaultTree.length > 0 ? filteredVisibleByDefaultTree : filteredHiddenByDefaultTree, ...treeCommonProps })] }))] }));
|
|
95
|
+
return (_jsxs(DropdownContentWrapper, { direction: "vertical", size: "xs", children: [SearchInput, _jsxs(ScrollableContent, { children: [_jsx(EmptyValueCheckbox, { onSelect: handleOnSelectEmptyValue, filter: filter }), _jsx(SelectAllCheckbox, { checked: allSelected, indeterminate: indeterminate, onChange: checked => handleOnSelectAll(flattenForSelectAll, checked) }), _jsx(StyledKitTreeWithGhostedNodes, { treeData: filteredTree, ...treeCommonProps })] })] }));
|
|
140
96
|
};
|
|
141
97
|
//# sourceMappingURL=TreeAttributeDropDown.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TreeAttributeDropDown.js","sourceRoot":"","sources":["../../../../../../src/components/Filters/filter-items/filter-type/tree/TreeAttributeDropDown.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 ComponentProps, type FunctionComponent, type Key, useMemo, useState} from 'react';\nimport {type IFilterChildrenTreeDropDownProps} from '../_types';\nimport styled from 'styled-components';\nimport {KitDivider, KitLoader, KitSpace, KitTree, KitTypography} from 'aristid-ds';\nimport {type EventDataNode} from 'antd/lib/tree';\nimport {type ITreeNode, useGetTreeData} from './useGetTreeData';\nimport {ErrorDisplay} from '_ui/components/ErrorDisplay';\nimport {useSharedTranslation} from '_ui/hooks/useSharedTranslation';\nimport {useTreesSearch} from './useTreesSearch';\nimport {useFiltersContext} from '_ui/components/Filters/useFiltersContext';\nimport {EmptyValueCheckbox} from '../../shared/EmptyValueCheckbox';\nimport {SelectAllCheckbox} from '../../shared/SelectAllCheckbox';\nimport {buildFlattenTree} from './utils/buildFlattenTreeMap';\nimport {getSelectAllState} from './utils/getSelectAllState';\nimport {filterTreeByPermission} from './utils/filterTreeByPermission';\nimport {countSelectedTreeChildren} from './utils/countSelectedTreeChildren';\nimport {FilterTreeNodeTitle} from '../../shared/FilterTreeNodeTitle';\n\nconst ScrollableContent = styled.div`\n max-height: 182px; /* Equal to 5.5 nodes of KitTree */\n overflow-y: auto;\n overflow-x: hidden;\n width: 100%;\n`;\n\nconst FilteredTreeTitle = styled(KitTypography.Text)`\n color: var(--general-colors-neutral-grey-500);\n`;\n\nconst FilteredTreeSpacer = styled(KitSpace)`\n width: 100%;\n`;\n\nconst DropdownContentWrapper = styled(KitSpace)`\n width: 327px;\n justify-content: center;\n`;\n\nexport const TreeAttributeDropDown: FunctionComponent<IFilterChildrenTreeDropDownProps> = ({\n filter,\n onFilterChange,\n}) => {\n const {t} = useSharedTranslation();\n const {filtersData} = useFiltersContext();\n const {treeData, isLoading, error} = useGetTreeData({\n treeId: filter.attribute.linkedTree?.id ?? '',\n attributeId: filter.attribute.id,\n libraryId: filtersData.libraryId,\n });\n\n // Split treeData based on accessRecordByDefaultPermission\n const visibleByDefaultTree = useMemo(() => filterTreeByPermission(treeData, true), [treeData]);\n const hiddenByDefaultTree = useMemo(() => filterTreeByPermission(treeData, false), [treeData]);\n\n const {filteredVisibleByDefaultTree, filteredHiddenByDefaultTree, expandedNodeIdsFromSearch, SearchInput} =\n useTreesSearch(visibleByDefaultTree, hiddenByDefaultTree);\n\n const [expandedNodeIdsFromUser, setExpandedNodeIdsFromUser] = useState<Key[]>([]);\n\n const selectedNodesIds = (filter.nodes ?? []).map(node => node.nodeId);\n const areBothTreesFilled = visibleByDefaultTree.length > 0 && hiddenByDefaultTree.length > 0;\n\n // Build flatten trees to optimize the search and selection of nodes in handling functions\n const flattenTreeData = useMemo(() => buildFlattenTree(treeData), [treeData]);\n const flattenVisibleByDefaultTree = useMemo(() => buildFlattenTree(visibleByDefaultTree), [visibleByDefaultTree]);\n const flattenHiddenByDefaultTree = useMemo(() => buildFlattenTree(hiddenByDefaultTree), [hiddenByDefaultTree]);\n\n const _handleOnSelectEmptyValue = (selected: boolean) => {\n onFilterChange({\n ...filter,\n withEmptyValues: selected,\n });\n };\n\n const _handleOnSelect = (node: ITreeNode, selected: boolean) => {\n let newSelectedIds: string[];\n\n if (selected) {\n newSelectedIds = [...selectedNodesIds, node.id];\n } else {\n newSelectedIds = selectedNodesIds.filter(selectedValue => selectedValue !== node.id);\n }\n\n const selectedNodes = newSelectedIds\n .map(nodeId => flattenTreeData.get(nodeId))\n .filter((selectedNode): selectedNode is ITreeNode => Boolean(selectedNode));\n\n onFilterChange({\n ...filter,\n nodes: selectedNodes.map(selectedNode => ({nodeId: selectedNode.id, libraryId: selectedNode.libraryId})),\n value: selectedNodes.map(selectedNode => selectedNode.recordId),\n formattedValue: selectedNodes.map(selectedNode => selectedNode.title),\n });\n };\n\n const _handleOnSelectAll = (treeToSelect: Map<string, ITreeNode>, isSelected: boolean) => {\n const treeNodeIds = Array.from(treeToSelect.keys());\n\n // Using Set to avoid duplicates\n const newSelectedIds = isSelected\n ? [...new Set([...selectedNodesIds, ...treeNodeIds])]\n : selectedNodesIds.filter(id => !treeNodeIds.includes(id));\n\n const selectedNodes = newSelectedIds\n .map(nodeId => flattenTreeData.get(nodeId))\n .filter((selectedNode): selectedNode is ITreeNode => Boolean(selectedNode));\n\n onFilterChange({\n ...filter,\n nodes: selectedNodes.map(selectedNode => ({\n nodeId: selectedNode.id,\n libraryId: selectedNode.libraryId,\n })),\n value: selectedNodes.map(selectedNode => selectedNode.recordId),\n formattedValue: selectedNodes.map(selectedNode => selectedNode.title),\n });\n };\n\n const _handleOnSelectAllVisibleByDefault = (isSelected: boolean) =>\n _handleOnSelectAll(flattenVisibleByDefaultTree, isSelected);\n\n const _handleOnSelectAllHiddenByDefault = (isSelected: boolean) =>\n _handleOnSelectAll(flattenHiddenByDefaultTree, isSelected);\n\n const {allSelected: allVisibleSelected, indeterminate: visibleIndeterminate} = getSelectAllState(\n selectedNodesIds,\n flattenVisibleByDefaultTree,\n );\n\n const {allSelected: allHiddenSelected, indeterminate: hiddenIndeterminate} = getSelectAllState(\n selectedNodesIds,\n flattenHiddenByDefaultTree,\n );\n\n const treeCommonProps: ComponentProps<typeof KitTree> = {\n selectedKeys: selectedNodesIds,\n checkedKeys: selectedNodesIds,\n defaultExpandedKeys: selectedNodesIds,\n expandedKeys: [...expandedNodeIdsFromUser, ...expandedNodeIdsFromSearch],\n checkable: true,\n checkStrictly: true,\n multiple: true,\n titleRender(node) {\n const nodeData = node as EventDataNode<ITreeNode>;\n\n // TODO: countSelectedTreeChildren is computed here because the tree is split into two sub-trees\n // (visibleByDefaultTree / hiddenByDefaultTree) which reshapes the `children` field.\n // Once the dual-tree is removed and a single tree is used, this calculation can be\n // moved closer to the data fetching (e.g. in _toTreeNode in useGetTreeData).\n const selectedChildrenCount = countSelectedTreeChildren(nodeData, selectedNodesIds);\n\n return (\n <FilterTreeNodeTitle\n title={nodeData.title}\n count={selectedChildrenCount > 0 ? selectedChildrenCount : undefined}\n />\n );\n },\n onExpand: expandedKeys => {\n setExpandedNodeIdsFromUser(expandedKeys);\n },\n onCheck: (_, info) => {\n const node = info.node as EventDataNode<ITreeNode>;\n _handleOnSelect(node, info.checked);\n },\n onSelect: (_, info) => {\n const node = info.node as EventDataNode<ITreeNode>;\n _handleOnSelect(node, info.selected);\n },\n };\n\n if (isLoading) {\n return (\n <DropdownContentWrapper>\n <KitLoader />\n </DropdownContentWrapper>\n );\n }\n\n if (error) {\n return (\n <DropdownContentWrapper>\n <ErrorDisplay message={error.message} />\n </DropdownContentWrapper>\n );\n }\n\n return (\n <DropdownContentWrapper direction=\"vertical\" size=\"xs\">\n {SearchInput}\n {areBothTreesFilled ? (\n <>\n <EmptyValueCheckbox onSelect={_handleOnSelectEmptyValue} filter={filter} />\n <FilteredTreeSpacer direction=\"vertical\" size=\"xxs\">\n <FilteredTreeTitle size=\"fontSize5\" weight=\"medium\">\n {t('filters.visible-by-default')}\n </FilteredTreeTitle>\n <ScrollableContent>\n <SelectAllCheckbox\n checked={allVisibleSelected}\n indeterminate={visibleIndeterminate}\n onChange={_handleOnSelectAllVisibleByDefault}\n />\n <KitTree treeData={filteredVisibleByDefaultTree} {...treeCommonProps} />\n </ScrollableContent>\n </FilteredTreeSpacer>\n <KitDivider noMargin />\n <FilteredTreeSpacer direction=\"vertical\" size=\"xxs\">\n <FilteredTreeTitle size=\"fontSize5\" weight=\"medium\">\n {t('filters.hidden-by-default')}\n </FilteredTreeTitle>\n <ScrollableContent>\n <SelectAllCheckbox\n checked={allHiddenSelected}\n indeterminate={hiddenIndeterminate}\n onChange={_handleOnSelectAllHiddenByDefault}\n />\n <KitTree treeData={filteredHiddenByDefaultTree} {...treeCommonProps} />\n </ScrollableContent>\n </FilteredTreeSpacer>\n </>\n ) : (\n <ScrollableContent>\n <EmptyValueCheckbox onSelect={_handleOnSelectEmptyValue} filter={filter} />\n <SelectAllCheckbox\n checked={visibleByDefaultTree.length > 0 ? allVisibleSelected : allHiddenSelected}\n indeterminate={visibleByDefaultTree.length > 0 ? visibleIndeterminate : hiddenIndeterminate}\n onChange={\n visibleByDefaultTree.length > 0\n ? _handleOnSelectAllVisibleByDefault\n : _handleOnSelectAllHiddenByDefault\n }\n />\n <KitTree\n treeData={\n visibleByDefaultTree.length > 0 ? filteredVisibleByDefaultTree : filteredHiddenByDefaultTree\n }\n {...treeCommonProps}\n />\n </ScrollableContent>\n )}\n </DropdownContentWrapper>\n );\n};\n"]}
|
|
1
|
+
{"version":3,"file":"TreeAttributeDropDown.js","sourceRoot":"","sources":["../../../../../../src/components/Filters/filter-items/filter-type/tree/TreeAttributeDropDown.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 ComponentProps, type FunctionComponent, type Key, useEffect, useState} from 'react';\nimport {type IFilterChildrenTreeDropDownProps} from '../_types';\nimport styled from 'styled-components';\nimport {KitLoader, KitSpace, KitTree} from 'aristid-ds';\nimport {type EventDataNode} from 'antd/lib/tree';\nimport {type ITreeNode, useGetTreeData} from './useGetTreeData';\nimport {ErrorDisplay} from '_ui/components/ErrorDisplay';\nimport {useTreesSearch} from './useTreesSearch';\nimport {useFiltersContext} from '_ui/components/Filters/useFiltersContext';\nimport {EmptyValueCheckbox} from '../../shared/EmptyValueCheckbox';\nimport {SelectAllCheckbox} from '../../shared/SelectAllCheckbox';\nimport {countSelectedTreeChildren} from './utils/countSelectedTreeChildren';\nimport {FilterTreeNodeTitle} from '../../shared/FilterTreeNodeTitle';\nimport {useTreePermissions} from './useTreePermissions';\nimport {useTreeNodeSelection} from './useTreeNodeSelection';\n\nconst ScrollableContent = styled.div`\n max-height: 348px; /* Equal to 10.5 nodes of KitTree */\n overflow-y: auto;\n overflow-x: hidden;\n width: 100%;\n`;\n\nconst DropdownContentWrapper = styled(KitSpace)`\n width: 327px;\n justify-content: center;\n`;\n\n// Applies ghosted styling to tree nodes that have data-ghosted=\"true\" on their title wrapper.\n// Used to visually distinguish hidden-by-default nodes when the toggle is active.\nconst StyledKitTreeWithGhostedNodes = styled(KitTree)`\n & .ant-tree-treenode:has(div[data-ghosted='true']) {\n .ant-typography {\n color: var(--general-colors-neutral-grey-500);\n font-style: italic;\n }\n }\n`;\n\nexport const TreeAttributeDropDown: FunctionComponent<IFilterChildrenTreeDropDownProps> = ({\n filter,\n onFilterChange,\n toggleHiddenRef,\n onPermissionConfiguredChange,\n}) => {\n const {filtersData} = useFiltersContext();\n\n const {treeData, isLoading, error} = useGetTreeData({\n treeId: filter.attribute.linkedTree?.id ?? '',\n attributeId: filter.attribute.id,\n libraryId: filtersData.libraryId,\n });\n\n const includeHiddenOptions = filter.includeHiddenOptions ?? false;\n\n const {displayTree, flattenTreeData, flattenForSelectAll, isAccessPermissionConfigured} = useTreePermissions(\n treeData,\n includeHiddenOptions,\n );\n\n const {selectedNodesIds, allSelected, indeterminate, handleOnSelectEmptyValue, handleOnSelect, handleOnSelectAll} =\n useTreeNodeSelection({\n filter,\n onFilterChange,\n flattenTreeData,\n flattenForSelectAll,\n isAccessPermissionConfigured,\n toggleHiddenRef,\n });\n\n const {filteredTree, expandedNodeIdsFromSearch, SearchInput} = useTreesSearch(displayTree);\n\n const [expandedNodeIdsFromUser, setExpandedNodeIdsFromUser] = useState<Key[]>([]);\n\n useEffect(() => {\n onPermissionConfiguredChange?.(isAccessPermissionConfigured);\n }, [isAccessPermissionConfigured, onPermissionConfiguredChange]);\n\n const treeCommonProps: ComponentProps<typeof StyledKitTreeWithGhostedNodes> = {\n selectedKeys: selectedNodesIds,\n checkedKeys: selectedNodesIds,\n defaultExpandedKeys: selectedNodesIds,\n expandedKeys: [...expandedNodeIdsFromUser, ...expandedNodeIdsFromSearch],\n checkable: true,\n checkStrictly: true,\n multiple: true,\n titleRender(node) {\n const nodeData = node as EventDataNode<ITreeNode>;\n\n // TODO: countSelectedTreeChildren is computed here because the tree may contain\n // disabled-checkbox parents whose children are in a different permission group.\n // This ensures the count reflects the actual selected descendants regardless of splitting.\n const selectedChildrenCount = countSelectedTreeChildren(nodeData, selectedNodesIds);\n const isHiddenByDefault = includeHiddenOptions && nodeData.accessRecordByDefaultPermission === false;\n\n return (\n <FilterTreeNodeTitle\n title={nodeData.title}\n count={selectedChildrenCount > 0 ? selectedChildrenCount : undefined}\n ghosted={isHiddenByDefault}\n />\n );\n },\n onExpand: expandedKeys => {\n setExpandedNodeIdsFromUser(expandedKeys);\n },\n onCheck: (_, info) => {\n const node = info.node as EventDataNode<ITreeNode>;\n handleOnSelect(node, info.checked);\n },\n onSelect: (_, info) => {\n const node = info.node as EventDataNode<ITreeNode>;\n handleOnSelect(node, info.selected);\n },\n };\n\n if (isLoading) {\n return (\n <DropdownContentWrapper>\n <KitLoader />\n </DropdownContentWrapper>\n );\n }\n\n if (error) {\n return (\n <DropdownContentWrapper>\n <ErrorDisplay message={error.message} />\n </DropdownContentWrapper>\n );\n }\n\n return (\n <DropdownContentWrapper direction=\"vertical\" size=\"xs\">\n {SearchInput}\n <ScrollableContent>\n <EmptyValueCheckbox onSelect={handleOnSelectEmptyValue} filter={filter} />\n <SelectAllCheckbox\n checked={allSelected}\n indeterminate={indeterminate}\n onChange={checked => handleOnSelectAll(flattenForSelectAll, checked)}\n />\n <StyledKitTreeWithGhostedNodes treeData={filteredTree} {...treeCommonProps} />\n </ScrollableContent>\n </DropdownContentWrapper>\n );\n};\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useGetTreeData.js","sourceRoot":"","sources":["../../../../../../src/components/Filters/filter-items/filter-type/tree/useGetTreeData.ts"],"names":[],"mappings":"AAAA,oFAAoF;AACpF,sCAAsC;AACtC,sEAAsE;AACtE,OAAO,EAAC,SAAS,EAAE,QAAQ,EAAC,MAAM,OAAO,CAAC;AAE1C,OAAO,EAAC,mBAAmB,EAAC,MAAM,gCAAgC,CAAC;AACnE,OAAO,EAAC,YAAY,EAAC,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"useGetTreeData.js","sourceRoot":"","sources":["../../../../../../src/components/Filters/filter-items/filter-type/tree/useGetTreeData.ts"],"names":[],"mappings":"AAAA,oFAAoF;AACpF,sCAAsC;AACtC,sEAAsE;AACtE,OAAO,EAAC,SAAS,EAAE,QAAQ,EAAC,MAAM,OAAO,CAAC;AAE1C,OAAO,EAAC,mBAAmB,EAAC,MAAM,gCAAgC,CAAC;AACnE,OAAO,EAAC,YAAY,EAAC,MAAM,gBAAgB,CAAC;AAmB5C,MAAM,WAAW,GAAG,CAChB,IAEC,EACQ,EAAE,CAAC,CAAC;IACb,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE;IACxD,EAAE,EAAE,IAAI,CAAC,EAAE;IACX,GAAG,EAAE,IAAI,CAAC,EAAE;IACZ,QAAQ,EAAE,CAAC,IAAI,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,WAAW,CAAC;IAChD,+BAA+B,EAAE,IAAI,CAAC,+BAA+B,IAAI,SAAS;IAClF,SAAS,EAAE,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE;IACxC,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE;CAC3B,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,EAAC,MAAM,EAAE,WAAW,EAAE,SAAS,EAAuB,EAAE,EAAE;IACrF,MAAM,CAAC,kBAAkB,CAAC,GAAG,YAAY,CAAC,mBAAmB,EAAE,CAAC,CAAC;IAEjE,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAG,QAAQ,CAAc,EAAE,CAAC,CAAC;IAC1D,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC;IACjD,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAe,IAAI,CAAC,CAAC;IAEvD,SAAS,CAAC,GAAG,EAAE;QACX,IAAI,CAAC,MAAM,EAAE,CAAC;YACV,WAAW,CAAC,EAAE,CAAC,CAAC;YAChB,YAAY,CAAC,KAAK,CAAC,CAAC;YACpB,OAAO;QACX,CAAC;QAED,MAAM,QAAQ,GAAG,KAAK,IAAI,EAAE;YACxB,YAAY,CAAC,IAAI,CAAC,CAAC;YACnB,QAAQ,CAAC,IAAI,CAAC,CAAC;YACf,IAAI,CAAC;gBACD,MAAM,EAAC,IAAI,EAAC,GAAG,MAAM,kBAAkB,CAAC;oBACpC,SAAS,EAAE;wBACP,MAAM;wBACN,+BAA+B,EAAE;4BAC7B,WAAW;4BACX,SAAS;yBACZ;qBACJ;iBACJ,CAAC,CAAC;gBAEH,WAAW,CAAC,CAAC,IAAI,EAAE,WAAW,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAC1E,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACX,QAAQ,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,qBAAqB,CAAC,CAAC,CAAC;YAC5E,CAAC;oBAAS,CAAC;gBACP,YAAY,CAAC,KAAK,CAAC,CAAC;YACxB,CAAC;QACL,CAAC,CAAC;QAEF,QAAQ,EAAE,CAAC;IACf,CAAC,EAAE,CAAC,MAAM,EAAE,WAAW,EAAE,SAAS,CAAC,CAAC,CAAC;IAErC,OAAO,EAAC,QAAQ,EAAE,SAAS,EAAE,KAAK,EAAC,CAAC;AACxC,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 {type FilterTreeDataQueryQuery} from '_ui/_gqlTypes';\nimport {filterTreeDataQuery} from './_queries/filterTreeDataQuery';\nimport {useLazyQuery} from '@apollo/client';\n\nexport interface ITreeNode {\n title: string;\n id: string;\n key: string;\n children: ITreeNode[];\n accessRecordByDefaultPermission?: boolean;\n libraryId: string;\n recordId: string;\n disableCheckbox?: boolean;\n}\n\ninterface IUseGetTreeDataProps {\n treeId: string;\n attributeId: string;\n libraryId: string;\n}\n\nconst _toTreeNode = (\n node: FilterTreeDataQueryQuery['treeContent'][number] & {\n children?: Array<FilterTreeDataQueryQuery['treeContent'][number]>;\n },\n): ITreeNode => ({\n title: node.record.whoAmI.label ?? node.record.whoAmI.id,\n id: node.id,\n key: node.id,\n children: (node.children ?? []).map(_toTreeNode),\n accessRecordByDefaultPermission: node.accessRecordByDefaultPermission ?? undefined,\n libraryId: node.record.whoAmI.library.id,\n recordId: node.record.id,\n});\n\nexport const useGetTreeData = ({treeId, attributeId, libraryId}: IUseGetTreeDataProps) => {\n const [loadFilterTreeData] = useLazyQuery(filterTreeDataQuery());\n\n const [treeData, setTreeData] = useState<ITreeNode[]>([]);\n const [isLoading, setIsLoading] = useState(true);\n const [error, setError] = useState<Error | null>(null);\n\n useEffect(() => {\n if (!treeId) {\n setTreeData([]);\n setIsLoading(false);\n return;\n }\n\n const loadTree = async () => {\n setIsLoading(true);\n setError(null);\n try {\n const {data} = await loadFilterTreeData({\n variables: {\n treeId,\n accessRecordByDefaultPermission: {\n attributeId,\n libraryId,\n },\n },\n });\n\n setTreeData((data?.treeContent ?? []).map(node => _toTreeNode(node)));\n } catch (err) {\n setError(err instanceof Error ? err : new Error('Failed to load tree'));\n } finally {\n setIsLoading(false);\n }\n };\n\n loadTree();\n }, [treeId, attributeId, libraryId]);\n\n return {treeData, isLoading, error};\n};\n"]}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { type MutableRefObject } from 'react';
|
|
2
|
+
import { type IUIFilterTree } from '../../../../../components/Filters/_types';
|
|
3
|
+
import { type ITreeNode } from './useGetTreeData';
|
|
4
|
+
interface IUseTreeNodeSelectionParams {
|
|
5
|
+
filter: IUIFilterTree;
|
|
6
|
+
onFilterChange: (filterData: IUIFilterTree) => void;
|
|
7
|
+
flattenTreeData: Map<string, ITreeNode>;
|
|
8
|
+
flattenForSelectAll: Map<string, ITreeNode>;
|
|
9
|
+
isAccessPermissionConfigured: boolean;
|
|
10
|
+
toggleHiddenRef?: MutableRefObject<((checked: boolean) => void) | null>;
|
|
11
|
+
}
|
|
12
|
+
export interface ITreeNodeSelection {
|
|
13
|
+
selectedNodesIds: string[];
|
|
14
|
+
allSelected: boolean;
|
|
15
|
+
indeterminate: boolean;
|
|
16
|
+
handleOnSelectEmptyValue: (selected: boolean) => void;
|
|
17
|
+
handleOnSelect: (node: ITreeNode, selected: boolean) => void;
|
|
18
|
+
handleOnSelectAll: (treeToSelect: Map<string, ITreeNode>, isSelected: boolean) => void;
|
|
19
|
+
}
|
|
20
|
+
export declare const useTreeNodeSelection: ({ filter, onFilterChange, flattenTreeData, flattenForSelectAll, isAccessPermissionConfigured, toggleHiddenRef, }: IUseTreeNodeSelectionParams) => ITreeNodeSelection;
|
|
21
|
+
export {};
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
import { getSelectAllState } from './utils/getSelectAllState';
|
|
2
|
+
export const useTreeNodeSelection = ({ filter, onFilterChange, flattenTreeData, flattenForSelectAll, isAccessPermissionConfigured, toggleHiddenRef, }) => {
|
|
3
|
+
const selectedNodesIds = (filter.userNodes ?? []).map(node => node.nodeId);
|
|
4
|
+
const { allSelected, indeterminate } = getSelectAllState(selectedNodesIds, flattenForSelectAll);
|
|
5
|
+
const handleOnSelectEmptyValue = (selected) => {
|
|
6
|
+
onFilterChange({ ...filter, withEmptyValues: selected });
|
|
7
|
+
};
|
|
8
|
+
const handleOnSelect = (node, selected) => {
|
|
9
|
+
const newSelectedIds = selected
|
|
10
|
+
? [...selectedNodesIds, node.id]
|
|
11
|
+
: selectedNodesIds.filter(id => id !== node.id);
|
|
12
|
+
const selectedNodes = newSelectedIds
|
|
13
|
+
.map(nodeId => flattenTreeData.get(nodeId))
|
|
14
|
+
.filter((n) => Boolean(n));
|
|
15
|
+
const mappedNodes = selectedNodes.map(n => ({ nodeId: n.id, libraryId: n.libraryId }));
|
|
16
|
+
onFilterChange({
|
|
17
|
+
...filter,
|
|
18
|
+
nodes: mappedNodes,
|
|
19
|
+
value: selectedNodes.map(n => n.recordId),
|
|
20
|
+
userNodes: mappedNodes,
|
|
21
|
+
userFormattedValue: selectedNodes.map(n => n.title),
|
|
22
|
+
});
|
|
23
|
+
};
|
|
24
|
+
const handleOnSelectAll = (treeToSelect, isSelected) => {
|
|
25
|
+
const newSelectedIds = isSelected
|
|
26
|
+
? [...new Set([...selectedNodesIds, ...treeToSelect.keys()])]
|
|
27
|
+
: selectedNodesIds.filter(id => !treeToSelect.has(id));
|
|
28
|
+
const selectedNodes = newSelectedIds
|
|
29
|
+
.map(nodeId => flattenTreeData.get(nodeId))
|
|
30
|
+
.filter((n) => Boolean(n));
|
|
31
|
+
const mappedNodes = selectedNodes.map(n => ({ nodeId: n.id, libraryId: n.libraryId }));
|
|
32
|
+
onFilterChange({
|
|
33
|
+
...filter,
|
|
34
|
+
nodes: mappedNodes,
|
|
35
|
+
value: selectedNodes.map(n => n.recordId),
|
|
36
|
+
userNodes: mappedNodes,
|
|
37
|
+
userFormattedValue: selectedNodes.map(n => n.title),
|
|
38
|
+
});
|
|
39
|
+
};
|
|
40
|
+
const handleToggle = (checked) => {
|
|
41
|
+
if (filter.userNodes != null) {
|
|
42
|
+
// Has user selection: on toggle off, drop hidden selections from user selection.
|
|
43
|
+
if (!checked) {
|
|
44
|
+
const keptNodes = filter.userNodes
|
|
45
|
+
.map(n => flattenTreeData.get(n.nodeId))
|
|
46
|
+
.filter((node) => node !== undefined && node.accessRecordByDefaultPermission !== false);
|
|
47
|
+
const hasKept = keptNodes.length > 0;
|
|
48
|
+
const mappedKept = hasKept ? keptNodes.map(n => ({ nodeId: n.id, libraryId: n.libraryId })) : null;
|
|
49
|
+
onFilterChange({
|
|
50
|
+
...filter,
|
|
51
|
+
includeHiddenOptions: false,
|
|
52
|
+
nodes: mappedKept,
|
|
53
|
+
value: hasKept ? keptNodes.map(n => n.recordId) : null,
|
|
54
|
+
userNodes: mappedKept,
|
|
55
|
+
userFormattedValue: hasKept ? keptNodes.map(n => n.title) : null,
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
else {
|
|
59
|
+
onFilterChange({ ...filter, includeHiddenOptions: true });
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
else {
|
|
63
|
+
// No user selection: update the network values (value/nodes) to reflect all currently
|
|
64
|
+
// visible nodes, without creating a UI selection (userNodes stays null).
|
|
65
|
+
// Toggle ON → all nodes (flattenTreeData contains hidden nodes too).
|
|
66
|
+
// Toggle OFF → only nodes with explicit access (accessRecordByDefaultPermission === true).
|
|
67
|
+
const networkNodes = checked
|
|
68
|
+
? [...flattenTreeData.values()]
|
|
69
|
+
: [...flattenTreeData.values()].filter(node => node.accessRecordByDefaultPermission === true);
|
|
70
|
+
onFilterChange({
|
|
71
|
+
...filter,
|
|
72
|
+
includeHiddenOptions: checked,
|
|
73
|
+
nodes: networkNodes.map(n => ({ nodeId: n.id, libraryId: n.libraryId })),
|
|
74
|
+
value: networkNodes.map(n => n.recordId),
|
|
75
|
+
formattedValue: networkNodes.map(n => n.title),
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
};
|
|
79
|
+
// Expose the toggle handler to FilterDropDown via ref (updated every render to stay current)
|
|
80
|
+
if (toggleHiddenRef) {
|
|
81
|
+
toggleHiddenRef.current = isAccessPermissionConfigured ? handleToggle : null;
|
|
82
|
+
}
|
|
83
|
+
return { selectedNodesIds, allSelected, indeterminate, handleOnSelectEmptyValue, handleOnSelect, handleOnSelectAll };
|
|
84
|
+
};
|
|
85
|
+
//# sourceMappingURL=useTreeNodeSelection.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useTreeNodeSelection.js","sourceRoot":"","sources":["../../../../../../src/components/Filters/filter-items/filter-type/tree/useTreeNodeSelection.ts"],"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 MutableRefObject} from 'react';\nimport {type IUIFilterTree} from '_ui/components/Filters/_types';\nimport {type ITreeNode} from './useGetTreeData';\nimport {getSelectAllState} from './utils/getSelectAllState';\n\ninterface IUseTreeNodeSelectionParams {\n filter: IUIFilterTree;\n onFilterChange: (filterData: IUIFilterTree) => void;\n flattenTreeData: Map<string, ITreeNode>;\n flattenForSelectAll: Map<string, ITreeNode>;\n isAccessPermissionConfigured: boolean;\n toggleHiddenRef?: MutableRefObject<((checked: boolean) => void) | null>;\n}\n\nexport interface ITreeNodeSelection {\n selectedNodesIds: string[];\n allSelected: boolean;\n indeterminate: boolean;\n handleOnSelectEmptyValue: (selected: boolean) => void;\n handleOnSelect: (node: ITreeNode, selected: boolean) => void;\n handleOnSelectAll: (treeToSelect: Map<string, ITreeNode>, isSelected: boolean) => void;\n}\n\nexport const useTreeNodeSelection = ({\n filter,\n onFilterChange,\n flattenTreeData,\n flattenForSelectAll,\n isAccessPermissionConfigured,\n toggleHiddenRef,\n}: IUseTreeNodeSelectionParams): ITreeNodeSelection => {\n const selectedNodesIds = (filter.userNodes ?? []).map(node => node.nodeId);\n\n const {allSelected, indeterminate} = getSelectAllState(selectedNodesIds, flattenForSelectAll);\n\n const handleOnSelectEmptyValue = (selected: boolean) => {\n onFilterChange({...filter, withEmptyValues: selected});\n };\n\n const handleOnSelect = (node: ITreeNode, selected: boolean) => {\n const newSelectedIds = selected\n ? [...selectedNodesIds, node.id]\n : selectedNodesIds.filter(id => id !== node.id);\n\n const selectedNodes = newSelectedIds\n .map(nodeId => flattenTreeData.get(nodeId))\n .filter((n): n is ITreeNode => Boolean(n));\n\n const mappedNodes = selectedNodes.map(n => ({nodeId: n.id, libraryId: n.libraryId}));\n onFilterChange({\n ...filter,\n nodes: mappedNodes,\n value: selectedNodes.map(n => n.recordId),\n userNodes: mappedNodes,\n userFormattedValue: selectedNodes.map(n => n.title),\n });\n };\n\n const handleOnSelectAll = (treeToSelect: Map<string, ITreeNode>, isSelected: boolean) => {\n const newSelectedIds = isSelected\n ? [...new Set([...selectedNodesIds, ...treeToSelect.keys()])]\n : selectedNodesIds.filter(id => !treeToSelect.has(id));\n\n const selectedNodes = newSelectedIds\n .map(nodeId => flattenTreeData.get(nodeId))\n .filter((n): n is ITreeNode => Boolean(n));\n\n const mappedNodes = selectedNodes.map(n => ({nodeId: n.id, libraryId: n.libraryId}));\n onFilterChange({\n ...filter,\n nodes: mappedNodes,\n value: selectedNodes.map(n => n.recordId),\n userNodes: mappedNodes,\n userFormattedValue: selectedNodes.map(n => n.title),\n });\n };\n\n const handleToggle = (checked: boolean) => {\n if (filter.userNodes != null) {\n // Has user selection: on toggle off, drop hidden selections from user selection.\n if (!checked) {\n const keptNodes = filter.userNodes\n .map(n => flattenTreeData.get(n.nodeId))\n .filter(\n (node): node is ITreeNode =>\n node !== undefined && node.accessRecordByDefaultPermission !== false,\n );\n const hasKept = keptNodes.length > 0;\n const mappedKept = hasKept ? keptNodes.map(n => ({nodeId: n.id, libraryId: n.libraryId})) : null;\n onFilterChange({\n ...filter,\n includeHiddenOptions: false,\n nodes: mappedKept,\n value: hasKept ? keptNodes.map(n => n.recordId) : null,\n userNodes: mappedKept,\n userFormattedValue: hasKept ? keptNodes.map(n => n.title) : null,\n });\n } else {\n onFilterChange({...filter, includeHiddenOptions: true});\n }\n } else {\n // No user selection: update the network values (value/nodes) to reflect all currently\n // visible nodes, without creating a UI selection (userNodes stays null).\n // Toggle ON → all nodes (flattenTreeData contains hidden nodes too).\n // Toggle OFF → only nodes with explicit access (accessRecordByDefaultPermission === true).\n const networkNodes = checked\n ? [...flattenTreeData.values()]\n : [...flattenTreeData.values()].filter(node => node.accessRecordByDefaultPermission === true);\n onFilterChange({\n ...filter,\n includeHiddenOptions: checked,\n nodes: networkNodes.map(n => ({nodeId: n.id, libraryId: n.libraryId})),\n value: networkNodes.map(n => n.recordId),\n formattedValue: networkNodes.map(n => n.title),\n });\n }\n };\n\n // Expose the toggle handler to FilterDropDown via ref (updated every render to stay current)\n if (toggleHiddenRef) {\n toggleHiddenRef.current = isAccessPermissionConfigured ? handleToggle : null;\n }\n\n return {selectedNodesIds, allSelected, indeterminate, handleOnSelectEmptyValue, handleOnSelect, handleOnSelectAll};\n};\n"]}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { type ITreeNode } from './useGetTreeData';
|
|
2
|
+
export interface ITreePermissions {
|
|
3
|
+
displayTree: ITreeNode[];
|
|
4
|
+
flattenTreeData: Map<string, ITreeNode>;
|
|
5
|
+
flattenForSelectAll: Map<string, ITreeNode>;
|
|
6
|
+
isAccessPermissionConfigured: boolean;
|
|
7
|
+
}
|
|
8
|
+
export declare const useTreePermissions: (treeData: ITreeNode[], includeHiddenOptions: boolean) => ITreePermissions;
|
|
@@ -0,0 +1,40 @@
|
|
|
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 { useMemo } from 'react';
|
|
5
|
+
import { buildFlattenTree } from './utils/buildFlattenTreeMap';
|
|
6
|
+
import { filterTreeByPermission } from './utils/filterTreeByPermission';
|
|
7
|
+
const markDisabledParents = (nodes) => nodes.map(node => ({
|
|
8
|
+
...node,
|
|
9
|
+
disableCheckbox: node.accessRecordByDefaultPermission === false,
|
|
10
|
+
children: markDisabledParents(node.children),
|
|
11
|
+
}));
|
|
12
|
+
export const useTreePermissions = (treeData, includeHiddenOptions) => {
|
|
13
|
+
// visibleOnlyTree: nodes with accessRecordByDefaultPermission === true,
|
|
14
|
+
// plus structural parents (=== false or undefined) that have === true descendants.
|
|
15
|
+
const visibleOnlyTree = useMemo(() => filterTreeByPermission(treeData), [treeData]);
|
|
16
|
+
const visibleOnlyTreeWithDisabledParents = useMemo(() => markDisabledParents(visibleOnlyTree), [visibleOnlyTree]);
|
|
17
|
+
const flattenTreeData = useMemo(() => buildFlattenTree(treeData), [treeData]);
|
|
18
|
+
// Only === true nodes are selectable; other are excluded.
|
|
19
|
+
const flattenSelectableVisibleTree = useMemo(() => {
|
|
20
|
+
const map = buildFlattenTree(visibleOnlyTree);
|
|
21
|
+
map.forEach((node, id) => {
|
|
22
|
+
if (!node.accessRecordByDefaultPermission) {
|
|
23
|
+
map.delete(id);
|
|
24
|
+
}
|
|
25
|
+
});
|
|
26
|
+
return map;
|
|
27
|
+
}, [visibleOnlyTree]);
|
|
28
|
+
// Active only when at least one node is explicitly visible (=== true).
|
|
29
|
+
// When all permissions are undefined, the feature is inactive and the full tree is shown.
|
|
30
|
+
const isAccessPermissionConfigured = useMemo(() => Array.from(flattenTreeData.values()).some(node => node.accessRecordByDefaultPermission === true), [flattenTreeData]);
|
|
31
|
+
const displayTree = isAccessPermissionConfigured && !includeHiddenOptions ? visibleOnlyTreeWithDisabledParents : treeData;
|
|
32
|
+
const flattenForSelectAll = isAccessPermissionConfigured && !includeHiddenOptions ? flattenSelectableVisibleTree : flattenTreeData;
|
|
33
|
+
return {
|
|
34
|
+
displayTree,
|
|
35
|
+
flattenTreeData,
|
|
36
|
+
flattenForSelectAll,
|
|
37
|
+
isAccessPermissionConfigured,
|
|
38
|
+
};
|
|
39
|
+
};
|
|
40
|
+
//# sourceMappingURL=useTreePermissions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useTreePermissions.js","sourceRoot":"","sources":["../../../../../../src/components/Filters/filter-items/filter-type/tree/useTreePermissions.ts"],"names":[],"mappings":"AAAA,oFAAoF;AACpF,sCAAsC;AACtC,sEAAsE;AACtE,OAAO,EAAC,OAAO,EAAC,MAAM,OAAO,CAAC;AAE9B,OAAO,EAAC,gBAAgB,EAAC,MAAM,6BAA6B,CAAC;AAC7D,OAAO,EAAC,sBAAsB,EAAC,MAAM,gCAAgC,CAAC;AAEtE,MAAM,mBAAmB,GAAG,CAAC,KAAkB,EAAe,EAAE,CAC5D,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACf,GAAG,IAAI;IACP,eAAe,EAAE,IAAI,CAAC,+BAA+B,KAAK,KAAK;IAC/D,QAAQ,EAAE,mBAAmB,CAAC,IAAI,CAAC,QAAQ,CAAC;CAC/C,CAAC,CAAC,CAAC;AASR,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,QAAqB,EAAE,oBAA6B,EAAoB,EAAE;IACzG,wEAAwE;IACxE,mFAAmF;IACnF,MAAM,eAAe,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC,sBAAsB,CAAC,QAAQ,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC;IAEpF,MAAM,kCAAkC,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC,mBAAmB,CAAC,eAAe,CAAC,EAAE,CAAC,eAAe,CAAC,CAAC,CAAC;IAElH,MAAM,eAAe,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC,gBAAgB,CAAC,QAAQ,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC;IAE9E,0DAA0D;IAC1D,MAAM,4BAA4B,GAAG,OAAO,CAAC,GAAG,EAAE;QAC9C,MAAM,GAAG,GAAG,gBAAgB,CAAC,eAAe,CAAC,CAAC;QAC9C,GAAG,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE,EAAE,EAAE;YACrB,IAAI,CAAC,IAAI,CAAC,+BAA+B,EAAE,CAAC;gBACxC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;YACnB,CAAC;QACL,CAAC,CAAC,CAAC;QACH,OAAO,GAAG,CAAC;IACf,CAAC,EAAE,CAAC,eAAe,CAAC,CAAC,CAAC;IAEtB,uEAAuE;IACvE,0FAA0F;IAC1F,MAAM,4BAA4B,GAAG,OAAO,CACxC,GAAG,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,eAAe,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,+BAA+B,KAAK,IAAI,CAAC,EACtG,CAAC,eAAe,CAAC,CACpB,CAAC;IAEF,MAAM,WAAW,GACb,4BAA4B,IAAI,CAAC,oBAAoB,CAAC,CAAC,CAAC,kCAAkC,CAAC,CAAC,CAAC,QAAQ,CAAC;IAE1G,MAAM,mBAAmB,GACrB,4BAA4B,IAAI,CAAC,oBAAoB,CAAC,CAAC,CAAC,4BAA4B,CAAC,CAAC,CAAC,eAAe,CAAC;IAE3G,OAAO;QACH,WAAW;QACX,eAAe;QACf,mBAAmB;QACnB,4BAA4B;KAC/B,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 {useMemo} from 'react';\nimport {type ITreeNode} from './useGetTreeData';\nimport {buildFlattenTree} from './utils/buildFlattenTreeMap';\nimport {filterTreeByPermission} from './utils/filterTreeByPermission';\n\nconst markDisabledParents = (nodes: ITreeNode[]): ITreeNode[] =>\n nodes.map(node => ({\n ...node,\n disableCheckbox: node.accessRecordByDefaultPermission === false,\n children: markDisabledParents(node.children),\n }));\n\nexport interface ITreePermissions {\n displayTree: ITreeNode[];\n flattenTreeData: Map<string, ITreeNode>;\n flattenForSelectAll: Map<string, ITreeNode>;\n isAccessPermissionConfigured: boolean;\n}\n\nexport const useTreePermissions = (treeData: ITreeNode[], includeHiddenOptions: boolean): ITreePermissions => {\n // visibleOnlyTree: nodes with accessRecordByDefaultPermission === true,\n // plus structural parents (=== false or undefined) that have === true descendants.\n const visibleOnlyTree = useMemo(() => filterTreeByPermission(treeData), [treeData]);\n\n const visibleOnlyTreeWithDisabledParents = useMemo(() => markDisabledParents(visibleOnlyTree), [visibleOnlyTree]);\n\n const flattenTreeData = useMemo(() => buildFlattenTree(treeData), [treeData]);\n\n // Only === true nodes are selectable; other are excluded.\n const flattenSelectableVisibleTree = useMemo(() => {\n const map = buildFlattenTree(visibleOnlyTree);\n map.forEach((node, id) => {\n if (!node.accessRecordByDefaultPermission) {\n map.delete(id);\n }\n });\n return map;\n }, [visibleOnlyTree]);\n\n // Active only when at least one node is explicitly visible (=== true).\n // When all permissions are undefined, the feature is inactive and the full tree is shown.\n const isAccessPermissionConfigured = useMemo(\n () => Array.from(flattenTreeData.values()).some(node => node.accessRecordByDefaultPermission === true),\n [flattenTreeData],\n );\n\n const displayTree =\n isAccessPermissionConfigured && !includeHiddenOptions ? visibleOnlyTreeWithDisabledParents : treeData;\n\n const flattenForSelectAll =\n isAccessPermissionConfigured && !includeHiddenOptions ? flattenSelectableVisibleTree : flattenTreeData;\n\n return {\n displayTree,\n flattenTreeData,\n flattenForSelectAll,\n isAccessPermissionConfigured,\n };\n};\n"]}
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
import { type ITreeNode } from './useGetTreeData';
|
|
2
|
-
export declare const useTreesSearch: (
|
|
3
|
-
|
|
4
|
-
filteredHiddenByDefaultTree: ITreeNode[];
|
|
2
|
+
export declare const useTreesSearch: (tree: ITreeNode[]) => {
|
|
3
|
+
filteredTree: ITreeNode[];
|
|
5
4
|
expandedNodeIdsFromSearch: string[];
|
|
6
5
|
SearchInput: JSX.Element;
|
|
7
6
|
};
|