@bigbinary/neeto-fields-frontend 1.1.4 → 1.1.5

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
@@ -1,8 +1,9 @@
1
1
  import React, { useContext, useState, useRef, useEffect, useMemo, useLayoutEffect, useCallback, createContext, memo, useReducer } from 'react';
2
2
  import { Switch, TimePicker, DatePicker, Select, Input, Textarea, Typography, Pane, Label, Button as Button$1, Dropdown, NoData, Table, Spinner, Alert } from '@bigbinary/neetoui';
3
3
  import { toLabelAndValue, isNotEmpty, capitalize as capitalize$1, filterBy, findBy, slugify, humanize, countBy, existsBy, noop as noop$2 } from '@bigbinary/neeto-commons-frontend/pure';
4
- import { values, map, isNotNil, isNil, pluck, clone as clone$1, pipe, mergeAll, omit, prop, pick, isEmpty, assoc, any, not, head } from 'ramda';
4
+ import { values, map, isNotNil, isEmpty, isNil, pluck, clone as clone$1, pipe, mergeAll, omit, prop, pick, assoc, any, not, head } from 'ramda';
5
5
  import { useFormikContext, useField, FieldArray } from 'formik';
6
+ import { useFuncDebounce, useDebounce, handleMetaClick } from '@bigbinary/neeto-commons-frontend/react-utils';
6
7
  import * as yup from 'yup';
7
8
  import { Check, Info, Delete, MenuHorizontal, Reorder } from '@bigbinary/neeto-icons';
8
9
  import { Button, ActionBlock, Input as Input$1, Select as Select$1, Switch as Switch$1, Form } from '@bigbinary/neetoui/formik';
@@ -14,7 +15,6 @@ import SubHeader from '@bigbinary/neeto-molecules/SubHeader';
14
15
  import { useQuery, useQueryClient, useMutation } from 'react-query';
15
16
  import axios from 'axios';
16
17
  import { buildUrl, getQueryParams } from '@bigbinary/neeto-commons-frontend/utils';
17
- import { useDebounce, handleMetaClick } from '@bigbinary/neeto-commons-frontend/react-utils';
18
18
  import { Link, useHistory } from 'react-router-dom';
19
19
  import TableWrapper from '@bigbinary/neeto-molecules/TableWrapper';
20
20
  import { unstable_batchedUpdates, createPortal } from 'react-dom';
@@ -5847,57 +5847,60 @@ var buildSchemaAllowingEmptyValue = function buildSchemaAllowingEmptyValue(schem
5847
5847
  name: "validate-if-not-empty",
5848
5848
  test: function test(value) {
5849
5849
  if (isNotEmpty(value) && isNotNil(value)) {
5850
- try {
5851
- schema.validateSync(value);
5852
- return true;
5853
- } catch (_unused) {
5854
- return false;
5855
- }
5850
+ schema.validateSync(value);
5851
+ }
5852
+ return true;
5853
+ }
5854
+ });
5855
+ };
5856
+ var buildSchemaForRequiredInputs = function buildSchemaForRequiredInputs(schema) {
5857
+ return yup.mixed().test({
5858
+ name: "validate-required-inputs",
5859
+ test: function test(value) {
5860
+ if (isEmpty(value) || isNil(value)) {
5861
+ throw new yup.ValidationError(t$1("validations.thisIsRequired"));
5856
5862
  }
5863
+ schema.validateSync(value);
5857
5864
  return true;
5858
5865
  }
5859
5866
  });
5860
5867
  };
