@knovator/pagecreator-admin 0.8.5 → 0.9.1
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 +206 -25
- package/index.css +1 -0
- package/index.js +206 -25
- 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
|
|
@@ -3709,7 +3715,8 @@ const SimpleForm = /*#__PURE__*/React.forwardRef(({
|
|
|
3709
3715
|
handleSubmit,
|
|
3710
3716
|
setValue,
|
|
3711
3717
|
control,
|
|
3712
|
-
setError
|
|
3718
|
+
setError,
|
|
3719
|
+
languages
|
|
3713
3720
|
}, ref) => {
|
|
3714
3721
|
const inputRenderer = schema => {
|
|
3715
3722
|
var _a, _b, _c, _d, _e, _f;
|
|
@@ -3781,7 +3788,23 @@ const SimpleForm = /*#__PURE__*/React.forwardRef(({
|
|
|
3781
3788
|
case 'url':
|
|
3782
3789
|
case 'color':
|
|
3783
3790
|
default:
|
|
3784
|
-
|
|
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, {
|
|
3785
3808
|
rest: register(schema.accessor, schema.validations || {}),
|
|
3786
3809
|
label: schema.label,
|
|
3787
3810
|
error: (_f = (_e = errors[schema.accessor]) === null || _e === void 0 ? void 0 : _e.message) === null || _f === void 0 ? void 0 : _f.toString(),
|
|
@@ -3797,7 +3820,37 @@ const SimpleForm = /*#__PURE__*/React.forwardRef(({
|
|
|
3797
3820
|
break;
|
|
3798
3821
|
}
|
|
3799
3822
|
} else if (schema.Input) {
|
|
3800
|
-
|
|
3823
|
+
if (Array.isArray(languages) && languages.length > 0 && schema.accessor === 'widgetTitles') {
|
|
3824
|
+
input = languages.map(lang => /*#__PURE__*/React__default["default"].createElement("div", {
|
|
3825
|
+
key: lang.code,
|
|
3826
|
+
className: classNames__default["default"]('khb_input-wrapper', schema.wrapperClassName)
|
|
3827
|
+
}, /*#__PURE__*/React__default["default"].createElement("label", {
|
|
3828
|
+
className: "khb_input-label"
|
|
3829
|
+
}, schema.label, " (", lang.name, ")", schema.required ? /*#__PURE__*/React__default["default"].createElement("span", {
|
|
3830
|
+
className: "khb_input-label-required"
|
|
3831
|
+
}, "*") : null), /*#__PURE__*/React__default["default"].createElement(reactHookForm.Controller, {
|
|
3832
|
+
control: control,
|
|
3833
|
+
name: `${schema.accessor}.${lang.code}`,
|
|
3834
|
+
rules: schema.validations,
|
|
3835
|
+
render: ({
|
|
3836
|
+
field
|
|
3837
|
+
}) => {
|
|
3838
|
+
var _a, _b, _c;
|
|
3839
|
+
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
|
3840
|
+
return schema.Input({
|
|
3841
|
+
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
|
|
3842
|
+
// @ts-ignore
|
|
3843
|
+
field,
|
|
3844
|
+
error: (_c = (_b = (_a = errors[schema.accessor]) === null || _a === void 0 ? void 0 : _a[lang.code]) === null || _b === void 0 ? void 0 : _b.message) === null || _c === void 0 ? void 0 : _c.toString(),
|
|
3845
|
+
disabled: _isUpdating && typeof schema.editable !== 'undefined' && !schema.editable || !_enable,
|
|
3846
|
+
setError: msg => setError.call(null, schema.accessor, {
|
|
3847
|
+
type: 'custom',
|
|
3848
|
+
message: msg
|
|
3849
|
+
})
|
|
3850
|
+
});
|
|
3851
|
+
}
|
|
3852
|
+
})));
|
|
3853
|
+
} else input = /*#__PURE__*/React__default["default"].createElement("div", {
|
|
3801
3854
|
className: classNames__default["default"]('khb_input-wrapper', schema.wrapperClassName)
|
|
3802
3855
|
}, schema.label && /*#__PURE__*/React__default["default"].createElement("label", {
|
|
3803
3856
|
className: "khb_input-label"
|
|
@@ -4516,6 +4569,7 @@ const useWidget = ({
|
|
|
4516
4569
|
const [loading, setLoading] = React.useState(false);
|
|
4517
4570
|
const [totalPages, setTotalPages] = React.useState(0);
|
|
4518
4571
|
const [totalRecords, setTotalRecords] = React.useState(0);
|
|
4572
|
+
const [languages, setLanguages] = React.useState([]);
|
|
4519
4573
|
const [itemData, setItemData] = React.useState(null);
|
|
4520
4574
|
const [formState, setFormState] = React.useState();
|
|
4521
4575
|
const [itemsTypes, setItemsTypes] = React.useState([]);
|
|
@@ -4528,7 +4582,8 @@ const useWidget = ({
|
|
|
4528
4582
|
onError,
|
|
4529
4583
|
onSuccess,
|
|
4530
4584
|
onLogout,
|
|
4531
|
-
widgetRoutesPrefix
|
|
4585
|
+
widgetRoutesPrefix,
|
|
4586
|
+
pageRoutesPrefix
|
|
4532
4587
|
} = useProviderState();
|
|
4533
4588
|
const {
|
|
4534
4589
|
changeSearch,
|
|
@@ -4586,6 +4641,24 @@ const useWidget = ({
|
|
|
4586
4641
|
setLoading(false);
|
|
4587
4642
|
}
|
|
4588
4643
|
}), [baseUrl, currentPageRef, limitRef, offsetRef, handleError, routes, token, widgetRoutesPrefix]);
|
|
4644
|
+
const getLanguagesList = React.useCallback(() => __awaiter(void 0, void 0, void 0, function* () {
|
|
4645
|
+
const api = getApiType({
|
|
4646
|
+
routes,
|
|
4647
|
+
action: 'LANGUAGES',
|
|
4648
|
+
prefix: pageRoutesPrefix
|
|
4649
|
+
});
|
|
4650
|
+
const response = yield commonApi({
|
|
4651
|
+
baseUrl,
|
|
4652
|
+
token,
|
|
4653
|
+
method: api.method,
|
|
4654
|
+
url: api.url,
|
|
4655
|
+
onError: handleError(CALLBACK_CODES.GET_ALL)
|
|
4656
|
+
});
|
|
4657
|
+
if ((response === null || response === void 0 ? void 0 : response.code) === 'SUCCESS') {
|
|
4658
|
+
setLanguages(response.data);
|
|
4659
|
+
return response.data;
|
|
4660
|
+
}
|
|
4661
|
+
}), [baseUrl, handleError, pageRoutesPrefix, routes, token]);
|
|
4589
4662
|
const onCofirmDeleteWidget = () => __awaiter(void 0, void 0, void 0, function* () {
|
|
4590
4663
|
try {
|
|
4591
4664
|
let proceed = true;
|
|
@@ -4878,10 +4951,14 @@ const useWidget = ({
|
|
|
4878
4951
|
if (_canList) getWidgets();
|
|
4879
4952
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
4880
4953
|
}, [_canList]);
|
|
4954
|
+
React.useEffect(() => {
|
|
4955
|
+
getLanguagesList();
|
|
4956
|
+
}, [getLanguagesList]);
|
|
4881
4957
|
return {
|
|
4882
4958
|
list,
|
|
4883
4959
|
getWidgets,
|
|
4884
4960
|
loading,
|
|
4961
|
+
languages,
|
|
4885
4962
|
setLoading,
|
|
4886
4963
|
// Pagination
|
|
4887
4964
|
searchText: searchRef.current,
|
|
@@ -5986,6 +6063,7 @@ const WidgetContextProvider = ({
|
|
|
5986
6063
|
t: _t = () => '',
|
|
5987
6064
|
// Form
|
|
5988
6065
|
list: _list = [],
|
|
6066
|
+
languages: _languages = [],
|
|
5989
6067
|
imageBaseUrl: _imageBaseUrl = '',
|
|
5990
6068
|
searchText: _searchText = '',
|
|
5991
6069
|
changeSearch: _changeSearch = () => {},
|
|
@@ -6034,6 +6112,7 @@ const WidgetContextProvider = ({
|
|
|
6034
6112
|
t: _t,
|
|
6035
6113
|
// Form
|
|
6036
6114
|
list: _list,
|
|
6115
|
+
languages: _languages,
|
|
6037
6116
|
imageBaseUrl: _imageBaseUrl,
|
|
6038
6117
|
closeForm: _closeForm,
|
|
6039
6118
|
formState: _formState,
|
|
@@ -6434,6 +6513,7 @@ const ItemsAccordian = ({
|
|
|
6434
6513
|
register,
|
|
6435
6514
|
setError,
|
|
6436
6515
|
itemType,
|
|
6516
|
+
languages,
|
|
6437
6517
|
clearError,
|
|
6438
6518
|
addText: _addText = 'Add',
|
|
6439
6519
|
deleteText: _deleteText = 'Delete'
|
|
@@ -6475,8 +6555,6 @@ const ItemsAccordian = ({
|
|
|
6475
6555
|
}, [errors, name, errors === null || errors === void 0 ? void 0 : errors[name]]);
|
|
6476
6556
|
const addTab = index => {
|
|
6477
6557
|
appendItem({
|
|
6478
|
-
title: '',
|
|
6479
|
-
subtitle: '',
|
|
6480
6558
|
altText: '',
|
|
6481
6559
|
link: '',
|
|
6482
6560
|
img: '',
|
|
@@ -6519,20 +6597,39 @@ const ItemsAccordian = ({
|
|
|
6519
6597
|
}, _deleteText))
|
|
6520
6598
|
}, /*#__PURE__*/React__default["default"].createElement("div", {
|
|
6521
6599
|
className: "khb-form-items"
|
|
6522
|
-
}, /*#__PURE__*/React__default["default"].createElement(
|
|
6600
|
+
}, Array.isArray(languages) && languages.length > 0 ? /*#__PURE__*/React__default["default"].createElement(React__default["default"].Fragment, null, languages.map(lang => {
|
|
6601
|
+
var _a, _b, _c, _d, _e;
|
|
6602
|
+
return /*#__PURE__*/React__default["default"].createElement(Input, {
|
|
6603
|
+
rest: register(`${name}.${index}.titles.${lang.code}`, {
|
|
6604
|
+
required: t('item.titleRequired')
|
|
6605
|
+
}),
|
|
6606
|
+
label: t('item.title') + ` (${lang.name})`,
|
|
6607
|
+
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(),
|
|
6608
|
+
type: "text",
|
|
6609
|
+
className: "w-full p-2",
|
|
6610
|
+
placeholder: t('item.titlePlaceholder'),
|
|
6611
|
+
required: true
|
|
6612
|
+
});
|
|
6613
|
+
})) : /*#__PURE__*/React__default["default"].createElement(Input, {
|
|
6523
6614
|
rest: register(`${name}.${index}.title`, {
|
|
6524
6615
|
required: t('item.titleRequired')
|
|
6525
6616
|
}),
|
|
6526
6617
|
label: t('item.title'),
|
|
6527
6618
|
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(),
|
|
6528
|
-
type:
|
|
6619
|
+
type: "text",
|
|
6529
6620
|
className: "w-full p-2",
|
|
6530
6621
|
placeholder: t('item.titlePlaceholder'),
|
|
6531
6622
|
required: true
|
|
6532
|
-
}), /*#__PURE__*/React__default["default"].createElement(Input, {
|
|
6623
|
+
}), 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, {
|
|
6624
|
+
rest: register(`${name}.${index}.subtitles.${lang.code}`),
|
|
6625
|
+
label: t('item.subtitle') + ` (${lang.name})`,
|
|
6626
|
+
type: "text",
|
|
6627
|
+
className: "w-full p-2",
|
|
6628
|
+
placeholder: t('item.subTitlePlaceholder')
|
|
6629
|
+
}))) : /*#__PURE__*/React__default["default"].createElement(Input, {
|
|
6533
6630
|
rest: register(`${name}.${index}.subtitle`),
|
|
6534
6631
|
label: t('item.subtitle'),
|
|
6535
|
-
type:
|
|
6632
|
+
type: "text",
|
|
6536
6633
|
className: "w-full p-2",
|
|
6537
6634
|
placeholder: t('item.subTitlePlaceholder')
|
|
6538
6635
|
}), /*#__PURE__*/React__default["default"].createElement(Input, {
|
|
@@ -6632,10 +6729,13 @@ const Tabs = ({
|
|
|
6632
6729
|
setActiveTab,
|
|
6633
6730
|
options,
|
|
6634
6731
|
control,
|
|
6635
|
-
register,
|
|
6636
6732
|
listCode,
|
|
6733
|
+
setValue,
|
|
6734
|
+
getValues,
|
|
6735
|
+
languages,
|
|
6637
6736
|
formatItem,
|
|
6638
6737
|
deleteTitle,
|
|
6738
|
+
clearErrors,
|
|
6639
6739
|
loadOptions,
|
|
6640
6740
|
customStyles,
|
|
6641
6741
|
noButtonText,
|
|
@@ -6644,9 +6744,10 @@ const Tabs = ({
|
|
|
6644
6744
|
itemsPlaceholder,
|
|
6645
6745
|
formatOptionLabel,
|
|
6646
6746
|
tabCollectionItems,
|
|
6647
|
-
tabNameRequiredText,
|
|
6648
6747
|
onCollectionItemsIndexChange
|
|
6649
6748
|
}) => {
|
|
6749
|
+
var _a;
|
|
6750
|
+
const [selectedLanguage, setSelectedLanguage] = React.useState((_a = languages === null || languages === void 0 ? void 0 : languages[0]) === null || _a === void 0 ? void 0 : _a.code);
|
|
6650
6751
|
const {
|
|
6651
6752
|
fields: tabFields,
|
|
6652
6753
|
append: appendField,
|
|
@@ -6656,12 +6757,27 @@ const Tabs = ({
|
|
|
6656
6757
|
control
|
|
6657
6758
|
});
|
|
6658
6759
|
const addTab = () => {
|
|
6659
|
-
appendField({
|
|
6660
|
-
|
|
6760
|
+
appendField(Object.assign(Object.assign({}, selectedLanguage ? {
|
|
6761
|
+
names: languages === null || languages === void 0 ? void 0 : languages.reduce((acc, lng) => {
|
|
6762
|
+
acc[lng.code] = '';
|
|
6763
|
+
return acc;
|
|
6764
|
+
}, {})
|
|
6765
|
+
} : {
|
|
6766
|
+
name: ''
|
|
6767
|
+
}), {
|
|
6661
6768
|
collectionItems: []
|
|
6662
|
-
});
|
|
6769
|
+
}));
|
|
6663
6770
|
setActiveTab(tabFields.length);
|
|
6664
6771
|
};
|
|
6772
|
+
const onTabnameChange = (index, value) => {
|
|
6773
|
+
if (selectedLanguage) {
|
|
6774
|
+
clearErrors(`tabs.${index}.names.${selectedLanguage}`);
|
|
6775
|
+
setValue(`tabs.${index}.names.${selectedLanguage}`, value);
|
|
6776
|
+
} else {
|
|
6777
|
+
clearErrors(`tabs.${index}.name`);
|
|
6778
|
+
setValue(`tabs.${index}.name`, value);
|
|
6779
|
+
}
|
|
6780
|
+
};
|
|
6665
6781
|
return /*#__PURE__*/React__default["default"].createElement("div", {
|
|
6666
6782
|
className: "khb_tabs-container"
|
|
6667
6783
|
}, /*#__PURE__*/React__default["default"].createElement(reactTabs.Tabs, {
|
|
@@ -6670,8 +6786,18 @@ const Tabs = ({
|
|
|
6670
6786
|
className: "khb-tabs"
|
|
6671
6787
|
}, /*#__PURE__*/React__default["default"].createElement(reactTabs.TabList, {
|
|
6672
6788
|
className: "khb_tabs-list"
|
|
6673
|
-
},
|
|
6674
|
-
|
|
6789
|
+
}, Array.isArray(languages) && languages.length > 0 && /*#__PURE__*/React__default["default"].createElement("div", {
|
|
6790
|
+
className: "khb_input-wrapper"
|
|
6791
|
+
}, /*#__PURE__*/React__default["default"].createElement("select", {
|
|
6792
|
+
title: "Change Language",
|
|
6793
|
+
value: selectedLanguage,
|
|
6794
|
+
className: "khb_input khb_input-sm h-full",
|
|
6795
|
+
onChange: e => setSelectedLanguage(e.target.value)
|
|
6796
|
+
}, languages.map(lng => /*#__PURE__*/React__default["default"].createElement("option", {
|
|
6797
|
+
value: lng.code,
|
|
6798
|
+
key: lng.code
|
|
6799
|
+
}, lng.name)))), tabFields === null || tabFields === void 0 ? void 0 : tabFields.map((field, index) => {
|
|
6800
|
+
var _a, _b, _c, _d, _e, _f, _g;
|
|
6675
6801
|
return /*#__PURE__*/React__default["default"].createElement(reactTabs.Tab, {
|
|
6676
6802
|
key: field.id,
|
|
6677
6803
|
className: classNames__default["default"]('khb_tabs-item', {
|
|
@@ -6680,14 +6806,18 @@ const Tabs = ({
|
|
|
6680
6806
|
}, /*#__PURE__*/React__default["default"].createElement(TabItem, {
|
|
6681
6807
|
key: field.id,
|
|
6682
6808
|
deleteTitle: deleteTitle,
|
|
6683
|
-
register:
|
|
6684
|
-
|
|
6685
|
-
|
|
6809
|
+
register: {
|
|
6810
|
+
value: getValues(`tabs.${index}.names.${selectedLanguage}`),
|
|
6811
|
+
onChange: e => onTabnameChange(index, e.target.value || '')
|
|
6812
|
+
},
|
|
6686
6813
|
onRemoveTab: () => {
|
|
6687
6814
|
removeField(index);
|
|
6688
6815
|
setActiveTab(index === 0 ? 0 : index - 1);
|
|
6689
6816
|
},
|
|
6690
|
-
error:
|
|
6817
|
+
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 => {
|
|
6818
|
+
var _a, _b, _c, _d;
|
|
6819
|
+
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;
|
|
6820
|
+
}).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,
|
|
6691
6821
|
noButtonText: noButtonText,
|
|
6692
6822
|
yesButtonText: yesButtonText,
|
|
6693
6823
|
showDelete: (tabFields === null || tabFields === void 0 ? void 0 : tabFields.length) > 1
|
|
@@ -6780,6 +6910,7 @@ const WidgetForm = ({
|
|
|
6780
6910
|
itemsTypes,
|
|
6781
6911
|
widgetTypes,
|
|
6782
6912
|
loading,
|
|
6913
|
+
languages,
|
|
6783
6914
|
onWidgetFormSubmit,
|
|
6784
6915
|
getCollectionData,
|
|
6785
6916
|
collectionData,
|
|
@@ -6914,6 +7045,32 @@ const WidgetForm = ({
|
|
|
6914
7045
|
setTabCollectionItems(value[constants.tabsAccessor].map(tabItem => tabItem[constants.tabCollectionItemsAccessor]));
|
|
6915
7046
|
}
|
|
6916
7047
|
}, [getFirstItemTypeValue, itemsTypes, widgetTypes]);
|
|
7048
|
+
const validateTabs = tabsData => {
|
|
7049
|
+
const isLanguagesProvided = Array.isArray(languages) && languages.length > 0;
|
|
7050
|
+
let isTabsValid = true;
|
|
7051
|
+
if (Array.isArray(tabsData) && tabsData.length > 0) {
|
|
7052
|
+
tabsData.forEach((tabItem, index) => {
|
|
7053
|
+
if (isLanguagesProvided) {
|
|
7054
|
+
languages.forEach(lang => {
|
|
7055
|
+
if (!tabItem.names[lang.code]) {
|
|
7056
|
+
setError(`tabs.${index}.names.${lang.code}`, {
|
|
7057
|
+
type: 'manual',
|
|
7058
|
+
message: `${t('widget.tabNameRequired')} (${lang.name})`
|
|
7059
|
+
});
|
|
7060
|
+
isTabsValid = false;
|
|
7061
|
+
}
|
|
7062
|
+
});
|
|
7063
|
+
} else if (!tabItem.name) {
|
|
7064
|
+
setError(`tabs.${index}.name`, {
|
|
7065
|
+
type: 'manual',
|
|
7066
|
+
message: t('widget.tabNameRequired')
|
|
7067
|
+
});
|
|
7068
|
+
isTabsValid = false;
|
|
7069
|
+
}
|
|
7070
|
+
});
|
|
7071
|
+
}
|
|
7072
|
+
return isTabsValid;
|
|
7073
|
+
};
|
|
6917
7074
|
const onFormSubmit = data => {
|
|
6918
7075
|
var _a, _b;
|
|
6919
7076
|
const formData = Object.assign({}, data);
|
|
@@ -6923,9 +7080,14 @@ const WidgetForm = ({
|
|
|
6923
7080
|
}
|
|
6924
7081
|
// setting tabs data if widgetType tab is selected
|
|
6925
7082
|
const tabsData = getValues('tabs');
|
|
7083
|
+
if (Array.isArray(tabsData) && tabsData.length > 0) {
|
|
7084
|
+
const isTabsValid = validateTabs(tabsData);
|
|
7085
|
+
if (!isTabsValid) return;
|
|
7086
|
+
}
|
|
6926
7087
|
if (Array.isArray(tabsData) && (formData[constants.widgetTypeAccessor] === constants.tabsWidgetTypeValue || formState === 'UPDATE')) {
|
|
6927
7088
|
formData[constants.tabsAccessor] = tabsData.map(tabItem => ({
|
|
6928
7089
|
name: tabItem.name,
|
|
7090
|
+
names: tabItem.names,
|
|
6929
7091
|
collectionItems: tabItem.collectionItems.map(item => typeof item == 'string' ? item : item.value)
|
|
6930
7092
|
}));
|
|
6931
7093
|
} else formData[constants.tabsAccessor] = [];
|
|
@@ -7012,7 +7174,19 @@ const WidgetForm = ({
|
|
|
7012
7174
|
required: t('widget.codeRequired')
|
|
7013
7175
|
},
|
|
7014
7176
|
wrapperClassName: 'khb_grid-item-1of2 khb_padding-left-1 khb_align-top khb_margin-top-0'
|
|
7015
|
-
}, {
|
|
7177
|
+
}, Array.isArray(languages) && languages.length > 0 ? {
|
|
7178
|
+
label: `${t('widget.widgetTitle')}`,
|
|
7179
|
+
accessor: 'widgetTitles',
|
|
7180
|
+
required: true,
|
|
7181
|
+
type: customInputs && customInputs['widgetTitle'] ? undefined : 'text',
|
|
7182
|
+
validations: {
|
|
7183
|
+
required: t('widget.widgetTitleRequired')
|
|
7184
|
+
},
|
|
7185
|
+
info: t('widget.widgetTitleInfo'),
|
|
7186
|
+
placeholder: t('widget.widgetTitlePlaceholder'),
|
|
7187
|
+
onInput: handleCapitalize,
|
|
7188
|
+
Input: customInputs && customInputs['widgetTitle'] ? customInputs['widgetTitle'] : undefined
|
|
7189
|
+
} : {
|
|
7016
7190
|
label: `${t('widget.widgetTitle')}`,
|
|
7017
7191
|
accessor: 'widgetTitle',
|
|
7018
7192
|
required: true,
|
|
@@ -7128,15 +7302,18 @@ const WidgetForm = ({
|
|
|
7128
7302
|
handleSubmit: handleSubmit,
|
|
7129
7303
|
setValue: setValue,
|
|
7130
7304
|
control: control,
|
|
7131
|
-
setError: setError
|
|
7305
|
+
setError: setError,
|
|
7306
|
+
languages: languages
|
|
7132
7307
|
}), (selectedWidgetType === null || selectedWidgetType === void 0 ? void 0 : selectedWidgetType.value) === 'Tabs' ? /*#__PURE__*/React__default["default"].createElement(Tabs, {
|
|
7308
|
+
clearErrors: clearErrors,
|
|
7309
|
+
getValues: getValues,
|
|
7310
|
+
setValue: setValue,
|
|
7133
7311
|
control: control,
|
|
7134
|
-
|
|
7312
|
+
languages: languages,
|
|
7135
7313
|
deleteTitle: t('widget.tabDeleteTitle'),
|
|
7136
7314
|
yesButtonText: t('yesButtonText'),
|
|
7137
7315
|
noButtonText: t('cancelButtonText'),
|
|
7138
7316
|
errors: errors,
|
|
7139
|
-
tabNameRequiredText: t('widget.tabNameRequired'),
|
|
7140
7317
|
itemsPlaceholder: `Select ${selectedCollectionType === null || selectedCollectionType === void 0 ? void 0 : selectedCollectionType.label}...`,
|
|
7141
7318
|
loadOptions: onChangeSearch,
|
|
7142
7319
|
isItemsLoading: collectionDataLoading,
|
|
@@ -7154,6 +7331,7 @@ const WidgetForm = ({
|
|
|
7154
7331
|
formatItem: formatListItem,
|
|
7155
7332
|
listCode: selectedCollectionType === null || selectedCollectionType === void 0 ? void 0 : selectedCollectionType.value
|
|
7156
7333
|
}), 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, {
|
|
7334
|
+
languages: languages,
|
|
7157
7335
|
clearError: clearErrors,
|
|
7158
7336
|
collapseId: constants.webItems,
|
|
7159
7337
|
title: t('widget.webItems'),
|
|
@@ -7170,6 +7348,7 @@ const WidgetForm = ({
|
|
|
7170
7348
|
addText: t('addButtonText'),
|
|
7171
7349
|
deleteText: t('deleteButtonText')
|
|
7172
7350
|
}), /*#__PURE__*/React__default["default"].createElement(ItemsAccordian, {
|
|
7351
|
+
languages: languages,
|
|
7173
7352
|
clearError: clearErrors,
|
|
7174
7353
|
collapseId: constants.mobileItems,
|
|
7175
7354
|
title: t('widget.mobileItems'),
|
|
@@ -7344,6 +7523,7 @@ const Widget = ({
|
|
|
7344
7523
|
totalRecords,
|
|
7345
7524
|
currentPage,
|
|
7346
7525
|
pageSize,
|
|
7526
|
+
languages,
|
|
7347
7527
|
setCurrentPage
|
|
7348
7528
|
} = useWidget({
|
|
7349
7529
|
canList: derivedPermissions.list,
|
|
@@ -7355,6 +7535,7 @@ const Widget = ({
|
|
|
7355
7535
|
return /*#__PURE__*/React__default["default"].createElement(WidgetContextProvider, {
|
|
7356
7536
|
loading: loading,
|
|
7357
7537
|
list: list,
|
|
7538
|
+
languages: languages,
|
|
7358
7539
|
imageBaseUrl: imageBaseUrl,
|
|
7359
7540
|
onChangeFormState: onChangeFormState,
|
|
7360
7541
|
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
|
|
@@ -3697,7 +3703,8 @@ const SimpleForm = /*#__PURE__*/forwardRef(({
|
|
|
3697
3703
|
handleSubmit,
|
|
3698
3704
|
setValue,
|
|
3699
3705
|
control,
|
|
3700
|
-
setError
|
|
3706
|
+
setError,
|
|
3707
|
+
languages
|
|
3701
3708
|
}, ref) => {
|
|
3702
3709
|
const inputRenderer = schema => {
|
|
3703
3710
|
var _a, _b, _c, _d, _e, _f;
|
|
@@ -3769,7 +3776,23 @@ const SimpleForm = /*#__PURE__*/forwardRef(({
|
|
|
3769
3776
|
case 'url':
|
|
3770
3777
|
case 'color':
|
|
3771
3778
|
default:
|
|
3772
|
-
|
|
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, {
|
|
3773
3796
|
rest: register(schema.accessor, schema.validations || {}),
|
|
3774
3797
|
label: schema.label,
|
|
3775
3798
|
error: (_f = (_e = errors[schema.accessor]) === null || _e === void 0 ? void 0 : _e.message) === null || _f === void 0 ? void 0 : _f.toString(),
|
|
@@ -3785,7 +3808,37 @@ const SimpleForm = /*#__PURE__*/forwardRef(({
|
|
|
3785
3808
|
break;
|
|
3786
3809
|
}
|
|
3787
3810
|
} else if (schema.Input) {
|
|
3788
|
-
|
|
3811
|
+
if (Array.isArray(languages) && languages.length > 0 && schema.accessor === 'widgetTitles') {
|
|
3812
|
+
input = languages.map(lang => /*#__PURE__*/React.createElement("div", {
|
|
3813
|
+
key: lang.code,
|
|
3814
|
+
className: classNames('khb_input-wrapper', schema.wrapperClassName)
|
|
3815
|
+
}, /*#__PURE__*/React.createElement("label", {
|
|
3816
|
+
className: "khb_input-label"
|
|
3817
|
+
}, schema.label, " (", lang.name, ")", schema.required ? /*#__PURE__*/React.createElement("span", {
|
|
3818
|
+
className: "khb_input-label-required"
|
|
3819
|
+
}, "*") : null), /*#__PURE__*/React.createElement(Controller, {
|
|
3820
|
+
control: control,
|
|
3821
|
+
name: `${schema.accessor}.${lang.code}`,
|
|
3822
|
+
rules: schema.validations,
|
|
3823
|
+
render: ({
|
|
3824
|
+
field
|
|
3825
|
+
}) => {
|
|
3826
|
+
var _a, _b, _c;
|
|
3827
|
+
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
|
3828
|
+
return schema.Input({
|
|
3829
|
+
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
|
|
3830
|
+
// @ts-ignore
|
|
3831
|
+
field,
|
|
3832
|
+
error: (_c = (_b = (_a = errors[schema.accessor]) === null || _a === void 0 ? void 0 : _a[lang.code]) === null || _b === void 0 ? void 0 : _b.message) === null || _c === void 0 ? void 0 : _c.toString(),
|
|
3833
|
+
disabled: _isUpdating && typeof schema.editable !== 'undefined' && !schema.editable || !_enable,
|
|
3834
|
+
setError: msg => setError.call(null, schema.accessor, {
|
|
3835
|
+
type: 'custom',
|
|
3836
|
+
message: msg
|
|
3837
|
+
})
|
|
3838
|
+
});
|
|
3839
|
+
}
|
|
3840
|
+
})));
|
|
3841
|
+
} else input = /*#__PURE__*/React.createElement("div", {
|
|
3789
3842
|
className: classNames('khb_input-wrapper', schema.wrapperClassName)
|
|
3790
3843
|
}, schema.label && /*#__PURE__*/React.createElement("label", {
|
|
3791
3844
|
className: "khb_input-label"
|
|
@@ -4504,6 +4557,7 @@ const useWidget = ({
|
|
|
4504
4557
|
const [loading, setLoading] = useState(false);
|
|
4505
4558
|
const [totalPages, setTotalPages] = useState(0);
|
|
4506
4559
|
const [totalRecords, setTotalRecords] = useState(0);
|
|
4560
|
+
const [languages, setLanguages] = useState([]);
|
|
4507
4561
|
const [itemData, setItemData] = useState(null);
|
|
4508
4562
|
const [formState, setFormState] = useState();
|
|
4509
4563
|
const [itemsTypes, setItemsTypes] = useState([]);
|
|
@@ -4516,7 +4570,8 @@ const useWidget = ({
|
|
|
4516
4570
|
onError,
|
|
4517
4571
|
onSuccess,
|
|
4518
4572
|
onLogout,
|
|
4519
|
-
widgetRoutesPrefix
|
|
4573
|
+
widgetRoutesPrefix,
|
|
4574
|
+
pageRoutesPrefix
|
|
4520
4575
|
} = useProviderState();
|
|
4521
4576
|
const {
|
|
4522
4577
|
changeSearch,
|
|
@@ -4574,6 +4629,24 @@ const useWidget = ({
|
|
|
4574
4629
|
setLoading(false);
|
|
4575
4630
|
}
|
|
4576
4631
|
}), [baseUrl, currentPageRef, limitRef, offsetRef, handleError, routes, token, widgetRoutesPrefix]);
|
|
4632
|
+
const getLanguagesList = useCallback(() => __awaiter(void 0, void 0, void 0, function* () {
|
|
4633
|
+
const api = getApiType({
|
|
4634
|
+
routes,
|
|
4635
|
+
action: 'LANGUAGES',
|
|
4636
|
+
prefix: pageRoutesPrefix
|
|
4637
|
+
});
|
|
4638
|
+
const response = yield commonApi({
|
|
4639
|
+
baseUrl,
|
|
4640
|
+
token,
|
|
4641
|
+
method: api.method,
|
|
4642
|
+
url: api.url,
|
|
4643
|
+
onError: handleError(CALLBACK_CODES.GET_ALL)
|
|
4644
|
+
});
|
|
4645
|
+
if ((response === null || response === void 0 ? void 0 : response.code) === 'SUCCESS') {
|
|
4646
|
+
setLanguages(response.data);
|
|
4647
|
+
return response.data;
|
|
4648
|
+
}
|
|
4649
|
+
}), [baseUrl, handleError, pageRoutesPrefix, routes, token]);
|
|
4577
4650
|
const onCofirmDeleteWidget = () => __awaiter(void 0, void 0, void 0, function* () {
|
|
4578
4651
|
try {
|
|
4579
4652
|
let proceed = true;
|
|
@@ -4866,10 +4939,14 @@ const useWidget = ({
|
|
|
4866
4939
|
if (_canList) getWidgets();
|
|
4867
4940
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
4868
4941
|
}, [_canList]);
|
|
4942
|
+
useEffect(() => {
|
|
4943
|
+
getLanguagesList();
|
|
4944
|
+
}, [getLanguagesList]);
|
|
4869
4945
|
return {
|
|
4870
4946
|
list,
|
|
4871
4947
|
getWidgets,
|
|
4872
4948
|
loading,
|
|
4949
|
+
languages,
|
|
4873
4950
|
setLoading,
|
|
4874
4951
|
// Pagination
|
|
4875
4952
|
searchText: searchRef.current,
|
|
@@ -5974,6 +6051,7 @@ const WidgetContextProvider = ({
|
|
|
5974
6051
|
t: _t = () => '',
|
|
5975
6052
|
// Form
|
|
5976
6053
|
list: _list = [],
|
|
6054
|
+
languages: _languages = [],
|
|
5977
6055
|
imageBaseUrl: _imageBaseUrl = '',
|
|
5978
6056
|
searchText: _searchText = '',
|
|
5979
6057
|
changeSearch: _changeSearch = () => {},
|
|
@@ -6022,6 +6100,7 @@ const WidgetContextProvider = ({
|
|
|
6022
6100
|
t: _t,
|
|
6023
6101
|
// Form
|
|
6024
6102
|
list: _list,
|
|
6103
|
+
languages: _languages,
|
|
6025
6104
|
imageBaseUrl: _imageBaseUrl,
|
|
6026
6105
|
closeForm: _closeForm,
|
|
6027
6106
|
formState: _formState,
|
|
@@ -6422,6 +6501,7 @@ const ItemsAccordian = ({
|
|
|
6422
6501
|
register,
|
|
6423
6502
|
setError,
|
|
6424
6503
|
itemType,
|
|
6504
|
+
languages,
|
|
6425
6505
|
clearError,
|
|
6426
6506
|
addText: _addText = 'Add',
|
|
6427
6507
|
deleteText: _deleteText = 'Delete'
|
|
@@ -6463,8 +6543,6 @@ const ItemsAccordian = ({
|
|
|
6463
6543
|
}, [errors, name, errors === null || errors === void 0 ? void 0 : errors[name]]);
|
|
6464
6544
|
const addTab = index => {
|
|
6465
6545
|
appendItem({
|
|
6466
|
-
title: '',
|
|
6467
|
-
subtitle: '',
|
|
6468
6546
|
altText: '',
|
|
6469
6547
|
link: '',
|
|
6470
6548
|
img: '',
|
|
@@ -6507,20 +6585,39 @@ const ItemsAccordian = ({
|
|
|
6507
6585
|
}, _deleteText))
|
|
6508
6586
|
}, /*#__PURE__*/React.createElement("div", {
|
|
6509
6587
|
className: "khb-form-items"
|
|
6510
|
-
}, /*#__PURE__*/React.createElement(
|
|
6588
|
+
}, Array.isArray(languages) && languages.length > 0 ? /*#__PURE__*/React.createElement(React.Fragment, null, languages.map(lang => {
|
|
6589
|
+
var _a, _b, _c, _d, _e;
|
|
6590
|
+
return /*#__PURE__*/React.createElement(Input, {
|
|
6591
|
+
rest: register(`${name}.${index}.titles.${lang.code}`, {
|
|
6592
|
+
required: t('item.titleRequired')
|
|
6593
|
+
}),
|
|
6594
|
+
label: t('item.title') + ` (${lang.name})`,
|
|
6595
|
+
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(),
|
|
6596
|
+
type: "text",
|
|
6597
|
+
className: "w-full p-2",
|
|
6598
|
+
placeholder: t('item.titlePlaceholder'),
|
|
6599
|
+
required: true
|
|
6600
|
+
});
|
|
6601
|
+
})) : /*#__PURE__*/React.createElement(Input, {
|
|
6511
6602
|
rest: register(`${name}.${index}.title`, {
|
|
6512
6603
|
required: t('item.titleRequired')
|
|
6513
6604
|
}),
|
|
6514
6605
|
label: t('item.title'),
|
|
6515
6606
|
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(),
|
|
6516
|
-
type:
|
|
6607
|
+
type: "text",
|
|
6517
6608
|
className: "w-full p-2",
|
|
6518
6609
|
placeholder: t('item.titlePlaceholder'),
|
|
6519
6610
|
required: true
|
|
6520
|
-
}), /*#__PURE__*/React.createElement(Input, {
|
|
6611
|
+
}), Array.isArray(languages) && languages.length > 0 ? /*#__PURE__*/React.createElement(React.Fragment, null, languages.map(lang => /*#__PURE__*/React.createElement(Input, {
|
|
6612
|
+
rest: register(`${name}.${index}.subtitles.${lang.code}`),
|
|
6613
|
+
label: t('item.subtitle') + ` (${lang.name})`,
|
|
6614
|
+
type: "text",
|
|
6615
|
+
className: "w-full p-2",
|
|
6616
|
+
placeholder: t('item.subTitlePlaceholder')
|
|
6617
|
+
}))) : /*#__PURE__*/React.createElement(Input, {
|
|
6521
6618
|
rest: register(`${name}.${index}.subtitle`),
|
|
6522
6619
|
label: t('item.subtitle'),
|
|
6523
|
-
type:
|
|
6620
|
+
type: "text",
|
|
6524
6621
|
className: "w-full p-2",
|
|
6525
6622
|
placeholder: t('item.subTitlePlaceholder')
|
|
6526
6623
|
}), /*#__PURE__*/React.createElement(Input, {
|
|
@@ -6620,10 +6717,13 @@ const Tabs = ({
|
|
|
6620
6717
|
setActiveTab,
|
|
6621
6718
|
options,
|
|
6622
6719
|
control,
|
|
6623
|
-
register,
|
|
6624
6720
|
listCode,
|
|
6721
|
+
setValue,
|
|
6722
|
+
getValues,
|
|
6723
|
+
languages,
|
|
6625
6724
|
formatItem,
|
|
6626
6725
|
deleteTitle,
|
|
6726
|
+
clearErrors,
|
|
6627
6727
|
loadOptions,
|
|
6628
6728
|
customStyles,
|
|
6629
6729
|
noButtonText,
|
|
@@ -6632,9 +6732,10 @@ const Tabs = ({
|
|
|
6632
6732
|
itemsPlaceholder,
|
|
6633
6733
|
formatOptionLabel,
|
|
6634
6734
|
tabCollectionItems,
|
|
6635
|
-
tabNameRequiredText,
|
|
6636
6735
|
onCollectionItemsIndexChange
|
|
6637
6736
|
}) => {
|
|
6737
|
+
var _a;
|
|
6738
|
+
const [selectedLanguage, setSelectedLanguage] = useState((_a = languages === null || languages === void 0 ? void 0 : languages[0]) === null || _a === void 0 ? void 0 : _a.code);
|
|
6638
6739
|
const {
|
|
6639
6740
|
fields: tabFields,
|
|
6640
6741
|
append: appendField,
|
|
@@ -6644,12 +6745,27 @@ const Tabs = ({
|
|
|
6644
6745
|
control
|
|
6645
6746
|
});
|
|
6646
6747
|
const addTab = () => {
|
|
6647
|
-
appendField({
|
|
6648
|
-
|
|
6748
|
+
appendField(Object.assign(Object.assign({}, selectedLanguage ? {
|
|
6749
|
+
names: languages === null || languages === void 0 ? void 0 : languages.reduce((acc, lng) => {
|
|
6750
|
+
acc[lng.code] = '';
|
|
6751
|
+
return acc;
|
|
6752
|
+
}, {})
|
|
6753
|
+
} : {
|
|
6754
|
+
name: ''
|
|
6755
|
+
}), {
|
|
6649
6756
|
collectionItems: []
|
|
6650
|
-
});
|
|
6757
|
+
}));
|
|
6651
6758
|
setActiveTab(tabFields.length);
|
|
6652
6759
|
};
|
|
6760
|
+
const onTabnameChange = (index, value) => {
|
|
6761
|
+
if (selectedLanguage) {
|
|
6762
|
+
clearErrors(`tabs.${index}.names.${selectedLanguage}`);
|
|
6763
|
+
setValue(`tabs.${index}.names.${selectedLanguage}`, value);
|
|
6764
|
+
} else {
|
|
6765
|
+
clearErrors(`tabs.${index}.name`);
|
|
6766
|
+
setValue(`tabs.${index}.name`, value);
|
|
6767
|
+
}
|
|
6768
|
+
};
|
|
6653
6769
|
return /*#__PURE__*/React.createElement("div", {
|
|
6654
6770
|
className: "khb_tabs-container"
|
|
6655
6771
|
}, /*#__PURE__*/React.createElement(Tabs$1, {
|
|
@@ -6658,8 +6774,18 @@ const Tabs = ({
|
|
|
6658
6774
|
className: "khb-tabs"
|
|
6659
6775
|
}, /*#__PURE__*/React.createElement(TabList, {
|
|
6660
6776
|
className: "khb_tabs-list"
|
|
6661
|
-
},
|
|
6662
|
-
|
|
6777
|
+
}, Array.isArray(languages) && languages.length > 0 && /*#__PURE__*/React.createElement("div", {
|
|
6778
|
+
className: "khb_input-wrapper"
|
|
6779
|
+
}, /*#__PURE__*/React.createElement("select", {
|
|
6780
|
+
title: "Change Language",
|
|
6781
|
+
value: selectedLanguage,
|
|
6782
|
+
className: "khb_input khb_input-sm h-full",
|
|
6783
|
+
onChange: e => setSelectedLanguage(e.target.value)
|
|
6784
|
+
}, languages.map(lng => /*#__PURE__*/React.createElement("option", {
|
|
6785
|
+
value: lng.code,
|
|
6786
|
+
key: lng.code
|
|
6787
|
+
}, lng.name)))), tabFields === null || tabFields === void 0 ? void 0 : tabFields.map((field, index) => {
|
|
6788
|
+
var _a, _b, _c, _d, _e, _f, _g;
|
|
6663
6789
|
return /*#__PURE__*/React.createElement(Tab, {
|
|
6664
6790
|
key: field.id,
|
|
6665
6791
|
className: classNames('khb_tabs-item', {
|
|
@@ -6668,14 +6794,18 @@ const Tabs = ({
|
|
|
6668
6794
|
}, /*#__PURE__*/React.createElement(TabItem, {
|
|
6669
6795
|
key: field.id,
|
|
6670
6796
|
deleteTitle: deleteTitle,
|
|
6671
|
-
register:
|
|
6672
|
-
|
|
6673
|
-
|
|
6797
|
+
register: {
|
|
6798
|
+
value: getValues(`tabs.${index}.names.${selectedLanguage}`),
|
|
6799
|
+
onChange: e => onTabnameChange(index, e.target.value || '')
|
|
6800
|
+
},
|
|
6674
6801
|
onRemoveTab: () => {
|
|
6675
6802
|
removeField(index);
|
|
6676
6803
|
setActiveTab(index === 0 ? 0 : index - 1);
|
|
6677
6804
|
},
|
|
6678
|
-
error:
|
|
6805
|
+
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 => {
|
|
6806
|
+
var _a, _b, _c, _d;
|
|
6807
|
+
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;
|
|
6808
|
+
}).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,
|
|
6679
6809
|
noButtonText: noButtonText,
|
|
6680
6810
|
yesButtonText: yesButtonText,
|
|
6681
6811
|
showDelete: (tabFields === null || tabFields === void 0 ? void 0 : tabFields.length) > 1
|
|
@@ -6768,6 +6898,7 @@ const WidgetForm = ({
|
|
|
6768
6898
|
itemsTypes,
|
|
6769
6899
|
widgetTypes,
|
|
6770
6900
|
loading,
|
|
6901
|
+
languages,
|
|
6771
6902
|
onWidgetFormSubmit,
|
|
6772
6903
|
getCollectionData,
|
|
6773
6904
|
collectionData,
|
|
@@ -6902,6 +7033,32 @@ const WidgetForm = ({
|
|
|
6902
7033
|
setTabCollectionItems(value[constants.tabsAccessor].map(tabItem => tabItem[constants.tabCollectionItemsAccessor]));
|
|
6903
7034
|
}
|
|
6904
7035
|
}, [getFirstItemTypeValue, itemsTypes, widgetTypes]);
|
|
7036
|
+
const validateTabs = tabsData => {
|
|
7037
|
+
const isLanguagesProvided = Array.isArray(languages) && languages.length > 0;
|
|
7038
|
+
let isTabsValid = true;
|
|
7039
|
+
if (Array.isArray(tabsData) && tabsData.length > 0) {
|
|
7040
|
+
tabsData.forEach((tabItem, index) => {
|
|
7041
|
+
if (isLanguagesProvided) {
|
|
7042
|
+
languages.forEach(lang => {
|
|
7043
|
+
if (!tabItem.names[lang.code]) {
|
|
7044
|
+
setError(`tabs.${index}.names.${lang.code}`, {
|
|
7045
|
+
type: 'manual',
|
|
7046
|
+
message: `${t('widget.tabNameRequired')} (${lang.name})`
|
|
7047
|
+
});
|
|
7048
|
+
isTabsValid = false;
|
|
7049
|
+
}
|
|
7050
|
+
});
|
|
7051
|
+
} else if (!tabItem.name) {
|
|
7052
|
+
setError(`tabs.${index}.name`, {
|
|
7053
|
+
type: 'manual',
|
|
7054
|
+
message: t('widget.tabNameRequired')
|
|
7055
|
+
});
|
|
7056
|
+
isTabsValid = false;
|
|
7057
|
+
}
|
|
7058
|
+
});
|
|
7059
|
+
}
|
|
7060
|
+
return isTabsValid;
|
|
7061
|
+
};
|
|
6905
7062
|
const onFormSubmit = data => {
|
|
6906
7063
|
var _a, _b;
|
|
6907
7064
|
const formData = Object.assign({}, data);
|
|
@@ -6911,9 +7068,14 @@ const WidgetForm = ({
|
|
|
6911
7068
|
}
|
|
6912
7069
|
// setting tabs data if widgetType tab is selected
|
|
6913
7070
|
const tabsData = getValues('tabs');
|
|
7071
|
+
if (Array.isArray(tabsData) && tabsData.length > 0) {
|
|
7072
|
+
const isTabsValid = validateTabs(tabsData);
|
|
7073
|
+
if (!isTabsValid) return;
|
|
7074
|
+
}
|
|
6914
7075
|
if (Array.isArray(tabsData) && (formData[constants.widgetTypeAccessor] === constants.tabsWidgetTypeValue || formState === 'UPDATE')) {
|
|
6915
7076
|
formData[constants.tabsAccessor] = tabsData.map(tabItem => ({
|
|
6916
7077
|
name: tabItem.name,
|
|
7078
|
+
names: tabItem.names,
|
|
6917
7079
|
collectionItems: tabItem.collectionItems.map(item => typeof item == 'string' ? item : item.value)
|
|
6918
7080
|
}));
|
|
6919
7081
|
} else formData[constants.tabsAccessor] = [];
|
|
@@ -7000,7 +7162,19 @@ const WidgetForm = ({
|
|
|
7000
7162
|
required: t('widget.codeRequired')
|
|
7001
7163
|
},
|
|
7002
7164
|
wrapperClassName: 'khb_grid-item-1of2 khb_padding-left-1 khb_align-top khb_margin-top-0'
|
|
7003
|
-
}, {
|
|
7165
|
+
}, Array.isArray(languages) && languages.length > 0 ? {
|
|
7166
|
+
label: `${t('widget.widgetTitle')}`,
|
|
7167
|
+
accessor: 'widgetTitles',
|
|
7168
|
+
required: true,
|
|
7169
|
+
type: customInputs && customInputs['widgetTitle'] ? undefined : 'text',
|
|
7170
|
+
validations: {
|
|
7171
|
+
required: t('widget.widgetTitleRequired')
|
|
7172
|
+
},
|
|
7173
|
+
info: t('widget.widgetTitleInfo'),
|
|
7174
|
+
placeholder: t('widget.widgetTitlePlaceholder'),
|
|
7175
|
+
onInput: handleCapitalize,
|
|
7176
|
+
Input: customInputs && customInputs['widgetTitle'] ? customInputs['widgetTitle'] : undefined
|
|
7177
|
+
} : {
|
|
7004
7178
|
label: `${t('widget.widgetTitle')}`,
|
|
7005
7179
|
accessor: 'widgetTitle',
|
|
7006
7180
|
required: true,
|
|
@@ -7116,15 +7290,18 @@ const WidgetForm = ({
|
|
|
7116
7290
|
handleSubmit: handleSubmit,
|
|
7117
7291
|
setValue: setValue,
|
|
7118
7292
|
control: control,
|
|
7119
|
-
setError: setError
|
|
7293
|
+
setError: setError,
|
|
7294
|
+
languages: languages
|
|
7120
7295
|
}), (selectedWidgetType === null || selectedWidgetType === void 0 ? void 0 : selectedWidgetType.value) === 'Tabs' ? /*#__PURE__*/React.createElement(Tabs, {
|
|
7296
|
+
clearErrors: clearErrors,
|
|
7297
|
+
getValues: getValues,
|
|
7298
|
+
setValue: setValue,
|
|
7121
7299
|
control: control,
|
|
7122
|
-
|
|
7300
|
+
languages: languages,
|
|
7123
7301
|
deleteTitle: t('widget.tabDeleteTitle'),
|
|
7124
7302
|
yesButtonText: t('yesButtonText'),
|
|
7125
7303
|
noButtonText: t('cancelButtonText'),
|
|
7126
7304
|
errors: errors,
|
|
7127
|
-
tabNameRequiredText: t('widget.tabNameRequired'),
|
|
7128
7305
|
itemsPlaceholder: `Select ${selectedCollectionType === null || selectedCollectionType === void 0 ? void 0 : selectedCollectionType.label}...`,
|
|
7129
7306
|
loadOptions: onChangeSearch,
|
|
7130
7307
|
isItemsLoading: collectionDataLoading,
|
|
@@ -7142,6 +7319,7 @@ const WidgetForm = ({
|
|
|
7142
7319
|
formatItem: formatListItem,
|
|
7143
7320
|
listCode: selectedCollectionType === null || selectedCollectionType === void 0 ? void 0 : selectedCollectionType.value
|
|
7144
7321
|
}), itemsEnabled && (selectedWidgetType === null || selectedWidgetType === void 0 ? void 0 : selectedWidgetType.value) !== 'Tabs' && /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(ItemsAccordian, {
|
|
7322
|
+
languages: languages,
|
|
7145
7323
|
clearError: clearErrors,
|
|
7146
7324
|
collapseId: constants.webItems,
|
|
7147
7325
|
title: t('widget.webItems'),
|
|
@@ -7158,6 +7336,7 @@ const WidgetForm = ({
|
|
|
7158
7336
|
addText: t('addButtonText'),
|
|
7159
7337
|
deleteText: t('deleteButtonText')
|
|
7160
7338
|
}), /*#__PURE__*/React.createElement(ItemsAccordian, {
|
|
7339
|
+
languages: languages,
|
|
7161
7340
|
clearError: clearErrors,
|
|
7162
7341
|
collapseId: constants.mobileItems,
|
|
7163
7342
|
title: t('widget.mobileItems'),
|
|
@@ -7332,6 +7511,7 @@ const Widget = ({
|
|
|
7332
7511
|
totalRecords,
|
|
7333
7512
|
currentPage,
|
|
7334
7513
|
pageSize,
|
|
7514
|
+
languages,
|
|
7335
7515
|
setCurrentPage
|
|
7336
7516
|
} = useWidget({
|
|
7337
7517
|
canList: derivedPermissions.list,
|
|
@@ -7343,6 +7523,7 @@ const Widget = ({
|
|
|
7343
7523
|
return /*#__PURE__*/React.createElement(WidgetContextProvider, {
|
|
7344
7524
|
loading: loading,
|
|
7345
7525
|
list: list,
|
|
7526
|
+
languages: languages,
|
|
7346
7527
|
imageBaseUrl: imageBaseUrl,
|
|
7347
7528
|
onChangeFormState: onChangeFormState,
|
|
7348
7529
|
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;
|