@leav/ui 1.12.0-d09cabfa → 1.12.0-e8c84be4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (64) hide show
  1. package/dist/__mocks__/utils.d.ts +3 -0
  2. package/dist/__mocks__/utils.js +2 -0
  3. package/dist/__mocks__/utils.js.map +1 -0
  4. package/dist/_gqlTypes/index.d.ts +129 -33
  5. package/dist/_gqlTypes/index.js +71 -3
  6. package/dist/_gqlTypes/index.js.map +1 -1
  7. package/dist/_queries/attributes/attributeDetailsFragment.js +3 -0
  8. package/dist/_queries/attributes/attributeDetailsFragment.js.map +1 -1
  9. package/dist/components/Explorer/DataView.js +30 -13
  10. package/dist/components/Explorer/DataView.js.map +1 -1
  11. package/dist/components/Explorer/actions-mass/ResultsCount.js +2 -2
  12. package/dist/components/Explorer/actions-mass/ResultsCount.js.map +1 -1
  13. package/dist/components/Explorer/actions-mass/useEditAttributeMassAction.js +14 -6
  14. package/dist/components/Explorer/actions-mass/useEditAttributeMassAction.js.map +1 -1
  15. package/dist/components/Explorer/actions-mass/useMassActions.js +12 -6
  16. package/dist/components/Explorer/actions-mass/useMassActions.js.map +1 -1
  17. package/dist/components/Explorer/conditionsHelper.d.ts +2 -1
  18. package/dist/components/Explorer/conditionsHelper.js.map +1 -1
  19. package/dist/components/Explorer/manage-view-settings/save-view/prepareViewForRequest.js +6 -4
  20. package/dist/components/Explorer/manage-view-settings/save-view/prepareViewForRequest.js.map +1 -1
  21. package/dist/components/Filters/_types.d.ts +3 -0
  22. package/dist/components/Filters/_types.js.map +1 -1
  23. package/dist/components/Filters/conditionsHelper.d.ts +2 -1
  24. package/dist/components/Filters/conditionsHelper.js.map +1 -1
  25. package/dist/components/Filters/context/filtersReducer.js +14 -1
  26. package/dist/components/Filters/context/filtersReducer.js.map +1 -1
  27. package/dist/components/Filters/filter-items/CommonFilterItem.js.map +1 -1
  28. package/dist/components/Filters/filter-items/filter-type/useConditionOptionsByType.js.map +1 -1
  29. package/dist/components/Filters/useFilters.d.ts +198 -0
  30. package/dist/components/Filters/useTransformFilters.js +4 -2
  31. package/dist/components/Filters/useTransformFilters.js.map +1 -1
  32. package/dist/components/RecordEdition/EditRecord/EditRecord.js +8 -1
  33. package/dist/components/RecordEdition/EditRecord/EditRecord.js.map +1 -1
  34. package/dist/hooks/index.d.ts +3 -0
  35. package/dist/hooks/index.js +3 -0
  36. package/dist/hooks/index.js.map +1 -1
  37. package/dist/hooks/useGetRecordIdCard/index.d.ts +1 -0
  38. package/dist/hooks/useGetRecordIdCard/index.js +5 -0
  39. package/dist/hooks/useGetRecordIdCard/index.js.map +1 -0
  40. package/dist/hooks/useGetRecordIdCard/useGetRecordIdCard.d.ts +18 -0
  41. package/dist/hooks/useGetRecordIdCard/useGetRecordIdCard.js +20 -0
  42. package/dist/hooks/useGetRecordIdCard/useGetRecordIdCard.js.map +1 -0
  43. package/dist/hooks/useIFrameMessenger/iFrameMessengerContext.d.ts +6 -0
  44. package/dist/hooks/useIFrameMessenger/iFrameMessengerContext.js +8 -0
  45. package/dist/hooks/useIFrameMessenger/iFrameMessengerContext.js.map +1 -0
  46. package/dist/hooks/useIFrameMessenger/types.d.ts +10 -3
  47. package/dist/hooks/useIFrameMessenger/types.js.map +1 -1
  48. package/dist/hooks/useIFrameMessenger/useIFrameMessenger.d.ts +11 -2
  49. package/dist/hooks/useIFrameMessenger/useIFrameMessenger.js +31 -10
  50. package/dist/hooks/useIFrameMessenger/useIFrameMessenger.js.map +1 -1
  51. package/dist/hooks/useIFrameMessenger/useIFrameMessengerContext.d.ts +13 -0
  52. package/dist/hooks/useIFrameMessenger/useIFrameMessengerContext.js +59 -0
  53. package/dist/hooks/useIFrameMessenger/useIFrameMessengerContext.js.map +1 -0
  54. package/dist/hooks/useIFrameMessenger/useIFrameMessengerHandlers.d.ts +13 -0
  55. package/dist/hooks/useIFrameMessenger/useIFrameMessengerHandlers.js +29 -0
  56. package/dist/hooks/useIFrameMessenger/useIFrameMessengerHandlers.js.map +1 -0
  57. package/dist/hooks/useIFrameMessengerClient/IFrameMessengerClient.js +3 -0
  58. package/dist/hooks/useIFrameMessengerClient/IFrameMessengerClient.js.map +1 -1
  59. package/dist/hooks/useIFrameMessengerClient/iFrameMessengerClientContext.d.ts +1 -0
  60. package/dist/hooks/useIFrameMessengerClient/useIFrameMessengerClient.d.ts +1 -0
  61. package/dist/hooks/useSharedTranslation/__mocks__/useSharedTranslation.js.map +1 -1
  62. package/dist/locales/en/shared.json +2 -0
  63. package/dist/locales/fr/shared.json +3 -1
  64. package/package.json +8 -8
@@ -50,6 +50,9 @@ export const attributeDetailsFragment = gql `
50
50
  reverse_link
51
51
  smart_filter {
52
52
  enable
53
+ through {
54
+ id
55
+ }
53
56
  }
54
57
  }
55
58
  ... on TreeAttribute {
@@ -1 +1 @@
1
- {"version":3,"file":"attributeDetailsFragment.js","sourceRoot":"","sources":["../../../src/_queries/attributes/attributeDetailsFragment.ts"],"names":[],"mappings":"AAAA,oFAAoF;AACpF,sCAAsC;AACtC,sEAAsE;AACtE,OAAO,EAAC,GAAG,EAAC,MAAM,gBAAgB,CAAC;AAEnC,MAAM,CAAC,MAAM,wBAAwB,GAAG,GAAG,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA8D1C,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 {gql} from '@apollo/client';\n\nexport const attributeDetailsFragment = gql`\n fragment AttributeDetails on Attribute {\n id\n type\n format\n system\n readonly\n label\n description\n required\n multiple_values\n multi_link_display_option\n multi_tree_display_option\n metadata_fields {\n id\n label\n type\n format\n }\n versions_conf {\n versionable\n mode\n profile {\n id\n label\n trees {\n id\n label\n }\n }\n }\n libraries {\n id\n label\n }\n\n ... on StandardAttribute {\n unique\n }\n\n ... on LinkAttribute {\n linked_library {\n id\n label\n }\n reverse_link\n smart_filter {\n enable\n }\n }\n ... on TreeAttribute {\n linked_tree {\n id\n label\n }\n permissions_conf_dependent_values {\n dependenciesTreeAttributes {\n id\n }\n }\n }\n }\n`;\n"]}
1
+ {"version":3,"file":"attributeDetailsFragment.js","sourceRoot":"","sources":["../../../src/_queries/attributes/attributeDetailsFragment.ts"],"names":[],"mappings":"AAAA,oFAAoF;AACpF,sCAAsC;AACtC,sEAAsE;AACtE,OAAO,EAAC,GAAG,EAAC,MAAM,gBAAgB,CAAC;AAEnC,MAAM,CAAC,MAAM,wBAAwB,GAAG,GAAG,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAiE1C,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 {gql} from '@apollo/client';\n\nexport const attributeDetailsFragment = gql`\n fragment AttributeDetails on Attribute {\n id\n type\n format\n system\n readonly\n label\n description\n required\n multiple_values\n multi_link_display_option\n multi_tree_display_option\n metadata_fields {\n id\n label\n type\n format\n }\n versions_conf {\n versionable\n mode\n profile {\n id\n label\n trees {\n id\n label\n }\n }\n }\n libraries {\n id\n label\n }\n\n ... on StandardAttribute {\n unique\n }\n\n ... on LinkAttribute {\n linked_library {\n id\n label\n }\n reverse_link\n smart_filter {\n enable\n through {\n id\n }\n }\n }\n ... on TreeAttribute {\n linked_tree {\n id\n label\n }\n permissions_conf_dependent_values {\n dependenciesTreeAttributes {\n id\n }\n }\n }\n }\n`;\n"]}
@@ -2,7 +2,7 @@ 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 { memo } from 'react';
5
+ import { memo, useCallback, useState } from 'react';
6
6
  import { KitPagination, KitTable } from 'aristid-ds';
7
7
  import styled from 'styled-components';
8
8
  import isEqual from 'lodash/isEqual';
@@ -13,7 +13,7 @@ import { useColumnWidth } from './useColumnWidth';
13
13
  import { WHO_AM_I_COLUMN } from './_constants';
14
14
  import { TableNameCell } from './TableNameCell';
15
15
  import cn from 'classnames';
16
- import { INTERNAL_COL_DEFINE } from 'rc-table';
16
+ import { throttle } from 'lodash';
17
17
  const tableRowHeight = 56;
18
18
  const tableHeaderMinLineHeight = 22;
19
19
  const DataViewContainerDivStyled = styled.div `
