@eeplatform/nuxt-layer-common 1.7.47 → 1.7.49

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -6,11 +6,11 @@
6
6
  class="text-none"
7
7
  rounded="pill"
8
8
  variant="tonal"
9
- @click="createDialog = true"
9
+ @click="setRole({ mode: 'add', dialog: true })"
10
10
  size="large"
11
11
  v-if="canCreateRole"
12
12
  >
13
- Create role
13
+ Add Role
14
14
  </v-btn>
15
15
  </v-row>
16
16
  </v-col>
@@ -60,98 +60,66 @@
60
60
  </span>
61
61
  <v-chip>{{ value.length }}</v-chip>
62
62
  </template>
63
-
64
- <template #item.action-table="{ item }" v-if="canDeleteRole">
65
- <v-menu :close-on-content-click="false" offset-y width="150">
66
- <template v-slot:activator="{ props }">
67
- <v-icon v-bind="props">mdi-dots-horizontal</v-icon>
68
- </template>
69
- <v-list>
70
- <v-list-item @click="openDeleteDialog(item._id)">
71
- Delete Role
72
- </v-list-item>
73
- </v-list>
74
- </v-menu>
75
- </template>
76
63
  </v-data-table>
77
64
  </v-card>
78
65
  </v-col>
79
66
 
80
67
  <!-- dialogs -->
81
- <v-dialog v-model="createDialog" width="500" persistent>
82
- <RolePermissionFormCreate
83
- @cancel="createDialog = false"
84
- :permissions="props.permissions"
85
- :id="props.id"
86
- @success="success()"
87
- v-model:type="type"
88
- :types="props.types"
89
- @success:create-more="getRoles()"
68
+ <v-dialog v-model="dialogAdd" width="500" persistent>
69
+ <RoleForm
70
+ v-model="role"
71
+ v-model:message="message"
72
+ :app="props.app"
73
+ @cancel="setRole({ mode: 'add' })"
74
+ @submit="submitAdd()"
90
75
  />
91
76
  </v-dialog>
92
77
 
93
- <v-dialog v-model="previewDialog" width="500" persistent>
94
- <RolePermissionFormPreviewUpdate
95
- @cancel="previewDialog = false"
96
- @success="successfulUpdate()"
97
- :permissions="Permissions"
98
- :original-permissions="originalPermissions"
99
- v-model="selectedPermissions"
100
- v-model:edit="edit"
101
- :name="name"
102
- :id="roleId"
78
+ <v-dialog v-model="dialogPreview" width="500" persistent>
79
+ <RoleForm
80
+ title="Role Details"
81
+ :app="props.app"
82
+ v-model="role"
83
+ @close="setRole({ mode: 'view' })"
84
+ @edit="handOpenEdit()"
85
+ @delete="handleOpenDelete()"
86
+ mode="view"
103
87
  />
104
88
  </v-dialog>
105
89
 
106
- <ConfirmDialog
107
- v-model="confirmDialog"
108
- :loading="deleteLoading"
109
- @submit="handleDeleteRole"
110
- >
111
- <template #title>
112
- <span class="font-weight-medium text-h5">Delete Role</span>
113
- </template>
114
-
115
- <template #description>
116
- <p class="text-subtitle-2">
117
- Are you sure you want to delete this role? This action cannot be
118
- undone.
119
- </p>
120
- </template>
121
-
122
- <template #footer>
123
- <v-btn
124
- variant="text"
125
- @click="confirmDialog = false"
126
- :disabled="deleteLoading"
127
- >
128
- Close
129
- </v-btn>
130
- <v-btn
131
- color="primary"
132
- variant="flat"
133
- @click="handleDeleteRole"
134
- :loading="deleteLoading"
135
- >
136
- Delete Role
137
- </v-btn>
138
- </template>
139
- </ConfirmDialog>
90
+ <v-dialog v-model="dialogEdit" width="500" persistent>
91
+ <RoleForm
92
+ title="Edit Role Details"
93
+ :app="props.app"
94
+ v-model="role"
95
+ @cancel="setRole({ mode: 'edit' })"
96
+ @submit="submitEdit()"
97
+ mode="edit"
98
+ />
99
+ </v-dialog>
140
100
 
