@bigbinary/neeto-form-frontend 1.3.0 → 1.3.1

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.js CHANGED
@@ -5,7 +5,7 @@ import { noop as noop$4, findBy, slugify, toLabelAndValue, filterBy, isNotEmpty,
5
5
  import { showThumbsUpToastr, withEventTargetValue, getQueryParams, dateFormat } from '@bigbinary/neeto-commons-frontend/utils';
6
6
  import PageLoader from '@bigbinary/neeto-molecules/PageLoader';
7
7
  import { Tooltip, Dropdown as Dropdown$2, Alert, Typography, Button as Button$1, Label, Checkbox as Checkbox$1, Toastr, MultiEmailInput, DatePicker, Input as Input$2, Radio as Radio$1, Select as Select$1, Textarea as Textarea$1, Spinner as Spinner$2 } from '@bigbinary/neetoui';
8
- import { assoc, mergeLeft, prop, isEmpty, path, range, values, compose as compose$1, trim, useWith, split, either, isNil, equals, difference, reject, pluck, keys, pick, omit, isNotNil, insert, not, pipe as pipe$1, toLower, map, includes, identity, clamp as clamp$2, filter as filter$1 } from 'ramda';
8
+ import { assoc, mergeLeft, compose as compose$1, isEmpty, trim, useWith, path, split, either, isNil, values, equals, modify, prop, range, difference, without, reject, pluck, keys, pick, omit, includes, __, isNotNil, insert, not, pipe as pipe$1, toLower, map, identity, clamp as clamp$2, filter as filter$1 } from 'ramda';
9
9
  import { useQuery, useQueryClient, useMutation } from 'react-query';
10
10
  import i18next, { t as t$4 } from 'i18next';
11
11
  import { Input, Email as Email$2, Phone as Phone$2, Globe, Up, Down, MenuHorizontal, Delete, Plus, NeetoInvisible, Checkbox as Checkbox$2, Radio, Dropdown as Dropdown$3, Rating as Rating$4, Smiley, Calendar, Upload, Check, Close, FileGeneric } from '@bigbinary/neeto-icons';
@@ -18,6 +18,7 @@ import { useTranslation, Trans } from 'react-i18next';
18
18
  import { create as create$1 } from 'zustand';
19
19
  import classnames from 'classnames';
20
20
  import { Editor as Editor$1, isEditorEmpty, EditorContent } from '@bigbinary/neeto-editor';
21
+ import { shallow } from 'zustand/shallow';
21
22
  import * as yup from 'yup';
22
23
  import { object, array, string } from 'yup';
23
24
  import useHotkeys from '@bigbinary/neeto-hotkeys';
@@ -769,6 +770,7 @@ var QUESTIONS_INITIAL_VALUE = {
769
770
  };
770
771
  var RESERVED_FIELD_CODES = ["month", "date", "time"];
771
772
  var SELECTABLE_KINDS = ["radio", "checkbox", "dropdown"];
773
+ var RICH_TEXT_QUESTIONS = ["paragraph", "termsandcondition"];
772
774
 
773
775
  function _arrayWithHoles$3(arr) {
774
776
  if (Array.isArray(arr)) return arr;
@@ -9804,6 +9806,28 @@ var formHelpers = {
9804
9806
  pushToList: pushToList
9805
9807
  };
9806
9808
 
9809
+ var isBlank = compose$1(isEmpty, trim);
9810
+ var parseServerError = function parseServerError(error) {
9811
+ var _error$notice;
9812
+ return (_error$notice = error.notice) !== null && _error$notice !== void 0 ? _error$notice : t$4("neetoForm.common.somethingWentWrong");
9813
+ };
9814
+ var isEmptyValues = function isEmptyValues(obj) {
9815
+ return either(isNil, isEmpty)(obj) ? true : values(obj).every(function (value) {
9816
+ if (isEmpty(value)) {
9817
+ return true;
9818
+ } else if (Array.isArray(value)) {
9819
+ return equals([false, false, false], value);
9820
+ }
9821
+ return !value;
9822
+ });
9823
+ };
9824
+
9825
+ // eslint-disable-next-line react-hooks/rules-of-hooks
9826
+ var dotPath = useWith(path, [split(".")]);
9827
+ var isFunction$1 = function isFunction(obj) {
9828
+ return typeof obj === "function";
9829
+ };
9830
+
9807
9831
  /** @type {import("neetocommons/react-utils").ZustandStoreHook} */
9808
9832
  var useBuildFormStore = create$1(withImmutableActions(function (set) {
9809
9833
  return {
@@ -9818,10 +9842,11 @@ var useBuildFormStore = create$1(withImmutableActions(function (set) {
9818
9842
  selectedLanguage: i18next.resolvedLanguage,
9819
9843
  formId: null,
9820
9844
  enabled: false,
9821
- title: ""
9845
+ title: "",
9846
+ richTextFieldsToReset: []
9822
9847
  },
9823
- setFormData: function setFormData(payload) {
9824
- return set(assoc("formState", payload));
9848
+ setFormData: function setFormData(arg) {
9849
+ return set(modify("formState", isFunction$1(arg) ? arg : mergeLeft(arg)));
9825
9850
  }
9826
9851
  };
9827
9852
  }));
@@ -10455,25 +10480,6 @@ var Email$1 = withT(function (_ref) {
10455
10480
  }));
10456
10481
  });
10457
10482
 
10458
- var isBlank = compose$1(isEmpty, trim);
10459
- var parseServerError = function parseServerError(error) {
10460
- var _error$notice;
10461
- return (_error$notice = error.notice) !== null && _error$notice !== void 0 ? _error$notice : t$4("neetoForm.common.somethingWentWrong");
10462
- };
10463
- var isEmptyValues = function isEmptyValues(obj) {
10464
- return either(isNil, isEmpty)(obj) ? true : values(obj).every(function (value) {
10465
- if (isEmpty(value)) {
10466
- return true;
10467
- } else if (Array.isArray(value)) {
10468
- return equals([false, false, false], value);
10469
- }
10470
- return !value;
10471
- });
10472
- };
10473
-
10474
- // eslint-disable-next-line react-hooks/rules-of-hooks
10475
- var dotPath = useWith(path, [split(".")]);
10476
-
10477
10483
  var FileGroup = function FileGroup(_ref) {
10478
10484
  var name = _ref.name,
10479
10485
  label = _ref.label,
@@ -11048,18 +11054,42 @@ var StarRating$3 = function StarRating(_ref) {
11048
11054
  }));
11049
11055
  };
