@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 +179 -26
- package/index.css +1 -0
- package/index.js +179 -26
- package/package.json +1 -1
- package/src/lib/api/list.d.ts +4 -0
- package/src/lib/components/Widget/Form/ItemsAccordian.d.ts +1 -1
- package/src/lib/components/Widget/Form/Tabs/Tabs.d.ts +1 -1
- package/src/lib/components/common/Form/SimpleForm.d.ts +3 -2
- package/src/lib/context/WidgetContext.d.ts +1 -1
- package/src/lib/hooks/useWidget.d.ts +3 -2
- package/src/lib/types/api.d.ts +1 -1
- package/src/lib/types/common.d.ts +4 -0
- package/src/lib/types/components.d.ts +7 -4
- package/src/lib/types/context.d.ts +2 -1
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:
|
|
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",
|
|
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
|
-
|
|
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(
|
|
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:
|
|
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:
|
|
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
|
-
|
|
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
|
-
},
|
|
6672
|
-
|
|
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:
|
|
6682
|
-
|
|
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:
|
|
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
|
-
|
|
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
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:
|
|
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",
|
|
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
|
-
|
|
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(
|
|
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:
|
|
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:
|
|
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
|
-
|
|
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
|
-
},
|
|
6660
|
-
|
|
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:
|
|
6670
|
-
|
|
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:
|
|
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
|
-
|
|
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
package/src/lib/api/list.d.ts
CHANGED
|
@@ -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,
|
|
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;
|
package/src/lib/types/api.d.ts
CHANGED
|
@@ -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;
|
|
@@ -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;
|