awing-library 2.1.20-beta → 2.1.22-beta

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 (49) hide show
  1. package/lib/ACM-AXN/Campaign/index.js +1 -1
  2. package/lib/ACM-AXN/GroupUser/Constants.d.ts +7 -0
  3. package/lib/ACM-AXN/GroupUser/Constants.js +10 -0
  4. package/lib/ACM-AXN/GroupUser/Container.d.ts +2 -0
  5. package/lib/ACM-AXN/GroupUser/Container.js +55 -0
  6. package/lib/ACM-AXN/GroupUser/Container.test.d.ts +1 -0
  7. package/lib/ACM-AXN/GroupUser/Container.test.js +210 -0
  8. package/lib/ACM-AXN/GroupUser/CreateOrEdit.d.ts +3 -0
  9. package/lib/ACM-AXN/GroupUser/CreateOrEdit.js +84 -0
  10. package/lib/ACM-AXN/GroupUser/CreateOrEdit.test.d.ts +1 -0
  11. package/lib/ACM-AXN/GroupUser/CreateOrEdit.test.js +235 -0
  12. package/lib/ACM-AXN/GroupUser/Hooks.d.ts +5 -0
  13. package/lib/ACM-AXN/GroupUser/Hooks.js +13 -0
  14. package/lib/ACM-AXN/GroupUser/Types.d.ts +31 -0
  15. package/lib/ACM-AXN/GroupUser/Types.js +2 -0
  16. package/lib/ACM-AXN/GroupUser/User/SearchUser.d.ts +9 -0
  17. package/lib/ACM-AXN/GroupUser/User/SearchUser.js +63 -0
  18. package/lib/ACM-AXN/GroupUser/User/SearchUser.test.d.ts +1 -0
  19. package/lib/ACM-AXN/GroupUser/User/SearchUser.test.js +140 -0
  20. package/lib/ACM-AXN/GroupUser/User/UserComponent.d.ts +8 -0
  21. package/lib/ACM-AXN/GroupUser/User/UserComponent.js +77 -0
  22. package/lib/ACM-AXN/GroupUser/User/UserComponent.test.d.ts +1 -0
  23. package/lib/ACM-AXN/GroupUser/User/UserComponent.test.js +128 -0
  24. package/lib/ACM-AXN/GroupUser/index.d.ts +4 -0
  25. package/lib/ACM-AXN/GroupUser/index.js +27 -0
  26. package/lib/ACM-AXN/Permission/Components/Management.test.js +1 -1
  27. package/lib/ACM-AXN/Statistics/ControlPanel.js +3 -6
  28. package/lib/ACM-AXN/StatisticsAudienceDemographic/container.d.ts +1 -1
  29. package/lib/ACM-AXN/StatisticsAudienceDemographic/container.js +2 -2
  30. package/lib/ACM-AXN/StatisticsAudienceDemographic/interfaces.d.ts +1 -0
  31. package/lib/ACM-AXN/User/Add.d.ts +2 -0
  32. package/lib/ACM-AXN/User/Add.js +64 -0
  33. package/lib/ACM-AXN/User/Add.test.d.ts +1 -0
  34. package/lib/ACM-AXN/User/Add.test.js +115 -0
  35. package/lib/ACM-AXN/User/Constants.d.ts +2 -0
  36. package/lib/ACM-AXN/User/Constants.js +5 -0
  37. package/lib/ACM-AXN/User/Container.d.ts +2 -0
  38. package/lib/ACM-AXN/User/Container.js +60 -0
  39. package/lib/ACM-AXN/User/Container.test.d.ts +1 -0
  40. package/lib/ACM-AXN/User/Container.test.js +202 -0
  41. package/lib/ACM-AXN/User/Hook.d.ts +5 -0
  42. package/lib/ACM-AXN/User/Hook.js +13 -0
  43. package/lib/ACM-AXN/User/Types.d.ts +45 -0
  44. package/lib/ACM-AXN/User/Types.js +2 -0
  45. package/lib/ACM-AXN/User/index.d.ts +4 -0
  46. package/lib/ACM-AXN/User/index.js +18 -0
  47. package/lib/translate/en/translation.json +11 -1
  48. package/lib/translate/vi/translation.json +11 -1
  49. package/package.json +1 -1
@@ -19,13 +19,13 @@ var jsx_runtime_1 = require("react/jsx-runtime");
19
19
  // import Constants from "Commons/Constants";
20
20
  var react_helmet_async_1 = require("react-helmet-async");
21
21
  var react_i18next_1 = require("react-i18next");
22
+ var CreateDirectory_1 = __importDefault(require("../../AWING/Directory/CreateDirectory"));
22
23
  var Router_1 = require("../../AWING/Router");
