@asaleh37/ui-base 25.12.16 → 25.12.122

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 (27) hide show
  1. package/__ODockerfile +14 -14
  2. package/dist/index.d.ts +0 -2
  3. package/dist/index.js +107 -107
  4. package/dist/index.js.map +1 -1
  5. package/dist/index.mjs +112 -112
  6. package/dist/index.mjs.map +1 -1
  7. package/package-lock.json/342/200/216 +9039 -9039
  8. package/package.json +122 -122
  9. package/src/components/administration/admin/OrganizationMemberGrid.tsx +49 -63
  10. package/src/components/administration/admin/PersonGrid.tsx +344 -10
  11. package/src/components/templates/DataEntryTemplates/TemplateDataForm/FormElementField.tsx +238 -238
  12. package/src/components/templates/DataEntryTemplates/TemplateDataForm/TemplateForm.tsx +427 -427
  13. package/src/components/templates/DataEntryTemplates/TemplateDataGrid/DataGridColumnsUtil.tsx +198 -198
  14. package/src/components/templates/DataEntryTemplates/TemplateDataGrid/TemplateGrid.tsx +1047 -1047
  15. package/src/components/templates/report/ExcelReportViewer.tsx +72 -72
  16. package/src/components/templates/report/ReportViewer.tsx +272 -272
  17. package/src/hooks/UseWindow.tsx +111 -111
  18. package/src/hooks/index.ts +22 -22
  19. package/src/hooks/useCommonStore.tsx +29 -29
  20. package/src/hooks/useParameterPanel.tsx +159 -159
  21. package/src/layout/NavigationTree.tsx +1 -8
  22. package/src/layout/TopBar.tsx +55 -72
  23. package/src/main.tsx +1 -2
  24. package/src/navigationItems/Administration/adminNavigationItems.tsx +1 -1
  25. package/src/redux/features/common/AppInfoSlice.ts +0 -4
  26. package/src/components/administration/admin/CustomPersonGrid.tsx +0 -361
  27. package/src/components/administration/admin/OrgProvidedPersonGrid.tsx +0 -347
@@ -27,7 +27,6 @@ import AttachmentImageViewer from "../components/templates/attachment/Attachment
27
27
  import NotificationButton from "./NotificationButton";
28
28
  import { useState } from "react";
29
29
  import ChangePasswordPanel from "../components/administration/admin/ChangePasswordPanel";
30
- import { AppInfo } from "../redux/features/common/AppInfoSlice";
31
30
 