11050
11056
 
11051
- var useUpdateEditorContent = function useUpdateEditorContent(editorRef, fieldName, value) {
11057
+ var useUpdateEditorContent = function useUpdateEditorContent(_ref) {
11058
+ var editorRef = _ref.editorRef,
11059
+ fieldName = _ref.fieldName,
11060
+ value = _ref.value,
11061
+ initialValue = _ref.initialValue,
11062
+ fieldCode = _ref.fieldCode;
11052
11063
  var initialStateRef = useRef({
11053
11064
  language: "",
11054
11065
  value: null
11055
11066
  });
11056
- var _useBuildFormState = useBuildFormState(),
11057
- formId = _useBuildFormState.formId,
11058
- language = _useBuildFormState.selectedLanguage;
11067
+ var _useBuildFormStore = useBuildFormStore(function (store) {
11068
+ return {
11069
+ setFormData: store["setFormData"]
11070
+ };
11071
+ }, shallow),
11072
+ setFormData = _useBuildFormStore.setFormData;
11073
+ var _useBuildFormStore2 = useBuildFormStore(function (store) {
11074
+ var _store$formState, _store$formState2;
11075
+ return {
11076
+ formId: (_store$formState = store["formState"]) === null || _store$formState === void 0 ? void 0 : _store$formState["formId"],
11077
+ selectedLanguage: (_store$formState2 = store["formState"]) === null || _store$formState2 === void 0 ? void 0 : _store$formState2["selectedLanguage"]
11078
+ };
11079
+ }, shallow),
11080
+ formId = _useBuildFormStore2.formId,
11081
+ language = _useBuildFormStore2.selectedLanguage;
11082
+ var shouldReset = useBuildFormStore(function (store) {
11083
+ return store.formState.richTextFieldsToReset.includes(fieldCode);
11084
+ });
11059
11085
  var setEditorContent = function setEditorContent(content) {
11060
11086
  var _editorRef$current$ed;
11061
11087
  return (_editorRef$current$ed = editorRef.current.editor) === null || _editorRef$current$ed === void 0 || (_editorRef$current$ed = _editorRef$current$ed.commands) === null || _editorRef$current$ed === void 0 ? void 0 : _editorRef$current$ed.setContent(content);
11062
11088
  };
11089
+ if (shouldReset) {
11090
+ setEditorContent(initialValue);
11091
+ setFormData(modify("richTextFieldsToReset", without([fieldCode])));
11092
+ }
11063
11093
  useEffect(function () {
11064
11094
  if (initialStateRef.current["language"] !== language) {
11065
11095
  initialStateRef.current["language"] = language;
@@ -11086,11 +11116,13 @@ var useUpdateEditorContent = function useUpdateEditorContent(editorRef, fieldNam
11086
11116
 
11087
11117
  var Terms$1 = function Terms(_ref) {
11088
11118
  var name = _ref.name,
11119
+ item = _ref.item,
11089
11120
  isLabelDisabled = _ref.isLabelDisabled;
11090
11121
  var editorRef = useRef({
11091
11122
  editor: {}
11092
11123
  });
11093
11124
  var fieldName = "".concat(name, ".label");
11125
+ var fieldCode = item.fieldCode;
11094
11126
  var _useField = useField({
11095
11127
  name: fieldName,
11096
11128
  validate: validateEditorContent(editorRef)
@@ -11100,10 +11132,17 @@ var Terms$1 = function Terms(_ref) {
11100
11132
  _useField2$ = _useField2[1],
11101
11133
  touched = _useField2$.touched,
11102
11134
  error = _useField2$.error,
11135
+ initialValue = _useField2$.initialValue,
11103
11136
  _useField2$2 = _useField2[2],
11104
11137
  setTouched = _useField2$2.setTouched,
11105
11138
  setValue = _useField2$2.setValue;
11106
- useUpdateEditorContent(editorRef, fieldName, value);
11139
+ useUpdateEditorContent({
11140
+ editorRef: editorRef,
11141
+ fieldName: fieldName,
11142
+ value: value,
11143
+ initialValue: initialValue,
11144
+ fieldCode: fieldCode
11145
+ });
11107
11146
  return /*#__PURE__*/React__default.createElement("div", {
11108
11147
  className: "w-full cursor-auto"
11109
11148
  }, /*#__PURE__*/React__default.createElement(Editor$1, {
@@ -11145,11 +11184,13 @@ var Fields = {
11145
11184
 
11146
11185
  var Editor = function Editor(_ref) {
11147
11186
  var name = _ref.name,
11187
+ item = _ref.item,
11148
11188
  isLabelDisabled = _ref.isLabelDisabled;
11149
11189
  var editorRef = useRef({
11150
11190
  editor: {}
11151
11191
  });
11152
11192
  var fieldName = "".concat(name, ".label");
11193
+ var fieldCode = item.fieldCode;
11153
11194
  var _useField = useField({
11154
11195
  name: fieldName,
11155
11196
  validate: validateEditorContent(editorRef)
@@ -11159,10 +11200,17 @@ var Editor = function Editor(_ref) {
11159
11200
  _useField2$ = _useField2[1],
11160
11201
  touched = _useField2$.touched,
11161
11202
  error = _useField2$.error,
11203
+ initialValue = _useField2$.initialValue,
11162
11204
  _useField2$2 = _useField2[2],
11163
11205
  setTouched = _useField2$2.setTouched,
11164
11206
  setValue = _useField2$2.setValue;
11165
- useUpdateEditorContent(editorRef, fieldName, value);
11207
+ useUpdateEditorContent({
11208
+ editorRef: editorRef,
11209
+ fieldName: fieldName,
11210
+ value: value,
11211
+ initialValue: initialValue,
11212
+ fieldCode: fieldCode
11213
+ });
11166
11214
  return /*#__PURE__*/React__default.createElement("div", {
11167
11215
  className: "w-full cursor-auto"
11168
11216
  }, /*#__PURE__*/React__default.createElement(Editor$1, {
@@ -11887,6 +11935,15 @@ var Form = function Form(_ref) {
11887
11935
  if (isNotEmpty(questionLabel)) return truncate(questionLabel, 40);
11888
11936
  return humanize(questionKind);
11889
11937
  };
11938
+ var richTextQuestions = filterBy({
11939
+ kind: includes(__, RICH_TEXT_QUESTIONS)
11940
+ }, questions);
11941
+ var resetFormData = function resetFormData() {
11942
+ resetForm();
11943
+ setFormData({
11944
+ richTextFieldsToReset: pluck("fieldCode", richTextQuestions)
11945
+ });
11946
+ };
11890
11947
  return /*#__PURE__*/React__default.createElement(React__default.Fragment, null, /*#__PURE__*/React__default.createElement(Alert, {
11891
11948
  isOpen: isNotNil(deleteQuestionIndex),
11892
11949
  submitButtonLabel: t("neetoForm.common.delete"),
@@ -11976,13 +12033,11 @@ var Form = function Form(_ref) {
11976
12033
  }))), showActionBlock && /*#__PURE__*/React__default.createElement("div", {
11977
12034
  className: "neeto-ui-border-gray-300 flex-shrink-0 border-t py-4"
11978
12035
  }, /*#__PURE__*/React__default.createElement(ActionBlock, {
11979
- className: "space-x-2",
12036
+ submitButtonProps: submitButtonProps,
11980
12037
  cancelButtonProps: _objectSpread$h({
11981
- label: t("neetoForm.common.reset")
11982
- }, cancelButtonProps),
11983
- submitButtonProps: _objectSpread$h({
11984
- disabled: isSubmitting || !dirty
11985
- }, submitButtonProps)
12038
+ label: t("neetoForm.common.reset"),
12039
+ onClick: resetFormData
12040
+ }, cancelButtonProps)
11986
12041
  }))));
11987
12042
  };
11988
12043
 
@@ -27015,7 +27070,7 @@ var TermsField = function TermsField(_ref) {
27015
27070
  kind = question.kind,
27016
27071
  isRequired = question.isRequired,
27017
27072
  nodeId = question.nodeId;
27018
- var label = fieldWithFallback(question, "label");
27073
+ var label = fieldWithFallback(question, "label", true);
27019
27074
  return /*#__PURE__*/React__default.createElement(Field, {
27020
27075
  name: name || nodeId,
27021
27076
  validate: validateFieldValue({
@@ -27101,14 +27156,16 @@ var _QUESTION_TO_COMPONEN;
27101
27156
  var QUESTION_TO_COMPONENT_MAP = (_QUESTION_TO_COMPONEN = {}, _defineProperty$6(_QUESTION_TO_COMPONEN, QUESTION_KIND.TEXT.value, TextField), _defineProperty$6(_QUESTION_TO_COMPONEN, QUESTION_KIND.NAME.value, NameField), _defineProperty$6(_QUESTION_TO_COMPONEN, QUESTION_KIND.EMAIL.value, EmailField), _defineProperty$6(_QUESTION_TO_COMPONEN, QUESTION_KIND.INTEGER.value, TextField), _defineProperty$6(_QUESTION_TO_COMPONEN, QUESTION_KIND.DECIMAL.value, TextField), _defineProperty$6(_QUESTION_TO_COMPONEN, QUESTION_KIND.PHONE.value, PhoneNumberField), _defineProperty$6(_QUESTION_TO_COMPONEN, QUESTION_KIND.QUESTION.value, TextField), _defineProperty$6(_QUESTION_TO_COMPONEN, QUESTION_KIND.TEXTAREA.value, TextField), _defineProperty$6(_QUESTION_TO_COMPONEN, QUESTION_KIND.CHECKBOX.value, OptionsField), _defineProperty$6(_QUESTION_TO_COMPONEN, QUESTION_KIND.RADIO.value, OptionsField), _defineProperty$6(_QUESTION_TO_COMPONEN, QUESTION_KIND.DROPDOWN.value, OptionsField), _defineProperty$6(_QUESTION_TO_COMPONEN, QUESTION_KIND.RATING.value, RatingField), _defineProperty$6(_QUESTION_TO_COMPONEN, QUESTION_KIND.PARAGRAPH.value, function (_ref) {
27102
27157
  var question = _ref.question;
27103
27158
  return /*#__PURE__*/React__default.createElement(EditorContent, {
27104
- content: isEmpty(question.label) ? question.labelFallback : question.label
27159
+ content: fieldWithFallback(question, "label", true)
27105
27160
  });
27106
27161
  }), _defineProperty$6(_QUESTION_TO_COMPONEN, QUESTION_KIND.TERMS.value, TermsField), _defineProperty$6(_QUESTION_TO_COMPONEN, QUESTION_KIND.DATE.value, DateField), _defineProperty$6(_QUESTION_TO_COMPONEN, QUESTION_KIND.STAR_RATING.value, StarRatingField), _defineProperty$6(_QUESTION_TO_COMPONEN, QUESTION_KIND.ADDITIONAL_GUESTS.value, MultipleEmailInput), _defineProperty$6(_QUESTION_TO_COMPONEN, QUESTION_KIND.RICH_TEXT.value, RichTextEditor), _defineProperty$6(_QUESTION_TO_COMPONEN, QUESTION_KIND.CONDITION.value, ConditionField), _defineProperty$6(_QUESTION_TO_COMPONEN, QUESTION_KIND.FILE_UPLOAD.value, FileUploadField), _QUESTION_TO_COMPONEN);
27107
27162
 
27108
27163
  var fieldWithFallback = function fieldWithFallback(question, fieldName) {
27164
+ var hasRichContent = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
27109
27165
  var fallback = question["".concat(fieldName, "Fallback")];
27110
27166
  var field = question[fieldName];
27111
- return isEmpty(field) && isNotNil(fallback) ? fallback : field;
27167
+ var isFieldEmpty = hasRichContent ? isEditorEmpty(field) : isEmpty(field);
27168
+ return isFieldEmpty && isNotNil(fallback) ? fallback : field;
27112
27169
  };
27113
27170
  var getFieldComponent = function getFieldComponent(_ref) {
27114
27171
  var kind = _ref.kind;