@knovator/pagecreator-admin 0.8.4 → 0.9.0

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/index.cjs CHANGED
@@ -2693,6 +2693,12 @@ const apiList = {
2693
2693
  url: `${prefix}/collection-data`,
2694
2694
  method: 'POST'
2695
2695
  }),
2696
+ LANGUAGES: ({
2697
+ prefix
2698
+ }) => ({
2699
+ url: `${prefix}/languages`,
2700
+ method: 'GET'
2701
+ }),
2696
2702
  // Image Upload API
2697
2703
  IMAGE_UPLOAD: ({
2698
2704
  prefix
@@ -3168,7 +3174,7 @@ const Table = ({
3168
3174
  }, loading && loader ? /*#__PURE__*/React__default["default"].createElement("div", {
3169
3175
  className: "khb_table-height"
3170
3176
  }, loader) : /*#__PURE__*/React__default["default"].createElement("table", {
3171
- className: "khb_table"
3177
+ className: `khb_table ${data.length > 0 ? '' : 'empty-table'}`
3172
3178
  }, /*#__PURE__*/React__default["default"].createElement("thead", {
3173
3179
  className: "khb_thead"
3174
3180
  }, /*#__PURE__*/React__default["default"].createElement("tr", null, dataKeys.map((key, i) => /*#__PURE__*/React__default["default"].createElement("th", {
@@ -3201,7 +3207,9 @@ const Table = ({
3201
3207
  // eslint-disable-next-line @typescript-eslint/ban-ts-comment
3202
3208
  // @ts-ignore
3203
3209
  onClick: () => actions.delete(item)
3204
- }, /*#__PURE__*/React__default["default"].createElement(Trash, null)), typeof extraActions === 'function' ? extraActions(item) : null) : null)) : /*#__PURE__*/React__default["default"].createElement("tr", null, /*#__PURE__*/React__default["default"].createElement("td", {
3210
+ }, /*#__PURE__*/React__default["default"].createElement(Trash, null)), typeof extraActions === 'function' ? extraActions(item) : null) : null)) : /*#__PURE__*/React__default["default"].createElement("tr", {
3211
+ className: "empty-row"
3212
+ }, /*#__PURE__*/React__default["default"].createElement("td", {
3205
3213
  colSpan: ((dataKeys === null || dataKeys === void 0 ? void 0 : dataKeys.length) || 0) + 1
3206
3214
  }, "No data found"))))));
3207
3215
  };