32
31
  interface AppBarProps extends MuiAppBarProps {
33
32
  open?: boolean;
@@ -36,7 +35,6 @@ interface AppBarProps extends MuiAppBarProps {
36
35
  const AppBar = styled(MuiAppBar, {
37
36
  shouldForwardProp: (prop) => prop !== "open",
38
37
  })<AppBarProps>(({ theme }) => {
39
- const AppInfo: AppInfo = useSelector((state: any) => state.AppInfo.value);
40
38
  const AppLayout = useSelector((state: any) => state.AppLayout);
41
39
  const isMobile = useIsMobile();
42
40
  return {
@@ -111,49 +109,40 @@ const TopBar: React.FC = () => {
111
109
  };
112
110
  return (
113
111
  <>
114
- {AppInfo.isUserProfileManaged ? (
115
- <>
116
- <ChangePasswordWindow>
117
- <ChangePasswordPanel
118
- selectedPerson={UserSession.value}
119
- isSelfService={true}
120
- onSuccessCallBk={() => {
121
- setChangePasswordWindow(false);
122
- }}
123
- />
124
- </ChangePasswordWindow>
125
- <Menu
126
- sx={{ mt: "45px" }}
127
- id="menu-appbar"
128
- anchorEl={anchorElUser}
129
- anchorOrigin={{
130
- vertical: "top",
131
- horizontal: "right",
132
- }}
133
- keepMounted
134
- transformOrigin={{
135
- vertical: "top",
136
- horizontal: "right",
137
- }}
138
- open={Boolean(anchorElUser)}
139
- onClose={handleCloseUserMenu}
140
- >
141
- <MenuItem
142
- onClick={() => {
143
- setChangePasswordWindow(true);
144
- handleCloseUserMenu();
145
- }}
146
- >
147
- <Typography sx={{ textAlign: "center" }}>
148
- Change Password
149
- </Typography>
150
- </MenuItem>
151
- </Menu>
152
- </>
153
- ) : (
154
- <></>
155
- )}
156
-
112
+ <ChangePasswordWindow>
113
+ <ChangePasswordPanel
114
+ selectedPerson={UserSession.value}
115
+ isSelfService={true}
116
+ onSuccessCallBk={() => {
117
+ setChangePasswordWindow(false);
118
+ }}
119
+ />
120
+ </ChangePasswordWindow>
121
+ <Menu
122
+ sx={{ mt: "45px" }}
123
+ id="menu-appbar"
124
+ anchorEl={anchorElUser}
125
+ anchorOrigin={{
126
+ vertical: "top",
127
+ horizontal: "right",
128
+ }}
129
+ keepMounted
130
+ transformOrigin={{
131
+ vertical: "top",
132
+ horizontal: "right",
133
+ }}
134
+ open={Boolean(anchorElUser)}
135
+ onClose={handleCloseUserMenu}
136
+ >
137
+ <MenuItem
138
+ onClick={() => {
139
+ setChangePasswordWindow(true);
140
+ handleCloseUserMenu();
141
+ }}
142
+ >
143
+ <Typography sx={{ textAlign: "center" }}>Change Password</Typography>
144
+ </MenuItem>
145
+ </Menu>
157
146
  <ChangeOrgWindow>
158
147
  <ChangeOrgForm
159
148
  successChangeCallBackFn={() => {
@@ -210,7 +199,6 @@ const TopBar: React.FC = () => {
210
199
  }
211
200
  >
212
201
  <IconButton
213
- sx={{ mx: 1 }}
214
202
  color="inherit"
215
203
  onClick={() => {
216
204
  dispatch(
@@ -231,33 +219,28 @@ const TopBar: React.FC = () => {
231
219
  )}
232
220
  </IconButton>
233
221
  </Tooltip>
234
- {AppInfo.isLocalizationEnabled ? (
235
- <Tooltip
236
- title={
237
- i18n.language === "ar"
238
- ? "Change Language To English"
239
- : "Change Language To Arabic"
240
- }
222
+ <Tooltip
223
+ title={
224
+ i18n.language === "ar"
225
+ ? "Change Language To English"
226
+ : "Change Language To Arabic"
227
+ }
228
+ >
229
+ <IconButton
230
+ color="inherit"
231
+ onClick={() => {
232
+ let nextLanguage = i18n.language === "ar" ? "en" : "ar";
233
+ changeLanguage(nextLanguage);
234
+ dispatch(
235
+ AppLayoutActions.setAppDirection(
236
+ nextLanguage === "ar" ? "rtl" : "ltr"
237
+ )
238
+ );
239
+ }}
241
240
  >
242
- <IconButton
243
- color="inherit"
244
- onClick={() => {
245
- let nextLanguage = i18n.language === "ar" ? "en" : "ar";
246
- changeLanguage(nextLanguage);
247
- dispatch(
248
- AppLayoutActions.setAppDirection(
249
- nextLanguage === "ar" ? "rtl" : "ltr"
250
- )
251
- );
252
- }}
253
- >
254
- <FontAwesomeIcon icon="language" />
255
- </IconButton>
256
- </Tooltip>
257
- ) : (
258
- <></>
259
- )}
260
-
241
+ <FontAwesomeIcon icon="language" />
242
+ </IconButton>
243
+ </Tooltip>
261
244
  {UserSession.value?.userOrganizations &&
262
245
  UserSession.value?.userOrganizations.length > 1 ? (
263
246
  <Tooltip title="Change Current Organization">
package/src/main.tsx CHANGED
@@ -7,9 +7,8 @@ createRoot(document.getElementById("root")!).render(
7
7
  enableUINotifications={false}
8
8
  appLogo={"/logo.png"}
9
9
  appName="UI Base Library"
10
- isUserProfileManaged={false}
11
10
  loginScreenStyle={{
12
- themeMode: "dark",
11
+ themeMode: "dark",
13
12
  backgroundImageNameInPublicFolder: "bg.jpg",
14
13
  }}
15
14
  appVersion="25.12.12"
@@ -47,7 +47,7 @@ export const adminNavigationItems: TreeViewBaseItem<ExtendedTreeItemProps>[] = [
47
47
  children: [
48
48
  {
49
49
  id: "development_admin.organization.modules",
50
- label: "Subscribed Modules",
50
+ label: "Subscriped Modules",
51
51
  icon: "layer-group",
52
52
  authority: "ORGANIZATION_ADMIN",
53
53
  action: "NAVIGATION",
@@ -15,8 +15,6 @@ export type AppInfo = {
15
15
  appName: string | null;
16
16
  appVersion: string | null;
17
17
  appLogo: any | null;
18
- isUserProfileManaged?: boolean;
19
- isLocalizationEnabled?: boolean;
20
18
  businessLocals?: {
21
19
  ar: { [key: string]: string };
22
20
  en: { [key: string]: string };
@@ -56,8 +54,6 @@ const initialState: AppInfoProp = {
56
54
  documentTitle: null,
57
55
  apiBaseUrl: null,
58
56
  authenticationMethod: "APP",
59
- isUserProfileManaged: true,
60
- isLocalizationEnabled: false,
61
57
  appName: null,
62
58
  appVersion: null,
63
59
  appLogo: null,
@@ -1,361 +0,0 @@
1
- import { useState } from "react";
2
- import TemplateGrid from "../../templates/DataEntryTemplates/TemplateDataGrid/TemplateGrid";
3
- import { useApiActions, useSession, useWindow } from "../../../hooks";
4
- import { FormElementProps } from "../../templates/DataEntryTemplates/DataEntryTypes";
5
- import { useTranslation } from "react-i18next";
6
- import { toast } from "react-toastify";
7
- import OrganizationMemberGrid from "./OrganizationMemberGrid";
8
- import { Box } from "@mui/material";
9
- import AttachmentImageViewer from "../../templates/attachment/AttachmentImageViewer";
10
- import { useSelector } from "react-redux";
11
- import OrgMemberRoleForm from "./OrgMemberRoleForm";
12
- import ChangePasswordPanel from "./ChangePasswordPanel";
13
-
14
- const CustomPersonGrid: React.FC = () => {
15
- const { t } = useTranslation();
16
- const [selectedPerson, setSelectedPerson] = useState<any>(null);
17
- const { UserInfo } = useSession();
18
- const CurrentOrganizationRanks = useSelector(
19
- (state: any) => state.commonStores.stores.CurrentOrganizationRanks.data
20
- );
21
- const CurrentOrganizationUnits = useSelector(
22
- (state: any) => state.commonStores.stores.CurrentOrganizationUnits.data
23
- );
24
- const [data, setData] = useState([]);
25
- const apiActions = useApiActions({
26
- commonStoreKey: "persons",
27
- deleteById: "api/v1/admin/person",
28
- save: "api/v1/admin/person",
29
- findById: "api/v1/admin/person",
30
- setData: setData,
31
- });
32
- const [selectedRecord, setSelectedRecord] = useState<any>(null);
33
- const {
34
- Window: OrganizationMembersWindow,
35
- setWindowState: setOrganizationMemberWindowState,
36
- } = useWindow({
37
- windowTitle: "Organizations Membership",
38
- windowIcon: "globe",
39
- });
40
- const {
41
- Window: OrganizationMemberRolesWindow,
42
- setWindowState: setOrganizationMemberRolesWindowState,
43
- } = useWindow({
44
- windowIcon: "tag",
45
- windowTitle: "Organization Member Roles",
46
- width: "50%",
47
- });
48
- const {
49
- Window: ChangePasswordWindow,
50
- setWindowState: setChangePasswordWindow,
51
- } = useWindow({
52
- windowIcon: "key",
53
- windowTitle: "Change Password",
54
- width: "fit-content",
55
- height: "fit-content",
56
- });
57
-
58
- const formElements: Array<FormElementProps> = [
59
- {
60
- type: "field",
61
- mode: "props",
62
- props: {
63
- hidden: true,
64
- fieldLabel: "id",
65
- fieldName: "id",
66
- gridProps: {
67
- hidden: true,
68
- },
69
- required: false,
70
- fieldType: "number",
71
- },
72
- },
73
- {
74
- type: "field",
75
- mode: "props",
76
- props: {
77
- hidden: true,
78
- fieldLabel: "organizationMemberId",
79
- fieldName: "organizationMemberId",
80
- gridProps: {
81
- hidden: true,
82
- },
83
- required: false,
84
- fieldType: "number",
85
- },
86
- },
87
- {
88
- type: "field",
89
- mode: "props",
90
- props: {
91
- fieldLabel: "Image",
92
- fieldName: "custom",
93
- fieldType: "custom",
94
- gridProps: {
95
- muiProps: {
96
- align: "center",
97
- headerAlign: "center",
98
- renderCell: (params) => {
99
- return (
100
- <Box
101
- sx={{
102
- display: "flex",
103
- alignItems: "center",
104
- justifyContent: "center",
105
- height: "100%",
106
- }}
107
- >
108
- <AttachmentImageViewer
109
- showAsAvatar={true}
110
- attachmentCode="EMPLOYEE_PHOTOS"
111
- refKey={params.id + ""}
112
- />
113
- </Box>
114
- );
115
- },
116
- },
117
- },
118
- },
119
- },
120
- {
121
- type: "field",
122
- mode: "props",
123
- props: {
124
- fieldLabel: "PERSON_EMPLOYEE_AR_NAME",
125
- fieldName: "employeeArName",
126
- required: true,
127
- fieldType: "text",
128
- },
129
- },
130
- {
131
- type: "field",
132
- mode: "props",
133
- props: {
134
- fieldLabel: "PERSON_EMPLOYEE_EN_NAME",
135
- fieldName: "employeeEnName",
136
- required: true,
137
- fieldType: "text",
138
- },
139
- },
140
- {
141
- type: "field",
142
- mode: "props",
143
- props: {
144
- fieldLabel: "PERSON_EMAIL",
145
- fieldName: "email",
146
- required: false,
147
- fieldType: "text",
148
- },
149
- },
150
- {
151
- type: "field",
152
- mode: "props",
153
- props: {
154
- fieldLabel: "PERSON_MOBILE_NUMBER",
155
- fieldName: "mobileNumber",
156
- required: false,
157
- fieldType: "text",
158
- },
159
- },
160
- {
161
- type: "field",
162
- mode: "props",
163
- props: {
164
- fieldLabel: "ORGANIZATION_MEMBER_ORGANIZATION_RANK_ID",
165
- fieldName: "organizationRankId",
166
- required: false,
167
- fieldType: "combobox",
168
- options: CurrentOrganizationRanks,
169
- optionValueField: "id",
170
- optionDisplayField: "rankEnName",
171
- },
172
- },
173
- {
174
- type: "field",
175
- mode: "props",
176
- props: {
177
- fieldLabel: "ORGANIZATION_MEMBER_ORGANIZATION_UNIT_ID",
178
- fieldName: "organizationUnitId",
179
- required: false,
180
- fieldType: "combobox",
181
- options: CurrentOrganizationUnits,
182
- optionValueField: "id",
183
- optionDisplayField: "organizationUnitEnName",
184
- },
185
- },
186
- {
187
- type: "field",
188
- mode: "props",
189
- props: {
190
- fieldLabel: "Membership number",
191
- fieldName: "organizationMembershipNumber",
192
- fieldType: "text",
193
- },
194
- },
195
- {
196
- type: "field",
197
- mode: "props",
198
- props: {
199
- hidden: true,
200
- gridProps: { hidden: true },
201
- fieldLabel: "PERSON_PASSWORD",
202
- fieldName: "password",
203
- required: false,
204
- fieldType: "text",
205
- },
206
- },
207
- {
208
- type: "field",
209
- mode: "props",
210
- props: {
211
- fieldLabel: "PERSON_USERNAME",
212
- fieldName: "username",
213
- required: false,
214
- fieldType: "text",
215
- },
216
- },
217
- {
218
- type: "field",
219
- mode: "props",
220
- props: {
221
- hidden: true,
222
- fieldLabel: "Ref Source",
223
- fieldName: "refSource",
224
- required: false,
225
- fieldType: "text",
226
- },
227
- },
228
- {
229
- type: "field",
230
- mode: "props",
231
- props: {
232
- hidden: true,
233
- fieldLabel: "PERSON_EMPLOYEE_NUMBER",
234
- fieldName: "refSyncNumber",
235
- required: false,
236
- fieldType: "text",
237
- },
238
- },
239
- {
240
- type: "field",
241
- mode: "props",
242
- props: {
243
- fieldLabel: "PERSON_IS_ACTIVE",
244
- fieldName: "isActive",
245
- required: false,
246
- fieldType: "checkbox",
247
- },
248
- },
249
- ];
250
-
251
- return (
252
- <>
253
- <OrganizationMemberRolesWindow>
254
- <OrgMemberRoleForm
255
- selectedRecord={selectedRecord}
256
- closeModalFn={() => {
257
- setOrganizationMemberRolesWindowState(false);
258
- }}
259
- />
260
- </OrganizationMemberRolesWindow>
261
- <OrganizationMembersWindow>
262
- <OrganizationMemberGrid selectedPerson={selectedPerson} />
263
- </OrganizationMembersWindow>
264
- <ChangePasswordWindow>
265
- <ChangePasswordPanel
266
- selectedPerson={selectedPerson}
267
- isSelfService={false}
268
- onSuccessCallBk={() => {
269
- setChangePasswordWindow(false);
270
- }}
271
- />
272
- </ChangePasswordWindow>
273
- <TemplateGrid
274
- attachment={{ attachmentCode: "EMPLOYEE_PHOTOS" }}
275
- apiActions={apiActions}
276
- data={data}
277
- setData={setData}
278
- editMode={{
279
- editMode: "modal",
280
- specs: {
281
- modalIcon: "user",
282
- modalTitle: "Person Profile",
283
- modalWidth: 300,
284
- },
285
- }}
286
- formElements={formElements}
287
- keyColumnName={"id"}
288
- gridTitle="PERSON_PLURAL"
289
- rowActions={[
290
- {
291
- icon: "key",
292
- label: "Change User Password",
293
- actionFn: async (data) => {
294
- setSelectedPerson(data);
295
- setChangePasswordWindow(true);
296
- },
297
- },
298
- {
299
- icon: "tags",
300
- label: "Current Organization User Roles",
301
- isActionDisabledForRecord: (data) => {
302
- return !data?.organizationMemberId;
303
- },
304
- actionFn: async (data) => {
305
- setSelectedRecord({
306
- organizationId: UserInfo?.currentOrganization?.id,
307
- id: data?.organizationMemberId,
308
- });
309
- setOrganizationMemberRolesWindowState(true);
310
- },
311
- },
312
- {
313
- icon: "globe",
314
- label: "User Organizations",
315
- actionFn: async (data) => {
316
- setSelectedPerson(data);
317
- setOrganizationMemberWindowState(true);
318
- },
319
- },
320
- ]}
321
- girdIcon="users"
322
- editAction={{
323
- isEnabled: true,
324
- authority: "PERSON_EDIT",
325
- preActionValidation: (data) => {
326
- if (
327
- data.refSource != undefined &&
328
- data.refSource != null &&
329
- data.refSource != ""
330
- ) {
331
- toast.error(
332
- "This Person Was synced from other system therefore you can't modify this record"
333
- );
334
- return false;
335
- }
336
- return true;
337
- },
338
- }}
339
- deleteAction={{
340
- isEnabled: true,
341
- authority: "PERSON_DELETE",
342
- preActionValidation: (data) => {
343
- if (
344
- data.refSource != undefined &&
345
- data.refSource != null &&
346
- data.refSource != ""
347
- ) {
348
- toast.error(
349
- "This Person Was synced from other system therefore you can't modify this record"
350
- );
351
- return false;
352
- }
353
- return true;
354
- },
355
- }}
356
- />
357
- </>
358
- );
359
- };
360
-
361
- export default CustomPersonGrid;