@@ -60,11 +60,9 @@ const StyledTable = styled(KitTable) `
60
60
  .ant-table-cell {
61
61
  min-height: ${tableRowHeight}px;
62
62
  height: auto !important;
63
- }
64
-
65
- /* Align actions to the right of the cell only if another column is present after */
66
- td:has(+ td) .ant-table-cell .actions-list {
67
- margin-left: auto;
63
+ .actions-list {
64
+ margin-left: auto;
65
+ }
68
66
  }
69
67
  }
70
68
 
@@ -92,19 +90,17 @@ export const DataView = memo(({ dataGroupedFilteredSorted, attributesToDisplay,
92
90
  title: () => attributesProperties[attributeName].label,
93
91
  ellipsis: useSmallHeaderSize,
94
92
  width: getFieldColumnWidth(attributesProperties[attributeName]),
95
- shouldCellUpdate: (record, prevRecord) => isMassSelectionAll || record.propertiesById[attributeName] !== prevRecord.propertiesById[attributeName],
93
+ shouldCellUpdate: (record, prevRecord) => isMassSelectionAll ||
94
+ record.propertiesById[attributeName] !== prevRecord.propertiesById[attributeName],
96
95
  render: (_, item) => (_jsx(TableCell, { attributeProperties: attributesProperties[attributeName], values: item.propertiesById[attributeName] })),
97
96
  });
98
97
  const columns = attributesToDisplay.map(getColumnProps);
99
- const whoIAmColumn = {
98
+ const whoIAmColumn = useWhoAmIColumn({
100
99
  ...getColumnProps(WHO_AM_I_COLUMN),
101
- title: () => t('explorer.name'),
102
100
  fixed: 'left',
103
101
  render: (_, item) => _jsx(TableNameCell, { item: item, itemActions: itemActions }),
104
102
  shouldCellUpdate: (record, prevRecord) => isMassSelectionAll || record.whoAmI !== prevRecord.whoAmI,
105
- };
106
- // replace `width` by `min-width` for the whoAmI column definition to prevent selection column to expand when all column have a width defined (which is a native table behaviour).
107
- whoIAmColumn[INTERNAL_COL_DEFINE] = { style: { width: 'unset', minWidth: whoIAmColumn.width } };
103
+ });
108
104
  const itemActionToUseOnRowClick = itemActions.find(itemAction => itemAction.useItemActionOnRowClick);
109
105
  const _rowSelection = onSelectionChange === null
110
106
  ? undefined
@@ -138,4 +134,25 @@ export const DataView = memo(({ dataGroupedFilteredSorted, attributesToDisplay,
138
134
  onClick: () => itemActionToUseOnRowClick?.callback(item),
139
135
  }) }), paginationProps && (_jsx("div", { className: "pagination", children: _jsx(KitPagination, { "aria-label": "pagination", showSizeChanger: true, showTotal: (total, [from, to]) => t('explorer.pagination-total-number', { from, to, count: total }), total: paginationProps.totalCount, defaultCurrent: paginationProps.currentPage, defaultPageSize: paginationProps.pageSize, pageSizeOptions: paginationProps.pageSizeOptions, onChange: paginationProps.setNewPage, onShowSizeChange: paginationProps.setNewPageSize }) }))] }));
140
136
  }, arePropsEqual);
137
+ // This hook exists to change the width of the whoAmI column dynamically.
138
+ // The aimed result is a whoAmI column that always expand and is the only one to expand if there is horizontal space available, but never shrinks under its specifed width.
139
+ // This behaviour is mostly present to prevent the selection column to expand
140
+ function useWhoAmIColumn(props) {
141
+ const { t } = useSharedTranslation();
142
+ const [width, setWidth] = useState(props.width);
143
+ // initialize observer only once using the useState initializer
144
+ const [resizeObserver] = useState(() => new ResizeObserver(throttle(([node]) => setWidth(node.contentRect.width < props.width ? props.width : '100%'), 100)));
145
+ // use the `ref` prop as a callback to retrieve the div element and connect the observer on it
146
+ const onWhoAmIColumnRender = useCallback((node) => {
147
+ resizeObserver.disconnect();
148
+ if (node) {
149
+ resizeObserver.observe(node);
150
+ }
151
+ }, []);
152
+ return {
153
+ ...props,
154
+ title: () => _jsx("div", { ref: onWhoAmIColumnRender, children: t('explorer.name') }),
155
+ width,
156
+ };
157
+ }
141
158
  //# sourceMappingURL=DataView.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"DataView.js","sourceRoot":"","sources":["../../../src/components/Explorer/DataView.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, memo} from 'react';\nimport {KitPagination, KitTable} from 'aristid-ds';\nimport {type KitTableColumnType} from 'aristid-ds/dist/Kit/DataDisplay/Table/types';\nimport styled from 'styled-components';\nimport isEqual from 'lodash/isEqual';\nimport {useSharedTranslation} from '_ui/hooks/useSharedTranslation';\nimport {type IExplorerData, type IItemAction, type IItemData} from './_types';\nimport {TableCell} from './TableCell';\nimport {defaultPaginationHeight, useTableScrollableHeight} from './useTableScrollableHeight';\nimport {useColumnWidth} from './useColumnWidth';\nimport {WHO_AM_I_COLUMN} from './_constants';\nimport {TableNameCell} from './TableNameCell';\nimport cn from 'classnames';\nimport {INTERNAL_COL_DEFINE} from 'rc-table';\n\nconst tableRowHeight = 56;\nconst tableHeaderMinLineHeight = 22;\n\nconst DataViewContainerDivStyled = styled.div`\n flex: 1 1 min-content;\n overflow: hidden;\n\n &.headless {\n overflow-y: auto;\n }\n\n .kit-table {\n padding-bottom: ${defaultPaginationHeight}px;\n position: relative;\n }\n\n .pagination {\n flex: 0 0 auto;\n justify-content: center;\n display: flex;\n padding-top: calc(var(--general-spacing-xs) * 1px);\n }\n`;\n\n// TODO: Table component should be updated fix header display\nconst StyledTable = styled(KitTable)`\n .ant-table-thead > tr > th {\n padding-top: calc(var(--general-spacing-xxs) * 1px) !important;\n padding-bottom: calc(var(--general-spacing-xxs) * 1px) !important;\n height: ${tableRowHeight}px;\n\n .ant-table-cell {\n min-height: ${tableHeaderMinLineHeight}px;\n height: auto !important;\n padding: 0 calc(var(--general-spacing-s) * 1px) 0 0;\n }\n }\n\n .ant-table-tbody > tr:hover .ant-table-cell {\n .actions-list {\n display: inline-flex;\n }\n }\n\n .ant-table-tbody > tr {\n .ant-table-cell {\n min-height: ${tableRowHeight}px;\n height: auto !important;\n }\n\n /* Align actions to the right of the cell only if another column is present after */\n td:has(+ td) .ant-table-cell .actions-list {\n margin-left: auto;\n }\n }\n\n &.row-clickable {\n .ant-table-tbody > tr {\n cursor: pointer;\n }\n }\n`;\n\ninterface IDataViewProps {\n dataGroupedFilteredSorted: IItemData[];\n itemActions: IItemAction[];\n attributesProperties: IExplorerData['attributes'];\n attributesToDisplay: string[];\n paginationProps?: {\n pageSizeOptions: number[];\n totalCount: number;\n currentPage: number;\n pageSize: number;\n setNewPage: (page: number, pageSize: number) => void;\n setNewPageSize: (page: number, pageSize: number) => void;\n };\n selection: {\n onSelectItem?: null | ((selectedItem: IItemData) => void);\n onSelectionChange: null | ((keys: Key[]) => void);\n isMassSelectionAll: boolean;\n selectedKeys: Key[];\n mode?: 'simple' | 'multiple';\n };\n hideTableHeader: boolean;\n useSmallHeaderSize?: boolean;\n tableBodyHeight?: string;\n}\n\n// TODO: tests will fail if we don't check attributeToDisplay because we have a render with no attributes but data is present. We should check why there's this behavior\nconst arePropsEqual = (prevProps: IDataViewProps, nextProps: IDataViewProps) =>\n isEqual(\n {\n attributesToDisplay: prevProps.attributesToDisplay,\n data: prevProps.dataGroupedFilteredSorted,\n selectedKeys: prevProps.selection.selectedKeys,\n },\n {\n attributesToDisplay: nextProps.attributesToDisplay,\n data: nextProps.dataGroupedFilteredSorted,\n selectedKeys: nextProps.selection.selectedKeys,\n },\n );\n\nexport const DataView: FunctionComponent<IDataViewProps> = memo(\n ({\n dataGroupedFilteredSorted,\n attributesToDisplay,\n attributesProperties,\n paginationProps,\n itemActions,\n selection: {onSelectItem, onSelectionChange, selectedKeys, isMassSelectionAll, mode},\n hideTableHeader = false,\n useSmallHeaderSize = false,\n tableBodyHeight,\n }) => {\n const {t} = useSharedTranslation();\n\n const {containerRef, scrollHeight} = useTableScrollableHeight(!!paginationProps);\n const {getFieldColumnWidth} = useColumnWidth();\n\n const getColumnProps = (attributeName: string): KitTableColumnType<IItemData> => ({\n title: () => attributesProperties[attributeName].label,\n ellipsis: useSmallHeaderSize,\n width: getFieldColumnWidth(attributesProperties[attributeName]),\n shouldCellUpdate: (record, prevRecord) =>\n isMassSelectionAll || record.propertiesById[attributeName] !== prevRecord.propertiesById[attributeName],\n render: (_, item) => (\n <TableCell\n attributeProperties={attributesProperties[attributeName]}\n values={item.propertiesById[attributeName]}\n />\n ),\n });\n\n const columns = attributesToDisplay.map(getColumnProps);\n\n const whoIAmColumn: KitTableColumnType<IItemData> = {\n ...getColumnProps(WHO_AM_I_COLUMN),\n title: () => t('explorer.name'),\n fixed: 'left',\n render: (_, item) => <TableNameCell item={item} itemActions={itemActions} />,\n shouldCellUpdate: (record, prevRecord) => isMassSelectionAll || record.whoAmI !== prevRecord.whoAmI,\n };\n\n // replace `width` by `min-width` for the whoAmI column definition to prevent selection column to expand when all column have a width defined (which is a native table behaviour).\n whoIAmColumn[INTERNAL_COL_DEFINE] = {style: {width: 'unset', minWidth: whoIAmColumn.width}};\n\n const itemActionToUseOnRowClick = itemActions.find(itemAction => itemAction.useItemActionOnRowClick);\n\n const _rowSelection: ComponentProps<typeof KitTable>['rowSelection'] =\n onSelectionChange === null\n ? undefined\n : {\n type: mode === 'simple' ? 'radio' : 'checkbox',\n columnTitle: ' ', // blank string to hide select all checkbox from <KitTable />\n selectedRowKeys: selectedKeys,\n preserveSelectedRowKeys: true,\n // TODO: review types from antd directly\n onChange: (selectedRowKeys: Key[]) => {\n const lastSelectedKey = selectedRowKeys[selectedRowKeys.length - 1];\n const lastSelectedItem = dataGroupedFilteredSorted.find(data => data.key === lastSelectedKey);\n\n onSelectionChange(selectedRowKeys);\n\n if (lastSelectedItem) {\n onSelectItem?.(lastSelectedItem);\n }\n },\n getCheckboxProps: isMassSelectionAll\n ? () => ({\n disabled: true,\n })\n : undefined,\n };\n\n // TODO: handle columns width based on attribute type/format\n return (\n <DataViewContainerDivStyled ref={containerRef} className={cn({headless: hideTableHeader})}>\n <StyledTable\n className={cn({\n 'row-clickable': itemActionToUseOnRowClick,\n })}\n showHeader={dataGroupedFilteredSorted.length > 0 && !hideTableHeader}\n headerLineSize={useSmallHeaderSize ? 's' : undefined}\n columns={[whoIAmColumn, ...columns]}\n tableLayout=\"fixed\"\n scroll={{\n y: tableBodyHeight ?? (hideTableHeader ? '100%' : scrollHeight),\n x: '100%',\n }}\n dataSource={dataGroupedFilteredSorted}\n pagination={false}\n rowSelection={_rowSelection}\n onRow={(item: IItemData) => ({\n onClick: () => itemActionToUseOnRowClick?.callback(item),\n })}\n />\n {paginationProps && (\n <div className=\"pagination\">\n <KitPagination\n aria-label=\"pagination\"\n showSizeChanger\n showTotal={(total, [from, to]) =>\n t('explorer.pagination-total-number', {from, to, count: total})\n }\n total={paginationProps.totalCount}\n defaultCurrent={paginationProps.currentPage}\n defaultPageSize={paginationProps.pageSize}\n pageSizeOptions={paginationProps.pageSizeOptions}\n onChange={paginationProps.setNewPage}\n onShowSizeChange={paginationProps.setNewPageSize}\n />\n </div>\n )}\n </DataViewContainerDivStyled>\n );\n },\n arePropsEqual,\n);\n"]}
1
+ {"version":3,"file":"DataView.js","sourceRoot":"","sources":["../../../src/components/Explorer/DataView.tsx"],"names":[],"mappings":";AAAA,oFAAoF;AACpF,sCAAsC;AACtC,sEAAsE;AAEtE,OAAO,EAAwD,IAAI,EAAE,WAAW,EAAE,QAAQ,EAAC,MAAM,OAAO,CAAC;AACzG,OAAO,EAAC,aAAa,EAAE,QAAQ,EAAC,MAAM,YAAY,CAAC;AAEnD,OAAO,MAAM,MAAM,mBAAmB,CAAC;AACvC,OAAO,OAAO,MAAM,gBAAgB,CAAC;AACrC,OAAO,EAAC,oBAAoB,EAAC,MAAM,gCAAgC,CAAC;AAEpE,OAAO,EAAC,SAAS,EAAC,MAAM,aAAa,CAAC;AACtC,OAAO,EAAC,uBAAuB,EAAE,wBAAwB,EAAC,MAAM,4BAA4B,CAAC;AAC7F,OAAO,EAAC,cAAc,EAAC,MAAM,kBAAkB,CAAC;AAChD,OAAO,EAAC,eAAe,EAAC,MAAM,cAAc,CAAC;AAC7C,OAAO,EAAC,aAAa,EAAC,MAAM,iBAAiB,CAAC;AAC9C,OAAO,EAAE,MAAM,YAAY,CAAC;AAC5B,OAAO,EAAC,QAAQ,EAAC,MAAM,QAAQ,CAAC;AAEhC,MAAM,cAAc,GAAG,EAAE,CAAC;AAC1B,MAAM,wBAAwB,GAAG,EAAE,CAAC;AAEpC,MAAM,0BAA0B,GAAG,MAAM,CAAC,GAAG,CAAA;;;;;;;;;0BASnB,uBAAuB;;;;;;;;;;CAUhD,CAAC;AAEF,6DAA6D;AAC7D,MAAM,WAAW,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAA;;;;kBAIlB,cAAc;;;0BAGN,wBAAwB;;;;;;;;;;;;;;0BAcxB,cAAc;;;;;;;;;;;;;CAavC,CAAC;AA2BF,wKAAwK;AACxK,MAAM,aAAa,GAAG,CAAC,SAAyB,EAAE,SAAyB,EAAE,EAAE,CAC3E,OAAO,CACH;IACI,mBAAmB,EAAE,SAAS,CAAC,mBAAmB;IAClD,IAAI,EAAE,SAAS,CAAC,yBAAyB;IACzC,YAAY,EAAE,SAAS,CAAC,SAAS,CAAC,YAAY;CACjD,EACD;IACI,mBAAmB,EAAE,SAAS,CAAC,mBAAmB;IAClD,IAAI,EAAE,SAAS,CAAC,yBAAyB;IACzC,YAAY,EAAE,SAAS,CAAC,SAAS,CAAC,YAAY;CACjD,CACJ,CAAC;AAEN,MAAM,CAAC,MAAM,QAAQ,GAAsC,IAAI,CAC3D,CAAC,EACG,yBAAyB,EACzB,mBAAmB,EACnB,oBAAoB,EACpB,eAAe,EACf,WAAW,EACX,SAAS,EAAE,EAAC,YAAY,EAAE,iBAAiB,EAAE,YAAY,EAAE,kBAAkB,EAAE,IAAI,EAAC,EACpF,eAAe,GAAG,KAAK,EACvB,kBAAkB,GAAG,KAAK,EAC1B,eAAe,GAClB,EAAE,EAAE;IACD,MAAM,EAAC,CAAC,EAAC,GAAG,oBAAoB,EAAE,CAAC;IAEnC,MAAM,EAAC,YAAY,EAAE,YAAY,EAAC,GAAG,wBAAwB,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC;IACjF,MAAM,EAAC,mBAAmB,EAAC,GAAG,cAAc,EAAE,CAAC;IAE/C,MAAM,cAAc,GAAG,CAAC,aAAqB,EAAE,EAAE,CAC7C,CAAC;QACG,KAAK,EAAE,GAAG,EAAE,CAAC,oBAAoB,CAAC,aAAa,CAAC,CAAC,KAAK;QACtD,QAAQ,EAAE,kBAAkB;QAC5B,KAAK,EAAE,mBAAmB,CAAC,oBAAoB,CAAC,aAAa,CAAC,CAAC;QAC/D,gBAAgB,EAAE,CAAC,MAAM,EAAE,UAAU,EAAE,EAAE,CACrC,kBAAkB;YAClB,MAAM,CAAC,cAAc,CAAC,aAAa,CAAC,KAAK,UAAU,CAAC,cAAc,CAAC,aAAa,CAAC;QACrF,MAAM,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,CAAC,CACjB,KAAC,SAAS,IACN,mBAAmB,EAAE,oBAAoB,CAAC,aAAa,CAAC,EACxD,MAAM,EAAE,IAAI,CAAC,cAAc,CAAC,aAAa,CAAC,GAC5C,CACL;KACJ,CAAyC,CAAC;IAE/C,MAAM,OAAO,GAAG,mBAAmB,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;IAExD,MAAM,YAAY,GAAG,eAAe,CAAC;QACjC,GAAG,cAAc,CAAC,eAAe,CAAC;QAClC,KAAK,EAAE,MAAM;QACb,MAAM,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,CAAC,KAAC,aAAa,IAAC,IAAI,EAAE,IAAI,EAAE,WAAW,EAAE,WAAW,GAAI;QAC5E,gBAAgB,EAAE,CAAC,MAAM,EAAE,UAAU,EAAE,EAAE,CAAC,kBAAkB,IAAI,MAAM,CAAC,MAAM,KAAK,UAAU,CAAC,MAAM;KACtG,CAAC,CAAC;IAEH,MAAM,yBAAyB,GAAG,WAAW,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC,UAAU,CAAC,uBAAuB,CAAC,CAAC;IAErG,MAAM,aAAa,GACf,iBAAiB,KAAK,IAAI;QACtB,CAAC,CAAC,SAAS;QACX,CAAC,CAAC;YACI,IAAI,EAAE,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,UAAU;YAC9C,WAAW,EAAE,GAAG,EAAE,6DAA6D;YAC/E,eAAe,EAAE,YAAY;YAC7B,uBAAuB,EAAE,IAAI;YAC7B,wCAAwC;YACxC,QAAQ,EAAE,CAAC,eAAsB,EAAE,EAAE;gBACjC,MAAM,eAAe,GAAG,eAAe,CAAC,eAAe,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;gBACpE,MAAM,gBAAgB,GAAG,yBAAyB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG,KAAK,eAAe,CAAC,CAAC;gBAE9F,iBAAiB,CAAC,eAAe,CAAC,CAAC;gBAEnC,IAAI,gBAAgB,EAAE,CAAC;oBACnB,YAAY,EAAE,CAAC,gBAAgB,CAAC,CAAC;gBACrC,CAAC;YACL,CAAC;YACD,gBAAgB,EAAE,kBAAkB;gBAChC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC;oBACH,QAAQ,EAAE,IAAI;iBACjB,CAAC;gBACJ,CAAC,CAAC,SAAS;SAClB,CAAC;IAEZ,4DAA4D;IAC5D,OAAO,CACH,MAAC,0BAA0B,IAAC,GAAG,EAAE,YAAY,EAAE,SAAS,EAAE,EAAE,CAAC,EAAC,QAAQ,EAAE,eAAe,EAAC,CAAC,aACrF,KAAC,WAAW,IACR,SAAS,EAAE,EAAE,CAAC;oBACV,eAAe,EAAE,yBAAyB;iBAC7C,CAAC,EACF,UAAU,EAAE,yBAAyB,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,eAAe,EACpE,cAAc,EAAE,kBAAkB,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,EACpD,OAAO,EAAE,CAAC,YAAY,EAAE,GAAG,OAAO,CAAC,EACnC,WAAW,EAAC,OAAO,EACnB,MAAM,EAAE;oBACJ,CAAC,EAAE,eAAe,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,YAAY,CAAC;oBAC/D,CAAC,EAAE,MAAM;iBACZ,EACD,UAAU,EAAE,yBAAyB,EACrC,UAAU,EAAE,KAAK,EACjB,YAAY,EAAE,aAAa,EAC3B,KAAK,EAAE,CAAC,IAAe,EAAE,EAAE,CAAC,CAAC;oBACzB,OAAO,EAAE,GAAG,EAAE,CAAC,yBAAyB,EAAE,QAAQ,CAAC,IAAI,CAAC;iBAC3D,CAAC,GACJ,EACD,eAAe,IAAI,CAChB,cAAK,SAAS,EAAC,YAAY,YACvB,KAAC,aAAa,kBACC,YAAY,EACvB,eAAe,QACf,SAAS,EAAE,CAAC,KAAK,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,EAAE,EAAE,CAC7B,CAAC,CAAC,kCAAkC,EAAE,EAAC,IAAI,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAC,CAAC,EAEnE,KAAK,EAAE,eAAe,CAAC,UAAU,EACjC,cAAc,EAAE,eAAe,CAAC,WAAW,EAC3C,eAAe,EAAE,eAAe,CAAC,QAAQ,EACzC,eAAe,EAAE,eAAe,CAAC,eAAe,EAChD,QAAQ,EAAE,eAAe,CAAC,UAAU,EACpC,gBAAgB,EAAE,eAAe,CAAC,cAAc,GAClD,GACA,CACT,IACwB,CAChC,CAAC;AACN,CAAC,EACD,aAAa,CAChB,CAAC;AAEF,yEAAyE;AACzE,2KAA2K;AAC3K,6EAA6E;AAC7E,SAAS,eAAe,CAAC,KAAsD;IAC3E,MAAM,EAAC,CAAC,EAAC,GAAG,oBAAoB,EAAE,CAAC;IAEnC,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAkB,KAAK,CAAC,KAAK,CAAC,CAAC;IAEjE,+DAA+D;IAC/D,MAAM,CAAC,cAAc,CAAC,GAAG,QAAQ,CAC7B,GAAG,EAAE,CACD,IAAI,cAAc,CACd,QAAQ,CACJ,CAAC,CAAC,IAAI,CAAwB,EAAE,EAAE,CAC9B,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,EACzE,GAAG,CACN,CACJ,CACR,CAAC;IAEF,8FAA8F;IAC9F,MAAM,oBAAoB,GAAG,WAAW,CAAC,CAAC,IAAoB,EAAE,EAAE;QAC9D,cAAc,CAAC,UAAU,EAAE,CAAC;QAC5B,IAAI,IAAI,EAAE,CAAC;YACP,cAAc,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QACjC,CAAC;IACL,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,OAAO;QACH,GAAG,KAAK;QACR,KAAK,EAAE,GAAG,EAAE,CAAC,cAAK,GAAG,EAAE,oBAAoB,YAAG,CAAC,CAAC,eAAe,CAAC,GAAO;QACvE,KAAK;KACR,CAAC;AACN,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\n\nimport {type ComponentProps, type FunctionComponent, type Key, memo, useCallback, useState} from 'react';\nimport {KitPagination, KitTable} from 'aristid-ds';\nimport {type KitTableColumnType} from 'aristid-ds/dist/Kit/DataDisplay/Table/types';\nimport styled from 'styled-components';\nimport isEqual from 'lodash/isEqual';\nimport {useSharedTranslation} from '_ui/hooks/useSharedTranslation';\nimport {type IExplorerData, type IItemAction, type IItemData} from './_types';\nimport {TableCell} from './TableCell';\nimport {defaultPaginationHeight, useTableScrollableHeight} from './useTableScrollableHeight';\nimport {useColumnWidth} from './useColumnWidth';\nimport {WHO_AM_I_COLUMN} from './_constants';\nimport {TableNameCell} from './TableNameCell';\nimport cn from 'classnames';\nimport {throttle} from 'lodash';\n\nconst tableRowHeight = 56;\nconst tableHeaderMinLineHeight = 22;\n\nconst DataViewContainerDivStyled = styled.div`\n flex: 1 1 min-content;\n overflow: hidden;\n\n &.headless {\n overflow-y: auto;\n }\n\n .kit-table {\n padding-bottom: ${defaultPaginationHeight}px;\n position: relative;\n }\n\n .pagination {\n flex: 0 0 auto;\n justify-content: center;\n display: flex;\n padding-top: calc(var(--general-spacing-xs) * 1px);\n }\n`;\n\n// TODO: Table component should be updated fix header display\nconst StyledTable = styled(KitTable)`\n .ant-table-thead > tr > th {\n padding-top: calc(var(--general-spacing-xxs) * 1px) !important;\n padding-bottom: calc(var(--general-spacing-xxs) * 1px) !important;\n height: ${tableRowHeight}px;\n\n .ant-table-cell {\n min-height: ${tableHeaderMinLineHeight}px;\n height: auto !important;\n padding: 0 calc(var(--general-spacing-s) * 1px) 0 0;\n }\n }\n\n .ant-table-tbody > tr:hover .ant-table-cell {\n .actions-list {\n display: inline-flex;\n }\n }\n\n .ant-table-tbody > tr {\n .ant-table-cell {\n min-height: ${tableRowHeight}px;\n height: auto !important;\n .actions-list {\n margin-left: auto;\n }\n }\n }\n\n &.row-clickable {\n .ant-table-tbody > tr {\n cursor: pointer;\n }\n }\n`;\n\ninterface IDataViewProps {\n dataGroupedFilteredSorted: IItemData[];\n itemActions: IItemAction[];\n attributesProperties: IExplorerData['attributes'];\n attributesToDisplay: string[];\n paginationProps?: {\n pageSizeOptions: number[];\n totalCount: number;\n currentPage: number;\n pageSize: number;\n setNewPage: (page: number, pageSize: number) => void;\n setNewPageSize: (page: number, pageSize: number) => void;\n };\n selection: {\n onSelectItem?: null | ((selectedItem: IItemData) => void);\n onSelectionChange: null | ((keys: Key[]) => void);\n isMassSelectionAll: boolean;\n selectedKeys: Key[];\n mode?: 'simple' | 'multiple';\n };\n hideTableHeader: boolean;\n useSmallHeaderSize?: boolean;\n tableBodyHeight?: string;\n}\n\n// TODO: tests will fail if we don't check attributeToDisplay because we have a render with no attributes but data is present. We should check why there's this behavior\nconst arePropsEqual = (prevProps: IDataViewProps, nextProps: IDataViewProps) =>\n isEqual(\n {\n attributesToDisplay: prevProps.attributesToDisplay,\n data: prevProps.dataGroupedFilteredSorted,\n selectedKeys: prevProps.selection.selectedKeys,\n },\n {\n attributesToDisplay: nextProps.attributesToDisplay,\n data: nextProps.dataGroupedFilteredSorted,\n selectedKeys: nextProps.selection.selectedKeys,\n },\n );\n\nexport const DataView: FunctionComponent<IDataViewProps> = memo(\n ({\n dataGroupedFilteredSorted,\n attributesToDisplay,\n attributesProperties,\n paginationProps,\n itemActions,\n selection: {onSelectItem, onSelectionChange, selectedKeys, isMassSelectionAll, mode},\n hideTableHeader = false,\n useSmallHeaderSize = false,\n tableBodyHeight,\n }) => {\n const {t} = useSharedTranslation();\n\n const {containerRef, scrollHeight} = useTableScrollableHeight(!!paginationProps);\n const {getFieldColumnWidth} = useColumnWidth();\n\n const getColumnProps = (attributeName: string) =>\n ({\n title: () => attributesProperties[attributeName].label,\n ellipsis: useSmallHeaderSize,\n width: getFieldColumnWidth(attributesProperties[attributeName]),\n shouldCellUpdate: (record, prevRecord) =>\n isMassSelectionAll ||\n record.propertiesById[attributeName] !== prevRecord.propertiesById[attributeName],\n render: (_, item) => (\n <TableCell\n attributeProperties={attributesProperties[attributeName]}\n values={item.propertiesById[attributeName]}\n />\n ),\n }) satisfies KitTableColumnType<IItemData>;\n\n const columns = attributesToDisplay.map(getColumnProps);\n\n const whoIAmColumn = useWhoAmIColumn({\n ...getColumnProps(WHO_AM_I_COLUMN),\n fixed: 'left',\n render: (_, item) => <TableNameCell item={item} itemActions={itemActions} />,\n shouldCellUpdate: (record, prevRecord) => isMassSelectionAll || record.whoAmI !== prevRecord.whoAmI,\n });\n\n const itemActionToUseOnRowClick = itemActions.find(itemAction => itemAction.useItemActionOnRowClick);\n\n const _rowSelection: ComponentProps<typeof KitTable>['rowSelection'] =\n onSelectionChange === null\n ? undefined\n : {\n type: mode === 'simple' ? 'radio' : 'checkbox',\n columnTitle: ' ', // blank string to hide select all checkbox from <KitTable />\n selectedRowKeys: selectedKeys,\n preserveSelectedRowKeys: true,\n // TODO: review types from antd directly\n onChange: (selectedRowKeys: Key[]) => {\n const lastSelectedKey = selectedRowKeys[selectedRowKeys.length - 1];\n const lastSelectedItem = dataGroupedFilteredSorted.find(data => data.key === lastSelectedKey);\n\n onSelectionChange(selectedRowKeys);\n\n if (lastSelectedItem) {\n onSelectItem?.(lastSelectedItem);\n }\n },\n getCheckboxProps: isMassSelectionAll\n ? () => ({\n disabled: true,\n })\n : undefined,\n };\n\n // TODO: handle columns width based on attribute type/format\n return (\n <DataViewContainerDivStyled ref={containerRef} className={cn({headless: hideTableHeader})}>\n <StyledTable\n className={cn({\n 'row-clickable': itemActionToUseOnRowClick,\n })}\n showHeader={dataGroupedFilteredSorted.length > 0 && !hideTableHeader}\n headerLineSize={useSmallHeaderSize ? 's' : undefined}\n columns={[whoIAmColumn, ...columns]}\n tableLayout=\"fixed\"\n scroll={{\n y: tableBodyHeight ?? (hideTableHeader ? '100%' : scrollHeight),\n x: '100%',\n }}\n dataSource={dataGroupedFilteredSorted}\n pagination={false}\n rowSelection={_rowSelection}\n onRow={(item: IItemData) => ({\n onClick: () => itemActionToUseOnRowClick?.callback(item),\n })}\n />\n {paginationProps && (\n <div className=\"pagination\">\n <KitPagination\n aria-label=\"pagination\"\n showSizeChanger\n showTotal={(total, [from, to]) =>\n t('explorer.pagination-total-number', {from, to, count: total})\n }\n total={paginationProps.totalCount}\n defaultCurrent={paginationProps.currentPage}\n defaultPageSize={paginationProps.pageSize}\n pageSizeOptions={paginationProps.pageSizeOptions}\n onChange={paginationProps.setNewPage}\n onShowSizeChange={paginationProps.setNewPageSize}\n />\n </div>\n )}\n </DataViewContainerDivStyled>\n );\n },\n arePropsEqual,\n);\n\n// This hook exists to change the width of the whoAmI column dynamically.\n// The aimed result is a whoAmI column that always expand and is the only one to expand if there is horizontal space available, but never shrinks under its specifed width.\n// This behaviour is mostly present to prevent the selection column to expand\nfunction useWhoAmIColumn(props: KitTableColumnType<IItemData> & {width: number}) {\n const {t} = useSharedTranslation();\n\n const [width, setWidth] = useState<number | string>(props.width);\n\n // initialize observer only once using the useState initializer\n const [resizeObserver] = useState(\n () =>\n new ResizeObserver(\n throttle(\n ([node]: ResizeObserverEntry[]) =>\n setWidth(node.contentRect.width < props.width ? props.width : '100%'),\n 100,\n ),\n ),\n );\n\n // use the `ref` prop as a callback to retrieve the div element and connect the observer on it\n const onWhoAmIColumnRender = useCallback((node: HTMLDivElement) => {\n resizeObserver.disconnect();\n if (node) {\n resizeObserver.observe(node);\n }\n }, []);\n\n return {\n ...props,\n title: () => <div ref={onWhoAmIColumnRender}>{t('explorer.name')}</div>,\n width,\n };\n}\n"]}
@@ -1,6 +1,6 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
- import { KitTypography } from 'aristid-ds';
3
- export const ResultsCount = ({ t, isInactive, totalCountFiltered, totalCountLibrary, }) => (_jsxs(KitTypography.Paragraph, { children: [_jsx(KitTypography.Text, { weight: "bold", size: "fontSize7", children: isInactive
2
+ import { KitSpace, KitTypography } from 'aristid-ds';
3
+ export const ResultsCount = ({ t, isInactive, totalCountFiltered, totalCountLibrary, }) => (_jsxs(KitSpace, { direction: "horizontal", size: "xxs", children: [_jsx(KitTypography.Text, { weight: "bold", size: "fontSize7", children: isInactive
4
4
  ? `${totalCountLibrary} `
5
5
  : totalCountFiltered === totalCountLibrary
6
6
  ? `${totalCountLibrary} `
@@ -1 +1 @@
1
- {"version":3,"file":"ResultsCount.js","sourceRoot":"","sources":["../../../../src/components/Explorer/actions-mass/ResultsCount.tsx"],"names":[],"mappings":";AAIA,OAAO,EAAC,aAAa,EAAC,MAAM,YAAY,CAAC;AAUzC,MAAM,CAAC,MAAM,YAAY,GAAyC,CAAC,EAC/D,CAAC,EACD,UAAU,EACV,kBAAkB,EAClB,iBAAiB,GACpB,EAAE,EAAE,CAAC,CACF,MAAC,aAAa,CAAC,SAAS,eACpB,KAAC,aAAa,CAAC,IAAI,IAAC,MAAM,EAAC,MAAM,EAAC,IAAI,EAAC,WAAW,YAC7C,UAAU;gBACP,CAAC,CAAC,GAAG,iBAAiB,GAAG;gBACzB,CAAC,CAAC,kBAAkB,KAAK,iBAAiB;oBACxC,CAAC,CAAC,GAAG,iBAAiB,GAAG;oBACzB,CAAC,CAAC,GAAG,kBAAkB,MAAM,iBAAiB,GAAG,GACtC,EACrB,KAAC,aAAa,CAAC,IAAI,IAAC,MAAM,EAAC,QAAQ,EAAC,IAAI,EAAC,WAAW,YAC/C,CAAC,CAAC,6BAA6B,EAAE,EAAC,KAAK,EAAE,iBAAiB,EAAC,CAAC,GAC5C,IACC,CAC7B,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 useSharedTranslation} from '_ui/hooks/useSharedTranslation';\nimport {KitTypography} from 'aristid-ds';\nimport {type FunctionComponent} from 'react';\n\ninterface IResultCountProps {\n t: ReturnType<typeof useSharedTranslation>['t'];\n isInactive: boolean;\n totalCountFiltered: number;\n totalCountLibrary: number;\n}\n\nexport const ResultsCount: FunctionComponent<IResultCountProps> = ({\n t,\n isInactive,\n totalCountFiltered,\n totalCountLibrary,\n}) => (\n <KitTypography.Paragraph>\n <KitTypography.Text weight=\"bold\" size=\"fontSize7\">\n {isInactive\n ? `${totalCountLibrary} `\n : totalCountFiltered === totalCountLibrary\n ? `${totalCountLibrary} `\n : `${totalCountFiltered} / ${totalCountLibrary} `}\n </KitTypography.Text>\n <KitTypography.Text weight=\"medium\" size=\"fontSize7\">\n {t('explorer.massAction.results', {count: totalCountLibrary})}\n </KitTypography.Text>\n </KitTypography.Paragraph>\n);\n"]}
1
+ {"version":3,"file":"ResultsCount.js","sourceRoot":"","sources":["../../../../src/components/Explorer/actions-mass/ResultsCount.tsx"],"names":[],"mappings":";AAIA,OAAO,EAAC,QAAQ,EAAE,aAAa,EAAC,MAAM,YAAY,CAAC;AAUnD,MAAM,CAAC,MAAM,YAAY,GAAyC,CAAC,EAC/D,CAAC,EACD,UAAU,EACV,kBAAkB,EAClB,iBAAiB,GACpB,EAAE,EAAE,CAAC,CACF,MAAC,QAAQ,IAAC,SAAS,EAAC,YAAY,EAAC,IAAI,EAAC,KAAK,aACvC,KAAC,aAAa,CAAC,IAAI,IAAC,MAAM,EAAC,MAAM,EAAC,IAAI,EAAC,WAAW,YAC7C,UAAU;gBACP,CAAC,CAAC,GAAG,iBAAiB,GAAG;gBACzB,CAAC,CAAC,kBAAkB,KAAK,iBAAiB;oBACxC,CAAC,CAAC,GAAG,iBAAiB,GAAG;oBACzB,CAAC,CAAC,GAAG,kBAAkB,MAAM,iBAAiB,GAAG,GACtC,EACrB,KAAC,aAAa,CAAC,IAAI,IAAC,MAAM,EAAC,QAAQ,EAAC,IAAI,EAAC,WAAW,YAC/C,CAAC,CAAC,6BAA6B,EAAE,EAAC,KAAK,EAAE,iBAAiB,EAAC,CAAC,GAC5C,IACd,CACd,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 useSharedTranslation} from '_ui/hooks/useSharedTranslation';\nimport {KitSpace, KitTypography} from 'aristid-ds';\nimport {type FunctionComponent} from 'react';\n\ninterface IResultCountProps {\n t: ReturnType<typeof useSharedTranslation>['t'];\n isInactive: boolean;\n totalCountFiltered: number;\n totalCountLibrary: number;\n}\n\nexport const ResultsCount: FunctionComponent<IResultCountProps> = ({\n t,\n isInactive,\n totalCountFiltered,\n totalCountLibrary,\n}) => (\n <KitSpace direction=\"horizontal\" size=\"xxs\">\n <KitTypography.Text weight=\"bold\" size=\"fontSize7\">\n {isInactive\n ? `${totalCountLibrary} `\n : totalCountFiltered === totalCountLibrary\n ? `${totalCountLibrary} `\n : `${totalCountFiltered} / ${totalCountLibrary} `}\n </KitTypography.Text>\n <KitTypography.Text weight=\"medium\" size=\"fontSize7\">\n {t('explorer.massAction.results', {count: totalCountLibrary})}\n </KitTypography.Text>\n </KitSpace>\n);\n"]}
@@ -53,10 +53,12 @@ export const useEditAttributeMassAction = ({ isEnabled, store: { view }, totalCo
53
53
  setSelectedAttribute(undefined);
54
54
  setEditionMapping([]);
55
55
  };
56
- const isMappingCompleted = useMemo(() => valuesOccurrences.noValueCount === 0
57
- ? editionMapping.length === valuesOccurrences.occurrences.length
58
- : editionMapping.length === valuesOccurrences.occurrences.length + 1, // for undefined values
59
- [editionMapping, valuesOccurrences]);
56
+ const isMappingCompleted = useMemo(() => {
57
+ const editionMappingValuesLength = editionMapping.reduce((acc, curr) => acc + curr.values.length, 0);
58
+ return valuesOccurrences.noValueCount === 0
59
+ ? editionMappingValuesLength === valuesOccurrences.occurrences.length
60
+ : editionMappingValuesLength + 1; // for undefined values
61
+ }, [editionMapping, valuesOccurrences]);
60
62
  const bulkCounter = useMemo(() => (view.massSelection === MASS_SELECTION_ALL ? totalCount : view.massSelection.length), [view.massSelection, totalCount]);
61
63
  const onOkButtonClick = async () => {
62
64
  if (!selectedAttribute || !isMappingCompleted) {
@@ -68,7 +70,7 @@ export const useEditAttributeMassAction = ({ isEnabled, store: { view }, totalCo
68
70
  libraryId: view.libraryId,
69
71
  recordsFilters: massSelectionFilter,
70
72
  attributeId: selectedAttribute.id,
71
- mapValues: editionMapping,
73
+ mapping: editionMapping,
72
74
  },
73
75
  });
74
76
  closeModal();
@@ -100,7 +102,13 @@ export const useEditAttributeMassAction = ({ isEnabled, store: { view }, totalCo
100
102
  return {
101
103
  editAttributeMassAction: _editAttributeMassAction,
102
104
  editAttributeMassActionModal: (_jsxs(EditAttributeMassActionModal, { isOpen: openModal, attributes: editableAttributes, setSelectedAttribute: setSelectedAttribute, massSelectionFilter: massSelectionFilter, elementsCount: bulkCounter, disableOkButton: !isMappingCompleted, onOkButtonClick: onOkButtonClick, onCancelButtonClick: closeModal, children: [selectedAttribute != null && valuesOccurrences.loading ? _jsx(Loading, {}) : null, selectedAttribute?.type === AttributeType.tree && (_jsx(EditTreeAttributeValuesMapping, { selectedAttribute: selectedAttribute, valuesOccurrences: valuesOccurrences, setAttributeMapping: (before, after) => {
103
- setEditionMapping(editionMapping.filter(mapping => mapping.before !== before).concat([{ before, after }]));
105
+ setEditionMapping([
106
+ {
107
+ values: (editionMapping[0]?.values ?? [])
108
+ .filter(value => value.before !== before)
109
+ .concat([{ before, after }]),
110
+ },
111
+ ]);
104
112
  } }))] })),
105
113
  };
106
114
  };
@@ -1 +1 @@
1
- {"version":3,"file":"useEditAttributeMassAction.js","sourceRoot":"","sources":["../../../../src/components/Explorer/actions-mass/useEditAttributeMassAction.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 {\n type AttributeDetailsFragment,\n AttributeType,\n type RecordFilterInput,\n useSaveValueBulkMutation,\n} from '_ui/_gqlTypes';\nimport {useSharedTranslation} from '_ui/hooks/useSharedTranslation';\nimport {useEffect, useMemo, useState} from 'react';\nimport {MASS_SELECTION_ALL} from '../_constants';\nimport {type FeatureHook, type IMassActions} from '../_types';\nimport {type IViewSettingsState} from '../manage-view-settings';\nimport {EditTreeAttributeValuesMapping} from './edit-attribute/EditTreeAttributeValuesMapping';\nimport {EditAttributeMassActionModal} from './edit-attribute/EditAttributeMassActionModal';\nimport {useListEditableAttributeHook} from './edit-attribute/useListEditableAttributeHook';\nimport {useCountValuesOccurrencesHook} from './edit-attribute/useCountValuesOccurrencesHook';\nimport {KitAlert, KitNotification} from 'aristid-ds';\nimport {ERROR_ALERT_DURATION, INFO_NOTIFICATION_DURATION} from '_ui/constants';\nimport {Loading} from '_ui/components/Loading';\nimport {FontAwesomeIcon} from '@fortawesome/react-fontawesome';\nimport {faEdit} from '@fortawesome/free-solid-svg-icons';\n\nexport const useEditAttributeMassAction = ({\n isEnabled,\n store: {view},\n totalCount,\n}: FeatureHook<{\n store: {\n view: IViewSettingsState;\n };\n totalCount: number;\n}>) => {\n if (!isEnabled) {\n return {\n editAttributeMassAction: null,\n editAttributeMassActionModal: null,\n };\n }\n\n const {t} = useSharedTranslation();\n\n const [selectedAttribute, setSelectedAttribute] = useState<AttributeDetailsFragment | undefined>(undefined);\n const [massSelectionFilter, setMassSelectionFilter] = useState<RecordFilterInput[]>([]);\n const [openModal, setOpenModal] = useState<boolean>(false);\n const [editionMapping, setEditionMapping] = useState<Array<{before: string | null; after: string | null}>>([]);\n\n const editableAttributes = useListEditableAttributeHook({libraryId: view.libraryId});\n const valuesOccurrences = useCountValuesOccurrencesHook({\n attributeId: selectedAttribute?.id,\n libraryId: view.libraryId,\n recordFilters: massSelectionFilter,\n });\n\n const [executeSaveValueBulk] = useSaveValueBulkMutation();\n\n useEffect(() => {\n setEditionMapping([]);\n }, [selectedAttribute]);\n\n const _editAttributeMassAction: IMassActions = useMemo(\n () => ({\n label: t('explorer.massAction.editAttribute'),\n icon: <FontAwesomeIcon icon={faEdit} />,\n deselectAll: false,\n callback: _massSelectionFilter => {\n setMassSelectionFilter(_massSelectionFilter);\n setEditionMapping([]);\n setOpenModal(true);\n },\n }),\n [t, view.massSelection],\n );\n\n const closeModal = () => {\n setOpenModal(false);\n setMassSelectionFilter([]);\n setSelectedAttribute(undefined);\n setEditionMapping([]);\n };\n\n const isMappingCompleted = useMemo(\n () =>\n valuesOccurrences.noValueCount === 0\n ? editionMapping.length === valuesOccurrences.occurrences.length\n : editionMapping.length === valuesOccurrences.occurrences.length + 1, // for undefined values\n [editionMapping, valuesOccurrences],\n );\n\n const bulkCounter = useMemo(\n () => (view.massSelection === MASS_SELECTION_ALL ? totalCount : view.massSelection.length),\n [view.massSelection, totalCount],\n );\n\n const onOkButtonClick = async () => {\n if (!selectedAttribute || !isMappingCompleted) {\n return;\n }\n try {\n await executeSaveValueBulk({\n variables: {\n libraryId: view.libraryId,\n recordsFilters: massSelectionFilter,\n attributeId: selectedAttribute.id,\n mapValues: editionMapping,\n },\n });\n\n closeModal();\n KitNotification.info({\n message: t('explorer.massAction.editAttribute_submit_notification_title'),\n description: t('explorer.massAction.editAttribute_submit_notification_description', {\n counter: bulkCounter,\n }),\n duration: INFO_NOTIFICATION_DURATION,\n closable: true,\n });\n } catch (error) {\n KitAlert.error({\n showIcon: true,\n duration: ERROR_ALERT_DURATION,\n message: t('error.error_occurred'),\n description: t('explorer.massAction.editAttribute_submit_error'),\n closable: true,\n });\n }\n };\n\n if (editableAttributes.length === 0) {\n return {\n editAttributeMassAction: null,\n editAttributeMassActionModal: null,\n };\n }\n\n return {\n editAttributeMassAction: _editAttributeMassAction,\n editAttributeMassActionModal: (\n <EditAttributeMassActionModal\n isOpen={openModal}\n attributes={editableAttributes}\n setSelectedAttribute={setSelectedAttribute}\n massSelectionFilter={massSelectionFilter}\n elementsCount={bulkCounter}\n disableOkButton={!isMappingCompleted}\n onOkButtonClick={onOkButtonClick}\n onCancelButtonClick={closeModal}\n >\n {selectedAttribute != null && valuesOccurrences.loading ? <Loading /> : null}\n {selectedAttribute?.type === AttributeType.tree && (\n <EditTreeAttributeValuesMapping\n selectedAttribute={selectedAttribute}\n valuesOccurrences={valuesOccurrences}\n setAttributeMapping={(before, after) => {\n setEditionMapping(\n editionMapping.filter(mapping => mapping.before !== before).concat([{before, after}]),\n );\n }}\n />\n )}\n </EditAttributeMassActionModal>\n ),\n };\n};\n"]}
1
+ {"version":3,"file":"useEditAttributeMassAction.js","sourceRoot":"","sources":["../../../../src/components/Explorer/actions-mass/useEditAttributeMassAction.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 {\n type AttributeDetailsFragment,\n AttributeType,\n type RecordFilterInput,\n useSaveValueBulkMutation,\n} from '_ui/_gqlTypes';\nimport {useSharedTranslation} from '_ui/hooks/useSharedTranslation';\nimport {useEffect, useMemo, useState} from 'react';\nimport {MASS_SELECTION_ALL} from '../_constants';\nimport {type FeatureHook, type IMassActions} from '../_types';\nimport {type IViewSettingsState} from '../manage-view-settings';\nimport {EditTreeAttributeValuesMapping} from './edit-attribute/EditTreeAttributeValuesMapping';\nimport {EditAttributeMassActionModal} from './edit-attribute/EditAttributeMassActionModal';\nimport {useListEditableAttributeHook} from './edit-attribute/useListEditableAttributeHook';\nimport {useCountValuesOccurrencesHook} from './edit-attribute/useCountValuesOccurrencesHook';\nimport {KitAlert, KitNotification} from 'aristid-ds';\nimport {ERROR_ALERT_DURATION, INFO_NOTIFICATION_DURATION} from '_ui/constants';\nimport {Loading} from '_ui/components/Loading';\nimport {FontAwesomeIcon} from '@fortawesome/react-fontawesome';\nimport {faEdit} from '@fortawesome/free-solid-svg-icons';\n\nexport const useEditAttributeMassAction = ({\n isEnabled,\n store: {view},\n totalCount,\n}: FeatureHook<{\n store: {\n view: IViewSettingsState;\n };\n totalCount: number;\n}>) => {\n if (!isEnabled) {\n return {\n editAttributeMassAction: null,\n editAttributeMassActionModal: null,\n };\n }\n\n const {t} = useSharedTranslation();\n\n const [selectedAttribute, setSelectedAttribute] = useState<AttributeDetailsFragment | undefined>(undefined);\n const [massSelectionFilter, setMassSelectionFilter] = useState<RecordFilterInput[]>([]);\n const [openModal, setOpenModal] = useState<boolean>(false);\n const [editionMapping, setEditionMapping] = useState<\n Array<{values: Array<{before: string | null; after: string | null}>}>\n >([]);\n\n const editableAttributes = useListEditableAttributeHook({libraryId: view.libraryId});\n const valuesOccurrences = useCountValuesOccurrencesHook({\n attributeId: selectedAttribute?.id,\n libraryId: view.libraryId,\n recordFilters: massSelectionFilter,\n });\n\n const [executeSaveValueBulk] = useSaveValueBulkMutation();\n\n useEffect(() => {\n setEditionMapping([]);\n }, [selectedAttribute]);\n\n const _editAttributeMassAction: IMassActions = useMemo(\n () => ({\n label: t('explorer.massAction.editAttribute'),\n icon: <FontAwesomeIcon icon={faEdit} />,\n deselectAll: false,\n callback: _massSelectionFilter => {\n setMassSelectionFilter(_massSelectionFilter);\n setEditionMapping([]);\n setOpenModal(true);\n },\n }),\n [t, view.massSelection],\n );\n\n const closeModal = () => {\n setOpenModal(false);\n setMassSelectionFilter([]);\n setSelectedAttribute(undefined);\n setEditionMapping([]);\n };\n\n const isMappingCompleted = useMemo(() => {\n const editionMappingValuesLength = editionMapping.reduce((acc, curr) => acc + curr.values.length, 0);\n\n return valuesOccurrences.noValueCount === 0\n ? editionMappingValuesLength === valuesOccurrences.occurrences.length\n : editionMappingValuesLength + 1; // for undefined values\n }, [editionMapping, valuesOccurrences]);\n\n const bulkCounter = useMemo(\n () => (view.massSelection === MASS_SELECTION_ALL ? totalCount : view.massSelection.length),\n [view.massSelection, totalCount],\n );\n\n const onOkButtonClick = async () => {\n if (!selectedAttribute || !isMappingCompleted) {\n return;\n }\n try {\n await executeSaveValueBulk({\n variables: {\n libraryId: view.libraryId,\n recordsFilters: massSelectionFilter,\n attributeId: selectedAttribute.id,\n mapping: editionMapping,\n },\n });\n\n closeModal();\n KitNotification.info({\n message: t('explorer.massAction.editAttribute_submit_notification_title'),\n description: t('explorer.massAction.editAttribute_submit_notification_description', {\n counter: bulkCounter,\n }),\n duration: INFO_NOTIFICATION_DURATION,\n closable: true,\n });\n } catch (error) {\n KitAlert.error({\n showIcon: true,\n duration: ERROR_ALERT_DURATION,\n message: t('error.error_occurred'),\n description: t('explorer.massAction.editAttribute_submit_error'),\n closable: true,\n });\n }\n };\n\n if (editableAttributes.length === 0) {\n return {\n editAttributeMassAction: null,\n editAttributeMassActionModal: null,\n };\n }\n\n return {\n editAttributeMassAction: _editAttributeMassAction,\n editAttributeMassActionModal: (\n <EditAttributeMassActionModal\n isOpen={openModal}\n attributes={editableAttributes}\n setSelectedAttribute={setSelectedAttribute}\n massSelectionFilter={massSelectionFilter}\n elementsCount={bulkCounter}\n disableOkButton={!isMappingCompleted}\n onOkButtonClick={onOkButtonClick}\n onCancelButtonClick={closeModal}\n >\n {selectedAttribute != null && valuesOccurrences.loading ? <Loading /> : null}\n {selectedAttribute?.type === AttributeType.tree && (\n <EditTreeAttributeValuesMapping\n selectedAttribute={selectedAttribute}\n valuesOccurrences={valuesOccurrences}\n setAttributeMapping={(before, after) => {\n setEditionMapping([\n {\n values: (editionMapping[0]?.values ?? [])\n .filter(value => value.before !== before)\n .concat([{before, after}]),\n },\n ]);\n }}\n />\n )}\n </EditAttributeMassActionModal>\n ),\n };\n};\n"]}
@@ -73,6 +73,8 @@ export const useMassActions = ({ isEnabled, store: { dispatch, view }, filtersSt
73
73
  useEffect(() => () => closeKitSnackBar(snackbarId), []);
74
74
  const isOnePage = view.pageSize > totalCountFiltered;
75
75
  const hasSelectedAllAvailableItems = view.massSelection === MASS_SELECTION_ALL || view.massSelection.length === totalCountFiltered;
76
+ const hasSelectedAllVisibleItems = view.massSelection.length >= allVisibleKeys.length &&
77
+ allVisibleKeys.find(visibleKey => view.massSelection.includes(visibleKey)) !== undefined;
76
78
  const hasSelectedSomeItems = view.massSelection !== MASS_SELECTION_ALL &&
77
79
  view.massSelection.length > 0 &&
78
80
  view.massSelection.length < totalCountFiltered;
@@ -87,13 +89,17 @@ export const useMassActions = ({ isEnabled, store: { dispatch, view }, filtersSt
87
89
  items: [
88
90
  hasSelectedAllAvailableItems
89
91
  ? null
90
- : {
91
- key: 'toggle_page_selection',
92
- label: t('explorer.massAction.toggle_selection.select_page', { count: view.pageSize }),
93
- onClick: () => {
94
- _setSelectedKeys([...new Set([...view.massSelection, ...allVisibleKeys])]);
92
+ : hasSelectedAllVisibleItems
93
+ ? {
94
+ key: 'toggle_page_selection',
95
+ label: t('explorer.massAction.toggle_selection.deselect_page', { count: view.pageSize }),
96
+ onClick: () => _setSelectedKeys([...view.massSelection].filter(key => allVisibleKeys.includes[key])),
97
+ }
98
+ : {
99
+ key: 'toggle_page_selection',
100
+ label: t('explorer.massAction.toggle_selection.select_page', { count: view.pageSize }),
101
+ onClick: () => _setSelectedKeys([...new Set([...view.massSelection, ...allVisibleKeys])]),
95
102
  },
96
- },
97
103
  {
98
104
  key: 'toggle_all_selection',
99
105
  label: hasSelectedAllAvailableItems
@@ -1 +1 @@
1
- {"version":3,"file":"useMassActions.js","sourceRoot":"","sources":["../../../../src/components/Explorer/actions-mass/useMassActions.tsx"],"names":[],"mappings":";AAAA,oFAAoF;AACpF,sCAAsC;AACtC,sEAAsE;AACtE,OAAO,EAAC,gBAAgB,EAAE,WAAW,EAAE,WAAW,EAAE,QAAQ,EAAiB,eAAe,EAAC,MAAM,YAAY,CAAC;AAChH,OAAO,EAAgB,WAAW,EAAE,SAAS,EAAU,QAAQ,EAAC,MAAM,OAAO,CAAC;AAC9E,OAAO,EAAC,qBAAqB,EAAE,oBAAoB,EAAC,MAAM,eAAe,CAAC;AAC1E,OAAO,EAAC,oBAAoB,EAAC,MAAM,gCAAgC,CAAC;AACpE,OAAO,EAAC,iBAAiB,EAAC,MAAM,8BAA8B,CAAC;AAE/D,OAAO,EAAC,kBAAkB,EAAC,MAAM,eAAe,CAAC;AACjD,OAAO,EAAoD,uBAAuB,EAAC,MAAM,yBAAyB,CAAC;AACnH,OAAO,EAAC,wBAAwB,EAAC,MAAM,wBAAwB,CAAC;AAEhE,OAAO,EAAC,eAAe,EAAC,MAAM,gCAAgC,CAAC;AAC/D,OAAO,EAAC,WAAW,EAAC,MAAM,mCAAmC,CAAC;AAC9D,OAAO,EAAC,YAAY,EAAC,MAAM,gBAAgB,CAAC;AAE5C;;;;;;;;;;;GAWG;AACH,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,EAC3B,SAAS,EACT,KAAK,EAAE,EAAC,QAAQ,EAAE,IAAI,EAAC,EACvB,YAAY,EAAE,EAAC,OAAO,EAAE,eAAe,EAAC,EACxC,kBAAkB,EAClB,iBAAiB,EACjB,cAAc,EACd,WAAW,EACX,UAAU,GAab,EAAE,EAAE;IACD,MAAM,EAAC,CAAC,EAAC,GAAG,oBAAoB,EAAE,CAAC;IACnC,MAAM,CAAC,UAAU,EAAE,aAAa,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAEpD,SAAS,CAAC,GAAG,EAAE;QACX,aAAa,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,KAAK,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,KAAK,OAAO,CAAC,CAAC;IACrF,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC;IAEd,SAAS,CAAC,GAAG,EAAE;QACX,IAAI,IAAI,CAAC,aAAa,KAAK,kBAAkB,IAAI,IAAI,CAAC,aAAa,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC/E,eAAe,CAAC;gBACZ,QAAQ,EAAE,CAAC;gBACX,QAAQ,EAAE,IAAI;gBACd,UAAU;gBACV,SAAS,EAAE,UAAU;gBACrB,OAAO,EAAE,GAAG,EAAE,CAAC,gBAAgB,CAAC,EAAE,CAAC;gBACnC,OAAO,EAAE,CAAC,CAAC,mCAAmC,EAAE;oBAC5C,KAAK,EAAE,IAAI,CAAC,aAAa,KAAK,kBAAkB,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,MAAM;iBACpG,CAAC;gBACF,OAAO,EAAE,WAAW,CAAC,GAAG,CAAC,CAAC,EAAC,KAAK,EAAE,IAAI,EAAE,WAAW,EAAE,QAAQ,EAAC,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC;oBACvE,GAAG,EAAE,KAAK;oBACV,KAAK;oBACL,IAAI;oBACJ,OAAO,EAAE,KAAK,IAAI,EAAE;wBAChB,MAAM,QAAQ,CACV,IAAI,CAAC,aAAa,KAAK,kBAAkB;4BACrC,CAAC,CAAC,wBAAwB,CAAC,OAAO,EAAE,eAAe,CAAC;4BACpD,CAAC,CAAC,iBAAiB,CACb,EAAC,QAAQ,EAAE,oBAAoB,CAAC,EAAE,EAAC,EACnC,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;gCAC1B;oCACI,KAAK,EAAE,IAAI;oCACX,SAAS,EAAE,qBAAqB,CAAC,KAAK;oCACtC,KAAK,EAAE,MAAM,CAAC,GAAG,CAAC;iCACrB;6BACJ,CAAC,CACL,EACP,IAAI,CAAC,aAAa,CACrB,CAAC;wBACF,IAAI,WAAW,EAAE,CAAC;4BACd,QAAQ,CAAC;gCACL,IAAI,EAAE,uBAAuB,CAAC,iBAAiB;gCAC/C,OAAO,EAAE,EAAE;6BACd,CAAC,CAAC;wBACP,CAAC;oBACL,CAAC;iBACJ,CAAC,CAAC;aACN,CAAC,CAAC;QACP,CAAC;aAAM,CAAC;YACJ,gBAAgB,CAAC,UAAU,CAAC,CAAC;QACjC,CAAC;IACL,CAAC,EAAE,CAAC,IAAI,CAAC,aAAa,EAAE,OAAO,EAAE,kBAAkB,CAAC,CAAC,CAAC;IAEtD,SAAS,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE,CAAC,gBAAgB,CAAC,UAAU,CAAC,EAAE,EAAE,CAAC,CAAC;IAExD,MAAM,SAAS,GAAG,IAAI,CAAC,QAAQ,GAAG,kBAAkB,CAAC;IACrD,MAAM,4BAA4B,GAC9B,IAAI,CAAC,aAAa,KAAK,kBAAkB,IAAI,IAAI,CAAC,aAAa,CAAC,MAAM,KAAK,kBAAkB,CAAC;IAClG,MAAM,oBAAoB,GACtB,IAAI,CAAC,aAAa,KAAK,kBAAkB;QACzC,IAAI,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC;QAC7B,IAAI,CAAC,aAAa,CAAC,MAAM,GAAG,kBAAkB,CAAC;IAEnD,MAAM,gBAAgB,GAAG,SAAS,CAAC,CAAC,CAAC,CACjC,KAAC,WAAW,oBACM,oBAAoB,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,4BAA4B,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,EAC9F,aAAa,EAAE,oBAAoB,EACnC,OAAO,EAAE,4BAA4B,EACrC,QAAQ,EAAE,CAAC,CAAC,EAAE;YACV,IAAI,4BAA4B,EAAE,CAAC;gBAC/B,gBAAgB,CAAC,EAAE,CAAC,CAAC;YACzB,CAAC;iBAAM,CAAC;gBACJ,gBAAgB,CAAC,cAAc,CAAC,CAAC;YACrC,CAAC;QACL,CAAC,YAED,KAAC,YAAY,IACT,CAAC,EAAE,CAAC,EACJ,UAAU,EAAE,UAAU,EACtB,kBAAkB,EAAE,kBAAkB,EACtC,iBAAiB,EAAE,iBAAiB,GACtC,GACQ,CACjB,CAAC,CAAC,CAAC,CACA,KAAC,WAAW,IACR,OAAO,EAAE,CAAC,OAAO,CAAC,EAClB,IAAI,EAAE;YACF,KAAK,EAAE;gBACH,4BAA4B;oBACxB,CAAC,CAAC,IAAI;oBACN,CAAC,CAAC;wBACI,GAAG,EAAE,uBAAuB;wBAC5B,KAAK,EAAE,CAAC,CAAC,kDAAkD,EAAE,EAAC,KAAK,EAAE,IAAI,CAAC,QAAQ,EAAC,CAAC;wBACpF,OAAO,EAAE,GAAG,EAAE;4BACV,gBAAgB,CAAC,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,aAAa,EAAE,GAAG,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC;wBAC/E,CAAC;qBACJ;gBACP;oBACI,GAAG,EAAE,sBAAsB;oBAC3B,KAAK,EAAE,4BAA4B;wBAC/B,CAAC,CAAC,CAAC,CAAC,mDAAmD,EAAE,EAAC,KAAK,EAAE,kBAAkB,EAAC,CAAC;wBACrF,CAAC,CAAC,CAAC,CAAC,iDAAiD,EAAE,EAAC,KAAK,EAAE,kBAAkB,EAAC,CAAC;oBACvF,OAAO,EAAE,KAAK,IAAI,EAAE;wBAChB,IAAI,4BAA4B,EAAE,CAAC;4BAC/B,gBAAgB,CAAC,EAAE,CAAC,CAAC;wBACzB,CAAC;6BAAM,CAAC;4BACJ,gBAAgB,CAAC,kBAAkB,CAAC,CAAC;wBACzC,CAAC;oBACL,CAAC;iBACJ;aACJ;SACJ,YAED,KAAC,WAAW,oBACM,oBAAoB,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,4BAA4B,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,EAC9F,aAAa,EAAE,oBAAoB,EACnC,OAAO,EAAE,4BAA4B,YAErC,MAAC,QAAQ,IAAC,IAAI,EAAC,KAAK,aAChB,KAAC,YAAY,IACT,CAAC,EAAE,CAAC,EACJ,UAAU,EAAE,UAAU,EACtB,kBAAkB,EAAE,kBAAkB,EACtC,iBAAiB,EAAE,iBAAiB,GACtC,EACF,KAAC,eAAe,IAAC,IAAI,EAAE,WAAW,EAAE,IAAI,EAAC,KAAK,GAAG,IAC1C,GACD,GACJ,CACjB,CAAC;IAEF,MAAM,gBAAgB,GAAG,WAAW,CAChC,CAAC,IAAmB,EAAE,EAAE,CACpB,QAAQ,CAAC;QACL,IAAI,EAAE,uBAAuB,CAAC,iBAAiB;QAC/C,OAAO,EAAE,IAAI;KAChB,CAAC,EACN,CAAC,QAAQ,CAAC,CACb,CAAC;IAEF,OAAO;QACH,eAAe,EAAE,SAAS,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,IAAI;QACpD,eAAe,EAAE,SAAS,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,IAAI;KACvD,CAAC;AACN,CAAC,CAAC","sourcesContent":["// Copyright LEAV Solutions 2017 until 2023/11/05, Copyright Aristid from 2023/11/06\n// This file is released under LGPL V3\n// License text available at https://www.gnu.org/licenses/lgpl-3.0.txt\nimport {closeKitSnackBar, KitCheckbox, KitDropDown, KitSpace, KitTypography, openKitSnackBar} from 'aristid-ds';\nimport {type Dispatch, useCallback, useEffect, useRef, useState} from 'react';\nimport {RecordFilterCondition, RecordFilterOperator} from '_ui/_gqlTypes';\nimport {useSharedTranslation} from '_ui/hooks/useSharedTranslation';\nimport {interleaveElement} from '_ui/_utils/interleaveElement';\nimport {type IMassActions, type MassSelection} from '../_types';\nimport {MASS_SELECTION_ALL} from '../_constants';\nimport {type IViewSettingsAction, type IViewSettingsState, ViewSettingsActionTypes} from '../manage-view-settings';\nimport {prepareFiltersForRequest} from '_ui/components/Filters';\nimport {type IUIFiltersState} from '_ui/components/Filters/context/filtersReducer';\nimport {FontAwesomeIcon} from '@fortawesome/react-fontawesome';\nimport {faCaretDown} from '@fortawesome/free-solid-svg-icons';\nimport {ResultsCount} from './ResultsCount';\n\n/**\n * Hook used to manage mass selection as the snackbar and all kind of selection (manual, all in page, all in filters)\n *\n * @param isEnabled - whether the selection is present\n * @param view - represent the current view\n * @param dispatch - method to change the current view\n * @param totalCountFiltered - number of results with the current filters\n * @param totalCountLibrary - number of total items in the library (without filters)\n * @param allVisibleKeys - list of all ids currently selected\n * @param massActions - array of all actions available on mass selection\n * @param snackbarId - id of the snackbar displayed\n */\nexport const useMassActions = ({\n isEnabled,\n store: {dispatch, view},\n filtersStore: {filters, filtersOperator},\n totalCountFiltered,\n totalCountLibrary,\n allVisibleKeys,\n massActions,\n snackbarId,\n}: {\n isEnabled: boolean;\n store: {\n view: IViewSettingsState;\n dispatch: Dispatch<IViewSettingsAction>;\n };\n filtersStore: IUIFiltersState;\n totalCountFiltered: number;\n totalCountLibrary: number;\n allVisibleKeys: string[];\n massActions: IMassActions[];\n snackbarId: string;\n}) => {\n const {t} = useSharedTranslation();\n const [isInactive, setIsInactive] = useState(false);\n\n useEffect(() => {\n setIsInactive(filters.filter(f => f.field === 'active')?.[0]?.value === 'false');\n }, [filters]);\n\n useEffect(() => {\n if (view.massSelection === MASS_SELECTION_ALL || view.massSelection.length !== 0) {\n openKitSnackBar({\n duration: 0,\n closable: true,\n snackbarId,\n toasterId: snackbarId,\n onClose: () => _setSelectedKeys([]),\n message: t('explorer.massAction.selectedItems', {\n count: view.massSelection === MASS_SELECTION_ALL ? totalCountFiltered : view.massSelection.length,\n }),\n actions: massActions.map(({label, icon, deselectAll, callback}, index) => ({\n key: index,\n label,\n icon,\n onClick: async () => {\n await callback(\n view.massSelection === MASS_SELECTION_ALL\n ? prepareFiltersForRequest(filters, filtersOperator)\n : interleaveElement(\n {operator: RecordFilterOperator.OR},\n view.massSelection.map(key => [\n {\n field: 'id',\n condition: RecordFilterCondition.EQUAL,\n value: String(key),\n },\n ]),\n ),\n view.massSelection,\n );\n if (deselectAll) {\n dispatch({\n type: ViewSettingsActionTypes.SET_SELECTED_KEYS,\n payload: [],\n });\n }\n },\n })),\n });\n } else {\n closeKitSnackBar(snackbarId);\n }\n }, [view.massSelection, filters, totalCountFiltered]);\n\n useEffect(() => () => closeKitSnackBar(snackbarId), []);\n\n const isOnePage = view.pageSize > totalCountFiltered;\n const hasSelectedAllAvailableItems =\n view.massSelection === MASS_SELECTION_ALL || view.massSelection.length === totalCountFiltered;\n const hasSelectedSomeItems =\n view.massSelection !== MASS_SELECTION_ALL &&\n view.massSelection.length > 0 &&\n view.massSelection.length < totalCountFiltered;\n\n const _selectAllButton = isOnePage ? (\n <KitCheckbox\n aria-checked={hasSelectedSomeItems ? 'mixed' : hasSelectedAllAvailableItems ? 'true' : 'false'}\n indeterminate={hasSelectedSomeItems}\n checked={hasSelectedAllAvailableItems}\n onChange={_ => {\n if (hasSelectedAllAvailableItems) {\n _setSelectedKeys([]);\n } else {\n _setSelectedKeys(allVisibleKeys);\n }\n }}\n >\n <ResultsCount\n t={t}\n isInactive={isInactive}\n totalCountFiltered={totalCountFiltered}\n totalCountLibrary={totalCountLibrary}\n />\n </KitCheckbox>\n ) : (\n <KitDropDown\n trigger={['click']}\n menu={{\n items: [\n hasSelectedAllAvailableItems\n ? null\n : {\n key: 'toggle_page_selection',\n label: t('explorer.massAction.toggle_selection.select_page', {count: view.pageSize}),\n onClick: () => {\n _setSelectedKeys([...new Set([...view.massSelection, ...allVisibleKeys])]);\n },\n },\n {\n key: 'toggle_all_selection',\n label: hasSelectedAllAvailableItems\n ? t('explorer.massAction.toggle_selection.deselect_all', {count: totalCountFiltered})\n : t('explorer.massAction.toggle_selection.select_all', {count: totalCountFiltered}),\n onClick: async () => {\n if (hasSelectedAllAvailableItems) {\n _setSelectedKeys([]);\n } else {\n _setSelectedKeys(MASS_SELECTION_ALL);\n }\n },\n },\n ],\n }}\n >\n <KitCheckbox\n aria-checked={hasSelectedSomeItems ? 'mixed' : hasSelectedAllAvailableItems ? 'true' : 'false'}\n indeterminate={hasSelectedSomeItems}\n checked={hasSelectedAllAvailableItems}\n >\n <KitSpace size=\"xxs\">\n <ResultsCount\n t={t}\n isInactive={isInactive}\n totalCountFiltered={totalCountFiltered}\n totalCountLibrary={totalCountLibrary}\n />\n <FontAwesomeIcon icon={faCaretDown} size=\"2xs\" />\n </KitSpace>\n </KitCheckbox>\n </KitDropDown>\n );\n\n const _setSelectedKeys = useCallback(\n (keys: MassSelection) =>\n dispatch({\n type: ViewSettingsActionTypes.SET_SELECTED_KEYS,\n payload: keys,\n }),\n [dispatch],\n );\n\n return {\n selectAllButton: isEnabled ? _selectAllButton : null,\n setSelectedKeys: isEnabled ? _setSelectedKeys : null,\n };\n};\n"]}
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 hasSelectedAllVisibleItems =\n view.massSelection.length >= allVisibleKeys.length &&\n allVisibleKeys.find(visibleKey => view.massSelection.includes(visibleKey)) !== undefined;\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 : hasSelectedAllVisibleItems\n ? {\n key: 'toggle_page_selection',\n label: t('explorer.massAction.toggle_selection.deselect_page', {count: view.pageSize}),\n onClick: () =>\n _setSelectedKeys(\n [...view.massSelection].filter(key => allVisibleKeys.includes[key]),\n ),\n }\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 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"]}
@@ -1,2 +1,3 @@
1
- export declare const hasOnlyNoValueConditions: (attributeFormat: string) => boolean;
1
+ import { AttributeFormat } from '../../_gqlTypes';
2
+ export declare const hasOnlyNoValueConditions: (attributeFormat: AttributeFormat) => boolean;
2
3
  export declare const nullValueConditions: import("../../_gqlTypes").RecordFilterCondition[];
@@ -1 +1 @@
1
- {"version":3,"file":"conditionsHelper.js","sourceRoot":"","sources":["../../../src/components/Explorer/conditionsHelper.ts"],"names":[],"mappings":"AAAA,oFAAoF;AACpF,sCAAsC;AACtC,sEAAsE;AACtE,OAAO,EAAC,eAAe,EAAC,MAAM,eAAe,CAAC;AAC9C,OAAO,EAAC,wBAAwB,EAAC,MAAM,WAAW,CAAC;AAEnD,MAAM,CAAC,MAAM,wBAAwB,GAAG,CAAC,eAAuB,EAAW,EAAE,CACzE,CAAC,eAAe,CAAC,KAAK,EAAE,eAAe,CAAC,UAAU,EAAE,eAAe,CAAC,SAAS,EAAE,eAAe,CAAC,QAAQ,CAAC,CAAC,QAAQ,CAC7G,eAAe,CAClB,CAAC;AAEN,MAAM,CAAC,MAAM,mBAAmB,GAAG;IAC/B,wBAAwB,CAAC,QAAQ;IACjC,wBAAwB,CAAC,YAAY;IACrC,wBAAwB,CAAC,KAAK;IAC9B,wBAAwB,CAAC,QAAQ;IACjC,wBAAwB,CAAC,SAAS;IAClC,wBAAwB,CAAC,UAAU;IACnC,wBAAwB,CAAC,UAAU;CACtC,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 {AttributeFormat} from '_ui/_gqlTypes';\nimport {AttributeConditionFilter} from '_ui/types';\n\nexport const hasOnlyNoValueConditions = (attributeFormat: string): boolean =>\n [AttributeFormat.color, AttributeFormat.date_range, AttributeFormat.encrypted, AttributeFormat.extended].includes(\n attributeFormat,\n );\n\nexport const nullValueConditions = [\n AttributeConditionFilter.IS_EMPTY,\n AttributeConditionFilter.IS_NOT_EMPTY,\n AttributeConditionFilter.TODAY,\n AttributeConditionFilter.TOMORROW,\n AttributeConditionFilter.YESTERDAY,\n AttributeConditionFilter.LAST_MONTH,\n AttributeConditionFilter.NEXT_MONTH,\n];\n"]}
1
+ {"version":3,"file":"conditionsHelper.js","sourceRoot":"","sources":["../../../src/components/Explorer/conditionsHelper.ts"],"names":[],"mappings":"AAAA,oFAAoF;AACpF,sCAAsC;AACtC,sEAAsE;AACtE,OAAO,EAAC,eAAe,EAAC,MAAM,eAAe,CAAC;AAC9C,OAAO,EAAC,wBAAwB,EAAC,MAAM,WAAW,CAAC;AAEnD,MAAM,CAAC,MAAM,wBAAwB,GAAG,CAAC,eAAgC,EAAW,EAAE,CAClF,CAAC,eAAe,CAAC,KAAK,EAAE,eAAe,CAAC,UAAU,EAAE,eAAe,CAAC,SAAS,EAAE,eAAe,CAAC,QAAQ,CAAC,CAAC,QAAQ,CAC7G,eAAe,CAClB,CAAC;AAEN,MAAM,CAAC,MAAM,mBAAmB,GAAG;IAC/B,wBAAwB,CAAC,QAAQ;IACjC,wBAAwB,CAAC,YAAY;IACrC,wBAAwB,CAAC,KAAK;IAC9B,wBAAwB,CAAC,QAAQ;IACjC,wBAAwB,CAAC,SAAS;IAClC,wBAAwB,CAAC,UAAU;IACnC,wBAAwB,CAAC,UAAU;CACtC,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 {AttributeFormat} from '_ui/_gqlTypes';\nimport {AttributeConditionFilter} from '_ui/types';\n\nexport const hasOnlyNoValueConditions = (attributeFormat: AttributeFormat): boolean =>\n [AttributeFormat.color, AttributeFormat.date_range, AttributeFormat.encrypted, AttributeFormat.extended].includes(\n attributeFormat,\n );\n\nexport const nullValueConditions = [\n AttributeConditionFilter.IS_EMPTY,\n AttributeConditionFilter.IS_NOT_EMPTY,\n AttributeConditionFilter.TODAY,\n AttributeConditionFilter.TOMORROW,\n AttributeConditionFilter.YESTERDAY,\n AttributeConditionFilter.LAST_MONTH,\n AttributeConditionFilter.NEXT_MONTH,\n];\n"]}
@@ -28,11 +28,13 @@ export const prepareViewForRequest = (view, filters, label) => ({
28
28
  };
29
29
  }
30
30
  if (isUIFilterWithSmartFilter(filter)) {
31
+ const isThoughFilter = isUIFilterThrough(filter);
31
32
  return {
32
- field: filter.field, // We use the field here because we want to keep the full path to the attribute (ex: link_attribute.id)
33
- // TODO : save filter values as string[] when filter and handle fields with libraries
34
- value: filter.value?.[0],
35
- condition: filter.condition,
33
+ field: isThoughFilter
34
+ ? `${filter.field}.${filter.subField}`
35
+ : filter.field, // We use the field here because we want to keep the full path to the attribute (ex: link_attribute.id)
36
+ value: null, // Force no value to avoid broken load view, may be fix after LEAVC-569
37
+ condition: isThoughFilter ? filter.subCondition : filter.condition,
36
38
  withEmptyValues: filter.withEmptyValues,
37
39
  };
38
40
  }
@@ -1 +1 @@
1
- {"version":3,"file":"prepareViewForRequest.js","sourceRoot":"","sources":["../../../../../src/components/Explorer/manage-view-settings/save-view/prepareViewForRequest.ts"],"names":[],"mappings":"AAIA,OAAO,EAAC,+BAA+B,EAAC,MAAM,kBAAkB,CAAC;AAEjE,OAAO,EACH,cAAc,EACd,iBAAiB,EACjB,mBAAmB,EAEnB,yBAAyB,GAC5B,MAAM,+BAA+B,CAAC;AAEvC,MAAM,CAAC,MAAM,qBAAqB,GAAG,CACjC,IAAwB,EACxB,OAAmB,EACnB,KAA6B,EACpB,EAAE,CAAC,CAAC;IACb,OAAO,EAAE,IAAI,CAAC,SAAS;IACvB,MAAM,EAAE,KAAK;IACb,OAAO,EAAE;QACL,IAAI,EAAE,+BAA+B,CAAC,IAAI,CAAC,QAAQ,CAAC;KACvD;IACD,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAqB,EAAE;QAC/C,IAAI,cAAc,CAAC,MAAM,CAAC,EAAE,CAAC;YACzB,OAAO;gBACH,oIAAoI;gBACpI,KAAK,EAAE,MAAM,CAAC,SAAS,CAAC,EAAE;gBAC1B,0FAA0F;gBAC1F,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;gBACxB,SAAS,EAAE,MAAM,CAAC,SAAS;gBAC3B,eAAe,EAAE,MAAM,CAAC,eAAe;aAC1C,CAAC;QACN,CAAC;QAED,IAAI,mBAAmB,CAAC,MAAM,CAAC,EAAE,CAAC;YAC9B,OAAO;gBACH,oIAAoI;gBACpI,KAAK,EAAE,MAAM,CAAC,SAAS,CAAC,EAAE;gBAC1B,qFAAqF;gBACrF,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;gBACxB,SAAS,EAAE,MAAM,CAAC,SAAS;gBAC3B,eAAe,EAAE,MAAM,CAAC,eAAe;aAC1C,CAAC;QACN,CAAC;QAED,IAAI,yBAAyB,CAAC,MAAM,CAAC,EAAE,CAAC;YACpC,OAAO;gBACH,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,uGAAuG;gBAC5H,qFAAqF;gBACrF,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;gBACxB,SAAS,EAAE,MAAM,CAAC,SAAS;gBAC3B,eAAe,EAAE,MAAM,CAAC,eAAe;aAC1C,CAAC;QACN,CAAC;QAED,IAAI,iBAAiB,CAAC,MAAM,CAAC,EAAE,CAAC;YAC5B,OAAO;gBACH,KAAK,EAAE,GAAG,MAAM,CAAC,KAAK,IAAI,MAAM,CAAC,QAAQ,EAAE;gBAC3C,KAAK,EAAE,MAAM,CAAC,KAAK;gBACnB,SAAS,EAAE,MAAM,CAAC,YAAY;aACjC,CAAC;QACN,CAAC;QAED,OAAO;YACH,KAAK,EAAE,MAAM,CAAC,KAAK;YACnB,KAAK,EAAE,MAAM,CAAC,KAAK;YACnB,SAAS,EAAE,MAAM,CAAC,SAAS;YAC3B,eAAe,EAAE,MAAM,CAAC,eAAe;SAC1C,CAAC;IACN,CAAC,CAAC;IACF,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAC,KAAK,EAAE,KAAK,EAAC,EAAE,EAAE,CAAC,CAAC,EAAC,KAAK,EAAE,KAAK,EAAC,CAAC,CAAC;IACzD,UAAU,EAAE,IAAI,CAAC,aAAa;IAC9B,KAAK;CACR,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, type ViewInput} from '_ui/_gqlTypes';\nimport {mapViewTypeFromExplorerToLegacy} from '../../_constants';\nimport {type IViewSettingsState} from '../store-view-settings/viewSettingsReducer';\nimport {\n isUIFilterTree,\n isUIFilterThrough,\n isUIFilterValueList,\n type UIFilter,\n isUIFilterWithSmartFilter,\n} from '_ui/components/Filters/_types';\n\nexport const prepareViewForRequest = (\n view: IViewSettingsState,\n filters: UIFilter[],\n label: Record<string, string>,\n): ViewInput => ({\n library: view.libraryId,\n shared: false,\n display: {\n type: mapViewTypeFromExplorerToLegacy[view.viewType],\n },\n filters: filters.map((filter): RecordFilterInput => {\n if (isUIFilterTree(filter)) {\n return {\n // TODO save filter.field, but need to handle Through an other way in useTransformFilters.toValidFilters to keep that field as saved\n field: filter.attribute.id,\n // TODO : save filter values as string[] when tree filter and handle fields with libraries\n value: filter.value?.[0],\n condition: filter.condition,\n withEmptyValues: filter.withEmptyValues,\n };\n }\n\n if (isUIFilterValueList(filter)) {\n return {\n // TODO save filter.field, but need to handle Through an other way in useTransformFilters.toValidFilters to keep that field as saved\n field: filter.attribute.id,\n // TODO : save filter values as string[] when filter and handle fields with libraries\n value: filter.value?.[0],\n condition: filter.condition,\n withEmptyValues: filter.withEmptyValues,\n };\n }\n\n if (isUIFilterWithSmartFilter(filter)) {\n return {\n field: filter.field, // We use the field here because we want to keep the full path to the attribute (ex: link_attribute.id)\n // TODO : save filter values as string[] when filter and handle fields with libraries\n value: filter.value?.[0],\n condition: filter.condition,\n withEmptyValues: filter.withEmptyValues,\n };\n }\n\n if (isUIFilterThrough(filter)) {\n return {\n field: `${filter.field}.${filter.subField}`,\n value: filter.value,\n condition: filter.subCondition,\n };\n }\n\n return {\n field: filter.field,\n value: filter.value,\n condition: filter.condition,\n withEmptyValues: filter.withEmptyValues,\n };\n }),\n sort: view.sort.map(({field, order}) => ({field, order})),\n attributes: view.attributesIds,\n label,\n});\n"]}
1
+ {"version":3,"file":"prepareViewForRequest.js","sourceRoot":"","sources":["../../../../../src/components/Explorer/manage-view-settings/save-view/prepareViewForRequest.ts"],"names":[],"mappings":"AAIA,OAAO,EAAC,+BAA+B,EAAC,MAAM,kBAAkB,CAAC;AAEjE,OAAO,EACH,cAAc,EACd,iBAAiB,EACjB,mBAAmB,EAEnB,yBAAyB,GAE5B,MAAM,+BAA+B,CAAC;AAEvC,MAAM,CAAC,MAAM,qBAAqB,GAAG,CACjC,IAAwB,EACxB,OAAmB,EACnB,KAA6B,EACpB,EAAE,CAAC,CAAC;IACb,OAAO,EAAE,IAAI,CAAC,SAAS;IACvB,MAAM,EAAE,KAAK;IACb,OAAO,EAAE;QACL,IAAI,EAAE,+BAA+B,CAAC,IAAI,CAAC,QAAQ,CAAC;KACvD;IACD,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAqB,EAAE;QAC/C,IAAI,cAAc,CAAC,MAAM,CAAC,EAAE,CAAC;YACzB,OAAO;gBACH,oIAAoI;gBACpI,KAAK,EAAE,MAAM,CAAC,SAAS,CAAC,EAAE;gBAC1B,0FAA0F;gBAC1F,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;gBACxB,SAAS,EAAE,MAAM,CAAC,SAAS;gBAC3B,eAAe,EAAE,MAAM,CAAC,eAAe;aAC1C,CAAC;QACN,CAAC;QAED,IAAI,mBAAmB,CAAC,MAAM,CAAC,EAAE,CAAC;YAC9B,OAAO;gBACH,oIAAoI;gBACpI,KAAK,EAAE,MAAM,CAAC,SAAS,CAAC,EAAE;gBAC1B,qFAAqF;gBACrF,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;gBACxB,SAAS,EAAE,MAAM,CAAC,SAAS;gBAC3B,eAAe,EAAE,MAAM,CAAC,eAAe;aAC1C,CAAC;QACN,CAAC;QAED,IAAI,yBAAyB,CAAC,MAAM,CAAC,EAAE,CAAC;YACpC,MAAM,cAAc,GAAG,iBAAiB,CAAC,MAAM,CAAC,CAAC;YACjD,OAAO;gBACH,KAAK,EAAE,cAAc;oBACjB,CAAC,CAAC,GAAI,MAA2B,CAAC,KAAK,IAAK,MAA2B,CAAC,QAAQ,EAAE;oBAClF,CAAC,CAAC,MAAM,CAAC,KAAK,EAAE,uGAAuG;gBAC3H,KAAK,EAAE,IAAI,EAAE,uEAAuE;gBACpF,SAAS,EAAE,cAAc,CAAC,CAAC,CAAE,MAA2B,CAAC,YAAY,CAAC,CAAC,CAAC,MAAM,CAAC,SAAS;gBACxF,eAAe,EAAE,MAAM,CAAC,eAAe;aAC1C,CAAC;QACN,CAAC;QAED,IAAI,iBAAiB,CAAC,MAAM,CAAC,EAAE,CAAC;YAC5B,OAAO;gBACH,KAAK,EAAE,GAAG,MAAM,CAAC,KAAK,IAAI,MAAM,CAAC,QAAQ,EAAE;gBAC3C,KAAK,EAAE,MAAM,CAAC,KAAK;gBACnB,SAAS,EAAE,MAAM,CAAC,YAAY;aACjC,CAAC;QACN,CAAC;QAED,OAAO;YACH,KAAK,EAAE,MAAM,CAAC,KAAK;YACnB,KAAK,EAAE,MAAM,CAAC,KAAK;YACnB,SAAS,EAAE,MAAM,CAAC,SAAS;YAC3B,eAAe,EAAE,MAAM,CAAC,eAAe;SAC1C,CAAC;IACN,CAAC,CAAC;IACF,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAC,KAAK,EAAE,KAAK,EAAC,EAAE,EAAE,CAAC,CAAC,EAAC,KAAK,EAAE,KAAK,EAAC,CAAC,CAAC;IACzD,UAAU,EAAE,IAAI,CAAC,aAAa;IAC9B,KAAK;CACR,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, type ViewInput} from '_ui/_gqlTypes';\nimport {mapViewTypeFromExplorerToLegacy} from '../../_constants';\nimport {type IViewSettingsState} from '../store-view-settings/viewSettingsReducer';\nimport {\n isUIFilterTree,\n isUIFilterThrough,\n isUIFilterValueList,\n type UIFilter,\n isUIFilterWithSmartFilter,\n type IUIFilterThrough,\n} from '_ui/components/Filters/_types';\n\nexport const prepareViewForRequest = (\n view: IViewSettingsState,\n filters: UIFilter[],\n label: Record<string, string>,\n): ViewInput => ({\n library: view.libraryId,\n shared: false,\n display: {\n type: mapViewTypeFromExplorerToLegacy[view.viewType],\n },\n filters: filters.map((filter): RecordFilterInput => {\n if (isUIFilterTree(filter)) {\n return {\n // TODO save filter.field, but need to handle Through an other way in useTransformFilters.toValidFilters to keep that field as saved\n field: filter.attribute.id,\n // TODO : save filter values as string[] when tree filter and handle fields with libraries\n value: filter.value?.[0],\n condition: filter.condition,\n withEmptyValues: filter.withEmptyValues,\n };\n }\n\n if (isUIFilterValueList(filter)) {\n return {\n // TODO save filter.field, but need to handle Through an other way in useTransformFilters.toValidFilters to keep that field as saved\n field: filter.attribute.id,\n // TODO : save filter values as string[] when filter and handle fields with libraries\n value: filter.value?.[0],\n condition: filter.condition,\n withEmptyValues: filter.withEmptyValues,\n };\n }\n\n if (isUIFilterWithSmartFilter(filter)) {\n const isThoughFilter = isUIFilterThrough(filter);\n return {\n field: isThoughFilter\n ? `${(filter as IUIFilterThrough).field}.${(filter as IUIFilterThrough).subField}`\n : filter.field, // We use the field here because we want to keep the full path to the attribute (ex: link_attribute.id)\n value: null, // Force no value to avoid broken load view, may be fix after LEAVC-569\n condition: isThoughFilter ? (filter as IUIFilterThrough).subCondition : filter.condition,\n withEmptyValues: filter.withEmptyValues,\n };\n }\n\n if (isUIFilterThrough(filter)) {\n return {\n field: `${filter.field}.${filter.subField}`,\n value: filter.value,\n condition: filter.subCondition,\n };\n }\n\n return {\n field: filter.field,\n value: filter.value,\n condition: filter.condition,\n withEmptyValues: filter.withEmptyValues,\n };\n }),\n sort: view.sort.map(({field, order}) => ({field, order})),\n attributes: view.attributesIds,\n label,\n});\n"]}
@@ -26,6 +26,9 @@ export interface IUIFilterLinkAttribute extends IUIFilterBaseAttribute {
26
26
  };
27
27
  smartFilter?: {
28
28
  enable?: boolean;
29
+ through?: {
30
+ id: string;
31
+ } | null;
29
32
  };
30
33
  }
31
34
  export interface IUIFilterTreeAttribute extends IUIFilterBaseAttribute {
@@ -1 +1 @@
1
- {"version":3,"file":"_types.js","sourceRoot":"","sources":["../../../src/components/Filters/_types.ts"],"names":[],"mappings":"AAIA,OAAO,EAEH,aAAa,GAKhB,MAAM,eAAe,CAAC;AACvB,OAAO,EAAC,sBAAsB,EAAC,MAAM,kBAAkB,CAAC;AAsIxD,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,MAAgB,EAA+B,EAAE,CAChF,CAAC,aAAa,CAAC,MAAM,EAAE,aAAa,CAAC,QAAQ,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;AAEnF,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,MAAgB,EAA2B,EAAE,CACxE,CAAC,aAAa,CAAC,WAAW,EAAE,aAAa,CAAC,aAAa,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC;IACxF,MAAM,CAAC,SAAS,KAAK,sBAAsB,CAAC,OAAO,CAAC;AAExD,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,MAAgB,EAA8B,EAAE,CAC9E,CAAC,aAAa,CAAC,WAAW,EAAE,aAAa,CAAC,aAAa,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC;IACxF,MAAM,CAAC,SAAS,KAAK,sBAAsB,CAAC,OAAO,CAAC;AAExD,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,MAAgB,EAAgC,EAAE,CAClF,CAAC,kBAAkB,CAAC,MAAM,CAAC,IAAI,cAAc,CAAC,MAAM,CAAC,IAAI,yBAAyB,CAAC,MAAM,CAAC,CAAC,IAAI,WAAW,CAAC,MAAM,CAAC,CAAC;AAEvH,MAAM,CAAC,MAAM,+BAA+B,GAAG,CAAC,MAAgB,EAAwC,EAAE,CACtG,CAAC,aAAa,CAAC,MAAM,EAAE,aAAa,CAAC,QAAQ,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,WAAW,CAAC,MAAM,CAAC,CAAC;AAE1G,MAAM,CAAC,MAAM,2BAA2B,GAAG,CAAC,MAAgB,EAAoC,EAAE,CAC9F,CAAC,aAAa,CAAC,WAAW,EAAE,aAAa,CAAC,aAAa,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,WAAW,CAAC,MAAM,CAAC,CAAC;AAEpH,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,MAAgB,EAA2B,EAAE,CACxE,MAAM,CAAC,SAAS,CAAC,IAAI,KAAK,aAAa,CAAC,IAAI,CAAC;AAEjD,MAAM,CAAC,MAAM,2BAA2B,GAAG,CAAC,MAAgB,EAAoC,EAAE,CAC9F,cAAc,CAAC,MAAM,CAAC,IAAI,WAAW,CAAC,MAAM,CAAC,CAAC;AAElD,MAAM,CAAC,MAAM,yBAAyB,GAAG,CAAC,MAAgB,EAAiC,EAAE,CACzF,CAAC,cAAc,CAAC,MAAM,CAAC,IAAI,iBAAiB,CAAC,MAAM,CAAC,CAAC,IAAI,MAAM,CAAC,SAAS,CAAC,WAAW,EAAE,MAAM,CAAC;AAElG,MAAM,WAAW,GAAG,CAAC,MAAgB,EAAmE,EAAE,CACtG,CAAC,CAAC,MAAM,CAAC,SAAS,EAAE,UAAU,IAAI,MAAM,CAAC,SAAS,EAAE,UAAU,CAAC,MAAM,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 Override} from '@leav/utils';\nimport {\n type AttributeFormat,\n AttributeType,\n type LinkAttributeDetailsFragment,\n type RecordFilterCondition,\n type StandardAttributeDetailsFragment,\n type ViewDetailsFilterFragment,\n} from '_ui/_gqlTypes';\nimport {ThroughConditionFilter} from '_ui/types/search';\n\nexport type FiltersOperator = 'AND' | 'OR';\n\nexport interface IUIFilterBaseAttribute {\n type: AttributeType;\n /**\n * Used to display the label of the filter.\n *\n * > Not displayed when filter is hidden\n */\n label: string;\n /**\n * Used to verify unicity: one filter per attribute\n */\n id: string;\n format?: AttributeFormat | null | undefined;\n valuesList?:\n | NonNullable<StandardAttributeDetailsFragment['valuesList']>\n | NonNullable<LinkAttributeDetailsFragment['valuesList']>;\n}\n\nexport interface IUIFilterStandardAttribute extends IUIFilterBaseAttribute {\n format: AttributeFormat;\n}\n\nexport interface IUIFilterLinkAttribute extends IUIFilterBaseAttribute {\n linkedLibrary?: {\n id: string;\n };\n smartFilter?: {\n enable?: boolean;\n };\n}\n\nexport interface IUIFilterTreeAttribute extends IUIFilterBaseAttribute {\n linkedTree?: {\n id: string;\n };\n}\n\ninterface IUIFilterBase {\n id: string;\n attribute: IUIFilterBaseAttribute;\n condition: RecordFilterCondition | ThroughConditionFilter | null;\n /**\n * Used to build filter field.\n *\n * - ex: `campaigns_id_pac`\n * - ex with **subField**: `campaigns_id_pac.id`\n */\n field: any;\n value: string | null;\n formattedValue?: string | null;\n hidden?: boolean | undefined;\n withEmptyValues?: boolean;\n}\n\nexport interface IUIFilterStandard extends Omit<IUIFilterBase, 'field'> {\n attribute: IUIFilterStandardAttribute;\n condition: RecordFilterCondition | null;\n field: string;\n}\n\nexport interface IUIFilterLink extends Omit<IUIFilterBase, 'field'> {\n attribute: IUIFilterLinkAttribute;\n condition: RecordFilterCondition | null;\n field: string;\n}\n\nexport interface IUIFilterThrough extends Omit<IUIFilterBase, 'field'> {\n attribute: IUIFilterLinkAttribute;\n condition: ThroughConditionFilter.THROUGH | null;\n subCondition: RecordFilterCondition | null;\n subField: string | null;\n field: string;\n}\n\nexport interface IUIFilterTree extends Omit<IUIFilterBase, 'value' | 'formattedValue' | 'field'> {\n attribute: IUIFilterTreeAttribute;\n condition: RecordFilterCondition | null;\n value: string[] | null;\n formattedValue?: string[] | null;\n nodes?: null | Array<{nodeId: string; libraryId: string}>;\n field: string[];\n}\n\nexport interface IUIFilterSmartFiler extends Omit<IUIFilterBase, 'value' | 'formattedValue'> {\n attribute: IUIFilterLinkAttribute;\n value: string[] | null;\n formattedValue?: string[] | null;\n condition: RecordFilterCondition | null;\n field: string;\n}\n\nexport interface IUIFilterValueList extends Omit<IUIFilterBase, 'value' | 'formattedValue'> {\n attribute: (IUIFilterStandardAttribute | IUIFilterLinkAttribute) & {\n valuesList:\n | NonNullable<StandardAttributeDetailsFragment['valuesList']>\n | NonNullable<LinkAttributeDetailsFragment['valuesList']>;\n };\n value: string[] | null;\n condition: RecordFilterCondition | null;\n field: string | string[];\n}\n\nexport interface IUIFilterStandardValueList extends Omit<IUIFilterStandard, 'attribute' | 'value'>, IUIFilterValueList {\n attribute: IUIFilterStandardAttribute & {\n valuesList: NonNullable<StandardAttributeDetailsFragment['valuesList']>;\n };\n field: string;\n}\n\nexport interface IUIFilterLinkValueList extends Omit<IUIFilterLink, 'attribute' | 'value'>, IUIFilterValueList {\n attribute: IUIFilterLinkAttribute & {\n valuesList: NonNullable<LinkAttributeDetailsFragment['valuesList']>;\n };\n field: string;\n}\nexport interface IUIFilterTreeValueList extends Omit<IUIFilterTree, 'attribute' | 'value'>, IUIFilterValueList {\n attribute: IUIFilterLinkAttribute & {\n valuesList: NonNullable<LinkAttributeDetailsFragment['valuesList']>;\n };\n field: string[];\n}\n\nexport type UIFilter =\n | IUIFilterStandard\n | IUIFilterLink\n | IUIFilterThrough\n | IUIFilterValueList\n | IUIFilterTree\n | IUIFilterSmartFiler;\n\nexport const isUIFilterStandard = (filter: UIFilter): filter is IUIFilterStandard =>\n [AttributeType.simple, AttributeType.advanced].includes(filter.attribute.type);\n\nexport const isUIFilterLink = (filter: UIFilter): filter is IUIFilterLink =>\n [AttributeType.simple_link, AttributeType.advanced_link].includes(filter.attribute.type) &&\n filter.condition !== ThroughConditionFilter.THROUGH;\n\nexport const isUIFilterThrough = (filter: UIFilter): filter is IUIFilterThrough =>\n [AttributeType.simple_link, AttributeType.advanced_link].includes(filter.attribute.type) &&\n filter.condition === ThroughConditionFilter.THROUGH;\n\nexport const isUIFilterValueList = (filter: UIFilter): filter is IUIFilterValueList =>\n (isUIFilterStandard(filter) || isUIFilterLink(filter) || isUIFilterWithSmartFilter(filter)) && isValueList(filter);\n\nexport const isUIFilterStandardWithValueList = (filter: UIFilter): filter is IUIFilterStandardValueList =>\n [AttributeType.simple, AttributeType.advanced].includes(filter.attribute.type) && isValueList(filter);\n\nexport const isUIFilterLinkWithValueList = (filter: UIFilter): filter is IUIFilterLinkValueList =>\n [AttributeType.simple_link, AttributeType.advanced_link].includes(filter.attribute.type) && isValueList(filter);\n\nexport const isUIFilterTree = (filter: UIFilter): filter is IUIFilterTree =>\n filter.attribute.type === AttributeType.tree;\n\nexport const isUIFilterTreeWithValueList = (filter: UIFilter): filter is IUIFilterTreeValueList =>\n isUIFilterTree(filter) && isValueList(filter);\n\nexport const isUIFilterWithSmartFilter = (filter: UIFilter): filter is IUIFilterSmartFiler =>\n (isUIFilterLink(filter) || isUIFilterThrough(filter)) && filter.attribute.smartFilter?.enable;\n\nconst isValueList = (filter: UIFilter): filter is UIFilter & {attribute: {valuesList: {enabled: true}}} =>\n !!filter.attribute?.valuesList && filter.attribute?.valuesList.enable;\n\nexport interface IUIFilterDropDownProps {\n filter: UIFilter;\n canReset: boolean;\n canRemove: boolean;\n}\n\nexport type ValidFieldFilter = Override<\n ViewDetailsFilterFragment,\n {\n field: NonNullable<ViewDetailsFilterFragment['field']>;\n condition: NonNullable<ViewDetailsFilterFragment['condition']>;\n hidden: boolean;\n withEmptyValues?: boolean;\n }\n>;\n\nexport type ValidFieldFilterStandardValuesList = Override<\n ValidFieldFilter,\n {\n valuesList: StandardAttributeDetailsFragment['valuesList'];\n }\n>;\n\nexport type ValidFieldFilterLinkValuesList = Override<\n ValidFieldFilter,\n {\n valuesList: LinkAttributeDetailsFragment['valuesList'];\n }\n>;\n\nexport type ValidFieldFilterThrough = Override<\n ValidFieldFilter,\n {\n condition: ThroughConditionFilter.THROUGH;\n hidden: boolean;\n }\n> & {\n subField: NonNullable<ViewDetailsFilterFragment['field']>;\n subCondition?: ViewDetailsFilterFragment['condition'];\n};\n\nexport type ValidFilter =\n | ValidFieldFilter\n | ValidFieldFilterThrough\n | ValidFieldFilterStandardValuesList\n | ValidFieldFilterLinkValuesList;\n"]}
1
+ {"version":3,"file":"_types.js","sourceRoot":"","sources":["../../../src/components/Filters/_types.ts"],"names":[],"mappings":"AAIA,OAAO,EAEH,aAAa,GAKhB,MAAM,eAAe,CAAC;AACvB,OAAO,EAAC,sBAAsB,EAAC,MAAM,kBAAkB,CAAC;AAyIxD,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,MAAgB,EAA+B,EAAE,CAChF,CAAC,aAAa,CAAC,MAAM,EAAE,aAAa,CAAC,QAAQ,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;AAEnF,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,MAAgB,EAA2B,EAAE,CACxE,CAAC,aAAa,CAAC,WAAW,EAAE,aAAa,CAAC,aAAa,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC;IACxF,MAAM,CAAC,SAAS,KAAK,sBAAsB,CAAC,OAAO,CAAC;AAExD,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,MAAgB,EAA8B,EAAE,CAC9E,CAAC,aAAa,CAAC,WAAW,EAAE,aAAa,CAAC,aAAa,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC;IACxF,MAAM,CAAC,SAAS,KAAK,sBAAsB,CAAC,OAAO,CAAC;AAExD,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,MAAgB,EAAgC,EAAE,CAClF,CAAC,kBAAkB,CAAC,MAAM,CAAC,IAAI,cAAc,CAAC,MAAM,CAAC,IAAI,yBAAyB,CAAC,MAAM,CAAC,CAAC,IAAI,WAAW,CAAC,MAAM,CAAC,CAAC;AAEvH,MAAM,CAAC,MAAM,+BAA+B,GAAG,CAAC,MAAgB,EAAwC,EAAE,CACtG,CAAC,aAAa,CAAC,MAAM,EAAE,aAAa,CAAC,QAAQ,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,WAAW,CAAC,MAAM,CAAC,CAAC;AAE1G,MAAM,CAAC,MAAM,2BAA2B,GAAG,CAAC,MAAgB,EAAoC,EAAE,CAC9F,CAAC,aAAa,CAAC,WAAW,EAAE,aAAa,CAAC,aAAa,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,WAAW,CAAC,MAAM,CAAC,CAAC;AAEpH,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,MAAgB,EAA2B,EAAE,CACxE,MAAM,CAAC,SAAS,CAAC,IAAI,KAAK,aAAa,CAAC,IAAI,CAAC;AAEjD,MAAM,CAAC,MAAM,2BAA2B,GAAG,CAAC,MAAgB,EAAoC,EAAE,CAC9F,cAAc,CAAC,MAAM,CAAC,IAAI,WAAW,CAAC,MAAM,CAAC,CAAC;AAElD,MAAM,CAAC,MAAM,yBAAyB,GAAG,CAAC,MAAgB,EAAiC,EAAE,CACzF,CAAC,cAAc,CAAC,MAAM,CAAC,IAAI,iBAAiB,CAAC,MAAM,CAAC,CAAC,IAAI,MAAM,CAAC,SAAS,CAAC,WAAW,EAAE,MAAM,CAAC;AAElG,MAAM,WAAW,GAAG,CAAC,MAAgB,EAAmE,EAAE,CACtG,CAAC,CAAC,MAAM,CAAC,SAAS,EAAE,UAAU,IAAI,MAAM,CAAC,SAAS,EAAE,UAAU,CAAC,MAAM,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 Override} from '@leav/utils';\nimport {\n type AttributeFormat,\n AttributeType,\n type LinkAttributeDetailsFragment,\n type RecordFilterCondition,\n type StandardAttributeDetailsFragment,\n type ViewDetailsFilterFragment,\n} from '_ui/_gqlTypes';\nimport {ThroughConditionFilter} from '_ui/types/search';\n\nexport type FiltersOperator = 'AND' | 'OR';\n\nexport interface IUIFilterBaseAttribute {\n type: AttributeType;\n /**\n * Used to display the label of the filter.\n *\n * > Not displayed when filter is hidden\n */\n label: string;\n /**\n * Used to verify unicity: one filter per attribute\n */\n id: string;\n format?: AttributeFormat | null | undefined;\n valuesList?:\n | NonNullable<StandardAttributeDetailsFragment['valuesList']>\n | NonNullable<LinkAttributeDetailsFragment['valuesList']>;\n}\n\nexport interface IUIFilterStandardAttribute extends IUIFilterBaseAttribute {\n format: AttributeFormat;\n}\n\nexport interface IUIFilterLinkAttribute extends IUIFilterBaseAttribute {\n linkedLibrary?: {\n id: string;\n };\n smartFilter?: {\n enable?: boolean;\n through?: {\n id: string;\n } | null;\n };\n}\n\nexport interface IUIFilterTreeAttribute extends IUIFilterBaseAttribute {\n linkedTree?: {\n id: string;\n };\n}\n\ninterface IUIFilterBase {\n id: string;\n attribute: IUIFilterBaseAttribute;\n condition: RecordFilterCondition | ThroughConditionFilter | null;\n /**\n * Used to build filter field.\n *\n * - ex: `campaigns_id_pac`\n * - ex with **subField**: `campaigns_id_pac.id`\n */\n field: any;\n value: string | null;\n formattedValue?: string | null;\n hidden?: boolean | undefined;\n withEmptyValues?: boolean;\n}\n\nexport interface IUIFilterStandard extends Omit<IUIFilterBase, 'field'> {\n attribute: IUIFilterStandardAttribute;\n condition: RecordFilterCondition | null;\n field: string;\n}\n\nexport interface IUIFilterLink extends Omit<IUIFilterBase, 'field'> {\n attribute: IUIFilterLinkAttribute;\n condition: RecordFilterCondition | null;\n field: string;\n}\n\nexport interface IUIFilterThrough extends Omit<IUIFilterBase, 'field'> {\n attribute: IUIFilterLinkAttribute;\n condition: ThroughConditionFilter.THROUGH | null;\n subCondition: RecordFilterCondition | null;\n subField: string | null;\n field: string;\n}\n\nexport interface IUIFilterTree extends Omit<IUIFilterBase, 'value' | 'formattedValue' | 'field'> {\n attribute: IUIFilterTreeAttribute;\n condition: RecordFilterCondition | null;\n value: string[] | null;\n formattedValue?: string[] | null;\n nodes?: null | Array<{nodeId: string; libraryId: string}>;\n field: string[];\n}\n\nexport interface IUIFilterSmartFiler extends Omit<IUIFilterBase, 'value' | 'formattedValue'> {\n attribute: IUIFilterLinkAttribute;\n value: string[] | null;\n formattedValue?: string[] | null;\n condition: RecordFilterCondition | null;\n field: string;\n}\n\nexport interface IUIFilterValueList extends Omit<IUIFilterBase, 'value' | 'formattedValue'> {\n attribute: (IUIFilterStandardAttribute | IUIFilterLinkAttribute) & {\n valuesList:\n | NonNullable<StandardAttributeDetailsFragment['valuesList']>\n | NonNullable<LinkAttributeDetailsFragment['valuesList']>;\n };\n value: string[] | null;\n condition: RecordFilterCondition | null;\n field: string | string[];\n}\n\nexport interface IUIFilterStandardValueList extends Omit<IUIFilterStandard, 'attribute' | 'value'>, IUIFilterValueList {\n attribute: IUIFilterStandardAttribute & {\n valuesList: NonNullable<StandardAttributeDetailsFragment['valuesList']>;\n };\n field: string;\n}\n\nexport interface IUIFilterLinkValueList extends Omit<IUIFilterLink, 'attribute' | 'value'>, IUIFilterValueList {\n attribute: IUIFilterLinkAttribute & {\n valuesList: NonNullable<LinkAttributeDetailsFragment['valuesList']>;\n };\n field: string;\n}\nexport interface IUIFilterTreeValueList extends Omit<IUIFilterTree, 'attribute' | 'value'>, IUIFilterValueList {\n attribute: IUIFilterLinkAttribute & {\n valuesList: NonNullable<LinkAttributeDetailsFragment['valuesList']>;\n };\n field: string[];\n}\n\nexport type UIFilter =\n | IUIFilterStandard\n | IUIFilterLink\n | IUIFilterThrough\n | IUIFilterValueList\n | IUIFilterTree\n | IUIFilterSmartFiler;\n\nexport const isUIFilterStandard = (filter: UIFilter): filter is IUIFilterStandard =>\n [AttributeType.simple, AttributeType.advanced].includes(filter.attribute.type);\n\nexport const isUIFilterLink = (filter: UIFilter): filter is IUIFilterLink =>\n [AttributeType.simple_link, AttributeType.advanced_link].includes(filter.attribute.type) &&\n filter.condition !== ThroughConditionFilter.THROUGH;\n\nexport const isUIFilterThrough = (filter: UIFilter): filter is IUIFilterThrough =>\n [AttributeType.simple_link, AttributeType.advanced_link].includes(filter.attribute.type) &&\n filter.condition === ThroughConditionFilter.THROUGH;\n\nexport const isUIFilterValueList = (filter: UIFilter): filter is IUIFilterValueList =>\n (isUIFilterStandard(filter) || isUIFilterLink(filter) || isUIFilterWithSmartFilter(filter)) && isValueList(filter);\n\nexport const isUIFilterStandardWithValueList = (filter: UIFilter): filter is IUIFilterStandardValueList =>\n [AttributeType.simple, AttributeType.advanced].includes(filter.attribute.type) && isValueList(filter);\n\nexport const isUIFilterLinkWithValueList = (filter: UIFilter): filter is IUIFilterLinkValueList =>\n [AttributeType.simple_link, AttributeType.advanced_link].includes(filter.attribute.type) && isValueList(filter);\n\nexport const isUIFilterTree = (filter: UIFilter): filter is IUIFilterTree =>\n filter.attribute.type === AttributeType.tree;\n\nexport const isUIFilterTreeWithValueList = (filter: UIFilter): filter is IUIFilterTreeValueList =>\n isUIFilterTree(filter) && isValueList(filter);\n\nexport const isUIFilterWithSmartFilter = (filter: UIFilter): filter is IUIFilterSmartFiler =>\n (isUIFilterLink(filter) || isUIFilterThrough(filter)) && filter.attribute.smartFilter?.enable;\n\nconst isValueList = (filter: UIFilter): filter is UIFilter & {attribute: {valuesList: {enabled: true}}} =>\n !!filter.attribute?.valuesList && filter.attribute?.valuesList.enable;\n\nexport interface IUIFilterDropDownProps {\n filter: UIFilter;\n canReset: boolean;\n canRemove: boolean;\n}\n\nexport type ValidFieldFilter = Override<\n ViewDetailsFilterFragment,\n {\n field: NonNullable<ViewDetailsFilterFragment['field']>;\n condition: NonNullable<ViewDetailsFilterFragment['condition']>;\n hidden: boolean;\n withEmptyValues?: boolean;\n }\n>;\n\nexport type ValidFieldFilterStandardValuesList = Override<\n ValidFieldFilter,\n {\n valuesList: StandardAttributeDetailsFragment['valuesList'];\n }\n>;\n\nexport type ValidFieldFilterLinkValuesList = Override<\n ValidFieldFilter,\n {\n valuesList: LinkAttributeDetailsFragment['valuesList'];\n }\n>;\n\nexport type ValidFieldFilterThrough = Override<\n ValidFieldFilter,\n {\n condition: ThroughConditionFilter.THROUGH;\n hidden: boolean;\n }\n> & {\n subField: NonNullable<ViewDetailsFilterFragment['field']>;\n subCondition?: ViewDetailsFilterFragment['condition'];\n};\n\nexport type ValidFilter =\n | ValidFieldFilter\n | ValidFieldFilterThrough\n | ValidFieldFilterStandardValuesList\n | ValidFieldFilterLinkValuesList;\n"]}
@@ -1,2 +1,3 @@
1
- export declare const hasOnlyNoValueConditions: (attributeFormat: string) => boolean;
1
+ import { AttributeFormat } from '../../_gqlTypes';
2
+ export declare const hasOnlyNoValueConditions: (attributeFormat: AttributeFormat) => boolean;
2
3
  export declare const nullValueConditions: import("../../_gqlTypes").RecordFilterCondition[];
@@ -1 +1 @@
1
- {"version":3,"file":"conditionsHelper.js","sourceRoot":"","sources":["../../../src/components/Filters/conditionsHelper.ts"],"names":[],"mappings":"AAAA,oFAAoF;AACpF,sCAAsC;AACtC,sEAAsE;AACtE,OAAO,EAAC,eAAe,EAAC,MAAM,eAAe,CAAC;AAC9C,OAAO,EAAC,wBAAwB,EAAC,MAAM,WAAW,CAAC;AAEnD,MAAM,CAAC,MAAM,wBAAwB,GAAG,CAAC,eAAuB,EAAW,EAAE,CACzE,CAAC,eAAe,CAAC,KAAK,EAAE,eAAe,CAAC,UAAU,EAAE,eAAe,CAAC,SAAS,EAAE,eAAe,CAAC,QAAQ,CAAC,CAAC,QAAQ,CAC7G,eAAe,CAClB,CAAC;AAEN,MAAM,CAAC,MAAM,mBAAmB,GAAG;IAC/B,wBAAwB,CAAC,QAAQ;IACjC,wBAAwB,CAAC,YAAY;IACrC,wBAAwB,CAAC,KAAK;IAC9B,wBAAwB,CAAC,QAAQ;IACjC,wBAAwB,CAAC,SAAS;IAClC,wBAAwB,CAAC,UAAU;IACnC,wBAAwB,CAAC,UAAU;CACtC,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 {AttributeFormat} from '_ui/_gqlTypes';\nimport {AttributeConditionFilter} from '_ui/types';\n\nexport const hasOnlyNoValueConditions = (attributeFormat: string): boolean =>\n [AttributeFormat.color, AttributeFormat.date_range, AttributeFormat.encrypted, AttributeFormat.extended].includes(\n attributeFormat,\n );\n\nexport const nullValueConditions = [\n AttributeConditionFilter.IS_EMPTY,\n AttributeConditionFilter.IS_NOT_EMPTY,\n AttributeConditionFilter.TODAY,\n AttributeConditionFilter.TOMORROW,\n AttributeConditionFilter.YESTERDAY,\n AttributeConditionFilter.LAST_MONTH,\n AttributeConditionFilter.NEXT_MONTH,\n];\n"]}
1
+ {"version":3,"file":"conditionsHelper.js","sourceRoot":"","sources":["../../../src/components/Filters/conditionsHelper.ts"],"names":[],"mappings":"AAAA,oFAAoF;AACpF,sCAAsC;AACtC,sEAAsE;AACtE,OAAO,EAAC,eAAe,EAAC,MAAM,eAAe,CAAC;AAC9C,OAAO,EAAC,wBAAwB,EAAC,MAAM,WAAW,CAAC;AAEnD,MAAM,CAAC,MAAM,wBAAwB,GAAG,CAAC,eAAgC,EAAW,EAAE,CAClF,CAAC,eAAe,CAAC,KAAK,EAAE,eAAe,CAAC,UAAU,EAAE,eAAe,CAAC,SAAS,EAAE,eAAe,CAAC,QAAQ,CAAC,CAAC,QAAQ,CAC7G,eAAe,CAClB,CAAC;AAEN,MAAM,CAAC,MAAM,mBAAmB,GAAG;IAC/B,wBAAwB,CAAC,QAAQ;IACjC,wBAAwB,CAAC,YAAY;IACrC,wBAAwB,CAAC,KAAK;IAC9B,wBAAwB,CAAC,QAAQ;IACjC,wBAAwB,CAAC,SAAS;IAClC,wBAAwB,CAAC,UAAU;IACnC,wBAAwB,CAAC,UAAU;CACtC,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 {AttributeFormat} from '_ui/_gqlTypes';\nimport {AttributeConditionFilter} from '_ui/types';\n\nexport const hasOnlyNoValueConditions = (attributeFormat: AttributeFormat): boolean =>\n [AttributeFormat.color, AttributeFormat.date_range, AttributeFormat.encrypted, AttributeFormat.extended].includes(\n attributeFormat,\n );\n\nexport const nullValueConditions = [\n AttributeConditionFilter.IS_EMPTY,\n AttributeConditionFilter.IS_NOT_EMPTY,\n AttributeConditionFilter.TODAY,\n AttributeConditionFilter.TOMORROW,\n AttributeConditionFilter.YESTERDAY,\n AttributeConditionFilter.LAST_MONTH,\n AttributeConditionFilter.NEXT_MONTH,\n];\n"]}
@@ -28,7 +28,20 @@ const addFilter = (state, payload) => {
28
28
  condition = AttributeConditionFilter.EQUAL;
29
29
  }
30
30
  let filterToAdd;
31
- if (isUIFilterTree(payload)) {
31
+ if (isSmartFilter && payload.attribute.smartFilter.through) {
32
+ if (payload.attribute.smartFilter.through) {
33
+ filterToAdd = {
34
+ ...payload,
35
+ field: payload.field,
36
+ id: window.crypto.randomUUID(),
37
+ condition: ThroughConditionFilter.THROUGH,
38
+ subCondition: AttributeConditionFilter.EQUAL,
39
+ subField: `${payload.attribute.smartFilter.through.id}.id`,
40
+ value: null,
41
+ };
42
+ }
43
+ }
44
+ else if (isUIFilterTree(payload)) {
32
45
  const filterWithDefaultValues = state.initialFilters.find(initialFilter => initialFilter.attribute.id === payload.attribute.id);
33
46
  if (filterWithDefaultValues !== undefined) {
34
47
  filterToAdd = filterWithDefaultValues;