awing-library 2.1.135 → 2.1.136

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 (34) hide show
  1. package/lib/ACM-AXN/AuthenticationProfile/Container.js +4 -4
  2. package/lib/ACM-AXN/AuthenticationProfile/CreateOrEdit/index.js +2 -2
  3. package/lib/ACM-AXN/Campaign/CreateOrEdit/TabInfomation.js +19 -3
  4. package/lib/ACM-AXN/Campaign/CreateOrEdit/TabStatistic/Event/PasswordDialog.d.ts +9 -0
  5. package/lib/ACM-AXN/Campaign/CreateOrEdit/TabStatistic/Event/PasswordDialog.js +56 -0
  6. package/lib/ACM-AXN/Campaign/CreateOrEdit/TabStatistic/Event/Util.d.ts +12 -0
  7. package/lib/ACM-AXN/Campaign/CreateOrEdit/TabStatistic/Event/Util.js +19 -1
  8. package/lib/ACM-AXN/Campaign/CreateOrEdit/TabStatistic/Event/container.js +62 -11
  9. package/lib/ACM-AXN/Campaign/Types.d.ts +3 -0
  10. package/lib/ACM-AXN/Campaign/Utils.d.ts +1 -0
  11. package/lib/ACM-AXN/Campaign/Utils.js +32 -1
  12. package/lib/ACM-AXN/CampaignPlan/Filter.js +1 -1
  13. package/lib/ACM-AXN/Common/Types.d.ts +5 -0
  14. package/lib/ACM-AXN/Holiday/FormHoliday.js +1 -0
  15. package/lib/ACM-AXN/Page/CreateOrEdit/TabInfo/TrackingCode.js +1 -1
  16. package/lib/ACM-AXN/Statistics/ControlPanel.js +1 -1
  17. package/lib/ACM-AXN/StatisticsByProvince/DataTable.js +1 -1
  18. package/lib/ACM-AXN/TaskScheduler/CreateOrEdit.js +1 -1
  19. package/lib/ACM-AXN/Template/Container.js +1 -1
  20. package/lib/ACM-AXN/ViewTemplate/common.d.ts +2 -1
  21. package/lib/ACM-AXN/ViewTemplate/common.js +47 -7
  22. package/lib/AWING/DataForm/DataInput.js +42 -3
  23. package/lib/AWING/DataForm/interface.d.ts +1 -0
  24. package/lib/AWING/DateRangePicker/component.js +1 -0
  25. package/lib/AWING/ultis/validation.js +4 -1
  26. package/lib/Commons/Components/HighlightedCode/MarkdownElement.js +6 -1
  27. package/lib/i18n.js +4 -0
  28. package/lib/translate/en/translation.json +26 -3
  29. package/lib/translate/id/translation.json +28 -5
  30. package/lib/translate/ja/translation.json +37 -14
  31. package/lib/translate/phl/translation.json +893 -0
  32. package/lib/translate/th/translation.json +26 -3
  33. package/lib/translate/vi/translation.json +26 -3
  34. package/package.json +1 -1
