Skip to content

Commit d71e0d4

Browse files
edition seems ok, need ts
1 parent b20036e commit d71e0d4

File tree

6 files changed

+162
-60
lines changed

6 files changed

+162
-60
lines changed

opencti-platform/opencti-front/src/components/saved_filters/SavedFilterButton.tsx

Lines changed: 29 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import { useDataTableContext } from 'src/components/dataGrid/components/DataTabl
88
import { graphql } from 'react-relay';
99
import useApiMutation from 'src/utils/hooks/useApiMutation';
1010
import { type SavedFiltersSelectionData } from 'src/components/saved_filters/SavedFilterSelection';
11+
import Badge from '@mui/material/Badge';
1112

1213
const savedFilterButtonEditMutation = graphql`
1314
mutation SavedFilterButtonEditMutation($id: ID!, $filters: String!) {
@@ -21,10 +22,11 @@ const savedFilterButtonEditMutation = graphql`
2122
`;
2223

2324
type SavedFilterButtonProps = {
24-
currentSavedFilter: SavedFiltersSelectionData
25+
currentSavedFilter?: SavedFiltersSelectionData
26+
setCurrentSavedFilter: (savedFilter: SavedFiltersSelectionData | undefined) => void;
2527
};
2628

27-
const SavedFilterButton = ({ currentSavedFilter }: SavedFilterButtonProps) => {
29+
const SavedFilterButton = ({ currentSavedFilter, setCurrentSavedFilter }: SavedFilterButtonProps) => {
2830
const { t_i18n } = useFormatter();
2931

3032
const [isSavedDialogOpen, setIsSavedDialogOpen] = useState<boolean>(false);
@@ -36,36 +38,49 @@ const SavedFilterButton = ({ currentSavedFilter }: SavedFilterButtonProps) => {
3638
},
3739
} = useDataTableContext();
3840

41+
const isEmptyFilters = !filters?.filters.length && !filters?.filterGroups.length;
42+
const hasSameFilters = currentSavedFilter?.filters === JSON.stringify(filters);
43+
3944
const [commit] = useApiMutation(
4045
savedFilterButtonEditMutation,
4146
undefined,
4247
{ successMessage: 'edit ok' },
4348
);
4449

4550
const handleEditSavedFilter = () => {
51+
if (!currentSavedFilter) return;
4652
commit({
4753
variables: {
4854
id: currentSavedFilter.id,
4955
filters: JSON.stringify(filters),
5056
},
51-
updater: (store, item) => {
52-
console.log('item : ', item);
53-
console.log('currentSavedFilter : ', currentSavedFilter);
54-
} });
57+
onCompleted: () => {
58+
setCurrentSavedFilter({
59+
...currentSavedFilter,
60+
filters: JSON.stringify(filters),
61+
} as SavedFiltersSelectionData);
62+
},
63+
});
5564
};
5665

5766
const handleOpenDialog = () => setIsSavedDialogOpen(true);
5867
const handleCloseDialog = () => setIsSavedDialogOpen(false);
5968

6069
const handleSaveButtonClick = () => {
61-
if (true) {
62-
console.log('HERE SAVED EDIT');
70+
if (!hasSameFilters && currentSavedFilter) {
6371
handleEditSavedFilter();
6472
} else {
6573
handleOpenDialog();
6674
}
6775
};
6876

77+
const renderBadge = () => (
78+
<Badge color="warning" overlap="circular" variant="dot">
79+
<SaveOutlined />
80+
</Badge>
81+
);
82+
const isDisabled = isEmptyFilters || hasSameFilters;
83+
6984
const isRestrictedStorageKey = localStorageKey.includes('_stixCoreRelationshipCreationFromEntity');
7085
if (isRestrictedStorageKey) return null;
7186

@@ -77,17 +92,21 @@ const SavedFilterButton = ({ currentSavedFilter }: SavedFilterButtonProps) => {
7792
color="primary"
7893
onClick={handleSaveButtonClick}
7994
size="small"
80-
disabled={!filters?.filters.length && !filters?.filterGroups.length}
95+
disabled={isDisabled}
8196
aria-label={t_i18n('Save')}
8297
>
83-
<SaveOutlined />
98+
{!hasSameFilters && currentSavedFilter
99+
? renderBadge()
100+
: <SaveOutlined />
101+
}
84102
</IconButton>
85103
</span>
86104
</Tooltip>
87105

88106
{isSavedDialogOpen && (
89107
<SavedFilterCreateDialog
90108
isOpen={isSavedDialogOpen}
109+
setCurrentSavedFilter={setCurrentSavedFilter}
91110
onClose={handleCloseDialog}
92111
/>
93112
)}

opencti-platform/opencti-front/src/components/saved_filters/SavedFilterCreateDialog.tsx

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@ import TextField from '@mui/material/TextField';
99
import { graphql } from 'react-relay';
1010
import { useDataTableContext } from 'src/components/dataGrid/components/DataTableContext';
1111
import { insertNode } from 'src/utils/store';
12+
import { type SavedFiltersSelectionData } from 'src/components/saved_filters/SavedFilterSelection';
13+
import { SavedFilterCreateDialogMutation$data } from 'src/components/saved_filters/__generated__/SavedFilterCreateDialogMutation.graphql';
1214
import useApiMutation from '../../utils/hooks/useApiMutation';
1315
import getSavedFilterScopeFilter from './getSavedFilterScopeFilter';
1416

@@ -26,9 +28,10 @@ const savedFilterCreateDialogMutation = graphql`
2628
type SavedFilterDialogProps = {
2729
onClose: () => void;
2830
isOpen: boolean;
31+
setCurrentSavedFilter: (savedFilter: SavedFiltersSelectionData | undefined) => void;
2932
};
3033

