@asaleh37/ui-base 25.12.123 → 25.12.171

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.
@@ -5,6 +5,7 @@ import { FormElementProps } from "../../templates/DataEntryTemplates/DataEntryTy
5
5
  import { useTranslation } from "react-i18next";
6
6
  import { useSelector } from "react-redux";
7
7
  import OrgMemberRoleForm from "./OrgMemberRoleForm";
8
+ import { AppInfo } from "../../../redux/features/common/AppInfoSlice";
8
9
 
9
10
  type OrganizationMemberGridProps = {
10
11
  selectedPerson: any;
@@ -12,6 +13,7 @@ type OrganizationMemberGridProps = {
12
13
  const OrganizationMemberGrid: React.FC<OrganizationMemberGridProps> = (
13
14
  props
14
15
  ) => {
16
+ const appInfo: AppInfo = useSelector((state: any) => state.AppInfo.value);
15
17
  const [selectedRecord, setSelectedRecord] = useState<any>(null);
16
18
  const {
17
19
  Window: OrganizationMemberRolesWindow,
@@ -65,7 +67,7 @@ const OrganizationMemberGrid: React.FC<OrganizationMemberGridProps> = (
65
67
  type: "field",
66
68
  mode: "props",
67
69
  props: {
68
- fieldLabel: "ORGANIZATION_MEMBER_ORGANIZATION_ID",
70
+ fieldLabel: "Organization",
69
71
  fieldName: "organizationId",
70
72
  required: true,
71
73
  fieldType: "combobox",
@@ -74,57 +76,61 @@ const OrganizationMemberGrid: React.FC<OrganizationMemberGridProps> = (
74
76
  optionDisplayField: "organizationEnName",
75
77
  },
76
78
  },
77
- {
78
- type: "field",
79
- mode: "props",
80
- props: {
81
- fieldLabel: "ORGANIZATION_MEMBER_ORGANIZATION_RANK_ID",
82
- fieldName: "organizationRankId",
83
- required: false,
84
- fieldType: "combobox",
85
- options: SystemOrganizationRanks,
86
- optionValueField: "id",
87
- optionDisplayField: "rankDisplay",
79
+ ];
80
+
81
+ if (appInfo?.isUserProfileManaged) {
82
+ formElements.push(
83
+ {
84
+ type: "field",
85
+ mode: "props",
86
+ props: {
87
+ fieldLabel: "ORGANIZATION_MEMBER_ORGANIZATION_RANK_ID",
88
+ fieldName: "organizationRankId",
89
+ required: false,
90
+ fieldType: "combobox",
91
+ options: SystemOrganizationRanks,
92
+ optionValueField: "id",
93
+ optionDisplayField: "rankDisplay",
94
+ },
88
95
  },
89
- },
90
- {
91
- type: "field",
92
- mode: "props",
93
- props: {
94
- fieldLabel: "ORGANIZATION_MEMBER_ORGANIZATION_UNIT_ID",
95
- fieldName: "organizationUnitId",
96
- required: false,
97
- fieldType: "combobox",
98
- options: SystemOrganizationUnits,
99
- optionValueField: "id",
100
- optionDisplayField: "fullPath",
96
+ {
97
+ type: "field",
98
+ mode: "props",
99
+ props: {
100
+ fieldLabel: "ORGANIZATION_MEMBER_ORGANIZATION_UNIT_ID",
101
+ fieldName: "organizationUnitId",
102
+ required: false,
103
+ fieldType: "combobox",
104
+ options: SystemOrganizationUnits,
105
+ optionValueField: "id",
106
+ optionDisplayField: "fullPath",
107
+ },
101
108
  },
102
- },
103
- {
104
- type: "field",
105
- mode: "props",
106
- props: {
107
- fieldLabel: "Membership number",
108
- fieldName: "organizationMembershipNumber",
109
- fieldType: "text",
109
+ {
110
+ type: "field",
111
+ mode: "props",
112
+ props: {
113
+ fieldLabel: "Membership number",
114
+ fieldName: "organizationMembershipNumber",
115
+ fieldType: "text",
116
+ },
110
117
  },
111
- },
112
- {
113
- type: "field",
114
- mode: "props",
115
- props: {
116
- hidden: true,
117
- gridProps: {
118
+ {
119
+ type: "field",
120
+ mode: "props",
121
+ props: {
118
122
  hidden: true,
123
+ gridProps: {
124
+ hidden: true,
125
+ },
126
+ fieldLabel: "ORGANIZATION_MEMBER_PERSON_ID",
127
+ fieldName: "personId",
128
+ required: false,
129
+ fieldType: "number",
119
130
  },
120
- fieldLabel: "ORGANIZATION_MEMBER_PERSON_ID",
121
- fieldName: "personId",
122
- required: false,
123
- fieldType: "number",
124
- },
125
- },
126
- ];
127
-
131
+ }
132
+ );
133
+ }
128
134
  return (
129
135
  <>
130
136
  <OrganizationMemberRolesWindow>
@@ -152,7 +158,10 @@ const OrganizationMemberGrid: React.FC<OrganizationMemberGridProps> = (
152
158
  },
153
159
  },
154
160
  ]}
155
- gridLoadParametersValues={{ personId: props.selectedPerson.id }}
161
+ gridLoadParametersValues={{
162
+ personId: props.selectedPerson.id,
163
+ employeeNumber: props.selectedPerson.employeeNumber,
164
+ }}
156
165
  keyColumnName={"id"}
157
166
  gridTitle="ORGANIZATION_MEMBER_PLURAL"
158
167
  girdIcon="table-cells"
@@ -160,7 +169,12 @@ const OrganizationMemberGrid: React.FC<OrganizationMemberGridProps> = (
160
169
  isEnabled: true,
161
170
  authority: "ORGANIZATION_MEMBER_EDIT",
162
171
  preActionValidation: async (data) => {
163
- data.personId = props.selectedPerson.id;
172
+ if (appInfo?.isUserProfileManaged) {
173
+ data.personId = props.selectedPerson.id;
174
+ } else {
175
+ data.organizationMembershipNumber =
176
+ props.selectedPerson.employeeNumber;
177
+ }
164
178
  return true;
165
179
  },
166
180
  }}
@@ -10,352 +10,18 @@ import AttachmentImageViewer from "../../templates/attachment/AttachmentImageVie
10
10
  import { useSelector } from "react-redux";
11
11
  import OrgMemberRoleForm from "./OrgMemberRoleForm";
12
12
  import ChangePasswordPanel from "./ChangePasswordPanel";
13
+ import { AppInfo } from "../../../redux/features/common/AppInfoSlice";
14
+ import OrgProvidedPersonGrid from "./OrgProvidedPersonGrid";
15
+ import CustomPersonGrid from "./CustomPersonGrid";
13
16
 
14
17
  const PersonGrid: 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
- );
18
+ const appInfo: AppInfo = useSelector((state: any) => state.AppInfo.value);
19
+ if (appInfo?.isUserProfileManaged) {
20
+ return <CustomPersonGrid />;
21
+ } else {
22
+ return <OrgProvidedPersonGrid />;
23
+
24
+ }
359
25
  };
360
26
 
361
27
  export default PersonGrid;
@@ -35,7 +35,7 @@ const WorkflowDocumentGrid: React.FC = () => {
35
35
  const { t } = useTranslation();
36
36
  const [data, setData] = useState([]);
37
37
  const apiActions = useApiActions({
38
- commonStoreKey:'SystemWorkflows',
38
+ commonStoreKey: "SystemWorkflows",
39
39
  deleteById: "api/v1/dev/workflowdocument",
40
40
  save: "api/v1/dev/workflowdocument",
41
41
  findById: "api/v1/dev/workflowdocument",
@@ -117,6 +117,7 @@ const WorkflowDocumentGrid: React.FC = () => {
117
117
  required: false,
118
118
  fieldType: "combobox",
119
119
  options: SystemOrganizations,
120
+ comboboxValueDataType: "string",
120
121
  optionDisplayField: "organizationCode",
121
122
  optionValueField: "id",
122
123
  },
@@ -240,8 +240,12 @@ const WorkflowDocumentPanel: React.FC<WorkflowDocumentPanelProps> = (props) => {
240
240
  if (workflowDocumentInfo?.nextActionTakers) {
241
241
  for (const actionTaker of workflowDocumentInfo.nextActionTakers) {
242
242
  if (
243
- UserInfo?.username === actionTaker?.username ||
244
- UserInfo?.username === actionTaker?.USERNAME
243
+ UserInfo?.username == actionTaker?.username ||
244
+ UserInfo?.username == actionTaker?.USERNAME ||
245
+ UserInfo?.email == actionTaker?.email ||
246
+ UserInfo?.email == actionTaker?.EMAIL ||
247
+ UserInfo?.employeeNumber == actionTaker?.employeeNumber ||
248
+ UserInfo?.employeeNumber == actionTaker?.EMPLOYEE_NUMBER
245
249
  ) {
246
250
  return true;
247
251
  }
@@ -32,6 +32,7 @@ import useSession from "../hooks/UseSession";
32
32
  import { findNavigationItemById, NavigationItems } from "../navigationItems";
33
33
  import { DRAWER_WIDTH } from "../redux/features/common/AppLayoutSlice";
34
34
  import { toggleSideBarState } from "../redux/features/common/SideBarSlice";
35
+ import { AppInfo } from "../redux/features/common/AppInfoSlice";
35
36
 
36
37
  function DotIcon() {
37
38
  return (
@@ -232,7 +233,7 @@ const CustomTreeItem = React.forwardRef(function CustomTreeItem(
232
233
  export default function NavigationTree() {
233
234
  const navigate = useNavigate();
234
235
  const appLayoutState = useSelector((state: any) => state.AppLayout);
235
- const AppInfo = useSelector((state: any) => state.AppInfo.value);
236
+ const AppInfo: AppInfo = useSelector((state: any) => state.AppInfo.value);
236
237
  const dispatch = useDispatch();
237
238
  const isMobile = useIsMobile();
238
239
  const toggleSideBar = () => {
@@ -243,6 +244,12 @@ export default function NavigationTree() {
243
244
  const filterData = (data) => {
244
245
  const parentItems = [];
245
246
  for (let parentItem of data) {
247
+ if (
248
+ parentItem.id === "development_admin.organization" &&
249
+ !AppInfo.isUserProfileManaged
250
+ ) {
251
+ continue;
252
+ }
246
253
  if (
247
254
  (parentItem.authority === undefined ||
248
255
  parentItem.authority == null ||