23
24
  var i18n_1 = __importDefault(require("../../i18n"));
24
25
  var Constant_1 = require("./Constant");
25
26
  var Container_1 = __importDefault(require("./Container"));
26
27
  var Context_1 = require("./Context");
27
28
  var CreateOrEdit_1 = __importDefault(require("./CreateOrEdit"));
28
- var CreateDirectory_1 = __importDefault(require("../../AWING/Directory/CreateDirectory"));
29
29
  var Campaign = function (props) {
30
30
  var paths = [
31
31
  {
@@ -0,0 +1,7 @@
1
+ export declare const CREATE_PATH = "Create";
2
+ export declare const IMPORT_PATH = "Import";
3
+ export declare const EDIT_PATH = "Edit";
4
+ export declare const CLONE_PATH = "Clone";
5
+ export declare const DEBOUNCE_TIME = 700;
6
+ export declare const DEBOUNCE_TIME_500 = 500;
7
+ export declare const DEBOUNCE_TIME_300 = 300;
@@ -0,0 +1,10 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.DEBOUNCE_TIME_300 = exports.DEBOUNCE_TIME_500 = exports.DEBOUNCE_TIME = exports.CLONE_PATH = exports.EDIT_PATH = exports.IMPORT_PATH = exports.CREATE_PATH = void 0;
4
+ exports.CREATE_PATH = 'Create';
5
+ exports.IMPORT_PATH = 'Import';
6
+ exports.EDIT_PATH = 'Edit';
7
+ exports.CLONE_PATH = 'Clone';
8
+ exports.DEBOUNCE_TIME = 700;
9
+ exports.DEBOUNCE_TIME_500 = 500;
10
+ exports.DEBOUNCE_TIME_300 = 300;
@@ -0,0 +1,2 @@
1
+ declare const GroupUserContainer: () => import("react/jsx-runtime").JSX.Element;
2
+ export default GroupUserContainer;
@@ -0,0 +1,55 @@
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 PageManagement_1 = require("../../AWING/PageManagement");
8
+ var react_1 = require("react");
9
+ var react_i18next_1 = require("react-i18next");
10
+ var Router_1 = require("../../AWING/Router");
11
+ var Constants_1 = require("./Constants");
12
+ var Context_1 = require("../../Context");
13
+ var Hooks_1 = __importDefault(require("./Hooks"));
14
+ var GroupUserContainer = function () {
15
+ var t = (0, react_i18next_1.useTranslation)().t;
16
+ var service = (0, Hooks_1.default)().service;
17
+ var _a = (0, Context_1.useAwing)().appHelper, confirm = _a.confirm, snackbar = _a.snackbar;
18
+ var navigate = (0, Router_1.useNavigate)();
19
+ var _b = (0, react_1.useState)(false), loading = _b[0], setLoading = _b[1];
20
+ var _c = (0, react_1.useState)(), userGroups = _c[0], setUserGroups = _c[1];
21
+ var handleNavigate = function () {
22
+ navigate(Constants_1.CREATE_PATH);
23
+ };
24
+ var getUserGroups = (0, react_1.useCallback)(function (queryParams) {
25
+ setLoading(true);
26
+ service
27
+ .groupsPaging(queryParams.searchString, undefined, queryParams.pageIndex, queryParams.pageSize)
28
+ .then(setUserGroups)
29
+ .finally(function () {
30
+ setLoading(false);
31
+ });
32
+ }, [service]);
33
+ var handleDelete = function (id) {
34
+ return service.groupsDelete(id).then(function () { return snackbar('success'); });
35
+ };
36
+ return ((0, jsx_runtime_1.jsx)(jsx_runtime_1.Fragment, { children: (0, jsx_runtime_1.jsx)(PageManagement_1.PageManagement, { title: t('UserGroup.Title'), onChangeQueryInput: getUserGroups, getRowId: function (obj) { return obj.groupId; }, columns: [
37
+ {
38
+ field: '#',
39
+ headerName: '#',
40
+ width: 100,
41
+ valueGetter: function (_unUse, idx, stt) { return stt; },
42
+ },
43
+ {
44
+ field: 'name',
45
+ headerName: t('Common.GroupName'),
46
+ },
47
+ {
48
+ field: 'description',
49
+ headerName: t('Common.Description'),
50
+ },
51
+ ], loading: loading, rows: (userGroups === null || userGroups === void 0 ? void 0 : userGroups.items) || [], onCreateButtonClick: handleNavigate, onRowClick: function (id) {
52
+ navigate([Constants_1.EDIT_PATH, id].join('/'));
53
+ }, totalOfRows: userGroups === null || userGroups === void 0 ? void 0 : userGroups.totalItemCount, onDelete: handleDelete, confirmDelete: confirm }) }));
54
+ };
55
+ exports.default = GroupUserContainer;
@@ -0,0 +1 @@
1
+ import '@testing-library/jest-dom/extend-expect';
@@ -0,0 +1,210 @@
1
+ "use strict";
2
+ var __assign = (this && this.__assign) || function () {
3
+ __assign = Object.assign || function(t) {
4
+ for (var s, i = 1, n = arguments.length; i < n; i++) {
5
+ s = arguments[i];
6
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
7
+ t[p] = s[p];
8
+ }
9
+ return t;
10
+ };
11
+ return __assign.apply(this, arguments);
12
+ };
13
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
14
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
15
+ return new (P || (P = Promise))(function (resolve, reject) {
16
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
17
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
18
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
19
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
20
+ });
21
+ };
22
+ var __generator = (this && this.__generator) || function (thisArg, body) {
23
+ var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
24
+ return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
25
+ function verb(n) { return function (v) { return step([n, v]); }; }
26
+ function step(op) {
27
+ if (f) throw new TypeError("Generator is already executing.");
28
+ while (g && (g = 0, op[0] && (_ = 0)), _) try {
29
+ if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
30
+ if (y = 0, t) op = [op[0] & 2, t.value];
31
+ switch (op[0]) {
32
+ case 0: case 1: t = op; break;
33
+ case 4: _.label++; return { value: op[1], done: false };
34
+ case 5: _.label++; y = op[1]; op = [0]; continue;
35
+ case 7: op = _.ops.pop(); _.trys.pop(); continue;
36
+ default:
37
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
38
+ if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
39
+ if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
40
+ if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
41
+ if (t[2]) _.ops.pop();
42
+ _.trys.pop(); continue;
43
+ }
44
+ op = body.call(thisArg, _);
45
+ } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
46
+ if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
47
+ }
48
+ };
49
+ var __importDefault = (this && this.__importDefault) || function (mod) {
50
+ return (mod && mod.__esModule) ? mod : { "default": mod };
51
+ };
52
+ Object.defineProperty(exports, "__esModule", { value: true });
53
+ var jsx_runtime_1 = require("react/jsx-runtime");
54
+ require("@testing-library/jest-dom/extend-expect");
55
+ var react_1 = require("@testing-library/react");
56
+ var Router_1 = require("../../AWING/Router");
57
+ var Container_1 = __importDefault(require("./Container"));
58
+ var Constants_1 = require("./Constants");
59
+ var items = [
60
+ {
61
+ groupId: '10',
62
+ name: 'Administrators',
63
+ description: 'Quản trị hệ thống',
64
+ },
65
+ {
66
+ groupId: '1543',
67
+ name: 'Advance Users',
68
+ description: null,
69
+ },
70
+ {
71
+ groupId: '5755448572239982608',
72
+ name: 'AWING_ADS DELI',
73
+ description: null,
74
+ },
75
+ ];
76
+ var clientMethod = {
77
+ groupsPaging: function () {
78
+ return Promise.resolve({
79
+ items: items,
80
+ totalItemCount: items === null || items === void 0 ? void 0 : items.length,
81
+ });
82
+ },
83
+ groupsDelete: function () { return function (_id) { }; },
84
+ };
85
+ // Mock AWING/Router
86
+ jest.mock('AWING/Router', function () { return (__assign(__assign({}, jest.requireActual('AWING/Router')), { useLocation: jest.fn() })); });
87
+ // Mock Axios client
88
+ jest.mock('Commons/UseAxiosProvider', function () { return ({
89
+ __esModule: true,
90
+ default: function () { return ({
91
+ client: {
92
+ groupsPaging: jest.fn(function () {
93
+ var _param = [];
94
+ for (var _i = 0; _i < arguments.length; _i++) {
95
+ _param[_i] = arguments[_i];
96
+ }
97
+ return Promise.resolve(clientMethod.groupsPaging());
98
+ }),
99
+ groupsDelete: jest.fn(function (_id) {
100
+ return Promise.resolve(clientMethod.groupsDelete());
101
+ }),
102
+ },
103
+ }); },
104
+ }); });
105
+ // Mock i18next
106
+ jest.mock('react-i18next', function () { return (__assign(__assign({}, jest.requireActual('react-i18next')), { useTranslation: function () { return ({ t: jest.fn(function (key) { return key; }) }); } })); });
107
+ // Mock PageManagement
108
+ jest.mock('AWING/PageManagement', function () { return ({
109
+ PageManagement: function (props) {
110
+ props.onChangeQueryInput({
111
+ searchString: '',
112
+ pageIndex: 0,
113
+ pageSize: 10,
114
+ });
115
+ return ((0, jsx_runtime_1.jsxs)("div", { children: [props.columns
116
+ .filter(function (item) { return item.valueGetter; })
117
+ .map(function (getter, idx) { return ((0, jsx_runtime_1.jsx)("span", { children: getter.valueGetter(items[0], idx) }, idx)); }), (0, jsx_runtime_1.jsx)("span", { "data-testid": "rowid", children: props.getRowId(items[0]) }), (0, jsx_runtime_1.jsx)("button", { "data-testid": "Rowclick", onClick: function () {
118
+ props.onRowClick(items[0].groupId);
119
+ }, children: "Rowclick" }), (0, jsx_runtime_1.jsx)("button", { "data-testid": "CreateBtn", onClick: props.onCreateButtonClick, children: "CreateBtn" }), (0, jsx_runtime_1.jsx)("button", { onClick: function () {
120
+ props.onChangeQueryInput({
121
+ pageIndex: 1,
122
+ pageSize: 10,
123
+ });
124
+ }, children: "ChangeInput" }), (0, jsx_runtime_1.jsx)("button", { "data-testid": "onDelete", onClick: function () {
125
+ props.onDelete('onDelete');
126
+ }, children: "Remove Btn" }), (0, jsx_runtime_1.jsx)("p", { children: JSON.stringify(props.rows) }), (0, jsx_runtime_1.jsxs)("span", { children: ["totalItemCount:", props.totalOfRows] })] }));
127
+ },
128
+ }); });
129
+ var renderUi = function () {
130
+ return (0, react_1.render)((0, jsx_runtime_1.jsx)(Router_1.BrowserRouter, { children: (0, jsx_runtime_1.jsx)(Container_1.default, {}) }));
131
+ };
132
+ describe('User Container Component', function () {
133
+ it('renders without crashing', function () {
134
+ renderUi();
135
+ });
136
+ it('render state', function () { return __awaiter(void 0, void 0, void 0, function () {
137
+ return __generator(this, function (_a) {
138
+ switch (_a.label) {
139
+ case 0:
140
+ renderUi();
141
+ expect(react_1.screen.getByTestId('CreateBtn')).toBeInTheDocument();
142
+ return [4 /*yield*/, (0, react_1.waitFor)(function () {
143
+ expect(react_1.screen.getByText(JSON.stringify(items))).toBeInTheDocument();
144
+ })];
145
+ case 1:
146
+ _a.sent();
147
+ return [4 /*yield*/, (0, react_1.waitFor)(function () {
148
+ expect(react_1.screen.getByText("totalItemCount:".concat(items.length))).toBeInTheDocument();
149
+ })];
150
+ case 2:
151
+ _a.sent();
152
+ return [2 /*return*/];
153
+ }
154
+ });
155
+ }); });
156
+ it('get rowid', function () {
157
+ renderUi();
158
+ expect(react_1.screen.getByText(items[0].groupId)).toBeInTheDocument();
159
+ });
160
+ it('Change queryInput', function () {
161
+ var groupsPagingSpy = jest.spyOn(clientMethod, 'groupsPaging');
162
+ renderUi();
163
+ react_1.fireEvent.click(react_1.screen.getByText('ChangeInput'));
164
+ expect(groupsPagingSpy).toBeCalled();
165
+ });
166
+ it('Trigger Create button', function () { return __awaiter(void 0, void 0, void 0, function () {
167
+ return __generator(this, function (_a) {
168
+ switch (_a.label) {
169
+ case 0:
170
+ renderUi();
171
+ react_1.fireEvent.click(react_1.screen.getByTestId('CreateBtn'));
172
+ return [4 /*yield*/, (0, react_1.waitFor)(function () {
173
+ return expect(window.location.href).toContain(['http://localhost', Constants_1.CREATE_PATH].join('/'));
174
+ })];
175
+ case 1:
176
+ _a.sent();
177
+ return [2 /*return*/];
178
+ }
179
+ });
180
+ }); });
181
+ it('Row click', function () { return __awaiter(void 0, void 0, void 0, function () {
182
+ return __generator(this, function (_a) {
183
+ switch (_a.label) {
184
+ case 0:
185
+ renderUi();
186
+ react_1.fireEvent.click(react_1.screen.getByTestId('Rowclick'));
187
+ return [4 /*yield*/, (0, react_1.waitFor)(function () {
188
+ return expect(window.location.href).toContain([
189
+ 'http://localhost',
190
+ Constants_1.EDIT_PATH,
191
+ items[0].groupId,
192
+ ].join('/'));
193
+ })];
194
+ case 1:
195
+ _a.sent();
196
+ return [2 /*return*/];
197
+ }
198
+ });
199
+ }); });
200
+ it('Delete group', function () { return __awaiter(void 0, void 0, void 0, function () {
201
+ var groupsDeleteSpy;
202
+ return __generator(this, function (_a) {
203
+ groupsDeleteSpy = jest.spyOn(clientMethod, 'groupsDelete');
204
+ renderUi();
205
+ react_1.fireEvent.click(react_1.screen.getByTestId('onDelete'));
206
+ expect(groupsDeleteSpy).toBeCalled();
207
+ return [2 /*return*/];
208
+ });
209
+ }); });
210
+ });
@@ -0,0 +1,3 @@
1
+ /// <reference types="react" />
2
+ declare const CreateOrEdit: React.FC;
3
+ export default CreateOrEdit;
@@ -0,0 +1,84 @@
1
+ "use strict";
2
+ var __assign = (this && this.__assign) || function () {
3
+ __assign = Object.assign || function(t) {
4
+ for (var s, i = 1, n = arguments.length; i < n; i++) {
5
+ s = arguments[i];
6
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
7
+ t[p] = s[p];
8
+ }
9
+ return t;
10
+ };
11
+ return __assign.apply(this, arguments);
12
+ };
13
+ var __importDefault = (this && this.__importDefault) || function (mod) {
14
+ return (mod && mod.__esModule) ? mod : { "default": mod };
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ var jsx_runtime_1 = require("react/jsx-runtime");
18
+ var ClassicDrawer_1 = __importDefault(require("../../Commons/Components/ClassicDrawer"));
19
+ var AWING_1 = require("../../AWING");
20
+ var react_1 = require("react");
21
+ var react_i18next_1 = require("react-i18next");
22
+ var Router_1 = require("../../AWING/Router");
23
+ var UserComponent_1 = __importDefault(require("./User/UserComponent"));
24
+ var SearchUser_1 = __importDefault(require("./User/SearchUser"));
25
+ var Hooks_1 = __importDefault(require("./Hooks"));
26
+ var Constants_1 = require("../../ACM-AXN/User/Constants");
27
+ var CreateOrEdit = function () {
28
+ var _a;
29
+ var groupId = (0, Router_1.useParams)().groupId;
30
+ var t = (0, react_i18next_1.useTranslation)().t;
31
+ var service = (0, Hooks_1.default)().service;
32
+ var _b = (0, react_1.useState)(false), confirmExit = _b[0], setConfirmExit = _b[1];
33
+ var _c = (0, react_1.useState)(false), isValid = _c[0], setValid = _c[1];
34
+ var _d = (0, react_1.useState)([]), users = _d[0], setUsers = _d[1];
35
+ var _e = (0, react_1.useState)({
36
+ userIds: [],
37
+ group: { name: '', description: '' },
38
+ }), businessUnitdata = _e[0], setBusinessUnitData = _e[1];
39
+ var _f = (0, react_1.useState)(true), loading = _f[0], setloading = _f[1];
40
+ (0, react_1.useEffect)(function () {
41
+ setloading(true);
42
+ Promise.all([
43
+ groupId
44
+ ? service.groupsGet(groupId).then(setBusinessUnitData)
45
+ : Promise.resolve(),
46
+ service.usersGet().then(setUsers),
47
+ ]).finally(function () {
48
+ setloading(false);
49
+ });
50
+ // eslint-disable-next-line react-hooks/exhaustive-deps
51
+ }, []);
52
+ var handleUpdate = (0, react_1.useCallback)(function (obj, formValid, fieldUpdate) {
53
+ setConfirmExit(Boolean(fieldUpdate));
54
+ setValid(formValid);
55
+ setBusinessUnitData(function (prev) {
56
+ return (__assign(__assign({}, prev), { group: __assign(__assign({}, prev === null || prev === void 0 ? void 0 : prev.group), obj) }));
57
+ });
58
+ }, []);
59
+ var handleSubmit = (0, react_1.useCallback)(function () {
60
+ if (groupId) {
61
+ return service.groupsPut(groupId, businessUnitdata);
62
+ }
63
+ return service.groupsPost(businessUnitdata);
64
+ }, [businessUnitdata, service, groupId]);
65
+ return ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsx)(ClassicDrawer_1.default, { title: "".concat(t(['UserGroup', groupId ? 'Edit' : 'Create'].join('.'))).concat(groupId ? ": ".concat((_a = businessUnitdata.group) === null || _a === void 0 ? void 0 : _a.name) : '', "\n "), onSubmit: handleSubmit, isLoadingButtonSubmit: false, disableButtonSubmit: !isValid, confirmExit: confirmExit, childrenWrapperStyle: { padding: 0 }, children: loading ? ((0, jsx_runtime_1.jsx)(AWING_1.CircularProgress, {})) : ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsx)(AWING_1.DataForm, { caption: t('UserGroup.TitleUserGroupInfo'), fields: [
66
+ {
67
+ fieldName: 'name',
68
+ type: 'text',
69
+ label: t('Common.GroupName'),
70
+ required: true,
71
+ },
72
+ {
73
+ fieldName: 'description',
74
+ type: 'text-area',
75
+ label: t('Common.Description'),
76
+ onValidate: function () { return true; },
77
+ },
78
+ ], oldValue: businessUnitdata === null || businessUnitdata === void 0 ? void 0 : businessUnitdata.group, onUpdate: handleUpdate }), (0, jsx_runtime_1.jsx)(UserComponent_1.default, { rows: users.filter(function (user) { var _a; return (_a = businessUnitdata === null || businessUnitdata === void 0 ? void 0 : businessUnitdata.userIds) === null || _a === void 0 ? void 0 : _a.includes(user.userId); }), onChangeAddUser: function (userIds) {
79
+ setBusinessUnitData(function (prev) { return (__assign(__assign({}, prev), { userIds: userIds })); });
80
+ } })] })) }), (0, jsx_runtime_1.jsx)(Router_1.Routes, { children: (0, jsx_runtime_1.jsx)(Router_1.Route, { path: Constants_1.ADD_USER_TO_GROUP, element: (0, jsx_runtime_1.jsx)(SearchUser_1.default, { onChangeAddUser: function (userIds) {
81
+ setBusinessUnitData(function (prev) { return (__assign(__assign({}, prev), { userIds: userIds })); });
82
+ }, listUserId: (businessUnitdata === null || businessUnitdata === void 0 ? void 0 : businessUnitdata.userIds) || [], users: users }) }, Constants_1.ADD_USER_TO_GROUP) })] }));
83
+ };
84
+ exports.default = CreateOrEdit;
@@ -0,0 +1 @@
1
+ import '@testing-library/jest-dom/extend-expect';
@@ -0,0 +1,235 @@
1
+ "use strict";
2
+ var __assign = (this && this.__assign) || function () {
3
+ __assign = Object.assign || function(t) {
4
+ for (var s, i = 1, n = arguments.length; i < n; i++) {
5
+ s = arguments[i];
6
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
7
+ t[p] = s[p];
8
+ }
9
+ return t;
10
+ };
11
+ return __assign.apply(this, arguments);
12
+ };
13
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
14
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
15
+ return new (P || (P = Promise))(function (resolve, reject) {
16
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
17
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
18
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
19
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
20
+ });
21
+ };
22
+ var __generator = (this && this.__generator) || function (thisArg, body) {
23
+ var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
24
+ return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
25
+ function verb(n) { return function (v) { return step([n, v]); }; }
26
+ function step(op) {
27
+ if (f) throw new TypeError("Generator is already executing.");
28
+ while (g && (g = 0, op[0] && (_ = 0)), _) try {
29
+ if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
30
+ if (y = 0, t) op = [op[0] & 2, t.value];
31
+ switch (op[0]) {
32
+ case 0: case 1: t = op; break;
33
+ case 4: _.label++; return { value: op[1], done: false };
34
+ case 5: _.label++; y = op[1]; op = [0]; continue;
35
+ case 7: op = _.ops.pop(); _.trys.pop(); continue;
36
+ default:
37
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
38
+ if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
39
+ if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
40
+ if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
41
+ if (t[2]) _.ops.pop();
42
+ _.trys.pop(); continue;
43
+ }
44
+ op = body.call(thisArg, _);
45
+ } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
46
+ if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
47
+ }
48
+ };
49
+ var __importDefault = (this && this.__importDefault) || function (mod) {
50
+ return (mod && mod.__esModule) ? mod : { "default": mod };
51
+ };
52
+ Object.defineProperty(exports, "__esModule", { value: true });
53
+ var jsx_runtime_1 = require("react/jsx-runtime");
54
+ /* eslint-disable testing-library/no-wait-for-side-effects */
55
+ require("@testing-library/jest-dom/extend-expect");
56
+ var react_1 = require("@testing-library/react");
57
+ var Router_1 = require("../../AWING/Router");
58
+ var CreateOrEdit_1 = __importDefault(require("./CreateOrEdit"));
59
+ // Mock useParam
60
+ var groupId = 'groupId123';
61
+ jest.mock('AWING/Router', function () { return (__assign(__assign({}, jest.requireActual('AWING/Router')), { useParams: jest.fn(), Routes: function (props) {
62
+ return (0, jsx_runtime_1.jsx)(jsx_runtime_1.Fragment, { children: props.children });
63
+ }, Route: function (props) {
64
+ return (0, jsx_runtime_1.jsx)(jsx_runtime_1.Fragment, { children: props.element });
65
+ } })); });
66
+ // Mock Axios client
67
+ var groupInfo = {
68
+ group: {
69
+ groupId: '10',
70
+ name: 'Administrators',
71
+ description: 'Quản trị hệ thống',
72
+ },
73
+ userIds: ['1029', '1118', '1523'],
74
+ };
75
+ var userList = [
76
+ {
77
+ userId: '1029',
78
+ name: 'tester',
79
+ description: '',
80
+ username: 'test',
81
+ gender: 1,
82
+ image: null,
83
+ },
84
+ {
85
+ userId: '1118',
86
+ name: 'tester 1',
87
+ description: null,
88
+ username: 'test1',
89
+ gender: 1,
90
+ image: null,
91
+ },
92
+ {
93
+ userId: '1523',
94
+ name: 'Lê Thế Phong',
95
+ description: '',
96
+ username: 'phonglt@awing.vn',
97
+ gender: 1,
98
+ image: null,
99
+ },
100
+ ];
101
+ var clientMethod = {
102
+ groupsGet: function () { return Promise.resolve(groupInfo); },
103
+ usersGet: function () { return Promise.resolve(userList); },
104
+ groupsPut: function (groupId, businessUnitdata) {
105
+ return Promise.resolve();
106
+ },
107
+ groupsPost: function (businessUnitdata) { return Promise.resolve(); },
108
+ };
109
+ jest.mock('Commons/UseAxiosProvider', function () { return ({
110
+ __esModule: true,
111
+ default: function () { return ({
112
+ client: {
113
+ groupsGet: jest.fn(function () { return Promise.resolve(clientMethod.groupsGet()); }),
114
+ usersGet: jest.fn(function () { return Promise.resolve(clientMethod.usersGet()); }),
115
+ groupsPut: jest.fn(function (groupId, businessUnitdata) {
116
+ return Promise.resolve(clientMethod.groupsPut(groupId, businessUnitdata));
117
+ }),
118
+ groupsPost: jest.fn(function (businessUnitdata) {
119
+ return Promise.resolve(clientMethod.groupsPost(businessUnitdata));
120
+ }),
121
+ },
122
+ }); },
123
+ }); });
124
+ // Mock i18next
125
+ jest.mock('react-i18next', function () { return (__assign(__assign({}, jest.requireActual('react-i18next')), { useTranslation: function () { return ({ t: jest.fn(function (key) { return key; }) }); } })); });
126
+ // Mock Drawer
127
+ jest.mock('Commons/Components/ClassicDrawer', function () { return function (props) { return ((0, jsx_runtime_1.jsxs)("div", { children: [(0, jsx_runtime_1.jsx)("button", { "data-testid": "onSubmit", onClick: props.onSubmit, children: "submit" }), props.children] })); }; });
128
+ // Mock DataForm
129
+ jest.mock('AWING', function () { return ({
130
+ DataForm: function (props) {
131
+ props.fields.forEach(function (element) {
132
+ if (element === null || element === void 0 ? void 0 : element.onValidate) {
133
+ element === null || element === void 0 ? void 0 : element.onValidate();
134
+ }
135
+ });
136
+ return ((0, jsx_runtime_1.jsxs)("div", { "data-testid": "DataForm", children: [(0, jsx_runtime_1.jsx)("p", { children: JSON.stringify(props.oldValue) }), (0, jsx_runtime_1.jsx)("button", { "data-testid": "onUpdate", onClick: function () {
137
+ props.onUpdate({
138
+ name: 'name',
139
+ description: 'description',
140
+ });
141
+ } })] }));
142
+ },
143
+ }); });
144
+ // Mock UserComponent
145
+ jest.mock('./User/UserComponent', function () { return function (props) { return ((0, jsx_runtime_1.jsx)("div", { children: JSON.stringify(props.rows) })); }; });
146
+ jest.mock('./User/SearchUser', function () { return function (props) { return ((0, jsx_runtime_1.jsx)("button", { onClick: function () {
147
+ props.onChangeAddUser([userList[1].userId]);
148
+ }, "data-testid": "onChangeAddUser" })); }; });
149
+ describe('GroupUser CreateOrEdit component', function () {
150
+ beforeEach(function () {
151
+ ;
152
+ Router_1.useParams.mockReturnValue({ groupId: '' });
153
+ });
154
+ var renderUi = function () {
155
+ return (0, react_1.render)((0, jsx_runtime_1.jsx)(Router_1.BrowserRouter, { children: (0, jsx_runtime_1.jsx)(CreateOrEdit_1.default, {}) }));
156
+ };
157
+ it('render without crash', function () {
158
+ renderUi();
159
+ });
160
+ it('render with data', function () { return __awaiter(void 0, void 0, void 0, function () {
161
+ return __generator(this, function (_a) {
162
+ switch (_a.label) {
163
+ case 0:
164
+ ;
165
+ Router_1.useParams.mockReturnValue({ groupId: groupId });
166
+ renderUi();
167
+ return [4 /*yield*/, (0, react_1.waitFor)(function () {
168
+ expect(react_1.screen.getByText(JSON.stringify(groupInfo.group))).toBeInTheDocument();
169
+ })];
170
+ case 1:
171
+ _a.sent();
172
+ return [4 /*yield*/, (0, react_1.waitFor)(function () {
173
+ expect(react_1.screen.getByText(JSON.stringify(userList))).toBeInTheDocument();
174
+ })];
175
+ case 2:
176
+ _a.sent();
177
+ return [2 /*return*/];
178
+ }
179
+ });
180
+ }); });
181
+ it('trigger onChangeAddUser', function () { return __awaiter(void 0, void 0, void 0, function () {
182
+ return __generator(this, function (_a) {
183
+ switch (_a.label) {
184
+ case 0:
185
+ renderUi();
186
+ react_1.fireEvent.click(react_1.screen.getByTestId('onChangeAddUser'));
187
+ return [4 /*yield*/, (0, react_1.waitFor)(function () {
188
+ expect(react_1.screen.getByText(JSON.stringify([userList[1]]))).toBeInTheDocument();
189
+ })];
190
+ case 1:
191
+ _a.sent();
192
+ return [2 /*return*/];
193
+ }
194
+ });
195
+ }); });
196
+ it('trigger handleSubmit-create', function () {
197
+ var groupsPostSpy = jest.spyOn(clientMethod, 'groupsPost');
198
+ renderUi();
199
+ react_1.fireEvent.click(react_1.screen.getByTestId('onChangeAddUser'));
200
+ react_1.fireEvent.click(react_1.screen.getByTestId('onUpdate'));
201
+ react_1.fireEvent.click(react_1.screen.getByTestId('onSubmit'));
202
+ expect(groupsPostSpy).toHaveBeenCalledWith({
203
+ group: { description: 'description', name: 'name' },
204
+ userIds: ['1118'],
205
+ });
206
+ });
207
+ it('trigger handleSubmit-edit', function () { return __awaiter(void 0, void 0, void 0, function () {
208
+ var groupsPutSpy;
209
+ return __generator(this, function (_a) {
210
+ switch (_a.label) {
211
+ case 0:
212
+ ;
213
+ Router_1.useParams.mockReturnValue({ groupId: groupId });
214
+ groupsPutSpy = jest.spyOn(clientMethod, 'groupsPut');
215
+ renderUi();
216
+ react_1.fireEvent.click(react_1.screen.getByTestId('onChangeAddUser'));
217
+ return [4 /*yield*/, (0, react_1.waitFor)(function () {
218
+ react_1.fireEvent.click(react_1.screen.getByTestId('onUpdate'));
219
+ react_1.fireEvent.click(react_1.screen.getByTestId('onSubmit'));
220
+ return expect(groupsPutSpy).toHaveBeenCalledWith(groupId, {
221
+ group: {
222
+ description: 'description',
223
+ name: 'name',
224
+ groupId: '10',
225
+ },
226
+ userIds: ['1029', '1118', '1523'],
227
+ });
228
+ })];
229
+ case 1:
230
+ _a.sent();
231
+ return [2 /*return*/];
232
+ }
233
+ });
234
+ }); });
235
+ });
@@ -0,0 +1,5 @@
1
+ /// <reference types="react" />
2
+ import { GroupUserProps } from "./Types";
3
+ export declare const groupUserPropsContext: import("react").Context<GroupUserProps>;
4
+ declare const useGroupUserProps: () => GroupUserProps;
5
+ export default useGroupUserProps;
@@ -0,0 +1,13 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.groupUserPropsContext = void 0;
4
+ var react_1 = require("react");
5
+ var react_2 = require("react");
6
+ exports.groupUserPropsContext = (0, react_1.createContext)({});
7
+ var useGroupUserProps = function () {
8
+ var props = (0, react_2.useContext)(exports.groupUserPropsContext);
9
+ return (0, react_2.useMemo)(function () {
10
+ return props;
11
+ }, [props]);
12
+ };
13
+ exports.default = useGroupUserProps;