Skip to content

Commit

Permalink
[frontend] Improve Creation user experience (#5844)
Browse files Browse the repository at this point in the history
  • Loading branch information
Goumies committed Jun 4, 2024
1 parent 4ed50ba commit f4ab5ec
Show file tree
Hide file tree
Showing 9 changed files with 38 additions and 5 deletions.
1 change: 1 addition & 0 deletions opencti-platform/opencti-front/lang/front/de.json
Original file line number Diff line number Diff line change
Expand Up @@ -1511,6 +1511,7 @@
"Minimum one event type": "Mindestens ein Ereignistyp",
"Minimum one notifier": "Mindestens ein Anmelder",
"Minimum one trigger": "Mindestens ein Auslöser",
"Minimum one entity type": "Mindestens ein Entitätstyp",
"MinIO": "MinIO",
"minutes": "minuten",
"minutes left": "minuten übrig",
Expand Down
1 change: 1 addition & 0 deletions opencti-platform/opencti-front/lang/front/en.json
Original file line number Diff line number Diff line change
Expand Up @@ -1511,6 +1511,7 @@
"Minimum one event type": "Minimum one event type",
"Minimum one notifier": "Minimum one notifier",
"Minimum one trigger": "Minimum one trigger",
"Minimum one entity type": "Minimum one entity type",
"MinIO": "MinIO",
"minutes": "minutes",
"minutes left": "minutes left",
Expand Down
1 change: 1 addition & 0 deletions opencti-platform/opencti-front/lang/front/es.json
Original file line number Diff line number Diff line change
Expand Up @@ -1511,6 +1511,7 @@
"Minimum one event type": "Mínimo un tipo de evento",
"Minimum one notifier": "Mínimo un notificador",
"Minimum one trigger": "Mínimo un disparador",
"Minimum one entity type": "Mínimo un tipo de entidad",
"MinIO": "MinIO",
"minutes": "minutos",
"minutes left": "minutos restantes",
Expand Down
5 changes: 3 additions & 2 deletions opencti-platform/opencti-front/lang/front/fr.json
Original file line number Diff line number Diff line change
Expand Up @@ -1508,9 +1508,10 @@
"Mini map": "Mini carte",
"minimal": "minimal",
"Minimum": "Minimum",
"Minimum one event type": "Minimum un type d'événement",
"Minimum one event type": "Au moins un type d'événement",
"Minimum one notifier": "Au moins un notifiant",
"Minimum one trigger": "Minimum un trigger",
"Minimum one trigger": "Au moins un trigger",
"Minimum one entity type": "Au moins un type d'entité",
"MinIO": "MinIO",
"minutes": "minutes",
"minutes left": "minutes restantes",
Expand Down
1 change: 1 addition & 0 deletions opencti-platform/opencti-front/lang/front/ja.json
Original file line number Diff line number Diff line change
Expand Up @@ -1511,6 +1511,7 @@
"Minimum one event type": "最低1つのイベントタイプ",
"Minimum one notifier": "最低1人の通知者",
"Minimum one trigger": "最小 1 つのトリガー",
"Minimum one entity type": "少なくとも 1 つのエンティティ タイプ",
"MinIO": "MinIO",
"minutes": "",
"minutes left": "残り時間",
Expand Down
1 change: 1 addition & 0 deletions opencti-platform/opencti-front/lang/front/zh.json
Original file line number Diff line number Diff line change
Expand Up @@ -1511,6 +1511,7 @@
"Minimum one event type": "最少一种事件类型",
"Minimum one notifier": "最少一个通知者",
"Minimum one trigger": "最少一个触发器",
"Minimum one entity type": "至少一种实体类型",
"MinIO": "MinIO",
"minutes": "分钟",
"minutes left": "还剩几分钟",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,13 @@ import SwitchField from '../../../../components/fields/SwitchField';
import useAttributes from '../../../../utils/hooks/useAttributes';
import { stixCyberObservablesLinesAttributesQuery } from '../../observations/stix_cyber_observables/StixCyberObservablesLines';
import Filters from '../../common/lists/Filters';
import { emptyFilterGroup, serializeFilterGroupForBackend, useBuildFilterKeysMapFromEntityType } from '../../../../utils/filters/filtersUtils';
import {
emptyFilterGroup,
extractAllFilters,
serializeFilterGroupForBackend,
useBuildFilterKeysMapFromEntityType,
useCompleteFilterKeysMap,
} from '../../../../utils/filters/filtersUtils';
import FilterIconButton from '../../../../components/FilterIconButton';
import { generateUniqueItemsArray, isNotEmptyField } from '../../../../utils/utils';
import { fieldSpacingContainerStyle } from '../../../../utils/field';
Expand Down Expand Up @@ -140,7 +146,7 @@ const feedCreationValidation = (t_i18n: (s: string) => string) => Yup.object().s
name: Yup.string().required(t_i18n('This field is required')),
separator: Yup.string().required(t_i18n('This field is required')),
rolling_time: Yup.number().required(t_i18n('This field is required')),
feed_types: Yup.array().required(t_i18n('This field is required')),
feed_types: Yup.array().min(1, t_i18n('Minimum one entity type')).required(t_i18n('This field is required')),
feed_public: Yup.bool().nullable(),
authorized_members: Yup.array().nullable(),
});
Expand All @@ -152,6 +158,7 @@ const FeedCreation: FunctionComponent<FeedCreationFormProps> = (props) => {
const [selectedTypes, setSelectedTypes] = useState<string[]>([]);
const [filters, helpers] = useFiltersState(emptyFilterGroup);

const completeFilterKeysMap = useCompleteFilterKeysMap();
const filterKeysMap = useBuildFilterKeysMapFromEntityType(selectedTypes);
const availableFilterKeys = generateUniqueItemsArray(filterKeysMap.keys() ?? []);

Expand All @@ -167,8 +174,16 @@ const FeedCreation: FunctionComponent<FeedCreationFormProps> = (props) => {
setFeedAttributes({ 0: {} });
};

const cleanFeedFilters = (types: string[]) => {
const newAvailableFilterKeys = generateUniqueItemsArray(types.flatMap((t) => Array.from(completeFilterKeysMap.get(t)?.keys() ?? [])));
const allListedFilters = extractAllFilters(filters);
const filtersToRemoveIds = allListedFilters.filter((f) => !newAvailableFilterKeys.includes(f.key)).map((f) => f.id ?? '');
filtersToRemoveIds.forEach((id) => helpers.handleRemoveFilterById(id));
};

const handleSelectTypes = (types: string[]) => {
setSelectedTypes(types);
cleanFeedFilters(types);
// feed attributes must be eventually cleanup in case of types removal
const attrValues = R.values(feedAttributes);
// noinspection JSMismatchedCollectionQueryUpdate
Expand Down
12 changes: 12 additions & 0 deletions opencti-platform/opencti-front/src/utils/filters/filtersUtils.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -661,6 +661,11 @@ export const getAvailableOperatorForFilter = (
return getAvailableOperatorForFilterKey(filterDefinition);
};

export const useCompleteFilterKeysMap = () => {
const { filterKeysSchema } = useAuth().schema;
return filterKeysSchema;
};

export const useBuildFilterKeysMapFromEntityType = (entityTypes = ['Stix-Core-Object']): Map<string, FilterDefinition> => {
const { filterKeysSchema } = useAuth().schema;
// 1. case one entity type
Expand Down Expand Up @@ -863,3 +868,10 @@ export const convertOperatorToIcon = (operator: string) => {
return null;
}
};

export const extractAllFilters: (filters: FilterGroup) => Filter[] = (filters: FilterGroup) => {
const allFilters: Filter[] = [];
allFilters.push(...filters.filters);
filters.filterGroups.forEach((filterGroup) => extractAllFilters(filterGroup));
return allFilters;
};
2 changes: 1 addition & 1 deletion opencti-platform/opencti-front/src/utils/utils.ts
Original file line number Diff line number Diff line change
Expand Up @@ -43,4 +43,4 @@ export const getFileUri = (id: string) => {
return imageView;
};

export const generateUniqueItemsArray = <T>(submittedArray: IterableIterator<T>) => Array.from(new Set(submittedArray));
export const generateUniqueItemsArray = <T>(submittedArray: IterableIterator<T> | Array<T>) => Array.from(new Set(submittedArray));

0 comments on commit f4ab5ec

Please sign in to comment.