@@ -34,18 +34,18 @@ function Container() {
34
34
  return ((0, jsx_runtime_1.jsx)(AWING_1.PageManagement, { title: t('AuthenticationProfile.Title'), inputSearchPlaceholder: t('AuthenticationProfile.SearchPlaceholder'), onChangeQueryInput: getAuthenticationProfile, getRowId: function (obj) { return obj.authenticationProfileId; }, columns: [
35
35
  {
36
36
  field: 'authenticationProfileId',
37
- headerName: 'STT',
37
+ headerName: '#',
38
38
  width: 60,
39
39
  valueGetter: function (_unUse, idx, stt) { return stt; },
40
40
  },
41
41
  {
42
42
  field: 'authenticationMethodCode',
43
- headerName: 'Method Code',
43
+ headerName: t('AuthenticationProfile.MethodCode'),
44
44
  width: 130,
45
45
  },
46
46
  {
47
47
  field: 'apControllerCode',
48
- headerName: (0, jsx_runtime_1.jsx)("b", { children: "AP Controller Code" }),
48
+ headerName: t('AuthenticationProfile.APControllerCode'),
49
49
  width: 170,
50
50
  valueGetter: function (row) {
51
51
  return row.apControllerCode === Utils_1.AP_CONTROLLER_CODE.All ||
@@ -66,7 +66,7 @@ function Container() {
66
66
  },
67
67
  {
68
68
  field: 'parameters',
69
- headerName: 'Params',
69
+ headerName: t('AuthenticationProfile.Params'),
70
70
  dynamicTableCellProps: function () {
71
71
  return {
72
72
  style: { wordBreak: 'break-all' },
@@ -76,7 +76,7 @@ var CreateOrEdit = function () {
76
76
  {
77
77
  fieldName: 'authenticationMethodCode',
78
78
  type: 'autocomplete',
79
- label: 'Authentication Method code',
79
+ label: t('AuthenticationProfile.MethodCode'),
80
80
  required: true,
81
81
  defaultValue: Utils_1.AUTHENTICATION_METHOD_CODE.MethodByLocalAP,
82
82
  options: Object.entries(Utils_1.AUTHENTICATION_METHOD_CODE).map(function (_a) {
@@ -90,7 +90,7 @@ var CreateOrEdit = function () {
90
90
  {
91
91
  fieldName: 'apControllerCode',
92
92
  type: 'autocomplete',
93
- label: 'AP Controller Code',
93
+ label: t('AuthenticationProfile.APControllerCode'),
94
94
  required: true,
95
95
  options: apControllers,
96
96
  defaultValue: null,
@@ -47,6 +47,7 @@ var recoil_1 = require("recoil");
47
47
  var AWING_1 = require("../../../AWING");
48
48
  var Recoils_1 = require("./Recoils");
49
49
  var i18n_1 = __importDefault(require("../../../i18n"));
50
+ var Utils_1 = require("../Utils");
50
51
  var Infomation = function () {
51
52
  var directories = (0, recoil_1.useRecoilValue)(Recoils_1.directoriesState);
52
53
  var attributes = (0, recoil_1.useRecoilValue)(Recoils_1.attributesState);
@@ -58,7 +59,8 @@ var Infomation = function () {
58
59
  if (!campaign.directoryId) {
59
60
  setCampaignModel((0, immer_1.produce)(function (draft) {
60
61
  var _a;
61
- draft.campaign.directoryId = ((_a = (0, lodash_1.minBy)(directories, 'level')) === null || _a === void 0 ? void 0 : _a.directoryId) || '';
62
+ draft.campaign.directoryId =
63
+ ((_a = (0, lodash_1.minBy)(directories, 'level')) === null || _a === void 0 ? void 0 : _a.directoryId) || '';
62
64
  }));
63
65
  }
64
66
  // eslint-disable-next-line react-hooks/exhaustive-deps
@@ -66,7 +68,9 @@ var Infomation = function () {
66
68
  var handleUpdate = (0, react_1.useCallback)(function (obj, formValid, fieldUpdate) {
67
69
  if (fieldUpdate) {
68
70
  if (fieldUpdate === 'attributeIds') {
69
- setCampaignAttributes(obj['attributeIds'].map(function (item) { return ({ attributeId: item }); }));
71
+ setCampaignAttributes(obj['attributeIds'].map(function (item) { return ({
72
+ attributeId: item,
73
+ }); }));
70
74
  }
71
75
  else {
72
76
  setCampaign(function (prev) { return (__assign(__assign({}, prev), obj)); });
@@ -107,7 +111,19 @@ var Infomation = function () {
107
111
  value: attribute.id,
108
112
  text: attribute.name,
109
113
  }); }),
110
- });
114
+ }),
115
+ // add field password
116
+ fields.push({
117
+ fieldName: 'password',
118
+ type: 'password',
119
+ label: t('Campaign.Password.Title'),
120
+ length: 100,
121
+ helperText: t('Campaign.Password.PasswordNotMatch'),
122
+ disabled: !campaign.canModify,
123
+ onGeneratePassword: function () {
124
+ return (0, Utils_1.generateValidPassword)();
125
+ }
126
+ });
111
127
  }
112
128
  return fields;
113
129
  }, [attributes, directories, t]);
@@ -0,0 +1,9 @@
1
+ export interface PasswordDialogProps {
2
+ open: boolean;
3
+ onConfirm: (password: string) => void;
4
+ onCancel: () => void;
5
+ errorExport?: string;
6
+ resetErrorExport?: () => void;
7
+ }
8
+ declare const PasswordDialog: (props: PasswordDialogProps) => import("react/jsx-runtime").JSX.Element;
9
+ export default PasswordDialog;
@@ -0,0 +1,56 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ var jsx_runtime_1 = require("react/jsx-runtime");
7
+ var react_1 = require("react");
8
+ var material_1 = require("@mui/material");
9
+ var react_i18next_1 = require("react-i18next");
10
+ var i18n_1 = __importDefault(require("../../../../../i18n"));
11
+ var Visibility_1 = __importDefault(require("@mui/icons-material/Visibility"));
12
+ var VisibilityOff_1 = __importDefault(require("@mui/icons-material/VisibilityOff"));
13
+ // Component dialog nhập mật khẩu sử dụng MUI
14
+ var PasswordDialog = function (props) {
15
+ var open = props.open, onConfirm = props.onConfirm, onCancel = props.onCancel, errorExport = props.errorExport, resetErrorExport = props.resetErrorExport;
16
+ var t = (0, react_i18next_1.useTranslation)(undefined, { i18n: i18n_1.default }).t;
17
+ var _a = (0, react_1.useState)(''), password = _a[0], setPassword = _a[1];
18
+ var _b = (0, react_1.useState)(false), showPassword = _b[0], setShowPassword = _b[1];
19
+ var handleConfirm = function () {
20
+ onConfirm(password);
21
+ };
22
+ var handleCancel = function () {
23
+ onCancel();
24
+ setPassword('');
25
+ if (resetErrorExport)
26
+ resetErrorExport();
27
+ };
28
+ var handleKeyDown = function (e) {
29
+ if (e.key === 'Enter') {
30
+ handleConfirm();
31
+ }
32
+ };
33
+ var handlePasswordChange = function (e) {
34
+ setPassword(e.target.value);
35
+ if (resetErrorExport)
36
+ resetErrorExport();
37
+ };
38
+ var handleClickShowPassword = function () {
39
+ setShowPassword(!showPassword);
40
+ };
41
+ var handleMouseDownPassword = function (event) {
42
+ event.preventDefault();
43
+ };
44
+ (0, react_1.useEffect)(function () {
45
+ // Reset password when dialog opens
46
+ if (open) {
47
+ setPassword('');
48
+ if (resetErrorExport)
49
+ resetErrorExport();
50
+ }
51
+ }, [open]);
52
+ return ((0, jsx_runtime_1.jsxs)(material_1.Dialog, { open: open, onClose: handleCancel, "aria-labelledby": "password-dialog-title", children: [(0, jsx_runtime_1.jsx)(material_1.DialogTitle, { id: "password-dialog-title", children: t('Campaign.Password.DialogTitle') }), (0, jsx_runtime_1.jsxs)(material_1.DialogContent, { children: [(0, jsx_runtime_1.jsx)(material_1.DialogContentText, { children: t('Campaign.Password.DialogMessage') }), (0, jsx_runtime_1.jsx)(material_1.TextField, { autoFocus: true, margin: "dense", type: showPassword ? 'text' : 'password', fullWidth: true, variant: "outlined", value: password, onChange: handlePasswordChange, onKeyDown: handleKeyDown, error: !!errorExport, helperText: errorExport || '', autoComplete: "new-password", InputProps: {
53
+ endAdornment: ((0, jsx_runtime_1.jsx)(material_1.InputAdornment, { position: "end", children: (0, jsx_runtime_1.jsx)(material_1.IconButton, { "aria-label": "toggle password visibility", onClick: handleClickShowPassword, onMouseDown: handleMouseDownPassword, edge: "end", children: showPassword ? ((0, jsx_runtime_1.jsx)(VisibilityOff_1.default, {})) : ((0, jsx_runtime_1.jsx)(Visibility_1.default, {})) }) })),
54
+ } })] }), (0, jsx_runtime_1.jsxs)(material_1.DialogActions, { children: [(0, jsx_runtime_1.jsx)(material_1.Button, { onClick: handleCancel, color: "secondary", children: t('Common.Cancel') }), (0, jsx_runtime_1.jsx)(material_1.Button, { onClick: handleConfirm, color: "primary", variant: "contained", children: t('Common.Confirm') })] })] }));
55
+ };
56
+ exports.default = PasswordDialog;
@@ -5,3 +5,15 @@ export declare function convertToExportData(data: AnalyticEvent[], places: NonNu
5
5
  columns: string[];
6
6
  data: string[][];
7
7
  }[];
8
+ /**
9
+ * Mã hóa password sang định dạng Base64
10
+ * @param password Chuỗi password cần mã hóa
11
+ * @returns Chuỗi Base64 đã mã hóa
12
+ */
13
+ export declare function encodePassword(password: string): string;
14
+ /**
15
+ * Giải mã password từ định dạng Base64
16
+ * @param encodedPassword Chuỗi Base64 cần giải mã
17
+ * @returns Chuỗi password gốc
18
+ */
19
+ export declare function decodePassword(encodedPassword: string): string;
@@ -43,7 +43,7 @@ var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
43
43
  return to.concat(ar || Array.prototype.slice.call(from));
44
44
  };
45
45
  Object.defineProperty(exports, "__esModule", { value: true });
46
- exports.convertToExportData = exports.convertEventData = void 0;
46
+ exports.decodePassword = exports.encodePassword = exports.convertToExportData = exports.convertEventData = void 0;
47
47
  var Helpers_1 = require("../../../../../Utils/Helpers");
48
48
  var lodash_1 = __importStar(require("lodash"));
49
49
  var Utils_1 = require("../Utils");
@@ -96,3 +96,21 @@ function convertToExportData(data, places) {
96
96
  ];
97
97
  }
98
98
  exports.convertToExportData = convertToExportData;
99
+ /**
100
+ * Mã hóa password sang định dạng Base64
101
+ * @param password Chuỗi password cần mã hóa
102
+ * @returns Chuỗi Base64 đã mã hóa
103
+ */
104
+ function encodePassword(password) {
105
+ return Buffer.from(password).toString('base64');
106
+ }
107
+ exports.encodePassword = encodePassword;
108
+ /**
109
+ * Giải mã password từ định dạng Base64
110
+ * @param encodedPassword Chuỗi Base64 cần giải mã
111
+ * @returns Chuỗi password gốc
112
+ */
113
+ function decodePassword(encodedPassword) {
114
+ return Buffer.from(encodedPassword, 'base64').toString('utf8');
115
+ }
116
+ exports.decodePassword = decodePassword;
@@ -46,11 +46,21 @@ var react_1 = __importStar(require("react"));
46
46
  var Context_1 = __importDefault(require("../Context"));
47
47
  var Util_1 = require("./Util");
48
48
  var component_1 = __importDefault(require("./component"));
49
+ var recoil_1 = require("recoil");
50
+ var Recoils_1 = require("../../Recoils");
51
+ var PasswordDialog_1 = __importDefault(require("./PasswordDialog"));
52
+ var react_i18next_1 = require("react-i18next");
53
+ var i18n_1 = __importDefault(require("../../../../../i18n"));
49
54
  var EventContainer = function (props) {
50
55
  var campaignId = props.campaignId, startDate = props.startDate, endDate = props.endDate, subCampaigns = props.subCampaigns, domains = props.domains;
51
56
  var client = (0, Context_1.default)().services;
52
57
  var _a = react_1.default.useState(true), isLoading = _a[0], setIsLoading = _a[1];
53
58
  var _b = react_1.default.useState([]), eventData = _b[0], setEventData = _b[1];
59
+ var _c = react_1.default.useState(false), openPasswordDialog = _c[0], setOpenPasswordDialog = _c[1];
60
+ var _d = react_1.default.useState(null), currentExportParams = _d[0], setCurrentExportParams = _d[1];
61
+ var t = (0, react_i18next_1.useTranslation)(undefined, { i18n: i18n_1.default }).t;
62
+ var _e = react_1.default.useState(undefined), errrorExport = _e[0], setErrorExport = _e[1];
63
+ var campaignInfo = (0, recoil_1.useRecoilValue)(Recoils_1.campaignState);
54
64
  var placesOfCampaign = (0, react_1.useMemo)(function () {
55
65
  var result = [];
56
66
  subCampaigns.forEach(function (sub) {
@@ -73,9 +83,7 @@ var EventContainer = function (props) {
73
83
  startDate: (0, moment_1.default)(time.startDate).format(Enum_1.DATE_FORMAT),
74
84
  endDate: (0, moment_1.default)(time.endDate).format(Enum_1.DATE_FORMAT),
75
85
  timelineType: Enum_2.TimelineType.Day,
76
- campaignAdGroups: [
77
- __assign({ campaignId: campaignId }, ids),
78
- ],
86
+ campaignAdGroups: [__assign({ campaignId: campaignId }, ids)],
79
87
  analyticGroupBies: [
80
88
  Enum_2.AnalyticGroupBy.GbEventLabel,
81
89
  Enum_2.AnalyticGroupBy.GbTimeline,
@@ -86,26 +94,69 @@ var EventContainer = function (props) {
86
94
  .then(function (res) { return setEventData((0, Util_1.convertEventData)(res)); })
87
95
  .finally(function () { return setIsLoading(false); });
88
96
  };
89
- var exportData = function (time, placeIds, ids) {
90
- var places = placeIds.length ? placesOfCampaign.filter(function (p) {
91
- return placeIds.includes(p.placeId);
92
- }) : placesOfCampaign;
97
+ // Hàm này được tách riêng để có thể gọi từ callback của PasswordDialog
98
+ var handleExportWithParams = function (time, placeIds, ids, campaignPassword) {
99
+ var places = placeIds.length
100
+ ? placesOfCampaign.filter(function (p) { return placeIds.includes(p.placeId); })
101
+ : placesOfCampaign;
93
102
  return client
94
103
  .campaignStatisticGetEvents({
95
104
  startDate: (0, moment_1.default)(time.startDate).format(Enum_1.DATE_FORMAT),
96
105
  endDate: (0, moment_1.default)(time.endDate).format(Enum_1.DATE_FORMAT),
97
106
  timelineType: Enum_2.TimelineType.Day,
98
- campaignAdGroups: [
99
- __assign({ campaignId: campaignId }, ids),
100
- ],
107
+ campaignAdGroups: [__assign({ campaignId: campaignId }, ids)],
101
108
  analyticGroupBies: Object.values(Enum_2.AnalyticGroupBy).filter(function (g) { return !isNaN(Number(g)); }),
102
109
  ignoredEventLabels: Object.values(Enum_1.BaseEvent),
103
110
  placeIds: placeIds,
111
+ campaignPasswords: [
112
+ {
113
+ campaignId: campaignId,
114
+ password: campaignPassword,
115
+ },
116
+ ],
104
117
  })
105
118
  .then(function (res) {
119
+ setOpenPasswordDialog(false);
120
+ setErrorExport(undefined); // Reset error message on successful export
106
121
  (0, exportFile_1.downloadWithDataSet)("export_analytic_event_campaign_".concat(campaignId), (0, Util_1.convertToExportData)(res, places));
122
+ })
123
+ .catch(function (error) {
124
+ var _a;
125
+ if ((_a = error.response) === null || _a === void 0 ? void 0 : _a.data.includes('Invalid password')) {
126
+ setErrorExport(t('Campaign.Password.ErrorMessage'));
127
+ }
107
128
  });
108
129
  };
109
- return ((0, jsx_runtime_1.jsx)(component_1.default, { startDate: startDate, endDate: endDate, subCampaigns: subCampaigns, isLoading: isLoading, eventData: eventData, getEventData: getEventData, exportData: exportData, domains: domains }));
130
+ var exportData = function (time, placeIds, ids) {
131
+ // Lưu lại các tham số xuất dữ liệu để sử dụng sau khi xác thực mật khẩu
132
+ setCurrentExportParams({ time: time, placeIds: placeIds, ids: ids });
133
+ // Check if campaign has password protection
134
+ if ((campaignInfo === null || campaignInfo === void 0 ? void 0 : campaignInfo.password) && campaignInfo.hasPassword) {
135
+ setOpenPasswordDialog(true);
136
+ // Return a promise that will be resolved by the dialog callbacks
137
+ return new Promise(function (resolve) {
138
+ // This promise will be handled by the dialog callbacks
139
+ // The actual export will happen in the onConfirm callback if password is correct
140
+ resolve(true);
141
+ });
142
+ }
143
+ else {
144
+ // No password required
145
+ return handleExportWithParams(time, placeIds, ids);
146
+ }
147
+ };
148
+ // Xử lý khi xác nhận mật khẩu thành công
149
+ var handlePasswordConfirm = function (password) {
150
+ // setOpenPasswordDialog(false)
151
+ if (password && currentExportParams) {
152
+ var time = currentExportParams.time, placeIds = currentExportParams.placeIds, ids = currentExportParams.ids;
153
+ handleExportWithParams(time, placeIds, ids, password);
154
+ }
155
+ };
156
+ var resetErrorExport = function () {
157
+ if (errrorExport) // Only reset if there is an error
158
+ setErrorExport(undefined);
159
+ };
160
+ return ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsx)(component_1.default, { startDate: startDate, endDate: endDate, subCampaigns: subCampaigns, isLoading: isLoading, eventData: eventData, getEventData: getEventData, exportData: exportData, domains: domains }), (0, jsx_runtime_1.jsx)(PasswordDialog_1.default, { open: openPasswordDialog, onConfirm: handlePasswordConfirm, onCancel: function () { return setOpenPasswordDialog(false); }, errorExport: errrorExport, resetErrorExport: resetErrorExport })] }));
110
161
  };
111
162
  exports.default = EventContainer;
@@ -57,6 +57,9 @@ export type Campaign = {
57
57
  directoryPath?: string;
58
58
  name: string;
59
59
  createdDate?: Timestamp;
60
+ password?: string;
61
+ canModify?: boolean;
62
+ hasPassword?: boolean;
60
63
  };
61
64
  export type CampaignGroupModel = {
62
65
  campaignGroup: CampaignGroup;
@@ -140,3 +140,4 @@ export declare const getCampaignStatus: (isAcm?: boolean) => {
140
140
  key: string;
141
141
  value: number;
142
142
  }[];
143
+ export declare function generateValidPassword(length?: number): string;
@@ -12,7 +12,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
12
12
  return (mod && mod.__esModule) ? mod : { "default": mod };
13
13
  };
14
14
  Object.defineProperty(exports, "__esModule", { value: true });
15
- exports.getCampaignStatus = exports.adAnalyticType = exports.CampaignType = exports.ageRangeValueToText = exports.RuleAgeRange = exports.DEMO_GRAPHIC_AGE_RANGE = exports.getDescription = exports.isAdActive = exports.RuleGender = exports.RuleTypeOfCalculatorAXN = exports.RuleTypeOfCalculator = exports.RuleType = exports.nextChar = exports.getName = exports.getDefaultRule = exports.bonusValid = exports.bookingValid = exports.adsClassCValid = exports.groupClassCValid = exports.groupClassBValid = exports.campaignAdsValid = exports.ruleValid = exports.verifyExpr = exports.advancedValid = exports.weightsValid = exports.placeFilterValid = exports.dateRangeValid = exports.pageValid = exports.campaignAdValid = exports.validateAnalyticTypes = exports.checkValidUrl = exports.tabPartnerValid = exports.tabInfomationValid = exports.attributesValid = exports.nameValid = exports.directoryValid = exports.advancedSearchFormatDate = exports.getCampaignPriority = exports.checkCampaignIsRunning = exports.formatListCampaign = exports.getTotalBooking = exports.checkPriority = exports.getIndexPriority = void 0;
15
+ exports.generateValidPassword = exports.getCampaignStatus = exports.adAnalyticType = exports.CampaignType = exports.ageRangeValueToText = exports.RuleAgeRange = exports.DEMO_GRAPHIC_AGE_RANGE = exports.getDescription = exports.isAdActive = exports.RuleGender = exports.RuleTypeOfCalculatorAXN = exports.RuleTypeOfCalculator = exports.RuleType = exports.nextChar = exports.getName = exports.getDefaultRule = exports.bonusValid = exports.bookingValid = exports.adsClassCValid = exports.groupClassCValid = exports.groupClassBValid = exports.campaignAdsValid = exports.ruleValid = exports.verifyExpr = exports.advancedValid = exports.weightsValid = exports.placeFilterValid = exports.dateRangeValid = exports.pageValid = exports.campaignAdValid = exports.validateAnalyticTypes = exports.checkValidUrl = exports.tabPartnerValid = exports.tabInfomationValid = exports.attributesValid = exports.nameValid = exports.directoryValid = exports.advancedSearchFormatDate = exports.getCampaignPriority = exports.checkCampaignIsRunning = exports.formatListCampaign = exports.getTotalBooking = exports.checkPriority = exports.getIndexPriority = void 0;
16
16
  var Enum_1 = require("./Enum");
17
17
  var Helpers_1 = require("../../Utils/Helpers");
18
18
  var i18n_1 = __importDefault(require("../../i18n"));
@@ -652,3 +652,34 @@ var getCampaignStatus = function (isAcm) {
652
652
  }
653
653
  };
654
654
  exports.getCampaignStatus = getCampaignStatus;
655
+ function generateValidPassword(length) {
656
+ var _a;
657
+ if (length === void 0) { length = 12; }
658
+ var upperCase = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
659
+ var lowerCase = 'abcdefghijklmnopqrstuvwxyz';
660
+ var numbers = '0123456789';
661
+ var specialChars = '#?!@$%^&*-';
662
+ var allChars = upperCase + lowerCase + numbers + specialChars;
663
+ if (length < 8) {
664
+ throw new Error("Password length must be at least 8 characters.");
665
+ }
666
+ var getRandomChar = function (chars) { return chars[Math.floor(Math.random() * chars.length)]; };
667
+ // Ensure each required character is included at least once
668
+ var requiredChars = [
669
+ getRandomChar(upperCase),
670
+ getRandomChar(lowerCase),
671
+ getRandomChar(numbers),
672
+ getRandomChar(specialChars)
673
+ ];
674
+ // Fill the rest of the password with random characters from all sets
675
+ var remainingLength = length - requiredChars.length;
676
+ var remainingChars = Array.from({ length: remainingLength }, function () { return getRandomChar(allChars); });
677
+ // Combine and shuffle the characters
678
+ var passwordArray = __spreadArray(__spreadArray([], requiredChars, true), remainingChars, true);
679
+ for (var i = passwordArray.length - 1; i > 0; i--) {
680
+ var j = Math.floor(Math.random() * (i + 1));
681
+ _a = [passwordArray[j], passwordArray[i]], passwordArray[i] = _a[0], passwordArray[j] = _a[1];
682
+ }
683
+ return passwordArray.join('');
684
+ }
685
+ exports.generateValidPassword = generateValidPassword;
@@ -46,7 +46,7 @@ function Filters(props) {
46
46
  setCampaign(function (oldData) { return __spreadArray(__spreadArray([], oldData, true), data, true); });
47
47
  });
48
48
  // eslint-disable-next-line react-hooks/exhaustive-deps
49
- }, []);
49
+ }, [t]);
50
50
  var reserveTypes = (0, react_1.useMemo)(function () { return [
51
51
  {
52
52
  id: 0,
@@ -4,6 +4,10 @@ export type Timestamp = {
4
4
  seconds: number;
5
5
  nanos: number;
6
6
  };
7
+ export interface CampaignPasswordDTO {
8
+ campaignId?: string;
9
+ password?: string | undefined;
10
+ }
7
11
  export interface IStatisticDTO {
8
12
  startDate: string;
9
13
  endDate: string;
@@ -13,4 +17,5 @@ export interface IStatisticDTO {
13
17
  analyticGroupBies?: AnalyticGroupBy[] | undefined;
14
18
  includedEventLabels?: string[] | undefined;
15
19
  ignoredEventLabels?: string[] | undefined;
20
+ campaignPasswords?: CampaignPasswordDTO[] | undefined;
16
21
  }
@@ -53,6 +53,7 @@ var FormHoliday = function (props) {
53
53
  label: t('HolidayForm.CalendarType'),
54
54
  required: true,
55
55
  type: 'select',
56
+ defaultValue: Utils_1.CALENDAR_TYPE.SOLAR,
56
57
  options: Object.entries(Utils_1.CALENDAR_TYPE).map(function (_a) {
57
58
  var key = _a[0], value = _a[1];
58
59
  return ({
@@ -56,7 +56,7 @@ var TrackingCode = function () {
56
56
  setCommonHtml(html);
57
57
  setTrackingCode({ code: '', type: '' });
58
58
  };
59
- return ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsxs)(material_1.Grid, { container: true, sx: { pt: 2 }, spacing: 2, children: [(0, jsx_runtime_1.jsx)(material_1.Grid, { item: true, xs: 5, children: (0, jsx_runtime_1.jsx)(material_1.TextField, { variant: "standard", label: "Tracking code", fullWidth: true, name: "code", value: trackingCode.code, onChange: handleChangeTracking, error: !validTracking.code, helperText: !validTracking.code
59
+ return ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsxs)(material_1.Grid, { container: true, sx: { pt: 2 }, spacing: 2, children: [(0, jsx_runtime_1.jsx)(material_1.Grid, { item: true, xs: 5, children: (0, jsx_runtime_1.jsx)(material_1.TextField, { variant: "standard", label: t('Page.TrackingCode'), fullWidth: true, name: "code", value: trackingCode.code, onChange: handleChangeTracking, error: !validTracking.code, helperText: !validTracking.code
60
60
  ? t('Page.TrackingCodeValid')
61
61
  : '' }) }), (0, jsx_runtime_1.jsx)(material_1.Grid, { item: true, xs: 4, children: (0, jsx_runtime_1.jsx)(material_1.TextField, { select: true, fullWidth: true, label: t('Page.TypeTrackingCode'), name: "type", value: trackingCode.type, id: "directoryId", onChange: handleChangeTracking, variant: "standard", error: !validTracking.type, helperText: !validTracking.type
62
62
  ? t('Page.TypeTrackingCodeValid')
@@ -208,7 +208,7 @@ function ControlPanel(_a) {
208
208
  }, []);
209
209
  (0, react_1.useEffect)(function () {
210
210
  handleElementInput(initialFilters);
211
- }, [initialFilters, queryInput]);
211
+ }, [initialFilters, queryInput, t]);
212
212
  (0, react_1.useEffect)(function () {
213
213
  var tmpQueryInput = queryInput;
214
214
  if (!tmpQueryInput) {
@@ -105,7 +105,7 @@ var DataTable = function (props) {
105
105
  : row[headCellItem
106
106
  .id] }));
107
107
  }) }));
108
- })) })) : ((0, jsx_runtime_1.jsx)(NoDataTable_1.default, { colSpan: (headCells === null || headCells === void 0 ? void 0 : headCells.length) + 1 }))] }), rowsData && (rowsData === null || rowsData === void 0 ? void 0 : rowsData.length) > 0 && isPagination && ((0, jsx_runtime_1.jsx)(material_1.TablePagination, { rowsPerPageOptions: [
108
+ })) })) : ((0, jsx_runtime_1.jsx)(NoDataTable_1.default, { colSpan: (headCells === null || headCells === void 0 ? void 0 : headCells.length) + 1 }))] }), rowsData && (rowsData === null || rowsData === void 0 ? void 0 : rowsData.length) > 0 && isPagination && ((0, jsx_runtime_1.jsx)(AWING_1.Pagination, { rowsPerPageOptions: [
109
109
  AWING_1.PAGE_SIZE_DEFAULT,
110
110
  AWING_1.PAGE_SIZE_DEFAULT + 10,
111
111
  AWING_1.PAGE_SIZE_DEFAULT + 20,
@@ -145,7 +145,7 @@ var CreateOrEdit = function () {
145
145
  ? { cronTime: '* * * * *' }
146
146
  : { triggerTopic: '', triggerEvent: '' }))); });
147
147
  };
148
- return ((0, jsx_runtime_1.jsx)(ClassicDrawer_1.default, { title: t("Common.".concat(taskId ? 'Edit' : 'Create')), onSubmit: handleSubmit, disableButtonSubmit: !enableSubmit, confirmExit: confirmExit, childrenWrapperStyle: { padding: function (theme) { return theme.spacing(3); } }, children: loading ? ((0, jsx_runtime_1.jsx)(AWING_1.CircularProgress, {})) : ((0, jsx_runtime_1.jsxs)(material_1.Grid, { container: true, component: material_1.Paper, sx: { p: 2 }, children: [(0, jsx_runtime_1.jsx)(material_1.Grid, { item: true, xs: 12, children: (0, jsx_runtime_1.jsx)(BasicInput_1.default, { name: "name", label: t('Common.Name'), fullWidth: true, variant: "standard", checkValid: validation_1.textValidation, value: jobModel.name, onChange: handleChange }) }), (0, jsx_runtime_1.jsx)(material_1.Grid, { item: true, xs: 12, children: (0, jsx_runtime_1.jsxs)(material_1.Grid, { container: true, style: { marginTop: '20px', marginBottom: '20px' }, children: [(0, jsx_runtime_1.jsx)(material_1.Grid, { item: true, xs: 4, style: { paddingRight: '10px' }, children: (0, jsx_runtime_1.jsx)(BasicInput_1.default, { fullWidth: true, select: true, required: false, name: "jobType", variant: "standard", label: t('TaskScheduler.JobType'), onChange: handleChangeJobType, value: jobModel.jobType, children: Utils_1.JobTypes.map(function (item) { return ((0, jsx_runtime_1.jsx)(material_1.MenuItem, { value: item.name, children: item.name }, item.name)); }) }) }), (0, jsx_runtime_1.jsx)(material_1.Grid, { item: true, xs: 8, children: (0, jsx_runtime_1.jsx)(material_1.Box, { component: JobInput[jobModel.jobType], jobModel: jobModel, handleChange: handleChange }) })] }) }), (0, jsx_runtime_1.jsx)(material_1.Grid, { item: true, xs: 12, children: (0, jsx_runtime_1.jsxs)(material_1.Grid, { container: true, children: [(0, jsx_runtime_1.jsx)(material_1.Grid, { item: true, xs: 4, style: { paddingRight: '10px' }, children: (0, jsx_runtime_1.jsx)(BasicInput_1.default, { fullWidth: true, select: true, name: "jobAction", label: t('TaskScheduler.JobAction'),
148
+ return ((0, jsx_runtime_1.jsx)(ClassicDrawer_1.default, { title: t("Common.".concat(taskId ? 'Edit' : 'Create')), onSubmit: handleSubmit, disableButtonSubmit: !enableSubmit, confirmExit: confirmExit, childrenWrapperStyle: { padding: function (theme) { return theme.spacing(3); } }, children: loading ? ((0, jsx_runtime_1.jsx)(AWING_1.CircularProgress, {})) : ((0, jsx_runtime_1.jsxs)(material_1.Grid, { container: true, component: material_1.Paper, sx: { p: 2 }, children: [(0, jsx_runtime_1.jsx)(material_1.Grid, { item: true, xs: 12, children: (0, jsx_runtime_1.jsx)(BasicInput_1.default, { name: "name", label: t('Common.Name'), fullWidth: true, variant: "standard", checkValid: validation_1.textValidation, value: jobModel.name, onChange: handleChange }) }), (0, jsx_runtime_1.jsx)(material_1.Grid, { item: true, xs: 12, children: (0, jsx_runtime_1.jsxs)(material_1.Grid, { container: true, style: { marginTop: '20px', marginBottom: '20px' }, children: [(0, jsx_runtime_1.jsx)(material_1.Grid, { item: true, xs: 4, style: { paddingRight: '10px' }, children: (0, jsx_runtime_1.jsx)(BasicInput_1.default, { fullWidth: true, select: true, required: false, name: "jobType", variant: "standard", label: t('TaskScheduler.JobType'), onChange: handleChangeJobType, value: jobModel.jobType, children: Utils_1.JobTypes.map(function (item) { return ((0, jsx_runtime_1.jsx)(material_1.MenuItem, { value: item.name, children: t("TaskScheduler.Type.".concat(item.name)) }, item.name)); }) }) }), (0, jsx_runtime_1.jsx)(material_1.Grid, { item: true, xs: 8, children: (0, jsx_runtime_1.jsx)(material_1.Box, { component: JobInput[jobModel.jobType], jobModel: jobModel, handleChange: handleChange }) })] }) }), (0, jsx_runtime_1.jsx)(material_1.Grid, { item: true, xs: 12, children: (0, jsx_runtime_1.jsxs)(material_1.Grid, { container: true, children: [(0, jsx_runtime_1.jsx)(material_1.Grid, { item: true, xs: 4, style: { paddingRight: '10px' }, children: (0, jsx_runtime_1.jsx)(BasicInput_1.default, { fullWidth: true, select: true, name: "jobAction", label: t('TaskScheduler.JobAction'),
149
149
  // isError={Boolean(jobValid?.jobActionValid)}
150
150
  onChange: function (_k, name) {
151
151
  handleJobActionChange(jobActions.filter(function (x) { return x.name === name; })[0]);
@@ -56,7 +56,7 @@ var TemplateContainer = function () {
56
56
  },
57
57
  {
58
58
  field: 'PageCode',
59
- headerName: 'PageCode',
59
+ headerName: t('Common.TypePage'),
60
60
  valueGetter: function (row) {
61
61
  return t("TemplateManagement.Page_".concat(['wlc', 'lgn'].includes(row.pageCode) ? row.pageCode : row.pageCode === '0' ? 'wlc' : 'lgn'));
62
62
  },
@@ -1,7 +1,8 @@
1
- import { Configs } from "./interface";
1
+ import { Configs } from './interface';
2
2
  export declare const fillConfigs: (input: any) => any;
3
3
  export declare const isJSON: (value: any) => boolean;
4
4
  export declare const getValueByPath: (object: any, path: string) => any;
5
+ export declare const runScriptSandBox: (params: any[], script: string) => Promise<any>;
5
6
  export declare const runScript: (params: any[], script: string) => Promise<unknown>;
6
7
  export declare const convertRelativeLink: (link: string, pagePath: string, templateId: string, configs: Configs) => string;
7
8
  export declare const generateRandomInteger: (max: number) => number;
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.generateRandomInteger = exports.convertRelativeLink = exports.runScript = exports.getValueByPath = exports.isJSON = exports.fillConfigs = void 0;
3
+ exports.generateRandomInteger = exports.convertRelativeLink = exports.runScript = exports.runScriptSandBox = exports.getValueByPath = exports.isJSON = exports.fillConfigs = void 0;
4
4
  var Enum_1 = require("./Enum");
5
5
  var constant_1 = require("./constant");
6
6
  var fillConfigs = function (input) {
@@ -15,12 +15,12 @@ var fillConfigs = function (input) {
15
15
  };
16
16
  exports.fillConfigs = fillConfigs;
17
17
  var isJSON = function (value) {
18
- if (typeof value !== "string")
18
+ if (typeof value !== 'string')
19
19
  return false;
20
20
  try {
21
21
  var result = JSON.parse(value);
22
22
  var type = Object.prototype.toString.call(result);
23
- return type === "[object Object]" || type === "[object Array]";
23
+ return type === '[object Object]' || type === '[object Array]';
24
24
  }
25
25
  catch (err) {
26
26
  return false;
@@ -28,14 +28,52 @@ var isJSON = function (value) {
28
28
  };
29
29
  exports.isJSON = isJSON;
30
30
  var getValueByPath = function (object, path) {
31
- var keys = path.split(".");
31
+ var keys = path.split('.');
32
32
  var result = object;
33
33
  for (var i = 0; i < keys.length; i++) {
34
- result = (result === null || result === void 0 ? void 0 : result[keys[i]]) || "";
34
+ result = (result === null || result === void 0 ? void 0 : result[keys[i]]) || '';
35
35
  }
36
36
  return result;
37
37
  };
38
38
  exports.getValueByPath = getValueByPath;
39
+ var runScriptSandBox = function (params, script) {
40
+ try {
41
+ var sandboxUrl = window.REACT_APP_API_ENDPOINT + '/api/Sandbox';
42
+ return fetch(sandboxUrl, {
43
+ method: 'POST',
44
+ headers: {
45
+ 'Content-Type': 'application/json-patch+json',
46
+ Accept: 'text/plain',
47
+ },
48
+ body: JSON.stringify({
49
+ jsCode: "\n const fn = (function func() {\n ".concat(script, "\n })();\n return fn(").concat(Array.from(params).map(function (i) { return JSON.stringify(i); }), ");\n ").trim(),
50
+ sandboxType: 0,
51
+ }).trim(),
52
+ credentials: 'include',
53
+ })
54
+ .then(function (r) { return r.json(); })
55
+ .then(function (r) { return JSON.parse(r.jsResult); });
56
+ }
57
+ catch (error) {
58
+ console.error('Error running script:', error);
59
+ return Promise.resolve([]);
60
+ }
61
+ // return new Promise((resolve, reject) => {
62
+ // try {
63
+ // // eslint-disable-next-line
64
+ // var scriptFunction = new Function(script)()
65
+ // } catch (error) {
66
+ // scriptFunction = (...params: any[]) => {
67
+ // return new Promise((resolve, reject) => resolve([]))
68
+ // }
69
+ // }
70
+ // scriptFunction(...params).then((result: any[]) => {
71
+ // console.log('Script result:', result)
72
+ // resolve(result)
73
+ // })
74
+ // })
75
+ };
76
+ exports.runScriptSandBox = runScriptSandBox;
39
77
  var runScript = function (params, script) {
40
78
  return new Promise(function (resolve, reject) {
41
79
  try {
@@ -60,9 +98,11 @@ exports.runScript = runScript;
60
98
  var convertRelativeLink = function (link, pagePath, templateId, configs) {
61
99
  var isTemplatePath = link === null || link === void 0 ? void 0 : link.includes(constant_1.ACM_TEMPLATE_PATH);
62
100
  if (isTemplatePath) {
63
- return "".concat(configs.TEMPLATE_FILE_PATH, "/").concat(templateId, "/").concat(link.split("/")[link.split("/").length - 1]);
101
+ return "".concat(configs.TEMPLATE_FILE_PATH, "/").concat(templateId, "/").concat(link.split('/')[link.split('/').length - 1]);
64
102
  }
65
- return (link === null || link === void 0 ? void 0 : link.includes(constant_1.ACM_PAGE_PATH)) ? "".concat(pagePath, "/").concat(link.split("/")[link.split("/").length - 1]) || "" : link;
103
+ return (link === null || link === void 0 ? void 0 : link.includes(constant_1.ACM_PAGE_PATH))
104
+ ? "".concat(pagePath, "/").concat(link.split('/')[link.split('/').length - 1]) || ''
105
+ : link;
66
106
  };
67
107
  exports.convertRelativeLink = convertRelativeLink;
68
108
  var generateRandomInteger = function (max) {