awing-library 2.1.20 → 2.1.21

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.
Files changed (92) hide show
  1. package/lib/ACM-AXN/Campaign/CreateOrEdit/TabSubCampaign/AddOrEditRule/RuleForm/RetargetMacAddress/component.js +2 -1
  2. package/lib/ACM-AXN/CampaignSchedule/Components/ControlPanel/Filter.d.ts +1 -1
  3. package/lib/ACM-AXN/CampaignSchedule/Components/ControlPanel/Filter.js +2 -2
  4. package/lib/ACM-AXN/CampaignSchedule/Components/ControlPanel/index.d.ts +1 -1
  5. package/lib/ACM-AXN/CampaignSchedule/Components/ControlPanel/index.js +2 -2
  6. package/lib/ACM-AXN/CampaignSchedule/Components/RowAdvance/component.js +6 -2
  7. package/lib/ACM-AXN/CampaignSchedule/Components/RowAdvance/container.js +42 -41
  8. package/lib/ACM-AXN/CampaignSchedule/component.js +30 -4
  9. package/lib/ACM-AXN/CampaignSchedule/container.d.ts +1 -1
  10. package/lib/ACM-AXN/CampaignSchedule/container.js +2 -2
  11. package/lib/ACM-AXN/CampaignSchedule/interface.d.ts +3 -0
  12. package/lib/ACM-AXN/GroupUser/User/UserComponent.js +1 -1
  13. package/lib/ACM-AXN/Page/CreateOrEdit/Components/useListPageView.js +9 -4
  14. package/lib/ACM-AXN/Page/CreateOrEdit/Recoil.d.ts +2 -1
  15. package/lib/ACM-AXN/Page/CreateOrEdit/Recoil.js +14 -1
  16. package/lib/ACM-AXN/Page/CreateOrEdit/TabFile/FileUtils.d.ts +3 -1
  17. package/lib/ACM-AXN/Page/CreateOrEdit/TabFile/FileUtils.js +1 -6
  18. package/lib/ACM-AXN/Page/CreateOrEdit/TabFile/index.d.ts +7 -0
  19. package/lib/ACM-AXN/Page/CreateOrEdit/TabFile/index.js +13 -15
  20. package/lib/ACM-AXN/Page/CreateOrEdit/Tabview/ViewContent.js +23 -2
  21. package/lib/ACM-AXN/Page/CreateOrEdit/Tabview/ViewInfo.d.ts +3 -2
  22. package/lib/ACM-AXN/Page/CreateOrEdit/Tabview/index.test.js +2 -1
  23. package/lib/ACM-AXN/Page/CreateOrEdit/Utils.d.ts +4 -3
  24. package/lib/ACM-AXN/Page/CreateOrEdit/Utils.js +4 -2
  25. package/lib/ACM-AXN/Page/Types.d.ts +10 -37
  26. package/lib/ACM-AXN/Page/enums.d.ts +6 -0
  27. package/lib/ACM-AXN/Page/enums.js +8 -1
  28. package/lib/ACM-AXN/PlaceFilter/DataTable/container.js +1 -2
  29. package/lib/ACM-AXN/PlaceFilter/Input/container.js +12 -2
  30. package/lib/ACM-AXN/PlaceFilter/common.d.ts +1 -0
  31. package/lib/ACM-AXN/PlaceFilter/common.js +27 -1
  32. package/lib/ACM-AXN/Statistics/ControlPanel.js +4 -4
  33. package/lib/ACM-AXN/Template/Constants.d.ts +0 -0
  34. package/lib/ACM-AXN/Template/Constants.js +1 -0
  35. package/lib/ACM-AXN/Template/Container.d.ts +2 -0
  36. package/lib/ACM-AXN/Template/Container.js +74 -0
  37. package/lib/ACM-AXN/Template/Container.test.d.ts +1 -0
  38. package/lib/ACM-AXN/Template/Container.test.js +259 -0
  39. package/lib/ACM-AXN/Template/CreateOrEdit/CreateOrEdit.test.d.ts +1 -0
  40. package/lib/ACM-AXN/Template/CreateOrEdit/CreateOrEdit.test.js +370 -0
  41. package/lib/ACM-AXN/Template/CreateOrEdit/Infomation.d.ts +9 -0
  42. package/lib/ACM-AXN/Template/CreateOrEdit/Infomation.js +78 -0
  43. package/lib/ACM-AXN/Template/CreateOrEdit/Infomation.test.d.ts +1 -0
  44. package/lib/ACM-AXN/Template/CreateOrEdit/Infomation.test.js +150 -0
  45. package/lib/ACM-AXN/Template/CreateOrEdit/Recoils.d.ts +6 -0
  46. package/lib/ACM-AXN/Template/CreateOrEdit/Recoils.js +79 -0
  47. package/lib/ACM-AXN/Template/CreateOrEdit/Script.d.ts +3 -0
  48. package/lib/ACM-AXN/Template/CreateOrEdit/Script.js +58 -0
  49. package/lib/ACM-AXN/Template/CreateOrEdit/Script.test.d.ts +1 -0
  50. package/lib/ACM-AXN/Template/CreateOrEdit/Script.test.js +162 -0
  51. package/lib/ACM-AXN/Template/CreateOrEdit/Template/Events.d.ts +5 -0
  52. package/lib/ACM-AXN/Template/CreateOrEdit/Template/Events.js +41 -0
  53. package/lib/ACM-AXN/Template/CreateOrEdit/Template/Parameter.d.ts +20 -0
  54. package/lib/ACM-AXN/Template/CreateOrEdit/Template/Parameter.js +283 -0
  55. package/lib/ACM-AXN/Template/CreateOrEdit/Template/Parameter.test.d.ts +1 -0
  56. package/lib/ACM-AXN/Template/CreateOrEdit/Template/Parameter.test.js +220 -0
  57. package/lib/ACM-AXN/Template/CreateOrEdit/Template/Utils.d.ts +25 -0
  58. package/lib/ACM-AXN/Template/CreateOrEdit/Template/Utils.js +138 -0
  59. package/lib/ACM-AXN/Template/CreateOrEdit/Template/index.d.ts +3 -0
  60. package/lib/ACM-AXN/Template/CreateOrEdit/Template/index.js +46 -0
  61. package/lib/ACM-AXN/Template/CreateOrEdit/index.d.ts +3 -0
  62. package/lib/ACM-AXN/Template/CreateOrEdit/index.js +215 -0
  63. package/lib/ACM-AXN/Template/Hooks.d.ts +5 -0
  64. package/lib/ACM-AXN/Template/Hooks.js +13 -0
  65. package/lib/ACM-AXN/Template/Import.d.ts +2 -0
  66. package/lib/ACM-AXN/Template/Import.js +123 -0
  67. package/lib/ACM-AXN/Template/Import.test.d.ts +1 -0
  68. package/lib/ACM-AXN/Template/Import.test.js +188 -0
  69. package/lib/ACM-AXN/Template/Types.d.ts +84 -0
  70. package/lib/ACM-AXN/Template/Types.js +2 -0
  71. package/lib/ACM-AXN/Template/UploadButton.d.ts +2 -0
  72. package/lib/ACM-AXN/Template/UploadButton.js +14 -0
  73. package/lib/ACM-AXN/Template/index.d.ts +5 -0
  74. package/lib/ACM-AXN/Template/index.js +44 -0
  75. package/lib/ACM-AXN/TransactionLog/Container.js +1 -1
  76. package/lib/ACM-AXN/ViewTemplate/index.d.ts +2 -1
  77. package/lib/ACM-AXN/ViewTemplate/interface.d.ts +6 -1
  78. package/lib/AWING/ButtonSelect/index.js +2 -2
  79. package/lib/AWING/DateRangePicker/component.js +101 -132
  80. package/lib/AWING/DateRangePicker/configDate.d.ts +8 -0
  81. package/lib/AWING/DateRangePicker/configDate.js +71 -0
  82. package/lib/AWING/DateRangePicker/interface.d.ts +1 -0
  83. package/lib/AWING/HOC/Wrapper.d.ts +6 -0
  84. package/lib/AWING/HOC/Wrapper.js +10 -0
  85. package/lib/AWING/LogicExpression/script.js +0 -1
  86. package/lib/AWING/PageManagement/PageManagement.js +2 -2
  87. package/lib/AWING/PageManagement/interface.d.ts +1 -2
  88. package/lib/translate/en/translation.json +32 -2
  89. package/lib/translate/vi/translation.json +32 -2
  90. package/package.json +1 -1
  91. package/lib/ACM-AXN/Page/CreateOrEdit/TabFile/index.test.d.ts +0 -1
  92. package/lib/ACM-AXN/Page/CreateOrEdit/TabFile/index.test.js +0 -326
