@bigbinary/neeto-form-frontend 1.2.38 → 1.2.40

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.cjs.js CHANGED
@@ -5,22 +5,22 @@ Object.defineProperty(exports, '__esModule', { value: true });
5
5
  var React$2 = require('react');
6
6
  var formik = require('formik');
7
7
  var neetoCist = require('@bigbinary/neeto-cist');
8
+ var utils = require('@bigbinary/neeto-commons-frontend/utils');
8
9
  var PageLoader = require('@bigbinary/neeto-molecules/PageLoader');
9
10
  var neetoui = require('@bigbinary/neetoui');
10
11
  var ramda = require('ramda');
11
12
  var reactQuery = require('react-query');
12
13
  var i18next = require('i18next');
13
14
  var neetoIcons = require('@bigbinary/neeto-icons');
15
+ var reactUtils = require('@bigbinary/neeto-commons-frontend/react-utils');
14
16
  var axios = require('axios');
15
17
  var ReactDOM = require('react-dom');
16
18
  var formik$1 = require('@bigbinary/neetoui/formik');
17
19
  var reactI18next = require('react-i18next');
18
- var reactUtils = require('@bigbinary/neeto-commons-frontend/react-utils');
19
20
  var zustand = require('zustand');
20
21
  var classnames = require('classnames');
21
- var neetoEditor = require('@bigbinary/neeto-editor');
22
22
  var yup = require('yup');
23
- var utils = require('@bigbinary/neeto-commons-frontend/utils');
23
+ var neetoEditor = require('@bigbinary/neeto-editor');
24
24
  var useHotkeys = require('@bigbinary/neeto-hotkeys');
25
25
  var dayjs = require('dayjs');
26
26
  var PhoneNumber$1 = require('@bigbinary/neeto-molecules/PhoneNumber');
