Skip to content

Commit 244c101

Browse files
committed
restore master toggle
1 parent 40418ea commit 244c101

File tree

2 files changed

+44
-14
lines changed

2 files changed

+44
-14
lines changed

client/src/components/Filters/Services/Form.tsx

Lines changed: 39 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import React from 'react';
1+
import React, { useState } from 'react';
22

33
import { 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
)} />

client/src/components/ui/Accordion.tsx

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ const AccordionItem = (props: Props) => {
2323
children,
2424
isOpen,
2525
onToggle,
26+
disabled,
2627
className = '',
2728
} = props;
2829
return (
@@ -32,9 +33,11 @@ const AccordionItem = (props: Props) => {
3233
<button
3334
type="button"
3435
className={`accordion-item__toggle ${isOpen ? 'accordion-item__toggle--open' : ''}`}
35-
onClick={onToggle}
36+
onClick={() => { if (!disabled) { onToggle(); } }}
3637
aria-expanded={isOpen}
3738
aria-controls={`accordion-content-${id}`}
39+
aria-disabled={disabled}
40+
disabled={disabled}
3841
>
3942
<span className="accordion-item__icon" aria-hidden="true">
4043
<svg width="24" height="24" viewBox="0 0 24 24">
@@ -106,6 +109,7 @@ export const Accordion: React.FC<AccordionProps> = ({
106109
title={item.title}
107110
isOpen={openItems.has(item.id)}
108111
onToggle={() => toggleItem(item.id)}
112+
disabled={item.disabled}
109113
>
110114
{item.children}
111115
</AccordionItem>

0 commit comments

Comments
 (0)