@addev-be/ui 0.16.10 → 0.17.1
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/dist/Icons.d.ts +1 -3
- package/dist/Icons.js +1 -6
- package/dist/components/auth/LoginForm.js +5 -7
- package/dist/components/auth/PasswordRecoveryForm.js +5 -6
- package/dist/components/auth/styles.d.ts +3 -1
- package/dist/components/data/DataGrid/DataGridCell.d.ts +1 -1
- package/dist/components/data/DataGrid/DataGridCell.js +15 -25
- package/dist/components/data/DataGrid/DataGridColumnsModal/hooks.js +2 -2
- package/dist/components/data/DataGrid/DataGridColumnsModal/index.js +7 -17
- package/dist/components/data/DataGrid/DataGridColumnsModal/styles.d.ts +18 -6
- package/dist/components/data/DataGrid/DataGridColumnsModal/styles.js +9 -19
- package/dist/components/data/DataGrid/DataGridEditableCell/CheckboxEditableCell.d.ts +1 -1
- package/dist/components/data/DataGrid/DataGridEditableCell/CheckboxEditableCell.js +3 -3
- package/dist/components/data/DataGrid/DataGridEditableCell/DateEditableCell.d.ts +1 -1
- package/dist/components/data/DataGrid/DataGridEditableCell/DateEditableCell.js +4 -4
- package/dist/components/data/DataGrid/DataGridEditableCell/NumberEditableCell.d.ts +2 -4
- package/dist/components/data/DataGrid/DataGridEditableCell/NumberEditableCell.js +5 -7
- package/dist/components/data/DataGrid/DataGridEditableCell/TextEditableCell.d.ts +1 -1
- package/dist/components/data/DataGrid/DataGridEditableCell/TextEditableCell.js +3 -3
- package/dist/components/data/DataGrid/DataGridEditableCell/index.js +12 -12
- package/dist/components/data/DataGrid/DataGridEditableCell/styles.js +1 -1
- package/dist/components/data/DataGrid/DataGridEditableCell/types.d.ts +3 -3
- package/dist/components/data/DataGrid/DataGridFilterMenu/FilterValuesScroller.js +10 -19
- package/dist/components/data/DataGrid/DataGridFilterMenu/hooks.js +2 -2
- package/dist/components/data/DataGrid/DataGridFilterMenu/index.js +19 -24
- package/dist/components/data/DataGrid/DataGridFilterMenu/styles.d.ts +15 -5
- package/dist/components/data/DataGrid/DataGridFilterMenu/styles.js +5 -5
- package/dist/components/data/DataGrid/DataGridFooter.js +10 -18
- package/dist/components/data/DataGrid/DataGridHeader.js +60 -20
- package/dist/components/data/DataGrid/DataGridHeaderCell.js +13 -22
- package/dist/components/data/DataGrid/DataGridRowTemplate.js +10 -22
- package/dist/components/data/DataGrid/FilterModalContent/index.js +12 -22
- package/dist/components/data/DataGrid/FilterModalContent/styles.d.ts +3 -1
- package/dist/components/data/DataGrid/helpers/columns.d.ts +9 -11
- package/dist/components/data/DataGrid/helpers/columns.js +19 -38
- package/dist/components/data/DataGrid/hooks/useDataGrid.js +5 -6
- package/dist/components/data/DataGrid/hooks/useDataGridChangedRows.d.ts +7 -7
- package/dist/components/data/DataGrid/hooks/useDataGridChangedRows.js +32 -52
- package/dist/components/data/DataGrid/hooks/useDataGridSettings.d.ts +12 -8
- package/dist/components/data/DataGrid/hooks/useDataGridSettings.js +2 -2
- package/dist/components/data/DataGrid/index.d.ts +6 -3
- package/dist/components/data/DataGrid/index.js +19 -42
- package/dist/components/data/DataGrid/styles.d.ts +18 -10
- package/dist/components/data/DataGrid/styles.js +37 -64
- package/dist/components/data/DataGrid/types.d.ts +30 -42
- package/dist/components/data/DataGrid/types.js +15 -25
- package/dist/components/data/SqlRequestDataGrid/SqlRequestForeignListEditableCell.d.ts +1 -2
- package/dist/components/data/SqlRequestDataGrid/SqlRequestForeignListEditableCell.js +3 -2
- package/dist/components/data/SqlRequestDataGrid/helpers/columns.d.ts +1 -1
- package/dist/components/data/SqlRequestDataGrid/helpers/columns.js +47 -70
- package/dist/components/data/SqlRequestDataGrid/index.d.ts +11 -4
- package/dist/components/data/SqlRequestDataGrid/index.js +30 -50
- package/dist/components/data/SqlRequestForeignList/index.d.ts +3 -4
- package/dist/components/data/SqlRequestForeignList/index.js +15 -15
- package/dist/components/data/SqlRequestForeignList/styles.js +1 -1
- package/dist/components/data/SqlRequestForeignList/types.d.ts +1 -1
- package/dist/components/data/SqlRequestForeignList/types.js +1 -0
- package/dist/components/data/SqlRequestGrid/filters/FiltersSidebar.js +10 -19
- package/dist/components/data/SqlRequestGrid/filters/styles.js +3 -3
- package/dist/components/data/SqlRequestGrid/index.d.ts +3 -4
- package/dist/components/data/SqlRequestGrid/index.js +26 -26
- package/dist/components/data/SqlRequestGrid/styles.d.ts +3 -1
- package/dist/components/data/SqlRequestGrid/types.js +1 -0
- package/dist/components/data/VirtualScroller/hooks.js +2 -2
- package/dist/components/data/VirtualScroller/index.js +8 -17
- package/dist/components/data/VirtualScroller/styles.d.ts +6 -2
- package/dist/components/data/VirtualScroller/styles.js +1 -0
- package/dist/components/data/VirtualScroller/types.js +1 -0
- package/dist/components/forms/AutoTextArea.js +1 -2
- package/dist/components/forms/Button.d.ts +4 -4
- package/dist/components/forms/Button.js +19 -29
- package/dist/components/forms/Form/Checkbox.d.ts +2 -2
- package/dist/components/forms/Form/Checkbox.js +2 -2
- package/dist/components/forms/Form/FormGroup.d.ts +1 -3
- package/dist/components/forms/Form/FormGroup.js +2 -2
- package/dist/components/forms/Form/Input.d.ts +2 -2
- package/dist/components/forms/Form/Input.js +2 -3
- package/dist/components/forms/Form/Select.d.ts +8 -4
- package/dist/components/forms/Form/Select.js +8 -12
- package/dist/components/forms/Form/TextArea.d.ts +2 -2
- package/dist/components/forms/Form/TextArea.js +2 -3
- package/dist/components/forms/Form/index.d.ts +20 -40
- package/dist/components/forms/Form/index.js +8 -15
- package/dist/components/forms/Form/styles.d.ts +7 -10
- package/dist/components/forms/Form/styles.js +19 -31
- package/dist/components/forms/IconButton.d.ts +4 -8
- package/dist/components/forms/IconButton.js +4 -4
- package/dist/components/forms/index.d.ts +1 -2
- package/dist/components/forms/index.js +1 -2
- package/dist/components/forms/styles.d.ts +6 -18
- package/dist/components/forms/styles.js +14 -25
- package/dist/components/layout/Columns.d.ts +1 -3
- package/dist/components/layout/Columns.js +6 -8
- package/dist/components/layout/Dropdown/index.js +9 -19
- package/dist/components/layout/Dropdown/styles.d.ts +6 -3
- package/dist/components/layout/Dropdown/styles.js +9 -22
- package/dist/components/layout/Grid/styles.d.ts +3 -1
- package/dist/components/layout/Loading/index.js +9 -19
- package/dist/components/layout/Loading/styles.d.ts +6 -2
- package/dist/components/layout/Modal/index.js +9 -19
- package/dist/components/layout/Modal/styles.d.ts +27 -9
- package/dist/components/layout/Modal/styles.js +11 -21
- package/dist/components/layout/index.d.ts +0 -1
- package/dist/components/layout/index.js +0 -1
- package/dist/components/search/HighlightedText.js +9 -11
- package/dist/components/search/QuickSearchBar.d.ts +2 -6
- package/dist/components/search/QuickSearchBar.js +25 -28
- package/dist/components/search/QuickSearchResults.js +7 -17
- package/dist/components/search/styles.d.ts +27 -9
- package/dist/components/search/styles.js +5 -5
- package/dist/components/search/types.d.ts +0 -3
- package/dist/components/ui/Avatar/index.d.ts +1 -1
- package/dist/components/ui/Avatar/index.js +7 -17
- package/dist/components/ui/Avatar/styles.js +7 -17
- package/dist/components/ui/Card/styles.d.ts +9 -3
- package/dist/components/ui/Card/styles.js +3 -3
- package/dist/components/ui/ContextMenu/styles.d.ts +12 -4
- package/dist/components/ui/ContextMenu/styles.js +12 -22
- package/dist/components/ui/Ellipsis.d.ts +1 -0
- package/dist/components/ui/Label.d.ts +1 -2
- package/dist/components/ui/Label.js +13 -23
- package/dist/components/ui/Message/index.js +9 -19
- package/dist/components/ui/Message/styles.d.ts +7 -4
- package/dist/components/ui/Message/styles.js +9 -20
- package/dist/components/ui/index.d.ts +0 -1
- package/dist/components/ui/index.js +0 -1
- package/dist/config/index.d.ts +4 -1
- package/dist/helpers/index.d.ts +0 -1
- package/dist/helpers/index.js +0 -1
- package/dist/hooks/index.d.ts +0 -1
- package/dist/hooks/index.js +0 -1
- package/dist/index.d.ts +5 -86
- package/dist/index.js +5 -86
- package/dist/providers/AuthenticationProvider/index.d.ts +1 -2
- package/dist/providers/AuthenticationProvider/index.js +21 -63
- package/dist/providers/LoadingProvider/index.js +2 -2
- package/dist/providers/PortalsProvider/index.js +7 -17
- package/dist/providers/PortalsProvider/styles.d.ts +9 -3
- package/dist/providers/ThemeProvider/ThemeProvider.d.ts +0 -1
- package/dist/providers/ThemeProvider/ThemeProvider.js +9 -11
- package/dist/providers/ThemeProvider/defaultTheme.d.ts +0 -1
- package/dist/providers/ThemeProvider/defaultTheme.js +1 -20
- package/dist/providers/ThemeProvider/helpers.d.ts +3 -12
- package/dist/providers/ThemeProvider/helpers.js +2 -54
- package/dist/providers/ThemeProvider/index.d.ts +3 -8
- package/dist/providers/ThemeProvider/index.js +18 -49
- package/dist/providers/ThemeProvider/types.d.ts +2 -3
- package/dist/providers/TrackingProvider/index.js +2 -2
- package/dist/providers/UiProviders/index.d.ts +1 -4
- package/dist/providers/UiProviders/index.js +10 -20
- package/dist/providers/UiProviders/styles.d.ts +3 -1
- package/dist/providers/UiProviders/styles.js +1 -1
- package/dist/providers/hooks.d.ts +0 -6
- package/dist/providers/hooks.js +1 -4
- package/dist/providers/index.d.ts +0 -1
- package/dist/providers/index.js +0 -1
- package/dist/services/WebSocketService.d.ts +0 -8
- package/dist/services/WebSocketService.js +2 -34
- package/dist/services/globalSearch.d.ts +2 -5
- package/dist/services/hooks.d.ts +0 -10
- package/dist/services/hooks.js +4 -91
- package/dist/services/index.js +7 -17
- package/dist/services/requests/auth.d.ts +11 -9
- package/dist/services/requests/generic.d.ts +15 -62
- package/dist/services/requests/generic.js +7 -7
- package/dist/services/requests/tracking.d.ts +8 -4
- package/dist/services/requests/userProfiles.d.ts +5 -5
- package/dist/services/requests/users.d.ts +16 -11
- package/dist/services/types/auth.d.ts +82 -80
- package/dist/services/types/auth.js +48 -58
- package/dist/services/types/base.d.ts +5 -5
- package/dist/services/types/base.js +11 -21
- package/dist/services/types/generic.d.ts +40 -39
- package/dist/services/types/generic.js +49 -55
- package/dist/services/types/tracking.d.ts +24 -24
- package/dist/services/types/tracking.js +28 -30
- package/dist/services/types/userProfiles.d.ts +60 -60
- package/dist/services/types/userProfiles.js +45 -48
- package/dist/services/types/users.d.ts +114 -108
- package/dist/services/types/users.js +59 -56
- package/dist/services/updateSqlRequests.js +1 -0
- package/eslint.config.js +28 -28
- package/package.json +1 -1
- package/src/components/data/DataGrid/DataGridEditableCell/index.tsx +5 -7
- package/src/components/data/DataGrid/DataGridHeader.tsx +16 -4
- package/src/components/data/DataGrid/DataGridRowTemplate.tsx +4 -2
- package/src/components/data/DataGrid/hooks/useDataGrid.tsx +3 -6
- package/src/components/data/DataGrid/hooks/useDataGridChangedRows.ts +65 -32
- package/src/components/data/DataGrid/hooks/useRefreshModal.tsx +48 -0
- package/src/components/data/DataGrid/styles.ts +9 -2
- package/src/components/data/DataGrid/types.ts +5 -5
- package/src/components/data/SqlRequestDataGrid/helpers/columns.tsx +4 -3
- package/src/components/layout/Modal/styles.ts +6 -2
- package/src/components/search/HighlightedText.tsx +24 -20
- package/src/components/search/QuickSearchBar.tsx +11 -7
- package/tsconfig.tsbuildinfo +1 -1
- package/dist/components/data/DataGrid/DataGridFilterMenu/helpers.d.ts +0 -2
- package/dist/components/data/DataGrid/DataGridFilterMenu/helpers.js +0 -19
- package/dist/components/data/DataGrid/DataGridToolbar.d.ts +0 -4
- package/dist/components/data/DataGrid/DataGridToolbar.js +0 -141
- package/dist/components/data/DataGrid/hooks/useRefreshModal.d.ts +0 -5
- package/dist/components/data/DataGrid/hooks/useRefreshModal.js +0 -25
- package/dist/components/data/SqlRequestDataGrid/helpers/rows.d.ts +0 -2
- package/dist/components/data/SqlRequestDataGrid/helpers/rows.js +0 -17
- package/dist/components/forms/Form/CustomSelect.d.ts +0 -13
- package/dist/components/forms/Form/CustomSelect.js +0 -50
- package/dist/components/forms/Form/Row.d.ts +0 -9
- package/dist/components/forms/Form/Row.js +0 -10
- package/dist/components/forms/NumberInput.d.ts +0 -9
- package/dist/components/forms/NumberInput.js +0 -40
- package/dist/components/layout/Flexbox.d.ts +0 -11
- package/dist/components/layout/Flexbox.js +0 -26
- package/dist/components/ui/TabsView/TabsList.d.ts +0 -10
- package/dist/components/ui/TabsView/TabsList.js +0 -40
- package/dist/components/ui/TabsView/TabsView.d.ts +0 -9
- package/dist/components/ui/TabsView/TabsView.js +0 -17
- package/dist/components/ui/TabsView/index.d.ts +0 -3
- package/dist/components/ui/TabsView/index.js +0 -19
- package/dist/components/ui/TabsView/styles.d.ts +0 -11
- package/dist/components/ui/TabsView/styles.js +0 -57
- package/dist/components/ui/TabsView/types.d.ts +0 -10
- package/dist/components/ui/TabsView/types.js +0 -2
- package/dist/helpers/components.d.ts +0 -2
- package/dist/helpers/components.js +0 -8
- package/dist/helpers/react.d.ts +0 -2
- package/dist/helpers/react.js +0 -8
- package/dist/helpers/styled/index.d.ts +0 -1
- package/dist/helpers/styled/index.js +0 -17
- package/dist/helpers/styled/space.d.ts +0 -39
- package/dist/helpers/styled/space.js +0 -90
- package/dist/helpers/styled/typography.d.ts +0 -9
- package/dist/helpers/styled/typography.js +0 -61
- package/dist/helpers/types.d.ts +0 -2
- package/dist/helpers/types.js +0 -8
- package/dist/hooks/useMutableState.d.ts +0 -8
- package/dist/hooks/useMutableState.js +0 -14
- package/dist/providers/ToastProvider/index.d.ts +0 -12
- package/dist/providers/ToastProvider/index.js +0 -66
- package/dist/types.d.ts +0 -3
- package/dist/types.js +0 -2
|
@@ -1,4 +1,15 @@
|
|
|
1
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
|
+
};
|
|
2
13
|
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
14
|
if (k2 === undefined) k2 = k;
|
|
4
15
|
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
@@ -15,66 +26,58 @@ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (
|
|
|
15
26
|
}) : function(o, v) {
|
|
16
27
|
o["default"] = v;
|
|
17
28
|
});
|
|
18
|
-
var __importStar = (this && this.__importStar) ||
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
return ownKeys(o);
|
|
26
|
-
};
|
|
27
|
-
return function (mod) {
|
|
28
|
-
if (mod && mod.__esModule) return mod;
|
|
29
|
-
var result = {};
|
|
30
|
-
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
-
__setModuleDefault(result, mod);
|
|
32
|
-
return result;
|
|
33
|
-
};
|
|
34
|
-
})();
|
|
29
|
+
var __importStar = (this && this.__importStar) || function (mod) {
|
|
30
|
+
if (mod && mod.__esModule) return mod;
|
|
31
|
+
var result = {};
|
|
32
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
33
|
+
__setModuleDefault(result, mod);
|
|
34
|
+
return result;
|
|
35
|
+
};
|
|
35
36
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
-
exports.
|
|
37
|
-
var
|
|
37
|
+
exports.deleteUserResponseDtoCodec = exports.deleteUserRequestDtoCodec = exports.saveUserResponseDtoCodec = exports.saveUserRequestDtoCodec = exports.getAllUsersResponseDtoCodec = exports.getAllUsersRequestDtoCodec = exports.getUserResponseDtoCodec = exports.getUserRequestDtoCodec = exports.userDtoCodec = void 0;
|
|
38
|
+
var t = __importStar(require("io-ts"));
|
|
38
39
|
var base_1 = require("./base");
|
|
39
40
|
var userProfiles_1 = require("./userProfiles");
|
|
40
|
-
exports.
|
|
41
|
-
username:
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
});
|
|
41
|
+
exports.userDtoCodec = t.intersection([
|
|
42
|
+
t.type(__assign(__assign({}, base_1.baseModelDtoCodec.props), { username: t.string, permissions: t.array(t.string), isAdmin: t.boolean, profile: t.union([userProfiles_1.userProfileDtoCodec, t.null]) })),
|
|
43
|
+
t.partial({
|
|
44
|
+
name: t.string,
|
|
45
|
+
email: t.string,
|
|
46
|
+
lastLogin: t.union([t.string, t.null]),
|
|
47
|
+
}),
|
|
48
|
+
], 'UserDTO');
|
|
49
49
|
/*****/
|
|
50
|
-
exports.
|
|
51
|
-
id:
|
|
52
|
-
});
|
|
53
|
-
exports.
|
|
54
|
-
status:
|
|
55
|
-
data: exports.
|
|
56
|
-
});
|
|
50
|
+
exports.getUserRequestDtoCodec = t.type({
|
|
51
|
+
id: t.string,
|
|
52
|
+
}, 'GetUserRequestDTO');
|
|
53
|
+
exports.getUserResponseDtoCodec = t.type({
|
|
54
|
+
status: t.number,
|
|
55
|
+
data: exports.userDtoCodec,
|
|
56
|
+
}, 'GetUserResponseDTO');
|
|
57
57
|
/*****/
|
|
58
|
-
exports.
|
|
59
|
-
exports.
|
|
60
|
-
status:
|
|
61
|
-
data:
|
|
62
|
-
});
|
|
58
|
+
exports.getAllUsersRequestDtoCodec = t.type({}, 'GetAllUsersRequestDTO');
|
|
59
|
+
exports.getAllUsersResponseDtoCodec = t.type({
|
|
60
|
+
status: t.number,
|
|
61
|
+
data: t.array(exports.userDtoCodec),
|
|
62
|
+
}, 'GetAllUsersResponseDTO');
|
|
63
63
|
/*****/
|
|
64
|
-
exports.
|
|
65
|
-
data:
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
})
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
64
|
+
exports.saveUserRequestDtoCodec = t.type({
|
|
65
|
+
data: t.intersection([
|
|
66
|
+
exports.userDtoCodec,
|
|
67
|
+
t.partial({
|
|
68
|
+
password: t.string,
|
|
69
|
+
}),
|
|
70
|
+
]),
|
|
71
|
+
password: t.string,
|
|
72
|
+
}, 'SaveUserRequestDTO');
|
|
73
|
+
exports.saveUserResponseDtoCodec = t.type({
|
|
74
|
+
status: t.number,
|
|
75
|
+
data: exports.userDtoCodec,
|
|
76
|
+
}, 'SaveUserResponseDTO');
|
|
74
77
|
/*****/
|
|
75
|
-
exports.
|
|
76
|
-
id:
|
|
77
|
-
});
|
|
78
|
-
exports.
|
|
79
|
-
status:
|
|
80
|
-
});
|
|
78
|
+
exports.deleteUserRequestDtoCodec = t.type({
|
|
79
|
+
id: t.string,
|
|
80
|
+
}, 'DeleteUserRequestDTO');
|
|
81
|
+
exports.deleteUserResponseDtoCodec = t.type({
|
|
82
|
+
status: t.number,
|
|
83
|
+
}, 'DeleteUserResponseDTO');
|
|
@@ -2,5 +2,6 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.useUpdateSqlRequestHandler = void 0;
|
|
4
4
|
var hooks_1 = require("./hooks");
|
|
5
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
5
6
|
var useUpdateSqlRequestHandler = function (name) { return (0, hooks_1.useWebSocketRequestHandler)(name); };
|
|
6
7
|
exports.useUpdateSqlRequestHandler = useUpdateSqlRequestHandler;
|
package/eslint.config.js
CHANGED
|
@@ -1,28 +1,28 @@
|
|
|
1
|
-
import js from '@eslint/js'
|
|
2
|
-
import globals from 'globals'
|
|
3
|
-
import reactHooks from 'eslint-plugin-react-hooks'
|
|
4
|
-
import reactRefresh from 'eslint-plugin-react-refresh'
|
|
5
|
-
import tseslint from 'typescript-eslint'
|
|
6
|
-
|
|
7
|
-
export default tseslint.config(
|
|
8
|
-
{ ignores: ['dist'] },
|
|
9
|
-
{
|
|
10
|
-
extends: [js.configs.recommended, ...tseslint.configs.recommended],
|
|
11
|
-
files: ['**/*.{ts,tsx}'],
|
|
12
|
-
languageOptions: {
|
|
13
|
-
ecmaVersion: 2020,
|
|
14
|
-
globals: globals.browser,
|
|
15
|
-
},
|
|
16
|
-
plugins: {
|
|
17
|
-
'react-hooks': reactHooks,
|
|
18
|
-
'react-refresh': reactRefresh,
|
|
19
|
-
},
|
|
20
|
-
rules: {
|
|
21
|
-
...reactHooks.configs.recommended.rules,
|
|
22
|
-
'react-refresh/only-export-components': [
|
|
23
|
-
'warn',
|
|
24
|
-
{ allowConstantExport: true },
|
|
25
|
-
],
|
|
26
|
-
},
|
|
27
|
-
},
|
|
28
|
-
)
|
|
1
|
+
import js from '@eslint/js'
|
|
2
|
+
import globals from 'globals'
|
|
3
|
+
import reactHooks from 'eslint-plugin-react-hooks'
|
|
4
|
+
import reactRefresh from 'eslint-plugin-react-refresh'
|
|
5
|
+
import tseslint from 'typescript-eslint'
|
|
6
|
+
|
|
7
|
+
export default tseslint.config(
|
|
8
|
+
{ ignores: ['dist'] },
|
|
9
|
+
{
|
|
10
|
+
extends: [js.configs.recommended, ...tseslint.configs.recommended],
|
|
11
|
+
files: ['**/*.{ts,tsx}'],
|
|
12
|
+
languageOptions: {
|
|
13
|
+
ecmaVersion: 2020,
|
|
14
|
+
globals: globals.browser,
|
|
15
|
+
},
|
|
16
|
+
plugins: {
|
|
17
|
+
'react-hooks': reactHooks,
|
|
18
|
+
'react-refresh': reactRefresh,
|
|
19
|
+
},
|
|
20
|
+
rules: {
|
|
21
|
+
...reactHooks.configs.recommended.rules,
|
|
22
|
+
'react-refresh/only-export-components': [
|
|
23
|
+
'warn',
|
|
24
|
+
{ allowConstantExport: true },
|
|
25
|
+
],
|
|
26
|
+
},
|
|
27
|
+
},
|
|
28
|
+
)
|
package/package.json
CHANGED
|
@@ -22,29 +22,27 @@ export const DataGridEditableCell = <R, T>({
|
|
|
22
22
|
const rowKey = rowKeyGetter(row);
|
|
23
23
|
|
|
24
24
|
const defaultItemToPartialRow = useCallback(
|
|
25
|
-
(row: R, newValue: T): Partial<R> =>
|
|
26
|
-
({ [columnKey]: newValue } as
|
|
25
|
+
(key: string, row: R, newValue: T): Partial<R> =>
|
|
26
|
+
({ Id: key, [columnKey]: newValue } as any),
|
|
27
27
|
[columnKey]
|
|
28
28
|
);
|
|
29
29
|
const partialRowGetter: EditableDataGridColumn<R, T>['itemToPartialRow'] =
|
|
30
30
|
column.itemToPartialRow ?? defaultItemToPartialRow;
|
|
31
31
|
|
|
32
32
|
const save = useCallback(() => {
|
|
33
|
-
const rowIndex = rows.findIndex(
|
|
34
|
-
(r) => rowKeyGetter(r) === rowKeyGetter(row)
|
|
35
|
-
);
|
|
33
|
+
const rowIndex = rows.findIndex((r) => rowKeyGetter(r) === rowKey);
|
|
36
34
|
|
|
37
35
|
// If row is found
|
|
38
36
|
if (rowIndex >= 0) {
|
|
39
37
|
// Update the row with the new value
|
|
40
|
-
const partialRow = partialRowGetter(row, value);
|
|
38
|
+
const partialRow = partialRowGetter(rowKey, row, value);
|
|
41
39
|
const newRow = {
|
|
42
40
|
...row,
|
|
43
41
|
...partialRow,
|
|
44
42
|
};
|
|
45
43
|
|
|
46
44
|
// Update the edited rows state
|
|
47
|
-
editRow(
|
|
45
|
+
editRow(partialRow);
|
|
48
46
|
|
|
49
47
|
// Update the rows
|
|
50
48
|
setRows?.((oldRows) => {
|
|
@@ -20,6 +20,7 @@ import { IndeterminateCheckbox } from '../../forms/IndeterminateCheckbox';
|
|
|
20
20
|
import { Loading } from '../../layout';
|
|
21
21
|
import { useDataGridColumnsModal } from './DataGridColumnsModal/hooks';
|
|
22
22
|
import { useDataGridContext } from './hooks';
|
|
23
|
+
import { useRefreshModal } from './hooks/useRefreshModal';
|
|
23
24
|
|
|
24
25
|
export const DataGridHeader = <R,>({
|
|
25
26
|
context,
|
|
@@ -89,17 +90,27 @@ export const DataGridHeader = <R,>({
|
|
|
89
90
|
const add = useCallback(async () => {
|
|
90
91
|
if (onAddClicked) {
|
|
91
92
|
const row = await onAddClicked();
|
|
92
|
-
|
|
93
|
-
addRow(key, row);
|
|
93
|
+
addRow(row);
|
|
94
94
|
}
|
|
95
|
-
}, [addRow, onAddClicked
|
|
95
|
+
}, [addRow, onAddClicked]);
|
|
96
96
|
|
|
97
|
-
const
|
|
97
|
+
const doRefresh = useCallback(() => {
|
|
98
98
|
refresh?.();
|
|
99
99
|
clearChangedRows();
|
|
100
100
|
setSelectedKeys([]);
|
|
101
101
|
}, [clearChangedRows, refresh, setSelectedKeys]);
|
|
102
102
|
|
|
103
|
+
const { openModal: openRefreshModal, modal: refreshModal } =
|
|
104
|
+
useRefreshModal(doRefresh);
|
|
105
|
+
|
|
106
|
+
const onRefreshClicked = useCallback(async () => {
|
|
107
|
+
if (addedRows.length + updatedRows.length > 0) {
|
|
108
|
+
openRefreshModal();
|
|
109
|
+
} else {
|
|
110
|
+
doRefresh();
|
|
111
|
+
}
|
|
112
|
+
}, [addedRows.length, doRefresh, openRefreshModal, updatedRows.length]);
|
|
113
|
+
|
|
103
114
|
const toolsRow = (
|
|
104
115
|
<styles.DataGridToolsRow>
|
|
105
116
|
<styles.DataGridToolsRowButtonsContainer>
|
|
@@ -143,6 +154,7 @@ export const DataGridHeader = <R,>({
|
|
|
143
154
|
return (
|
|
144
155
|
<>
|
|
145
156
|
{modal}
|
|
157
|
+
{refreshModal}
|
|
146
158
|
{toolsRow}
|
|
147
159
|
<styles.DataGridHeaderRow
|
|
148
160
|
$gridTemplateColumns={gridTemplateColumns}
|
|
@@ -44,8 +44,10 @@ export const DataGridRowTemplate = <R,>({
|
|
|
44
44
|
className: '',
|
|
45
45
|
style: undefined,
|
|
46
46
|
};
|
|
47
|
-
const isAdded =
|
|
48
|
-
const isUpdated =
|
|
47
|
+
const isAdded = addedRows.some((row) => rowKeyGetter(row as R) === rowKey);
|
|
48
|
+
const isUpdated = updatedRows.some(
|
|
49
|
+
(row) => rowKeyGetter(row as R) === rowKey
|
|
50
|
+
);
|
|
49
51
|
|
|
50
52
|
return (
|
|
51
53
|
<styles.DataGridRow key={rowKey} $edited={isAdded || isUpdated}>
|
|
@@ -47,9 +47,6 @@ export const useDataGrid = <R,>(
|
|
|
47
47
|
override?.rows ?? innerRows,
|
|
48
48
|
override?.setRows ?? setInnerRows,
|
|
49
49
|
];
|
|
50
|
-
useEffect(() => {
|
|
51
|
-
setInnerRows(props.rows);
|
|
52
|
-
}, [props.rows]);
|
|
53
50
|
|
|
54
51
|
/** SETTINGS */
|
|
55
52
|
|
|
@@ -152,7 +149,7 @@ export const useDataGrid = <R,>(
|
|
|
152
149
|
addRow,
|
|
153
150
|
updateRow,
|
|
154
151
|
clearChangedRows,
|
|
155
|
-
} = useDataGridChangedRows<R>(onRowAdded);
|
|
152
|
+
} = useDataGridChangedRows<R>(rowKeyGetter as any, onRowAdded);
|
|
156
153
|
|
|
157
154
|
/** ROWS SORTING **/
|
|
158
155
|
|
|
@@ -365,8 +362,8 @@ export const useDataGrid = <R,>(
|
|
|
365
362
|
startResizing: () => {},
|
|
366
363
|
moveResizing: () => {},
|
|
367
364
|
endResizing: () => {},
|
|
368
|
-
addedRows:
|
|
369
|
-
updatedRows:
|
|
365
|
+
addedRows: [],
|
|
366
|
+
updatedRows: [],
|
|
370
367
|
setRows: () => {},
|
|
371
368
|
editRow: () => {},
|
|
372
369
|
addRow: () => {},
|
|
@@ -1,49 +1,82 @@
|
|
|
1
1
|
import { useCallback, useState } from 'react';
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
const [addedRows, setAddedRows] = useState<
|
|
8
|
-
const [updatedRows, setUpdatedRows] = useState<
|
|
3
|
+
export const useDataGridChangedRows = <R>(
|
|
4
|
+
rowKeyGetter: (row: Partial<R>) => string,
|
|
5
|
+
onRowAdded: (row: R) => void
|
|
6
|
+
) => {
|
|
7
|
+
const [addedRows, setAddedRows] = useState<Partial<R>[]>([]);
|
|
8
|
+
const [updatedRows, setUpdatedRows] = useState<Partial<R>[]>([]);
|
|
9
9
|
|
|
10
10
|
const addRow = useCallback(
|
|
11
|
-
(
|
|
12
|
-
setAddedRows((prev) =>
|
|
13
|
-
onRowAdded(row);
|
|
11
|
+
(row: Partial<R>) => {
|
|
12
|
+
setAddedRows((prev) => [...prev, row]);
|
|
13
|
+
onRowAdded(row as R);
|
|
14
14
|
},
|
|
15
15
|
[onRowAdded]
|
|
16
16
|
);
|
|
17
17
|
|
|
18
|
-
const updateRow = useCallback(
|
|
19
|
-
|
|
20
|
-
|
|
18
|
+
const updateRow = useCallback(
|
|
19
|
+
(row: Partial<R>) => {
|
|
20
|
+
const rowKey = rowKeyGetter(row);
|
|
21
|
+
setUpdatedRows((prev) => {
|
|
22
|
+
const index = prev.findIndex((r) => rowKeyGetter(r) === rowKey);
|
|
23
|
+
return index >= 0
|
|
24
|
+
? prev.map((existingRow, i) =>
|
|
25
|
+
i === index ? { ...existingRow, ...row } : existingRow
|
|
26
|
+
)
|
|
27
|
+
: [...prev, row];
|
|
28
|
+
});
|
|
29
|
+
},
|
|
30
|
+
[rowKeyGetter]
|
|
31
|
+
);
|
|
21
32
|
|
|
22
33
|
const editRow = useCallback(
|
|
23
|
-
(
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
34
|
+
(row: Partial<R>) => {
|
|
35
|
+
const key = rowKeyGetter(row);
|
|
36
|
+
const addedRowIndex = addedRows.findIndex(
|
|
37
|
+
(r) => rowKeyGetter(r as R) === key
|
|
38
|
+
);
|
|
39
|
+
if (addedRowIndex >= 0) {
|
|
40
|
+
setAddedRows((prev) =>
|
|
41
|
+
prev.map((existingRow, index) =>
|
|
42
|
+
index === addedRowIndex ? { ...existingRow, ...row } : existingRow
|
|
43
|
+
)
|
|
44
|
+
);
|
|
45
|
+
return;
|
|
46
|
+
}
|
|
47
|
+
const updatedRowIndex = updatedRows.findIndex(
|
|
48
|
+
(r) => rowKeyGetter(r as R) === key
|
|
49
|
+
);
|
|
50
|
+
if (updatedRowIndex >= 0) {
|
|
51
|
+
setUpdatedRows((prev) =>
|
|
52
|
+
prev.map((existingRow, index) =>
|
|
53
|
+
index === updatedRowIndex ? { ...existingRow, ...row } : existingRow
|
|
54
|
+
)
|
|
55
|
+
);
|
|
56
|
+
return;
|
|
33
57
|
}
|
|
58
|
+
|
|
59
|
+
setUpdatedRows((prev) => [...prev, row]);
|
|
34
60
|
},
|
|
35
|
-
[addedRows, updatedRows]
|
|
61
|
+
[rowKeyGetter, addedRows, updatedRows]
|
|
36
62
|
);
|
|
37
63
|
|
|
38
|
-
const clearChangedRows = useCallback(
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
64
|
+
const clearChangedRows = useCallback(
|
|
65
|
+
(keys?: string[]) => {
|
|
66
|
+
if (!keys) {
|
|
67
|
+
setAddedRows([]);
|
|
68
|
+
setUpdatedRows([]);
|
|
69
|
+
return;
|
|
70
|
+
}
|
|
71
|
+
setAddedRows((prev) =>
|
|
72
|
+
prev.filter((row) => !keys.includes(rowKeyGetter(row as R)))
|
|
73
|
+
);
|
|
74
|
+
setUpdatedRows((prev) =>
|
|
75
|
+
prev.filter((row) => !keys.includes(rowKeyGetter(row as R)))
|
|
76
|
+
);
|
|
77
|
+
},
|
|
78
|
+
[rowKeyGetter]
|
|
79
|
+
);
|
|
47
80
|
|
|
48
81
|
return {
|
|
49
82
|
addedRows,
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { useCallback, useMemo, useState } from 'react';
|
|
2
|
+
|
|
3
|
+
import { Button } from '../../../forms';
|
|
4
|
+
import { Modal } from '../../../layout/Modal';
|
|
5
|
+
import { TriangleExclamationIcon } from '../../../../Icons';
|
|
6
|
+
|
|
7
|
+
export const useRefreshModal = (onConfirm: () => void) => {
|
|
8
|
+
const [isVisible, setIsVisible] = useState(false);
|
|
9
|
+
|
|
10
|
+
const openModal = useCallback(() => {
|
|
11
|
+
setIsVisible(true);
|
|
12
|
+
}, []);
|
|
13
|
+
const closeModal = useCallback(() => {
|
|
14
|
+
setIsVisible(false);
|
|
15
|
+
}, []);
|
|
16
|
+
|
|
17
|
+
const modal = useMemo(
|
|
18
|
+
() =>
|
|
19
|
+
isVisible ? (
|
|
20
|
+
<Modal $width={400}>
|
|
21
|
+
<Modal.Header>Rafraichir</Modal.Header>
|
|
22
|
+
<Modal.ContentWithIcon>
|
|
23
|
+
<TriangleExclamationIcon fill="var(--color-danger-600)" />
|
|
24
|
+
<div>
|
|
25
|
+
Attention : vous avez des modifications en cours. Si vous
|
|
26
|
+
rafraîchissez la liste, ces modifications seront perdues !
|
|
27
|
+
</div>
|
|
28
|
+
</Modal.ContentWithIcon>
|
|
29
|
+
<Modal.Footer>
|
|
30
|
+
<Button onClick={closeModal}>Annuler</Button>
|
|
31
|
+
<Button
|
|
32
|
+
$color="danger"
|
|
33
|
+
style={{ marginLeft: 'auto' }}
|
|
34
|
+
onClick={() => {
|
|
35
|
+
closeModal();
|
|
36
|
+
onConfirm();
|
|
37
|
+
}}
|
|
38
|
+
>
|
|
39
|
+
Rafraîchir
|
|
40
|
+
</Button>
|
|
41
|
+
</Modal.Footer>
|
|
42
|
+
</Modal>
|
|
43
|
+
) : null,
|
|
44
|
+
[closeModal, isVisible, onConfirm]
|
|
45
|
+
);
|
|
46
|
+
|
|
47
|
+
return { openModal, closeModal, modal };
|
|
48
|
+
};
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import styled, { css } from 'styled-components';
|
|
1
2
|
import {
|
|
2
3
|
DEFAULT_FOOTER_ROW_HEIGHT,
|
|
3
4
|
DEFAULT_HEADER_ROW_HEIGHT,
|
|
@@ -5,11 +6,10 @@ import {
|
|
|
5
6
|
SELECTION_CELL_WIDTH,
|
|
6
7
|
TOOLBAR_HEIGHT,
|
|
7
8
|
} from './constants';
|
|
8
|
-
import styled, { css } from 'styled-components';
|
|
9
9
|
|
|
10
|
-
import { DataGridCellFCProps } from './types';
|
|
11
10
|
import { ThemeColor } from '../../../providers/ThemeProvider/types';
|
|
12
11
|
import { VirtualScrollerFiller } from '../VirtualScroller/styles';
|
|
12
|
+
import { DataGridCellFCProps } from './types';
|
|
13
13
|
|
|
14
14
|
export const DataGridResizeGrip = styled.div<{ $headerColor?: ThemeColor }>`
|
|
15
15
|
position: absolute;
|
|
@@ -304,6 +304,10 @@ type DataGridRowProps = {
|
|
|
304
304
|
export const DataGridRow = styled.div<DataGridRowProps>`
|
|
305
305
|
display: contents;
|
|
306
306
|
|
|
307
|
+
&:hover > ${DataGridCell} {
|
|
308
|
+
background-color: var(--color-blue-100);
|
|
309
|
+
}
|
|
310
|
+
|
|
307
311
|
${({ $edited }) =>
|
|
308
312
|
$edited &&
|
|
309
313
|
css`
|
|
@@ -311,6 +315,9 @@ export const DataGridRow = styled.div<DataGridRowProps>`
|
|
|
311
315
|
background-color: var(--color-warning-100);
|
|
312
316
|
color: var(--color-warning-900);
|
|
313
317
|
}
|
|
318
|
+
&:hover > ${DataGridCell}, &:hover > ${SelectionCell} {
|
|
319
|
+
background-color: var(--color-blue-100);
|
|
320
|
+
}
|
|
314
321
|
`}
|
|
315
322
|
`;
|
|
316
323
|
DataGridRow.displayName = 'DataGridRow';
|
|
@@ -67,7 +67,7 @@ type CommonGridColumnProps<R, T> = {
|
|
|
67
67
|
export type EditableDataGridColumn<R, T> = CommonGridColumnProps<R, T> & {
|
|
68
68
|
editable?: boolean;
|
|
69
69
|
editComponent?: DataGridEditableCellFC<R, T>;
|
|
70
|
-
itemToPartialRow?: (row: R, value: T) => Partial<R>;
|
|
70
|
+
itemToPartialRow?: (key: string, row: R, value: T) => Partial<R>;
|
|
71
71
|
};
|
|
72
72
|
|
|
73
73
|
export type DataGridTextColumn<R> = EditableDataGridColumn<R, string> & {
|
|
@@ -208,9 +208,9 @@ export type DataGridContextProps<R> = DataGridProps<R> & {
|
|
|
208
208
|
|
|
209
209
|
addedRows: DataGridEditedRows<R>;
|
|
210
210
|
updatedRows: DataGridEditedRows<R>;
|
|
211
|
-
editRow: (
|
|
212
|
-
addRow: (
|
|
213
|
-
updateRow: (
|
|
211
|
+
editRow: (row: Partial<R>) => void;
|
|
212
|
+
addRow: (row: R) => void;
|
|
213
|
+
updateRow: (row: Partial<R>) => void;
|
|
214
214
|
clearChangedRows: (keys?: string[]) => void;
|
|
215
215
|
};
|
|
216
216
|
|
|
@@ -364,4 +364,4 @@ export type DataGridRefProps = {
|
|
|
364
364
|
setSelectedKeys: (keys: string[]) => void;
|
|
365
365
|
};
|
|
366
366
|
|
|
367
|
-
export type DataGridEditedRows<R> =
|
|
367
|
+
export type DataGridEditedRows<R> = Partial<R>[];
|
|
@@ -408,11 +408,12 @@ const convertItemToPartialRow = <
|
|
|
408
408
|
R extends Record<string, any>,
|
|
409
409
|
T extends Record<string, any>
|
|
410
410
|
>(
|
|
411
|
+
key: string,
|
|
411
412
|
row: R,
|
|
412
413
|
item: T | null,
|
|
413
414
|
columnMapping: Record<keyof R, keyof T>
|
|
414
415
|
): Partial<R> => {
|
|
415
|
-
const partialRow = {} as Partial<R>;
|
|
416
|
+
const partialRow = { Id: key } as unknown as Partial<R>;
|
|
416
417
|
Object.entries(columnMapping).forEach(([key, value]: [keyof R, keyof T]) => {
|
|
417
418
|
partialRow[key] = (item?.[value] ?? null) as R[keyof R];
|
|
418
419
|
});
|
|
@@ -473,8 +474,8 @@ export const sqlForeignListColumn = <
|
|
|
473
474
|
);
|
|
474
475
|
}
|
|
475
476
|
),
|
|
476
|
-
itemToPartialRow: (row, value) =>
|
|
477
|
-
convertItemToPartialRow(row, value, columnMapping),
|
|
477
|
+
itemToPartialRow: (key, row, value) =>
|
|
478
|
+
convertItemToPartialRow(key, row, value, columnMapping),
|
|
478
479
|
};
|
|
479
480
|
return merge(column, options);
|
|
480
481
|
};
|
|
@@ -94,8 +94,12 @@ export const ModalContentWithIcon = styled.div.attrs({
|
|
|
94
94
|
|
|
95
95
|
& > svg {
|
|
96
96
|
margin: var(--space-2);
|
|
97
|
-
width: var(--space-
|
|
98
|
-
height: var(--space-
|
|
97
|
+
width: var(--space-6);
|
|
98
|
+
height: var(--space-6);
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
& > :not(svg) {
|
|
102
|
+
flex: 1;
|
|
99
103
|
}
|
|
100
104
|
`;
|
|
101
105
|
|
|
@@ -8,30 +8,34 @@ export const HighlightedText: FC<
|
|
|
8
8
|
} & HTMLAttributes<HTMLSpanElement>
|
|
9
9
|
> = ({ text, highlight, ...props }) => {
|
|
10
10
|
const textWithoutHtml = useMemo(() => extractTextFromHTML(text), [text]);
|
|
11
|
-
|
|
12
|
-
|
|
11
|
+
const parts = useMemo(
|
|
12
|
+
() =>
|
|
13
|
+
highlight
|
|
14
|
+
? textWithoutHtml
|
|
15
|
+
?.split(new RegExp(`(${escapeForRegExp(highlight)})`, 'gi'))
|
|
16
|
+
.filter(Boolean) ?? []
|
|
17
|
+
: [],
|
|
18
|
+
[highlight, textWithoutHtml]
|
|
19
|
+
);
|
|
13
20
|
|
|
14
|
-
|
|
15
|
-
textWithoutHtml
|
|
16
|
-
|
|
17
|
-
) ?? [];
|
|
21
|
+
if (!highlight || !parts.length) {
|
|
22
|
+
return <span {...props}>{textWithoutHtml}</span>;
|
|
23
|
+
}
|
|
18
24
|
|
|
19
25
|
return (
|
|
20
26
|
<span {...props}>
|
|
21
|
-
{parts
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
</span>
|
|
34
|
-
))}
|
|
27
|
+
{parts.map((part, index) => (
|
|
28
|
+
<span
|
|
29
|
+
key={index}
|
|
30
|
+
style={
|
|
31
|
+
part.toLowerCase() === highlight.toLowerCase()
|
|
32
|
+
? { backgroundColor: 'gold' }
|
|
33
|
+
: {}
|
|
34
|
+
}
|
|
35
|
+
>
|
|
36
|
+
{part}
|
|
37
|
+
</span>
|
|
38
|
+
))}
|
|
35
39
|
</span>
|
|
36
40
|
);
|
|
37
41
|
};
|