1- import React from 'react' ;
1+ import React , { useState } from 'react' ;
22
33import { Trans , useTranslation } from 'react-i18next' ;
44
@@ -56,16 +56,21 @@ export const Form = ({
5656 defaultValues : { blocked_services : initialValues }
5757 } ) ;
5858
59- const setAllServicesState = ( isSelected : boolean ) => {
59+ const [ masterEnabled , setMasterEnabled ] = useState < boolean > ( true ) ;
60+
61+ const handleToggleAllServices = ( isSelected : boolean ) => {
62+ if ( ! masterEnabled ) {
63+ return ;
64+ }
6065 blockedServices . forEach ( ( service ) => {
6166 if ( ! isServiceDisabled ( processing , processingSet ) ) {
6267 setValue ( `blocked_services.${ service . id } ` , isSelected ) ;
6368 }
6469 } ) ;
6570 } ;
6671
67- const setGroupServicesState = ( groupId : string , isSelected : boolean ) => {
68- if ( isServiceDisabled ( processing , processingSet ) ) {
72+ const handleToggleGroupServices = ( groupId : string , isSelected : boolean ) => {
73+ if ( isServiceDisabled ( processing , processingSet ) || ! masterEnabled ) {
6974 return ;
7075 }
7176 blockedServices
@@ -75,11 +80,19 @@ export const Form = ({
7580 } ) ;
7681 } ;
7782
83+ const handleMasterToggle = ( next : boolean ) => {
84+ setMasterEnabled ( next ) ;
85+ } ;
86+
7887 const handleSubmitWithGroups = ( values : FormValues ) => {
7988 if ( ! values || ! values . blocked_services ) {
8089 return onSubmit ( values ) ;
8190 }
8291
92+ if ( ! masterEnabled ) {
93+ return onSubmit ( { blocked_services : { } } ) ;
94+ }
95+
8396 const enabledIdsMap = Object . fromEntries (
8497 blockedServices
8598 . filter ( service => values . blocked_services ?. [ service . id ] )
@@ -92,14 +105,23 @@ export const Form = ({
92105 return (
93106 < form onSubmit = { handleSubmit ( handleSubmitWithGroups ) } >
94107 < div className = "form__group" >
108+ < ServiceField
109+ name = "blocked_services_master"
110+ value = { masterEnabled }
111+ onChange = { ( e : React . ChangeEvent < HTMLInputElement > ) => handleMasterToggle ( e . target . checked ) }
112+ onBlur = { ( ) => { } }
113+ placeholder = { t ( 'blocked_services_global' ) }
114+ className = "service--global"
115+ disabled = { processing || processingSet }
116+ />
95117 < div className = "blocked_services row mb-4" >
96118 < div className = "col-6" >
97119 < button
98120 type = "button"
99121 data-testid = "blocked_services_block_all"
100122 className = "btn btn-secondary btn-block"
101- disabled = { processing || processingSet }
102- onClick = { ( ) => setAllServicesState ( true ) } >
123+ disabled = { processing || processingSet || ! masterEnabled }
124+ onClick = { ( ) => handleToggleAllServices ( true ) } >
103125 < Trans > block_all</ Trans >
104126 </ button >
105127 </ div >
@@ -109,8 +131,8 @@ export const Form = ({
109131 type = "button"
110132 data-testid = "blocked_services_unblock_all"
111133 className = "btn btn-secondary btn-block"
112- disabled = { processing || processingSet }
113- onClick = { ( ) => setAllServicesState ( false ) } >
134+ disabled = { processing || processingSet || ! masterEnabled }
135+ onClick = { ( ) => handleToggleAllServices ( false ) } >
114136 < Trans > unblock_all</ Trans >
115137 </ button >
116138 </ div >
@@ -121,15 +143,16 @@ export const Form = ({
121143 return {
122144 id : group . id ,
123145 title : t ( `servicesgroup.${ group . id } .name` ) ,
146+ disabled : processing || processingSet || ! masterEnabled ,
124147 children : (
125148 < div className = "services__wrapper" >
126149 < div className = "row mb-3" >
127150 < div className = "col-6" >
128151 < button
129152 type = "button"
130153 className = "btn btn-secondary btn-block"
131- disabled = { processing || processingSet }
132- onClick = { ( ) => setGroupServicesState ( group . id , true ) }
154+ disabled = { processing || processingSet || ! masterEnabled }
155+ onClick = { ( ) => handleToggleGroupServices ( group . id , true ) }
133156 >
134157 < Trans > block_all</ Trans >
135158 </ button >
@@ -138,8 +161,8 @@ export const Form = ({
138161 < button
139162 type = "button"
140163 className = "btn btn-secondary btn-block"
141- disabled = { processing || processingSet }
142- onClick = { ( ) => setGroupServicesState ( group . id , false ) }
164+ disabled = { processing || processingSet || ! masterEnabled }
165+ onClick = { ( ) => handleToggleGroupServices ( group . id , false ) }
143166 >
144167 < Trans > unblock_all</ Trans >
145168 </ button >
@@ -159,7 +182,10 @@ export const Form = ({
159182 data-testid = { `blocked_services_${ service . id } ` }
160183 data-groupid = { `blocked_services_${ service . group_id } ` }
161184 placeholder = { service . name }
162- disabled = { isServiceDisabled ( processing , processingSet ) }
185+ disabled = {
186+ ! masterEnabled
187+ || isServiceDisabled ( processing , processingSet )
188+ }
163189 icon = { service . icon_svg }
164190 />
165191 ) } />
0 commit comments