@abgov/react-components 6.5.0-alpha.2 → 6.5.0-alpha.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/index.d.ts CHANGED
@@ -62,3 +62,4 @@ export * from './lib/three-column-layout/three-column-layout';
62
62
  export * from './lib/tooltip/tooltip';
63
63
  export * from './lib/two-column-layout/two-column-layout';
64
64
  export * from './lib/filter-chip/filter-chip';
65
+ export * from './lib/use-public-form-controller';
package/index.js CHANGED
@@ -1,4 +1,14 @@
1
1
  "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __typeError = (msg) => {
4
+ throw TypeError(msg);
5
+ };
6
+ var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
7
+ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
8
+ var __accessCheck = (obj, member, msg) => member.has(obj) || __typeError("Cannot " + msg);
9
+ var __privateAdd = (obj, member, value) => member.has(obj) ? __typeError("Cannot add the same private member more than once") : member instanceof WeakSet ? member.add(obj) : member.set(obj, value);
10
+ var __privateMethod = (obj, member, method) => (__accessCheck(obj, member, "access private method"), method);
11
+ var _PublicFormController_instances, updateObjectListState_fn, dispatchError_fn;
2
12
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
13
  const jsxRuntime = require("react/jsx-runtime");
4
14
  const react = require("react");
@@ -414,6 +424,8 @@ function GoabCheckbox({
414
424
  value,
415
425
  text,
416
426
  description,
427
+ reveal,
428
+ revealAriaLabel,
417
429
  maxWidth,
418
430
  children,
419
431
  onChange,
@@ -451,6 +463,7 @@ function GoabCheckbox({
451
463
  text,
452
464
  value: typeof value === "boolean" ? value ? "true" : void 0 : value,
453
465
  arialabel: ariaLabel,
466
+ revealarialabel: revealAriaLabel,
454
467
  description: typeof description === "string" ? description : void 0,
455
468
  maxwidth: maxWidth,
456
469
  mt,
@@ -458,8 +471,9 @@ function GoabCheckbox({
458
471
  mb,
459
472
  ml,
460
473
  children: [
461
- description && typeof description !== "string" && /* @__PURE__ */ jsxRuntime.jsx("div", { slot: "description", children: description }),
462
- children
474
+ children,
475
+ typeof description !== "string" && description && /* @__PURE__ */ jsxRuntime.jsx("div", { slot: "description", children: description }),
476
+ reveal && /* @__PURE__ */ jsxRuntime.jsx("div", { slot: "reveal", children: reveal })
463
477
  ]
464
478
  }
465
479
  );
@@ -575,6 +589,7 @@ function GoabDatePicker({
575
589
  max,
576
590
  testId,
577
591
  disabled,
592
+ type,
578
593
  mt,
579
594
  mr,
580
595
  mb,
@@ -590,11 +605,15 @@ function GoabDatePicker({
590
605
  const current = ref.current;
591
606
  const handleChange = (e) => {
592
607
  const detail = e.detail;
593
- onChange(detail);
608
+ onChange == null ? void 0 : onChange(detail);
594
609
  };
595
- current.addEventListener("_change", handleChange);
610
+ if (onChange) {
611
+ current.addEventListener("_change", handleChange);
612
+ }
596
613
  return () => {
597
- current.removeEventListener("_change", handleChange);
614
+ if (onChange) {
615
+ current.removeEventListener("_change", handleChange);
616
+ }
598
617
  };
599
618
  }, [onChange]);
600
619
  return /* @__PURE__ */ jsxRuntime.jsx(
@@ -603,6 +622,7 @@ function GoabDatePicker({
603
622
  ref,
604
623
  name,
605
624
  value: (value == null ? void 0 : value.toISOString()) || "",
625
+ type,
606
626
  error: error ? "true" : void 0,
607
627
  disabled: disabled ? "true" : void 0,
608
628
  min: min == null ? void 0 : min.toISOString(),
@@ -2849,6 +2869,7 @@ function GoabInput({
2849
2869
  trailingContent,
2850
2870
  maxLength,
2851
2871
  trailingIconAriaLabel,
2872
+ textAlign = "left",
2852
2873
  onTrailingIconClick,
2853
2874
  onChange,
2854
2875
  onFocus,
@@ -2926,6 +2947,7 @@ function GoabInput({
2926
2947
  ml,
2927
2948
  handletrailingiconclick: onTrailingIconClick ? "true" : "false",
2928
2949
  trailingiconarialabel: trailingIconAriaLabel,
2950
+ textalign: textAlign,
2929
2951
  children: [
2930
2952
  leadingContent && /* @__PURE__ */ jsxRuntime.jsx("div", { slot: "leadingContent", children: leadingContent }),
2931
2953
  trailingContent && /* @__PURE__ */ jsxRuntime.jsx("div", { slot: "trailingContent", children: trailingContent })
@@ -3060,6 +3082,7 @@ function GoabInputNumber({
3060
3082
  min = Number.MIN_VALUE,
3061
3083
  max = Number.MAX_VALUE,
3062
3084
  value,
3085
+ textAlign = "right",
3063
3086
  ...props
3064
3087
  }) {
3065
3088
  const onNumberChange = ({ name, value: value2 }) => {
@@ -3089,7 +3112,8 @@ function GoabInputNumber({
3089
3112
  onFocus,
3090
3113
  onBlur,
3091
3114
  type: "number",
3092
- onKeyPress
3115
+ onKeyPress,
3116
+ textAlign
3093
3117
  }
3094
3118
  );
3095
3119
  }
@@ -3341,6 +3365,8 @@ function GoabRadioItem({
3341
3365
  label,
3342
3366
  value,
3343
3367
  description,
3368
+ reveal,
3369
+ revealAriaLabel,
3344
3370
  maxWidth,
3345
3371
  disabled,
3346
3372
  checked,
@@ -3364,12 +3390,14 @@ function GoabRadioItem({
3364
3390
  disabled: disabled ? "true" : void 0,
3365
3391
  checked: checked ? "true" : void 0,
3366
3392
  arialabel: ariaLabel,
3393
+ revealarialabel: revealAriaLabel,
3367
3394
  mt,
3368
3395
  mr,
3369
3396
  mb,
3370
3397
  ml,
3371
3398
  children: [
3372
3399
  description && typeof description !== "string" && /* @__PURE__ */ jsxRuntime.jsx("div", { slot: "description", children: description }),
3400
+ reveal && /* @__PURE__ */ jsxRuntime.jsx("div", { slot: "reveal", children: reveal }),
3373
3401
  children
3374
3402
  ]
3375
3403
  }
@@ -3751,6 +3779,326 @@ const GoabFilterChip = ({
3751
3779
  }
3752
3780
  );
3753
3781
  };
3782
+ class PublicFormController {
3783
+ constructor(type) {
3784
+ __privateAdd(this, _PublicFormController_instances);
3785
+ __publicField(this, "state");
3786
+ __publicField(this, "_formData");
3787
+ __publicField(this, "_formRef");
3788
+ this.type = type;
3789
+ }
3790
+ // Obtain reference to the form element
3791
+ init(e) {
3792
+ if (this._formRef) {
3793
+ console.warn("init: form element has already been set");
3794
+ return;
3795
+ }
3796
+ this._formRef = e.detail.el;
3797
+ this.state = {
3798
+ uuid: crypto.randomUUID(),
3799
+ form: {},
3800
+ history: [],
3801
+ editting: "",
3802
+ status: "not-started"
3803
+ };
3804
+ }
3805
+ initList(e) {
3806
+ this._formRef = e.detail.el;
3807
+ this.state = [];
3808
+ }
3809
+ // Public method to allow for the initialization of the state
3810
+ initState(state, callback) {
3811
+ relay(this._formRef, "external::init:state", state);
3812
+ if (typeof state === "string") {
3813
+ this.state = JSON.parse(state);
3814
+ } else if (!Array.isArray(state)) {
3815
+ this.state = state;
3816
+ }
3817
+ if (callback) {
3818
+ setTimeout(callback, 200);
3819
+ }
3820
+ }
3821
+ updateListState(e) {
3822
+ const detail = e.detail;
3823
+ if (!Array.isArray(detail.data)) {
3824
+ return;
3825
+ }
3826
+ this.state = detail.data;
3827
+ }
3828
+ updateObjectState(e) {
3829
+ var _a, _b;
3830
+ if (Array.isArray(this.state)) {
3831
+ return;
3832
+ }
3833
+ const detail = e.detail;
3834
+ if (detail.type === "list") {
3835
+ this.state = {
3836
+ ...this.state,
3837
+ form: { ...((_a = this.state) == null ? void 0 : _a.form) || {}, [detail.id]: detail.data }
3838
+ };
3839
+ } else {
3840
+ this.state = {
3841
+ ...this.state,
3842
+ ...detail.data,
3843
+ form: { ...((_b = this.state) == null ? void 0 : _b.form) || {}, ...detail.data.form },
3844
+ history: detail.data.history
3845
+ };
3846
+ }
3847
+ }
3848
+ getStateList() {
3849
+ if (!this.state) {
3850
+ return [];
3851
+ }
3852
+ if (!Array.isArray(this.state)) {
3853
+ console.warn(
3854
+ "Utils:getStateList: unable to update the state of a non-multi form type",
3855
+ this.state
3856
+ );
3857
+ return [];
3858
+ }
3859
+ if (this.state.length === 0) {
3860
+ return [];
3861
+ }
3862
+ return this.state.map((s) => {
3863
+ return Object.values(s.form).filter((item) => {
3864
+ var _a;
3865
+ return ((_a = item == null ? void 0 : item.data) == null ? void 0 : _a.type) === "details";
3866
+ }).map((item) => {
3867
+ var _a;
3868
+ return item.data.type === "details" && ((_a = item.data) == null ? void 0 : _a.fieldsets) || {};
3869
+ }).reduce(
3870
+ (acc, item) => {
3871
+ for (const [key, value] of Object.entries(item)) {
3872
+ acc[key] = value.value;
3873
+ }
3874
+ return acc;
3875
+ },
3876
+ {}
3877
+ );
3878
+ });
3879
+ }
3880
+ // getStateItems(group: string): Record<string, FieldsetItemState>[] {
3881
+ // if (Array.isArray(this.state)) {
3882
+ // console.error(
3883
+ // "Utils:getStateItems: unable to update the state of a multi form type",
3884
+ // );
3885
+ // return [];
3886
+ // }
3887
+ // if (!this.state) {
3888
+ // console.error("Utils:getStateItems: state has not yet been set");
3889
+ // return [];
3890
+ // }
3891
+ //
3892
+ // const data = this.state.form[group].data;
3893
+ // if (data.type !== "list") {
3894
+ // return [];
3895
+ // }
3896
+ //
3897
+ // return data.items.;
3898
+ // }
3899
+ // Public method to allow for the retrieval of the state value
3900
+ getStateValue(group, key) {
3901
+ if (Array.isArray(this.state)) {
3902
+ console.error("getStateValue: unable to update the state of a multi form type");
3903
+ return "";
3904
+ }
3905
+ if (!this.state) {
3906
+ console.error("getStateValue: state has not yet been set");
3907
+ return "";
3908
+ }
3909
+ const data = this.state.form[group].data;
3910
+ if (data.type !== "details") {
3911
+ return "";
3912
+ }
3913
+ return data.fieldsets[key].value;
3914
+ }
3915
+ // Public method to allow for the continuing to the next page
3916
+ continueTo(next) {
3917
+ if (!next) {
3918
+ console.error("continueTo [name] is undefined");
3919
+ return;
3920
+ }
3921
+ relay(this._formRef, "external::continue", { next });
3922
+ }
3923
+ // Public method to perform validation and send the appropriate messages to the form elements
3924
+ validate(e, field, validators, options) {
3925
+ var _a;
3926
+ const { el, state, cancelled } = e.detail;
3927
+ const value = (_a = state == null ? void 0 : state[field]) == null ? void 0 : _a.value;
3928
+ window.scrollTo({ top: 0, behavior: "smooth" });
3929
+ if (cancelled) {
3930
+ return [true, value];
3931
+ }
3932
+ for (const validator of validators) {
3933
+ const msg = validator(value);
3934
+ __privateMethod(this, _PublicFormController_instances, dispatchError_fn).call(this, el, field, msg, options);
3935
+ if (msg) {
3936
+ return [false, ""];
3937
+ }
3938
+ }
3939
+ return [true, value];
3940
+ }
3941
+ /**
3942
+ * Validates a group of fields ensuring that at least `minPassCount` of the items within the group
3943
+ * passes. This is useful in the scenario when n number fields are required out of n+m number of fields.
3944
+ *
3945
+ * @param {string[]} fields - An array of field names to be validated.
3946
+ * @param {Event} e - The event object associated with the validation trigger.
3947
+ * @param {FieldValidator[]} validators - An array of validator functions to apply to the fields.
3948
+ * @return {[number, Record<string, boolean>]} - Returns back the number of fields that passed and a record of the fields and their pass status.
3949
+ */
3950
+ validateGroup(e, fields, validators) {
3951
+ let passCount = 0;
3952
+ const validGroups = {};
3953
+ for (const field of fields) {
3954
+ const [_valid] = this.validate(e, field, validators, { grouped: true });
3955
+ if (_valid) {
3956
+ validGroups[field] = true;
3957
+ passCount++;
3958
+ }
3959
+ }
3960
+ return [passCount, validGroups];
3961
+ }
3962
+ edit(index) {
3963
+ relay(this._formRef, "external::alter:state", { index, operation: "edit" });
3964
+ }
3965
+ remove(index) {
3966
+ relay(this._formRef, "external::alter:state", {
3967
+ index,
3968
+ operation: "remove"
3969
+ });
3970
+ }
3971
+ // removes any data collected that doesn't correspond with the final history path
3972
+ clean(data) {
3973
+ return data.history.reduce((acc, fieldsetId) => {
3974
+ acc[fieldsetId] = data.form[fieldsetId];
3975
+ return acc;
3976
+ }, {});
3977
+ }
3978
+ }
3979
+ _PublicFormController_instances = new WeakSet();
3980
+ updateObjectListState_fn = function(detail) {
3981
+ var _a;
3982
+ if (!Array.isArray(detail.data)) {
3983
+ return;
3984
+ }
3985
+ if (Array.isArray(this.state)) {
3986
+ return;
3987
+ }
3988
+ this.state = {
3989
+ ...this.state,
3990
+ form: {
3991
+ ...((_a = this.state) == null ? void 0 : _a.form) || {},
3992
+ [detail.id]: detail.data
3993
+ }
3994
+ };
3995
+ };
3996
+ // Private method to dispatch the error message to the form element
3997
+ dispatchError_fn = function(el, name, msg, options) {
3998
+ el.dispatchEvent(
3999
+ new CustomEvent("msg", {
4000
+ composed: true,
4001
+ detail: {
4002
+ action: "external::set:error",
4003
+ data: {
4004
+ name,
4005
+ msg,
4006
+ grouped: options == null ? void 0 : options.grouped
4007
+ }
4008
+ }
4009
+ })
4010
+ );
4011
+ };
4012
+ function relay(el, eventName, data, opts) {
4013
+ if (!el) {
4014
+ console.error("dispatch element is null");
4015
+ return;
4016
+ }
4017
+ el.dispatchEvent(
4018
+ new CustomEvent("msg", {
4019
+ composed: true,
4020
+ bubbles: opts == null ? void 0 : opts.bubbles,
4021
+ detail: {
4022
+ action: eventName,
4023
+ data
4024
+ }
4025
+ })
4026
+ );
4027
+ }
4028
+ function usePublicFormController(type = "details") {
4029
+ const controllerRef = react.useRef(new PublicFormController(type));
4030
+ const [state, setState] = react.useState(void 0);
4031
+ react.useEffect(() => {
4032
+ var _a, _b;
4033
+ const originalStateGetter = (_a = Object.getOwnPropertyDescriptor(
4034
+ Object.getPrototypeOf(controllerRef.current),
4035
+ "state"
4036
+ )) == null ? void 0 : _a.get;
4037
+ const originalStateSetter = (_b = Object.getOwnPropertyDescriptor(
4038
+ Object.getPrototypeOf(controllerRef.current),
4039
+ "state"
4040
+ )) == null ? void 0 : _b.set;
4041
+ if (originalStateGetter && originalStateSetter) {
4042
+ Object.defineProperty(controllerRef.current, "state", {
4043
+ get: function() {
4044
+ return originalStateGetter.call(this);
4045
+ },
4046
+ set: function(value) {
4047
+ originalStateSetter.call(this, value);
4048
+ setState(value);
4049
+ },
4050
+ configurable: true
4051
+ });
4052
+ }
4053
+ }, []);
4054
+ const init = react.useCallback((e) => {
4055
+ var _a;
4056
+ if (!((_a = e.detail) == null ? void 0 : _a.el)) {
4057
+ console.error("El is null during initialization");
4058
+ return;
4059
+ }
4060
+ controllerRef.current.init(e);
4061
+ }, []);
4062
+ const initList = react.useCallback((e) => {
4063
+ var _a;
4064
+ const customEvent = e;
4065
+ if (!((_a = customEvent == null ? void 0 : customEvent.detail) == null ? void 0 : _a.el)) {
4066
+ console.error("El is null during list initialization");
4067
+ return;
4068
+ }
4069
+ controllerRef.current.initList(e);
4070
+ }, []);
4071
+ const initState = react.useCallback((state2, callback) => {
4072
+ if (!controllerRef.current._formRef) {
4073
+ console.error("Form ref not set.");
4074
+ return;
4075
+ }
4076
+ controllerRef.current.initState(state2, callback);
4077
+ }, []);
4078
+ const continueTo = react.useCallback((next) => {
4079
+ controllerRef.current.continueTo(next);
4080
+ }, []);
4081
+ const validate = react.useCallback((e, field, validators) => {
4082
+ return controllerRef.current.validate(e, field, validators);
4083
+ }, []);
4084
+ const getStateValue = react.useCallback((group, key) => {
4085
+ return controllerRef.current.getStateValue(group, key);
4086
+ }, []);
4087
+ const getStateList = react.useCallback(() => {
4088
+ return controllerRef.current.getStateList();
4089
+ }, []);
4090
+ return {
4091
+ state,
4092
+ init,
4093
+ initList,
4094
+ initState,
4095
+ continueTo,
4096
+ validate,
4097
+ getStateValue,
4098
+ getStateList,
4099
+ controller: controllerRef.current
4100
+ };
4101
+ }
3754
4102
  exports.GoabDrawer = icon.GoabDrawer;
3755
4103
  exports.GoabIcon = icon.GoabIcon;
3756
4104
  exports.GoALinkButton = GoALinkButton;
@@ -3835,4 +4183,5 @@ exports.GoabTextarea = GoabTextArea;
3835
4183
  exports.GoabThreeColumnLayout = GoabThreeColumnLayout;
3836
4184
  exports.GoabTooltip = GoabTooltip;
3837
4185
  exports.GoabTwoColumnLayout = GoabTwoColumnLayout;
4186
+ exports.usePublicFormController = usePublicFormController;
3838
4187
  //# sourceMappingURL=index.js.map