From ca6a5e71e937b9b368d6acfad9c51b7dedc71213 Mon Sep 17 00:00:00 2001 From: nick-delirium Date: Fri, 22 Nov 2024 16:27:04 +0100 Subject: [PATCH] ui: split up search component (1.22+ tbd?), restrict filter type to own modals --- .../components/FilterSeries/FilterSeries.tsx | 4 +- .../shared/Filters/FilterList/FilterList.tsx | 240 +++++++++--------- .../shared/Filters/FilterList/index.ts | 2 +- .../Filters/FilterModal/FilterModal.tsx | 11 +- .../FilterSelection/FilterSelection.tsx | 6 +- .../LiveSessionSearch/LiveSessionSearch.tsx | 2 +- .../shared/SessionFilters/SessionFilters.tsx | 13 +- 7 files changed, 155 insertions(+), 123 deletions(-) diff --git a/frontend/app/components/Dashboard/components/FilterSeries/FilterSeries.tsx b/frontend/app/components/Dashboard/components/FilterSeries/FilterSeries.tsx index af5ec52a3..663c47181 100644 --- a/frontend/app/components/Dashboard/components/FilterSeries/FilterSeries.tsx +++ b/frontend/app/components/Dashboard/components/FilterSeries/FilterSeries.tsx @@ -1,5 +1,5 @@ import React, { useEffect, useState } from 'react'; -import FilterList from 'Shared/Filters/FilterList'; +import { EventsList } from 'Shared/Filters/FilterList'; import SeriesName from './SeriesName'; import cn from 'classnames'; import { observer } from 'mobx-react-lite'; @@ -202,7 +202,7 @@ function FilterSeries(props: Props) { )} {expanded ? ( - void; + mergeDown?: boolean; + mergeUp?: boolean; } -function FilterList(props: Props) { +export const FilterList = observer((props: Props) => { + const { + observeChanges = () => {}, + filter, + excludeFilterKeys = [], + isConditional, + onAddFilter, + } = props; + + const filters = filter.filters; + useEffect(observeChanges, [filters]); + + const onRemoveFilter = (filterIndex: any) => { + props.onRemoveFilter(filterIndex); + }; + return ( +
+
+
Filters
+ + + +
+ {filters.map((filter: any, filterIndex: any) => + !filter.isEvent ? ( +
+ props.onUpdateFilter(filterIndex, filter)} + onRemoveFilter={() => onRemoveFilter(filterIndex)} + excludeFilterKeys={excludeFilterKeys} + isConditional={isConditional} + /> +
+ ) : null + )} +
+ ); +}); + +export const EventsList = observer((props: Props) => { const { observeChanges = () => {}, filter, @@ -37,7 +98,6 @@ function FilterList(props: Props) { isConditional, actions = [], onAddFilter, - onlyFilters, } = props; const filters = filter.filters; @@ -113,125 +173,81 @@ function FilterList(props: Props) { const eventsNum = filters.filter((i: any) => i.isEvent).length; return ( -
- {onlyFilters ? null : (
-
-
- {filter.eventsHeader || 'Events'} -
- - - +
+
+
{filter.eventsHeader || 'Events'}
+ + + -
- {!hideEventsOrder && ( - - )} - {actions && - actions.map((action, index) =>
{action}
)} -
-
-
- {filters.map((filter: any, filterIndex: number) => - filter.isEvent ? ( -
handleDragOverEv(e, filterIndex)} - onDrop={(e) => handleDrop(e)} - key={`${filter.key}-${filterIndex}`} - > - {!!props.onFilterMove && eventsNum > 1 ? ( -
- handleDragStart( - e, - filterIndex, - `${filter.key}-${filterIndex}` - ) - } - > - -
- ) : null} - - props.onUpdateFilter(filterIndex, filter) - } - onRemoveFilter={() => onRemoveFilter(filterIndex)} - saveRequestPayloads={saveRequestPayloads} - disableDelete={cannotDeleteFilter} - excludeFilterKeys={excludeFilterKeys} - readonly={props.readonly} - isConditional={isConditional} - /> -
- ) : null - )} -
-
)} - -
-
-
Filters
- - - +
+ {!hideEventsOrder && ( + + )} + {actions && + actions.map((action, index) =>
{action}
)}
- {filters.map((filter: any, filterIndex: any) => - !filter.isEvent ? ( +
+
+ {filters.map((filter: any, filterIndex: number) => + filter.isEvent ? (
handleDragOverEv(e, filterIndex)} + onDrop={(e) => handleDrop(e)} + key={`${filter.key}-${filterIndex}`} > + {!!props.onFilterMove && eventsNum > 1 ? ( +
+ handleDragStart( + e, + filterIndex, + `${filter.key}-${filterIndex}` + ) + } + > + +
+ ) : null} props.onUpdateFilter(filterIndex, filter)} onRemoveFilter={() => onRemoveFilter(filterIndex)} + saveRequestPayloads={saveRequestPayloads} + disableDelete={cannotDeleteFilter} excludeFilterKeys={excludeFilterKeys} + readonly={props.readonly} isConditional={isConditional} />
@@ -240,6 +256,4 @@ function FilterList(props: Props) {
); -} - -export default observer(FilterList); +}); diff --git a/frontend/app/components/shared/Filters/FilterList/index.ts b/frontend/app/components/shared/Filters/FilterList/index.ts index ecf0adf70..cce8ebe5e 100644 --- a/frontend/app/components/shared/Filters/FilterList/index.ts +++ b/frontend/app/components/shared/Filters/FilterList/index.ts @@ -1 +1 @@ -export { default } from './FilterList'; \ No newline at end of file +export { FilterList, EventsList } from './FilterList'; \ No newline at end of file diff --git a/frontend/app/components/shared/Filters/FilterModal/FilterModal.tsx b/frontend/app/components/shared/Filters/FilterModal/FilterModal.tsx index d5003cc7c..2139acdf0 100644 --- a/frontend/app/components/shared/Filters/FilterModal/FilterModal.tsx +++ b/frontend/app/components/shared/Filters/FilterModal/FilterModal.tsx @@ -80,13 +80,16 @@ const IconMap = { function filterJson( jsonObj: Record, excludeKeys: string[] = [], - allowedFilterKeys: string[] = [] + allowedFilterKeys: string[] = [], + mode: 'filters' | 'events' ): Record { return Object.fromEntries( Object.entries(jsonObj) .map(([key, value]) => { - const arr = value.filter((i: { key: string }) => { + const arr = value.filter((i: { key: string, isEvent: boolean }) => { if (excludeKeys.includes(i.key)) return false; + if (mode === 'events' && !i.isEvent) return false; + if (mode === 'filters' && i.isEvent) return false; return !( allowedFilterKeys.length > 0 && !allowedFilterKeys.includes(i.key) ); @@ -139,6 +142,7 @@ interface Props { allowedFilterKeys?: Array; isConditional?: boolean; isMobile?: boolean; + mode: 'filters' | 'events'; } function FilterModal(props: Props) { @@ -149,6 +153,7 @@ function FilterModal(props: Props) { excludeFilterKeys = [], allowedFilterKeys = [], isConditional, + mode, } = props; const [searchQuery, setSearchQuery] = React.useState(''); const [category, setCategory] = React.useState('ALL'); @@ -182,7 +187,7 @@ function FilterModal(props: Props) { : filters; const { matchingCategories, matchingFilters } = getMatchingEntries( searchQuery, - filterJson(filterJsonObj, excludeFilterKeys, allowedFilterKeys) + filterJson(filterJsonObj, excludeFilterKeys, allowedFilterKeys, mode) ); const isResultEmpty = diff --git a/frontend/app/components/shared/Filters/FilterSelection/FilterSelection.tsx b/frontend/app/components/shared/Filters/FilterSelection/FilterSelection.tsx index f3a8de136..46577daaa 100644 --- a/frontend/app/components/shared/Filters/FilterSelection/FilterSelection.tsx +++ b/frontend/app/components/shared/Filters/FilterSelection/FilterSelection.tsx @@ -1,7 +1,6 @@ import React, { useState } from 'react'; import FilterModal from '../FilterModal'; import OutsideClickDetectingDiv from 'Shared/OutsideClickDetectingDiv'; -import { Icon } from 'UI'; import { assist as assistRoute, isRoute } from 'App/routes'; import cn from 'classnames'; import { observer } from 'mobx-react-lite'; @@ -17,6 +16,7 @@ interface Props { disabled?: boolean; isConditional?: boolean; isMobile?: boolean; + mode: 'filters' | 'events'; } function FilterSelection(props: Props) { @@ -28,7 +28,8 @@ function FilterSelection(props: Props) { allowedFilterKeys = [], disabled = false, isConditional, - isMobile + isMobile, + mode, } = props; const [showModal, setShowModal] = useState(false); @@ -83,6 +84,7 @@ function FilterSelection(props: Props) { allowedFilterKeys={allowedFilterKeys} isConditional={isConditional} isMobile={isMobile} + mode={mode} />
)} diff --git a/frontend/app/components/shared/LiveSessionSearch/LiveSessionSearch.tsx b/frontend/app/components/shared/LiveSessionSearch/LiveSessionSearch.tsx index f21b307c5..cf5c1f408 100644 --- a/frontend/app/components/shared/LiveSessionSearch/LiveSessionSearch.tsx +++ b/frontend/app/components/shared/LiveSessionSearch/LiveSessionSearch.tsx @@ -1,5 +1,5 @@ import React, { useEffect } from 'react'; -import FilterList from 'Shared/Filters/FilterList'; +import { FilterList } from 'Shared/Filters/FilterList'; import { observer } from 'mobx-react-lite'; import { useStore } from 'App/mstore'; diff --git a/frontend/app/components/shared/SessionFilters/SessionFilters.tsx b/frontend/app/components/shared/SessionFilters/SessionFilters.tsx index 7297b2d15..acd78dfb5 100644 --- a/frontend/app/components/shared/SessionFilters/SessionFilters.tsx +++ b/frontend/app/components/shared/SessionFilters/SessionFilters.tsx @@ -1,6 +1,6 @@ import React, { useEffect } from 'react'; import { debounce } from 'App/utils'; -import FilterList from 'Shared/Filters/FilterList'; +import { FilterList, EventsList } from 'Shared/Filters/FilterList'; import { observer } from 'mobx-react-lite'; import { useStore } from 'App/mstore'; @@ -81,7 +81,18 @@ function SessionFilters() { return (
+