awing-library 2.1.214-dev → 2.1.216-dev

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.
@@ -0,0 +1,7 @@
1
+ import { IDetail } from '.';
2
+ interface RowTableProps {
3
+ row: IDetail;
4
+ updateRow?: any;
5
+ }
6
+ export declare function RowTable(props: RowTableProps): import("react/jsx-runtime").JSX.Element;
7
+ export {};
@@ -0,0 +1,61 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.RowTable = void 0;
4
+ var jsx_runtime_1 = require("react/jsx-runtime");
5
+ var material_1 = require("@mui/material");
6
+ var react_1 = require("react");
7
+ function RowTable(props) {
8
+ var _a;
9
+ var row = props.row;
10
+ var optionsState = [
11
+ {
12
+ id: '1',
13
+ name: 'Chờ duyệt',
14
+ },
15
+ {
16
+ id: '2',
17
+ name: 'Duyệt',
18
+ },
19
+ {
20
+ id: '3',
21
+ name: 'Hủy',
22
+ },
23
+ ];
24
+ var _b = (0, react_1.useState)([
25
+ optionsState[0].name,
26
+ ]), personName = _b[0], setPersonName = _b[1];
27
+ var _c = (0, react_1.useState)((_a = row === null || row === void 0 ? void 0 : row.ghichu) !== null && _a !== void 0 ? _a : ''), valueInput = _c[0], setValueInput = _c[1];
28
+ var handleChange = function (event) {
29
+ var value = event.target.value;
30
+ setPersonName(typeof value === 'string' ? value.split(',') : value);
31
+ };
32
+ var ITEM_HEIGHT = 48;
33
+ var ITEM_PADDING_TOP = 8;
34
+ var MenuProps = {
35
+ PaperProps: {
36
+ style: {
37
+ maxHeight: ITEM_HEIGHT * 4.5 + ITEM_PADDING_TOP,
38
+ width: 250,
39
+ },
40
+ },
41
+ };
42
+ return ((0, jsx_runtime_1.jsxs)(material_1.TableRow, { children: [(0, jsx_runtime_1.jsx)(material_1.TableCell, { style: { maxWidth: 400 }, children: (0, jsx_runtime_1.jsx)(material_1.Box, { sx: {
43
+ display: '-webkit-box',
44
+ WebkitLineClamp: 2,
45
+ WebkitBoxOrient: 'vertical',
46
+ overflow: 'hidden',
47
+ textOverflow: 'ellipsis',
48
+ }, children: (0, jsx_runtime_1.jsx)(material_1.Link, { href: row === null || row === void 0 ? void 0 : row.link, sx: {
49
+ wordWrap: 'break-word',
50
+ wordBreak: 'break-all',
51
+ color: 'blue',
52
+ textDecorationColor: 'unset',
53
+ }, target: "_blank", children: row === null || row === void 0 ? void 0 : row.link }) }) }), (0, jsx_runtime_1.jsx)(material_1.TableCell, { children: (0, jsx_runtime_1.jsx)(material_1.Box, { sx: {
54
+ display: 'flex',
55
+ flexWrap: 'wrap',
56
+ gap: '8px',
57
+ }, children: row.subCampaigns.map(function (subCampaign, index) { return ((0, jsx_runtime_1.jsx)(material_1.Chip, { label: subCampaign.name }, index)); }) }) }), (0, jsx_runtime_1.jsx)(material_1.TableCell, { children: (0, jsx_runtime_1.jsx)(material_1.FormControl, { sx: { m: 1, width: 300 }, children: (0, jsx_runtime_1.jsx)(material_1.Select, { value: personName, onChange: handleChange, MenuProps: MenuProps, children: optionsState.map(function (item) { return ((0, jsx_runtime_1.jsx)(material_1.MenuItem, { value: item.name, children: item.name }, item.id)); }) }) }) }), (0, jsx_runtime_1.jsx)(material_1.TableCell, { children: (0, jsx_runtime_1.jsx)(material_1.TextField, { value: valueInput, onChange: function (e) {
58
+ setValueInput(e.target.value);
59
+ } }) })] }));
60
+ }
61
+ exports.RowTable = RowTable;
@@ -0,0 +1,89 @@
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
+ Object.defineProperty(exports, "__esModule", { value: true });
14
+ var jsx_runtime_1 = require("react/jsx-runtime");
15
+ var react_1 = require("@testing-library/react");
16
+ var RowTable_1 = require("./RowTable");
17
+ // Mock the MUI components
18
+ jest.mock('@mui/material', function () { return (__assign(__assign({}, jest.requireActual('@mui/material')), { TableRow: function (_a) {
19
+ var children = _a.children;
20
+ return (0, jsx_runtime_1.jsx)("tr", { children: children });
21
+ }, TableCell: function (_a) {
22
+ var children = _a.children;
23
+ return (0, jsx_runtime_1.jsx)("td", { children: children });
24
+ }, Box: function (_a) {
25
+ var children = _a.children;
26
+ return (0, jsx_runtime_1.jsx)("div", { children: children });
27
+ }, Link: function (_a) {
28
+ var children = _a.children, href = _a.href;
29
+ return (0, jsx_runtime_1.jsx)("a", { href: href, children: children });
30
+ }, Chip: function (_a) {
31
+ var label = _a.label;
32
+ return (0, jsx_runtime_1.jsx)("span", { children: label });
33
+ }, FormControl: function (_a) {
34
+ var children = _a.children;
35
+ return (0, jsx_runtime_1.jsx)("div", { children: children });
36
+ }, Select: function (_a) {
37
+ var children = _a.children, value = _a.value, onChange = _a.onChange;
38
+ return ((0, jsx_runtime_1.jsx)("select", { value: value, onChange: onChange, children: children }));
39
+ }, MenuItem: function (_a) {
40
+ var children = _a.children, value = _a.value;
41
+ return (0, jsx_runtime_1.jsx)("option", { value: value, children: children });
42
+ }, TextField: function (_a) {
43
+ var value = _a.value, onChange = _a.onChange;
44
+ return ((0, jsx_runtime_1.jsx)("input", { type: "text", value: value, onChange: onChange }));
45
+ } })); });
46
+ describe('RowTable', function () {
47
+ var mockRow = {
48
+ link: 'https://example.com',
49
+ subCampaigns: [
50
+ { id: '1', name: 'Campaign 1' },
51
+ { id: '2', name: 'Campaign 2' },
52
+ ],
53
+ ghichu: 'Initial note',
54
+ status: 'Chờ duyệt',
55
+ };
56
+ it('renders the link correctly', function () {
57
+ (0, react_1.render)((0, jsx_runtime_1.jsx)(RowTable_1.RowTable, { row: mockRow }));
58
+ var link = react_1.screen.getByRole('link', { name: 'https://example.com' });
59
+ expect(link).toBeInTheDocument();
60
+ expect(link).toHaveAttribute('href', 'https://example.com');
61
+ });
62
+ it('renders sub-campaigns as chips', function () {
63
+ (0, react_1.render)((0, jsx_runtime_1.jsx)(RowTable_1.RowTable, { row: mockRow }));
64
+ expect(react_1.screen.getByText('Campaign 1')).toBeInTheDocument();
65
+ expect(react_1.screen.getByText('Campaign 2')).toBeInTheDocument();
66
+ });
67
+ it('renders the select with correct initial value', function () {
68
+ (0, react_1.render)((0, jsx_runtime_1.jsx)(RowTable_1.RowTable, { row: mockRow }));
69
+ var select = react_1.screen.getByRole('combobox');
70
+ expect(select).toHaveValue('Chờ duyệt');
71
+ });
72
+ it('changes the select value when a new option is chosen', function () {
73
+ (0, react_1.render)((0, jsx_runtime_1.jsx)(RowTable_1.RowTable, { row: mockRow }));
74
+ var select = react_1.screen.getByRole('combobox');
75
+ react_1.fireEvent.change(select, { target: { value: 'Duyệt' } });
76
+ expect(select).toHaveValue('Duyệt');
77
+ });
78
+ it('renders the text field with the initial note', function () {
79
+ (0, react_1.render)((0, jsx_runtime_1.jsx)(RowTable_1.RowTable, { row: mockRow }));
80
+ var textField = react_1.screen.getByRole('textbox');
81
+ expect(textField).toHaveValue('Initial note');
82
+ });
83
+ it('updates the text field value when typed into', function () {
84
+ (0, react_1.render)((0, jsx_runtime_1.jsx)(RowTable_1.RowTable, { row: mockRow }));
85
+ var textField = react_1.screen.getByRole('textbox');
86
+ react_1.fireEvent.change(textField, { target: { value: 'New note' } });
87
+ expect(textField).toHaveValue('New note');
88
+ });
89
+ });
@@ -0,0 +1,12 @@
1
+ interface ISubCampaign {
2
+ id: number | string;
3
+ name: string;
4
+ }
5
+ export interface IDetail {
6
+ status: string;
7
+ link: string;
8
+ subCampaigns: ISubCampaign[];
9
+ ghichu: string;
10
+ }
11
+ export default function TabApprove(): import("react/jsx-runtime").JSX.Element;
12
+ export {};
@@ -0,0 +1,158 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || function (mod) {
19
+ if (mod && mod.__esModule) return mod;
20
+ var result = {};
21
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
+ __setModuleDefault(result, mod);
23
+ return result;
24
+ };
25
+ var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
26
+ if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
27
+ if (ar || !(i in from)) {
28
+ if (!ar) ar = Array.prototype.slice.call(from, 0, i);
29
+ ar[i] = from[i];
30
+ }
31
+ }
32
+ return to.concat(ar || Array.prototype.slice.call(from));
33
+ };
34
+ var __importDefault = (this && this.__importDefault) || function (mod) {
35
+ return (mod && mod.__esModule) ? mod : { "default": mod };
36
+ };
37
+ Object.defineProperty(exports, "__esModule", { value: true });
38
+ var jsx_runtime_1 = require("react/jsx-runtime");
39
+ var material_1 = require("@mui/material");
40
+ var Hooks_1 = __importDefault(require("../../../../ACM-AXN/Campaign/Hooks"));
41
+ var Constant_1 = require("../../../../ACM-AXN/Common/Constant");
42
+ var lodash_1 = __importDefault(require("lodash"));
43
+ var react_1 = __importStar(require("react"));
44
+ var react_i18next_1 = require("react-i18next");
45
+ var recoil_1 = require("recoil");
46
+ var Recoils_1 = require("../Recoils");
47
+ var atoms_1 = require("../TabSubCampaign/atoms");
48
+ var RowTable_1 = require("./RowTable");
49
+ var Utils_1 = require("../../../../AWING/Form/Utils");
50
+ function TabApprove() {
51
+ var t = (0, react_i18next_1.useTranslation)().t;
52
+ var _a = (0, react_1.useState)([]), rowSelected = _a[0], setRowSelected = _a[1];
53
+ var _b = (0, react_1.useState)([]), domains = _b[0], setDomains = _b[1];
54
+ var ads = (0, recoil_1.useRecoilValue)(atoms_1.adListState);
55
+ var subCampaigns = (0, recoil_1.useRecoilValue)(Recoils_1.campaignGroupsState);
56
+ var _c = (0, Hooks_1.default)(), service = _c.service, defaultDomainId = _c.domainId;
57
+ var domainIds = (0, react_1.useMemo)(function () {
58
+ return lodash_1.default.uniq(ads
59
+ .filter(function (ad) { return ad.places; })
60
+ .map(function (ad) { return ad.places.map(function (x) { return x.domainId; }); })
61
+ .flat()
62
+ .filter(Boolean));
63
+ }, [ads]);
64
+ var renderLinkPreview = function (ad, domainId) {
65
+ if (domainId === void 0) { domainId = defaultDomainId; }
66
+ var url = "".concat(Constant_1.Constants.CAPTIVE_DOMAIN, "/").concat(Constant_1.Constants.PAGE_LOGIN_PREVIEW, "?loginId=").concat(ad.loginId, "&isNetworkCampaign=").concat(Boolean(service.domainsGetAll).toString());
67
+ if (ad.welcomeId)
68
+ url += "&welcomeId=".concat(ad.welcomeId);
69
+ if (domainId)
70
+ url += "&domainId=".concat(domainId);
71
+ return url;
72
+ };
73
+ var mergedData = function (data) {
74
+ return data.reduce(function (acc, curr) {
75
+ var found = acc.find(function (item) { return item.link === curr.link; });
76
+ if (found) {
77
+ // Nếu link đã tồn tại, gộp subCampaign
78
+ found.subCampaigns.push(curr.subCampaigns[0]);
79
+ }
80
+ else {
81
+ // Nếu link chưa tồn tại, thêm vào acc với subCampaign là mảng
82
+ acc.push({
83
+ link: curr.link,
84
+ ghichu: curr.ghichu,
85
+ status: curr.status,
86
+ subCampaigns: [curr.subCampaigns[0]],
87
+ });
88
+ }
89
+ return acc;
90
+ }, []);
91
+ };
92
+ var renderDataDetail = function (domainId) {
93
+ return mergedData(subCampaigns
94
+ .map(function (subCampaign) {
95
+ return subCampaign.ads
96
+ .map(function (ad) {
97
+ var _a;
98
+ var isDomain = (_a = ad === null || ad === void 0 ? void 0 : ad.places) === null || _a === void 0 ? void 0 : _a.find(function (place) {
99
+ return place.domainId === domainId;
100
+ });
101
+ if (isDomain) {
102
+ return {
103
+ subCampaigns: [
104
+ {
105
+ id: subCampaign.campaignGroup.id,
106
+ name: subCampaign.campaignGroup
107
+ .name,
108
+ },
109
+ ],
110
+ link: renderLinkPreview(ad, domainId),
111
+ ghichu: 'ghichu',
112
+ status: 'status',
113
+ };
114
+ }
115
+ })
116
+ .filter(Boolean);
117
+ })
118
+ .flat()
119
+ .filter(Boolean));
120
+ };
121
+ var dataTable = (0, react_1.useMemo)(function () {
122
+ if (!domains.length)
123
+ return [];
124
+ return domains.map(function (domain) {
125
+ return {
126
+ id: (0, Utils_1.generateId)(),
127
+ domainName: domain.name,
128
+ detail: renderDataDetail(domain.domainId),
129
+ };
130
+ });
131
+ }, [domains]);
132
+ var handleSelectAll = (0, react_1.useCallback)(function () {
133
+ setRowSelected(function (pre) {
134
+ return pre.length < dataTable.length
135
+ ? dataTable.map(function (item) { return item.id; })
136
+ : [];
137
+ });
138
+ }, [dataTable]);
139
+ var handleRowSelect = (0, react_1.useCallback)(function (id) {
140
+ setRowSelected(function (pre) {
141
+ return pre.includes(id) ? pre.filter(function (x) { return x !== id; }) : __spreadArray(__spreadArray([], pre, true), [id], false);
142
+ });
143
+ }, []);
144
+ (0, react_1.useEffect)(function () {
145
+ if (domainIds.length > 0) {
146
+ service.domainsGetByIds &&
147
+ service.domainsGetByIds(domainIds).then(setDomains);
148
+ }
149
+ }, [domainIds]);
150
+ return ((0, jsx_runtime_1.jsxs)(material_1.TableContainer, { children: [(0, jsx_runtime_1.jsx)(material_1.Button, { variant: "outlined", sx: {
151
+ margin: '1rem',
152
+ }, children: t('Campaign.Approval.GetApprovalInformation') }), (0, jsx_runtime_1.jsxs)(material_1.Table, { children: [(0, jsx_runtime_1.jsx)(material_1.TableHead, { children: (0, jsx_runtime_1.jsxs)(material_1.TableRow, { style: { height: 57 }, children: [(0, jsx_runtime_1.jsx)(material_1.TableCell, { style: { width: 60, padding: '0 0 0 4px' }, children: (0, jsx_runtime_1.jsx)(material_1.Checkbox, { indeterminate: rowSelected.length > 0 &&
153
+ rowSelected.length < dataTable.length, checked: rowSelected.length > 0 &&
154
+ rowSelected.length === dataTable.length, onChange: handleSelectAll, inputProps: { 'aria-label': 'select all ad' }, color: "primary" }) }), rowSelected.length ? ((0, jsx_runtime_1.jsx)(material_1.TableCell, { colSpan: 5, style: { padding: 0 }, children: (0, jsx_runtime_1.jsx)(material_1.Button, { variant: "outlined", color: "primary", children: t('Campaign.Approval.SendEmail') }) })) : ((0, jsx_runtime_1.jsxs)(react_1.default.Fragment, { children: [(0, jsx_runtime_1.jsx)(material_1.TableCell, { children: t('Campaign.Approval.Domain') }), (0, jsx_runtime_1.jsx)(material_1.TableCell, { style: { maxWidth: 400 }, children: t('Campaign.Approval.LinkPreview') }), (0, jsx_runtime_1.jsx)(material_1.TableCell, { children: t('Campaign.Approval.SubCampaign') }), (0, jsx_runtime_1.jsx)(material_1.TableCell, { children: t('Campaign.Approval.Status') }), (0, jsx_runtime_1.jsx)(material_1.TableCell, { children: t('Campaign.Approval.Note') })] }))] }) }), (0, jsx_runtime_1.jsx)(material_1.TableBody, { children: dataTable.map(function (item, index) { return ((0, jsx_runtime_1.jsxs)(react_1.Fragment, { children: [(0, jsx_runtime_1.jsxs)(material_1.TableRow, { children: [(0, jsx_runtime_1.jsx)(material_1.TableCell, { rowSpan: item.detail.length + 1, style: { width: 60, padding: '0 0 0 4px' }, children: (0, jsx_runtime_1.jsx)(material_1.Box, { display: 'flex', children: (0, jsx_runtime_1.jsx)(material_1.Checkbox, { checked: rowSelected.some(function (x) { return x === item.id; }), color: "primary", onChange: function () {
155
+ return handleRowSelect(item.id);
156
+ } }) }) }), (0, jsx_runtime_1.jsx)(material_1.TableCell, { rowSpan: item.detail.length + 1, children: item.domainName })] }), item.detail.map(function (detail, index2) { return ((0, jsx_runtime_1.jsx)(RowTable_1.RowTable, { row: detail }, index2)); })] }, index)); }) })] })] }));
157
+ }
158
+ exports.default = TabApprove;