diff --git a/front/src/modules/activities/tasks/components/PageAddTaskButton.tsx b/front/src/modules/activities/tasks/components/PageAddTaskButton.tsx
index f878b5bd9..aca576922 100644
--- a/front/src/modules/activities/tasks/components/PageAddTaskButton.tsx
+++ b/front/src/modules/activities/tasks/components/PageAddTaskButton.tsx
@@ -4,17 +4,13 @@ import { PageAddButton } from '@/ui/layout/page/PageAddButton';
import { ActivityType } from '~/generated/graphql';
export const PageAddTaskButton = () => {
- const { selectedFilters } = useFilter();
+ const { selectedFilter } = useFilter();
const openCreateActivity = useOpenCreateActivityDrawer();
- const assigneeIdFilter = selectedFilters.find(
- (filter) => filter.key === 'assigneeId',
- );
-
const handleClick = () => {
openCreateActivity({
type: ActivityType.Task,
- assigneeId: assigneeIdFilter?.value,
+ assigneeId: selectedFilter?.value,
});
};
diff --git a/front/src/modules/activities/tasks/hooks/useCurrentUserDueTaskCount.ts b/front/src/modules/activities/tasks/hooks/useCurrentUserDueTaskCount.ts
index c282fe3a7..d08a52f3d 100644
--- a/front/src/modules/activities/tasks/hooks/useCurrentUserDueTaskCount.ts
+++ b/front/src/modules/activities/tasks/hooks/useCurrentUserDueTaskCount.ts
@@ -17,12 +17,14 @@ export const useCurrentUserTaskCount = () => {
completedAt: { equals: null },
...(currentUser
? turnFilterIntoWhereClause({
- key: 'assigneeId',
- type: 'entity',
+ fieldId: 'assigneeId',
value: currentUser.id,
operand: ViewFilterOperand.Is,
displayValue: currentUser.displayName,
displayAvatarUrl: currentUser.avatarUrl ?? undefined,
+ definition: {
+ type: 'entity',
+ },
})
: {}),
},
diff --git a/front/src/modules/activities/tasks/hooks/useTasks.ts b/front/src/modules/activities/tasks/hooks/useTasks.ts
index 7db8f20cd..0d690c2f7 100644
--- a/front/src/modules/activities/tasks/hooks/useTasks.ts
+++ b/front/src/modules/activities/tasks/hooks/useTasks.ts
@@ -7,7 +7,7 @@ import { ActivityType, useGetActivitiesQuery } from '~/generated/graphql';
import { parseDate } from '~/utils/date-utils';
export const useTasks = (entity?: ActivityTargetableEntity) => {
- const { selectedFilters } = useFilter();
+ const { selectedFilter } = useFilter();
const whereFilters = entity
? {
@@ -20,12 +20,7 @@ export const useTasks = (entity?: ActivityTargetableEntity) => {
},
},
}
- : Object.assign(
- {},
- ...selectedFilters.map((filter) => {
- return turnFilterIntoWhereClause(filter);
- }),
- );
+ : Object.assign({}, turnFilterIntoWhereClause(selectedFilter));
const { data: completeTasksData } = useGetActivitiesQuery({
variables: {
@@ -35,7 +30,7 @@ export const useTasks = (entity?: ActivityTargetableEntity) => {
...whereFilters,
},
},
- skip: !entity && selectedFilters.length === 0,
+ skip: !entity && !selectedFilter,
});
const { data: incompleteTaskData } = useGetActivitiesQuery({
@@ -46,7 +41,7 @@ export const useTasks = (entity?: ActivityTargetableEntity) => {
...whereFilters,
},
},
- skip: !entity && selectedFilters.length === 0,
+ skip: !entity && !selectedFilter,
});
const todayOrPreviousTasks = incompleteTaskData?.findManyActivities.filter(
diff --git a/front/src/modules/companies/board/components/CompanyBoard.tsx b/front/src/modules/companies/board/components/CompanyBoard.tsx
index 421652dd6..69d36cb8f 100644
--- a/front/src/modules/companies/board/components/CompanyBoard.tsx
+++ b/front/src/modules/companies/board/components/CompanyBoard.tsx
@@ -1,15 +1,29 @@
+import styled from '@emotion/styled';
+
import { BoardContext } from '@/companies/states/contexts/BoardContext';
+import { BoardOptionsDropdown } from '@/ui/layout/board/components/BoardOptionsDropdown';
+import { BoardOptionsDropdownId } from '@/ui/layout/board/components/constants/BoardOptionsDropdownId';
import {
EntityBoard,
EntityBoardProps,
} from '@/ui/layout/board/components/EntityBoard';
import { EntityBoardActionBar } from '@/ui/layout/board/components/EntityBoardActionBar';
import { EntityBoardContextMenu } from '@/ui/layout/board/components/EntityBoardContextMenu';
+import { ViewBar } from '@/views/components/ViewBar';
+import { ViewScope } from '@/views/scopes/ViewScope';
import { opportunitiesBoardOptions } from '~/pages/opportunities/opportunitiesBoardOptions';
import { HooksCompanyBoardEffect } from '../../components/HooksCompanyBoardEffect';
import { CompanyBoardRecoilScopeContext } from '../../states/recoil-scope-contexts/CompanyBoardRecoilScopeContext';
+const StyledContainer = styled.div`
+ display: flex;
+ flex-direction: column;
+ height: 100%;
+ overflow: auto;
+ width: 100%;
+`;
+
type CompanyBoardProps = Pick<
EntityBoardProps,
'onColumnAdd' | 'onColumnDelete' | 'onEditColumnTitle'
@@ -20,24 +34,30 @@ export const CompanyBoard = ({
onColumnDelete,
onEditColumnTitle,
}: CompanyBoardProps) => {
+ const viewScopeId = 'company-board-view';
return (
- <>
-
-
-
-
-
-
-
- >
+
+
+
+ }
+ optionsDropdownScopeId={BoardOptionsDropdownId}
+ />
+
+
+
+
+
+
+
);
};
diff --git a/front/src/modules/companies/components/HooksCompanyBoardEffect.tsx b/front/src/modules/companies/components/HooksCompanyBoardEffect.tsx
index 1657e1e44..80f9c9b82 100644
--- a/front/src/modules/companies/components/HooksCompanyBoardEffect.tsx
+++ b/front/src/modules/companies/components/HooksCompanyBoardEffect.tsx
@@ -2,12 +2,19 @@ import { useEffect, useMemo } from 'react';
import { useSearchParams } from 'react-router-dom';
import { useRecoilState } from 'recoil';
+import { pipelineAvailableFieldDefinitions } from '@/pipeline/constants/pipelineAvailableFieldDefinitions';
import { turnFilterIntoWhereClause } from '@/ui/data/filter/utils/turnFilterIntoWhereClause';
import { useBoardActionBarEntries } from '@/ui/layout/board/hooks/useBoardActionBarEntries';
+import { useBoardContext } from '@/ui/layout/board/hooks/useBoardContext';
import { useBoardContextMenuEntries } from '@/ui/layout/board/hooks/useBoardContextMenuEntries';
+import { availableBoardCardFieldsScopedState } from '@/ui/layout/board/states/availableBoardCardFieldsScopedState';
+import { boardCardFieldsScopedState } from '@/ui/layout/board/states/boardCardFieldsScopedState';
import { isBoardLoadedState } from '@/ui/layout/board/states/isBoardLoadedState';
+import { useRecoilScopedState } from '@/ui/utilities/recoil-scope/hooks/useRecoilScopedState';
import { useView } from '@/views/hooks/useView';
-import { useViewInternalStates } from '@/views/hooks/useViewInternalStates';
+import { useViewGetStates } from '@/views/hooks/useViewGetStates';
+import { ViewType } from '@/views/types/ViewType';
+import { viewFieldsToBoardFieldDefinitions } from '@/views/utils/viewFieldsToBoardFieldDefinitions';
import {
Pipeline,
PipelineProgressableType,
@@ -22,20 +29,30 @@ import { useUpdateCompanyBoard } from '../hooks/useUpdateCompanyBoardColumns';
export const HooksCompanyBoardEffect = () => {
const {
- setAvailableFilters,
- setAvailableSorts,
+ setAvailableFilterDefinitions,
+ setAvailableSortDefinitions,
+ setAvailableFieldDefinitions,
setEntityCountInCurrentView,
+ setViewObjectId,
+ setViewType,
} = useView();
- const { currentViewFilters } = useViewInternalStates();
-
- useEffect(() => {
- setAvailableFilters(opportunitiesBoardOptions.filters);
- setAvailableSorts?.(opportunitiesBoardOptions.sorts);
- }, [setAvailableFilters, setAvailableSorts]);
+ const { currentViewFilters, currentViewFields } = useViewGetStates();
const [, setIsBoardLoaded] = useRecoilState(isBoardLoadedState);
+ const { BoardRecoilScopeContext } = useBoardContext();
+
+ const [, setBoardCardFields] = useRecoilScopedState(
+ boardCardFieldsScopedState,
+ BoardRecoilScopeContext,
+ );
+
+ const [, setAvailableBoardCardFields] = useRecoilScopedState(
+ availableBoardCardFieldsScopedState,
+ BoardRecoilScopeContext,
+ );
+
const updateCompanyBoard = useUpdateCompanyBoard();
const { data: pipelineData, loading: loadingGetPipelines } =
@@ -51,6 +68,21 @@ export const HooksCompanyBoardEffect = () => {
const pipeline = pipelineData?.findManyPipeline[0] as Pipeline | undefined;
+ useEffect(() => {
+ setAvailableFilterDefinitions(opportunitiesBoardOptions.filterDefinitions);
+ setAvailableSortDefinitions?.(opportunitiesBoardOptions.sortDefinitions);
+ setAvailableFieldDefinitions?.(pipelineAvailableFieldDefinitions);
+ }, [
+ setAvailableFieldDefinitions,
+ setAvailableFilterDefinitions,
+ setAvailableSortDefinitions,
+ ]);
+
+ useEffect(() => {
+ setViewObjectId?.('company');
+ setViewType?.(ViewType.Kanban);
+ }, [setViewObjectId, setViewType]);
+
const pipelineStageIds = pipeline?.pipelineStages
?.map((pipelineStage) => pipelineStage.id)
.flat();
@@ -107,6 +139,7 @@ export const HooksCompanyBoardEffect = () => {
if (!loading && pipeline && pipelineProgresses && companiesData) {
setActionBarEntries();
setContextMenuEntries();
+ setAvailableBoardCardFields(pipelineAvailableFieldDefinitions);
updateCompanyBoard(pipeline, pipelineProgresses, companiesData.companies);
setEntityCountInCurrentView(companiesData.companies.length);
}
@@ -120,7 +153,19 @@ export const HooksCompanyBoardEffect = () => {
setContextMenuEntries,
searchParams,
setEntityCountInCurrentView,
+ setAvailableBoardCardFields,
]);
+ useEffect(() => {
+ if (currentViewFields) {
+ setBoardCardFields(
+ viewFieldsToBoardFieldDefinitions(
+ currentViewFields,
+ pipelineAvailableFieldDefinitions,
+ ),
+ );
+ }
+ }, [currentViewFields, setBoardCardFields]);
+
return <>>;
};
diff --git a/front/src/modules/companies/table/components/CompanyTable.tsx b/front/src/modules/companies/table/components/CompanyTable.tsx
index e3081f729..cb19871b2 100644
--- a/front/src/modules/companies/table/components/CompanyTable.tsx
+++ b/front/src/modules/companies/table/components/CompanyTable.tsx
@@ -8,40 +8,59 @@ import { useCompanyTableContextMenuEntries } from '@/companies/hooks/useCompanyT
import { useSpreadsheetCompanyImport } from '@/companies/hooks/useSpreadsheetCompanyImport';
import { DataTable } from '@/ui/data/data-table/components/DataTable';
import { DataTableEffect } from '@/ui/data/data-table/components/DataTableEffect';
+import { TableOptionsDropdownId } from '@/ui/data/data-table/constants/TableOptionsDropdownId';
import { TableContext } from '@/ui/data/data-table/contexts/TableContext';
import { useUpsertDataTableItem } from '@/ui/data/data-table/hooks/useUpsertDataTableItem';
import { TableOptionsDropdown } from '@/ui/data/data-table/options/components/TableOptionsDropdown';
import { tableColumnsScopedState } from '@/ui/data/data-table/states/tableColumnsScopedState';
+import { tableFiltersScopedState } from '@/ui/data/data-table/states/tableFiltersScopedState';
+import { tableSortsScopedState } from '@/ui/data/data-table/states/tableSortsScopedState';
import { ViewBar } from '@/views/components/ViewBar';
import { useViewFields } from '@/views/hooks/internal/useViewFields';
import { useView } from '@/views/hooks/useView';
import { ViewScope } from '@/views/scopes/ViewScope';
import { columnDefinitionsToViewFields } from '@/views/utils/columnDefinitionToViewField';
import { viewFieldsToColumnDefinitions } from '@/views/utils/viewFieldsToColumnDefinitions';
+import { viewFiltersToFilters } from '@/views/utils/viewFiltersToFilters';
+import { viewSortsToSorts } from '@/views/utils/viewSortsToSorts';
import {
UpdateOneCompanyMutationVariables,
useGetCompaniesQuery,
useGetWorkspaceMembersLazyQuery,
useUpdateOneCompanyMutation,
} from '~/generated/graphql';
-import { companyAvailableFilters } from '~/pages/companies/companies-filters';
-import { companyAvailableSorts } from '~/pages/companies/companies-sorts';
+import { companyTableFilterDefinitions } from '~/pages/companies/constants/companyTableFilterDefinitions';
+import { companyTableSortDefinitions } from '~/pages/companies/constants/companyTableSortDefinitions';
import CompanyTableEffect from './CompanyTableEffect';
+const StyledContainer = styled.div`
+ display: flex;
+ flex-direction: column;
+ height: 100%;
+ overflow: auto;
+`;
+
export const CompanyTable = () => {
- const tableViewScopeId = 'company-table';
+ const viewScopeId = 'company-table-view';
+ const tableScopeId = 'companies';
const setTableColumns = useSetRecoilState(
- tableColumnsScopedState('companies'),
+ tableColumnsScopedState(tableScopeId),
);
+ const setTableFilters = useSetRecoilState(
+ tableFiltersScopedState(tableScopeId),
+ );
+
+ const setTableSorts = useSetRecoilState(tableSortsScopedState(tableScopeId));
+
const [updateEntityMutation] = useUpdateOneCompanyMutation();
const upsertDataTableItem = useUpsertDataTableItem();
const [getWorkspaceMember] = useGetWorkspaceMembersLazyQuery();
- const { persistViewFields } = useViewFields(tableViewScopeId);
- const { setCurrentViewFields, currentViewId } = useView({
- viewScopeId: tableViewScopeId,
+ const { persistViewFields } = useViewFields(viewScopeId);
+ const { setCurrentViewFields } = useView({
+ viewScopeId,
});
const { setContextMenuEntries } = useCompanyTableContextMenuEntries();
@@ -79,16 +98,9 @@ export const CompanyTable = () => {
const { openCompanySpreadsheetImport: onImport } =
useSpreadsheetCompanyImport();
- const StyledContainer = styled.div`
- display: flex;
- flex-direction: column;
- height: 100%;
- overflow: auto;
- `;
-
return (
{
setTableColumns(
viewFieldsToColumnDefinitions(
@@ -97,7 +109,12 @@ export const CompanyTable = () => {
),
);
}}
- onViewFiltersChange={() => {}}
+ onViewFiltersChange={(viewFilters) => {
+ setTableFilters(viewFiltersToFilters(viewFilters));
+ }}
+ onViewSortsChange={(viewSorts) => {
+ setTableSorts(viewSortsToSorts(viewSorts));
+ }}
>
{
>
}
- optionsDropdownScopeId="table-dropdown-option"
+ optionsDropdownScopeId={TableOptionsDropdownId}
/>
{
getRequestOptimisticEffectDefinition={
getCompaniesOptimisticEffectDefinition
}
- filterDefinitionArray={companyAvailableFilters}
- sortDefinitionArray={companyAvailableSorts}
+ filterDefinitionArray={companyTableFilterDefinitions}
+ sortDefinitionArray={companyTableSortDefinitions}
setContextMenuEntries={setContextMenuEntries}
setActionBarEntries={setActionBarEntries}
/>
diff --git a/front/src/modules/companies/table/components/CompanyTableEffect.tsx b/front/src/modules/companies/table/components/CompanyTableEffect.tsx
index 24a1b05ad..8e9d72d8a 100644
--- a/front/src/modules/companies/table/components/CompanyTableEffect.tsx
+++ b/front/src/modules/companies/table/components/CompanyTableEffect.tsx
@@ -6,14 +6,14 @@ import { TableRecoilScopeContext } from '@/ui/data/data-table/states/recoil-scop
import { useRecoilScopedState } from '@/ui/utilities/recoil-scope/hooks/useRecoilScopedState';
import { useView } from '@/views/hooks/useView';
import { ViewType } from '@/views/types/ViewType';
-import { companyAvailableFilters } from '~/pages/companies/companies-filters';
-import { companyAvailableSorts } from '~/pages/companies/companies-sorts';
+import { companyTableFilterDefinitions } from '~/pages/companies/constants/companyTableFilterDefinitions';
+import { companyTableSortDefinitions } from '~/pages/companies/constants/companyTableSortDefinitions';
const CompanyTableEffect = () => {
const {
- setAvailableSorts,
- setAvailableFilters,
- setAvailableFields,
+ setAvailableSortDefinitions,
+ setAvailableFilterDefinitions,
+ setAvailableFieldDefinitions,
setViewType,
setViewObjectId,
} = useView();
@@ -24,26 +24,21 @@ const CompanyTableEffect = () => {
);
useEffect(() => {
- setAvailableSorts?.(companyAvailableSorts);
- setAvailableFilters?.(companyAvailableFilters);
- setAvailableFields?.(companiesAvailableFieldDefinitions);
+ setAvailableSortDefinitions?.(companyTableSortDefinitions);
+ setAvailableFilterDefinitions?.(companyTableFilterDefinitions);
+ setAvailableFieldDefinitions?.(companiesAvailableFieldDefinitions);
setViewObjectId?.('company');
setViewType?.(ViewType.Table);
setAvailableTableColumns(companiesAvailableFieldDefinitions);
}, [
- setAvailableFields,
- setAvailableFilters,
- setAvailableSorts,
+ setAvailableFieldDefinitions,
+ setAvailableFilterDefinitions,
+ setAvailableSortDefinitions,
setAvailableTableColumns,
setViewObjectId,
setViewType,
]);
- // useEffect(() => {
- // if (currentViewFields) {
- // setTableColumns([...currentViewFields].sort((a, b) => a.index - b.index));
- // }
- // }, [currentViewFields, setTableColumns]);
// useEffect(() => {
// if (currentViewSorts) {
diff --git a/front/src/modules/companies/table/components/CompanyTableMockDataEffect.tsx b/front/src/modules/companies/table/components/CompanyTableMockDataEffect.tsx
index 3ab251a73..0ae168346 100644
--- a/front/src/modules/companies/table/components/CompanyTableMockDataEffect.tsx
+++ b/front/src/modules/companies/table/components/CompanyTableMockDataEffect.tsx
@@ -17,7 +17,6 @@ export const CompanyTableMockDataEffect = () => {
useEffect(() => {
setDataTableData(mockedCompaniesData, [], []);
-
setTableColumns(companiesAvailableFieldDefinitions);
}, [setDataTableData, setTableColumns]);
diff --git a/front/src/modules/metadata/components/MetadataObjectNavItems.tsx b/front/src/modules/metadata/components/MetadataObjectNavItems.tsx
index 9241a61a4..0426ba660 100644
--- a/front/src/modules/metadata/components/MetadataObjectNavItems.tsx
+++ b/front/src/modules/metadata/components/MetadataObjectNavItems.tsx
@@ -1,6 +1,7 @@
import { useNavigate } from 'react-router-dom';
-import { IconBuildingSkyscraper } from '@/ui/display/icon';
+import { Icon123 } from '@/ui/input/constants/icons';
+import { useLazyLoadIcons } from '@/ui/input/hooks/useLazyLoadIcons';
import NavItem from '@/ui/navigation/navbar/components/NavItem';
import { capitalize } from '~/utils/string/capitalize';
@@ -10,22 +11,26 @@ export const MetadataObjectNavItems = () => {
const { metadataObjects } = useFindManyMetadataObjects();
const navigate = useNavigate();
+ const { icons } = useLazyLoadIcons();
return (
<>
{metadataObjects
.filter((metadataObject) => !!metadataObject.isActive)
- .map((metadataObject) => (
- {
- navigate(`/objects/${metadataObject.namePlural}`);
- }}
- />
- ))}
+ .filter((metadataObjects) => !metadataObjects.namePlural.endsWith('V2'))
+ .map((metadataObject) => {
+ return (
+ {
+ navigate(`/objects/${metadataObject.namePlural}`);
+ }}
+ />
+ );
+ })}
>
);
};
diff --git a/front/src/modules/metadata/components/ObjectTableEffect.tsx b/front/src/modules/metadata/components/ObjectTableEffect.tsx
index b1f09e988..d5e53d32b 100644
--- a/front/src/modules/metadata/components/ObjectTableEffect.tsx
+++ b/front/src/modules/metadata/components/ObjectTableEffect.tsx
@@ -9,9 +9,9 @@ import { useMetadataObjectInContext } from '../hooks/useMetadataObjectInContext'
export const ObjectTableEffect = () => {
const {
- setAvailableSorts,
- setAvailableFilters,
- setAvailableFields,
+ setAvailableSortDefinitions,
+ setAvailableFilterDefinitions,
+ setAvailableFieldDefinitions,
setViewType,
setViewObjectId,
} = useView();
@@ -38,22 +38,22 @@ export const ObjectTableEffect = () => {
);
useEffect(() => {
- setAvailableSorts?.([]); // TODO: extract from metadata fields
- setAvailableFilters?.([]); // TODO: extract from metadata fields
- setAvailableFields?.(columnDefinitions);
+ setAvailableSortDefinitions?.([]); // TODO: extract from metadata fields
+ setAvailableFilterDefinitions?.([]); // TODO: extract from metadata fields
+ setAvailableFieldDefinitions?.(columnDefinitions);
setViewObjectId?.(objectNamePlural);
setViewType?.(ViewType.Table);
setAvailableTableColumns(columnDefinitions);
}, [
- setAvailableFields,
- setAvailableFilters,
- setAvailableSorts,
setAvailableTableColumns,
setViewObjectId,
setViewType,
columnDefinitions,
objectNamePlural,
+ setAvailableSortDefinitions,
+ setAvailableFilterDefinitions,
+ setAvailableFieldDefinitions,
]);
// useEffect(() => {
diff --git a/front/src/modules/metadata/hooks/useFindOneMetadataObject.ts b/front/src/modules/metadata/hooks/useFindOneMetadataObject.ts
index 6195e70f6..6e1413bd7 100644
--- a/front/src/modules/metadata/hooks/useFindOneMetadataObject.ts
+++ b/front/src/modules/metadata/hooks/useFindOneMetadataObject.ts
@@ -6,6 +6,7 @@ import { FieldMetadata } from '@/ui/data/field/types/FieldMetadata';
import { MetadataObjectIdentifier } from '../types/MetadataObjectIdentifier';
import { formatMetadataFieldAsColumnDefinition } from '../utils/formatMetadataFieldAsColumnDefinition';
import { generateCreateOneObjectMutation } from '../utils/generateCreateOneObjectMutation';
+import { generateDeleteOneObjectMutation } from '../utils/generateDeleteOneObjectMutation';
import { generateFindManyCustomObjectsQuery } from '../utils/generateFindManyCustomObjectsQuery';
import { generateFindOneCustomObjectQuery } from '../utils/generateFindOneCustomObjectQuery';
import { generateUpdateOneObjectMutation } from '../utils/generateUpdateOneObjectMutation';
@@ -79,7 +80,7 @@ export const useFindOneMetadataObject = ({
// TODO: implement backend delete
const deleteOneMutation = foundMetadataObject
- ? generateCreateOneObjectMutation({
+ ? generateDeleteOneObjectMutation({
metadataObject: foundMetadataObject,
})
: gql`
diff --git a/front/src/modules/metadata/hooks/useSetDataTableData.ts b/front/src/modules/metadata/hooks/useSetDataTableData.ts
index 0aae7fe38..df0095e45 100644
--- a/front/src/modules/metadata/hooks/useSetDataTableData.ts
+++ b/front/src/modules/metadata/hooks/useSetDataTableData.ts
@@ -7,7 +7,7 @@ import { TableRecoilScopeContext } from '@/ui/data/data-table/states/recoil-scop
import { tableRowIdsState } from '@/ui/data/data-table/states/tableRowIdsState';
import { entityFieldsFamilyState } from '@/ui/data/field/states/entityFieldsFamilyState';
import { useRecoilScopeId } from '@/ui/utilities/recoil-scope/hooks/useRecoilScopeId';
-import { availableSortsScopedState } from '@/views/states/availableSortsScopedState';
+import { availableSortDefinitionsScopedState } from '@/views/states/availableSortDefinitionsScopedState';
export const useSetObjectDataTableData = () => {
const resetTableRowSelection = useResetTableRowSelection();
@@ -41,7 +41,10 @@ export const useSetObjectDataTableData = () => {
set(numberOfTableRowsState, entityIds.length);
- set(availableSortsScopedState({ scopeId: tableContextScopeId }), []);
+ set(
+ availableSortDefinitionsScopedState({ scopeId: tableContextScopeId }),
+ [],
+ );
set(isFetchingDataTableDataState, false);
},
diff --git a/front/src/modules/people/hooks/usePeopleTableContextMenuEntries.tsx b/front/src/modules/people/hooks/usePersonTableContextMenuEntries.tsx
similarity index 100%
rename from front/src/modules/people/hooks/usePeopleTableContextMenuEntries.tsx
rename to front/src/modules/people/hooks/usePersonTableContextMenuEntries.tsx
diff --git a/front/src/modules/people/table/components/PeopleTable.tsx b/front/src/modules/people/table/components/PeopleTable.tsx
deleted file mode 100644
index 4fea9d0dd..000000000
--- a/front/src/modules/people/table/components/PeopleTable.tsx
+++ /dev/null
@@ -1,97 +0,0 @@
-import styled from '@emotion/styled';
-
-import { getPeopleOptimisticEffectDefinition } from '@/people/graphql/optimistic-effect-definitions/getPeopleOptimisticEffectDefinition';
-import { usePersonTableContextMenuEntries } from '@/people/hooks/usePeopleTableContextMenuEntries';
-import { usePersonTableActionBarEntries } from '@/people/hooks/usePersonTableActionBarEntries';
-import { useSpreadsheetPersonImport } from '@/people/hooks/useSpreadsheetPersonImport';
-import { DataTable } from '@/ui/data/data-table/components/DataTable';
-import { DataTableEffect } from '@/ui/data/data-table/components/DataTableEffect';
-import { TableContext } from '@/ui/data/data-table/contexts/TableContext';
-import { useUpsertDataTableItem } from '@/ui/data/data-table/hooks/useUpsertDataTableItem';
-import { TableOptionsDropdown } from '@/ui/data/data-table/options/components/TableOptionsDropdown';
-import { ViewBar } from '@/views/components/ViewBar';
-import { ViewBarEffect } from '@/views/components/ViewBarEffect';
-import { ViewScope } from '@/views/scopes/ViewScope';
-import {
- UpdateOnePersonMutationVariables,
- useGetPeopleQuery,
- useUpdateOnePersonMutation,
-} from '~/generated/graphql';
-import { peopleAvailableFilters } from '~/pages/people/people-filters';
-import { peopleAvailableSorts } from '~/pages/people/people-sorts';
-
-import PersonTableEffect from './PersonTableEffect';
-
-export const PeopleTable = () => {
- const tableViewScopeId = 'person-table';
-
- const [updateEntityMutation] = useUpdateOnePersonMutation();
- const upsertDataTableItem = useUpsertDataTableItem();
-
- const { setContextMenuEntries } = usePersonTableContextMenuEntries();
- const { setActionBarEntries } = usePersonTableActionBarEntries();
-
- const { openPersonSpreadsheetImport: onImport } =
- useSpreadsheetPersonImport();
-
- const StyledContainer = styled.div`
- display: flex;
- flex-direction: column;
- height: 100%;
- overflow: auto;
- `;
-
- return (
- {}}
- onViewSortsChange={() => {}}
- onViewFiltersChange={() => {}}
- >
-
- {},
- }}
- >
-
-
- }
- optionsDropdownScopeId="table-dropdown-option"
- />
-
-
-
-
- updateEntityMutation({
- variables,
- onCompleted: (data) => {
- if (!data.updateOnePerson) {
- return;
- }
- upsertDataTableItem(data.updateOnePerson);
- },
- })
- }
- />
-
-
-
- );
-};
diff --git a/front/src/modules/people/table/components/PersonTable.tsx b/front/src/modules/people/table/components/PersonTable.tsx
new file mode 100644
index 000000000..b6fbaeb33
--- /dev/null
+++ b/front/src/modules/people/table/components/PersonTable.tsx
@@ -0,0 +1,135 @@
+import styled from '@emotion/styled';
+import { useRecoilCallback, useSetRecoilState } from 'recoil';
+
+import { peopleAvailableFieldDefinitions } from '@/people/constants/peopleAvailableFieldDefinitions';
+import { getPeopleOptimisticEffectDefinition } from '@/people/graphql/optimistic-effect-definitions/getPeopleOptimisticEffectDefinition';
+import { usePersonTableActionBarEntries } from '@/people/hooks/usePersonTableActionBarEntries';
+import { usePersonTableContextMenuEntries } from '@/people/hooks/usePersonTableContextMenuEntries';
+import { useSpreadsheetPersonImport } from '@/people/hooks/useSpreadsheetPersonImport';
+import { DataTable } from '@/ui/data/data-table/components/DataTable';
+import { DataTableEffect } from '@/ui/data/data-table/components/DataTableEffect';
+import { TableContext } from '@/ui/data/data-table/contexts/TableContext';
+import { useUpsertDataTableItem } from '@/ui/data/data-table/hooks/useUpsertDataTableItem';
+import { TableOptionsDropdown } from '@/ui/data/data-table/options/components/TableOptionsDropdown';
+import { tableColumnsScopedState } from '@/ui/data/data-table/states/tableColumnsScopedState';
+import { tableFiltersScopedState } from '@/ui/data/data-table/states/tableFiltersScopedState';
+import { tableSortsScopedState } from '@/ui/data/data-table/states/tableSortsScopedState';
+import { ViewBar } from '@/views/components/ViewBar';
+import { useViewFields } from '@/views/hooks/internal/useViewFields';
+import { useView } from '@/views/hooks/useView';
+import { ViewScope } from '@/views/scopes/ViewScope';
+import { columnDefinitionsToViewFields } from '@/views/utils/columnDefinitionToViewField';
+import { viewFieldsToColumnDefinitions } from '@/views/utils/viewFieldsToColumnDefinitions';
+import { viewFiltersToFilters } from '@/views/utils/viewFiltersToFilters';
+import { viewSortsToSorts } from '@/views/utils/viewSortsToSorts';
+import {
+ UpdateOnePersonMutationVariables,
+ useGetPeopleQuery,
+ useUpdateOnePersonMutation,
+} from '~/generated/graphql';
+import { personTableFilterDefinitions } from '~/pages/people/constants/personTableFilterDefinitions';
+import { personTableSortDefinitions } from '~/pages/people/constants/personTableSortDefinitions';
+
+import PersonTableEffect from './PersonTableEffect';
+
+export const PersonTable = () => {
+ const viewScopeId = 'person-table-view';
+ const tableScopeId = 'people';
+ const setTableColumns = useSetRecoilState(
+ tableColumnsScopedState(tableScopeId),
+ );
+
+ const setTableFilters = useSetRecoilState(
+ tableFiltersScopedState(tableScopeId),
+ );
+
+ const setTableSorts = useSetRecoilState(tableSortsScopedState(tableScopeId));
+
+ const [updateEntityMutation] = useUpdateOnePersonMutation();
+ const upsertDataTableItem = useUpsertDataTableItem();
+
+ const { persistViewFields } = useViewFields(viewScopeId);
+ const { setCurrentViewFields } = useView({
+ viewScopeId,
+ });
+
+ const { setContextMenuEntries } = usePersonTableContextMenuEntries();
+ const { setActionBarEntries } = usePersonTableActionBarEntries();
+
+ const updatePerson = async (variables: UpdateOnePersonMutationVariables) => {
+ updateEntityMutation({
+ variables: variables,
+ onCompleted: (data) => {
+ if (!data.updateOnePerson) {
+ return;
+ }
+ upsertDataTableItem(data.updateOnePerson);
+ },
+ });
+ };
+
+ const { openPersonSpreadsheetImport: onImport } =
+ useSpreadsheetPersonImport();
+
+ const StyledContainer = styled.div`
+ display: flex;
+ flex-direction: column;
+ height: 100%;
+ overflow: auto;
+ `;
+
+ return (
+ {
+ setTableColumns(
+ viewFieldsToColumnDefinitions(
+ viewFields,
+ peopleAvailableFieldDefinitions,
+ ),
+ );
+ }}
+ onViewFiltersChange={(viewFilters) => {
+ setTableFilters(viewFiltersToFilters(viewFilters));
+ }}
+ onViewSortsChange={(viewSorts) => {
+ setTableSorts(viewSortsToSorts(viewSorts));
+ }}
+ >
+
+ (columns) => {
+ setCurrentViewFields?.(columnDefinitionsToViewFields(columns));
+ persistViewFields(columnDefinitionsToViewFields(columns));
+ }),
+ }}
+ >
+ }
+ optionsDropdownScopeId="table-dropdown-option"
+ />
+
+
+ updatePerson(variables)}
+ />
+
+
+
+ );
+};
diff --git a/front/src/modules/people/table/components/PersonTableEffect.tsx b/front/src/modules/people/table/components/PersonTableEffect.tsx
index 6cddfabd0..6f6f7bf01 100644
--- a/front/src/modules/people/table/components/PersonTableEffect.tsx
+++ b/front/src/modules/people/table/components/PersonTableEffect.tsx
@@ -7,14 +7,14 @@ import { tableColumnsScopedState } from '@/ui/data/data-table/states/tableColumn
import { useRecoilScopedState } from '@/ui/utilities/recoil-scope/hooks/useRecoilScopedState';
import { useView } from '@/views/hooks/useView';
import { ViewType } from '@/views/types/ViewType';
-import { peopleAvailableFilters } from '~/pages/people/people-filters';
-import { peopleAvailableSorts } from '~/pages/people/people-sorts';
+import { personTableFilterDefinitions } from '~/pages/people/constants/personTableFilterDefinitions';
+import { personTableSortDefinitions } from '~/pages/people/constants/personTableSortDefinitions';
const PeopleTableEffect = () => {
const {
- setAvailableSorts,
- setAvailableFilters,
- setAvailableFields,
+ setAvailableSortDefinitions,
+ setAvailableFilterDefinitions,
+ setAvailableFieldDefinitions,
setViewType,
setViewObjectId,
} = useView();
@@ -30,17 +30,17 @@ const PeopleTableEffect = () => {
);
useEffect(() => {
- setAvailableSorts?.(peopleAvailableSorts);
- setAvailableFilters?.(peopleAvailableFilters);
- setAvailableFields?.(peopleAvailableFieldDefinitions);
+ setAvailableSortDefinitions?.(personTableSortDefinitions);
+ setAvailableFilterDefinitions?.(personTableFilterDefinitions);
+ setAvailableFieldDefinitions?.(peopleAvailableFieldDefinitions);
setViewObjectId?.('person');
setViewType?.(ViewType.Table);
setAvailableTableColumns(peopleAvailableFieldDefinitions);
}, [
- setAvailableFields,
- setAvailableFilters,
- setAvailableSorts,
+ setAvailableFieldDefinitions,
+ setAvailableFilterDefinitions,
+ setAvailableSortDefinitions,
setAvailableTableColumns,
setTableColumns,
setViewObjectId,
diff --git a/front/src/modules/pipeline/constants/pipelineAvailableFieldDefinitions.tsx b/front/src/modules/pipeline/constants/pipelineAvailableFieldDefinitions.tsx
index 65f1c96da..1cf9fdad7 100644
--- a/front/src/modules/pipeline/constants/pipelineAvailableFieldDefinitions.tsx
+++ b/front/src/modules/pipeline/constants/pipelineAvailableFieldDefinitions.tsx
@@ -1,3 +1,4 @@
+import { ColumnDefinition } from '@/ui/data/data-table/types/ColumnDefinition';
import {
FieldDateMetadata,
FieldMetadata,
@@ -12,10 +13,9 @@ import {
IconUser,
} from '@/ui/display/icon';
import { Entity } from '@/ui/input/relation-picker/types/EntityTypeForSelect';
-import { BoardFieldDefinition } from '@/ui/layout/board/types/BoardFieldDefinition';
import { Person } from '~/generated/graphql';
-export const pipelineAvailableFieldDefinitions: BoardFieldDefinition[] =
+export const pipelineAvailableFieldDefinitions: ColumnDefinition[] =
[
{
fieldId: 'closeDate',
@@ -26,10 +26,11 @@ export const pipelineAvailableFieldDefinitions: BoardFieldDefinition,
+ } satisfies ColumnDefinition,
{
fieldId: 'amount',
label: 'Amount',
@@ -40,9 +41,10 @@ export const pipelineAvailableFieldDefinitions: BoardFieldDefinition,
+ } satisfies ColumnDefinition,
{
fieldId: 'probability',
label: 'Probability',
@@ -52,10 +54,11 @@ export const pipelineAvailableFieldDefinitions: BoardFieldDefinition,
+ } satisfies ColumnDefinition,
{
fieldId: 'pointOfContact',
label: 'Point of Contact',
@@ -67,6 +70,7 @@ export const pipelineAvailableFieldDefinitions: BoardFieldDefinition {
@@ -76,5 +80,5 @@ export const pipelineAvailableFieldDefinitions: BoardFieldDefinition,
+ } satisfies ColumnDefinition,
];
diff --git a/front/src/modules/settings/data-model/object-edit/SettingsObjectIconSection.tsx b/front/src/modules/settings/data-model/object-edit/SettingsObjectIconSection.tsx
index 1f9030bfa..00835f3c5 100644
--- a/front/src/modules/settings/data-model/object-edit/SettingsObjectIconSection.tsx
+++ b/front/src/modules/settings/data-model/object-edit/SettingsObjectIconSection.tsx
@@ -55,7 +55,12 @@ export const SettingsObjectIconSection = ({
-
+ {Icon && (
+
+ )}
);
diff --git a/front/src/modules/ui/data/data-table/components/DataTableHeader.tsx b/front/src/modules/ui/data/data-table/components/DataTableHeader.tsx
index 208da5452..40e2b282a 100644
--- a/front/src/modules/ui/data/data-table/components/DataTableHeader.tsx
+++ b/front/src/modules/ui/data/data-table/components/DataTableHeader.tsx
@@ -168,37 +168,35 @@ export const DataTableHeader = () => {
>
- {[...visibleTableColumns]
- .sort((columnA, columnB) => columnA.position - columnB.position)
- .map((column) => (
-
-
-
-
- {
- setResizedFieldKey(column.fieldId);
- }}
+ {visibleTableColumns.map((column) => (
+
+
+
-
- ))}
+
+ {
+ setResizedFieldKey(column.fieldId);
+ }}
+ />
+
+ ))}
{hiddenTableColumns.length > 0 && (
diff --git a/front/src/modules/ui/data/data-table/hooks/useSetDataTableData.ts b/front/src/modules/ui/data/data-table/hooks/useSetDataTableData.ts
index 4ef19f7aa..9e77272a5 100644
--- a/front/src/modules/ui/data/data-table/hooks/useSetDataTableData.ts
+++ b/front/src/modules/ui/data/data-table/hooks/useSetDataTableData.ts
@@ -4,7 +4,7 @@ import { entityFieldsFamilyState } from '@/ui/data/field/states/entityFieldsFami
import { FilterDefinition } from '@/ui/data/filter/types/FilterDefinition';
import { useRecoilScopeId } from '@/ui/utilities/recoil-scope/hooks/useRecoilScopeId';
import { useView } from '@/views/hooks/useView';
-import { availableSortsScopedState } from '@/views/states/availableSortsScopedState';
+import { availableSortDefinitionsScopedState } from '@/views/states/availableSortDefinitionsScopedState';
import { SortDefinition } from '../../sort/types/SortDefinition';
import { isFetchingDataTableDataState } from '../states/isFetchingDataTableDataState';
@@ -54,7 +54,7 @@ export const useSetDataTableData = () => {
setEntityCountInCurrentView(entityIds.length);
set(
- availableSortsScopedState({ scopeId: tableContextScopeId }),
+ availableSortDefinitionsScopedState({ scopeId: tableContextScopeId }),
sortDefinitionArray,
);
diff --git a/front/src/modules/ui/data/data-table/options/components/TableOptionsDropdownContent.tsx b/front/src/modules/ui/data/data-table/options/components/TableOptionsDropdownContent.tsx
index 20ac0e2fb..1357220d6 100644
--- a/front/src/modules/ui/data/data-table/options/components/TableOptionsDropdownContent.tsx
+++ b/front/src/modules/ui/data/data-table/options/components/TableOptionsDropdownContent.tsx
@@ -13,7 +13,7 @@ import { useScopedHotkeys } from '@/ui/utilities/hotkey/hooks/useScopedHotkeys';
import { useRecoilScopedValue } from '@/ui/utilities/recoil-scope/hooks/useRecoilScopedValue';
import { ViewFieldsVisibilityDropdownSection } from '@/views/components/ViewFieldsVisibilityDropdownSection';
import { useView } from '@/views/hooks/useView';
-import { useViewInternalStates } from '@/views/hooks/useViewInternalStates';
+import { useViewGetStates } from '@/views/hooks/useViewGetStates';
import { useTableColumns } from '../../hooks/useTableColumns';
import { TableRecoilScopeContext } from '../../states/recoil-scope-contexts/TableRecoilScopeContext';
@@ -29,7 +29,7 @@ export const TableOptionsDropdownContent = ({
onImport?: () => void;
}) => {
const { setViewEditMode, handleViewNameSubmit } = useView();
- const { viewEditMode, currentView } = useViewInternalStates();
+ const { viewEditMode, currentView } = useViewGetStates();
const { closeDropdown } = useDropdown();
diff --git a/front/src/modules/ui/data/filter/components/FilterDropdownButton.tsx b/front/src/modules/ui/data/filter/components/FilterDropdownButton.tsx
index f4ae61453..17082cf92 100644
--- a/front/src/modules/ui/data/filter/components/FilterDropdownButton.tsx
+++ b/front/src/modules/ui/data/filter/components/FilterDropdownButton.tsx
@@ -12,12 +12,13 @@ type FilterDropdownButtonProps = {
export const FilterDropdownButton = ({
hotkeyScope,
}: FilterDropdownButtonProps) => {
- const { availableFilters } = useFilter();
+ const { availableFilterDefinitions } = useFilter();
const hasOnlyOneEntityFilter =
- availableFilters.length === 1 && availableFilters[0].type === 'entity';
+ availableFilterDefinitions.length === 1 &&
+ availableFilterDefinitions[0].type === 'entity';
- if (!availableFilters.length) {
+ if (!availableFilterDefinitions.length) {
return <>>;
}
diff --git a/front/src/modules/ui/data/filter/components/FilterDropdownDateSearchInput.tsx b/front/src/modules/ui/data/filter/components/FilterDropdownDateSearchInput.tsx
index 7ec5056d1..09a994d3f 100644
--- a/front/src/modules/ui/data/filter/components/FilterDropdownDateSearchInput.tsx
+++ b/front/src/modules/ui/data/filter/components/FilterDropdownDateSearchInput.tsx
@@ -1,5 +1,4 @@
import { InternalDatePicker } from '@/ui/input/components/internal/date/components/InternalDatePicker';
-import { useUpsertFilter } from '@/views/hooks/useUpsertFilter';
import { useFilter } from '../hooks/useFilter';
@@ -8,19 +7,18 @@ export const FilterDropdownDateSearchInput = () => {
filterDefinitionUsedInDropdown,
selectedOperandInDropdown,
setIsFilterDropdownUnfolded,
+ selectFilter,
} = useFilter();
- const upsertFilter = useUpsertFilter();
-
const handleChange = (date: Date) => {
if (!filterDefinitionUsedInDropdown || !selectedOperandInDropdown) return;
- upsertFilter({
- key: filterDefinitionUsedInDropdown.key,
- type: filterDefinitionUsedInDropdown.type,
+ selectFilter?.({
+ fieldId: filterDefinitionUsedInDropdown.fieldId,
value: date.toISOString(),
operand: selectedOperandInDropdown,
displayValue: date.toLocaleDateString(),
+ definition: filterDefinitionUsedInDropdown,
});
setIsFilterDropdownUnfolded(false);
diff --git a/front/src/modules/ui/data/filter/components/FilterDropdownEntitySearchSelect.tsx b/front/src/modules/ui/data/filter/components/FilterDropdownEntitySearchSelect.tsx
index cd180146a..2ce76876d 100644
--- a/front/src/modules/ui/data/filter/components/FilterDropdownEntitySearchSelect.tsx
+++ b/front/src/modules/ui/data/filter/components/FilterDropdownEntitySearchSelect.tsx
@@ -1,11 +1,8 @@
import { useEffect, useState } from 'react';
-import { useFilterCurrentlyEdited } from '@/ui/data/filter/hooks/useFilterCurrentlyEdited';
import { EntitiesForMultipleEntitySelect } from '@/ui/input/relation-picker/components/MultipleEntitySelect';
import { SingleEntitySelectBase } from '@/ui/input/relation-picker/components/SingleEntitySelectBase';
import { EntityForSelect } from '@/ui/input/relation-picker/types/EntityForSelect';
-import { useRemoveFilter } from '@/views/hooks/useRemoveFilter';
-import { useUpsertFilter } from '@/views/hooks/useUpsertFilter';
import { ViewFilterOperand } from '@/views/types/ViewFilterOperand';
import { useFilter } from '../hooks/useFilter';
@@ -16,20 +13,16 @@ export const FilterDropdownEntitySearchSelect = ({
entitiesForSelect: EntitiesForMultipleEntitySelect;
}) => {
const {
- filterDropdownSelectedEntityId,
setFilterDropdownSelectedEntityId,
filterDefinitionUsedInDropdown,
selectedOperandInDropdown,
filterDropdownSearchInput,
+ selectedFilter,
+ selectFilter,
} = useFilter();
const [isAllEntitySelected, setIsAllEntitySelected] = useState(false);
- const upsertFilter = useUpsertFilter();
- const removeFilter = useRemoveFilter();
-
- const filterCurrentlyEdited = useFilterCurrentlyEdited();
-
const handleUserSelected = (
selectedEntity: EntityForSelect | null | undefined,
) => {
@@ -45,24 +38,16 @@ export const FilterDropdownEntitySearchSelect = ({
setIsAllEntitySelected(false);
}
- const clickedOnAlreadySelectedEntity =
- selectedEntity.id === filterDropdownSelectedEntityId;
+ setFilterDropdownSelectedEntityId(selectedEntity.id);
- if (clickedOnAlreadySelectedEntity) {
- removeFilter(filterDefinitionUsedInDropdown.key);
- setFilterDropdownSelectedEntityId(null);
- } else {
- setFilterDropdownSelectedEntityId(selectedEntity.id);
-
- upsertFilter({
- displayValue: selectedEntity.name,
- key: filterDefinitionUsedInDropdown.key,
- operand: selectedOperandInDropdown,
- type: filterDefinitionUsedInDropdown.type,
- value: selectedEntity.id,
- displayAvatarUrl: selectedEntity.avatarUrl,
- });
- }
+ selectFilter?.({
+ displayValue: selectedEntity.name,
+ fieldId: filterDefinitionUsedInDropdown.fieldId,
+ operand: selectedOperandInDropdown,
+ value: selectedEntity.id,
+ displayAvatarUrl: selectedEntity.avatarUrl,
+ definition: filterDefinitionUsedInDropdown,
+ });
};
const isAllEntitySelectShown =
@@ -81,36 +66,30 @@ export const FilterDropdownEntitySearchSelect = ({
) {
return;
}
- if (isAllEntitySelected) {
- setIsAllEntitySelected(false);
- removeFilter(filterDefinitionUsedInDropdown.key);
- } else {
- setIsAllEntitySelected(true);
+ setIsAllEntitySelected(true);
+ setFilterDropdownSelectedEntityId(null);
- setFilterDropdownSelectedEntityId(null);
-
- upsertFilter({
- displayValue: filterDefinitionUsedInDropdown.selectAllLabel,
- key: filterDefinitionUsedInDropdown.key,
- operand: ViewFilterOperand.IsNotNull,
- type: filterDefinitionUsedInDropdown.type,
- value: '',
- });
- }
+ selectFilter?.({
+ displayValue: filterDefinitionUsedInDropdown.selectAllLabel,
+ fieldId: filterDefinitionUsedInDropdown.fieldId,
+ operand: ViewFilterOperand.IsNotNull,
+ value: '',
+ definition: filterDefinitionUsedInDropdown,
+ });
};
useEffect(() => {
- if (!filterCurrentlyEdited) {
+ if (!selectedFilter) {
setFilterDropdownSelectedEntityId(null);
} else {
- setFilterDropdownSelectedEntityId(filterCurrentlyEdited.value);
+ setFilterDropdownSelectedEntityId(selectedFilter.value);
setIsAllEntitySelected(
- filterCurrentlyEdited.operand === ViewFilterOperand.IsNotNull,
+ selectedFilter.operand === ViewFilterOperand.IsNotNull,
);
}
}, [
- filterCurrentlyEdited,
+ selectedFilter,
setFilterDropdownSelectedEntityId,
entitiesForSelect.selectedEntities,
]);
diff --git a/front/src/modules/ui/data/filter/components/FilterDropdownFilterSelect.tsx b/front/src/modules/ui/data/filter/components/FilterDropdownFilterSelect.tsx
index 556282495..6abe35548 100644
--- a/front/src/modules/ui/data/filter/components/FilterDropdownFilterSelect.tsx
+++ b/front/src/modules/ui/data/filter/components/FilterDropdownFilterSelect.tsx
@@ -11,32 +11,32 @@ export const FilterDropdownFilterSelect = () => {
setFilterDefinitionUsedInDropdown,
setSelectedOperandInDropdown,
setFilterDropdownSearchInput,
- availableFilters,
+ availableFilterDefinitions,
} = useFilter();
const setHotkeyScope = useSetHotkeyScope();
return (
- {availableFilters.map((availableFilter, index) => (
+ {availableFilterDefinitions.map((availableFilterDefinition, index) => (
diff --git a/front/src/modules/ui/data/filter/components/FilterDropdownNumberSearchInput.tsx b/front/src/modules/ui/data/filter/components/FilterDropdownNumberSearchInput.tsx
index ea8fc8585..7e12a60cd 100644
--- a/front/src/modules/ui/data/filter/components/FilterDropdownNumberSearchInput.tsx
+++ b/front/src/modules/ui/data/filter/components/FilterDropdownNumberSearchInput.tsx
@@ -2,16 +2,14 @@ import { ChangeEvent } from 'react';
import { DropdownMenuSearchInput } from '@/ui/layout/dropdown/components/DropdownMenuSearchInput';
-import { useRemoveFilter } from '../../../../views/hooks/useRemoveFilter';
-import { useUpsertFilter } from '../../../../views/hooks/useUpsertFilter';
import { useFilter } from '../hooks/useFilter';
export const FilterDropdownNumberSearchInput = () => {
- const { selectedOperandInDropdown, filterDefinitionUsedInDropdown } =
- useFilter();
-
- const upsertFilter = useUpsertFilter();
- const removeFilter = useRemoveFilter();
+ const {
+ selectedOperandInDropdown,
+ filterDefinitionUsedInDropdown,
+ selectFilter,
+ } = useFilter();
return (
filterDefinitionUsedInDropdown &&
@@ -21,17 +19,13 @@ export const FilterDropdownNumberSearchInput = () => {
type="number"
placeholder={filterDefinitionUsedInDropdown.label}
onChange={(event: ChangeEvent) => {
- if (event.target.value === '') {
- removeFilter(filterDefinitionUsedInDropdown.key);
- } else {
- upsertFilter({
- key: filterDefinitionUsedInDropdown.key,
- type: filterDefinitionUsedInDropdown.type,
- value: event.target.value,
- operand: selectedOperandInDropdown,
- displayValue: event.target.value,
- });
- }
+ selectFilter?.({
+ fieldId: filterDefinitionUsedInDropdown.fieldId,
+ value: event.target.value,
+ operand: selectedOperandInDropdown,
+ displayValue: event.target.value,
+ definition: filterDefinitionUsedInDropdown,
+ });
}}
/>
)
diff --git a/front/src/modules/ui/data/filter/components/FilterDropdownOperandSelect.tsx b/front/src/modules/ui/data/filter/components/FilterDropdownOperandSelect.tsx
index 7640752e2..83a511f16 100644
--- a/front/src/modules/ui/data/filter/components/FilterDropdownOperandSelect.tsx
+++ b/front/src/modules/ui/data/filter/components/FilterDropdownOperandSelect.tsx
@@ -2,9 +2,7 @@ import { DropdownMenuItemsContainer } from '@/ui/layout/dropdown/components/Drop
import { MenuItem } from '@/ui/navigation/menu-item/components/MenuItem';
import { ViewFilterOperand } from '@/views/types/ViewFilterOperand';
-import { useUpsertFilter } from '../../../../views/hooks/useUpsertFilter';
import { useFilter } from '../hooks/useFilter';
-import { useFilterCurrentlyEdited } from '../hooks/useFilterCurrentlyEdited';
import { getOperandLabel } from '../utils/getOperandLabel';
import { getOperandsForFilterType } from '../utils/getOperandsForFilterType';
@@ -14,27 +12,25 @@ export const FilterDropdownOperandSelect = () => {
setSelectedOperandInDropdown,
isFilterDropdownOperandSelectUnfolded,
setIsFilterDropdownOperandSelectUnfolded,
+ selectedFilter,
+ selectFilter,
} = useFilter();
const operandsForFilterType = getOperandsForFilterType(
filterDefinitionUsedInDropdown?.type,
);
- const filterCurrentlyEdited = useFilterCurrentlyEdited();
-
- const upsertFilter = useUpsertFilter();
-
const handleOperangeChange = (newOperand: ViewFilterOperand) => {
setSelectedOperandInDropdown(newOperand);
setIsFilterDropdownOperandSelectUnfolded(false);
- if (filterDefinitionUsedInDropdown && filterCurrentlyEdited) {
- upsertFilter({
- key: filterCurrentlyEdited.key,
- displayValue: filterCurrentlyEdited.displayValue,
+ if (filterDefinitionUsedInDropdown && selectedFilter) {
+ selectFilter?.({
+ fieldId: selectedFilter.fieldId,
+ displayValue: selectedFilter.displayValue,
operand: newOperand,
- type: filterCurrentlyEdited.type,
- value: filterCurrentlyEdited.value,
+ value: selectedFilter.value,
+ definition: filterDefinitionUsedInDropdown,
});
}
};
diff --git a/front/src/modules/ui/data/filter/components/FilterDropdownTextSearchInput.tsx b/front/src/modules/ui/data/filter/components/FilterDropdownTextSearchInput.tsx
index b65cc5dc7..02b29946d 100644
--- a/front/src/modules/ui/data/filter/components/FilterDropdownTextSearchInput.tsx
+++ b/front/src/modules/ui/data/filter/components/FilterDropdownTextSearchInput.tsx
@@ -2,10 +2,7 @@ import { ChangeEvent } from 'react';
import { DropdownMenuSearchInput } from '@/ui/layout/dropdown/components/DropdownMenuSearchInput';
-import { useRemoveFilter } from '../../../../views/hooks/useRemoveFilter';
-import { useUpsertFilter } from '../../../../views/hooks/useUpsertFilter';
import { useFilter } from '../hooks/useFilter';
-import { useFilterCurrentlyEdited } from '../hooks/useFilterCurrentlyEdited';
export const FilterDropdownTextSearchInput = () => {
const {
@@ -13,13 +10,10 @@ export const FilterDropdownTextSearchInput = () => {
selectedOperandInDropdown,
filterDropdownSearchInput,
setFilterDropdownSearchInput,
+ selectedFilter,
+ selectFilter,
} = useFilter();
- const upsertFilter = useUpsertFilter();
- const removeFilter = useRemoveFilter();
-
- const filterCurrentlyEdited = useFilterCurrentlyEdited();
-
return (
filterDefinitionUsedInDropdown &&
selectedOperandInDropdown && (
@@ -27,21 +21,17 @@ export const FilterDropdownTextSearchInput = () => {
autoFocus
type="text"
placeholder={filterDefinitionUsedInDropdown.label}
- value={filterCurrentlyEdited?.value ?? filterDropdownSearchInput}
+ value={selectedFilter?.value ?? filterDropdownSearchInput}
onChange={(event: ChangeEvent) => {
setFilterDropdownSearchInput(event.target.value);
- if (event.target.value === '') {
- removeFilter(filterDefinitionUsedInDropdown.key);
- } else {
- upsertFilter({
- key: filterDefinitionUsedInDropdown.key,
- type: filterDefinitionUsedInDropdown.type,
- value: event.target.value,
- operand: selectedOperandInDropdown,
- displayValue: event.target.value,
- });
- }
+ selectFilter?.({
+ fieldId: filterDefinitionUsedInDropdown.fieldId,
+ value: event.target.value,
+ operand: selectedOperandInDropdown,
+ displayValue: event.target.value,
+ definition: filterDefinitionUsedInDropdown,
+ });
}}
/>
)
diff --git a/front/src/modules/ui/data/filter/components/SingleEntityFilterDropdownButton.tsx b/front/src/modules/ui/data/filter/components/SingleEntityFilterDropdownButton.tsx
index 1d91b8126..2962868bd 100644
--- a/front/src/modules/ui/data/filter/components/SingleEntityFilterDropdownButton.tsx
+++ b/front/src/modules/ui/data/filter/components/SingleEntityFilterDropdownButton.tsx
@@ -21,13 +21,13 @@ export const SingleEntityFilterDropdownButton = ({
hotkeyScope: HotkeyScope;
}) => {
const {
- availableFilters,
- selectedFilters,
+ availableFilterDefinitions,
+ selectedFilter,
setFilterDefinitionUsedInDropdown,
setSelectedOperandInDropdown,
} = useFilter();
- const availableFilter = availableFilters[0];
+ const availableFilter = availableFilterDefinitions[0];
React.useEffect(() => {
setFilterDefinitionUsedInDropdown(availableFilter);
@@ -48,11 +48,11 @@ export const SingleEntityFilterDropdownButton = ({
dropdownOffset={{ x: 0, y: -28 }}
clickableComponent={
- {selectedFilters[0] ? (
+ {selectedFilter ? (
{
props?.filterScopeId,
);
const {
- availableFilters,
- setAvailableFilters,
+ availableFilterDefinitions,
+ setAvailableFilterDefinitions,
filterDefinitionUsedInDropdown,
setFilterDefinitionUsedInDropdown,
filterDropdownSearchInput,
@@ -26,16 +30,28 @@ export const useFilter = (props?: UseFilterProps) => {
setIsFilterDropdownOperandSelectUnfolded,
isFilterDropdownUnfolded,
setIsFilterDropdownUnfolded,
- selectedFilters,
- setSelectedFilters,
+ selectedFilter,
+ setSelectedFilter,
selectedOperandInDropdown,
setSelectedOperandInDropdown,
} = useFilterStates(scopeId);
+ const { onFilterSelect } = useScopeInternalContextOrThrow(
+ FilterScopeInternalContext,
+ );
+
+ const selectFilter = useCallback(
+ (filter: Filter) => {
+ setSelectedFilter(filter);
+ onFilterSelect?.(filter);
+ },
+ [setSelectedFilter, onFilterSelect],
+ );
+
return {
scopeId,
- availableFilters,
- setAvailableFilters,
+ availableFilterDefinitions,
+ setAvailableFilterDefinitions,
filterDefinitionUsedInDropdown,
setFilterDefinitionUsedInDropdown,
filterDropdownSearchInput,
@@ -46,9 +62,10 @@ export const useFilter = (props?: UseFilterProps) => {
setIsFilterDropdownOperandSelectUnfolded,
isFilterDropdownUnfolded,
setIsFilterDropdownUnfolded,
- selectedFilters,
- setSelectedFilters,
+ selectedFilter,
+ setSelectedFilter,
selectedOperandInDropdown,
setSelectedOperandInDropdown,
+ selectFilter,
};
};
diff --git a/front/src/modules/ui/data/filter/hooks/useFilterCurrentlyEdited.ts b/front/src/modules/ui/data/filter/hooks/useFilterCurrentlyEdited.ts
deleted file mode 100644
index e0d4e4e5f..000000000
--- a/front/src/modules/ui/data/filter/hooks/useFilterCurrentlyEdited.ts
+++ /dev/null
@@ -1,13 +0,0 @@
-import { useMemo } from 'react';
-
-import { useFilter } from './useFilter';
-
-export const useFilterCurrentlyEdited = () => {
- const { selectedFilters, filterDefinitionUsedInDropdown } = useFilter();
-
- return useMemo(() => {
- return selectedFilters?.find(
- (filter) => filter.key === filterDefinitionUsedInDropdown?.key,
- );
- }, [filterDefinitionUsedInDropdown?.key, selectedFilters]);
-};
diff --git a/front/src/modules/ui/data/filter/hooks/useFilterStates.ts b/front/src/modules/ui/data/filter/hooks/useFilterStates.ts
index 6dc39a724..3958b20f4 100644
--- a/front/src/modules/ui/data/filter/hooks/useFilterStates.ts
+++ b/front/src/modules/ui/data/filter/hooks/useFilterStates.ts
@@ -1,19 +1,17 @@
import { useRecoilScopedStateV2 } from '@/ui/utilities/recoil-scope/hooks/useRecoilScopedStateV2';
-import { availableFiltersScopedState } from '../states/availableFiltersScopedState';
+import { availableFilterDefinitionsScopedState } from '../states/availableFilterDefinitionsScopedState';
import { filterDefinitionUsedInDropdownScopedState } from '../states/filterDefinitionUsedInDropdownScopedState';
import { filterDropdownSearchInputScopedState } from '../states/filterDropdownSearchInputScopedState';
import { filterDropdownSelectedEntityIdScopedState } from '../states/filterDropdownSelectedEntityIdScopedState';
import { isFilterDropdownOperandSelectUnfoldedScopedState } from '../states/isFilterDropdownOperandSelectUnfoldedScopedState';
import { isFilterDropdownUnfoldedScopedState } from '../states/isFilterDropdownUnfoldedScopedState';
-import { selectedFiltersScopedState } from '../states/selectedFiltersScopedState';
+import { selectedFilterScopedState } from '../states/selectedFilterScopedState';
import { selectedOperandInDropdownScopedState } from '../states/selectedOperandInDropdownScopedState';
export const useFilterStates = (scopeId: string) => {
- const [availableFilters, setAvailableFilters] = useRecoilScopedStateV2(
- availableFiltersScopedState,
- scopeId,
- );
+ const [availableFilterDefinitions, setAvailableFilterDefinitions] =
+ useRecoilScopedStateV2(availableFilterDefinitionsScopedState, scopeId);
const [filterDefinitionUsedInDropdown, setFilterDefinitionUsedInDropdown] =
useRecoilScopedStateV2(filterDefinitionUsedInDropdownScopedState, scopeId);
@@ -35,8 +33,8 @@ export const useFilterStates = (scopeId: string) => {
const [isFilterDropdownUnfolded, setIsFilterDropdownUnfolded] =
useRecoilScopedStateV2(isFilterDropdownUnfoldedScopedState, scopeId);
- const [selectedFilters, setSelectedFilters] = useRecoilScopedStateV2(
- selectedFiltersScopedState,
+ const [selectedFilter, setSelectedFilter] = useRecoilScopedStateV2(
+ selectedFilterScopedState,
scopeId,
);
@@ -44,8 +42,8 @@ export const useFilterStates = (scopeId: string) => {
useRecoilScopedStateV2(selectedOperandInDropdownScopedState, scopeId);
return {
- availableFilters,
- setAvailableFilters,
+ availableFilterDefinitions,
+ setAvailableFilterDefinitions,
filterDefinitionUsedInDropdown,
setFilterDefinitionUsedInDropdown,
filterDropdownSearchInput,
@@ -56,8 +54,8 @@ export const useFilterStates = (scopeId: string) => {
setIsFilterDropdownOperandSelectUnfolded,
isFilterDropdownUnfolded,
setIsFilterDropdownUnfolded,
- selectedFilters,
- setSelectedFilters,
+ selectedFilter,
+ setSelectedFilter,
selectedOperandInDropdown,
setSelectedOperandInDropdown,
};
diff --git a/front/src/modules/ui/data/filter/scopes/FilterScope.tsx b/front/src/modules/ui/data/filter/scopes/FilterScope.tsx
index 594554156..9c75f4a43 100644
--- a/front/src/modules/ui/data/filter/scopes/FilterScope.tsx
+++ b/front/src/modules/ui/data/filter/scopes/FilterScope.tsx
@@ -2,25 +2,31 @@ import { ReactNode } from 'react';
import { FilterDefinition } from '@/ui/data/filter/types/FilterDefinition';
+import { Filter } from '../types/Filter';
+
import { FilterScopeInitEffect } from './init-effect/FilterScopeInitEffect';
import { FilterScopeInternalContext } from './scope-internal-context/FilterScopeInternalContext';
type FilterScopeProps = {
children: ReactNode;
filterScopeId: string;
- availableFilters?: FilterDefinition[];
+ availableFilterDefinitions?: FilterDefinition[];
+ onFilterSelect?: (filter: Filter) => void;
};
export const FilterScope = ({
children,
filterScopeId,
- availableFilters,
+ availableFilterDefinitions,
+ onFilterSelect,
}: FilterScopeProps) => {
return (
-
+
{children}
diff --git a/front/src/modules/ui/data/filter/scopes/init-effect/FilterScopeInitEffect.tsx b/front/src/modules/ui/data/filter/scopes/init-effect/FilterScopeInitEffect.tsx
index 1068f1797..fdbf81850 100644
--- a/front/src/modules/ui/data/filter/scopes/init-effect/FilterScopeInitEffect.tsx
+++ b/front/src/modules/ui/data/filter/scopes/init-effect/FilterScopeInitEffect.tsx
@@ -6,20 +6,20 @@ import { useFilterStates } from '../../hooks/useFilterStates';
type FilterScopeInitEffectProps = {
filterScopeId: string;
- availableFilters?: FilterDefinition[];
+ availableFilterDefinitions?: FilterDefinition[];
};
export const FilterScopeInitEffect = ({
filterScopeId,
- availableFilters,
+ availableFilterDefinitions,
}: FilterScopeInitEffectProps) => {
- const { setAvailableFilters } = useFilterStates(filterScopeId);
+ const { setAvailableFilterDefinitions } = useFilterStates(filterScopeId);
useEffect(() => {
- if (availableFilters) {
- setAvailableFilters(availableFilters);
+ if (availableFilterDefinitions) {
+ setAvailableFilterDefinitions(availableFilterDefinitions);
}
- }, [availableFilters, setAvailableFilters]);
+ }, [availableFilterDefinitions, setAvailableFilterDefinitions]);
return <>>;
};
diff --git a/front/src/modules/ui/data/filter/scopes/scope-internal-context/FilterScopeInternalContext.ts b/front/src/modules/ui/data/filter/scopes/scope-internal-context/FilterScopeInternalContext.ts
index e45d8d6ae..b5326ad74 100644
--- a/front/src/modules/ui/data/filter/scopes/scope-internal-context/FilterScopeInternalContext.ts
+++ b/front/src/modules/ui/data/filter/scopes/scope-internal-context/FilterScopeInternalContext.ts
@@ -1,8 +1,10 @@
import { ScopedStateKey } from '@/ui/utilities/recoil-scope/scopes-internal/types/ScopedStateKey';
import { createScopeInternalContext } from '@/ui/utilities/recoil-scope/scopes-internal/utils/createScopeInternalContext';
+import { Filter } from '../../types/Filter';
+
type FilterScopeInternalContextProps = ScopedStateKey & {
- test?: string;
+ onFilterSelect?: (sort: Filter) => void;
};
export const FilterScopeInternalContext =
diff --git a/front/src/modules/views/states/availableFiltersScopedState.ts b/front/src/modules/ui/data/filter/states/availableFilterDefinitionsScopedState.ts
similarity index 64%
rename from front/src/modules/views/states/availableFiltersScopedState.ts
rename to front/src/modules/ui/data/filter/states/availableFilterDefinitionsScopedState.ts
index 9c38f3952..d1949810c 100644
--- a/front/src/modules/views/states/availableFiltersScopedState.ts
+++ b/front/src/modules/ui/data/filter/states/availableFilterDefinitionsScopedState.ts
@@ -1,9 +1,9 @@
import { FilterDefinition } from '@/ui/data/filter/types/FilterDefinition';
import { createScopedState } from '@/ui/utilities/recoil-scope/utils/createScopedState';
-export const availableFiltersScopedState = createScopedState<
+export const availableFilterDefinitionsScopedState = createScopedState<
FilterDefinition[]
>({
- key: 'availableFiltersScopedState',
+ key: 'availableFilterDefinitionsScopedState',
defaultValue: [],
});
diff --git a/front/src/modules/ui/data/filter/states/selectedFilterScopedState.ts b/front/src/modules/ui/data/filter/states/selectedFilterScopedState.ts
new file mode 100644
index 000000000..a7e81e80d
--- /dev/null
+++ b/front/src/modules/ui/data/filter/states/selectedFilterScopedState.ts
@@ -0,0 +1,8 @@
+import { createScopedState } from '@/ui/utilities/recoil-scope/utils/createScopedState';
+
+import { Filter } from '../types/Filter';
+
+export const selectedFilterScopedState = createScopedState({
+ key: 'selectedFilterScopedState',
+ defaultValue: undefined,
+});
diff --git a/front/src/modules/ui/data/filter/states/selectedFiltersScopedState.ts b/front/src/modules/ui/data/filter/states/selectedFiltersScopedState.ts
deleted file mode 100644
index 716548451..000000000
--- a/front/src/modules/ui/data/filter/states/selectedFiltersScopedState.ts
+++ /dev/null
@@ -1,8 +0,0 @@
-import { createScopedState } from '@/ui/utilities/recoil-scope/utils/createScopedState';
-
-import { Filter } from '../types/Filter';
-
-export const selectedFiltersScopedState = createScopedState({
- key: 'selectedFiltersScopedState',
- defaultValue: [],
-});
diff --git a/front/src/modules/ui/data/filter/types/Filter.ts b/front/src/modules/ui/data/filter/types/Filter.ts
index 3d415f596..a41fdfdb4 100644
--- a/front/src/modules/ui/data/filter/types/Filter.ts
+++ b/front/src/modules/ui/data/filter/types/Filter.ts
@@ -1,12 +1,12 @@
import { ViewFilterOperand } from '@/views/types/ViewFilterOperand';
-import { FilterType } from './FilterType';
+import { FilterDefinition } from './FilterDefinition';
export type Filter = {
- key: string;
- type: FilterType;
+ fieldId: string;
value: string;
displayValue: string;
displayAvatarUrl?: string;
operand: ViewFilterOperand;
+ definition: FilterDefinition;
};
diff --git a/front/src/modules/ui/data/filter/types/FilterDefinition.ts b/front/src/modules/ui/data/filter/types/FilterDefinition.ts
index 79cc6b74d..dd9bc07f5 100644
--- a/front/src/modules/ui/data/filter/types/FilterDefinition.ts
+++ b/front/src/modules/ui/data/filter/types/FilterDefinition.ts
@@ -3,7 +3,7 @@ import { IconComponent } from '@/ui/display/icon/types/IconComponent';
import { FilterType } from './FilterType';
export type FilterDefinition = {
- key: string;
+ fieldId: string;
label: string;
Icon: IconComponent;
type: FilterType;
diff --git a/front/src/modules/ui/data/filter/types/FilterDefinitionByEntity.ts b/front/src/modules/ui/data/filter/types/FilterDefinitionByEntity.ts
index 3449d7254..f351f9e01 100644
--- a/front/src/modules/ui/data/filter/types/FilterDefinitionByEntity.ts
+++ b/front/src/modules/ui/data/filter/types/FilterDefinitionByEntity.ts
@@ -1,5 +1,5 @@
import { FilterDefinition } from './FilterDefinition';
export type FilterDefinitionByEntity = FilterDefinition & {
- key: keyof T;
+ fieldId: keyof T;
};
diff --git a/front/src/modules/ui/data/filter/utils/turnFilterIntoWhereClause.ts b/front/src/modules/ui/data/filter/utils/turnFilterIntoWhereClause.ts
index cc749e38c..1776b7f90 100644
--- a/front/src/modules/ui/data/filter/utils/turnFilterIntoWhereClause.ts
+++ b/front/src/modules/ui/data/filter/utils/turnFilterIntoWhereClause.ts
@@ -3,28 +3,39 @@ import { QueryMode } from '~/generated/graphql';
import { Filter } from '../types/Filter';
-export const turnFilterIntoWhereClause = (filter: Filter) => {
+type FilterToTurnIntoWhereClause = Omit & {
+ definition: {
+ type: Filter['definition']['type'];
+ };
+};
+
+export const turnFilterIntoWhereClause = (
+ filter: FilterToTurnIntoWhereClause | undefined,
+) => {
+ if (!filter) {
+ return {};
+ }
switch (filter.operand) {
case ViewFilterOperand.IsNotNull:
return {
- [filter.key]: {
+ [filter.fieldId]: {
not: null,
},
};
default:
- switch (filter.type) {
+ switch (filter.definition.type) {
case 'text':
switch (filter.operand) {
case ViewFilterOperand.Contains:
return {
- [filter.key]: {
+ [filter.fieldId]: {
contains: filter.value,
mode: QueryMode.Insensitive,
},
};
case ViewFilterOperand.DoesNotContain:
return {
- [filter.key]: {
+ [filter.fieldId]: {
not: {
contains: filter.value,
mode: QueryMode.Insensitive,
@@ -33,64 +44,64 @@ export const turnFilterIntoWhereClause = (filter: Filter) => {
};
default:
throw new Error(
- `Unknown operand ${filter.operand} for ${filter.type} filter`,
+ `Unknown operand ${filter.operand} for ${filter.definition.type} filter`,
);
}
case 'number':
switch (filter.operand) {
case ViewFilterOperand.GreaterThan:
return {
- [filter.key]: {
+ [filter.fieldId]: {
gte: parseFloat(filter.value),
},
};
case ViewFilterOperand.LessThan:
return {
- [filter.key]: {
+ [filter.fieldId]: {
lte: parseFloat(filter.value),
},
};
default:
throw new Error(
- `Unknown operand ${filter.operand} for ${filter.type} filter`,
+ `Unknown operand ${filter.operand} for ${filter.definition.type} filter`,
);
}
case 'date':
switch (filter.operand) {
case ViewFilterOperand.GreaterThan:
return {
- [filter.key]: {
+ [filter.fieldId]: {
gte: filter.value,
},
};
case ViewFilterOperand.LessThan:
return {
- [filter.key]: {
+ [filter.fieldId]: {
lte: filter.value,
},
};
default:
throw new Error(
- `Unknown operand ${filter.operand} for ${filter.type} filter`,
+ `Unknown operand ${filter.operand} for ${filter.definition.type} filter`,
);
}
case 'entity':
switch (filter.operand) {
case ViewFilterOperand.Is:
return {
- [filter.key]: {
+ [filter.fieldId]: {
equals: filter.value,
},
};
case ViewFilterOperand.IsNot:
return {
- [filter.key]: {
+ [filter.fieldId]: {
not: { equals: filter.value },
},
};
default:
throw new Error(
- `Unknown operand ${filter.operand} for ${filter.type} filter`,
+ `Unknown operand ${filter.operand} for ${filter.definition.type} filter`,
);
}
default:
diff --git a/front/src/modules/ui/data/sort/components/SortDropdownButton.tsx b/front/src/modules/ui/data/sort/components/SortDropdownButton.tsx
index 10e59ee64..9cfc6904e 100644
--- a/front/src/modules/ui/data/sort/components/SortDropdownButton.tsx
+++ b/front/src/modules/ui/data/sort/components/SortDropdownButton.tsx
@@ -35,7 +35,7 @@ export const SortDropdownButton = ({
setSelectedSortDirection('asc');
}, []);
- const { availableSorts, onSortAdd, isSortSelected } = useSort();
+ const { availableSortDefinitions, onSortSelect, isSortSelected } = useSort();
const { toggleDropdown } = useDropdown({
dropdownScopeId: SortDropdownId,
@@ -48,8 +48,8 @@ export const SortDropdownButton = ({
const handleAddSort = (selectedSortDefinition: SortDefinition) => {
toggleDropdown();
- onSortAdd?.({
- key: selectedSortDefinition.key,
+ onSortSelect?.({
+ fieldId: selectedSortDefinition.fieldId,
direction: selectedSortDirection,
definition: selectedSortDefinition,
});
@@ -96,7 +96,7 @@ export const SortDropdownButton = ({
- {availableSorts.map((availableSort, index) => (
+ {availableSortDefinitions.map((availableSort, index) => (
|