awing-library 2.1.225-dev → 2.1.226-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.
@@ -6,12 +6,12 @@ interface TableRowProps {
6
6
  sub: ICammpaignItem;
7
7
  linkIndex: number;
8
8
  subIndex: number;
9
- rowSelected: number[];
10
- handleRowSelect: (id: number) => void;
11
- updateRow: (row: {
9
+ rowSelected: string[];
10
+ handleRowSelect: (id: string) => void;
11
+ updateRow: (dataTableUpdate: {
12
12
  status: number;
13
13
  description: string;
14
- }, id: number) => void;
14
+ }, rowId: string, linkId: string) => void;
15
15
  }
16
16
  declare const TableRowMemo: React.FC<TableRowProps>;
17
17
  export default TableRowMemo;
@@ -56,7 +56,7 @@ var TableRowMemo = react_1.default.memo(function (_a) {
56
56
  updateRow({
57
57
  status: newStatus,
58
58
  description: valueInput
59
- }, row.id);
59
+ }, row.id, link.id);
60
60
  }, [row, link]);
61
61
  var handleInputChange = (0, react_1.useCallback)(function (event) {
62
62
  var newValue = event.target.value;
@@ -64,7 +64,7 @@ var TableRowMemo = react_1.default.memo(function (_a) {
64
64
  updateRow({
65
65
  status: selectStatus,
66
66
  description: newValue
67
- }, row.id);
67
+ }, row.id, link.id);
68
68
  }, [row, link]);