31-
const SavedFilterCreateDialog = ({ isOpen, onClose }: SavedFilterDialogProps) => {
34+
const SavedFilterCreateDialog = ({ isOpen, onClose, setCurrentSavedFilter }: SavedFilterDialogProps) => {
3235
const { t_i18n } = useFormatter();
3336

3437
const {
@@ -65,7 +68,9 @@ const SavedFilterCreateDialog = ({ isOpen, onClose }: SavedFilterDialogProps) =>
6568
const scopeFilter = getSavedFilterScopeFilter(localStorageKey);
6669
insertNode(store, 'SavedFilters_savedFilters', { filters: scopeFilter }, 'savedFilterAdd');
6770
},
68-
onCompleted: () => {
71+
onCompleted: (response) => {
72+
const { savedFilterAdd } = response as SavedFilterCreateDialogMutation$data;
73+
setCurrentSavedFilter(savedFilterAdd as SavedFiltersSelectionData);
6974
onClose();
7075
},
7176
onError: () => {

opencti-platform/opencti-front/src/components/saved_filters/SavedFilterSelection.tsx

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,15 +9,16 @@ export type SavedFiltersSelectionData = NonNullable<NonNullable<SavedFiltersQuer
99
type SavedFilterSelectionProps = {
1010
isDisabled: boolean;
1111
data: SavedFiltersSelectionData[];
12-
setCurrentSavedFilter: (savedFilter: SavedFiltersSelectionData) => void;
12+
currentSavedFilter?: SavedFiltersSelectionData;
13+
setCurrentSavedFilter: (savedFilter: SavedFiltersSelectionData | undefined) => void;
1314
};
1415

1516
export type AutocompleteOptionType = {
1617
label: string;
1718
value: SavedFiltersSelectionData;
1819
};
1920

20-
const SavedFilterSelection = ({ isDisabled, data, setCurrentSavedFilter }: SavedFilterSelectionProps) => {
21+
const SavedFilterSelection = ({ isDisabled, data, currentSavedFilter, setCurrentSavedFilter }: SavedFilterSelectionProps) => {
2122
const {
2223
useDataTablePaginationLocalStorage: {
2324
helpers,
@@ -34,6 +35,16 @@ const SavedFilterSelection = ({ isDisabled, data, setCurrentSavedFilter }: Saved
3435
value: item,
3536
}));
3637

38+
useEffect(() => {
39+
if (currentSavedFilter && !selectedSavedFilter) {
40+
setSelectedSavedFilter({
41+
label: currentSavedFilter.name,
42+
value: currentSavedFilter,
43+
});
44+
setInputValue(currentSavedFilter.name);
45+
}
46+
}, [currentSavedFilter]);
47+
3748
const handleResetInput = () => {
3849
setSelectedSavedFilter(undefined);
3950
setCurrentSavedFilter(undefined);

opencti-platform/opencti-front/src/components/saved_filters/SavedFilters.tsx

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -24,26 +24,29 @@ const savedFiltersQuery = graphql`
2424

2525
type SavedFiltersComponentProps = {
2626
queryRef: PreloadedQuery<SavedFiltersQuery>;
27-
setCurrentSavedFilter: (savedFilter: SavedFiltersSelectionData) => void;
27+
currentSavedFilter?: SavedFiltersSelectionData;
28+
setCurrentSavedFilter: (savedFilter: SavedFiltersSelectionData | undefined) => void;
2829
};
2930

30-
const SavedFiltersComponent = ({ queryRef, setCurrentSavedFilter }: SavedFiltersComponentProps) => {
31+
const SavedFiltersComponent = ({ queryRef, currentSavedFilter, setCurrentSavedFilter }: SavedFiltersComponentProps) => {
3132
const { savedFilters } = usePreloadedQuery(savedFiltersQuery, queryRef);
3233

3334
return (
3435
<SavedFilterSelection
3536
isDisabled={!savedFilters?.edges?.length}
3637
data={savedFilters?.edges?.map(({ node }) => node) ?? []}
38+
currentSavedFilter={currentSavedFilter}
3739
setCurrentSavedFilter={setCurrentSavedFilter}
3840
/>
3941
);
4042
};
4143

4244
type SavedFiltersProps = {
43-
setCurrentSavedFilter: (savedFilter: SavedFiltersSelectionData) => void;
45+
currentSavedFilter?: SavedFiltersSelectionData;
46+
setCurrentSavedFilter: (savedFilter: SavedFiltersSelectionData | undefined) => void;
4447
};
4548

46-
const SavedFilters = ({ setCurrentSavedFilter }: SavedFiltersProps) => {
49+
const SavedFilters = ({ currentSavedFilter, setCurrentSavedFilter }: SavedFiltersProps) => {
4750
const {
4851
useDataTablePaginationLocalStorage: {
4952
localStorageKey,
@@ -61,7 +64,13 @@ const SavedFilters = ({ setCurrentSavedFilter }: SavedFiltersProps) => {
6164
return (
6265
<>
6366
{queryRef
64-
? <SavedFiltersComponent queryRef={queryRef} setCurrentSavedFilter={setCurrentSavedFilter} />
67+
? (
68+
<SavedFiltersComponent
69+
queryRef={queryRef}
70+
currentSavedFilter={currentSavedFilter}
71+
setCurrentSavedFilter={setCurrentSavedFilter}
72+
/>
73+
)
6574
: <SavedFiltersAutocomplete isDisabled />
6675
}
6776
</>

opencti-platform/opencti-front/src/private/components/common/lists/Filters.tsx

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ const Filters: FunctionComponent<FiltersProps> = ({
5151
required = false,
5252
}) => {
5353
const navigate = useNavigate();
54-
const [open, setOpen] = useState(false);
54+
const [isOpen, setIsOpen] = useState<boolean>(false);
5555
const [anchorEl, setAnchorEl] = useState<Element | null>(null);
5656
const [filters, setFilters] = useState<FilterGroup | undefined>(
5757
emptyFilterGroup,
@@ -60,13 +60,14 @@ const Filters: FunctionComponent<FiltersProps> = ({
6060
[],
6161
);
6262
const [keyword, setKeyword] = useState('');
63-
const entityTypes = searchContext?.entityTypes ?? ['Stix-Core-Object'];
63+
const entityTypes: string[] = searchContext?.entityTypes ?? ['Stix-Core-Object'];
64+
6465
const handleOpenFilters = (event: React.SyntheticEvent) => {
65-
setOpen(true);
66+
setIsOpen(true);
6667
setAnchorEl(event.currentTarget);
6768
};
6869
const handleCloseFilters = () => {
69-
setOpen(false);
70+
setIsOpen(false);
7071
setAnchorEl(null);
7172
};
7273
const { filterKeysSchema } = useAuth().schema;
@@ -114,7 +115,7 @@ const Filters: FunctionComponent<FiltersProps> = ({
114115
disabled={disabled}
115116
size={size}
116117
fontSize={fontSize}
117-
open={open}
118+
open={isOpen}
118119
filters={filters}
119120
handleCloseFilters={handleCloseFilters}
120121
defaultHandleRemoveFilter={defaultHandleRemoveFilter}
@@ -132,11 +133,9 @@ const Filters: FunctionComponent<FiltersProps> = ({
132133
<>
133134
{helpers ? (
134135
<ListFilters
135-
size={size}
136-
fontSize={fontSize}
137136
handleOpenFilters={handleOpenFilters}
138137
handleCloseFilters={handleCloseFilters}
139-
open={open}
138+
isOpen={isOpen}
140139
anchorEl={anchorEl}
141140
availableFilterKeys={uniq(availableFilterKeys)}
142141
filterElement={filterElement}
@@ -153,7 +152,7 @@ const Filters: FunctionComponent<FiltersProps> = ({
153152
fontSize={fontSize}
154153
handleOpenFilters={handleOpenFilters}
155154
handleCloseFilters={handleCloseFilters}
156-
open={open}
155+
open={isOpen}
157156
anchorEl={anchorEl}
158157
filterElement={filterElement}
159158
variant={variant}

0 commit comments

Comments
 (0)