@local-civics/hub-ui 0.1.97 → 0.1.98

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/dist/index.mjs CHANGED
@@ -3816,23 +3816,30 @@ const CheckboxQuestion = (props) => {
3816
3816
  props.onResponseChange(newResponses);
3817
3817
  }
3818
3818
  };
3819
+ let isOneChecked = false;
3820
+ React__default.useEffect(() => {
3821
+ }, []);
3819
3822
  return /* @__PURE__ */ React__default.createElement("fieldset", { className: "grid grid-cols-1 gap-y-8" }, options.map((option) => {
3823
+ isOneChecked = Object.keys(values).length ? true : false;
3820
3824
  return /* @__PURE__ */ React__default.createElement("div", { key: option }, /* @__PURE__ */ React__default.createElement("label", { className: "flex gap-x-4 items-center" }, /* @__PURE__ */ React__default.createElement(
3821
3825
  "input",
3822
3826
  {
3827
+ id: "checkbox",
3823
3828
  disabled: props.disabled,
3824
3829
  className: "cursor-pointer shrink-0",
3830
+ required: props.required && !isOneChecked,
3825
3831
  checked: values[option] || !option && values[`Other: ${response}`],
3826
3832
  onChange: option ? onChange : onOtherChange,
3827
3833
  type: "checkbox",
3828
3834
  value: option || response,
3829
3835
  name: displayNameString(props.displayName)
3830
3836
  }
3831
- ), option && /* @__PURE__ */ React__default.createElement("div", null, option), !option && /* @__PURE__ */ React__default.createElement(React__default.Fragment, null, "Other: ", /* @__PURE__ */ React__default.createElement(
3837
+ ), option && /* @__PURE__ */ React__default.createElement("div", null, option), !option && /* @__PURE__ */ React__default.createElement(React__default.Fragment, null, "Other:", " ", /* @__PURE__ */ React__default.createElement(
3832
3838
  "input",
3833
3839
  {
3834
- className: "w-full px-3 py-2 bg-white text-slate-500 focus:text-slate-600 text-sm placeholder-slate-400 border border-slate-300 rounded-sm shadow-sm\n focus:outline-none focus:ring-1 focus:ring-sky-500",
3840
+ className: "w-full px-3 py-2 bg-white text-slate-500 focus:text-slate-600 text-sm placeholder-slate-400 border border-slate-300 rounded-sm shadow-sm\r\n focus:outline-none focus:ring-1 focus:ring-sky-500",
3835
3841
  value: isOtherResponse ? response : "",
3842
+ required: props.required,
3836
3843
  disabled: props.disabled,
3837
3844
  onChange: onOtherChange,
3838
3845
  placeholder: "Input another option",
@@ -3903,7 +3910,7 @@ const FileUploadQuestion = (props) => {
3903
3910
  onChange: onImageUpload,
3904
3911
  name: "image",
3905
3912
  type: "file",
3906
- className: "block w-full text-sm text-slate-500 disabled:text-gray-600\n file:mr-4 file:py-2 file:px-4\n file:rounded-full file:border-0\n file:text-sm file:font-semibold\n file:bg-violet-50 file:text-violet-700\n hover:file:bg-violet-100"
3913
+ className: "block w-full text-sm text-slate-500 disabled:text-gray-600\r\n file:mr-4 file:py-2 file:px-4\r\n file:rounded-full file:border-0\r\n file:text-sm file:font-semibold\r\n file:bg-violet-50 file:text-violet-700\r\n hover:file:bg-violet-100"
3907
3914
  }
3908
3915
  ))), /* @__PURE__ */ React__default.createElement("div", { className: "-ml-2" }, /* @__PURE__ */ React__default.createElement(
3909
3916
  "input",
@@ -3915,7 +3922,7 @@ const FileUploadQuestion = (props) => {
3915
3922
  onChange,
3916
3923
  value: imageURL,
3917
3924
  placeholder: "Paste a url or select a file above",
3918
- className: "w-full mt-1 block px-3 py-2 bg-white text-slate-500 focus:text-slate-600 border border-slate-300 rounded-sm text-sm shadow-sm placeholder-slate-400\n focus:outline-none focus:border-sky-500 focus:ring-1 focus:ring-sky-500\n disabled:bg-slate-50 disabled:text-gray-600 disabled:border-slate-200 disabled:shadow-none"
3925
+ className: "w-full mt-1 block px-3 py-2 bg-white text-slate-500 focus:text-slate-600 border border-slate-300 rounded-sm text-sm shadow-sm placeholder-slate-400\r\n focus:outline-none focus:border-sky-500 focus:ring-1 focus:ring-sky-500\r\n disabled:bg-slate-50 disabled:text-gray-600 disabled:border-slate-200 disabled:shadow-none"
3919
3926
  }
3920
3927
  )));
3921
3928
  };
@@ -3931,7 +3938,7 @@ const TextQuestion = (props) => {
3931
3938
  return /* @__PURE__ */ React__default.createElement(React__default.Fragment, null, !props.paragraph && /* @__PURE__ */ React__default.createElement(
3932
3939
  "input",
3933
3940
  {
3934
- className: "mt-1 block w-full px-3 py-2 bg-white text-slate-500 focus:text-slate-600 text-sm placeholder-slate-400 border border-slate-300 rounded-sm shadow-sm\n focus:outline-none focus:ring-1 focus:ring-sky-500 focus:border-sky-500\n disabled:bg-slate-50 disabled:text-gray-600 disabled:border-slate-200 disabled:shadow-none",
3941
+ className: "mt-1 block w-full px-3 py-2 bg-white text-slate-500 focus:text-slate-600 text-sm placeholder-slate-400 border border-slate-300 rounded-sm shadow-sm\r\n focus:outline-none focus:ring-1 focus:ring-sky-500 focus:border-sky-500\r\n disabled:bg-slate-50 disabled:text-gray-600 disabled:border-slate-200 disabled:shadow-none",
3935
3942
  required: props.required,
3936
3943
  minLength: minimum,
3937
3944
  onChange,
@@ -3945,7 +3952,7 @@ const TextQuestion = (props) => {
3945
3952
  ), props.paragraph && /* @__PURE__ */ React__default.createElement(
3946
3953
  "textarea",
3947
3954
  {
3948
- className: "resize-none text-slate-500 focus:text-slate-600 h-24 mt-1 block w-full px-3 py-2 bg-white border border-slate-300 rounded-sm text-sm shadow-sm placeholder-slate-400\n focus:outline-none focus:border-sky-500 focus:ring-1 focus:ring-sky-500\n disabled:bg-slate-50 disabled:text-gray-600 disabled:border-slate-200 disabled:shadow-none",
3955
+ className: "resize-none text-slate-500 focus:text-slate-600 h-24 mt-1 block w-full px-3 py-2 bg-white border border-slate-300 rounded-sm text-sm shadow-sm placeholder-slate-400\r\n focus:outline-none focus:border-sky-500 focus:ring-1 focus:ring-sky-500\r\n disabled:bg-slate-50 disabled:text-gray-600 disabled:border-slate-200 disabled:shadow-none",
3949
3956
  required: props.required,
3950
3957
  minLength: minimum,
3951
3958
  onChange,
@@ -3968,7 +3975,7 @@ const DateQuestion = (props) => {
3968
3975
  return /* @__PURE__ */ React__default.createElement(
3969
3976
  "input",
3970
3977
  {
3971
- className: "mt-1 block w-full px-3 pt-3 pb-2 bg-white text-slate-500 focus:text-slate-600 border border-slate-300 rounded-sm text-sm shadow-sm placeholder-slate-400\n focus:outline-none focus:border-sky-500 focus:ring-1 focus:ring-sky-500\n disabled:bg-slate-50 disabled:text-gray-600 disabled:border-slate-200 disabled:shadow-none",
3978
+ className: "mt-1 block w-full px-3 pt-3 pb-2 bg-white text-slate-500 focus:text-slate-600 border border-slate-300 rounded-sm text-sm shadow-sm placeholder-slate-400\r\n focus:outline-none focus:border-sky-500 focus:ring-1 focus:ring-sky-500\r\n disabled:bg-slate-50 disabled:text-gray-600 disabled:border-slate-200 disabled:shadow-none",
3972
3979
  required: props.required,
3973
3980
  onChange,
3974
3981
  name: displayNameString(props.displayName),
@@ -3989,7 +3996,7 @@ const TimeQuestion = (props) => {
3989
3996
  return /* @__PURE__ */ React__default.createElement(
3990
3997
  "input",
3991
3998
  {
3992
- className: "mt-1 block w-full px-3 pt-3 pb-2 bg-white text-slate-500 focus:text-slate-600 border border-slate-300 rounded-sm text-sm shadow-sm placeholder-slate-400\n focus:outline-none focus:border-sky-500 focus:ring-1 focus:ring-sky-500\n disabled:bg-slate-50 disabled:text-gray-600 disabled:border-slate-200 disabled:shadow-none",
3999
+ className: "mt-1 block w-full px-3 pt-3 pb-2 bg-white text-slate-500 focus:text-slate-600 border border-slate-300 rounded-sm text-sm shadow-sm placeholder-slate-400\r\n focus:outline-none focus:border-sky-500 focus:ring-1 focus:ring-sky-500\r\n disabled:bg-slate-50 disabled:text-gray-600 disabled:border-slate-200 disabled:shadow-none",
3993
4000
  required: props.required,
3994
4001
  onChange,
3995
4002
  name: displayNameString(props.displayName),
@@ -4045,7 +4052,15 @@ const Image = (props) => {
4045
4052
  return;
4046
4053
  }
4047
4054
  };
4048
- return /* @__PURE__ */ React__default.createElement("div", { className: "relative max-w-[25rem] md:max-w-[40rem] md:w-[40rem] overflow-hidden" }, /* @__PURE__ */ React__default.createElement("img", { referrerPolicy: "no-referrer", className: `h-full max-h-[25rem] w-full object-cover ${scale}`, alt: displayNameString(props.displayName), src: props.url }), /* @__PURE__ */ React__default.createElement("div", { className: "absolute rounded-sm shadow-md bottom-5 right-5 z-5 bg-gray-100 font-bold" }, /* @__PURE__ */ React__default.createElement("span", { className: "p-5 cursor-pointer text-md text-gray-400 hover:text-gray-600", onClick: scaleUp }, "+"), /* @__PURE__ */ React__default.createElement("span", { className: "p-5 cursor-pointer text-xl text-gray-400 hover:text-gray-600", onClick: scaleDown }, "-")));
4055
+ return /* @__PURE__ */ React__default.createElement("div", { className: "relative max-w-[25rem] md:max-w-[40rem] md:w-[40rem] overflow-hidden" }, /* @__PURE__ */ React__default.createElement(
4056
+ "img",
4057
+ {
4058
+ referrerPolicy: "no-referrer",
4059
+ className: `h-full max-h-[25rem] w-full object-cover ${scale}`,
4060
+ alt: displayNameString(props.displayName),
4061
+ src: props.url
4062
+ }
4063
+ ), /* @__PURE__ */ React__default.createElement("div", { className: "absolute rounded-sm shadow-md bottom-5 right-5 z-5 bg-gray-100 font-bold" }, /* @__PURE__ */ React__default.createElement("span", { className: "p-5 cursor-pointer text-md text-gray-400 hover:text-gray-600", onClick: scaleUp }, "+"), /* @__PURE__ */ React__default.createElement("span", { className: "p-5 cursor-pointer text-xl text-gray-400 hover:text-gray-600", onClick: scaleDown }, "-")));
4049
4064
  };
4050
4065
  const Embed = (props) => {
4051
4066
  return /* @__PURE__ */ React__default.createElement("div", { className: "max-w-[25rem] md:max-w-[40rem] md:w-[40rem]" }, /* @__PURE__ */ React__default.createElement(
@@ -4120,11 +4135,14 @@ const autoSave = (run, func, callback) => {
4120
4135
  let timeout;
4121
4136
  return (items, reflection, rating) => {
4122
4137
  clearTimeout(timeout);
4123
- timeout = setTimeout(async () => run && func && await func(items, reflection, rating).then((e) => {
4124
- if (!e && callback) {
4125
- callback();
4126
- }
4127
- }), AUTOSAVE_TIMEOUT);
4138
+ timeout = setTimeout(
4139
+ async () => run && func && await func(items, reflection, rating).then((e) => {
4140
+ if (!e && callback) {
4141
+ callback();
4142
+ }
4143
+ }),
4144
+ AUTOSAVE_TIMEOUT
4145
+ );
4128
4146
  return timeout;
4129
4147
  };
4130
4148
  };
@@ -4136,7 +4154,10 @@ const LearningForm = (props) => {
4136
4154
  const [showExitDialogue, setShowExitDialogue] = React__default.useState(false);
4137
4155
  const [showSubmitDialogue, setShowSubmitDialogue] = React__default.useState(false);
4138
4156
  const [isDraft, setIsDraft] = React__default.useState(false);
4139
- const autoSaveHandler = useCallback(autoSave(isDraft, props.onSaveDraft, () => setIsDraft(false)), [isDraft]);
4157
+ const autoSaveHandler = useCallback(
4158
+ autoSave(isDraft, props.onSaveDraft, () => setIsDraft(false)),
4159
+ [isDraft]
4160
+ );
4140
4161
  const saveVisibility = isDraft ? "opacity-100 visible" : "opacity-0 invisible";
4141
4162
  const answers = [];
4142
4163
  const saveDraft = async () => {
@@ -4155,7 +4176,7 @@ const LearningForm = (props) => {
4155
4176
  }
4156
4177
  });
4157
4178
  const canReflect = !!reflection || answeredAllRequired;
4158
- const canSubmit = answeredAllRequired && reflection.length >= MIN_REFLECTION_LENGTH;
4179
+ answeredAllRequired && reflection.length >= MIN_REFLECTION_LENGTH;
4159
4180
  const items = props.items || [];
4160
4181
  const currentAnswersKey = answers && answers.length > 0 ? JSON.stringify(answers) : null;
4161
4182
  React__default.useEffect(() => {
@@ -4216,15 +4237,7 @@ const LearningForm = (props) => {
4216
4237
  /* @__PURE__ */ React__default.createElement("div", { className: "w-3 h-3 min-w-3" }, /* @__PURE__ */ React__default.createElement(Icon$1, { name: "leftArrow" })),
4217
4238
  /* @__PURE__ */ React__default.createElement("span", { className: "text-md" }, "Back")
4218
4239
  ), !!props.displayName && /* @__PURE__ */ React__default.createElement("h2", { className: "h-max font-semibold text-2xl" }, props.displayName), !!props.description && /* @__PURE__ */ React__default.createElement("p", { className: "h-max max-h-[14rem] overflow-y-auto whitespace-pre-line" }, props.description), !!props.eta && /* @__PURE__ */ React__default.createElement("p", { className: "text-sm h-max font-semibold" }, "Estimated Completion Time: ", props.eta)), /* @__PURE__ */ React__default.createElement("img", { className: "grow h-full max-h-[30rem] w-full object-cover", alt: props.displayName, src: props.imageURL })), /* @__PURE__ */ React__default.createElement("form", { className: "w-full max-w-[62.5rem] m-auto grid grid-cols-1 gap-y-12", onSubmit }, items.map((item) => {
4219
- return /* @__PURE__ */ React__default.createElement(
4220
- FormItem,
4221
- __spreadProps$6(__spreadValues$8({
4222
- key: item.itemId
4223
- }, item), {
4224
- minText: 0,
4225
- disabled: !!props.preview
4226
- })
4227
- );
4240
+ return /* @__PURE__ */ React__default.createElement(FormItem, __spreadProps$6(__spreadValues$8({ key: item.itemId }, item), { minText: 0, disabled: !!props.preview }));
4228
4241
  }), /* @__PURE__ */ React__default.createElement(
4229
4242
  FormItem,
4230
4243
  {
@@ -4239,7 +4252,18 @@ const LearningForm = (props) => {
4239
4252
  minText: MIN_REFLECTION_LENGTH,
4240
4253
  responses: reflection ? [reflection] : void 0
4241
4254
  }
4242
- ), /* @__PURE__ */ React__default.createElement(FormItem, null, /* @__PURE__ */ React__default.createElement(Rating, { disabled: !canReflect || !!props.preview, rating, setRating })), !props.preview && /* @__PURE__ */ React__default.createElement("div", { className: "w-max m-auto" }, /* @__PURE__ */ React__default.createElement(Button, { disabled: !canSubmit, type: "submit", color: "blue", size: "md", spacing: "md", border: "rounded", theme: "dark", text: "Submit" }))), !props.preview && /* @__PURE__ */ React__default.createElement("div", { className: `fixed bottom-10 right-14 transition ease-in-out ${saveVisibility}` }, /* @__PURE__ */ React__default.createElement(
4255
+ ), /* @__PURE__ */ React__default.createElement(FormItem, null, /* @__PURE__ */ React__default.createElement(Rating, { disabled: !canReflect || !!props.preview, rating, setRating })), !props.preview && /* @__PURE__ */ React__default.createElement("div", { className: "w-max m-auto" }, /* @__PURE__ */ React__default.createElement(
4256
+ Button,
4257
+ {
4258
+ type: "submit",
4259
+ color: "blue",
4260
+ size: "md",
4261
+ spacing: "md",
4262
+ border: "rounded",
4263
+ theme: "dark",
4264
+ text: "Submit"
4265
+ }
4266
+ ))), !props.preview && /* @__PURE__ */ React__default.createElement("div", { className: `fixed bottom-10 right-14 transition ease-in-out ${saveVisibility}` }, /* @__PURE__ */ React__default.createElement(
4243
4267
  Button,
4244
4268
  {
4245
4269
  type: "button",