@@ -548,11 +548,19 @@ var updateForm = function updateForm(formId, payload) {
548
548
  var destroyForm = function destroyForm(formId) {
549
549
  return axios__default["default"]["delete"](getFormsUrl(formId));
550
550
  };
551
- var getQuestions = function getQuestions(formId) {
552
- return axios__default["default"].get(getQuestionsUrl(formId));
551
+ var getQuestions = function getQuestions(formId, language) {
552
+ return axios__default["default"].get(getQuestionsUrl(formId), {
553
+ params: {
554
+ language: language
555
+ }
556
+ });
553
557
  };
554
- var getPublicQuestions = function getPublicQuestions(formId) {
555
- return axios__default["default"].get("".concat(BASE_URL, "/api/v1/forms/").concat(formId, "/public/questions/"));
558
+ var getPublicQuestions = function getPublicQuestions(formId, language) {
559
+ return axios__default["default"].get("".concat(BASE_URL, "/api/v1/forms/").concat(formId, "/public/questions/"), {
560
+ params: {
561
+ language: language
562
+ }
563
+ });
556
564
  };
557
565
  var updateQuestions = function updateQuestions(formId, payload) {
558
566
  return axios__default["default"].patch(getQuestionsUrl(formId), payload);
@@ -591,21 +599,25 @@ var neetoFormApi = {
591
599
  updatePublicSubmission: updatePublicSubmission
592
600
  };
593
601
 
594
- var _excluded$b = ["formId", "preview"],
602
+ var _excluded$b = ["formId", "preview", "language"],
595
603
  _excluded3$1 = ["formId", "submissionId"];
596
604
  function ownKeys$g(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
597
605
  function _objectSpread$f(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys$g(Object(t), !0).forEach(function (r) { _defineProperty$6(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys$g(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
598
606
  var useForm = function useForm(_ref) {
599
607
  var formId = _ref.formId,
600
- preview = _ref.preview,
608
+ _ref$preview = _ref.preview,
609
+ preview = _ref$preview === void 0 ? null : _ref$preview,
610
+ _ref$language = _ref.language,
611
+ language = _ref$language === void 0 ? "en" : _ref$language,
601
612
  options = _objectWithoutProperties$1(_ref, _excluded$b);
602
- return reactQuery.useQuery([QUERY_KEYS.QUESTIONS, preview ? "preview/".concat(formId) : formId], function () {
603
- return neetoFormApi.getPublicQuestions(formId);
613
+ return reactQuery.useQuery([QUERY_KEYS.QUESTIONS, preview ? "preview/".concat(formId) : formId, language], function () {
614
+ return neetoFormApi.getPublicQuestions(formId, language);
604
615
  }, _objectSpread$f({
605
616
  keepPreviousData: true
606
617
  }, options));
607
618
  };
608
619
  var useCreateForm = function useCreateForm(options) {
620
+ var language = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : "en";
609
621
  var queryClient = reactQuery.useQueryClient();
610
622
  return reactQuery.useMutation(neetoFormApi.createForm, _objectSpread$f(_objectSpread$f({}, options), {}, {
611
623
  onSuccess: function onSuccess(form) {
@@ -613,14 +625,15 @@ var useCreateForm = function useCreateForm(options) {
613
625
  queryClient.setQueryData(QUERY_KEYS.QUESTIONS, function (forms) {
614
626
  return forms && [].concat(_toConsumableArray$1(forms), [form]);
615
627
  });
616
- queryClient.setQueryData([QUERY_KEYS.QUESTIONS, form.id], form);
617
- queryClient.setQueryData([QUERY_KEYS.QUESTIONS, "preview/".concat(form.id)], form);
628
+ queryClient.setQueryData([QUERY_KEYS.QUESTIONS, form.id, language], form);
629
+ queryClient.setQueryData([QUERY_KEYS.QUESTIONS, "preview/".concat(form.id), language], form);
618
630
  queryClient.invalidateQueries([QUERY_KEYS.FORMS]);
619
631
  options === null || options === void 0 || (_options$onSuccess = options.onSuccess) === null || _options$onSuccess === void 0 || _options$onSuccess.call(options, form);
620
632
  }
621
633
  }));
622
634
  };
623
635
  var useUpdateForm = function useUpdateForm(options) {
636
+ var language = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : "en";
624
637
  var queryClient = reactQuery.useQueryClient();
625
638
  return reactQuery.useMutation(function (_ref2) {
626
639
  var id = _ref2.id,
@@ -629,25 +642,25 @@ var useUpdateForm = function useUpdateForm(options) {
629
642
  }, _objectSpread$f(_objectSpread$f({}, options), {}, {
630
643
  onSuccess: function onSuccess(data, _ref3) {
631
644
  var id = _ref3.id;
632
- queryClient.setQueryData([QUERY_KEYS.QUESTIONS, id], function (form) {
645
+ queryClient.setQueryData([QUERY_KEYS.QUESTIONS, id, language], function (form) {
633
646
  return _objectSpread$f(_objectSpread$f({}, form), {}, {
634
647
  title: data.title
635
648
  });
636
649
  });
637
- queryClient.setQueryData([QUERY_KEYS.QUESTIONS, "preview/".concat(id)], function (form) {
650
+ queryClient.setQueryData([QUERY_KEYS.QUESTIONS, "preview/".concat(id), language], function (form) {
638
651
  return _objectSpread$f(_objectSpread$f({}, form), {}, {
639
652
  title: data.title,
640
653
  questions: data.questions
641
654
  });
642
655
  });
643
656
  queryClient.invalidateQueries([QUERY_KEYS.FORMS]);
644
- queryClient.invalidateQueries([QUERY_KEYS.QUESTIONS, id]);
645
- queryClient.invalidateQueries([QUERY_KEYS.QUESTIONS, "preview/".concat(id)]);
657
+ queryClient.invalidateQueries([QUERY_KEYS.QUESTIONS, id, language]);
658
+ queryClient.invalidateQueries([QUERY_KEYS.QUESTIONS, "preview/".concat(id), language]);
646
659
  options.onSuccess && options.onSuccess(data);
647
660
  }
648
661
  }));
649
662
  };
650
- var useUpdateQuestions = function useUpdateQuestions(options) {
663
+ var useUpdateQuestions = function useUpdateQuestions(options, language) {
651
664
  var queryClient = reactQuery.useQueryClient();
652
665
  return reactQuery.useMutation(function (_ref4) {
653
666
  var id = _ref4.id,
@@ -660,12 +673,12 @@ var useUpdateQuestions = function useUpdateQuestions(options) {
660
673
  }
661
674
  var data = args[0],
662
675
  id = args[1].id;
663
- queryClient.setQueryData([QUERY_KEYS.QUESTIONS, id], function (form) {
676
+ queryClient.setQueryData([QUERY_KEYS.QUESTIONS, id, language], function (form) {
664
677
  return _objectSpread$f(_objectSpread$f({}, form), {}, {
665
678
  questions: data.questions
666
679
  });
667
680
  });
668
- queryClient.setQueryData([QUERY_KEYS.QUESTIONS, "preview/".concat(id)], function (form) {
681
+ queryClient.setQueryData([QUERY_KEYS.QUESTIONS, "preview/".concat(id), language], function (form) {
669
682
  return _objectSpread$f(_objectSpread$f({}, form), {}, {
670
683
  questions: data.questions
671
684
  });
@@ -680,27 +693,23 @@ var useForms = function useForms(options) {
680
693
  }, options));
681
694
  };
682
695
  var useDeleteForm = function useDeleteForm(options) {
683
- var queryClient = reactQuery.useQueryClient();
684
- return reactQuery.useMutation(function (_ref5) {
696
+ return reactUtils.useMutationWithInvalidation(function (_ref5) {
685
697
  var id = _ref5.id;
686
698
  return neetoFormApi.destroyForm(id);
687
699
  }, _objectSpread$f(_objectSpread$f({}, options), {}, {
700
+ keysToInvalidate: function keysToInvalidate(_, _ref6) {
701
+ var id = _ref6.id;
702
+ return [QUERY_KEYS.FORMS, [QUERY_KEYS.QUESTIONS, id], [QUERY_KEYS.QUESTIONS, "preview/".concat(id)]];
703
+ },
688
704
  onSuccess: function onSuccess() {
689
- for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {
690
- args[_key2] = arguments[_key2];
691
- }
692
- var id = args[1].id;
693
- queryClient.invalidateQueries([QUERY_KEYS.FORMS]);
694
- queryClient.invalidateQueries([QUERY_KEYS.QUESTIONS, id]);
695
- queryClient.invalidateQueries([QUERY_KEYS.QUESTIONS, "preview/".concat(id)]);
696
- options.onSuccess && options.onSuccess.apply(options, args);
705
+ options.onSuccess && options.onSuccess.apply(options, arguments);
697
706
  }
698
707
  }));
699
708
  };
700
- var useSubmission = function useSubmission(_ref7) {
701
- var formId = _ref7.formId,
702
- submissionId = _ref7.submissionId,
703
- options = _objectWithoutProperties$1(_ref7, _excluded3$1);
709
+ var useSubmission = function useSubmission(_ref8) {
710
+ var formId = _ref8.formId,
711
+ submissionId = _ref8.submissionId,
712
+ options = _objectWithoutProperties$1(_ref8, _excluded3$1);
704
713
  return reactQuery.useQuery([QUERY_KEYS.SUBMISSION, formId, submissionId], function () {
705
714
  return neetoFormApi.getPublicSubmission(formId, submissionId);
706
715
  }, _objectSpread$f(_objectSpread$f({}, options), {}, {
@@ -709,15 +718,15 @@ var useSubmission = function useSubmission(_ref7) {
709
718
  };
710
719
  var useCreateSubmission = function useCreateSubmission(options) {
711
720
  var queryClient = reactQuery.useQueryClient();
712
- return reactQuery.useMutation(function (_ref8) {
713
- var formId = _ref8.formId,
714
- values = _ref8.values;
721
+ return reactQuery.useMutation(function (_ref9) {
722
+ var formId = _ref9.formId,
723
+ values = _ref9.values;
715
724
  return neetoFormApi.submitPublicForm(formId, values);
716
725
  }, _objectSpread$f(_objectSpread$f({}, options), {}, {
717
726
  onSuccess: function onSuccess() {
718
727
  var _data$submission, _data$submission2;
719
- for (var _len3 = arguments.length, args = new Array(_len3), _key3 = 0; _key3 < _len3; _key3++) {
720
- args[_key3] = arguments[_key3];
728
+ for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {
729
+ args[_key2] = arguments[_key2];
721
730
  }
722
731
  var data = args[0],
723
732
  formId = args[1].formId;
@@ -730,15 +739,15 @@ var useCreateSubmission = function useCreateSubmission(options) {
730
739
  };
731
740
  var useUpdateSubmission = function useUpdateSubmission(options) {
732
741
  var queryClient = reactQuery.useQueryClient();
733
- return reactQuery.useMutation(function (_ref9) {
734
- var formId = _ref9.formId,
735
- values = _ref9.values;
742
+ return reactQuery.useMutation(function (_ref10) {
743
+ var formId = _ref10.formId,
744
+ values = _ref10.values;
736
745
  return neetoFormApi.updatePublicSubmission(formId, values);
737
746
  }, _objectSpread$f(_objectSpread$f({}, options), {}, {
738
747
  onSuccess: function onSuccess() {
739
748
  var _data$submission3;
740
- for (var _len4 = arguments.length, args = new Array(_len4), _key4 = 0; _key4 < _len4; _key4++) {
741
- args[_key4] = arguments[_key4];
749
+ for (var _len3 = arguments.length, args = new Array(_len3), _key3 = 0; _key3 < _len3; _key3++) {
750
+ args[_key3] = arguments[_key3];
742
751
  }
743
752
  var data = args[0],
744
753
  formId = args[1].formId;
@@ -840,12 +849,12 @@ var useUpdateSubmission = function useUpdateSubmission(options) {
840
849
  nodeId: "37683bae-da1b-4890-ade9-0664006dc57d"
841
850
  }]
842
851
  });
843
- var THUMBS_UP = {
844
- icon: "👍",
845
- className: "w-20"
846
- };
847
852
  var QUESTIONS_WITHOUT_FIELD_CODE = ["paragraph", "termsandcondition", "condition", "file_upload"];
848
853
  var RESERVED_FIELD_CODES = ["month", "date", "time"];
854
+ var DEFAULT_AVAILABLE_LANGUAGES = [{
855
+ code: "en",
856
+ name: "English"
857
+ }];
849
858
 
850
859
  function _arrayWithHoles$3(arr) {
851
860
  if (Array.isArray(arr)) return arr;
@@ -9902,6 +9911,60 @@ var useBuildFormState = function useBuildFormState() {
9902
9911
  return useBuildFormStore(ramda.prop("formState"));
9903
9912
  };
9904
9913
 
9914
+ var ChangeLanguageDropdown = function ChangeLanguageDropdown(_ref) {
9915
+ var dirty = _ref.dirty,
9916
+ initialLanguage = _ref.initialLanguage,
9917
+ languages = _ref.languages,
9918
+ onChange = _ref.onChange;
9919
+ var _useState = React$2.useState(false),
9920
+ _useState2 = _slicedToArray$3(_useState, 2),
9921
+ isUnsavedChangesAlertOpen = _useState2[0],
9922
+ setIsUnsavedChangesAlertOpen = _useState2[1];
9923
+ var _useState3 = React$2.useState(initialLanguage),
9924
+ _useState4 = _slicedToArray$3(_useState3, 2),
9925
+ selectedLanguage = _useState4[0],
9926
+ setSelectedLanguage = _useState4[1];
9927
+ var _useTranslation = reactI18next.useTranslation(),
9928
+ t = _useTranslation.t;
9929
+ var languageChangeHandler = function languageChangeHandler(code) {
9930
+ if (!dirty) {
9931
+ onChange(code);
9932
+ return;
9933
+ }
9934
+ setSelectedLanguage(code);
9935
+ setIsUnsavedChangesAlertOpen(true);
9936
+ };
9937
+ return /*#__PURE__*/React__default["default"].createElement(React__default["default"].Fragment, null, /*#__PURE__*/React__default["default"].createElement(neetoui.Tooltip, {
9938
+ content: t("neetoForm.questions.changeLanguage")
9939
+ }, /*#__PURE__*/React__default["default"].createElement("div", null, /*#__PURE__*/React__default["default"].createElement(neetoui.Dropdown, {
9940
+ buttonStyle: "text",
9941
+ icon: neetoIcons.Globe,
9942
+ position: "top-start"
9943
+ }, /*#__PURE__*/React__default["default"].createElement(neetoui.Dropdown.Menu, null, languages.map(function (_ref2) {
9944
+ var code = _ref2.code,
9945
+ name = _ref2.name;
9946
+ return /*#__PURE__*/React__default["default"].createElement(neetoui.Dropdown.MenuItem.Button, {
9947
+ isActive: initialLanguage === code,
9948
+ key: code,
9949
+ onClick: function onClick() {
9950
+ return languageChangeHandler(code);
9951
+ }
9952
+ }, name);
9953
+ }))))), /*#__PURE__*/React__default["default"].createElement(neetoui.Alert, {
9954
+ isOpen: isUnsavedChangesAlertOpen,
9955
+ message: t("neetoForm.questions.unsavedChangesAlert.message"),
9956
+ submitButtonLabel: t("neetoForm.questions.unsavedChangesAlert.discard"),
9957
+ title: t("neetoForm.questions.unsavedChangesAlert.title"),
9958
+ onClose: function onClose() {
9959
+ return setIsUnsavedChangesAlertOpen(false);
9960
+ },
9961
+ onSubmit: function onSubmit() {
9962
+ onChange(selectedLanguage);
9963
+ setIsUnsavedChangesAlertOpen(false);
9964
+ }
9965
+ }));
9966
+ };
9967
+
9905
9968
  var ListItem = function ListItem(_ref) {
9906
9969
  var _ref$icon = _ref.icon,
9907
9970
  Icon = _ref$icon === void 0 ? null : _ref$icon,
@@ -10256,6 +10319,7 @@ var FILE_TYPES = {
10256
10319
  IMAGES: "images",
10257
10320
  AUDIO_VIDEO: "audio/video"
10258
10321
  };
10322
+ var MULTIPLE_CHOICE_FIELD_MIN_OPTIONS = 2;
10259
10323
  var SINGLE_CHOICE_FIELD_MIN_OPTIONS$1 = 2;
10260
10324
  var DROPDOWN_FIELD_MIN_OPTIONS$1 = 2;
10261
10325
  var STAR_RATING_ICONS_MAP = {
@@ -10277,6 +10341,8 @@ var FILE_GROUPS = [{
10277
10341
  label: i18next.t("neetoForm.fileTypes.audioVideo"),
10278
10342
  name: FILE_TYPES.AUDIO_VIDEO
10279
10343
  }];
10344
+ var STAR_RATING_MIN_COUNT = 0;
10345
+ var STAR_RATING_MAX_COUNT = 10;
10280
10346
 
10281
10347
  var Dropdown$1 = function Dropdown(_ref) {
10282
10348
  var item = _ref.item,
@@ -10578,7 +10644,10 @@ var MultipleChoice$1 = function MultipleChoice(_ref) {
10578
10644
  disabled: isLabelDisabled,
10579
10645
  label: t("neetoForm.questions.common.questionFields.field.question"),
10580
10646
  name: "".concat(name, ".label"),
10581
- rows: 1
10647
+ rows: 1,
10648
+ placeholder: t("neetoForm.questions.common.questionFields.field.labelExample", {
10649
+ what: t("neetoForm.common.hobbies")
10650
+ })
10582
10651
  })), /*#__PURE__*/React__default["default"].createElement("div", {
10583
10652
  className: "w-full"
10584
10653
  }, /*#__PURE__*/React__default["default"].createElement(formik.FieldArray, {
@@ -10597,14 +10666,17 @@ var MultipleChoice$1 = function MultipleChoice(_ref) {
10597
10666
  }, /*#__PURE__*/React__default["default"].createElement(InputWithMaxLength, {
10598
10667
  required: true,
10599
10668
  disabled: freezeOptions,
10600
- name: "".concat(name, ".optionsAttributes.").concat(index, ".label")
10669
+ name: "".concat(name, ".optionsAttributes.").concat(index, ".label"),
10670
+ placeholder: t("neetoForm.questions.common.questionFields.field.numberedOption", {
10671
+ number: index + 1
10672
+ })
10601
10673
  }), !freezeOptions && /*#__PURE__*/React__default["default"].createElement(neetoui.Button, {
10602
- className: classnames__default["default"]({
10603
- invisible: index === 0
10604
- }),
10605
10674
  icon: neetoIcons.Delete,
10606
10675
  size: "small",
10607
10676
  style: "text",
10677
+ className: classnames__default["default"]({
10678
+ invisible: index < MULTIPLE_CHOICE_FIELD_MIN_OPTIONS
10679
+ }),
10608
10680
  tooltipProps: {
10609
10681
  position: "top",
10610
10682
  content: t("neetoForm.common.delete")
@@ -10821,7 +10893,10 @@ var SingleChoice$1 = function SingleChoice(_ref) {
10821
10893
  disabled: isLabelDisabled,
10822
10894
  label: t("neetoForm.questions.common.questionFields.field.question"),
10823
10895
  name: "".concat(name, ".label"),
10824
- rows: 1
10896
+ rows: 1,
10897
+ placeholder: t("neetoForm.questions.common.questionFields.field.labelExample", {
10898
+ what: t("neetoForm.common.country")
10899
+ })
10825
10900
  })), /*#__PURE__*/React__default["default"].createElement("div", {
10826
10901
  className: "w-full"
10827
10902
  }, /*#__PURE__*/React__default["default"].createElement(formik.FieldArray, {
@@ -10881,6 +10956,26 @@ var SingleChoice$1 = function SingleChoice(_ref) {
10881
10956
  }));
10882
10957
  };
10883
10958
 
10959
+ var validateStarRatingCount = function validateStarRatingCount(value) {
10960
+ try {
10961
+ var schema = yup__namespace.number().integer().transform(function (value) {
10962
+ return isNaN(value) ? null : value;
10963
+ }).min(STAR_RATING_MIN_COUNT, i18next.t("neetoForm.error.minCount", {
10964
+ field: i18next.t("neetoForm.common.count"),
10965
+ value: STAR_RATING_MIN_COUNT
10966
+ })).max(STAR_RATING_MAX_COUNT, i18next.t("neetoForm.error.maxCount", {
10967
+ field: i18next.t("neetoForm.common.count"),
10968
+ value: STAR_RATING_MAX_COUNT
10969
+ })).nullable().required(i18next.t("neetoForm.common.fieldReq", {
10970
+ field: i18next.t("neetoForm.common.count")
10971
+ }));
10972
+ schema.validateSync(value);
10973
+ return undefined;
10974
+ } catch (error) {
10975
+ return error.message;
10976
+ }
10977
+ };
10978
+
10884
10979
  var StarRating$3 = function StarRating(_ref) {
10885
10980
  var name = _ref.name,
10886
10981
  isRequired = _ref.isRequired,
@@ -10890,8 +10985,19 @@ var StarRating$3 = function StarRating(_ref) {
10890
10985
  t = _useTranslation.t;
10891
10986
  var _useField = formik.useField("".concat(name, ".shape")),
10892
10987
  _useField2 = _slicedToArray$3(_useField, 3),
10893
- value = _useField2[0].value,
10894
- setValue = _useField2[2].setValue;
10988
+ shape = _useField2[0].value;
10989
+ _useField2[1];
10990
+ var setShape = _useField2[2].setValue;
10991
+ var _useField3 = formik.useField({
10992
+ name: "".concat(name, ".count"),
10993
+ validate: validateStarRatingCount
10994
+ }),
10995
+ _useField4 = _slicedToArray$3(_useField3, 3),
10996
+ countField = _useField4[0],
10997
+ _useField4$ = _useField4[1],
10998
+ countTouched = _useField4$.touched,
10999
+ countError = _useField4$.error,
11000
+ setCount = _useField4[2].setValue;
10895
11001
  return /*#__PURE__*/React__default["default"].createElement("div", {
10896
11002
  className: "space-y-4"
10897
11003
  }, /*#__PURE__*/React__default["default"].createElement("div", {
@@ -10902,19 +11008,22 @@ var StarRating$3 = function StarRating(_ref) {
10902
11008
  label: t("neetoForm.questions.common.questionFields.field.question"),
10903
11009
  name: "".concat(name, ".label"),
10904
11010
  rows: 1
10905
- })), /*#__PURE__*/React__default["default"].createElement(InputWithMaxLength, {
11011
+ })), /*#__PURE__*/React__default["default"].createElement(InputWithMaxLength, _extends$8({
11012
+ required: true
11013
+ }, countField, {
11014
+ error: countTouched ? countError : "",
10906
11015
  label: t("neetoForm.common.count"),
10907
- max: 15,
10908
- min: 0,
10909
- name: "".concat(name, ".count"),
10910
- type: "number"
10911
- }), /*#__PURE__*/React__default["default"].createElement(neetoui.Label, null, t("neetoForm.common.icon")), /*#__PURE__*/React__default["default"].createElement("div", {
11016
+ max: STAR_RATING_MAX_COUNT,
11017
+ min: STAR_RATING_MIN_COUNT,
11018
+ type: "number",
11019
+ onChange: utils.withEventTargetValue(setCount)
11020
+ })), /*#__PURE__*/React__default["default"].createElement(neetoui.Label, null, t("neetoForm.common.icon")), /*#__PURE__*/React__default["default"].createElement("div", {
10912
11021
  className: "flex gap-2"
10913
11022
  }, Object.entries(STAR_RATING_ICONS_MAP).map(function (_ref2) {
10914
11023
  var _ref3 = _slicedToArray$3(_ref2, 2),
10915
11024
  name = _ref3[0],
10916
11025
  Shape = _ref3[1];
10917
- var isActive = name === value;
11026
+ var isActive = name === shape;
10918
11027
  return /*#__PURE__*/React__default["default"].createElement("div", {
10919
11028
  key: name,
10920
11029
  className: classnames__default["default"]("flex h-10 w-10 items-center justify-center gap-2", "neeto-ui-border-gray-800 neeto-ui-rounded-full cursor-pointer border", "transition-all duration-300 ease-in-out", {
@@ -10922,7 +11031,7 @@ var StarRating$3 = function StarRating(_ref) {
10922
11031
  "neeto-ui-text-white neeto-ui-bg-gray-800": isActive
10923
11032
  }),
10924
11033
  onClick: function onClick() {
10925
- return setValue(name);
11034
+ return setShape(name);
10926
11035
  }
10927
11036
  }, /*#__PURE__*/React__default["default"].createElement(Shape, null));
10928
11037
  })), !isRequired && /*#__PURE__*/React__default["default"].createElement("div", {
@@ -11010,22 +11119,28 @@ var Editor = function Editor(_ref) {
11010
11119
  name: fieldName,
11011
11120
  validate: validateContent
11012
11121
  }),
11013
- _useField2 = _slicedToArray$3(_useField, 2),
11122
+ _useField2 = _slicedToArray$3(_useField, 3),
11014
11123
  value = _useField2[0].value,
11015
- error = _useField2[1].error;
11124
+ _useField2$ = _useField2[1],
11125
+ touched = _useField2$.touched,
11126
+ error = _useField2$.error,
11127
+ setTouched = _useField2[2].setTouched;
11016
11128
  return /*#__PURE__*/React__default["default"].createElement("div", {
11017
11129
  className: "w-full cursor-auto"
11018
11130
  }, /*#__PURE__*/React__default["default"].createElement(neetoEditor.Editor, {
11019
- error: error,
11020
11131
  className: "px-2 pb-2",
11021
11132
  contentClassName: "border-none",
11022
11133
  disabled: isLabelDisabled,
11134
+ error: touched ? error : "",
11023
11135
  errorWrapperClassName: "border-none",
11024
11136
  id: "editor",
11025
11137
  initialValue: value,
11026
11138
  menuClassName: "border-none",
11027
11139
  name: fieldName,
11028
11140
  ref: editorRef,
11141
+ onBlur: function onBlur() {
11142
+ setTouched(true);
11143
+ },
11029
11144
  onChange: function onChange(text) {
11030
11145
  var _editorRef$current$ed;
11031
11146
  setFieldValue((_editorRef$current$ed = editorRef.current.editor) === null || _editorRef$current$ed === void 0 || (_editorRef$current$ed = _editorRef$current$ed.contentComponent) === null || _editorRef$current$ed === void 0 || (_editorRef$current$ed = _editorRef$current$ed.props) === null || _editorRef$current$ed === void 0 ? void 0 : _editorRef$current$ed.name, text);
@@ -11153,9 +11268,9 @@ var QUESTION_KINDS = [{
11153
11268
  defaults: {
11154
11269
  label: "",
11155
11270
  isRequired: false,
11156
- optionsAttributes: [{
11271
+ optionsAttributes: new Array(MULTIPLE_CHOICE_FIELD_MIN_OPTIONS).fill({
11157
11272
  label: ""
11158
- }]
11273
+ })
11159
11274
  }
11160
11275
  }, {
11161
11276
  type: "radio",
@@ -11607,7 +11722,7 @@ var List = function List(_ref) {
11607
11722
  })))));
11608
11723
  };
11609
11724
 
11610
- var _excluded$5 = ["questionKinds", "showAddQuestionDivider", "onValueChange", "showActionBlock", "formId", "isDeletable", "isRequiredField", "submitButtonProps", "cancelButtonProps", "isKindAlreadyActive", "getActiveKindDetails", "kindUniqueOn", "isDisabledFieldLabel", "disabledAddButtonTooltipProps", "enableFieldCode"];
11725
+ var _excluded$5 = ["questionKinds", "showAddQuestionDivider", "onValueChange", "showActionBlock", "formId", "isDeletable", "isRequiredField", "submitButtonProps", "cancelButtonProps", "isKindAlreadyActive", "getActiveKindDetails", "kindUniqueOn", "isDisabledFieldLabel", "disabledAddButtonTooltipProps", "enableFieldCode", "formTitle", "formDescription", "selectedLanguage", "availableLanguages", "onLanguageChange"];
11611
11726
  function ownKeys$c(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
11612
11727
  function _objectSpread$c(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys$c(Object(t), !0).forEach(function (r) { _defineProperty$6(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys$c(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
11613
11728
  var Form = function Form(_ref) {
@@ -11627,6 +11742,11 @@ var Form = function Form(_ref) {
11627
11742
  isDisabledFieldLabel = _ref.isDisabledFieldLabel,
11628
11743
  disabledAddButtonTooltipProps = _ref.disabledAddButtonTooltipProps,
11629
11744
  enableFieldCode = _ref.enableFieldCode,
11745
+ formTitle = _ref.formTitle,
11746
+ formDescription = _ref.formDescription,
11747
+ selectedLanguage = _ref.selectedLanguage,
11748
+ availableLanguages = _ref.availableLanguages,
11749
+ onLanguageChange = _ref.onLanguageChange,
11630
11750
  formDomProps = _objectWithoutProperties$1(_ref, _excluded$5);
11631
11751
  var _useTranslation = reactI18next.useTranslation(),
11632
11752
  t = _useTranslation.t;
@@ -11740,7 +11860,24 @@ var Form = function Form(_ref) {
11740
11860
  noValidate: true
11741
11861
  }), /*#__PURE__*/React__default["default"].createElement("div", {
11742
11862
  className: "w-full flex-grow overflow-y-auto"
11743
- }, hasActiveQuestions ? /*#__PURE__*/React__default["default"].createElement(formik.FieldArray, {
11863
+ }, /*#__PURE__*/React__default["default"].createElement("div", {
11864
+ className: "mb-4"
11865
+ }, /*#__PURE__*/React__default["default"].createElement("div", {
11866
+ className: "flex items-center justify-between"
11867
+ }, /*#__PURE__*/React__default["default"].createElement(neetoui.Typography, {
11868
+ "data-cy": "meeting-header",
11869
+ lineHeight: "normal",
11870
+ style: "h4",
11871
+ weight: "semibold"
11872
+ }, formTitle), availableLanguages.length > 1 && /*#__PURE__*/React__default["default"].createElement(ChangeLanguageDropdown, {
11873
+ dirty: dirty,
11874
+ initialLanguage: selectedLanguage,
11875
+ languages: availableLanguages,
11876
+ onChange: function onChange(code) {
11877
+ resetForm();
11878
+ onLanguageChange(code);
11879
+ }
11880
+ })), formDescription), hasActiveQuestions ? /*#__PURE__*/React__default["default"].createElement(formik.FieldArray, {
11744
11881
  name: "questions"
11745
11882
  }, function (_ref2) {
11746
11883
  var insert = _ref2.insert,
@@ -11894,20 +12031,27 @@ var BuildForm = function BuildForm(_ref) {
11894
12031
  allowAdditionalGuests = _ref$allowAdditionalG === void 0 ? false : _ref$allowAdditionalG,
11895
12032
  disabledAddButtonTooltipProps = _ref.disabledAddButtonTooltipProps,
11896
12033
  _ref$enableFieldCode = _ref.enableFieldCode,
11897
- enableFieldCode = _ref$enableFieldCode === void 0 ? false : _ref$enableFieldCode;
12034
+ enableFieldCode = _ref$enableFieldCode === void 0 ? false : _ref$enableFieldCode,
12035
+ _ref$availableLanguag = _ref.availableLanguages,
12036
+ availableLanguages = _ref$availableLanguag === void 0 ? DEFAULT_AVAILABLE_LANGUAGES : _ref$availableLanguag,
12037
+ formDescription = _ref.formDescription,
12038
+ _ref$formTitle = _ref.formTitle,
12039
+ formTitle = _ref$formTitle === void 0 ? "" : _ref$formTitle,
12040
+ _ref$selectedLanguage = _ref.selectedLanguage,
12041
+ selectedLanguage = _ref$selectedLanguage === void 0 ? "en" : _ref$selectedLanguage,
12042
+ _ref$onLanguageChange = _ref.onLanguageChange,
12043
+ onLanguageChange = _ref$onLanguageChange === void 0 ? neetoCist.noop : _ref$onLanguageChange;
11898
12044
  var queryClient = reactQuery.useQueryClient();
11899
12045
  var _useUpdateQuestions = useUpdateQuestions({
11900
12046
  formId: id,
11901
- onError: function onError(error) {
11902
- return neetoui.Toastr.error(error);
11903
- },
11904
- onSuccess: function onSuccess() {
11905
- return neetoui.Toastr.success("", THUMBS_UP);
11906
- }
12047
+ language: selectedLanguage,
12048
+ onError: neetoui.Toastr.error,
12049
+ onSuccess: utils.showThumbsUpToastr
11907
12050
  }),
11908
12051
  updateQuestions = _useUpdateQuestions.mutateAsync;
11909
12052
  var _useForm = useForm({
11910
12053
  formId: id,
12054
+ language: selectedLanguage,
11911
12055
  onSuccess: function onSuccess(data) {
11912
12056
  return onUpdate === null || onUpdate === void 0 ? void 0 : onUpdate(data);
11913
12057
  },
@@ -11941,15 +12085,17 @@ var BuildForm = function BuildForm(_ref) {
11941
12085
  return updateQuestions({
11942
12086
  id: id,
11943
12087
  values: _objectSpread$b({
11944
- neetoFormQuestion: payload
12088
+ neetoFormQuestion: _objectSpread$b(_objectSpread$b({}, payload), {}, {
12089
+ language: selectedLanguage
12090
+ })
11945
12091
  }, buildRequestArgs)
11946
12092
  });
11947
12093
  };
11948
12094
  var onValueChange = function onValueChange(questions) {
11949
- var _queryClient$getQuery = queryClient.getQueryState([QUERY_KEYS.QUESTIONS, id]),
12095
+ var _queryClient$getQuery = queryClient.getQueryState([QUERY_KEYS.QUESTIONS, id, selectedLanguage]),
11950
12096
  dataUpdateCount = _queryClient$getQuery.dataUpdateCount;
11951
12097
  if (dataUpdateCount > 0) {
11952
- queryClient.setQueryData([QUERY_KEYS.QUESTIONS, "preview/".concat(id)], ramda.assoc("questions", questions));
12098
+ queryClient.setQueryData([QUERY_KEYS.QUESTIONS, "preview/".concat(id), selectedLanguage], ramda.assoc("questions", questions));
11953
12099
  }
11954
12100
  };
11955
12101
  var isDeletable = isQuestionDeletable !== null && isQuestionDeletable !== void 0 ? isQuestionDeletable : function (question) {
@@ -11978,16 +12124,21 @@ var BuildForm = function BuildForm(_ref) {
11978
12124
  var errors = _ref3.errors,
11979
12125
  setFieldError = _ref3.setFieldError;
11980
12126
  return /*#__PURE__*/React__default["default"].createElement(Form, _extends$8({}, _objectSpread$b(_objectSpread$b({}, formDomProps), {}, {
12127
+ availableLanguages: availableLanguages,
11981
12128
  cancelButtonProps: cancelButtonProps,
11982
12129
  disabledAddButtonTooltipProps: disabledAddButtonTooltipProps,
11983
12130
  enableFieldCode: enableFieldCode,
12131
+ formDescription: formDescription,
12132
+ formTitle: formTitle,
11984
12133
  getActiveKindDetails: getActiveKindDetails,
11985
12134
  isDeletable: isDeletable,
11986
12135
  isDisabledFieldLabel: isDisabledFieldLabel,
11987
12136
  isKindAlreadyActive: isKindAlreadyActive,
11988
12137
  isRequiredField: isRequiredField,
11989
12138
  kindUniqueOn: kindUniqueOn,
12139
+ onLanguageChange: onLanguageChange,
11990
12140
  onValueChange: onValueChange,
12141
+ selectedLanguage: selectedLanguage,
11991
12142
  showActionBlock: showActionBlock,
11992
12143
  showAddQuestionDivider: showAddQuestionDivider,
11993
12144
  submitButtonProps: submitButtonProps
@@ -26656,6 +26807,7 @@ var StarRatingField = function StarRatingField(_ref) {
26656
26807
  isRequired = question.isRequired,
26657
26808
  count = question.count,
26658
26809
  shape = question.shape;
26810
+ var sanitizedCount = ramda.clamp(0, 10, parseInt(count)) || 0;
26659
26811
  return /*#__PURE__*/React__default["default"].createElement(formik.Field, {
26660
26812
  name: name,
26661
26813
  validate: validateFieldValue({
@@ -26668,11 +26820,11 @@ var StarRatingField = function StarRatingField(_ref) {
26668
26820
  var meta = _ref2.meta,
26669
26821
  field = _ref2.field;
26670
26822
  return /*#__PURE__*/React__default["default"].createElement(StarRating$1, _extends$8({
26671
- count: count,
26672
- error: meta.touched ? meta.error : "",
26673
- label: getLabel$1(label, isRequired),
26674
26823
  name: name,
26675
- shape: shape
26824
+ shape: shape,
26825
+ count: sanitizedCount,
26826
+ error: meta.touched ? meta.error : "",
26827
+ label: getLabel$1(label, isRequired)
26676
26828
  }, field));
26677
26829
  });
26678
26830
  };
@@ -26889,7 +27041,9 @@ var ExternalForm = function ExternalForm(_ref) {
26889
27041
  _ref$autoCompleteKind = _ref.autoCompleteKinds,
26890
27042
  autoCompleteKinds = _ref$autoCompleteKind === void 0 ? [] : _ref$autoCompleteKind,
26891
27043
  _ref$enablePreFilling = _ref.enablePreFilling,
26892
- enablePreFilling = _ref$enablePreFilling === void 0 ? false : _ref$enablePreFilling;
27044
+ enablePreFilling = _ref$enablePreFilling === void 0 ? false : _ref$enablePreFilling,
27045
+ _ref$language = _ref.language,
27046
+ language = _ref$language === void 0 ? "en" : _ref$language;
26893
27047
  var _useState = React$2.useState(false),
26894
27048
  _useState2 = _slicedToArray$3(_useState, 2),
26895
27049
  isSubmitted = _useState2[0],
@@ -27100,6 +27254,7 @@ var ExternalForm = function ExternalForm(_ref) {
27100
27254
  var _useForm = useForm({
27101
27255
  formId: formId,
27102
27256
  preview: preview,
27257
+ language: language,
27103
27258
  onError: neetoui.Toastr.error,
27104
27259
  enabled: !preview,
27105
27260
  placeholderData: {