141
- <Snackbar v-model="messageSnackbar" :text="message" :color="messageColor" />
101
+ <v-dialog v-model="dialogDelete" width="450" persistent>
102
+ <ConfirmationPrompt
103
+ title="Delete Role"
104
+ action="Delete Role"
105
+ content="Are you sure you want to delete this role? This action cannot be undone."
106
+ @cancel="setRole({ mode: 'delete' })"
107
+ @confirm="submitDelete()"
108
+ v-model:message="message"
109
+ />
110
+ </v-dialog>
142
111
  </v-row>
143
112
  </template>
144
113
 
145
114
  <script setup lang="ts">
146
115
  const props = defineProps({
147
- id: {
116
+ app: {
148
117
  type: String,
149
118
  default: "",
150
119
  },
151
- permissions: {
152
- type: Object,
153
- required: true,
154
- default: () => ({}),
120
+ org: {
121
+ type: String,
122
+ default: "",
155
123
  },
156
124
  types: {
157
125
  type: Array as PropType<Array<{ title: string; value: string }>>,
@@ -168,7 +136,7 @@ const props = defineProps({
168
136
  title: "permissions",
169
137
  value: "permissions",
170
138
  },
171
- { title: "Action", value: "action-table" },
139
+ { title: "App", value: "app" },
172
140
  ],
173
141
  },
174
142
  canCreateRole: {
@@ -193,40 +161,75 @@ const props = defineProps({
193
161
  },
194
162
  });
195
163
 
196
- const type = defineModel<string>("type", {
197
- type: String,
198
- default: "",
199
- });
200
-
201
164
  const { headerSearch } = useLocal();
202
165
 
203
- const { getRoles: _getRoles } = useRole();
166
+ const {
167
+ role,
168
+ add: addRole,
169
+ getAll: _getRoles,
170
+ updateById,
171
+ deleteById,
172
+ } = useRole();
204
173
 
205
174
  const page = ref(1);
206
175
  const pages = ref(0);
207
176
  const pageRange = ref("-- - -- of --");
177
+ const modeRole = ref("");
208
178
 
209
179
  const message = ref("");
210
- const messageSnackbar = ref(false);
211
- const messageColor = ref("");
180
+
181
+ function setRole({
182
+ mode = "",
183
+ dialog = false,
184
+ data = useRole().role.value,
185
+ } = {}) {
186
+ Object.assign(
187
+ role.value,
188
+ JSON.parse(
189
+ JSON.stringify({
190
+ ...data,
191
+ app: mode === "admin" || mode === "add" ? props.app : data.app,
192
+ })
193
+ )
194
+ );
195
+ modeRole.value = mode;
196
+ message.value = "";
197
+
198
+ if (modeRole.value === "add") {
199
+ dialogAdd.value = dialog;
200
+ }
201
+
202
+ if (modeRole.value === "view") {
203
+ dialogPreview.value = dialog;
204
+ }
205
+
206
+ if (modeRole.value === "edit") {
207
+ dialogEdit.value = dialog;
208
+ }
209
+
210
+ if (modeRole.value === "delete") {
211
+ dialogDelete.value = dialog;
212
+ }
213
+ }
212
214
 
213
215
  const items = ref<Array<Record<string, any>>>([]);
214
216
 
217
+ const isOrg = computed(() => props.app === "org");
218
+
215
219
  const {
216
220
  data: getRoleReq,
217
221
  refresh: getRoles,
218
222
  status: getRoleReqStatus,
219
223
  } = useLazyAsyncData(
220
- "roles-permissions-get-all" + "-" + props.id,
224
+ `roles-permissions-get-all-by-${props.app}-${props.org}-page-${page.value}`,
221
225
  () =>
222
226
  _getRoles({
223
227
  page: page.value,
224
- search: headerSearch.value,
225
- type: type.value,
226
- id: props.id,
228
+ org: props.org,
229
+ app: isOrg.value ? "" : props.app,
227
230
  }),
228
231
  {
229
- watch: [page, headerSearch],
232
+ watch: [page],
230
233
  }
231
234
  );
232
235
 
@@ -241,135 +244,64 @@ watchEffect(() => {
241
244
  });
242
245
 
243
246
  function tableRowClickHandler(_: any, data: any) {
244
- previewDialog.value = true;
245
- roleId.value = data.item._id;
247
+ setRole({ data: data.item, mode: "view", dialog: true });
246
248
  }
247
249
 
248
- const createDialog = ref(false);
249
-
250
- function success() {
251
- createDialog.value = false;
252
- type.value = "";
253
- getRoles();
254
- }
255
-
256
- const previewDialog = ref(false);
257
-
258
- const name = ref("");
259
- const selectedPermissions = ref<Array<string>>([]);
260
- const originalPermissions = ref<Array<string>>([]);
261
- const edit = ref(false);
250
+ const dialogAdd = ref(false);
262
251
 
263
- watchEffect(() => {
264
- if (!edit.value) {
265
- selectedPermissions.value = originalPermissions.value;
266
- }
267
- });
252
+ const dialogPreview = ref(false);
268
253
 
269
- const roleId = ref("");
254
+ const { loggedInUser } = useLocalAuth();
270
255
 
271
- const { getRoleById: _getRoleById, deleteRole } = useRole();
272
-
273
- const { data: role, refresh: getRoleById } = useLazyAsyncData(
274
- "role-permissions-get-by-id",
275
- () => _getRoleById(roleId.value)
276
- );
277
-
278
- watchEffect(() => {
279
- if (roleId.value) {
280
- getRoleById();
281
- }
282
- });
283
-
284
- watchEffect(() => {
285
- if (role.value) {
286
- name.value = role.value.name as any;
287
-
288
- selectedPermissions.value = role.value.permissions as any;
289
- originalPermissions.value = role.value.permissions as any;
256
+ async function submitAdd() {
257
+ try {
258
+ await addRole({
259
+ name: role.value.name,
260
+ permissions: role.value.permissions,
261
+ app: role.value.app,
262
+ org: props.org,
263
+ createdBy: loggedInUser(),
264
+ });
265
+ setRole({ mode: "add" });
266
+ getRoles();
267
+ } catch (error: any) {
268
+ message.value = error.response._data.message;
290
269
  }
291
- });
292
-
293
- function filterPermissions(
294
- allPermissions: TPermissions,
295
- storedPermissions: string[]
296
- ) {
297
- const filteredPermissions: TPermissions = {};
298
-
299
- Object.entries(allPermissions).forEach(([resource, actions]) => {
300
- const filteredActions = Object.entries(actions)
301
- .filter(([action]) => storedPermissions.includes(`${resource}:${action}`))
302
- .reduce((acc: Record<string, any>, [action, data]) => {
303
- acc[action] = data;
304
- return acc;
305
- }, {});
306
-
307
- if (Object.keys(filteredActions).length > 0) {
308
- filteredPermissions[resource] = filteredActions;
309
- }
310
- });
311
-
312
- return filteredPermissions;
313
270
  }
314
271
 
315
- const { permissions: orgPermissions } = useOrgPermission();
316
- const { permissions: schoolPermissions } = useSchoolPermission();
317
-
318
- const permissions = computed(() => {
319
- if (role.value?.type === "organization") {
320
- return orgPermissions;
321
- }
322
-
323
- if (role.value?.type === "school") {
324
- return schoolPermissions;
325
- }
326
-
327
- return {};
328
- });
329
-
330
- const Permissions = computed(() => {
331
- return edit.value
332
- ? permissions.value
333
- : filterPermissions(permissions.value, selectedPermissions.value);
334
- });
272
+ const dialogEdit = ref(false);
273
+ const dialogDelete = ref(false);
335
274
 
336
- function successfulUpdate() {
337
- previewDialog.value = false;
338
- getRoles();
339
- getRoleById();
340
- edit.value = false;
275
+ function handOpenEdit() {
276
+ dialogPreview.value = false;
277
+ dialogEdit.value = true;
341
278
  }
342
279
 
343
- const confirmDialog = ref(false);
344
- const selectedRoleId = ref<string | null>(null);
345
- const deleteLoading = ref(false);
346
-
347
- function openDeleteDialog(id: string) {
348
- selectedRoleId.value = id;
349
- confirmDialog.value = true;
280
+ async function submitEdit() {
281
+ try {
282
+ await updateById(role.value._id ?? "", {
283
+ name: role.value.name,
284
+ permissions: role.value.permissions,
285
+ });
286
+ await setRole({ mode: "edit" });
287
+ await getRoles();
288
+ } catch (error: any) {
289
+ message.value = error.response._data.message;
290
+ }
350
291
  }
351
292
 
352
- function showMessage(msg: string, color: string) {
353
- message.value = msg;
354
- messageColor.value = color;
355
- messageSnackbar.value = true;
293
+ function handleOpenDelete() {
294
+ dialogPreview.value = false;
295
+ dialogDelete.value = true;
356
296
  }
357
297
 
358
- async function handleDeleteRole() {
359
- if (!selectedRoleId.value) return;
360
- deleteLoading.value = true;
298
+ async function submitDelete() {
361
299
  try {
362
- const res = await deleteRole(selectedRoleId.value);
363
-
364
- confirmDialog.value = false;
365
- showMessage(res.message, "success");
300
+ await deleteById(role.value._id ?? "");
301
+ dialogDelete.value = false;
366
302
  getRoles();
367
303
  } catch (error: any) {
368
- const errorMessage = error?.response?._data?.message;
369
- showMessage(errorMessage, "error");
370
- } finally {
371
- deleteLoading.value = false;
372
- selectedRoleId.value = null;
304
+ message.value = error.response._data.message;
373
305
  }
374
306
  }
375
307
  </script>
@@ -0,0 +1,58 @@
1
+ export default function useApps() {
2
+ const app = ref<TApp>({
3
+ _id: "",
4
+ code: "",
5
+ name: "",
6
+ description: "",
7
+ status: "active",
8
+ createdAt: "",
9
+ updatedAt: "",
10
+ deletedAt: "",
11
+ });
12
+
13
+ const resource = "/api/apps";
14
+
15
+ function add(value: TApp) {
16
+ return useNuxtApp().$api(resource, {
17
+ method: "POST",
18
+ body: value,
19
+ });
20
+ }
21
+
22
+ function getAll({
23
+ page = 1,
24
+ limit = 10,
25
+ search = "",
26
+ status = "active",
27
+ type = "standard",
28
+ } = {}) {
29
+ return useNuxtApp().$api<Record<string, any>>(resource, {
30
+ method: "GET",
31
+ query: { page, limit, search, status, type },
32
+ });
33
+ }
34
+
35
+ function updateById(
36
+ id: string,
37
+ value: { name: string; description: string }
38
+ ) {
39
+ return useNuxtApp().$api(`${resource}/id/${id}`, {
40
+ method: "PATCH",
41
+ body: value,
42
+ });
43
+ }
44
+
45
+ function deleteById(id: string) {
46
+ return useNuxtApp().$api(`${resource}/id/${id}`, {
47
+ method: "DELETE",
48
+ });
49
+ }
50
+
51
+ return {
52
+ app,
53
+ add,
54
+ getAll,
55
+ updateById,
56
+ deleteById,
57
+ };
58
+ }
@@ -12,7 +12,7 @@ export default function useLocal() {
12
12
  const { APP_STUDENT, APP_PARENT, APP_SCHOOL, APP_DIVISION, APP_REGION } =
13
13
  appConfig;
14
14
 
15
- const apps = computed<Array<TApp>>(() => {
15
+ const apps = computed(() => {
16
16
  return [
17
17
  {
18
18
  title: "Student",
@@ -2,6 +2,18 @@ export default function useLocalAuth() {
2
2
  const { cookieConfig } = useRuntimeConfig().public;
3
3
 
4
4
  const currentUser = useState<TUser | null>("currentUser", () => null);
5
+ const permissions = useState<string[]>("permissions", () => []);
6
+
7
+ const hasPermission = (permissionKey: string): ComputedRef<boolean> => {
8
+ return computed(() => {
9
+ if (!permissions.value.length) return false;
10
+ return permissions.value.some((perm) => perm === permissionKey);
11
+ });
12
+ };
13
+
14
+ function loggedInUser() {
15
+ return useCookie("user", cookieConfig).value ?? "";
16
+ }
5
17
 
6
18
  function authenticate() {
7
19
  if (currentUser.value) {
@@ -128,6 +140,9 @@ export default function useLocalAuth() {
128
140
  }
129
141
 
130
142
  return {
143
+ loggedInUser,
144
+ permissions,
145
+ hasPermission,
131
146
  authenticate,
132
147
  login,
133
148
  setSession,
@@ -1,25 +1,19 @@
1
1
  export default function useMember() {
2
- const members = useState<Array<TMember>>("members", () => []);
3
- const page = useState("page", () => 1);
4
- const pages = useState("pages", () => 0);
5
- const pageRange = useState("pageRange", () => "-- - -- of --");
6
-
7
- const member = useState<TMember>("member", () => ({
8
- _id: "",
2
+ const member = ref<TMember>({
9
3
  org: "",
10
4
  orgName: "",
11
- roleName: "",
12
5
  name: "",
13
6
  user: "",
14
7
  role: "",
15
- type: "",
16
- customerOrgId: "",
17
- customerSiteId: "",
18
- status: "",
19
- createdAt: "",
20
- updatedAt: "",
21
- deletedAt: "",
22
- }));
8
+ });
9
+
10
+ const invitation = ref<TMemberInvitation>({
11
+ _id: "",
12
+ email: "",
13
+ app: "",
14
+ org: "",
15
+ role: "",
16
+ });
23
17
 
24
18
  function getByUserId(user: string) {
25
19
  return useNuxtApp().$api<TMember>(`/api/members/user/${user}`);
@@ -32,18 +26,41 @@ export default function useMember() {
32
26
  });
33
27
  }
34
28
 
29
+ function getByApp({ app = "", user = "", org = "" } = {}) {
30
+ return useNuxtApp().$api<TMember>(`/api/members/app/${app}/user/${user}`, {
31
+ method: "GET",
32
+ query: { org },
33
+ });
34
+ }
35
+
36
+ function getAllByAppUser({
37
+ app = "",
38
+ user = "",
39
+ limit = 10,
40
+ page = 1,
41
+ search = "",
42
+ } = {}) {
43
+ return useNuxtApp().$api<Record<string, any>>(
44
+ `/api/members/orgs/app/${app}/user/${user}`,
45
+ {
46
+ method: "GET",
47
+ query: { page, limit, search },
48
+ }
49
+ );
50
+ }
51
+
35
52
  async function getAll({
36
53
  page = 1,
37
54
  search = "",
38
55
  limit = 10,
39
56
  user = "",
40
57
  org = "",
41
- type = "",
58
+ app = "",
42
59
  status = "active",
43
60
  } = {}) {
44
- return useNuxtApp().$api<Record<string, any>>("/api/members", {
61
+ return useNuxtApp().$api<Record<string, any>>(`/api/members/app/${app}`, {
45
62
  method: "GET",
46
- query: { page, limit, search, user, org, type, status },
63
+ query: { page, limit, search, user, org, status },
47
64
  });
48
65
  }
49
66
  function createUserByVerification(
@@ -76,32 +93,45 @@ export default function useMember() {
76
93
  );
77
94
  }
78
95
 
79
- function updateMemberRole(
80
- id: string,
81
- role: string,
82
- type: string,
83
- org: string
84
- ) {
96
+ function updateRoleById(id: string, role: string) {
85
97
  return useNuxtApp().$api<Record<string, any>>(
86
- `/api/members/id/${id}/role/${role}/type/${type}/org/${org}`,
98
+ `/api/members/role/id/${id}`,
87
99
  {
88
- method: "PUT",
100
+ method: "PATCH",
101
+ body: { role },
89
102
  }
90
103
  );
91
104
  }
105
+
106
+ function updateStatusById(id: string, status: string) {
107
+ return useNuxtApp().$api<Record<string, any>>(
108
+ `/api/members/status/id/${id}`,
109
+ {
110
+ method: "PATCH",
111
+ body: { status },
112
+ }
113
+ );
114
+ }
115
+
116
+ function deleteById(id: string) {
117
+ return useNuxtApp().$api<Record<string, any>>(`/api/members/id/${id}`, {
118
+ method: "DELETE",
119
+ });
120
+ }
121
+
92
122
  return {
93
- members,
94
123
  member,
95
- page,
96
- pages,
97
- pageRange,
98
-
124
+ invitation,
99
125
  getAll,
100
126
  getByUserId,
101
127
  createUserByVerification,
102
128
  createMemberInvite,
103
129
  getByUserType,
130
+ getByApp,
104
131
  updateMemberStatus,
105
- updateMemberRole,
132
+ updateRoleById,
133
+ updateStatusById,
134
+ deleteById,
135
+ getAllByAppUser,
106
136
  };
107
137
  }