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.
- package/lib/ACM-AXN/AuthenticationProfile/Container.js +4 -4
- package/lib/ACM-AXN/AuthenticationProfile/CreateOrEdit/index.js +2 -2
- package/lib/ACM-AXN/Campaign/CreateOrEdit/TabInfomation.js +19 -3
- package/lib/ACM-AXN/Campaign/CreateOrEdit/TabStatistic/Event/PasswordDialog.d.ts +9 -0
- package/lib/ACM-AXN/Campaign/CreateOrEdit/TabStatistic/Event/PasswordDialog.js +56 -0
- package/lib/ACM-AXN/Campaign/CreateOrEdit/TabStatistic/Event/Util.d.ts +12 -0
- package/lib/ACM-AXN/Campaign/CreateOrEdit/TabStatistic/Event/Util.js +19 -1
- package/lib/ACM-AXN/Campaign/CreateOrEdit/TabStatistic/Event/container.js +62 -11
- package/lib/ACM-AXN/Campaign/Types.d.ts +3 -0
- package/lib/ACM-AXN/Campaign/Utils.d.ts +1 -0
- package/lib/ACM-AXN/Campaign/Utils.js +32 -1
- package/lib/ACM-AXN/CampaignPlan/Filter.js +1 -1
- package/lib/ACM-AXN/Common/Types.d.ts +5 -0
- package/lib/ACM-AXN/Holiday/FormHoliday.js +1 -0
- package/lib/ACM-AXN/Page/CreateOrEdit/TabInfo/TrackingCode.js +1 -1
- package/lib/ACM-AXN/Statistics/ControlPanel.js +1 -1
- package/lib/ACM-AXN/StatisticsByProvince/DataTable.js +1 -1
- package/lib/ACM-AXN/TaskScheduler/CreateOrEdit.js +1 -1
- package/lib/ACM-AXN/Template/Container.js +1 -1
- package/lib/ACM-AXN/ViewTemplate/common.d.ts +2 -1
- package/lib/ACM-AXN/ViewTemplate/common.js +47 -7
- package/lib/AWING/DataForm/DataInput.js +42 -3
- package/lib/AWING/DataForm/interface.d.ts +1 -0
- package/lib/AWING/DateRangePicker/component.js +1 -0
- package/lib/AWING/ultis/validation.js +4 -1
- package/lib/Commons/Components/HighlightedCode/MarkdownElement.js +6 -1
- package/lib/i18n.js +4 -0
- package/lib/translate/en/translation.json +26 -3
- package/lib/translate/id/translation.json +28 -5
- package/lib/translate/ja/translation.json +37 -14
- package/lib/translate/phl/translation.json +893 -0
- package/lib/translate/th/translation.json +26 -3
- package/lib/translate/vi/translation.json +26 -3
- 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: '
|
|
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: '
|
|
43
|
+
headerName: t('AuthenticationProfile.MethodCode'),
|
|
44
44
|
width: 130,
|
|
45
45
|
},
|
|
46
46
|
{
|
|
47
47
|
field: 'apControllerCode',
|
|
48
|
-
headerName: (
|
|
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: '
|
|
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: '
|
|
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 =
|
|
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 ({
|
|
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
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
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
|
-
|
|
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;
|
|
@@ -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:
|
|
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)(
|
|
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: '
|
|
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
|
|
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 !==
|
|
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 ===
|
|
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(
|
|
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))
|
|
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) {
|