11import { FilterChangeHandler } from "@vuu-ui/vuu-filter-types" ;
2- import { Prompt } from "@vuu-ui/vuu-ui-controls" ;
32import {
43 createContext ,
54 ReactElement ,
@@ -10,10 +9,12 @@ import {
109} from "react" ;
1110import { FilterMenuActionHandler } from "../filter-pill/FilterMenu" ;
1211import { FilterDescriptor } from "../saved-filters/useSavedFilterPanel" ;
13- import { FilterNameForm } from "../saved-filters/FilterNameForm" ;
12+ import { FilterNamePrompt } from "../saved-filters/FilterNamePrompt" ;
13+ import { DeleteFilterPrompt } from "../saved-filters/DeleteFilterPrompt" ;
1414
1515export interface FilterContextProps {
1616 activeFilter : FilterDescriptor | undefined ;
17+ saveFilter : ( filter : FilterDescriptor ) => void ;
1718 savedFilters ?: FilterDescriptor [ ] ;
1819 onApplyFilter : FilterChangeHandler ;
1920 onFilterMenuAction ?: FilterMenuActionHandler ;
@@ -27,6 +28,10 @@ export const FilterContext = createContext<FilterContextProps>({
2728 console . warn (
2829 "[FilterContext] onApplyFilter, no FilterProvider has been configured" ,
2930 ) ,
31+ saveFilter : ( ) =>
32+ console . warn (
33+ "[FilterContext] saveFilter, no FilterProvider has been configured" ,
34+ ) ,
3035 setActiveFilter : ( ) =>
3136 console . warn (
3237 "[FilterContext] setActiveFilter, no FilterProvider has been configured" ,
@@ -60,6 +65,12 @@ export const FilterProvider = ({
6065 [ filterDescriptors ] ,
6166 ) ;
6267
68+ const deleteFilter = useCallback ( ( filterId : string ) => {
69+ setFilterDescriptors ( ( filterDescriptors ) =>
70+ filterDescriptors . filter ( ( { id } ) => id !== filterId ) ,
71+ ) ;
72+ } , [ ] ) ;
73+
6374 const renameFilter = useCallback ( ( filterId : string , filterName : string ) => {
6475 setFilterDescriptors ( ( currentFilterDescriptors ) => {
6576 return currentFilterDescriptors . map < FilterDescriptor > ( ( f ) => {
@@ -81,32 +92,39 @@ export const FilterProvider = ({
8192 const PromptForFilterName = useCallback (
8293 ( { filter, id } : FilterDescriptor ) => {
8394 const originalFilterName = filter . name ?? "" ;
84- let filterName = originalFilterName ;
8595 setDialog (
86- < Prompt
87- onCancel = { ( ) => setDialog ( null ) }
88- onConfirm = { ( ) => {
96+ < FilterNamePrompt
97+ filterName = { filter . name }
98+ title = "Rename filter"
99+ onClose = { ( ) => setDialog ( null ) }
100+ onConfirm = { ( name ) => {
89101 setDialog ( null ) ;
90- if ( originalFilterName !== filterName ) {
91- renameFilter ( id , filterName ) ;
102+ if ( originalFilterName !== name ) {
103+ renameFilter ( id , name ) ;
92104 }
93105 } }
94- onOpenChange = { ( open ) => {
95- if ( ! open ) setDialog ( null ) ;
96- } }
97- open
98- title = "Rename Filter"
99- >
100- < FilterNameForm
101- filterName = { filter . name }
102- onFilterNameChange = { ( value ) => ( filterName = value ) }
103- />
104- </ Prompt > ,
106+ /> ,
105107 ) ;
106108 } ,
107109 [ renameFilter ] ,
108110 ) ;
109111
112+ const promptForConfirmationOfDelete = useCallback (
113+ ( filterDescriptor : FilterDescriptor ) => {
114+ setDialog (
115+ < DeleteFilterPrompt
116+ filterDescriptor = { filterDescriptor }
117+ onConfirm = { ( ) => {
118+ setDialog ( null ) ;
119+ deleteFilter ( filterDescriptor . id ) ;
120+ } }
121+ onClose = { ( ) => setDialog ( null ) }
122+ /> ,
123+ ) ;
124+ } ,
125+ [ ] ,
126+ ) ;
127+
110128 const handleFilterMenuAction = useCallback < FilterMenuActionHandler > (
111129 ( filterId , actionType ) => {
112130 const targetFilter = findFilter ( filterId ) ;
@@ -118,15 +136,31 @@ export const FilterProvider = ({
118136 console . log ( `edit filter ${ filterId } ` ) ;
119137 break ;
120138 case "remove" :
121- console . log ( `remove filter ${ filterId } ` ) ;
139+ promptForConfirmationOfDelete ( targetFilter ) ;
122140 break ;
123141 case "rename" :
124142 return PromptForFilterName ( targetFilter ) ;
125143 }
126144 } ,
127- [ findFilter , PromptForFilterName ] ,
145+ [ findFilter , promptForConfirmationOfDelete , PromptForFilterName ] ,
128146 ) ;
129147
148+ const handleSaveFilter = useCallback ( ( filterDescriptor : FilterDescriptor ) => {
149+ setFilterDescriptors ( ( filterDescriptors ) => {
150+ if ( filterDescriptor . active ) {
151+ return filterDescriptors
152+ . map ( ( filterDescriptor ) =>
153+ filterDescriptor . active
154+ ? { ...filterDescriptor , active : false }
155+ : filterDescriptor ,
156+ )
157+ . concat ( filterDescriptor ) ;
158+ } else {
159+ return filterDescriptors . concat ( filterDescriptor ) ;
160+ }
161+ } ) ;
162+ } , [ ] ) ;
163+
130164 const setActiveFilter = useCallback (
131165 ( filterId ?: string ) => {
132166 setFilterDescriptors ( ( currentFilterDescriptors ) => {
@@ -157,6 +191,7 @@ export const FilterProvider = ({
157191 activeFilter : filterDescriptors . find ( ( f ) => f . active ) ,
158192 onApplyFilter : handleApplyFilter ,
159193 onFilterMenuAction : handleFilterMenuAction ,
194+ saveFilter : handleSaveFilter ,
160195 savedFilters : filterDescriptors ,
161196 setActiveFilter,
162197 } }
@@ -178,13 +213,15 @@ export function useSavedFilters() {
178213 onApplyFilter,
179214 onFilterMenuAction,
180215 savedFilters,
216+ saveFilter,
181217 setActiveFilter,
182218 } = useContext ( FilterContext ) ;
183219 return {
184220 activeFilter,
185221 onApplyFilter,
186222 onFilterMenuAction,
187223 savedFilters,
224+ saveFilter,
188225 setActiveFilter,
189226 } ;
190227}
0 commit comments