From ddd12b30191cb64ac0c90ea98054777a1335279c Mon Sep 17 00:00:00 2001
From: Valentin Popov <valentin@popov.link>
Date: Thu, 5 Feb 2026 14:01:37 +0000
Subject: Implement validation for empty checkbox selections in
 CheckboxListInput

- Added useEffect to handle cases where required checkboxes are not selected, setting value to null.
- Updated onChange type definition to allow for null values in checkbox selections.
---
 admin/src/components/CheckboxListInput.tsx | 23 +++++++++++++++++++++--
 1 file changed, 21 insertions(+), 2 deletions(-)

(limited to 'admin/src/components/CheckboxListInput.tsx')

diff --git a/admin/src/components/CheckboxListInput.tsx b/admin/src/components/CheckboxListInput.tsx
index 07d2776..11251b4 100644
--- a/admin/src/components/CheckboxListInput.tsx
+++ b/admin/src/components/CheckboxListInput.tsx
@@ -1,4 +1,5 @@
 import type { ReactNode } from 'react';
+import { useEffect } from 'react';
 
 import { Box, Checkbox, Field, Flex, Typography } from '@strapi/design-system';
 import { useIntl } from 'react-intl';
@@ -6,7 +7,10 @@ import { useIntl } from 'react-intl';
 type CheckboxListInputProps = {
   name: string;
   value?: unknown;
-  onChange: (eventOrPath: { target: { name: string; value: string[] } }, value?: unknown) => void;
+  onChange: (
+    eventOrPath: { target: { name: string; value: string[] | null } },
+    value?: unknown
+  ) => void;
   attribute?: {
     enum?: string[];
     options?: {
@@ -65,6 +69,21 @@ const CheckboxListInput = ({
   const enumValues = getEnumValues(attribute);
   const selectedValues = normalizeValue(value);
 
+  useEffect(() => {
+    if (!required) {
+      return;
+    }
+
+    if (Array.isArray(value) && value.length === 0) {
+      onChange({
+        target: {
+          name,
+          value: null,
+        },
+      });
+    }
+  }, [name, onChange, required, value]);
+
   const handleToggle = (option: string, isChecked: boolean) => {
     const nextValues = isChecked
       ? Array.from(new Set([...selectedValues, option]))
@@ -73,7 +92,7 @@ const CheckboxListInput = ({
     onChange({
       target: {
         name,
-        value: nextValues,
+        value: required && nextValues.length === 0 ? null : nextValues,
       },
     });
   };
-- 
cgit v1.2.3