5861
- var buildFieldValidationSchema = function buildFieldValidationSchema(_ref) {
5862
- var kind = _ref.kind,
5863
- isRequired = _ref.isRequired,
5864
- fieldData = _ref.fieldData;
5868
+ var buildSchema = function buildSchema(_ref) {
5869
+ var schema = _ref.schema,
5870
+ isRequired = _ref.isRequired;
5871
+ return isRequired ? buildSchemaForRequiredInputs(schema) : buildSchemaAllowingEmptyValue(schema);
5872
+ };
5873
+ var getBasicValidationSchema = function getBasicValidationSchema(_ref2) {
5874
+ var kind = _ref2.kind,
5875
+ fieldData = _ref2.fieldData;
5865
5876
  switch (kind) {
5866
5877
  case KINDS.singleOption:
5867
5878
  case KINDS.text:
5868
5879
  {
5869
- var schema = yup.string().trim().nullable();
5870
- return isRequired ? schema.required(t$1("validations.thisIsRequired")) : schema;
5880
+ return yup.string().trim().nullable();
5871
5881
  }
5872
5882
  case KINDS.number:
5873
5883
  case KINDS.monetary:
5874
5884
  case KINDS.decimal:
5875
5885
  {
5876
- var _schema = buildSchemaAllowingEmptyValue(yup.number().typeError(t$1("validations.notAValidNumber")));
5877
- return isRequired ? _schema.required(t$1("validations.thisIsRequired")) : _schema;
5886
+ return yup.number(t$1("validations.notAValidNumber")).nullable();
5878
5887
  }
5879
5888
  case KINDS.integer:
5880
5889
  {
5881
- var _schema2 = buildSchemaAllowingEmptyValue(yup.number().nullable().integer().typeError(t$1("validations.notAValidInteger")));
5882
- return isRequired ? _schema2.required(t$1("validations.thisIsRequired")) : _schema2;
5890
+ return yup.number().nullable().integer(t$1("validations.notAValidInteger"));
5883
5891
  }
5884
5892
  case KINDS.date:
5885
5893
  case KINDS.time:
5886
5894
  {
5887
- var _schema3 = buildSchemaAllowingEmptyValue(dateSchema);
5888
- return isRequired ? _schema3.required(t$1("validations.thisIsRequired")) : _schema3;
5895
+ return dateSchema;
5889
5896
  }
5890
5897
  case KINDS.multiOption:
5891
5898
  {
5892
- var _schema4 = yup.array().of(yup.string()).nullable();
5893
- return isRequired ? _schema4.min(1, t$1("validations.minOneItem")).required(t$1("validations.thisIsRequired")) : _schema4;
5899
+ return yup.array().of(yup.string()).nullable();
5894
5900
  }
5895
5901
  case KINDS.dateRange:
5896
5902
  case KINDS.timeRange:
5897
5903
  {
5898
- if (isRequired) {
5899
- return yup.array().of(dateSchema).required(t$1("validations.thisIsRequired"));
5900
- }
5901
5904
  return yup.array().of(dateSchema).nullable();
5902
5905
  }
5903
5906
  case KINDS.checkbox:
@@ -5905,13 +5908,25 @@ var buildFieldValidationSchema = function buildFieldValidationSchema(_ref) {
5905
5908
  case KINDS.regex:
5906
5909
  {
5907
5910
  var regexPattern = fieldData === null || fieldData === void 0 ? void 0 : fieldData.condition;
5908
- var _schema5 = buildSchemaAllowingEmptyValue(yup.string().nullable().matches(cleanedRegex(regexPattern), fieldData === null || fieldData === void 0 ? void 0 : fieldData.helpMessage));
5909
- return isRequired ? _schema5.required(t$1("validations.thisIsRequired")) : _schema5;
5911
+ return yup.string().nullable().matches(cleanedRegex(regexPattern), fieldData === null || fieldData === void 0 ? void 0 : fieldData.helpMessage);
5910
5912
  }
5911
5913
  default:
5912
5914
  return yup.mixed();
5913
5915
  }
5914
5916
  };
5917
+ var buildFieldValidationSchema = function buildFieldValidationSchema(_ref3) {
5918
+ var kind = _ref3.kind,
5919
+ isRequired = _ref3.isRequired,
5920
+ fieldData = _ref3.fieldData;
5921
+ var schema = getBasicValidationSchema({
5922
+ kind: kind,
5923
+ fieldData: fieldData
5924
+ });
5925
+ return buildSchema({
5926
+ schema: schema,
5927
+ isRequired: isRequired
5928
+ });
5929
+ };
5915
5930
  var cleanedRegex = function cleanedRegex(expression) {
5916
5931
  if (expression.startsWith("/") && expression.endsWith("/")) {
5917
5932
  return expression.slice(1, -1);
@@ -5920,9 +5935,9 @@ var cleanedRegex = function cleanedRegex(expression) {
5920
5935
  };
5921
5936
  var buildOptionsToLabelAndValue = function buildOptionsToLabelAndValue() {
5922
5937
  var optionObjects = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];
5923
- return optionObjects.map(function (_ref2) {
5924
- var label = _ref2.label,
5925
- value = _ref2.value;
5938
+ return optionObjects.map(function (_ref4) {
5939
+ var label = _ref4.label,
5940
+ value = _ref4.value;
5926
5941
  return {
5927
5942
  label: label,
5928
5943
  value: value || label
@@ -5933,12 +5948,12 @@ var buildArrayToLabelAndValues = function buildArrayToLabelAndValues(value) {
5933
5948
  return map(toLabelAndValue, value || []);
5934
5949
  };
5935
5950
  var validateField = /*#__PURE__*/function () {
5936
- var _ref4 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee(_ref3) {
5951
+ var _ref6 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee(_ref5) {
5937
5952
  var fieldValue, fieldName, isRequired, kind, fieldData;
5938
5953
  return _regeneratorRuntime.wrap(function _callee$(_context) {
5939
5954
  while (1) switch (_context.prev = _context.next) {
5940
5955
  case 0:
5941
- fieldValue = _ref3.fieldValue, fieldName = _ref3.fieldName, isRequired = _ref3.isRequired, kind = _ref3.kind, fieldData = _ref3.fieldData;
5956
+ fieldValue = _ref5.fieldValue, fieldName = _ref5.fieldName, isRequired = _ref5.isRequired, kind = _ref5.kind, fieldData = _ref5.fieldData;
5942
5957
  _context.prev = 1;
5943
5958
  _context.next = 4;
5944
5959
  return yup.object().shape(_defineProperty({}, fieldName, buildFieldValidationSchema({
@@ -5959,7 +5974,7 @@ var validateField = /*#__PURE__*/function () {
5959
5974
  }, _callee, null, [[1, 7]]);
5960
5975
  }));
5961
5976
  return function validateField(_x) {
5962
- return _ref4.apply(this, arguments);
5977
+ return _ref6.apply(this, arguments);
5963
5978
  };
5964
5979
  }();
5965
5980
  var dateTimeToString = function dateTimeToString(dateTime) {
@@ -5982,8 +5997,7 @@ var useFormikFields = function useFormikFields(_ref) {
5982
5997
  isRequiredColumnName = _ref$isRequiredColumn === void 0 ? "isRequired" : _ref$isRequiredColumn,
5983
5998
  props = _objectWithoutProperties(_ref, _excluded$3);
5984
5999
  var formikContext = useFormikContext();
5985
- var setFieldValue = formikContext.setFieldValue,
5986
- submitForm = formikContext.submitForm,
6000
+ var submitForm = formikContext.submitForm,
5987
6001
  dirty = formikContext.dirty,
5988
6002
  isSubmitting = formikContext.isSubmitting;
5989
6003
  var fieldPath = escapeString("".concat(name, "-").concat(fieldId));
@@ -6010,9 +6024,10 @@ var useFormikFields = function useFormikFields(_ref) {
6010
6024
  formikFieldProps = _useField2[0],
6011
6025
  meta = _useField2[1],
6012
6026
  helpers = _useField2[2];
6027
+ var debouncedSubmitForm = useFuncDebounce(submitForm, 100);
6013
6028
  var handleSubmit = function handleSubmit(value) {
6014
- isNotNil(value) && setFieldValue(fieldValuePath, value);
6015
- individualSubmit && submitForm();
6029
+ isNotNil(value) && helpers.setValue(value);
6030
+ individualSubmit && debouncedSubmitForm();
6016
6031
  };
6017
6032
  var getValueForField = function getValueForField(value) {
6018
6033
  if (kind === KINDS.singleOption) {
@@ -6023,17 +6038,19 @@ var useFormikFields = function useFormikFields(_ref) {
6023
6038
  return value || "";
6024
6039
  };
6025
6040
  var isDropdown = ["single_option", "multi_option"].includes(kind);
6026
- if (isSubmitting && !meta.touched) {
6027
- helpers.setTouched(true);
6028
- }
6041
+ useEffect(function () {
6042
+ if (isSubmitting && !meta.touched) {
6043
+ helpers.setTouched(true);
6044
+ }
6045
+ }, [isSubmitting]);
6029
6046
  return {
6047
+ dirty: dirty,
6030
6048
  handleSubmit: handleSubmit,
6031
6049
  fieldProps: _objectSpread$a(_objectSpread$a({}, formikFieldProps), {}, {
6032
6050
  required: props[isRequiredColumnName],
6033
6051
  error: individualSubmit ? meta.error : meta.touched && meta.error,
6034
6052
  options: isDropdown ? buildOptionsToLabelAndValue(fieldData) : undefined,
6035
6053
  value: getValueForField(formikFieldProps.value),
6036
- dirty: dirty,
6037
6054
  label: !individualSubmit && capitalize$1(name),
6038
6055
  disabled: disabled
6039
6056
  })
@@ -6099,8 +6116,9 @@ var MultiOption = function MultiOption(props) {
6099
6116
  var Number$1 = function Number(props) {
6100
6117
  var _useFormikFields = useFormikFields(props),
6101
6118
  handleSubmit = _useFormikFields.handleSubmit,
6102
- fieldProps = _useFormikFields.fieldProps;
6103
- var showSubmitButton = props.individualSubmit && fieldProps.dirty;
6119
+ fieldProps = _useFormikFields.fieldProps,
6120
+ dirty = _useFormikFields.dirty;
6121
+ var showSubmitButton = props.individualSubmit && dirty;
6104
6122
  return /*#__PURE__*/React.createElement(Input, _extends({}, fieldProps, {
6105
6123
  type: "number",
6106
6124
  suffix: showSubmitButton && /*#__PURE__*/React.createElement(Button, {
@@ -6121,7 +6139,11 @@ var RangePicker = function RangePicker(props) {
6121
6139
  var _ref2 = _slicedToArray(_ref, 2),
6122
6140
  begin = _ref2[0],
6123
6141
  end = _ref2[1];
6124
- return handleSubmit([dateTimeToString(begin), dateTimeToString(end)]);
6142
+ if (begin && end) {
6143
+ handleSubmit([dateTimeToString(begin), dateTimeToString(end)]);
6144
+ } else {
6145
+ handleSubmit([]);
6146
+ }
6125
6147
  };
6126
6148
  if (props.kind === KINDS.dateRange) {
6127
6149
  return /*#__PURE__*/React.createElement(DatePicker, _extends({}, fieldProps, {
@@ -6144,11 +6166,11 @@ var SingleOption = function SingleOption(props) {
6144
6166
  handleSubmit = _useFormikFields.handleSubmit,
6145
6167
  fieldProps = _useFormikFields.fieldProps;
6146
6168
  return /*#__PURE__*/React.createElement(Select, _extends({
6169
+ isClearable: true,
6147
6170
  isSearchable: true
6148
6171
  }, fieldProps, {
6149
- onChange: function onChange(_ref) {
6150
- var value = _ref.value;
6151
- return handleSubmit(value);
6172
+ onChange: function onChange(option) {
6173
+ return handleSubmit((option === null || option === void 0 ? void 0 : option.value) || "");
6152
6174
  }
6153
6175
  }));
6154
6176
  };
@@ -6156,8 +6178,9 @@ var SingleOption = function SingleOption(props) {
6156
6178
  var Text = function Text(props) {
6157
6179
  var _useFormikFields = useFormikFields(props),
6158
6180
  handleSubmit = _useFormikFields.handleSubmit,
6159
- fieldProps = _useFormikFields.fieldProps;
6160
- var showSubmitButton = props.individualSubmit && fieldProps.dirty;
6181
+ fieldProps = _useFormikFields.fieldProps,
6182
+ dirty = _useFormikFields.dirty;
6183
+ var showSubmitButton = props.individualSubmit && dirty;
6161
6184
  return /*#__PURE__*/React.createElement(Input, _extends({}, fieldProps, {
6162
6185
  suffix: showSubmitButton && /*#__PURE__*/React.createElement(Button, {
6163
6186
  icon: Check,
@@ -6174,8 +6197,9 @@ var TextArea = function TextArea(props) {
6174
6197
  t = _useTranslation.t;
6175
6198
  var _useFormikFields = useFormikFields(props),
6176
6199
  handleSubmit = _useFormikFields.handleSubmit,
6177
- fieldProps = _useFormikFields.fieldProps;
6178
- var showSubmitButton = props.individualSubmit && fieldProps.dirty;
6200
+ fieldProps = _useFormikFields.fieldProps,
6201
+ dirty = _useFormikFields.dirty;
6202
+ var showSubmitButton = props.individualSubmit && dirty;
6179
6203
  return /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(Textarea, fieldProps), showSubmitButton && /*#__PURE__*/React.createElement(Button, {
6180
6204
  className: "m-auto mt-2",
6181
6205
  label: t("labels.submit"),
@@ -6242,26 +6266,46 @@ var transformValues = function transformValues(_ref2) {
6242
6266
  fieldValuesAttributes: cleanedFieldValues
6243
6267
  });
6244
6268
  };
6245
- var getInitialFieldValue = function getInitialFieldValue(field) {
6246
- var fieldValues = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];
6269
+ var getDefaultInitialValue = function getDefaultInitialValue(kind) {
6270
+ switch (kind) {
6271
+ case KINDS.checkbox:
6272
+ return false;
6273
+ case KINDS.multiOption:
6274
+ case KINDS.dateRange:
6275
+ case KINDS.timeRange:
6276
+ return [];
6277
+ default:
6278
+ return "";
6279
+ }
6280
+ };
6281
+ var getInitialFieldValue = function getInitialFieldValue(_ref4) {
6282
+ var field = _ref4.field,
6283
+ _ref4$fieldValues = _ref4.fieldValues,
6284
+ fieldValues = _ref4$fieldValues === void 0 ? [] : _ref4$fieldValues,
6285
+ _ref4$isIndividualFie = _ref4.isIndividualFieldForm,
6286
+ isIndividualFieldForm = _ref4$isIndividualFie === void 0 ? false : _ref4$isIndividualFie;
6247
6287
  var existingFieldValueData = findBy({
6248
6288
  fieldId: field.id
6249
6289
  }, fieldValues);
6290
+ var keyInData = field.kind === KINDS.multiOption ? "values" : "value";
6250
6291
  var newFieldValueData = {
6251
6292
  fieldId: field.id,
6252
- data: null
6293
+ data: isIndividualFieldForm ? _defineProperty({}, keyInData, getDefaultInitialValue(field.kind)) : null
6253
6294
  };
6254
6295
  return _defineProperty({}, escapeString("".concat(field.name, "-").concat(field.id)), existingFieldValueData || newFieldValueData);
6255
6296
  };
6256
6297
  var getAllInitialFieldValues = function getAllInitialFieldValues(fields) {
6257
6298
  var fieldValues = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];
6258
6299
  return getNonSystemFields(fields).map(function (field) {
6259
- return getInitialFieldValue(field, fieldValues);
6300
+ return getInitialFieldValue({
6301
+ field: field,
6302
+ fieldValues: fieldValues
6303
+ });
6260
6304
  });
6261
6305
  };
6262
- var mergeInitialValues = function mergeInitialValues(_ref5) {
6263
- var initialValues = _ref5.initialValues,
6264
- fields = _ref5.fields;
6306
+ var mergeInitialValues = function mergeInitialValues(_ref7) {
6307
+ var initialValues = _ref7.initialValues,
6308
+ fields = _ref7.fields;
6265
6309
  var initialValue = mergeAll([initialValues].concat(_toConsumableArray(getAllInitialFieldValues(fields, initialValues === null || initialValues === void 0 ? void 0 : initialValues.fieldValues))));
6266
6310
  return omit(["fieldValues"], initialValue);
6267
6311
  };
@@ -6582,7 +6626,7 @@ var FIELD_KINDS = {
6582
6626
  single_option: {
6583
6627
  value: "single_option",
6584
6628
  label: t$1("fields.kinds.singleOption"),
6585
- group: 3
6629
+ group: 12
6586
6630
  },
6587
6631
  multi_option: {
6588
6632
  value: "multi_option",
@@ -11991,7 +12035,11 @@ var FieldValueInputWrapper = function FieldValueInputWrapper(_ref) {
11991
12035
  scrollToErrorField: true,
11992
12036
  className: classnames("flex w-full", className),
11993
12037
  formikProps: {
11994
- initialValues: getInitialFieldValue(field, fieldValues),
12038
+ initialValues: getInitialFieldValue({
12039
+ field: field,
12040
+ fieldValues: fieldValues,
12041
+ isIndividualFieldForm: true
12042
+ }),
11995
12043
  onSubmit: onSubmit,
11996
12044
  enableReinitialize: true
11997
12045
  }