@@ -0,0 +1,46 @@
1
+ "use strict";
2
+ var __assign = (this && this.__assign) || function () {
3
+ __assign = Object.assign || function(t) {
4
+ for (var s, i = 1, n = arguments.length; i < n; i++) {
5
+ s = arguments[i];
6
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
7
+ t[p] = s[p];
8
+ }
9
+ return t;
10
+ };
11
+ return __assign.apply(this, arguments);
12
+ };
13
+ var __importDefault = (this && this.__importDefault) || function (mod) {
14
+ return (mod && mod.__esModule) ? mod : { "default": mod };
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ var jsx_runtime_1 = require("react/jsx-runtime");
18
+ var material_1 = require("@mui/material");
19
+ var MonacoEditor_1 = __importDefault(require("../../../../ACM-AXN/ViewTemplate/TemplateField/Fields/BasicField/MonacoEditor"));
20
+ var react_1 = require("react");
21
+ var react_i18next_1 = require("react-i18next");
22
+ var recoil_1 = require("recoil");
23
+ var Recoils_1 = require("../Recoils");
24
+ var Parameter_1 = __importDefault(require("./Parameter"));
25
+ var Events_1 = __importDefault(require("./Events"));
26
+ // import MonacoEditor from 'Components/MonacoEditor'
27
+ var Template = function () {
28
+ var t = (0, react_i18next_1.useTranslation)().t;
29
+ var _a = (0, recoil_1.useRecoilState)(Recoils_1.templateInfoState), info = _a[0], setInfo = _a[1];
30
+ var handleChangeEditor = (0, react_1.useCallback)(function (templateHtml) {
31
+ setInfo(function (prev) { return (__assign(__assign({}, prev), { templateHtml: templateHtml })); });
32
+ }, [setInfo]);
33
+ return ((0, jsx_runtime_1.jsx)(material_1.Grid, { container: true, sx: { flexGrow: 1, padding: function (theme) { return theme.spacing(3); } }, children: (0, jsx_runtime_1.jsxs)(material_1.Grid, { item: true, component: material_1.Paper, sx: { padding: function (theme) { return theme.spacing(2); }, width: '100%' }, children: [(0, jsx_runtime_1.jsxs)(material_1.Grid, { item: true, xs: 12, children: [(0, jsx_runtime_1.jsx)(material_1.Typography, { variant: "subtitle1", sx: {
34
+ fontWeight: 'bold',
35
+ color: '#BDC7CC',
36
+ }, children: t('Common.Events') }), (0, jsx_runtime_1.jsx)(material_1.Box, { marginBottom: 2, children: (0, jsx_runtime_1.jsx)(Events_1.default, { templateId: info.id || '' }) })] }), (0, jsx_runtime_1.jsxs)(material_1.Grid, { item: true, xs: 12, children: [(0, jsx_runtime_1.jsx)(material_1.Typography, { variant: "subtitle1", sx: {
37
+ fontWeight: 'bold',
38
+ color: '#BDC7CC',
39
+ }, children: t('TemplateManagement.TemplateHtml') }), (0, jsx_runtime_1.jsx)(material_1.Box, { sx: {
40
+ pointerEvents: 'unset',
41
+ border: '1px solid #e4e4e4',
42
+ padding: '10px 0',
43
+ borderRadius: '4px',
44
+ }, children: (0, jsx_runtime_1.jsx)(MonacoEditor_1.default, { value: info.templateHtml, height: "30vh", language: "html", onChange: handleChangeEditor, isShowMinimap: true }) })] }), (0, jsx_runtime_1.jsx)(material_1.Grid, { item: true, xs: 12, children: (0, jsx_runtime_1.jsx)(Parameter_1.default, { templateId: info.id }) })] }) }));
45
+ };
46
+ exports.default = Template;
@@ -0,0 +1,3 @@
1
+ /// <reference types="react" />
2
+ declare const _default: import("react").FC<unknown>;
3
+ export default _default;
@@ -0,0 +1,215 @@
1
+ "use strict";
2
+ var __assign = (this && this.__assign) || function () {
3
+ __assign = Object.assign || function(t) {
4
+ for (var s, i = 1, n = arguments.length; i < n; i++) {
5
+ s = arguments[i];
6
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
7
+ t[p] = s[p];
8
+ }
9
+ return t;
10
+ };
11
+ return __assign.apply(this, arguments);
12
+ };
13
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
14
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
15
+ return new (P || (P = Promise))(function (resolve, reject) {
16
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
17
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
18
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
19
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
20
+ });
21
+ };
22
+ var __generator = (this && this.__generator) || function (thisArg, body) {
23
+ var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
24
+ return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
25
+ function verb(n) { return function (v) { return step([n, v]); }; }
26
+ function step(op) {
27
+ if (f) throw new TypeError("Generator is already executing.");
28
+ while (g && (g = 0, op[0] && (_ = 0)), _) try {
29
+ if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
30
+ if (y = 0, t) op = [op[0] & 2, t.value];
31
+ switch (op[0]) {
32
+ case 0: case 1: t = op; break;
33
+ case 4: _.label++; return { value: op[1], done: false };
34
+ case 5: _.label++; y = op[1]; op = [0]; continue;
35
+ case 7: op = _.ops.pop(); _.trys.pop(); continue;
36
+ default:
37
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
38
+ if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
39
+ if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
40
+ if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
41
+ if (t[2]) _.ops.pop();
42
+ _.trys.pop(); continue;
43
+ }
44
+ op = body.call(thisArg, _);
45
+ } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
46
+ if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
47
+ }
48
+ };
49
+ var __importDefault = (this && this.__importDefault) || function (mod) {
50
+ return (mod && mod.__esModule) ? mod : { "default": mod };
51
+ };
52
+ Object.defineProperty(exports, "__esModule", { value: true });
53
+ var jsx_runtime_1 = require("react/jsx-runtime");
54
+ var lab_1 = require("@mui/lab");
55
+ var material_1 = require("@mui/material");
56
+ var Enum_1 = require("../../../ACM-AXN/Campaign/Enum");
57
+ var TabFile_1 = __importDefault(require("../../../ACM-AXN/Page/CreateOrEdit/TabFile"));
58
+ var enums_1 = require("../../../ACM-AXN/Page/enums");
59
+ var AWING_1 = require("../../../AWING");
60
+ var Wrapper_1 = __importDefault(require("../../../AWING/HOC/Wrapper"));
61
+ var immer_1 = __importDefault(require("immer"));
62
+ var Router_1 = require("../../../AWING/Router");
63
+ var validation_1 = require("../../../AWING/ultis/validation");
64
+ var ClassicDrawer_1 = __importDefault(require("../../../Commons/Components/ClassicDrawer"));
65
+ var Context_1 = require("../../../Context");
66
+ var lodash_1 = require("lodash");
67
+ var react_1 = require("react");
68
+ var react_i18next_1 = require("react-i18next");
69
+ var recoil_1 = require("recoil");
70
+ var Hooks_1 = __importDefault(require("../Hooks"));
71
+ var Infomation_1 = __importDefault(require("./Infomation"));
72
+ var Recoils_1 = require("./Recoils");
73
+ var Script_1 = __importDefault(require("./Script"));
74
+ var Template_1 = __importDefault(require("./Template"));
75
+ var Utils_1 = require("./Template/Utils");
76
+ var CreateOrEdit = function () {
77
+ var _a, _b;
78
+ var t = (0, react_i18next_1.useTranslation)().t;
79
+ var service = (0, Hooks_1.default)().service;
80
+ var appHelper = (0, Context_1.useAwing)().appHelper;
81
+ var templateId = (0, Router_1.useParams)().templateId;
82
+ var _c = (0, react_1.useState)([
83
+ {
84
+ directoryId: '',
85
+ name: '',
86
+ level: 0,
87
+ },
88
+ ]), directories = _c[0], setDirectories = _c[1];
89
+ var _d = (0, react_1.useState)(true), loading = _d[0], setLoading = _d[1];
90
+ var _e = (0, react_1.useState)([]), templateTypes = _e[0], setTemplateTypes = _e[1];
91
+ var _f = (0, recoil_1.useRecoilState)(Recoils_1.templateState), templateData = _f[0], setTemplateData = _f[1];
92
+ var confirmExit = (0, recoil_1.useRecoilValue)(Recoils_1.isEditState);
93
+ var _g = (0, react_1.useState)('0'), value = _g[0], setValue = _g[1];
94
+ (0, react_1.useEffect)(function () {
95
+ setLoading(true);
96
+ Promise.allSettled([
97
+ fetchTemplateData(),
98
+ service.templateTypesGet().then(setTemplateTypes),
99
+ fetchDirectories(),
100
+ getId(),
101
+ ]).finally(function () {
102
+ setLoading(false);
103
+ });
104
+ // eslint-disable-next-line react-hooks/exhaustive-deps
105
+ }, []);
106
+ (0, react_1.useEffect)(function () {
107
+ setTemplateData((0, immer_1.default)(function (prev) {
108
+ var _a;
109
+ prev.template.directoryId =
110
+ prev.template.directoryId ||
111
+ ((_a = (0, lodash_1.minBy)(directories, 'level')) === null || _a === void 0 ? void 0 : _a.directoryId);
112
+ }));
113
+ // eslint-disable-next-line react-hooks/exhaustive-deps
114
+ }, [directories]);
115
+ var descriptionValid = (0, react_1.useMemo)(function () {
116
+ var _a;
117
+ return (0, validation_1.textValidation)(((_a = templateData.template) === null || _a === void 0 ? void 0 : _a.description) || '', 200, true, false);
118
+ }, [templateData.template]);
119
+ var tabsList = (0, react_1.useMemo)(function () {
120
+ var _a;
121
+ return [
122
+ {
123
+ label: t('TemplateManagement.Information'),
124
+ compoent: ((0, jsx_runtime_1.jsx)(Infomation_1.default, { directories: directories, templateTypes: templateTypes })),
125
+ },
126
+ {
127
+ label: t('TemplateManagement.Template'),
128
+ compoent: (0, jsx_runtime_1.jsx)(Template_1.default, {}),
129
+ },
130
+ {
131
+ label: t('TemplateManagement.Script'),
132
+ compoent: (0, jsx_runtime_1.jsx)(Script_1.default, {}),
133
+ },
134
+ {
135
+ label: t('Common.File'),
136
+ compoent: ((0, jsx_runtime_1.jsx)(TabFile_1.default, { rootDirectory: ((_a = (0, lodash_1.minBy)(directories, 'level')) === null || _a === void 0 ? void 0 : _a.directoryId) || '', isCreate: Boolean(templateId), pathName: 'ACM-AXN/Template', service: service, pageId: templateData.template.id, pageCode: enums_1.FileTypeCode.Template })),
137
+ },
138
+ ];
139
+ },
140
+ // eslint-disable-next-line react-hooks/exhaustive-deps
141
+ [
142
+ t,
143
+ directories,
144
+ templateTypes,
145
+ templateData,
146
+ // treeFolder,
147
+ descriptionValid,
148
+ ]);
149
+ var handleChangeTab = function (event, newValue) {
150
+ setValue(newValue);
151
+ };
152
+ var fetchTemplateData = function () {
153
+ if (templateId) {
154
+ return service.templatesGet(templateId).then(function (res) {
155
+ setTemplateData(__assign(__assign({}, res), { templateParameters: (0, Utils_1.removeFiledName)(res.templateParameters) }));
156
+ });
157
+ }
158
+ };
159
+ var fetchDirectories = function () {
160
+ return service
161
+ .directoriesGetByObjectTypeCode(Enum_1.DirectoryRoot.Template)
162
+ .then(setDirectories);
163
+ };
164
+ var getId = function () { return __awaiter(void 0, void 0, void 0, function () {
165
+ var id;
166
+ return __generator(this, function (_a) {
167
+ switch (_a.label) {
168
+ case 0:
169
+ id = templateId;
170
+ if (!!templateId) return [3 /*break*/, 2];
171
+ return [4 /*yield*/, service.directoriesGenerateId()];
172
+ case 1:
173
+ id = _a.sent();
174
+ _a.label = 2;
175
+ case 2:
176
+ setTemplateData((function (prev) { return (__assign(__assign({}, prev), { template: __assign(__assign({}, prev.template), { id: id }) })); }));
177
+ return [2 /*return*/];
178
+ }
179
+ });
180
+ }); };
181
+ var handleSubmit = function () {
182
+ var _a;
183
+ var parameters = (0, Utils_1.flattenParameter4Parent)(templateData.templateParameters);
184
+ var errField = (0, lodash_1.uniqBy)(parameters, 'fieldName');
185
+ if (!((_a = templateData.template) === null || _a === void 0 ? void 0 : _a.templateTypeId) ||
186
+ !templateData.template.description) {
187
+ appHelper.snackbar('error', t('Common.RequireAll'));
188
+ // return Promise.reject()
189
+ return;
190
+ }
191
+ if (errField.length < parameters.length) {
192
+ appHelper.snackbar('warning', t('TemplateManagement.DuplicateFieldName'));
193
+ return;
194
+ }
195
+ var data4Update = {
196
+ template: __assign(__assign({}, templateData.template), { id: templateId }),
197
+ // eslint-disable-next-line no-sequences
198
+ templateParameters: parameters.map(function (parameter) { return (
199
+ // eslint-disable-next-line no-sequences
200
+ delete parameter.childrens, __assign(__assign({}, parameter), { templateId: templateId })); }),
201
+ templateEvents: templateData.templateEvents
202
+ };
203
+ if (templateId) {
204
+ return service.templatesPut(templateId, data4Update);
205
+ }
206
+ return service.templatesPost(data4Update);
207
+ };
208
+ return ((0, jsx_runtime_1.jsx)(ClassicDrawer_1.default, { title: "".concat(t(['TemplateManagement', templateId ? 'Edit' : 'Create'].join('.'))).concat(templateId ? ": ".concat((_a = templateData === null || templateData === void 0 ? void 0 : templateData.template) === null || _a === void 0 ? void 0 : _a.description) : '', "\n "), onSubmit: handleSubmit, disableButtonSubmit: !((_b = templateData.template) === null || _b === void 0 ? void 0 : _b.templateTypeId) || !descriptionValid.valid || !confirmExit, confirmExit: confirmExit, childrenWrapperStyle: { padding: 0 }, children: (0, jsx_runtime_1.jsx)(material_1.Grid, { container: true, sx: {
209
+ display: 'flex',
210
+ flexDirection: 'column',
211
+ flexGrow: 1,
212
+ padding: function (theme) { return theme.spacing(3); },
213
+ }, children: loading ? ((0, jsx_runtime_1.jsx)(AWING_1.CircularProgress, {})) : ((0, jsx_runtime_1.jsx)(material_1.Grid, { item: true, component: material_1.Paper, sx: { width: '100%' }, children: (0, jsx_runtime_1.jsxs)(lab_1.TabContext, { value: value, children: [(0, jsx_runtime_1.jsx)(material_1.Box, { sx: { borderBottom: 1, borderColor: 'divider' }, children: (0, jsx_runtime_1.jsx)(lab_1.TabList, { variant: "scrollable", onChange: handleChangeTab, "aria-label": "lab API tabs example", children: tabsList.map(function (tab, idx) { return ((0, jsx_runtime_1.jsx)(material_1.Tab, { sx: { minWidth: '160px' }, value: String(idx), label: (0, jsx_runtime_1.jsx)("b", { children: tab.label }) }, idx)); }) }) }), tabsList.map(function (tab, idx) { return ((0, jsx_runtime_1.jsx)(lab_1.TabPanel, { sx: { padding: '0' }, value: String(idx), children: tab.compoent }, idx)); })] }) })) }) }));
214
+ };
215
+ exports.default = (0, Wrapper_1.default)(CreateOrEdit, { component: recoil_1.RecoilRoot });
@@ -0,0 +1,5 @@
1
+ /// <reference types="react" />
2
+ import { TemplateProps } from "./Types";
3
+ export declare const templatePropsContext: import("react").Context<TemplateProps>;
4
+ declare const useTemplateProps: () => TemplateProps;
5
+ export default useTemplateProps;
@@ -0,0 +1,13 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.templatePropsContext = void 0;
4
+ var react_1 = require("react");
5
+ var react_2 = require("react");
6
+ exports.templatePropsContext = (0, react_1.createContext)({});
7
+ var useTemplateProps = function () {
8
+ var props = (0, react_2.useContext)(exports.templatePropsContext);
9
+ return (0, react_2.useMemo)(function () {
10
+ return props;
11
+ }, [props]);
12
+ };
13
+ exports.default = useTemplateProps;
@@ -0,0 +1,2 @@
1
+ declare const ImportTemplate: () => import("react/jsx-runtime").JSX.Element;
2
+ export default ImportTemplate;
@@ -0,0 +1,123 @@
1
+ "use strict";
2
+ var __assign = (this && this.__assign) || function () {
3
+ __assign = Object.assign || function(t) {
4
+ for (var s, i = 1, n = arguments.length; i < n; i++) {
5
+ s = arguments[i];
6
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
7
+ t[p] = s[p];
8
+ }
9
+ return t;
10
+ };
11
+ return __assign.apply(this, arguments);
12
+ };
13
+ var __importDefault = (this && this.__importDefault) || function (mod) {
14
+ return (mod && mod.__esModule) ? mod : { "default": mod };
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ var jsx_runtime_1 = require("react/jsx-runtime");
18
+ var ClassicDrawer_1 = __importDefault(require("../../Commons/Components/ClassicDrawer"));
19
+ var AWING_1 = require("../../AWING");
20
+ var lodash_1 = require("lodash");
21
+ var react_1 = require("react");
22
+ var react_i18next_1 = require("react-i18next");
23
+ var Enum_1 = require("../../ACM-AXN/Campaign/Enum");
24
+ var UploadButton_1 = __importDefault(require("./UploadButton"));
25
+ var Hooks_1 = __importDefault(require("./Hooks"));
26
+ var ImportTemplate = function () {
27
+ var t = (0, react_i18next_1.useTranslation)().t;
28
+ var service = (0, Hooks_1.default)().service;
29
+ var _a = (0, react_1.useState)(), tempFile = _a[0], setTempFile = _a[1];
30
+ var _b = (0, react_1.useState)([]), directories = _b[0], setDirectories = _b[1];
31
+ var _c = (0, react_1.useState)({ directoryId: '', id: '', name: '' }), bussinessData = _c[0], setBussinessData = _c[1];
32
+ var rootDirectoryId = (0, react_1.useMemo)(function () { var _a; return (_a = (0, lodash_1.minBy)(directories, 'level')) === null || _a === void 0 ? void 0 : _a.directoryId; }, [directories]);
33
+ var hiddenTemplateImport = (0, react_1.useRef)();
34
+ (0, react_1.useEffect)(function () {
35
+ fetchDirectories();
36
+ // eslint-disable-next-line react-hooks/exhaustive-deps
37
+ }, []);
38
+ var handleChooseFileClicked = function () {
39
+ hiddenTemplateImport.current && hiddenTemplateImport.current.click();
40
+ };
41
+ var handleImportTemplate = function (e) {
42
+ if (e.target.files.length > 0) {
43
+ setTempFile(e.target.files[0]);
44
+ e.target.value = null;
45
+ }
46
+ };
47
+ var fetchDirectories = function () {
48
+ service
49
+ .directoriesGetByObjectTypeCode(Enum_1.DirectoryRoot.Template)
50
+ .then(setDirectories);
51
+ };
52
+ var handleSubmit = function () {
53
+ var directoryId = bussinessData.directoryId, id = bussinessData.id, name = bussinessData.name;
54
+ return service.templatesImport(directoryId, id, name, {
55
+ data: tempFile,
56
+ fileName: tempFile === null || tempFile === void 0 ? void 0 : tempFile.name,
57
+ });
58
+ };
59
+ var handleChangeFormData = (0, react_1.useCallback)(function (obj) {
60
+ setBussinessData(function (prev) { return (__assign(__assign(__assign(__assign({}, prev), { id: prev.id || '0' }), obj), { directoryId: (obj === null || obj === void 0 ? void 0 : obj.directoryId) || rootDirectoryId })); });
61
+ }, [rootDirectoryId]);
62
+ return ((0, jsx_runtime_1.jsxs)(ClassicDrawer_1.default, { title: t('TemplateManagement.ImportTemplate'), onSubmit: handleSubmit, disableButtonSubmit: !(tempFile === null || tempFile === void 0 ? void 0 : tempFile.name), confirmExit: true, childrenWrapperStyle: { padding: 0 }, children: [(0, jsx_runtime_1.jsx)(AWING_1.DataForm, { fields: [
63
+ {
64
+ fieldName: 'directoryId',
65
+ type: 'select',
66
+ label: t('Common.Directory'),
67
+ required: true,
68
+ options: directories.map(function (directory) { return ({
69
+ value: directory.directoryId,
70
+ text: directory.name,
71
+ level: directory.level,
72
+ }); }),
73
+ },
74
+ {
75
+ fieldName: 'name',
76
+ type: 'text',
77
+ label: t('Common.Name'),
78
+ onValidate: function () { return true; },
79
+ },
80
+ {
81
+ fieldName: 'id',
82
+ type: 'text',
83
+ label: t('TemplateManagement.TemplateId'),
84
+ onValidate: function () { return true; },
85
+ },
86
+ {
87
+ fieldName: 'fileName',
88
+ type: 'text',
89
+ disabled: !(tempFile === null || tempFile === void 0 ? void 0 : tempFile.name),
90
+ label: t('Common.File'),
91
+ inputProps: {
92
+ value: tempFile === null || tempFile === void 0 ? void 0 : tempFile.name,
93
+ },
94
+ required: true,
95
+ onValidate: function () { return true; },
96
+ },
97
+ {
98
+ fieldName: '',
99
+ type: 'text',
100
+ InputProps: {
101
+ onClick: handleChooseFileClicked,
102
+ sx: {
103
+ ':before': {
104
+ border: 'none',
105
+ },
106
+ ':hover': {
107
+ ':before': {
108
+ border: 'none!important',
109
+ },
110
+ },
111
+ width: 'fit-content',
112
+ },
113
+ inputComponent: (0, react_1.forwardRef)(UploadButton_1.default),
114
+ },
115
+ },
116
+ ], oldValue: {
117
+ directoryId: rootDirectoryId,
118
+ id: '',
119
+ name: '',
120
+ fileName: '',
121
+ }, onUpdate: handleChangeFormData }), (0, jsx_runtime_1.jsx)("input", { style: { display: 'none' }, name: "fileupload", ref: hiddenTemplateImport, accept: ".zip", type: "file", onChange: handleImportTemplate })] }));
122
+ };
123
+ exports.default = ImportTemplate;
@@ -0,0 +1 @@
1
+ import '@testing-library/jest-dom/extend-expect';
@@ -0,0 +1,188 @@
1
+ "use strict";
2
+ var __assign = (this && this.__assign) || function () {
3
+ __assign = Object.assign || function(t) {
4
+ for (var s, i = 1, n = arguments.length; i < n; i++) {
5
+ s = arguments[i];
6
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
7
+ t[p] = s[p];
8
+ }
9
+ return t;
10
+ };
11
+ return __assign.apply(this, arguments);
12
+ };
13
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
14
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
15
+ return new (P || (P = Promise))(function (resolve, reject) {
16
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
17
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
18
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
19
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
20
+ });
21
+ };
22
+ var __generator = (this && this.__generator) || function (thisArg, body) {
23
+ var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
24
+ return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
25
+ function verb(n) { return function (v) { return step([n, v]); }; }
26
+ function step(op) {
27
+ if (f) throw new TypeError("Generator is already executing.");
28
+ while (g && (g = 0, op[0] && (_ = 0)), _) try {
29
+ if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
30
+ if (y = 0, t) op = [op[0] & 2, t.value];
31
+ switch (op[0]) {
32
+ case 0: case 1: t = op; break;
33
+ case 4: _.label++; return { value: op[1], done: false };
34
+ case 5: _.label++; y = op[1]; op = [0]; continue;
35
+ case 7: op = _.ops.pop(); _.trys.pop(); continue;
36
+ default:
37
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
38
+ if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
39
+ if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
40
+ if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
41
+ if (t[2]) _.ops.pop();
42
+ _.trys.pop(); continue;
43
+ }
44
+ op = body.call(thisArg, _);
45
+ } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
46
+ if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
47
+ }
48
+ };
49
+ var __importDefault = (this && this.__importDefault) || function (mod) {
50
+ return (mod && mod.__esModule) ? mod : { "default": mod };
51
+ };
52
+ Object.defineProperty(exports, "__esModule", { value: true });
53
+ var jsx_runtime_1 = require("react/jsx-runtime");
54
+ /* eslint-disable testing-library/no-wait-for-side-effects */
55
+ require("@testing-library/jest-dom/extend-expect");
56
+ var react_1 = require("@testing-library/react");
57
+ var Import_1 = __importDefault(require("./Import"));
58
+ var user_event_1 = __importDefault(require("@testing-library/user-event"));
59
+ // Mock Axios client
60
+ var directories = [
61
+ {
62
+ directoryId: '5202880755274023966',
63
+ name: 'template',
64
+ parentDirectoryId: '4913100144472996590',
65
+ objectTypeCode: 'template',
66
+ level: 3,
67
+ isFile: false,
68
+ isSystem: true,
69
+ order: 0,
70
+ description: null,
71
+ directoryPath: '.0.90.4913100144472996590.5202880755274023966.',
72
+ },
73
+ {
74
+ directoryId: '4736019141892318583',
75
+ name: 'Beta template',
76
+ parentDirectoryId: '5202880755274023966',
77
+ objectTypeCode: 'template',
78
+ level: 4,
79
+ isFile: false,
80
+ isSystem: false,
81
+ order: 0,
82
+ description: '',
83
+ directoryPath: '.0.90.4913100144472996590.5202880755274023966.4736019141892318583.',
84
+ },
85
+ ];
86
+ var clientMethod = {
87
+ directoriesGetByObjectTypeCode: function (id) {
88
+ return Promise.resolve(directories);
89
+ },
90
+ templatesImport: function () { return Promise.resolve(); },
91
+ };
92
+ jest.mock('./Hooks', function () { return ({
93
+ __esModule: true,
94
+ default: function () { return ({
95
+ service: {
96
+ directoriesGetByObjectTypeCode: jest.fn(function (id) {
97
+ return Promise.resolve(clientMethod.directoriesGetByObjectTypeCode(id));
98
+ }),
99
+ templatesImport: jest.fn(function (_id) {
100
+ return Promise.resolve(clientMethod.templatesImport());
101
+ }),
102
+ },
103
+ }); },
104
+ }); });
105
+ jest.mock('Commons/Client', function () { return ({
106
+ __esModule: true,
107
+ DirectoryRoot: {
108
+ template: 'template',
109
+ },
110
+ // IDirectory: ,
111
+ }); });
112
+ // Mock i18next
113
+ jest.mock('react-i18next', function () { return (__assign(__assign({}, jest.requireActual('react-i18next')), { useTranslation: function () { return ({ t: jest.fn(function (key) { return key; }) }); } })); });
114
+ // Mock React
115
+ jest.mock('react', function () { return (__assign(__assign({}, jest.requireActual('react')), { forwardRef: jest.fn(function (arg) { return arg; }), useRef: function () { return ({ current: { click: function () { } } }); } })); });
116
+ // Mock Drawer
117
+ jest.mock('awing-library/lib/Commons/Components/ClassicDrawer', function () { return function (props) {
118
+ return ((0, jsx_runtime_1.jsxs)("div", { children: [(0, jsx_runtime_1.jsx)("button", { "data-testid": "onSubmit", onClick: props.onSubmit, children: "submit" }), props.children] }));
119
+ }; });
120
+ // Mock DataForm
121
+ jest.mock('awing-library/lib/AWING', function () { return ({
122
+ DataForm: function (props) {
123
+ var _a, _b, _c;
124
+ props.fields.forEach(function (element) {
125
+ if (element === null || element === void 0 ? void 0 : element.onValidate) {
126
+ element === null || element === void 0 ? void 0 : element.onValidate();
127
+ }
128
+ });
129
+ return ((0, jsx_runtime_1.jsxs)("div", { "data-testid": "DataForm", children: [(0, jsx_runtime_1.jsx)("p", { children: JSON.stringify(props.oldValue) }), (0, jsx_runtime_1.jsx)("p", { "data-testid": "file-name", children: (_a = props.fields.find(function (item) { return item.inputProps; })) === null || _a === void 0 ? void 0 : _a.inputProps.value }), (0, jsx_runtime_1.jsx)("p", { "data-testid": "select-options", children: JSON.stringify((_b = props.fields.find(function (item) { return item.options; })) === null || _b === void 0 ? void 0 : _b.options) }), (0, jsx_runtime_1.jsx)("button", { "data-testid": "upload-btn", onClick: (_c = props.fields.find(function (item) { return item.InputProps; })) === null || _c === void 0 ? void 0 : _c.InputProps.onClick }), (0, jsx_runtime_1.jsx)("button", { "data-testid": "onUpdate", onClick: function () {
130
+ props.onUpdate({
131
+ id: 'id',
132
+ name: 'name',
133
+ });
134
+ } })] }));
135
+ },
136
+ }); });
137
+ describe('Import Template component', function () {
138
+ var renderUi = function () { return (0, react_1.render)((0, jsx_runtime_1.jsx)(Import_1.default, {})); };
139
+ it('render without crash', function () {
140
+ renderUi();
141
+ });
142
+ it('render template directory select option', function () { return __awaiter(void 0, void 0, void 0, function () {
143
+ return __generator(this, function (_a) {
144
+ switch (_a.label) {
145
+ case 0:
146
+ renderUi();
147
+ return [4 /*yield*/, (0, react_1.waitFor)(function () {
148
+ expect(react_1.screen.getByText(JSON.stringify(directories.map(function (directory) { return ({
149
+ value: directory.directoryId,
150
+ text: directory.name,
151
+ level: directory.level,
152
+ }); })))).toBeInTheDocument();
153
+ })];
154
+ case 1:
155
+ _a.sent();
156
+ return [2 /*return*/];
157
+ }
158
+ });
159
+ }); });
160
+ it('trigger upload button', function () { return __awaiter(void 0, void 0, void 0, function () {
161
+ var file, container, input;
162
+ return __generator(this, function (_a) {
163
+ switch (_a.label) {
164
+ case 0:
165
+ file = new File(['abc'], 'test.zip', {
166
+ type: 'application/x-zip-compressed',
167
+ });
168
+ container = renderUi().container;
169
+ input = container.querySelector("input[name=\"fileupload\"]");
170
+ react_1.fireEvent.click(react_1.screen.getByTestId('upload-btn'));
171
+ react_1.fireEvent.change(input, { target: { files: undefined } });
172
+ user_event_1.default.upload(input, file);
173
+ return [4 /*yield*/, (0, react_1.waitFor)(function () {
174
+ expect(react_1.screen.getByText('test.zip')).toBeInTheDocument();
175
+ })];
176
+ case 1:
177
+ _a.sent();
178
+ return [2 /*return*/];
179
+ }
180
+ });
181
+ }); });
182
+ it('handle submit', function () {
183
+ renderUi();
184
+ react_1.fireEvent.click(react_1.screen.getByTestId('onUpdate'));
185
+ react_1.fireEvent.click(react_1.screen.getByTestId('onSubmit'));
186
+ // TODO: test client.templatesImport with arguments
187
+ });
188
+ });