69
69
  return ((0, jsx_runtime_1.jsxs)(material_1.TableRow, { children: [linkIndex === 0 && subIndex === 0 && ((0, jsx_runtime_1.jsx)(material_1.TableCell, { rowSpan: row.detail.reduce(function (acc, curr) { return acc + curr.campaign.length; }, 0), 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 === row.id; }), color: "primary", onChange: function () { return handleRowSelect(row.id); } }) }) })), linkIndex === 0 && subIndex === 0 && ((0, jsx_runtime_1.jsx)(material_1.TableCell, { rowSpan: row.detail.reduce(function (acc, curr) { return acc + curr.campaign.length; }, 0), children: row.domain.domainName })), subIndex === 0 && ((0, jsx_runtime_1.jsx)(material_1.TableCell, { rowSpan: link.campaign.length, style: { maxWidth: 400 }, children: (0, jsx_runtime_1.jsx)(material_1.Box, { sx: {
70
70
  display: '-webkit-box',
@@ -1,74 +1,219 @@
1
1
  "use strict";
2
- // import { fireEvent, render, screen } from '@testing-library/react'
3
- // import { RowTable } from './RowTable'
4
- // jest.mock('react-i18next', () => ({
5
- // useTranslation: () => ({ t: (key: any) => key }),
6
- // }))
7
- // // Mock the MUI components
8
- // jest.mock('@mui/material', () => ({
9
- // ...jest.requireActual('@mui/material'),
10
- // TableRow: ({ children }: any) => <tr>{children}</tr>,
11
- // TableCell: ({ children }: any) => <td>{children}</td>,
12
- // Box: ({ children }: any) => <div>{children}</div>,
13
- // Link: ({ children, href }: any) => <a href={href}>{children}</a>,
14
- // Chip: ({ label }: any) => <span>{label}</span>,
15
- // FormControl: ({ children }: any) => <div>{children}</div>,
16
- // Select: ({ children, value, onChange }: any) => (
17
- // <select value={value} onChange={onChange}>
18
- // {children}
19
- // </select>
20
- // ),
21
- // MenuItem: ({ children, value }: any) => (
22
- // <option value={value}>{children}</option>
23
- // ),
24
- // TextField: ({ value, onChange }: any) => (
25
- // <input type="text" value={value} onChange={onChange} />
26
- // ),
27
- // }))
28
- // const mockRow = {
29
- // id: 1,
30
- // linkPreview: 'https://example.com',
31
- // subCampaigns: [
32
- // { id: '1', name: 'Campaign 1' },
33
- // { id: '2', name: 'Campaign 2' },
34
- // ],
35
- // description: 'Initial note',
36
- // status: 0,
37
- // }
38
- // const renderUi = () =>
39
- // render(<RowTable row={mockRow} id={1} updateRow={() => {}} />)
40
- // describe('RowTable', () => {
41
- // it('renders the link correctly', () => {
42
- // renderUi()
43
- // const link = screen.getByRole('link', { name: 'https://example.com' })
44
- // expect(link).toBeInTheDocument()
45
- // expect(link).toHaveAttribute('href', 'https://example.com')
46
- // })
47
- // it('renders sub-campaigns as chips', () => {
48
- // renderUi()
49
- // expect(screen.getByText('Campaign 1')).toBeInTheDocument()
50
- // expect(screen.getByText('Campaign 2')).toBeInTheDocument()
51
- // })
52
- // it('renders the select with correct initial value', () => {
53
- // renderUi()
54
- // const select = screen.getByRole('combobox')
55
- // expect(select).toHaveValue('0')
56
- // })
57
- // it('changes the select value when a new option is chosen', () => {
58
- // renderUi()
59
- // const select = screen.getByRole('combobox')
60
- // fireEvent.change(select, { target: { value: 0 } })
61
- // expect(select).toHaveValue('0')
62
- // })
63
- // it('renders the text field with the initial note', () => {
64
- // renderUi()
65
- // const textField = screen.getByRole('textbox')
66
- // expect(textField).toHaveValue('Initial note')
67
- // })
68
- // it('updates the text field value when typed into', () => {
69
- // renderUi()
70
- // const textField = screen.getByRole('textbox')
71
- // fireEvent.change(textField, { target: { value: 'New note' } })
72
- // expect(textField).toHaveValue('New note')
73
- // })
74
- // })
2
+ var __assign = (this && this.__assign) || function () {
3
+ __assign = Object.assign || function(t) {
4
+ for (var s, i = 1, n = arguments.length; i < n; i++) {
5
+ s = arguments[i];
6
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
7
+ t[p] = s[p];
8
+ }
9
+ return t;
10
+ };
11
+ return __assign.apply(this, arguments);
12
+ };
13
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
14
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
15
+ return new (P || (P = Promise))(function (resolve, reject) {
16
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
17
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
18
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
19
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
20
+ });
21
+ };
22
+ var __generator = (this && this.__generator) || function (thisArg, body) {
23
+ var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
24
+ return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
25
+ function verb(n) { return function (v) { return step([n, v]); }; }
26
+ function step(op) {
27
+ if (f) throw new TypeError("Generator is already executing.");
28
+ while (g && (g = 0, op[0] && (_ = 0)), _) try {
29
+ if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
30
+ if (y = 0, t) op = [op[0] & 2, t.value];
31
+ switch (op[0]) {
32
+ case 0: case 1: t = op; break;
33
+ case 4: _.label++; return { value: op[1], done: false };
34
+ case 5: _.label++; y = op[1]; op = [0]; continue;
35
+ case 7: op = _.ops.pop(); _.trys.pop(); continue;
36
+ default:
37
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
38
+ if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
39
+ if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
40
+ if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
41
+ if (t[2]) _.ops.pop();
42
+ _.trys.pop(); continue;
43
+ }
44
+ op = body.call(thisArg, _);
45
+ } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
46
+ if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
47
+ }
48
+ };
49
+ var __importDefault = (this && this.__importDefault) || function (mod) {
50
+ return (mod && mod.__esModule) ? mod : { "default": mod };
51
+ };
52
+ Object.defineProperty(exports, "__esModule", { value: true });
53
+ var jsx_runtime_1 = require("react/jsx-runtime");
54
+ var react_1 = require("@testing-library/react");
55
+ var Enum_1 = require("../../../../ACM-AXN/Campaign/Enum");
56
+ var RowTable_1 = __importDefault(require("./RowTable"));
57
+ var user_event_1 = __importDefault(require("@testing-library/user-event"));
58
+ // Mock the useTranslation hook
59
+ jest.mock('react-i18next', function () { return ({
60
+ useTranslation: function () { return ({ t: function (key) { return key; } }); },
61
+ }); });
62
+ var mockProps = {
63
+ row: {
64
+ id: '100',
65
+ domain: {
66
+ domainName: 'Vincom',
67
+ domainId: '100',
68
+ },
69
+ detail: [
70
+ {
71
+ id: '10c77e54-8aff-4e36-8334-70eca26d5a75',
72
+ linkPreview: 'http://connect.awifi.com.vn/Preview/Page?loginId=5122170857262705548&welcomeId=4841207366749869113&isNetworkCampaign=true&domainId=100',
73
+ campaign: [
74
+ {
75
+ subCampaigns: [
76
+ {
77
+ id: 1,
78
+ name: 'Sub-Campaign 1',
79
+ },
80
+ ],
81
+ ads: [
82
+ {
83
+ id: 1,
84
+ name: 'Ad 1',
85
+ },
86
+ {
87
+ id: 2,
88
+ name: 'Ad 2',
89
+ },
90
+ ],
91
+ },
92
+ ],
93
+ status: 0,
94
+ description: '',
95
+ loginId: '5122170857262705548',
96
+ welcomeId: '4841207366749869113',
97
+ },
98
+ ],
99
+ },
100
+ link: {
101
+ id: '10c77e54-8aff-4e36-8334-70eca26d5a75',
102
+ linkPreview: 'http://connect.awifi.com.vn/Preview/Page?loginId=5122170857262705548&welcomeId=4841207366749869113&isNetworkCampaign=true&domainId=100',
103
+ campaign: [
104
+ {
105
+ subCampaigns: [
106
+ {
107
+ id: 1,
108
+ name: 'Sub-Campaign 1',
109
+ },
110
+ ],
111
+ ads: [
112
+ {
113
+ id: 1,
114
+ name: 'Ad 1',
115
+ },
116
+ {
117
+ id: 2,
118
+ name: 'Ad 2',
119
+ },
120
+ ],
121
+ },
122
+ ],
123
+ status: 0,
124
+ description: '',
125
+ loginId: '5122170857262705548',
126
+ welcomeId: '4841207366749869113',
127
+ },
128
+ sub: {
129
+ subCampaigns: [
130
+ {
131
+ id: 1,
132
+ name: 'Sub-Campaign 1',
133
+ },
134
+ ],
135
+ ads: [
136
+ {
137
+ id: 1,
138
+ name: 'Ad 1',
139
+ },
140
+ {
141
+ id: 2,
142
+ name: 'Ad 2',
143
+ },
144
+ ],
145
+ },
146
+ linkIndex: 0,
147
+ subIndex: 0,
148
+ rowSelected: [],
149
+ handleRowSelect: jest.fn(),
150
+ updateRow: jest.fn(),
151
+ };
152
+ // Mock cho các component MUI
153
+ jest.mock('@mui/material', function () { return (__assign(__assign({}, jest.requireActual('@mui/material')), { TableCell: function (_a) {
154
+ var children = _a.children;
155
+ return (0, jsx_runtime_1.jsx)("td", { children: children });
156
+ }, Chip: function (_a) {
157
+ var label = _a.label;
158
+ return (0, jsx_runtime_1.jsx)("span", { children: label });
159
+ }, FormControl: function (_a) {
160
+ var children = _a.children;
161
+ return (0, jsx_runtime_1.jsx)("div", { children: children });
162
+ }, Select: function (_a) {
163
+ var children = _a.children, value = _a.value, onChange = _a.onChange;
164
+ return ((0, jsx_runtime_1.jsx)("select", { value: value, onChange: onChange, children: children }));
165
+ }, MenuItem: function (_a) {
166
+ var children = _a.children, value = _a.value;
167
+ return ((0, jsx_runtime_1.jsx)("option", { value: value, children: children }));
168
+ }, TextField: function (_a) {
169
+ var value = _a.value, onChange = _a.onChange;
170
+ return ((0, jsx_runtime_1.jsx)("input", { type: "text", value: value, onChange: onChange }));
171
+ }, Link: function (_a) {
172
+ var children = _a.children, href = _a.href, target = _a.target;
173
+ return ((0, jsx_runtime_1.jsx)("a", { href: href, target: target, children: children }));
174
+ } })); });
175
+ var renderUi = function () {
176
+ return (0, react_1.render)((0, jsx_runtime_1.jsx)("table", { children: (0, jsx_runtime_1.jsx)("tbody", { children: (0, jsx_runtime_1.jsx)(RowTable_1.default, __assign({}, mockProps)) }) }));
177
+ };
178
+ describe('TableRowMemo', function () {
179
+ it('renders correctly', function () {
180
+ renderUi();
181
+ expect(react_1.screen.getByText('Vincom')).toBeInTheDocument();
182
+ expect(react_1.screen.getByText('http://connect.awifi.com.vn/Preview/Page?loginId=5122170857262705548&welcomeId=4841207366749869113&isNetworkCampaign=true&domainId=100')).toBeInTheDocument();
183
+ expect(react_1.screen.getByText('Sub-Campaign 1')).toBeInTheDocument();
184
+ expect(react_1.screen.getByText('Ad 1')).toBeInTheDocument();
185
+ });
186
+ it('handles checkbox change', function () {
187
+ renderUi();
188
+ var checkbox = react_1.screen.getByRole('checkbox');
189
+ react_1.fireEvent.click(checkbox);
190
+ expect(mockProps.handleRowSelect).toHaveBeenCalledWith('100');
191
+ });
192
+ it('handles status change', function () { return __awaiter(void 0, void 0, void 0, function () {
193
+ var select;
194
+ return __generator(this, function (_a) {
195
+ switch (_a.label) {
196
+ case 0:
197
+ renderUi();
198
+ select = react_1.screen.getByRole('combobox');
199
+ return [4 /*yield*/, user_event_1.default.selectOptions(select, Enum_1.CampaignApprovalStatus.Rejected.toString())];
200
+ case 1:
201
+ _a.sent();
202
+ expect(mockProps.updateRow).toHaveBeenCalledWith({
203
+ status: Enum_1.CampaignApprovalStatus.Rejected.toString(),
204
+ description: '',
205
+ }, '100', '10c77e54-8aff-4e36-8334-70eca26d5a75');
206
+ return [2 /*return*/];
207
+ }
208
+ });
209
+ }); });
210
+ it('handles description change', function () {
211
+ renderUi();
212
+ var input = react_1.screen.getByRole('textbox');
213
+ react_1.fireEvent.change(input, { target: { value: 'New description' } });
214
+ expect(mockProps.updateRow).toHaveBeenCalledWith({
215
+ status: Enum_1.CampaignApprovalStatus.PendingApproval,
216
+ description: 'New description',
217
+ }, '100', '10c77e54-8aff-4e36-8334-70eca26d5a75');
218
+ });
219
+ });
@@ -7,15 +7,17 @@ export interface ICammpaignItem {
7
7
  ads: IItem[];
8
8
  }
9
9
  export interface IDetail {
10
- id?: number;
10
+ id?: string;
11
11
  status: number;
12
12
  linkPreview: string;
13
13
  subCampaigns?: IItem[];
14
+ loginId?: string;
15
+ welcomeId?: string;
14
16
  campaign: ICammpaignItem[];
15
17
  description: string;
16
18
  }
17
19
  export interface IDataTable {
18
- id: number;
20
+ id: string;
19
21
  domain: {
20
22
  domainName?: string;
21
23
  domainId?: string;
@@ -33,8 +33,8 @@ var react_1 = require("react");
33
33
  var react_i18next_1 = require("react-i18next");
34
34
  var recoil_1 = require("recoil");
35
35
  var Recoils_1 = require("../Recoils");
36
- var atoms_1 = require("../TabSubCampaign/atoms");
37
36
  var RowTable_1 = __importDefault(require("./RowTable"));
37
+ var Helpers_1 = require("../../../../Utils/Helpers");
38
38
  function TabApprove() {
39
39
  var t = (0, react_i18next_1.useTranslation)().t;
40
40
  var campaignId = (0, Router_1.useParams)().campaignId;
@@ -42,24 +42,22 @@ function TabApprove() {
42
42
  var setConfirmExit = (0, recoil_1.useSetRecoilState)(Recoils_1.confirmExitState);
43
43
  var _b = (0, react_1.useState)([]), rowSelected = _b[0], setRowSelected = _b[1];
44
44
  var _c = (0, react_1.useState)([]), domains = _c[0], setDomains = _c[1];
45
- var ads = (0, recoil_1.useRecoilValue)(atoms_1.adListState);
46
45
  var subCampaigns = (0, recoil_1.useRecoilValue)(Recoils_1.campaignGroupsState);
47
46
  var _d = (0, Hooks_1.default)(), service = _d.service, defaultDomainId = _d.domainId;
47
+ var _e = (0, react_1.useState)([]), dataTable = _e[0], setDataTable = _e[1];
48
48
  var domainIds = (0, react_1.useMemo)(function () {
49
+ var ads = subCampaigns.flatMap(function (sub) { return sub.ads; });
49
50
  return lodash_1.default.uniq(ads
50
51
  .filter(function (ad) { return ad.places; })
51
52
  .map(function (ad) { return ad.places.map(function (x) { return x.domainId; }); })
52
53
  .flat()
53
54
  .filter(Boolean));
54
- }, [ads]);
55
- var generateRandomId = function () {
56
- return Math.floor(Math.random() * 1000000000); // Số ngẫu nhiên từ 0 đến 999,999,999
57
- };
55
+ }, [subCampaigns]);
58
56
  var renderLinkPreview = function (ad, domainId) {
59
57
  if (domainId === void 0) { domainId = defaultDomainId; }
60
- 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());
58
+ var url = "".concat(Constant_1.Constants.CAPTIVE_DOMAIN, "/").concat(Constant_1.Constants.PAGE_LOGIN_PREVIEW, "?loginId=").concat(ad.loginId);
61
59
  if (ad.welcomeId)
62
- url += "&welcomeId=".concat(ad.welcomeId);
60
+ url += "&welcomeId=".concat(ad.welcomeId, "&isNetworkCampaign=").concat(Boolean(service.domainsGetAll).toString());
63
61
  if (domainId)
64
62
  url += "&domainId=".concat(domainId);
65
63
  return url;
@@ -88,11 +86,13 @@ function TabApprove() {
88
86
  }
89
87
  else {
90
88
  acc.push({
91
- id: generateRandomId(),
89
+ id: (0, Helpers_1.generateUUID)(),
92
90
  linkPreview: detail.linkPreview,
93
91
  campaign: detail.campaign,
94
92
  status: detail.status,
95
93
  description: detail.description,
94
+ loginId: detail.loginId,
95
+ welcomeId: detail.welcomeId,
96
96
  });
97
97
  }
98
98
  return acc;
@@ -128,6 +128,8 @@ function TabApprove() {
128
128
  ],
129
129
  },
130
130
  ],
131
+ loginId: ad.loginId,
132
+ welcomeId: ad.welcomeId,
131
133
  description: '',
132
134
  status: 0,
133
135
  };
@@ -143,35 +145,40 @@ function TabApprove() {
143
145
  return pre.includes(id) ? pre.filter(function (x) { return x !== id; }) : __spreadArray(__spreadArray([], pre, true), [id], false);
144
146
  });
145
147
  }, []);
146
- var updateRow = (0, react_1.useCallback)(function (row, id) {
147
- setConfirmExit(true);
148
- setCampaignApproval(function (prevState) {
149
- if (!prevState)
150
- return [];
151
- var newState = prevState.map(function (item) {
152
- if (item.id === id) {
153
- return __assign(__assign({}, item), row);
148
+ var updateRow = (0, react_1.useCallback)(function (dataUpdate, rowId, linkId) {
149
+ setDataTable(function (pre) {
150
+ return pre.map(function (item) {
151
+ if (item.id === rowId) {
152
+ return __assign(__assign({}, item), { detail: item.detail.map(function (detail) {
153
+ if (detail.id === linkId) {
154
+ return __assign(__assign({}, detail), { status: dataUpdate.status, description: dataUpdate.description });
155
+ }
156
+ return detail;
157
+ }) });
154
158
  }
155
159
  return item;
156
160
  });
157
- return newState;
158
161
  });
159
- }, [setCampaignApproval]);
162
+ setConfirmExit(true);
163
+ }, [setCampaignApproval, dataTable]);
160
164
  function flattenData(data) {
161
165
  var flattened = [];
166
+ var index = 0;
162
167
  data.forEach(function (item) {
163
168
  item.detail.forEach(function (detail) {
164
169
  detail.campaign.forEach(function (campaign) {
165
170
  campaign.ads.forEach(function (ad) {
166
171
  var _a;
167
172
  flattened.push({
168
- id: item.id,
173
+ id: index++,
169
174
  campaignId: campaignId,
170
175
  domainId: item.domain.domainId,
171
176
  status: detail.status,
177
+ loginId: detail.loginId,
178
+ welcomeId: detail.welcomeId,
172
179
  description: detail.description,
173
- subId: (_a = campaign.subCampaigns[0]) === null || _a === void 0 ? void 0 : _a.id,
174
- adId: ad === null || ad === void 0 ? void 0 : ad.id,
180
+ campaignGroupId: (_a = campaign.subCampaigns[0]) === null || _a === void 0 ? void 0 : _a.id,
181
+ campaignAdId: ad === null || ad === void 0 ? void 0 : ad.id,
175
182
  });
176
183
  });
177
184
  });
@@ -198,31 +205,46 @@ function TabApprove() {
198
205
  };
199
206
  var groupedData = inputData.reduce(function (acc, item) {
200
207
  var _a, _b, _c;
201
- if (!acc[Number(item.domainId)]) {
202
- var domain = domains.find(function (d) { return d.domainId === item.domainId; });
203
- acc[Number(item.domainId)] = {
204
- id: item.id,
208
+ var domainId = item.domainId;
209
+ if (!acc[domainId]) {
210
+ var domain = domains.find(function (d) { return d.domainId === domainId; });
211
+ acc[domainId] = {
212
+ id: domainId,
205
213
  domain: {
206
214
  domainName: domain === null || domain === void 0 ? void 0 : domain.name,
207
215
  domainId: domain === null || domain === void 0 ? void 0 : domain.domainId,
208
216
  },
209
- detail: [
210
- {
211
- id: generateRandomId(),
212
- linkPreview: renderLinkPreview((_a = findAd(item.subId, item.adId)) !== null && _a !== void 0 ? _a : {}, item.domainId),
213
- campaign: [],
214
- status: item.status,
215
- description: item.description,
216
- },
217
- ],
217
+ detail: [],
218
218
  };
219
219
  }
220
- var campaign = acc[Number(item.domainId)].detail[0]
221
- .campaign;
222
- var subCampaign = campaign.find(function (c) { return c.subCampaigns[0].id === item.subId; });
220
+ // Tạo linkPreview chỉ nếu chưa tồn tại
221
+ var existingDetail = acc[domainId].detail.find(function (detail) {
222
+ return detail.loginId === item.loginId &&
223
+ detail.welcomeId === item.welcomeId;
224
+ });
225
+ if (!existingDetail) {
226
+ acc[domainId].detail.push({
227
+ id: (0, Helpers_1.generateUUID)(),
228
+ linkPreview: renderLinkPreview({
229
+ loginId: item.loginId,
230
+ welcomeId: item.welcomeId,
231
+ }, domainId),
232
+ campaign: [],
233
+ status: item.status,
234
+ description: item.description,
235
+ loginId: item.loginId,
236
+ welcomeId: item.welcomeId,
237
+ });
238
+ }
239
+ var campaign = (_a = acc[domainId].detail.find(function (detail) {
240
+ return detail.loginId === item.loginId &&
241
+ detail.welcomeId === item.welcomeId;
242
+ })) === null || _a === void 0 ? void 0 : _a.campaign;
243
+ var subCampaign = campaign.find(function (c) { return c.subCampaigns[0].id === item.campaignGroupId; });
223
244
  if (!subCampaign) {
224
245
  var sub = subCampaigns.find(function (subCampaign) {
225
- return subCampaign.campaignGroup.id === item.subId;
246
+ return subCampaign.campaignGroup.id ===
247
+ item.campaignGroupId;
226
248
  });
227
249
  subCampaign = {
228
250
  subCampaigns: [
@@ -236,23 +258,30 @@ function TabApprove() {
236
258
  campaign.push(subCampaign);
237
259
  }
238
260
  subCampaign.ads.push({
239
- id: item.adId,
240
- name: (_c = (_b = findAd(subCampaign.subCampaigns[0].id, item.adId)) === null || _b === void 0 ? void 0 : _b.adName) !== null && _c !== void 0 ? _c : '',
261
+ id: item.campaignAdId,
262
+ name: (_c = (_b = findAd(subCampaign.subCampaigns[0].id, item.campaignAdId)) === null || _b === void 0 ? void 0 : _b.adName) !== null && _c !== void 0 ? _c : '',
241
263
  });
242
264
  return acc;
243
265
  }, {});
244
266
  return Object.values(groupedData);
245
267
  };
246
- var dataTable = (0, react_1.useMemo)(function () {
268
+ var handleSelectAll = (0, react_1.useCallback)(function () {
269
+ setRowSelected(function (pre) {
270
+ return pre.length < dataTable.length
271
+ ? dataTable.map(function (item) { return item.id; })
272
+ : [];
273
+ });
274
+ }, [dataTable]);
275
+ (0, react_1.useEffect)(function () {
247
276
  if (!domains.length)
248
- return [];
277
+ return setDataTable([]);
249
278
  var data;
250
279
  if (campaignApproval === null || campaignApproval === void 0 ? void 0 : campaignApproval.length) {
251
- return unflattenData(campaignApproval);
280
+ return setDataTable(unflattenData(campaignApproval));
252
281
  }
253
282
  data = domains.map(function (domain) {
254
283
  return {
255
- id: generateRandomId(),
284
+ id: domain.domainId,
256
285
  domain: {
257
286
  domainName: domain.name,
258
287
  domainId: domain.domainId,
@@ -260,15 +289,8 @@ function TabApprove() {
260
289
  detail: renderDataDetail(domain.domainId),
261
290
  };
262
291
  });
263
- return data;
292
+ return setDataTable(data);
264
293
  }, [domains]);
265
- var handleSelectAll = (0, react_1.useCallback)(function () {
266
- setRowSelected(function (pre) {
267
- return pre.length < dataTable.length
268
- ? dataTable.map(function (item) { return item.id; })
269
- : [];
270
- });
271
- }, [dataTable]);
272
294
  (0, react_1.useEffect)(function () {
273
295
  if (domainIds.length > 0) {
274
296
  service.domainsGetByIds &&
@@ -281,7 +303,7 @@ function TabApprove() {
281
303
  }
282
304
  }, [dataTable]);
283
305
  return ((0, jsx_runtime_1.jsxs)(material_1.TableContainer, { children: [(0, jsx_runtime_1.jsx)(material_1.Button, { variant: "outlined", color: "primary", disabled: !rowSelected.length, sx: {
284
- margin: '1rem'
306
+ margin: '1rem',
285
307
  }, children: t('Campaign.Approval.SendEmail') }), (0, jsx_runtime_1.jsxs)(material_1.Table, { sx: {
286
308
  boxShadow: 'none',
287
309
  '.MuiOutlinedInput-notchedOutline': {
@@ -216,10 +216,12 @@ export type CampaignApproval = {
216
216
  id?: number;
217
217
  campaignId?: string;
218
218
  domainId?: string;
219
- subId?: number;
220
- adId?: number;
219
+ campaignGroupId?: number;
220
+ campaignAdId?: number;
221
221
  status: number;
222
222
  description: string;
223
+ loginId?: string;
224
+ welcomeId?: string;
223
225
  };
224
226
  export type DateRange = {
225
227
  startDate: Date;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "awing-library",
3
- "version": "2.1.225-dev",
3
+ "version": "2.1.226-dev",
4
4
  "description": "",
5
5
  "main": "lib/index.js",
6
6
  "types": "lib/index.d.ts",