diff --git a/components/elements/fields/checkBoxField.js b/components/elements/fields/checkBoxField.js
new file mode 100644
index 00000000..9b399f22
--- /dev/null
+++ b/components/elements/fields/checkBoxField.js
@@ -0,0 +1,26 @@
+import React from "react";
+import useTranslation from "next-translate/useTranslation";
+import { useRouter } from "next/router";
+import { Field } from "redux-form";
+import { RenderCheckBox } from "./renderCheckBox";
+
+export function CheckBoxfield(props) {
+ const router = useRouter();
+ let { t } = useTranslation();
+
+ const fieldOptions =
+ router.locale == "cy" ? ["Ydw", "Na", "2323"] : ["Yes", "No", "23232"];
+
+ return (
+
+ );
+}
diff --git a/components/elements/fields/dateFieldPicker.js b/components/elements/fields/dateFieldPicker.js
new file mode 100644
index 00000000..cbfeba11
--- /dev/null
+++ b/components/elements/fields/dateFieldPicker.js
@@ -0,0 +1,99 @@
+import React from "react";
+import _ from "lodash";
+import useTranslation from "next-translate/useTranslation";
+import { Field } from "redux-form";
+import { RenderDatePicker } from "./renderDatePicker";
+import { validateField } from "../validationUtils";
+
+const dateDiffInDays = (a, b) => {
+ const _MS_PER_DAY = 1000 * 60 * 60 * 24;
+ const utc1 = Date.UTC(a.getFullYear(), a.getMonth(), a.getDate());
+ const utc2 = Date.UTC(b.getFullYear(), b.getMonth(), b.getDate());
+
+ return Math.floor((utc2 - utc1) / _MS_PER_DAY);
+};
+
+export function DateFieldPicker(props) {
+ const {
+ name,
+ label,
+ parentField,
+ form,
+ formProps,
+ parentFieldShowOnValue,
+ validation
+ } = props;
+
+ let dateStart = props.dateStart;
+ let dateEnd = props.dateEnd;
+ let { t } = useTranslation();
+
+ const showIfHasParentShowValue =
+ parentField != false &&
+ !_.isEmpty(formProps[form]) &&
+ _.has(formProps[form].values, parentField) &&
+ formProps[form].values[parentField] == parentFieldShowOnValue;
+
+ const requiredMessage = t("newappeal:is-required-label");
+ const emojiNotAllowedMessage = t("newappeal:emojis-not-allowed-label");
+ const invalidPostcodeMessage = t("newappeal:invalid-postcode-label");
+
+ dateStart =
+ showIfHasParentShowValue && name == "pinswg_dateoflpadecision"
+ ? "-" +
+ (dateDiffInDays(
+ new Date(formProps[form].values["pinswg_dateofapplication"]),
+ new Date()
+ ) -
+ 1) +
+ "d"
+ : dateStart;
+
+ return (
+
+ {parentField != false ? (
+ showIfHasParentShowValue && (
+
+ validateField(
+ value,
+ validation,
+ requiredMessage,
+ emojiNotAllowedMessage,
+ invalidPostcodeMessage
+ )
+ }
+ errorMsg={t("newappeal:select-a-date-label")}
+ dateStart={dateStart}
+ dateEnd={dateEnd}
+ hint={props.hint}
+ />
+ )
+ ) : (
+
+ validateField(
+ value,
+ validation,
+ requiredMessage,
+ emojiNotAllowedMessage,
+ invalidPostcodeMessage
+ )
+ }
+ errorMsg={t("newappeal:select-a-date-label")}
+ dateStart={dateStart}
+ dateEnd={dateEnd}
+ hint={props.hint}
+ />
+ )}
+
+ );
+}
diff --git a/components/elements/fields/yesNoField.js b/components/elements/fields/yesNoField.js
new file mode 100644
index 00000000..d768979b
--- /dev/null
+++ b/components/elements/fields/yesNoField.js
@@ -0,0 +1,66 @@
+import React from "react";
+import _ from "lodash";
+import useTranslation from "next-translate/useTranslation";
+import { useRouter } from "next/router";
+import { Field } from "redux-form";
+import { RenderYesNo } from "./renderYesNo";
+
+export function YesNofield(props) {
+ const router = useRouter();
+ let { t } = useTranslation();
+
+ const { parentField, form, formProps, parentFieldShowOnValue } = props;
+
+ const yesNo = router.locale == "cy" ? ["Ydw", "Na"] : ["Yes", "No"];
+ const required = (value) => (value ? undefined : "Required");
+
+ const showIfHasParentShowValue =
+ parentField != false &&
+ !_.isEmpty(formProps[form]) &&
+ _.has(formProps[form].values, parentField) &&
+ parentFieldShowOnValue.indexOf(
+ formProps[form].values[parentField].toString()
+ ) > -1;
+
+ return (
+ <>
+ {parentField != false ? (
+ showIfHasParentShowValue && (
+
+ )
+ ) : (
+
+ )}
+ >
+ );
+}
diff --git a/components/elements/index.js b/components/elements/index.js
index dd56b3d1..da43b0a3 100644
--- a/components/elements/index.js
+++ b/components/elements/index.js
@@ -13,16 +13,19 @@ import { getFieldTranslation } from "./helpers/translationHelpers";
import { RenderRichMultiline } from "./fields/renderRichMultiline";
import { RenderTextfield } from "./fields/renderTextfield";
import { RenderMultiline } from "./fields/renderMultiline";
-import { RenderDatePicker } from "./fields/renderDatePicker";
-import { RenderYesNo } from "./fields/renderYesNo";
import { RenderRadio } from "./fields/renderRadio";
-import { RenderCheckBox } from "./fields/renderCheckBox";
import { PickList } from "./fields/pickListField";
+import { CheckBoxfield } from "./fields/checkBoxField";
+import { DateFieldPicker } from "./fields/dateFieldPicker";
+import { YesNofield } from "./fields/yesNoField";
import { RenderDecimalField } from "./fields/renderDecimalField";
import { RenderFileUpload } from "./fields/renderFileUpload";
export { RenderSubFields } from "./fields/renderSubFields";
export { FieldArrayForm } from "./fields/fieldArrayForm";
export { PickList };
+export { CheckBoxfield };
+export { DateFieldPicker };
+export { YesNofield };
const getValidationMessages = (t) => ({
requiredMessage: t("newappeal:is-required-label"),
@@ -407,99 +410,6 @@ export function RichMultiLinefield(props) {
);
}
-export function DateFieldPicker(props) {
- const {
- name,
- label,
- parentField,
- form,
- formProps,
- parentFieldShowOnValue,
- validation
- } = props;
- let dateStart = props.dateStart;
- let dateEnd = props.dateEnd;
- let { t } = useTranslation();
- var showIfHasParentShowValue = isVisibleByEquality({
- parentField,
- form,
- formProps,
- parentFieldShowOnValue
- });
-
- const { requiredMessage, emojiNotAllowedMessage, invalidPostcodeMessage } =
- getValidationMessages(t);
-
- // a and b are javascript Date objects
- function dateDiffInDays(a, b) {
- const _MS_PER_DAY = 1000 * 60 * 60 * 24;
- // Discard the time and time-zone information.
- const utc1 = Date.UTC(a.getFullYear(), a.getMonth(), a.getDate());
- const utc2 = Date.UTC(b.getFullYear(), b.getMonth(), b.getDate());
-
- return Math.floor((utc2 - utc1) / _MS_PER_DAY);
- }
-
- dateStart =
- showIfHasParentShowValue && name == "pinswg_dateoflpadecision"
- ? "-" +
- (dateDiffInDays(
- new Date(formProps[form].values["pinswg_dateofapplication"]),
- new Date()
- ) -
- 1) +
- "d"
- : dateStart;
-
- return (
-
- {parentField != false ? (
- showIfHasParentShowValue && (
-
- validateField(
- value,
- validation,
- requiredMessage,
- emojiNotAllowedMessage,
- invalidPostcodeMessage
- )
- } // Use the external validate function
- errorMsg={t("newappeal:select-a-date-label")}
- dateStart={dateStart}
- dateEnd={dateEnd}
- hint={props.hint}
- />
- )
- ) : (
-
- validateField(
- value,
- validation,
- requiredMessage,
- emojiNotAllowedMessage,
- invalidPostcodeMessage
- )
- } // Use the external validate function
- errorMsg={t("newappeal:select-a-date-label")}
- dateStart={dateStart}
- dateEnd={dateEnd}
- hint={props.hint}
- />
- )}
-
- );
-}
-
export function DateField(props) {
const { name, label } = props;
@@ -579,75 +489,6 @@ export function DateField(props) {
);
}
-export function YesNofield(props) {
- const router = useRouter();
- let { t } = useTranslation();
-
- const {
- name,
- label,
- inline,
- form,
- formProps,
- validation,
- parentFieldShowOnValue,
- parentField
- } = props;
- const yesNo = router.locale == "cy" ? ["Ydw", "Na"] : ["Yes", "No"];
- const required = (value) => (value ? undefined : "Required");
- var showIfHasParentShowValue = isVisibleByInclusion({
- parentField,
- form,
- formProps,
- parentFieldShowOnValue
- });
-
- (showIfHasParentShowValue == parentField) != false &&
- showIfHasParentShowValue;
-
- return (
- <>
- {parentField != false ? (
- showIfHasParentShowValue && (
-
- )
- ) : (
-
- )}
- >
- );
-}
-
export function Radiofield(props) {
const {
name,
@@ -742,27 +583,6 @@ export function Radiofield(props) {
);
}
-export function CheckBoxfield(props) {
- const router = useRouter();
-
- let { t } = useTranslation();
- const fieldOptions =
- router.locale == "cy" ? ["Ydw", "Na", "2323"] : ["Yes", "No", "23232"];
- return (
-
- );
-}
-
export function NumericField(props) {
const {
name,
diff --git a/memory-bank/change-log.md b/memory-bank/change-log.md
index e3bc410b..7449ea75 100644
--- a/memory-bank/change-log.md
+++ b/memory-bank/change-log.md
@@ -3642,3 +3642,31 @@ Validation:
Follow-ups:
- Continue bounded no-behavior-change slices only (e.g., extract one additional low-risk wrapper such as `CheckBoxfield`).
+
+---
+
+### CL-103: 22500 wrapper extraction bundle (`CheckBoxfield`, `DateFieldPicker`, `YesNofield`)
+
+date: 2026-04-08
+author: Cline
+scope: `components/elements/index.js`, `components/elements/fields/{checkBoxField,dateFieldPicker,yesNoField}.js`
+type: change
+rationale: Execute the requested bundled wrapper slice by extracting wrappers 1/2/3 in one commit while keeping behavior unchanged.
+impact: No intended behavior change; keeps EN/CY output, visibility logic, and accessibility structure intact while reducing `components/elements/index.js` size.
+status: completed
+
+Summary:
+
+- Added `components/elements/fields/checkBoxField.js` and moved `CheckBoxfield` wrapper.
+- Added `components/elements/fields/dateFieldPicker.js` and moved `DateFieldPicker` wrapper logic.
+- Added `components/elements/fields/yesNoField.js` and moved `YesNofield` wrapper logic.
+- Updated `components/elements/index.js` to import/export these wrappers from field modules.
+- Removed inline implementations of `CheckBoxfield`, `DateFieldPicker`, and `YesNofield` from `index.js`.
+
+Validation:
+
+- `npx eslint components/elements/index.js components/elements/fields/checkBoxField.js components/elements/fields/dateFieldPicker.js components/elements/fields/yesNoField.js` -> pass
+
+Follow-ups:
+
+- Remaining wrappers can continue as bounded slices (`Radiofield`, `NumericField`, `DecimalField`) if required.