@@ -3707,7 +3715,8 @@ const SimpleForm = /*#__PURE__*/React.forwardRef(({
3707
3715
  handleSubmit,
3708
3716
  setValue,
3709
3717
  control,
3710
- setError
3718
+ setError,
3719
+ languages
3711
3720
  }, ref) => {
3712
3721
  const inputRenderer = schema => {
3713
3722
  var _a, _b, _c, _d, _e, _f;
@@ -3779,7 +3788,23 @@ const SimpleForm = /*#__PURE__*/React.forwardRef(({
3779
3788
  case 'url':
3780
3789
  case 'color':
3781
3790
  default:
3782
- input = /*#__PURE__*/React__default["default"].createElement(Input, {
3791
+ if (Array.isArray(languages) && languages.length > 0 && schema.accessor === 'widgetTitles') {
3792
+ input = languages.map(lang => {
3793
+ var _a, _b;
3794
+ return /*#__PURE__*/React__default["default"].createElement(Input, {
3795
+ key: lang.code,
3796
+ rest: register(`${schema.accessor}.${lang.code}`, schema.validations || {}),
3797
+ label: schema.label + ' (' + lang.name + ')',
3798
+ onInput: schema.onInput,
3799
+ error: (_b = (_a = errors[schema.accessor]) === null || _a === void 0 ? void 0 : _a[lang.code]) === null || _b === void 0 ? void 0 : _b.message,
3800
+ required: schema.required,
3801
+ type: schema.type,
3802
+ className: "kms_w-full kms_p-2",
3803
+ placeholder: (schema.placeholder || '') + ' (' + lang.name + ')',
3804
+ disabled: _isUpdating && typeof schema.editable !== 'undefined' && !schema.editable
3805
+ });
3806
+ });
3807
+ } else input = /*#__PURE__*/React__default["default"].createElement(Input, {
3783
3808
  rest: register(schema.accessor, schema.validations || {}),
3784
3809
  label: schema.label,
3785
3810
  error: (_f = (_e = errors[schema.accessor]) === null || _e === void 0 ? void 0 : _e.message) === null || _f === void 0 ? void 0 : _f.toString(),
@@ -4514,6 +4539,7 @@ const useWidget = ({
4514
4539
  const [loading, setLoading] = React.useState(false);
4515
4540
  const [totalPages, setTotalPages] = React.useState(0);
4516
4541
  const [totalRecords, setTotalRecords] = React.useState(0);
4542
+ const [languages, setLanguages] = React.useState([]);
4517
4543
  const [itemData, setItemData] = React.useState(null);
4518
4544
  const [formState, setFormState] = React.useState();
4519
4545
  const [itemsTypes, setItemsTypes] = React.useState([]);
@@ -4526,7 +4552,8 @@ const useWidget = ({
4526
4552
  onError,
4527
4553
  onSuccess,
4528
4554
  onLogout,
4529
- widgetRoutesPrefix
4555
+ widgetRoutesPrefix,
4556
+ pageRoutesPrefix
4530
4557
  } = useProviderState();
4531
4558
  const {
4532
4559
  changeSearch,
@@ -4584,6 +4611,24 @@ const useWidget = ({
4584
4611
  setLoading(false);
4585
4612
  }
4586
4613
  }), [baseUrl, currentPageRef, limitRef, offsetRef, handleError, routes, token, widgetRoutesPrefix]);
4614
+ const getLanguagesList = React.useCallback(() => __awaiter(void 0, void 0, void 0, function* () {
4615
+ const api = getApiType({
4616
+ routes,
4617
+ action: 'LANGUAGES',
4618
+ prefix: pageRoutesPrefix
4619
+ });
4620
+ const response = yield commonApi({
4621
+ baseUrl,
4622
+ token,
4623
+ method: api.method,
4624
+ url: api.url,
4625
+ onError: handleError(CALLBACK_CODES.GET_ALL)
4626
+ });
4627
+ if ((response === null || response === void 0 ? void 0 : response.code) === 'SUCCESS') {
4628
+ setLanguages(response.data);
4629
+ return response.data;
4630
+ }
4631
+ }), [baseUrl, handleError, pageRoutesPrefix, routes, token]);
4587
4632
  const onCofirmDeleteWidget = () => __awaiter(void 0, void 0, void 0, function* () {
4588
4633
  try {
4589
4634
  let proceed = true;
@@ -4876,10 +4921,14 @@ const useWidget = ({
4876
4921
  if (_canList) getWidgets();
4877
4922
  // eslint-disable-next-line react-hooks/exhaustive-deps
4878
4923
  }, [_canList]);
4924
+ React.useEffect(() => {
4925
+ getLanguagesList();
4926
+ }, [getLanguagesList]);
4879
4927
  return {
4880
4928
  list,
4881
4929
  getWidgets,
4882
4930
  loading,
4931
+ languages,
4883
4932
  setLoading,
4884
4933
  // Pagination
4885
4934
  searchText: searchRef.current,
@@ -5984,6 +6033,7 @@ const WidgetContextProvider = ({
5984
6033
  t: _t = () => '',
5985
6034
  // Form
5986
6035
  list: _list = [],
6036
+ languages: _languages = [],
5987
6037
  imageBaseUrl: _imageBaseUrl = '',
5988
6038
  searchText: _searchText = '',
5989
6039
  changeSearch: _changeSearch = () => {},
@@ -6032,6 +6082,7 @@ const WidgetContextProvider = ({
6032
6082
  t: _t,
6033
6083
  // Form
6034
6084
  list: _list,
6085
+ languages: _languages,
6035
6086
  imageBaseUrl: _imageBaseUrl,
6036
6087
  closeForm: _closeForm,
6037
6088
  formState: _formState,
@@ -6432,6 +6483,7 @@ const ItemsAccordian = ({
6432
6483
  register,
6433
6484
  setError,
6434
6485
  itemType,
6486
+ languages,
6435
6487
  clearError,
6436
6488
  addText: _addText = 'Add',
6437
6489
  deleteText: _deleteText = 'Delete'
@@ -6473,8 +6525,6 @@ const ItemsAccordian = ({
6473
6525
  }, [errors, name, errors === null || errors === void 0 ? void 0 : errors[name]]);
6474
6526
  const addTab = index => {
6475
6527
  appendItem({
6476
- title: '',
6477
- subtitle: '',
6478
6528
  altText: '',
6479
6529
  link: '',
6480
6530
  img: '',
@@ -6517,20 +6567,39 @@ const ItemsAccordian = ({
6517
6567
  }, _deleteText))
6518
6568
  }, /*#__PURE__*/React__default["default"].createElement("div", {
6519
6569
  className: "khb-form-items"
6520
- }, /*#__PURE__*/React__default["default"].createElement(Input, {
6570
+ }, Array.isArray(languages) && languages.length > 0 ? /*#__PURE__*/React__default["default"].createElement(React__default["default"].Fragment, null, languages.map(lang => {
6571
+ var _a, _b, _c, _d, _e;
6572
+ return /*#__PURE__*/React__default["default"].createElement(Input, {
6573
+ rest: register(`${name}.${index}.titles.${lang.code}`, {
6574
+ required: t('item.titleRequired')
6575
+ }),
6576
+ label: t('item.title') + ` (${lang.name})`,
6577
+ error: (_e = (_d = (_c = (_b = (_a = errors[name]) === null || _a === void 0 ? void 0 : _a[index]) === null || _b === void 0 ? void 0 : _b['titles']) === null || _c === void 0 ? void 0 : _c[lang.code]) === null || _d === void 0 ? void 0 : _d.message) === null || _e === void 0 ? void 0 : _e.toString(),
6578
+ type: "text",
6579
+ className: "w-full p-2",
6580
+ placeholder: t('item.titlePlaceholder'),
6581
+ required: true
6582
+ });
6583
+ })) : /*#__PURE__*/React__default["default"].createElement(Input, {
6521
6584
  rest: register(`${name}.${index}.title`, {
6522
6585
  required: t('item.titleRequired')
6523
6586
  }),
6524
6587
  label: t('item.title'),
6525
6588
  error: (_d = (_c = (_b = (_a = errors[name]) === null || _a === void 0 ? void 0 : _a[index]) === null || _b === void 0 ? void 0 : _b['title']) === null || _c === void 0 ? void 0 : _c.message) === null || _d === void 0 ? void 0 : _d.toString(),
6526
- type: 'text',
6589
+ type: "text",
6527
6590
  className: "w-full p-2",
6528
6591
  placeholder: t('item.titlePlaceholder'),
6529
6592
  required: true
6530
- }), /*#__PURE__*/React__default["default"].createElement(Input, {
6593
+ }), Array.isArray(languages) && languages.length > 0 ? /*#__PURE__*/React__default["default"].createElement(React__default["default"].Fragment, null, languages.map(lang => /*#__PURE__*/React__default["default"].createElement(Input, {
6594
+ rest: register(`${name}.${index}.subtitles.${lang.code}`),
6595
+ label: t('item.subtitle') + ` (${lang.name})`,
6596
+ type: "text",
6597
+ className: "w-full p-2",
6598
+ placeholder: t('item.subTitlePlaceholder')
6599
+ }))) : /*#__PURE__*/React__default["default"].createElement(Input, {
6531
6600
  rest: register(`${name}.${index}.subtitle`),
6532
6601
  label: t('item.subtitle'),
6533
- type: 'text',
6602
+ type: "text",
6534
6603
  className: "w-full p-2",
6535
6604
  placeholder: t('item.subTitlePlaceholder')
6536
6605
  }), /*#__PURE__*/React__default["default"].createElement(Input, {
@@ -6630,10 +6699,13 @@ const Tabs = ({
6630
6699
  setActiveTab,
6631
6700
  options,
6632
6701
  control,
6633
- register,
6634
6702
  listCode,
6703
+ setValue,
6704
+ getValues,
6705
+ languages,
6635
6706
  formatItem,
6636
6707
  deleteTitle,
6708
+ clearErrors,
6637
6709
  loadOptions,
6638
6710
  customStyles,
6639
6711
  noButtonText,
@@ -6642,9 +6714,10 @@ const Tabs = ({
6642
6714
  itemsPlaceholder,
6643
6715
  formatOptionLabel,
6644
6716
  tabCollectionItems,
6645
- tabNameRequiredText,
6646
6717
  onCollectionItemsIndexChange
6647
6718
  }) => {
6719
+ var _a;
6720
+ const [selectedLanguage, setSelectedLanguage] = React.useState((_a = languages === null || languages === void 0 ? void 0 : languages[0]) === null || _a === void 0 ? void 0 : _a.code);
6648
6721
  const {
6649
6722
  fields: tabFields,
6650
6723
  append: appendField,
@@ -6654,12 +6727,27 @@ const Tabs = ({
6654
6727
  control
6655
6728
  });
6656
6729
  const addTab = () => {
6657
- appendField({
6658
- name: 'Tab Name',
6730
+ appendField(Object.assign(Object.assign({}, selectedLanguage ? {
6731
+ names: languages === null || languages === void 0 ? void 0 : languages.reduce((acc, lng) => {
6732
+ acc[lng.code] = '';
6733
+ return acc;
6734
+ }, {})
6735
+ } : {
6736
+ name: ''
6737
+ }), {
6659
6738
  collectionItems: []
6660
- });
6739
+ }));
6661
6740
  setActiveTab(tabFields.length);
6662
6741
  };
6742
+ const onTabnameChange = (index, value) => {
6743
+ if (selectedLanguage) {
6744
+ clearErrors(`tabs.${index}.names.${selectedLanguage}`);
6745
+ setValue(`tabs.${index}.names.${selectedLanguage}`, value);
6746
+ } else {
6747
+ clearErrors(`tabs.${index}.name`);
6748
+ setValue(`tabs.${index}.name`, value);
6749
+ }
6750
+ };
6663
6751
  return /*#__PURE__*/React__default["default"].createElement("div", {
6664
6752
  className: "khb_tabs-container"
6665
6753
  }, /*#__PURE__*/React__default["default"].createElement(reactTabs.Tabs, {
@@ -6668,8 +6756,18 @@ const Tabs = ({
6668
6756
  className: "khb-tabs"
6669
6757
  }, /*#__PURE__*/React__default["default"].createElement(reactTabs.TabList, {
6670
6758
  className: "khb_tabs-list"
6671
- }, tabFields === null || tabFields === void 0 ? void 0 : tabFields.map((field, index) => {
6672
- var _a, _b, _c;
6759
+ }, Array.isArray(languages) && languages.length > 0 && /*#__PURE__*/React__default["default"].createElement("div", {
6760
+ className: "khb_input-wrapper"
6761
+ }, /*#__PURE__*/React__default["default"].createElement("select", {
6762
+ title: "Change Language",
6763
+ value: selectedLanguage,
6764
+ className: "khb_input khb_input-sm h-full",
6765
+ onChange: e => setSelectedLanguage(e.target.value)
6766
+ }, languages.map(lng => /*#__PURE__*/React__default["default"].createElement("option", {
6767
+ value: lng.code,
6768
+ key: lng.code
6769
+ }, lng.name)))), tabFields === null || tabFields === void 0 ? void 0 : tabFields.map((field, index) => {
6770
+ var _a, _b, _c, _d, _e, _f, _g;
6673
6771
  return /*#__PURE__*/React__default["default"].createElement(reactTabs.Tab, {
6674
6772
  key: field.id,
6675
6773
  className: classNames__default["default"]('khb_tabs-item', {
@@ -6678,14 +6776,18 @@ const Tabs = ({
6678
6776
  }, /*#__PURE__*/React__default["default"].createElement(TabItem, {
6679
6777
  key: field.id,
6680
6778
  deleteTitle: deleteTitle,
6681
- register: register(`tabs.${index}.name`, {
6682
- required: tabNameRequiredText
6683
- }),
6779
+ register: {
6780
+ value: getValues(`tabs.${index}.names.${selectedLanguage}`),
6781
+ onChange: e => onTabnameChange(index, e.target.value || '')
6782
+ },
6684
6783
  onRemoveTab: () => {
6685
6784
  removeField(index);
6686
6785
  setActiveTab(index === 0 ? 0 : index - 1);
6687
6786
  },
6688
- error: (_c = (_b = (_a = errors === null || errors === void 0 ? void 0 : errors['tabs']) === null || _a === void 0 ? void 0 : _a[index]) === null || _b === void 0 ? void 0 : _b.name) === null || _c === void 0 ? void 0 : _c.message,
6787
+ error: selectedLanguage ? ((_b = (_a = errors === null || errors === void 0 ? void 0 : errors['tabs']) === null || _a === void 0 ? void 0 : _a[index]) === null || _b === void 0 ? void 0 : _b.names) ? Object.keys((_d = (_c = errors === null || errors === void 0 ? void 0 : errors['tabs']) === null || _c === void 0 ? void 0 : _c[index]) === null || _d === void 0 ? void 0 : _d.names).map(key => {
6788
+ var _a, _b, _c, _d;
6789
+ return (_d = (_c = (_b = (_a = errors === null || errors === void 0 ? void 0 : errors['tabs']) === null || _a === void 0 ? void 0 : _a[index]) === null || _b === void 0 ? void 0 : _b.names) === null || _c === void 0 ? void 0 : _c[key]) === null || _d === void 0 ? void 0 : _d.message;
6790
+ }).join(', ') : '' : (_g = (_f = (_e = errors === null || errors === void 0 ? void 0 : errors['tabs']) === null || _e === void 0 ? void 0 : _e[index]) === null || _f === void 0 ? void 0 : _f.name) === null || _g === void 0 ? void 0 : _g.message,
6689
6791
  noButtonText: noButtonText,
6690
6792
  yesButtonText: yesButtonText,
6691
6793
  showDelete: (tabFields === null || tabFields === void 0 ? void 0 : tabFields.length) > 1
@@ -6778,6 +6880,7 @@ const WidgetForm = ({
6778
6880
  itemsTypes,
6779
6881
  widgetTypes,
6780
6882
  loading,
6883
+ languages,
6781
6884
  onWidgetFormSubmit,
6782
6885
  getCollectionData,
6783
6886
  collectionData,
@@ -6912,6 +7015,32 @@ const WidgetForm = ({
6912
7015
  setTabCollectionItems(value[constants.tabsAccessor].map(tabItem => tabItem[constants.tabCollectionItemsAccessor]));
6913
7016
  }
6914
7017
  }, [getFirstItemTypeValue, itemsTypes, widgetTypes]);
7018
+ const validateTabs = tabsData => {
7019
+ const isLanguagesProvided = Array.isArray(languages) && languages.length > 0;
7020
+ let isTabsValid = true;
7021
+ if (Array.isArray(tabsData) && tabsData.length > 0) {
7022
+ tabsData.forEach((tabItem, index) => {
7023
+ if (isLanguagesProvided) {
7024
+ languages.forEach(lang => {
7025
+ if (!tabItem.names[lang.code]) {
7026
+ setError(`tabs.${index}.names.${lang.code}`, {
7027
+ type: 'manual',
7028
+ message: `${t('widget.tabNameRequired')} (${lang.name})`
7029
+ });
7030
+ isTabsValid = false;
7031
+ }
7032
+ });
7033
+ } else if (!tabItem.name) {
7034
+ setError(`tabs.${index}.name`, {
7035
+ type: 'manual',
7036
+ message: t('widget.tabNameRequired')
7037
+ });
7038
+ isTabsValid = false;
7039
+ }
7040
+ });
7041
+ }
7042
+ return isTabsValid;
7043
+ };
6915
7044
  const onFormSubmit = data => {
6916
7045
  var _a, _b;
6917
7046
  const formData = Object.assign({}, data);
@@ -6921,9 +7050,14 @@ const WidgetForm = ({
6921
7050
  }
6922
7051
  // setting tabs data if widgetType tab is selected
6923
7052
  const tabsData = getValues('tabs');
7053
+ if (Array.isArray(tabsData) && tabsData.length > 0) {
7054
+ const isTabsValid = validateTabs(tabsData);
7055
+ if (!isTabsValid) return;
7056
+ }
6924
7057
  if (Array.isArray(tabsData) && (formData[constants.widgetTypeAccessor] === constants.tabsWidgetTypeValue || formState === 'UPDATE')) {
6925
7058
  formData[constants.tabsAccessor] = tabsData.map(tabItem => ({
6926
7059
  name: tabItem.name,
7060
+ names: tabItem.names,
6927
7061
  collectionItems: tabItem.collectionItems.map(item => typeof item == 'string' ? item : item.value)
6928
7062
  }));
6929
7063
  } else formData[constants.tabsAccessor] = [];
@@ -7010,7 +7144,19 @@ const WidgetForm = ({
7010
7144
  required: t('widget.codeRequired')
7011
7145
  },
7012
7146
  wrapperClassName: 'khb_grid-item-1of2 khb_padding-left-1 khb_align-top khb_margin-top-0'
7013
- }, {
7147
+ }, Array.isArray(languages) && languages.length > 0 ? {
7148
+ label: `${t('widget.widgetTitle')}`,
7149
+ accessor: 'widgetTitles',
7150
+ required: true,
7151
+ type: customInputs && customInputs['widgetTitle'] ? undefined : 'text',
7152
+ validations: {
7153
+ required: t('widget.widgetTitleRequired')
7154
+ },
7155
+ info: t('widget.widgetTitleInfo'),
7156
+ placeholder: t('widget.widgetTitlePlaceholder'),
7157
+ onInput: handleCapitalize,
7158
+ Input: customInputs && customInputs['widgetTitle'] ? customInputs['widgetTitle'] : undefined
7159
+ } : {
7014
7160
  label: `${t('widget.widgetTitle')}`,
7015
7161
  accessor: 'widgetTitle',
7016
7162
  required: true,
@@ -7126,15 +7272,18 @@ const WidgetForm = ({
7126
7272
  handleSubmit: handleSubmit,
7127
7273
  setValue: setValue,
7128
7274
  control: control,
7129
- setError: setError
7275
+ setError: setError,
7276
+ languages: languages
7130
7277
  }), (selectedWidgetType === null || selectedWidgetType === void 0 ? void 0 : selectedWidgetType.value) === 'Tabs' ? /*#__PURE__*/React__default["default"].createElement(Tabs, {
7278
+ clearErrors: clearErrors,
7279
+ getValues: getValues,
7280
+ setValue: setValue,
7131
7281
  control: control,
7132
- register: register,
7282
+ languages: languages,
7133
7283
  deleteTitle: t('widget.tabDeleteTitle'),
7134
7284
  yesButtonText: t('yesButtonText'),
7135
7285
  noButtonText: t('cancelButtonText'),
7136
7286
  errors: errors,
7137
- tabNameRequiredText: t('widget.tabNameRequired'),
7138
7287
  itemsPlaceholder: `Select ${selectedCollectionType === null || selectedCollectionType === void 0 ? void 0 : selectedCollectionType.label}...`,
7139
7288
  loadOptions: onChangeSearch,
7140
7289
  isItemsLoading: collectionDataLoading,
@@ -7152,6 +7301,7 @@ const WidgetForm = ({
7152
7301
  formatItem: formatListItem,
7153
7302
  listCode: selectedCollectionType === null || selectedCollectionType === void 0 ? void 0 : selectedCollectionType.value
7154
7303
  }), itemsEnabled && (selectedWidgetType === null || selectedWidgetType === void 0 ? void 0 : selectedWidgetType.value) !== 'Tabs' && /*#__PURE__*/React__default["default"].createElement(React__default["default"].Fragment, null, /*#__PURE__*/React__default["default"].createElement(ItemsAccordian, {
7304
+ languages: languages,
7155
7305
  clearError: clearErrors,
7156
7306
  collapseId: constants.webItems,
7157
7307
  title: t('widget.webItems'),
@@ -7168,6 +7318,7 @@ const WidgetForm = ({
7168
7318
  addText: t('addButtonText'),
7169
7319
  deleteText: t('deleteButtonText')
7170
7320
  }), /*#__PURE__*/React__default["default"].createElement(ItemsAccordian, {
7321
+ languages: languages,
7171
7322
  clearError: clearErrors,
7172
7323
  collapseId: constants.mobileItems,
7173
7324
  title: t('widget.mobileItems'),
@@ -7342,6 +7493,7 @@ const Widget = ({
7342
7493
  totalRecords,
7343
7494
  currentPage,
7344
7495
  pageSize,
7496
+ languages,
7345
7497
  setCurrentPage
7346
7498
  } = useWidget({
7347
7499
  canList: derivedPermissions.list,
@@ -7353,6 +7505,7 @@ const Widget = ({
7353
7505
  return /*#__PURE__*/React__default["default"].createElement(WidgetContextProvider, {
7354
7506
  loading: loading,
7355
7507
  list: list,
7508
+ languages: languages,
7356
7509
  imageBaseUrl: imageBaseUrl,
7357
7510
  onChangeFormState: onChangeFormState,
7358
7511
  t: derivedT,
package/index.css CHANGED
@@ -2038,6 +2038,7 @@ input:checked + .slider:before {
2038
2038
  .khb_tabs-item {
2039
2039
  display: flex;
2040
2040
  cursor: pointer;
2041
+ flex-direction: column;
2041
2042
  align-self: center;
2042
2043
  border-radius: 0.375rem;
2043
2044
  --tw-bg-opacity: 1;
package/index.js CHANGED
@@ -2681,6 +2681,12 @@ const apiList = {
2681
2681
  url: `${prefix}/collection-data`,
2682
2682
  method: 'POST'
2683
2683
  }),
2684
+ LANGUAGES: ({
2685
+ prefix
2686
+ }) => ({
2687
+ url: `${prefix}/languages`,
2688
+ method: 'GET'
2689
+ }),
2684
2690
  // Image Upload API
2685
2691
  IMAGE_UPLOAD: ({
2686
2692
  prefix
@@ -3156,7 +3162,7 @@ const Table = ({
3156
3162
  }, loading && loader ? /*#__PURE__*/React.createElement("div", {
3157
3163
  className: "khb_table-height"
3158
3164
  }, loader) : /*#__PURE__*/React.createElement("table", {
3159
- className: "khb_table"
3165
+ className: `khb_table ${data.length > 0 ? '' : 'empty-table'}`
3160
3166
  }, /*#__PURE__*/React.createElement("thead", {
3161
3167
  className: "khb_thead"
3162
3168
  }, /*#__PURE__*/React.createElement("tr", null, dataKeys.map((key, i) => /*#__PURE__*/React.createElement("th", {
@@ -3189,7 +3195,9 @@ const Table = ({
3189
3195
  // eslint-disable-next-line @typescript-eslint/ban-ts-comment
3190
3196
  // @ts-ignore
3191
3197
  onClick: () => actions.delete(item)
3192
- }, /*#__PURE__*/React.createElement(Trash, null)), typeof extraActions === 'function' ? extraActions(item) : null) : null)) : /*#__PURE__*/React.createElement("tr", null, /*#__PURE__*/React.createElement("td", {
3198
+ }, /*#__PURE__*/React.createElement(Trash, null)), typeof extraActions === 'function' ? extraActions(item) : null) : null)) : /*#__PURE__*/React.createElement("tr", {
3199
+ className: "empty-row"
3200
+ }, /*#__PURE__*/React.createElement("td", {
3193
3201
  colSpan: ((dataKeys === null || dataKeys === void 0 ? void 0 : dataKeys.length) || 0) + 1
3194
3202
  }, "No data found"))))));
3195
3203
  };
@@ -3695,7 +3703,8 @@ const SimpleForm = /*#__PURE__*/forwardRef(({
3695
3703
  handleSubmit,
3696
3704
  setValue,
3697
3705
  control,
3698
- setError
3706
+ setError,
3707
+ languages
3699
3708
  }, ref) => {
3700
3709
  const inputRenderer = schema => {
3701
3710
  var _a, _b, _c, _d, _e, _f;
@@ -3767,7 +3776,23 @@ const SimpleForm = /*#__PURE__*/forwardRef(({
3767
3776
  case 'url':
3768
3777
  case 'color':
3769
3778
  default:
3770
- input = /*#__PURE__*/React.createElement(Input, {
3779
+ if (Array.isArray(languages) && languages.length > 0 && schema.accessor === 'widgetTitles') {
3780
+ input = languages.map(lang => {
3781
+ var _a, _b;
3782
+ return /*#__PURE__*/React.createElement(Input, {
3783
+ key: lang.code,
3784
+ rest: register(`${schema.accessor}.${lang.code}`, schema.validations || {}),
3785
+ label: schema.label + ' (' + lang.name + ')',
3786
+ onInput: schema.onInput,
3787
+ error: (_b = (_a = errors[schema.accessor]) === null || _a === void 0 ? void 0 : _a[lang.code]) === null || _b === void 0 ? void 0 : _b.message,
3788
+ required: schema.required,
3789
+ type: schema.type,
3790
+ className: "kms_w-full kms_p-2",
3791
+ placeholder: (schema.placeholder || '') + ' (' + lang.name + ')',
3792
+ disabled: _isUpdating && typeof schema.editable !== 'undefined' && !schema.editable
3793
+ });
3794
+ });
3795
+ } else input = /*#__PURE__*/React.createElement(Input, {
3771
3796
  rest: register(schema.accessor, schema.validations || {}),
3772
3797
  label: schema.label,
3773
3798
  error: (_f = (_e = errors[schema.accessor]) === null || _e === void 0 ? void 0 : _e.message) === null || _f === void 0 ? void 0 : _f.toString(),
@@ -4502,6 +4527,7 @@ const useWidget = ({
4502
4527
  const [loading, setLoading] = useState(false);
4503
4528
  const [totalPages, setTotalPages] = useState(0);
4504
4529
  const [totalRecords, setTotalRecords] = useState(0);
4530
+ const [languages, setLanguages] = useState([]);
4505
4531
  const [itemData, setItemData] = useState(null);
4506
4532
  const [formState, setFormState] = useState();
4507
4533
  const [itemsTypes, setItemsTypes] = useState([]);
@@ -4514,7 +4540,8 @@ const useWidget = ({
4514
4540
  onError,
4515
4541
  onSuccess,
4516
4542
  onLogout,
4517
- widgetRoutesPrefix
4543
+ widgetRoutesPrefix,
4544
+ pageRoutesPrefix
4518
4545
  } = useProviderState();
4519
4546
  const {
4520
4547
  changeSearch,
@@ -4572,6 +4599,24 @@ const useWidget = ({
4572
4599
  setLoading(false);
4573
4600
  }
4574
4601
  }), [baseUrl, currentPageRef, limitRef, offsetRef, handleError, routes, token, widgetRoutesPrefix]);
4602
+ const getLanguagesList = useCallback(() => __awaiter(void 0, void 0, void 0, function* () {
4603
+ const api = getApiType({
4604
+ routes,
4605
+ action: 'LANGUAGES',
4606
+ prefix: pageRoutesPrefix
4607
+ });
4608
+ const response = yield commonApi({
4609
+ baseUrl,
4610
+ token,
4611
+ method: api.method,
4612
+ url: api.url,
4613
+ onError: handleError(CALLBACK_CODES.GET_ALL)
4614
+ });
4615
+ if ((response === null || response === void 0 ? void 0 : response.code) === 'SUCCESS') {
4616
+ setLanguages(response.data);
4617
+ return response.data;
4618
+ }
4619
+ }), [baseUrl, handleError, pageRoutesPrefix, routes, token]);
4575
4620
  const onCofirmDeleteWidget = () => __awaiter(void 0, void 0, void 0, function* () {
4576
4621
  try {
4577
4622
  let proceed = true;
@@ -4864,10 +4909,14 @@ const useWidget = ({
4864
4909
  if (_canList) getWidgets();
4865
4910
  // eslint-disable-next-line react-hooks/exhaustive-deps
4866
4911
  }, [_canList]);
4912
+ useEffect(() => {
4913
+ getLanguagesList();
4914
+ }, [getLanguagesList]);
4867
4915
  return {
4868
4916
  list,
4869
4917
  getWidgets,
4870
4918
  loading,
4919
+ languages,
4871
4920
  setLoading,
4872
4921
  // Pagination
4873
4922
  searchText: searchRef.current,
@@ -5972,6 +6021,7 @@ const WidgetContextProvider = ({
5972
6021
  t: _t = () => '',
5973
6022
  // Form
5974
6023
  list: _list = [],
6024
+ languages: _languages = [],
5975
6025
  imageBaseUrl: _imageBaseUrl = '',
5976
6026
  searchText: _searchText = '',
5977
6027
  changeSearch: _changeSearch = () => {},
@@ -6020,6 +6070,7 @@ const WidgetContextProvider = ({
6020
6070
  t: _t,
6021
6071
  // Form
6022
6072
  list: _list,
6073
+ languages: _languages,
6023
6074
  imageBaseUrl: _imageBaseUrl,
6024
6075
  closeForm: _closeForm,
6025
6076
  formState: _formState,
@@ -6420,6 +6471,7 @@ const ItemsAccordian = ({
6420
6471
  register,
6421
6472
  setError,
6422
6473
  itemType,
6474
+ languages,
6423
6475
  clearError,
6424
6476
  addText: _addText = 'Add',
6425
6477
  deleteText: _deleteText = 'Delete'
@@ -6461,8 +6513,6 @@ const ItemsAccordian = ({
6461
6513
  }, [errors, name, errors === null || errors === void 0 ? void 0 : errors[name]]);
6462
6514
  const addTab = index => {
6463
6515
  appendItem({
6464
- title: '',
6465
- subtitle: '',
6466
6516
  altText: '',
6467
6517
  link: '',
6468
6518
  img: '',
@@ -6505,20 +6555,39 @@ const ItemsAccordian = ({
6505
6555
  }, _deleteText))
6506
6556
  }, /*#__PURE__*/React.createElement("div", {
6507
6557
  className: "khb-form-items"
6508
- }, /*#__PURE__*/React.createElement(Input, {
6558
+ }, Array.isArray(languages) && languages.length > 0 ? /*#__PURE__*/React.createElement(React.Fragment, null, languages.map(lang => {
6559
+ var _a, _b, _c, _d, _e;
6560
+ return /*#__PURE__*/React.createElement(Input, {
6561
+ rest: register(`${name}.${index}.titles.${lang.code}`, {
6562
+ required: t('item.titleRequired')
6563
+ }),
6564
+ label: t('item.title') + ` (${lang.name})`,
6565
+ error: (_e = (_d = (_c = (_b = (_a = errors[name]) === null || _a === void 0 ? void 0 : _a[index]) === null || _b === void 0 ? void 0 : _b['titles']) === null || _c === void 0 ? void 0 : _c[lang.code]) === null || _d === void 0 ? void 0 : _d.message) === null || _e === void 0 ? void 0 : _e.toString(),
6566
+ type: "text",
6567
+ className: "w-full p-2",
6568
+ placeholder: t('item.titlePlaceholder'),
6569
+ required: true
6570
+ });
6571
+ })) : /*#__PURE__*/React.createElement(Input, {
6509
6572
  rest: register(`${name}.${index}.title`, {
6510
6573
  required: t('item.titleRequired')
6511
6574
  }),
6512
6575
  label: t('item.title'),
6513
6576
  error: (_d = (_c = (_b = (_a = errors[name]) === null || _a === void 0 ? void 0 : _a[index]) === null || _b === void 0 ? void 0 : _b['title']) === null || _c === void 0 ? void 0 : _c.message) === null || _d === void 0 ? void 0 : _d.toString(),
6514
- type: 'text',
6577
+ type: "text",
6515
6578
  className: "w-full p-2",
6516
6579
  placeholder: t('item.titlePlaceholder'),
6517
6580
  required: true
6518
- }), /*#__PURE__*/React.createElement(Input, {
6581
+ }), Array.isArray(languages) && languages.length > 0 ? /*#__PURE__*/React.createElement(React.Fragment, null, languages.map(lang => /*#__PURE__*/React.createElement(Input, {
6582
+ rest: register(`${name}.${index}.subtitles.${lang.code}`),
6583
+ label: t('item.subtitle') + ` (${lang.name})`,
6584
+ type: "text",
6585
+ className: "w-full p-2",
6586
+ placeholder: t('item.subTitlePlaceholder')
6587
+ }))) : /*#__PURE__*/React.createElement(Input, {
6519
6588
  rest: register(`${name}.${index}.subtitle`),
6520
6589
  label: t('item.subtitle'),
6521
- type: 'text',
6590
+ type: "text",
6522
6591
  className: "w-full p-2",
6523
6592
  placeholder: t('item.subTitlePlaceholder')
6524
6593
  }), /*#__PURE__*/React.createElement(Input, {
@@ -6618,10 +6687,13 @@ const Tabs = ({
6618
6687
  setActiveTab,
6619
6688
  options,
6620
6689
  control,
6621
- register,
6622
6690
  listCode,
6691
+ setValue,
6692
+ getValues,
6693
+ languages,
6623
6694
  formatItem,
6624
6695
  deleteTitle,
6696
+ clearErrors,
6625
6697
  loadOptions,
6626
6698
  customStyles,
6627
6699
  noButtonText,
@@ -6630,9 +6702,10 @@ const Tabs = ({
6630
6702
  itemsPlaceholder,
6631
6703
  formatOptionLabel,
6632
6704
  tabCollectionItems,
6633
- tabNameRequiredText,
6634
6705
  onCollectionItemsIndexChange
6635
6706
  }) => {
6707
+ var _a;
6708
+ const [selectedLanguage, setSelectedLanguage] = useState((_a = languages === null || languages === void 0 ? void 0 : languages[0]) === null || _a === void 0 ? void 0 : _a.code);
6636
6709
  const {
6637
6710
  fields: tabFields,
6638
6711
  append: appendField,
@@ -6642,12 +6715,27 @@ const Tabs = ({
6642
6715
  control
6643
6716
  });
6644
6717
  const addTab = () => {
6645
- appendField({
6646
- name: 'Tab Name',
6718
+ appendField(Object.assign(Object.assign({}, selectedLanguage ? {
6719
+ names: languages === null || languages === void 0 ? void 0 : languages.reduce((acc, lng) => {
6720
+ acc[lng.code] = '';
6721
+ return acc;
6722
+ }, {})
6723
+ } : {
6724
+ name: ''
6725
+ }), {
6647
6726
  collectionItems: []
6648
- });
6727
+ }));
6649
6728
  setActiveTab(tabFields.length);
6650
6729
  };
6730
+ const onTabnameChange = (index, value) => {
6731
+ if (selectedLanguage) {
6732
+ clearErrors(`tabs.${index}.names.${selectedLanguage}`);
6733
+ setValue(`tabs.${index}.names.${selectedLanguage}`, value);
6734
+ } else {
6735
+ clearErrors(`tabs.${index}.name`);
6736
+ setValue(`tabs.${index}.name`, value);
6737
+ }
6738
+ };
6651
6739
  return /*#__PURE__*/React.createElement("div", {
6652
6740
  className: "khb_tabs-container"
6653
6741
  }, /*#__PURE__*/React.createElement(Tabs$1, {
@@ -6656,8 +6744,18 @@ const Tabs = ({
6656
6744
  className: "khb-tabs"
6657
6745
  }, /*#__PURE__*/React.createElement(TabList, {
6658
6746
  className: "khb_tabs-list"
6659
- }, tabFields === null || tabFields === void 0 ? void 0 : tabFields.map((field, index) => {
6660
- var _a, _b, _c;
6747
+ }, Array.isArray(languages) && languages.length > 0 && /*#__PURE__*/React.createElement("div", {
6748
+ className: "khb_input-wrapper"
6749
+ }, /*#__PURE__*/React.createElement("select", {
6750
+ title: "Change Language",
6751
+ value: selectedLanguage,
6752
+ className: "khb_input khb_input-sm h-full",
6753
+ onChange: e => setSelectedLanguage(e.target.value)
6754
+ }, languages.map(lng => /*#__PURE__*/React.createElement("option", {
6755
+ value: lng.code,
6756
+ key: lng.code
6757
+ }, lng.name)))), tabFields === null || tabFields === void 0 ? void 0 : tabFields.map((field, index) => {
6758
+ var _a, _b, _c, _d, _e, _f, _g;
6661
6759
  return /*#__PURE__*/React.createElement(Tab, {
6662
6760
  key: field.id,
6663
6761
  className: classNames('khb_tabs-item', {
@@ -6666,14 +6764,18 @@ const Tabs = ({
6666
6764
  }, /*#__PURE__*/React.createElement(TabItem, {
6667
6765
  key: field.id,
6668
6766
  deleteTitle: deleteTitle,
6669
- register: register(`tabs.${index}.name`, {
6670
- required: tabNameRequiredText
6671
- }),
6767
+ register: {
6768
+ value: getValues(`tabs.${index}.names.${selectedLanguage}`),
6769
+ onChange: e => onTabnameChange(index, e.target.value || '')
6770
+ },
6672
6771
  onRemoveTab: () => {
6673
6772
  removeField(index);
6674
6773
  setActiveTab(index === 0 ? 0 : index - 1);
6675
6774
  },
6676
- error: (_c = (_b = (_a = errors === null || errors === void 0 ? void 0 : errors['tabs']) === null || _a === void 0 ? void 0 : _a[index]) === null || _b === void 0 ? void 0 : _b.name) === null || _c === void 0 ? void 0 : _c.message,
6775
+ error: selectedLanguage ? ((_b = (_a = errors === null || errors === void 0 ? void 0 : errors['tabs']) === null || _a === void 0 ? void 0 : _a[index]) === null || _b === void 0 ? void 0 : _b.names) ? Object.keys((_d = (_c = errors === null || errors === void 0 ? void 0 : errors['tabs']) === null || _c === void 0 ? void 0 : _c[index]) === null || _d === void 0 ? void 0 : _d.names).map(key => {
6776
+ var _a, _b, _c, _d;
6777
+ return (_d = (_c = (_b = (_a = errors === null || errors === void 0 ? void 0 : errors['tabs']) === null || _a === void 0 ? void 0 : _a[index]) === null || _b === void 0 ? void 0 : _b.names) === null || _c === void 0 ? void 0 : _c[key]) === null || _d === void 0 ? void 0 : _d.message;
6778
+ }).join(', ') : '' : (_g = (_f = (_e = errors === null || errors === void 0 ? void 0 : errors['tabs']) === null || _e === void 0 ? void 0 : _e[index]) === null || _f === void 0 ? void 0 : _f.name) === null || _g === void 0 ? void 0 : _g.message,
6677
6779
  noButtonText: noButtonText,
6678
6780
  yesButtonText: yesButtonText,
6679
6781
  showDelete: (tabFields === null || tabFields === void 0 ? void 0 : tabFields.length) > 1
@@ -6766,6 +6868,7 @@ const WidgetForm = ({
6766
6868
  itemsTypes,
6767
6869
  widgetTypes,
6768
6870
  loading,
6871
+ languages,
6769
6872
  onWidgetFormSubmit,
6770
6873
  getCollectionData,
6771
6874
  collectionData,
@@ -6900,6 +7003,32 @@ const WidgetForm = ({
6900
7003
  setTabCollectionItems(value[constants.tabsAccessor].map(tabItem => tabItem[constants.tabCollectionItemsAccessor]));
6901
7004
  }
6902
7005
  }, [getFirstItemTypeValue, itemsTypes, widgetTypes]);
7006
+ const validateTabs = tabsData => {
7007
+ const isLanguagesProvided = Array.isArray(languages) && languages.length > 0;
7008
+ let isTabsValid = true;
7009
+ if (Array.isArray(tabsData) && tabsData.length > 0) {
7010
+ tabsData.forEach((tabItem, index) => {
7011
+ if (isLanguagesProvided) {
7012
+ languages.forEach(lang => {
7013
+ if (!tabItem.names[lang.code]) {
7014
+ setError(`tabs.${index}.names.${lang.code}`, {
7015
+ type: 'manual',
7016
+ message: `${t('widget.tabNameRequired')} (${lang.name})`
7017
+ });
7018
+ isTabsValid = false;
7019
+ }
7020
+ });
7021
+ } else if (!tabItem.name) {
7022
+ setError(`tabs.${index}.name`, {
7023
+ type: 'manual',
7024
+ message: t('widget.tabNameRequired')
7025
+ });
7026
+ isTabsValid = false;
7027
+ }
7028
+ });
7029
+ }
7030
+ return isTabsValid;
7031
+ };
6903
7032
  const onFormSubmit = data => {
6904
7033
  var _a, _b;
6905
7034
  const formData = Object.assign({}, data);
@@ -6909,9 +7038,14 @@ const WidgetForm = ({
6909
7038
  }
6910
7039
  // setting tabs data if widgetType tab is selected
6911
7040
  const tabsData = getValues('tabs');
7041
+ if (Array.isArray(tabsData) && tabsData.length > 0) {
7042
+ const isTabsValid = validateTabs(tabsData);
7043
+ if (!isTabsValid) return;
7044
+ }
6912
7045
  if (Array.isArray(tabsData) && (formData[constants.widgetTypeAccessor] === constants.tabsWidgetTypeValue || formState === 'UPDATE')) {
6913
7046
  formData[constants.tabsAccessor] = tabsData.map(tabItem => ({
6914
7047
  name: tabItem.name,
7048
+ names: tabItem.names,
6915
7049
  collectionItems: tabItem.collectionItems.map(item => typeof item == 'string' ? item : item.value)
6916
7050
  }));
6917
7051
  } else formData[constants.tabsAccessor] = [];
@@ -6998,7 +7132,19 @@ const WidgetForm = ({
6998
7132
  required: t('widget.codeRequired')
6999
7133
  },
7000
7134
  wrapperClassName: 'khb_grid-item-1of2 khb_padding-left-1 khb_align-top khb_margin-top-0'
7001
- }, {
7135
+ }, Array.isArray(languages) && languages.length > 0 ? {
7136
+ label: `${t('widget.widgetTitle')}`,
7137
+ accessor: 'widgetTitles',
7138
+ required: true,
7139
+ type: customInputs && customInputs['widgetTitle'] ? undefined : 'text',
7140
+ validations: {
7141
+ required: t('widget.widgetTitleRequired')
7142
+ },
7143
+ info: t('widget.widgetTitleInfo'),
7144
+ placeholder: t('widget.widgetTitlePlaceholder'),
7145
+ onInput: handleCapitalize,
7146
+ Input: customInputs && customInputs['widgetTitle'] ? customInputs['widgetTitle'] : undefined
7147
+ } : {
7002
7148
  label: `${t('widget.widgetTitle')}`,
7003
7149
  accessor: 'widgetTitle',
7004
7150
  required: true,
@@ -7114,15 +7260,18 @@ const WidgetForm = ({
7114
7260
  handleSubmit: handleSubmit,
7115
7261
  setValue: setValue,
7116
7262
  control: control,
7117
- setError: setError
7263
+ setError: setError,
7264
+ languages: languages
7118
7265
  }), (selectedWidgetType === null || selectedWidgetType === void 0 ? void 0 : selectedWidgetType.value) === 'Tabs' ? /*#__PURE__*/React.createElement(Tabs, {
7266
+ clearErrors: clearErrors,
7267
+ getValues: getValues,
7268
+ setValue: setValue,
7119
7269
  control: control,
7120
- register: register,
7270
+ languages: languages,
7121
7271
  deleteTitle: t('widget.tabDeleteTitle'),
7122
7272
  yesButtonText: t('yesButtonText'),
7123
7273
  noButtonText: t('cancelButtonText'),
7124
7274
  errors: errors,
7125
- tabNameRequiredText: t('widget.tabNameRequired'),
7126
7275
  itemsPlaceholder: `Select ${selectedCollectionType === null || selectedCollectionType === void 0 ? void 0 : selectedCollectionType.label}...`,
7127
7276
  loadOptions: onChangeSearch,
7128
7277
  isItemsLoading: collectionDataLoading,
@@ -7140,6 +7289,7 @@ const WidgetForm = ({
7140
7289
  formatItem: formatListItem,
7141
7290
  listCode: selectedCollectionType === null || selectedCollectionType === void 0 ? void 0 : selectedCollectionType.value
7142
7291
  }), itemsEnabled && (selectedWidgetType === null || selectedWidgetType === void 0 ? void 0 : selectedWidgetType.value) !== 'Tabs' && /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(ItemsAccordian, {
7292
+ languages: languages,
7143
7293
  clearError: clearErrors,
7144
7294
  collapseId: constants.webItems,
7145
7295
  title: t('widget.webItems'),
@@ -7156,6 +7306,7 @@ const WidgetForm = ({
7156
7306
  addText: t('addButtonText'),
7157
7307
  deleteText: t('deleteButtonText')
7158
7308
  }), /*#__PURE__*/React.createElement(ItemsAccordian, {
7309
+ languages: languages,
7159
7310
  clearError: clearErrors,
7160
7311
  collapseId: constants.mobileItems,
7161
7312
  title: t('widget.mobileItems'),
@@ -7330,6 +7481,7 @@ const Widget = ({
7330
7481
  totalRecords,
7331
7482
  currentPage,
7332
7483
  pageSize,
7484
+ languages,
7333
7485
  setCurrentPage
7334
7486
  } = useWidget({
7335
7487
  canList: derivedPermissions.list,
@@ -7341,6 +7493,7 @@ const Widget = ({
7341
7493
  return /*#__PURE__*/React.createElement(WidgetContextProvider, {
7342
7494
  loading: loading,
7343
7495
  list: list,
7496
+ languages: languages,
7344
7497
  imageBaseUrl: imageBaseUrl,
7345
7498
  onChangeFormState: onChangeFormState,
7346
7499
  t: derivedT,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@knovator/pagecreator-admin",
3
- "version": "0.8.4",
3
+ "version": "0.9.0",
4
4
  "dependencies": {
5
5
  "classnames": "^2.3.1",
6
6
  "react-beautiful-dnd": "^13.1.0",
@@ -40,6 +40,10 @@ declare const apiList: {
40
40
  url: string;
41
41
  method: string;
42
42
  };
43
+ LANGUAGES: ({ prefix }: API_INPUT_TYPE) => {
44
+ url: string;
45
+ method: string;
46
+ };
43
47
  IMAGE_UPLOAD: ({ prefix }: API_INPUT_TYPE) => {
44
48
  url: string;
45
49
  method: string;
@@ -1,4 +1,4 @@
1
1
  /// <reference types="react" />
2
2
  import { ItemsAccordianProps } from '../../../types';
3
- declare const ItemsAccordian: ({ show, title, id, collapseId, toggleShow, loading, name, errors, control, register, setError, itemType, clearError, addText, deleteText, }: ItemsAccordianProps) => JSX.Element;
3
+ declare const ItemsAccordian: ({ show, title, id, collapseId, toggleShow, loading, name, errors, control, register, setError, itemType, languages, clearError, addText, deleteText, }: ItemsAccordianProps) => JSX.Element;
4
4
  export default ItemsAccordian;
@@ -1,4 +1,4 @@
1
1
  /// <reference types="react" />
2
2
  import { TabsProps } from '../../../../types';
3
- declare const Tabs: ({ errors, activeTab, setActiveTab, options, control, register, listCode, formatItem, deleteTitle, loadOptions, customStyles, noButtonText, yesButtonText, isItemsLoading, itemsPlaceholder, formatOptionLabel, tabCollectionItems, tabNameRequiredText, onCollectionItemsIndexChange, }: TabsProps) => JSX.Element;
3
+ declare const Tabs: ({ errors, activeTab, setActiveTab, options, control, listCode, setValue, getValues, languages, formatItem, deleteTitle, clearErrors, loadOptions, customStyles, noButtonText, yesButtonText, isItemsLoading, itemsPlaceholder, formatOptionLabel, tabCollectionItems, onCollectionItemsIndexChange, }: TabsProps) => JSX.Element;
4
4
  export default Tabs;
@@ -1,10 +1,11 @@
1
1
  import React, { MutableRefObject } from 'react';
2
- import { CombineObjectType, SchemaType } from '../../../types';
2
+ import { CombineObjectType, LanguageType, SchemaType } from '../../../types';
3
3
  interface SimpleFormProps {
4
4
  schema: SchemaType[];
5
5
  isUpdating?: boolean;
6
6
  onSubmit: (data: CombineObjectType) => void;
7
7
  enable?: boolean;
8
+ languages?: LanguageType[];
8
9
  ref: MutableRefObject<HTMLFormElement | null>;
9
10
  register: any;
10
11
  errors: any;
@@ -13,5 +14,5 @@ interface SimpleFormProps {
13
14
  control: any;
14
15
  setError: any;
15
16
  }
16
- declare const SimpleForm: React.ForwardRefExoticComponent<Pick<SimpleFormProps, "schema" | "onSubmit" | "isUpdating" | "enable" | "register" | "errors" | "handleSubmit" | "setValue" | "control" | "setError"> & React.RefAttributes<HTMLFormElement | null>>;
17
+ declare const SimpleForm: React.ForwardRefExoticComponent<Pick<SimpleFormProps, "schema" | "onSubmit" | "isUpdating" | "enable" | "register" | "errors" | "handleSubmit" | "setValue" | "control" | "setError" | "languages"> & React.RefAttributes<HTMLFormElement | null>>;
17
18
  export default SimpleForm;
@@ -2,6 +2,6 @@ import React from 'react';
2
2
  import { WidgetContextType } from '../types';
3
3
  interface WidgetContextProviderProps extends React.PropsWithChildren, Partial<WidgetContextType> {
4
4
  }
5
- declare const WidgetContextProvider: ({ t, list, imageBaseUrl, searchText, changeSearch, formState, closeForm, loading, onChangeFormState, onWidgetFormSubmit, updateData, canAdd, canUpdate, onDeleteItem, getWidgets, onImageUpload, onImageRemove, itemsTypes, widgetTypes, getCollectionData, collectionDataLoading, collectionData, formatListItem, formatOptionLabel, currentPage, limits, pageSize, setCurrentPage, setPageSize, totalPages, totalRecords, canList, canPartialUpdate, columns, data, canDelete, loader, onPartialUpdateWidget, reactSelectStyles, imageMaxSize, children, }: WidgetContextProviderProps) => JSX.Element;
5
+ declare const WidgetContextProvider: ({ t, list, languages, imageBaseUrl, searchText, changeSearch, formState, closeForm, loading, onChangeFormState, onWidgetFormSubmit, updateData, canAdd, canUpdate, onDeleteItem, getWidgets, onImageUpload, onImageRemove, itemsTypes, widgetTypes, getCollectionData, collectionDataLoading, collectionData, formatListItem, formatOptionLabel, currentPage, limits, pageSize, setCurrentPage, setPageSize, totalPages, totalRecords, canList, canPartialUpdate, columns, data, canDelete, loader, onPartialUpdateWidget, reactSelectStyles, imageMaxSize, children, }: WidgetContextProviderProps) => JSX.Element;
6
6
  export declare function useWidgetState(): WidgetContextType;
7
7
  export default WidgetContextProvider;
@@ -1,6 +1,6 @@
1
1
  /// <reference types="react" />
2
2
  import { Routes_Input, WidgetType, ItemsType } from '../types';
3
- import { FormActionTypes, ObjectType } from '../types/common';
3
+ import { FormActionTypes, ObjectType, LanguageType } from '../types/common';
4
4
  interface UseWidgetProps {
5
5
  canList?: boolean;
6
6
  defaultLimit: number;
@@ -10,10 +10,11 @@ interface UseWidgetProps {
10
10
  }) => Promise<boolean>;
11
11
  imageBaseUrl?: string;
12
12
  }
13
- declare const useWidget: ({ canList, defaultLimit, routes, preConfirmDelete, imageBaseUrl }: UseWidgetProps) => {
13
+ declare const useWidget: ({ canList, defaultLimit, routes, preConfirmDelete, imageBaseUrl, }: UseWidgetProps) => {
14
14
  list: ObjectType[];
15
15
  getWidgets: (search?: string) => Promise<void>;
16
16
  loading: boolean;
17
+ languages: LanguageType[];
17
18
  setLoading: import("react").Dispatch<import("react").SetStateAction<boolean>>;
18
19
  searchText: string;
19
20
  pageSize: number;
@@ -1,4 +1,4 @@
1
- export type ACTION_TYPES = 'IMAGE_UPLOAD' | 'IMAGE_REMOVE' | 'CREATE' | 'LIST' | 'DELETE' | 'UPDATE' | 'ITEM' | 'PARTIAL_UPDATE' | 'WIDGET_TYPES' | 'SELECTION_TYPES' | 'COLLECTION_DATA' | 'GET_ONE';
1
+ export type ACTION_TYPES = 'IMAGE_UPLOAD' | 'IMAGE_REMOVE' | 'CREATE' | 'LIST' | 'DELETE' | 'UPDATE' | 'ITEM' | 'PARTIAL_UPDATE' | 'WIDGET_TYPES' | 'SELECTION_TYPES' | 'COLLECTION_DATA' | 'GET_ONE' | 'LANGUAGES';
2
2
  export type API_TYPE = {
3
3
  url: string;
4
4
  method: string;
@@ -11,6 +11,10 @@ export interface PermissionsObj {
11
11
  partialUpdate: boolean;
12
12
  delete: boolean;
13
13
  }
14
+ export type LanguageType = {
15
+ name: string;
16
+ code: string;
17
+ };
14
18
  export type ObjectType = {
15
19
  [key: string]: string;
16
20
  };
@@ -1,8 +1,8 @@
1
1
  import React, { MutableRefObject } from 'react';
2
2
  import { DropResult } from 'react-beautiful-dnd';
3
- import { RegisterOptions } from 'react-hook-form';
3
+ import { FieldValues, RegisterOptions, UseFormClearErrors, UseFormGetValues, UseFormSetValue } from 'react-hook-form';
4
4
  import { Routes_Input } from './api';
5
- import { OptionType, FormActionTypes, PermissionsObj, ObjectType } from './common';
5
+ import { OptionType, FormActionTypes, PermissionsObj, ObjectType, LanguageType } from './common';
6
6
  export interface DNDItemsListProps {
7
7
  onDragEnd: (result: DropResult) => void;
8
8
  items: OptionType[];
@@ -227,6 +227,7 @@ export interface ItemsAccordianProps {
227
227
  addText?: string;
228
228
  deleteText?: string;
229
229
  loading?: boolean;
230
+ languages?: LanguageType[];
230
231
  name: string;
231
232
  itemType: 'Web' | 'Mobile';
232
233
  errors: any;
@@ -250,14 +251,12 @@ export interface TabsProps {
250
251
  setActiveTab: (value: number) => void;
251
252
  onSubmit?: () => void;
252
253
  control: any;
253
- register: any;
254
254
  options?: {
255
255
  value: string;
256
256
  label: string;
257
257
  }[];
258
258
  deleteTitle: string;
259
259
  listCode: string;
260
- tabNameRequiredText: string;
261
260
  noButtonText: string;
262
261
  yesButtonText: string;
263
262
  itemsPlaceholder?: string;
@@ -270,6 +269,10 @@ export interface TabsProps {
270
269
  [key: string]: any;
271
270
  };
272
271
  customStyles?: any;
272
+ clearErrors: UseFormClearErrors<FieldValues>;
273
+ getValues: UseFormGetValues<FieldValues>;
274
+ setValue: UseFormSetValue<FieldValues>;
275
+ languages?: LanguageType[];
273
276
  loadOptions?: (value?: string, callback?: (options: OptionType[]) => void) => Promise<OptionType[]>;
274
277
  }
275
278
  export interface ImageUploadProps {
@@ -1,6 +1,6 @@
1
1
  /// <reference types="react" />
2
2
  import { WidgetType, ItemsType } from './api';
3
- import { FormActionTypes, OptionType } from './common';
3
+ import { FormActionTypes, LanguageType, OptionType } from './common';
4
4
  export interface ProviderContextType {
5
5
  baseUrl: string;
6
6
  token: string | (() => Promise<string>);
@@ -23,6 +23,7 @@ export interface ProviderContextProviderProps extends React.PropsWithChildren, O
23
23
  export interface WidgetContextType {
24
24
  t: (key: string) => string;
25
25
  list: any[];
26
+ languages: LanguageType[];
26
27
  searchText?: string;
27
28
  changeSearch: (str: string) => void;
28
29
  formState: FormActionTypes | undefined;