@bigbinary/neeto-fields-frontend 1.1.9 → 1.1.11

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/README.md CHANGED
@@ -12,7 +12,7 @@ referred as custom fields) for the resources across neeto products.
12
12
  - Frontend package exports
13
13
  - [Components](#components)
14
14
  - [FieldsDashBoard](#1-fieldsdashboard)
15
- - [AddField](#2-addfield)
15
+ - [FieldsPane](#2-fieldspane)
16
16
  - [FieldValuesContainer](#3-fieldvaluescontainer)
17
17
  - [FieldInputs](#4-fieldinputs)
18
18
  - [Functions](#functions)
@@ -299,18 +299,22 @@ This is the pane which handles the Add / Edit operations of the field.
299
299
  #### Usage:
300
300
 
301
301
  ```jsx
302
- import { AddField } from "@biginary/neeto-fields-frontend";
302
+ import { FieldsPane } from "@biginary/neeto-fields-frontend";
303
303
 
304
- <AddField
304
+ const [fieldPaneOpen, setFieldPaneOpen] = useState(false);
305
+
306
+ <FieldsPane
307
+ isOpen={fieldPaneOpen}
305
308
  allowedKinds={["text", "number"]}
306
309
  resourceType="users"
307
310
  additionalValidations={{
308
311
  hostSpecificInputName: validationSchema,
309
312
  }}
310
313
  initialValues={{ hostSpecificInputName: initialValue }}
314
+ onClose={() => setFieldPaneOpen(false)}
311
315
  >
312
316
  <HostSpecificInputFields />
313
- </AddField>;
317
+ </FieldsPane>;
314
318
  ```
315
319
 
316
320
  ## 3. `FieldValuesContainer`
@@ -346,9 +350,9 @@ specific resource.
346
350
  11. `isRequiredColumnName`: The name of column which holds the value which
347
351
  suggests if a field value is a `required` one or not. Default is
348
352
  `isRequired` column.
349
- 12. `fieldClassName`: Class names for styling the `div` containing the
350
- input field.
351
- 15. `onMutationSuccess`: The callback function which is triggered on the success
353
+ 12. `fieldClassName`: Class names for styling the `div` containing the input
354
+ field.
355
+ 13. `onMutationSuccess`: The callback function which is triggered on the success
352
356
  of mutation functions( create, update & delete).
353
357
 
354
358
  #### Usage:
package/dist/index.cjs.js CHANGED
@@ -5359,6 +5359,7 @@ var validations = {
5359
5359
  fieldOptionIsRequired: "Field option is required",
5360
5360
  kindIsRequired: "Kind is required",
5361
5361
  invalidRegexPattern: "Invalid regex pattern",
5362
+ advancedRegexAssertionsNotSupported: "Advanced regex assertions are not supported",
5362
5363
  notAValidNumber: "Entered number is not valid",
5363
5364
  notAValidInteger: "Entered number is not a valid integer",
5364
5365
  notAValid: "Entered number is not valid",
@@ -5879,6 +5880,15 @@ var dayjs_minExports = dayjs_min.exports;
5879
5880
  var dayjs = /*@__PURE__*/getDefaultExportFromCjs(dayjs_minExports);
5880
5881
 
5881
5882
  var dateSchema = yup__namespace.date().nullable();
5883
+ var isValueEmpty = function isValueEmpty(value) {
5884
+ return typeof value === "string" && ramda.isEmpty(value.trim());
5885
+ };
5886
+ var isCheckboxUnchecked = function isCheckboxUnchecked(kind, value) {
5887
+ return kind === KINDS.checkbox && !value;
5888
+ };
5889
+ var isArrayEmpty = function isArrayEmpty(kind, value) {
5890
+ return [KINDS.multiOption, KINDS.singleOption, KINDS.dateRange, KINDS.timeRange].includes(kind) && ramda.isEmpty(value);
5891
+ };
5882
5892
  var buildSchemaAllowingEmptyValue = function buildSchemaAllowingEmptyValue(schema) {
5883
5893
  return yup__namespace.mixed().test({
5884
5894
  name: "validate-if-not-empty",
@@ -5890,11 +5900,11 @@ var buildSchemaAllowingEmptyValue = function buildSchemaAllowingEmptyValue(schem
5890
5900
  }
5891
5901
  });
5892
5902
  };
5893
- var buildSchemaForRequiredInputs = function buildSchemaForRequiredInputs(schema) {
5903
+ var buildSchemaForRequiredInputs = function buildSchemaForRequiredInputs(schema, kind) {
5894
5904
  return yup__namespace.mixed().test({
5895
5905
  name: "validate-required-inputs",
5896
5906
  test: function test(value) {
5897
- if (ramda.isEmpty(value) || ramda.isNil(value)) {
5907
+ if (ramda.isNil(value) || isValueEmpty(value) || isArrayEmpty(kind, value) || isCheckboxUnchecked(kind, value)) {
5898
5908
  throw new yup__namespace.ValidationError(t$1("validations.thisIsRequired"));
5899
5909
  }
5900
5910
  schema.validateSync(value);
@@ -5904,14 +5914,16 @@ var buildSchemaForRequiredInputs = function buildSchemaForRequiredInputs(schema)
5904
5914
  };
5905
5915
  var buildSchema = function buildSchema(_ref) {
5906
5916
  var schema = _ref.schema,
5907
- isRequired = _ref.isRequired;
5908
- return isRequired ? buildSchemaForRequiredInputs(schema) : buildSchemaAllowingEmptyValue(schema);
5917
+ isRequired = _ref.isRequired,
5918
+ kind = _ref.kind;
5919
+ return isRequired ? buildSchemaForRequiredInputs(schema, kind) : buildSchemaAllowingEmptyValue(schema);
5909
5920
  };
5910
5921
  var getBasicValidationSchema = function getBasicValidationSchema(_ref2) {
5911
5922
  var kind = _ref2.kind,
5912
5923
  fieldData = _ref2.fieldData;
5913
5924
  switch (kind) {
5914
5925
  case KINDS.singleOption:
5926
+ case KINDS.textarea:
5915
5927
  case KINDS.text:
5916
5928
  {
5917
5929
  return yup__namespace.string().trim().nullable();
@@ -5961,7 +5973,8 @@ var buildFieldValidationSchema = function buildFieldValidationSchema(_ref3) {
5961
5973
  });
5962
5974
  return buildSchema({
5963
5975
  schema: schema,
5964
- isRequired: isRequired
5976
+ isRequired: isRequired,
5977
+ kind: kind
5965
5978
  });
5966
5979
  };
5967
5980
  var cleanedRegex = function cleanedRegex(regexCondition) {
@@ -6088,11 +6101,13 @@ var useFormikFields = function useFormikFields(_ref) {
6088
6101
  dirty: dirty,
6089
6102
  handleSubmit: handleSubmit,
6090
6103
  fieldProps: _objectSpread$b(_objectSpread$b({}, formikFieldProps), {}, {
6091
- required: props[isRequiredColumnName],
6092
6104
  error: individualSubmit ? meta.error : meta.touched && meta.error,
6093
6105
  options: isDropdown ? buildOptionsToLabelAndValue(fieldData) : undefined,
6094
6106
  value: getValueForField(formikFieldProps.value),
6095
6107
  label: pure.capitalize(name),
6108
+ labelProps: {
6109
+ required: props[isRequiredColumnName]
6110
+ },
6096
6111
  disabled: disabled
6097
6112
  })
6098
6113
  };
@@ -6146,7 +6161,8 @@ var MultiOption = function MultiOption(props) {
6146
6161
  fieldProps = _useFormikFields.fieldProps;
6147
6162
  return /*#__PURE__*/React__default["default"].createElement(neetoui.Select, _extends({
6148
6163
  isMulti: true,
6149
- isSearchable: true
6164
+ isSearchable: true,
6165
+ strategy: "fixed"
6150
6166
  }, fieldProps, {
6151
6167
  onChange: function onChange(selectedOptions) {
6152
6168
  return handleSubmit(ramda.pluck("value", selectedOptions));
@@ -6208,7 +6224,8 @@ var SingleOption = function SingleOption(props) {
6208
6224
  fieldProps = _useFormikFields.fieldProps;
6209
6225
  return /*#__PURE__*/React__default["default"].createElement(neetoui.Select, _extends({
6210
6226
  isClearable: true,
6211
- isSearchable: true
6227
+ isSearchable: true,
6228
+ strategy: "fixed"
6212
6229
  }, fieldProps, {
6213
6230
  onChange: function onChange(option) {
6214
6231
  return handleSubmit((option === null || option === void 0 ? void 0 : option.value) || "");
@@ -6668,9 +6685,17 @@ var renderFormFooter = function renderFormFooter(_ref3) {
6668
6685
  }));
6669
6686
  };
6670
6687
 
6688
+ var PERMITTED_REGEX_PATTERN = /^\/.*\/[igmsyu]*$/;
6689
+ var ADVANCED_REGEX_ASSERTION_PATTERN = /\(\?=[^)]*\)|\(\?![^)]*\)|\(\?<=[^)]*\)|\(\?<![^)]*\)/;
6671
6690
  var regexValidationSchema = yup__namespace.object().shape({
6672
- condition: yup__namespace.string().required(t$1("validations.regexConditionIsRequired")).matches(/^\/.*\/[igmsyu]*$/, t$1("validations.invalidRegexPattern")).test({
6673
- name: "regex",
6691
+ condition: yup__namespace.string().required(t$1("validations.regexConditionIsRequired")).matches(PERMITTED_REGEX_PATTERN, t$1("validations.invalidRegexPattern")).test({
6692
+ name: "test-regex-is-advanced",
6693
+ message: t$1("validations.advancedRegexAssertionsNotSupported") || "",
6694
+ test: function test(value) {
6695
+ return !ADVANCED_REGEX_ASSERTION_PATTERN.test(value);
6696
+ }
6697
+ }).test({
6698
+ name: "test-regex-condition-pattern",
6674
6699
  message: t$1("validations.invalidRegexPattern") || "",
6675
6700
  test: function test(value) {
6676
6701
  try {
@@ -7692,34 +7717,27 @@ var renderMenuBarItems = function renderMenuBarItems(_ref2) {
7692
7717
  });
7693
7718
  });
7694
7719
  };
7695
- var renderMenuBarFilters = function renderMenuBarFilters(_ref3) {
7720
+ var renderStateFilterTabs = function renderStateFilterTabs(_ref3) {
7696
7721
  var selectedState = _ref3.selectedState,
7697
7722
  fieldStatesTaxonomy = _ref3.fieldStatesTaxonomy,
7698
7723
  activeFieldsCount = _ref3.activeFieldsCount,
7699
7724
  inactiveFieldsCount = _ref3.inactiveFieldsCount,
7700
7725
  handleBlockClick = _ref3.handleBlockClick;
7701
- return /*#__PURE__*/React__default["default"].createElement(React__default["default"].Fragment, null, /*#__PURE__*/React__default["default"].createElement(MenuBar__default["default"].SubTitle, null, /*#__PURE__*/React__default["default"].createElement(neetoui.Typography, {
7702
- "data-cy": "menubar-subtitle",
7703
- style: "h5",
7704
- textTransform: "uppercase",
7705
- weight: "bold"
7706
- }, t$1("titles.filters"))), /*#__PURE__*/React__default["default"].createElement(MenuBar__default["default"].Block, {
7726
+ return /*#__PURE__*/React__default["default"].createElement(neetoui.Tab, {
7727
+ className: "mb-4"
7728
+ }, /*#__PURE__*/React__default["default"].createElement(neetoui.Tab.Item, {
7707
7729
  active: selectedState === FIELD_STATES.active,
7708
- count: activeFieldsCount,
7709
7730
  "data-cy": "menubar-active-block",
7710
- label: fieldStatesTaxonomy.active,
7711
7731
  onClick: handleBlockClick({
7712
7732
  state: FIELD_STATES.active
7713
7733
  })
7714
- }), /*#__PURE__*/React__default["default"].createElement(MenuBar__default["default"].Block, {
7734
+ }, fieldStatesTaxonomy.active, "(", activeFieldsCount, ")"), /*#__PURE__*/React__default["default"].createElement(neetoui.Tab.Item, {
7715
7735
  active: selectedState === FIELD_STATES.inactive,
7716
- count: inactiveFieldsCount,
7717
7736
  "data-cy": "menubar-inactive-block",
7718
- label: fieldStatesTaxonomy.inactive,
7719
7737
  onClick: handleBlockClick({
7720
7738
  state: FIELD_STATES.inactive
7721
7739
  })
7722
- }));
7740
+ }, fieldStatesTaxonomy.inactive, "(", inactiveFieldsCount, ")"));
7723
7741
  };
7724
7742
  var getResourceName = function getResourceName(_ref4) {
7725
7743
  var isOwnerBased = _ref4.isOwnerBased,
@@ -7737,24 +7755,11 @@ var getResourceName = function getResourceName(_ref4) {
7737
7755
  var getDashBoardTitle = function getDashBoardTitle(_ref5) {
7738
7756
  var resourceName = _ref5.resourceName,
7739
7757
  isSingleResource = _ref5.isSingleResource,
7740
- showStateFilter = _ref5.showStateFilter,
7741
- selectedState = _ref5.selectedState,
7742
7758
  title = _ref5.title;
7743
- var displayTitle = title;
7744
- if (showStateFilter && !isSingleResource) {
7745
- displayTitle = t$1("messages.stateTitleForResource", {
7746
- state: selectedState,
7747
- title: title,
7748
- resource: resourceName
7749
- });
7750
- } else if (showStateFilter && isSingleResource) {
7751
- displayTitle = "".concat(selectedState, " ").concat(title);
7752
- } else if (!showStateFilter && !isSingleResource) {
7753
- displayTitle = t$1("messages.titleForResource", {
7754
- title: title,
7755
- resource: resourceName
7756
- });
7757
- }
7759
+ var displayTitle = isSingleResource ? title : t$1("messages.titleForResource", {
7760
+ title: title,
7761
+ resource: resourceName
7762
+ });
7758
7763
  return pure.humanize(displayTitle);
7759
7764
  };
7760
7765
  var renderNoDataHelpText = function renderNoDataHelpText(title, url) {
@@ -7956,7 +7961,7 @@ var useFieldsDashboard = function useFieldsDashboard(_ref) {
7956
7961
  }
7957
7962
  };
7958
7963
  var isScreenLoading = isFieldsLoading || isConfigsLoading;
7959
- var showCountSubheader = count > 0;
7964
+ var showCountSubheader = count > 0 && !showStateFilter;
7960
7965
  var searchProps = {
7961
7966
  onChange: function onChange(e) {
7962
7967
  return setSearchTerm(e.target.value);
@@ -7966,7 +7971,7 @@ var useFieldsDashboard = function useFieldsDashboard(_ref) {
7966
7971
  className: "w-44"
7967
7972
  };
7968
7973
  var isSingleResource = menuItems.length === 1;
7969
- var isMenuBarNeeded = showStateFilter || !isSingleResource;
7974
+ var isMenuBarNeeded = !isSingleResource && !isConfigsLoading;
7970
7975
  var resourceName = React.useMemo(function () {
7971
7976
  return getResourceName({
7972
7977
  isOwnerBased: isOwnerBased,
@@ -7978,14 +7983,12 @@ var useFieldsDashboard = function useFieldsDashboard(_ref) {
7978
7983
  var headerDisplayTitle = React.useMemo(function () {
7979
7984
  return getDashBoardTitle({
7980
7985
  resourceName: resourceName,
7981
- showStateFilter: showStateFilter,
7982
- selectedState: state,
7983
7986
  isSingleResource: isSingleResource,
7984
7987
  title: title
7985
7988
  });
7986
7989
  }, [state, isSingleResource, resourceName]);
7987
- var menuBarFilters = React.useMemo(function () {
7988
- return renderMenuBarFilters({
7990
+ var stateFilterTabs = React.useMemo(function () {
7991
+ return renderStateFilterTabs({
7989
7992
  selectedState: state,
7990
7993
  fieldStatesTaxonomy: fieldStatesTaxonomy,
7991
7994
  activeFieldsCount: activeFieldsCount,
@@ -8034,7 +8037,7 @@ var useFieldsDashboard = function useFieldsDashboard(_ref) {
8034
8037
  handleClosePane: handleClosePane,
8035
8038
  handleReorderPaneClose: handleReorderPaneClose,
8036
8039
  searchProps: searchProps,
8037
- menuBarFilters: menuBarFilters,
8040
+ stateFilterTabs: stateFilterTabs,
8038
8041
  menuBarItems: menuBarItems,
8039
8042
  allFields: allFields,
8040
8043
  headerDisplayTitle: headerDisplayTitle
@@ -12538,7 +12541,7 @@ var FieldsDashboard = function FieldsDashboard(_ref) {
12538
12541
  handleClosePane = _useFieldsDashboard.handleClosePane,
12539
12542
  handleReorderPaneClose = _useFieldsDashboard.handleReorderPaneClose,
12540
12543
  searchProps = _useFieldsDashboard.searchProps,
12541
- menuBarFilters = _useFieldsDashboard.menuBarFilters,
12544
+ stateFilterTabs = _useFieldsDashboard.stateFilterTabs,
12542
12545
  menuBarItems = _useFieldsDashboard.menuBarItems,
12543
12546
  allFields = _useFieldsDashboard.allFields,
12544
12547
  headerDisplayTitle = _useFieldsDashboard.headerDisplayTitle;
@@ -12547,8 +12550,8 @@ var FieldsDashboard = function FieldsDashboard(_ref) {
12547
12550
  title: title
12548
12551
  }, isConfigsLoading ? /*#__PURE__*/React__default["default"].createElement("div", {
12549
12552
  className: "flex items-center justify-center"
12550
- }, /*#__PURE__*/React__default["default"].createElement(neetoui.Spinner, null)) : menuBarItems, showStateFilter && menuBarFilters), isScreenLoading && ramda.isEmpty(fields) ? /*#__PURE__*/React__default["default"].createElement("div", {
12551
- className: "flex w-full flex-grow items-center justify-center"
12553
+ }, /*#__PURE__*/React__default["default"].createElement(neetoui.Spinner, null)) : menuBarItems), isScreenLoading && ramda.isEmpty(fields) ? /*#__PURE__*/React__default["default"].createElement("div", {
12554
+ className: "flex h-screen w-full flex-grow items-center justify-center"
12552
12555
  }, /*#__PURE__*/React__default["default"].createElement(PageLoader__default["default"], null)) : /*#__PURE__*/React__default["default"].createElement(Container__default["default"], null, /*#__PURE__*/React__default["default"].createElement(Header__default["default"], _extends({}, _objectSpread$2(_objectSpread$2({
12553
12556
  breadcrumbs: breadcrumbs
12554
12557
  }, isMenuBarNeeded && {
@@ -12586,7 +12589,7 @@ var FieldsDashboard = function FieldsDashboard(_ref) {
12586
12589
  "data-cy": "neeto-fields-subheader-text",
12587
12590
  style: "h4"
12588
12591
  }, "".concat(count, " "), t("titles.field", count > 1 ? PLURAL : SINGULAR).toLocaleLowerCase())
12589
- }), /*#__PURE__*/React__default["default"].createElement(FieldsTable, {
12592
+ }), showStateFilter && stateFilterTabs, /*#__PURE__*/React__default["default"].createElement(FieldsTable, {
12590
12593
  isLoading: isFieldsFetching || isFieldsLoading,
12591
12594
  rowData: ramda.isEmpty(rowData) ? fields : rowData,
12592
12595
  totalCount: count,