@goweekdays/layer-common 1.2.4 → 1.2.5

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,90 +60,61 @@
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
- :org="props.orgId"
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
+ :app="props.app"
72
+ @cancel="setRole({ mode: 'add' })"
73
+ @submit="submitAdd()"
90
74
  />
91
75
  </v-dialog>
92
76
 
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"
77
+ <v-dialog v-model="dialogPreview" width="500" persistent>
78
+ <RoleForm
79
+ title="Role Details"
80
+ v-model="role"
81
+ @close="setRole({ mode: 'view' })"
82
+ @edit="handOpenEdit()"
83
+ @delete="handleOpenDelete()"
84
+ mode="view"
103
85
  />
104
86
  </v-dialog>
105
87
 
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>
88
+ <v-dialog v-model="dialogEdit" width="500" persistent>
89
+ <RoleForm
90
+ title="Edit Role Details"
91
+ :app="props.app"
92
+ v-model="role"
93
+ @cancel="setRole({ mode: 'edit' })"
94
+ @submit="submitEdit()"
95
+ mode="edit"
96
+ />
97
+ </v-dialog>
140
98
 
141
- <Snackbar v-model="messageSnackbar" :text="message" :color="messageColor" />
99
+ <v-dialog v-model="dialogDelete" width="450" persistent>
100
+ <ConfirmationPrompt
101
+ title="Delete Role"
102
+ action="Delete Role"
103
+ content="Are you sure you want to delete this role? This action cannot be undone."
104
+ @cancel="setRole({ mode: 'delete' })"
105
+ @confirm="submitDelete()"
106
+ :message="message"
107
+ />
108
+ </v-dialog>
142
109
  </v-row>
143
110
  </template>
144
111
 
145
112
  <script setup lang="ts">
146
113
  const props = defineProps({
114
+ app: {
115
+ type: String,
116
+ default: "",
117
+ },
147
118
  orgId: {
148
119
  type: String,
149
120
  default: "",
@@ -201,15 +172,53 @@ const type = defineModel<string>("type", {
201
172
 
202
173
  const { headerSearch } = useLocal();
203
174
 
204
- const { getRoles: _getRoles } = useRole();
175
+ const {
176
+ role,
177
+ add: addRole,
178
+ getAll: _getRoles,
179
+ updateById,
180
+ deleteById,
181
+ } = useRole();
205
182
 
206
183
  const page = ref(1);
207
184
  const pages = ref(0);
208
185
  const pageRange = ref("-- - -- of --");
186
+ const modeRole = ref("");
209
187
 
210
188
  const message = ref("");
211
- const messageSnackbar = ref(false);
212
- const messageColor = ref("");
189
+
190
+ function setRole({
191
+ mode = "",
192
+ dialog = false,
193
+ data = useRole().role.value,
194
+ } = {}) {
195
+ Object.assign(
196
+ role.value,
197
+ JSON.parse(
198
+ JSON.stringify({
199
+ ...data,
200
+ type: props.app,
201
+ })
202
+ )
203
+ );
204
+ modeRole.value = mode;
205
+
206
+ if (modeRole.value === "add") {
207
+ dialogAdd.value = dialog;
208
+ }
209
+
210
+ if (modeRole.value === "view") {
211
+ dialogPreview.value = dialog;
212
+ }
213
+
214
+ if (modeRole.value === "edit") {
215
+ dialogEdit.value = dialog;
216
+ }
217
+
218
+ if (modeRole.value === "delete") {
219
+ dialogDelete.value = dialog;
220
+ }
221
+ }
213
222
 
214
223
  const items = ref<Array<Record<string, any>>>([]);
215
224
 
@@ -242,135 +251,61 @@ watchEffect(() => {
242
251
  });
243
252
 
244
253
  function tableRowClickHandler(_: any, data: any) {
245
- previewDialog.value = true;
246
- roleId.value = data.item._id;
247
- }
248
-
249
- const createDialog = ref(false);
250
-
251
- function success() {
252
- createDialog.value = false;
253
- type.value = "";
254
- getRoles();
254
+ setRole({ data: data.item, mode: "view", dialog: true });
255
255
  }
256
256
 
257
- const previewDialog = ref(false);
258
-
259
- const name = ref("");
260
- const selectedPermissions = ref<Array<string>>([]);
261
- const originalPermissions = ref<Array<string>>([]);
262
- const edit = ref(false);
263
-
264
- watchEffect(() => {
265
- if (!edit.value) {
266
- selectedPermissions.value = originalPermissions.value;
267
- }
268
- });
269
-
270
- const roleId = ref("");
257
+ const dialogAdd = ref(false);
271
258
 
272
- const { getRoleById: _getRoleById, deleteRole } = useRole();
273
-
274
- const { data: role, refresh: getRoleById } = useLazyAsyncData(
275
- "role-permissions-get-by-id",
276
- () => _getRoleById(roleId.value)
277
- );
278
-
279
- watchEffect(() => {
280
- if (roleId.value) {
281
- getRoleById();
282
- }
283
- });
259
+ const dialogPreview = ref(false);
284
260
 
285
- watchEffect(() => {
286
- if (role.value) {
287
- name.value = role.value.name;
288
-
289
- selectedPermissions.value = role.value.permissions;
290
- originalPermissions.value = role.value.permissions;
261
+ async function submitAdd() {
262
+ try {
263
+ await addRole({
264
+ name: role.value.name,
265
+ permissions: role.value.permissions,
266
+ type: role.value.type,
267
+ org: props.orgId,
268
+ });
269
+ setRole({ mode: "add" });
270
+ getRoles();
271
+ } catch (error: any) {
272
+ message.value = error.response._data.message;
291
273
  }
292
- });
293
-
294
- function filterPermissions(
295
- allPermissions: TPermissions,
296
- storedPermissions: string[]
297
- ) {
298
- const filteredPermissions: TPermissions = {};
299
-
300
- Object.entries(allPermissions).forEach(([resource, actions]) => {
301
- const filteredActions = Object.entries(actions)
302
- .filter(([action]) => storedPermissions.includes(`${resource}:${action}`))
303
- .reduce((acc: Record<string, any>, [action, data]) => {
304
- acc[action] = data;
305
- return acc;
306
- }, {});
307
-
308
- if (Object.keys(filteredActions).length > 0) {
309
- filteredPermissions[resource] = filteredActions;
310
- }
311
- });
312
-
313
- return filteredPermissions;
314
274
  }
315
275
 
316
- const { permissions: orgPermissions } = useOrgPermission();
317
- const { permissions: schoolPermissions } = useSchoolPermission();
318
-
319
- const permissions = computed(() => {
320
- if (role.value?.type === "organization") {
321
- return orgPermissions;
322
- }
323
-
324
- if (role.value?.type === "school") {
325
- return schoolPermissions;
326
- }
327
-
328
- return {};
329
- });
330
-
331
- const Permissions = computed(() => {
332
- return edit.value
333
- ? permissions.value
334
- : filterPermissions(permissions.value, selectedPermissions.value);
335
- });
276
+ const dialogEdit = ref(false);
277
+ const dialogDelete = ref(false);
336
278
 
337
- function successfulUpdate() {
338
- previewDialog.value = false;
339
- getRoles();
340
- getRoleById();
341
- edit.value = false;
279
+ function handOpenEdit() {
280
+ dialogPreview.value = false;
281
+ dialogEdit.value = true;
342
282
  }
343
283
 
344
- const confirmDialog = ref(false);
345
- const selectedRoleId = ref<string | null>(null);
346
- const deleteLoading = ref(false);
347
-
348
- function openDeleteDialog(id: string) {
349
- selectedRoleId.value = id;
350
- confirmDialog.value = true;
284
+ async function submitEdit() {
285
+ try {
286
+ await updateById(role.value._id ?? "", {
287
+ name: role.value.name,
288
+ permissions: role.value.permissions,
289
+ });
290
+ await setRole({ mode: "edit" });
291
+ await getRoles();
292
+ } catch (error: any) {
293
+ message.value = error.response._data.message;
294
+ }
351
295
  }
352
296
 
353
- function showMessage(msg: string, color: string) {
354
- message.value = msg;
355
- messageColor.value = color;
356
- messageSnackbar.value = true;
297
+ function handleOpenDelete() {
298
+ dialogPreview.value = false;
299
+ dialogDelete.value = true;
357
300
  }
358
301
 
359
- async function handleDeleteRole() {
360
- if (!selectedRoleId.value) return;
361
- deleteLoading.value = true;
302
+ async function submitDelete() {
362
303
  try {
363
- const res = await deleteRole(selectedRoleId.value);
364
-
365
- confirmDialog.value = false;
366
- showMessage(res.message, "success");
304
+ await deleteById(role.value._id ?? "");
305
+ dialogDelete.value = false;
367
306
  getRoles();
368
307
  } catch (error: any) {
369
- const errorMessage = error?.response?._data?.message;
370
- showMessage(errorMessage, "error");
371
- } finally {
372
- deleteLoading.value = false;
373
- selectedRoleId.value = null;
308
+ message.value = error.response._data.message;
374
309
  }
375
310
  }
376
311
  </script>
@@ -13,7 +13,7 @@ export default function useAddress() {
13
13
  postalCode = "",
14
14
  taxId = "",
15
15
  } = {}) {
16
- return useNuxtApp().$api("/api/addresses", {
16
+ return $fetch("/api/addresses", {
17
17
  method: "POST",
18
18
  body: {
19
19
  type,
@@ -57,18 +57,18 @@ export default function useAddress() {
57
57
  payload.org = orgId;
58
58
  }
59
59
 
60
- return useNuxtApp().$api(`/api/addresses/details/${id}`, {
60
+ return $fetch(`/api/addresses/details/${id}`, {
61
61
  method: "PUT",
62
62
  body: payload,
63
63
  });
64
64
  }
65
65
 
66
66
  function getByUserId(user = "") {
67
- return useNuxtApp().$api<TAddress>(`/api/addresses/user/${user}`);
67
+ return $fetch<TAddress>(`/api/addresses/user/${user}`);
68
68
  }
69
69
 
70
70
  function getByOrgId(id = "") {
71
- return useNuxtApp().$api<TAddress>(`/api/addresses/org/${id}`);
71
+ return $fetch<TAddress>(`/api/addresses/org/${id}`);
72
72
  }
73
73
 
74
74
  const _address = useState("address", (): TAddress => {
@@ -7,7 +7,7 @@ export default function useChartOfAccount() {
7
7
  children?: number;
8
8
  }
9
9
  ) {
10
- return useNuxtApp().$api<Record<string, any>>("/api/chart-of-accounts", {
10
+ return $fetch<Record<string, any>>("/api/chart-of-accounts", {
11
11
  method: "GET",
12
12
  query: { page, status, orgId, children },
13
13
  });
@@ -23,33 +23,30 @@ export default function useChartOfAccount() {
23
23
  };
24
24
 
25
25
  function add(value: TAddPayload) {
26
- return useNuxtApp().$api<TAddPayload>("/api/chart-of-accounts", {
26
+ return $fetch<TAddPayload>("/api/chart-of-accounts", {
27
27
  method: "POST",
28
28
  body: value,
29
29
  });
30
30
  }
31
31
 
32
32
  function getById(id: string) {
33
- return useNuxtApp().$api<Record<string, any>>(
34
- `/api/chart-of-accounts/id/${id}`
35
- );
33
+ return $fetch<Record<string, any>>(`/api/chart-of-accounts/id/${id}`);
36
34
  }
37
35
 
38
36
  function updateById(
39
37
  id: string,
40
38
  value: Pick<TAddPayload, "name" | "code" | "normalBalance" | "parent">
41
39
  ) {
42
- return useNuxtApp().$api<TAddPayload>(`/api/chart-of-accounts/id/${id}`, {
40
+ return $fetch<TAddPayload>(`/api/chart-of-accounts/id/${id}`, {
43
41
  method: "PUT",
44
42
  body: value,
45
43
  });
46
44
  }
47
45
 
48
46
  function deleteById(id: string) {
49
- return useNuxtApp().$api<Record<string, any>>(
50
- `/api/chart-of-accounts/id/${id}`,
51
- { method: "DELETE" }
52
- );
47
+ return $fetch<Record<string, any>>(`/api/chart-of-accounts/id/${id}`, {
48
+ method: "DELETE",
49
+ });
53
50
  }
54
51
 
55
52
  return {
@@ -7,19 +7,16 @@ export default function useFile() {
7
7
  const formData = new FormData();
8
8
  formData.append("file", file);
9
9
 
10
- return useNuxtApp().$api<Record<string, any>>("/api/files", {
10
+ return $fetch<Record<string, any>>("/api/files", {
11
11
  method: "POST",
12
12
  body: formData,
13
13
  });
14
14
  }
15
15
 
16
16
  function deleteFile(attachmentId: string) {
17
- return useNuxtApp().$api<Record<string, any>>(
18
- `/api/files/${attachmentId}`,
19
- {
20
- method: "DELETE",
21
- }
22
- );
17
+ return $fetch<Record<string, any>>(`/api/files/${attachmentId}`, {
18
+ method: "DELETE",
19
+ });
23
20
  }
24
21
 
25
22
  return {
@@ -4,29 +4,23 @@ export default function useInvoice() {
4
4
  throw new Error("Subscription ID is required");
5
5
  }
6
6
 
7
- return useNuxtApp().$api<Record<string, any>>(
8
- `/api/invoices/subscription/${id}`,
9
- {
10
- method: "GET",
11
- params: {
12
- search,
13
- page,
14
- },
15
- }
16
- );
7
+ return $fetch<Record<string, any>>(`/api/invoices/subscription/${id}`, {
8
+ method: "GET",
9
+ params: {
10
+ search,
11
+ page,
12
+ },
13
+ });
17
14
  }
18
15
 
19
16
  function getByNumber(number: string) {
20
- return useNuxtApp().$api<Record<string, any>>(
21
- `/api/invoices/number/${number}`,
22
- {
23
- method: "GET",
24
- }
25
- );
17
+ return $fetch<Record<string, any>>(`/api/invoices/number/${number}`, {
18
+ method: "GET",
19
+ });
26
20
  }
27
21
 
28
22
  function getByDueDateStatus(date: string, status: string) {
29
- return useNuxtApp().$api<Record<string, any>>(
23
+ return $fetch<Record<string, any>>(
30
24
  `/api/invoices/due-date/${date}/status/${status}`,
31
25
  {
32
26
  method: "GET",
@@ -21,7 +21,7 @@ export default function useLocalAuth() {
21
21
 
22
22
  const { data: getCurrentUserReq, error: getCurrentUserErr } =
23
23
  useLazyAsyncData("get-current-user", () =>
24
- useNuxtApp().$api<TUser>(`/api/users/id/${user}`)
24
+ $fetch<TUser>(`/api/users/id/${user}`)
25
25
  );
26
26
 
27
27
  watchEffect(() => {
@@ -39,7 +39,7 @@ export default function useLocalAuth() {
39
39
  }
40
40
 
41
41
  async function login({ email = "", password = "", role = "" }) {
42
- return useNuxtApp().$api<Record<string, any>>("/api/auth/login", {
42
+ return $fetch<Record<string, any>>("/api/auth/login", {
43
43
  method: "POST",
44
44
  body: JSON.stringify({ email, password, role }),
45
45
  });
@@ -55,7 +55,7 @@ export default function useLocalAuth() {
55
55
  const user = useCookie("user", cookieConfig).value;
56
56
  if (!user) return null;
57
57
  try {
58
- const _user = await useNuxtApp().$api<TUser>(`/api/users/id/${user}`, {
58
+ const _user = await $fetch<TUser>(`/api/users/id/${user}`, {
59
59
  method: "GET",
60
60
  });
61
61
 
@@ -72,7 +72,7 @@ export default function useLocalAuth() {
72
72
  }
73
73
 
74
74
  try {
75
- const response = await useNuxtApp().$api("/api/auth/forget-password", {
75
+ const response = await $fetch("/api/auth/forget-password", {
76
76
  method: "POST",
77
77
  body: JSON.stringify({ email }),
78
78
  headers: { "Content-Type": "application/json" },
@@ -90,7 +90,7 @@ export default function useLocalAuth() {
90
90
  passwordConfirmation: string
91
91
  ) {
92
92
  try {
93
- return await useNuxtApp().$api("/api/auth/reset-password", {
93
+ return await $fetch("/api/auth/reset-password", {
94
94
  method: "POST",
95
95
  body: JSON.stringify({ otp, newPassword, passwordConfirmation }),
96
96
  headers: { "Content-Type": "application/json" },
@@ -102,13 +102,13 @@ export default function useLocalAuth() {
102
102
  }
103
103
 
104
104
  function verify(id: string) {
105
- return useNuxtApp().$api<TKeyValuePair>(`/api/auth/verify/${id}`, {
105
+ return $fetch<TKeyValuePair>(`/api/auth/verify/${id}`, {
106
106
  method: "GET",
107
107
  });
108
108
  }
109
109
 
110
110
  function signUp(email: string, referral: string) {
111
- return useNuxtApp().$api<TKeyValuePair>("/api/auth/sign-up", {
111
+ return $fetch<TKeyValuePair>("/api/auth/sign-up", {
112
112
  method: "POST",
113
113
  body: { email, referral },
114
114
  });
@@ -22,11 +22,11 @@ export default function useMember() {
22
22
  }));
23
23
 
24
24
  function getByUserId(user: string) {
25
- return useNuxtApp().$api<TMember>(`/api/members/user/${user}`);
25
+ return $fetch<TMember>(`/api/members/user/${user}`);
26
26
  }
27
27
 
28
28
  function getByUserType(user: string, type: string, org?: string) {
29
- return useNuxtApp().$api<TMember>(`/api/members/user/${user}/app/${type}`, {
29
+ return $fetch<TMember>(`/api/members/user/${user}/app/${type}`, {
30
30
  method: "GET",
31
31
  query: { org },
32
32
  });
@@ -41,7 +41,7 @@ export default function useMember() {
41
41
  type = "",
42
42
  status = "active",
43
43
  } = {}) {
44
- return useNuxtApp().$api<Record<string, any>>("/api/members", {
44
+ return $fetch<Record<string, any>>("/api/members", {
45
45
  method: "GET",
46
46
  query: { page, limit, search, user, org, type, status },
47
47
  });
@@ -50,25 +50,19 @@ export default function useMember() {
50
50
  verificationId: string,
51
51
  payload: Record<string, any>
52
52
  ) {
53
- return useNuxtApp().$api<Record<string, any>>(
54
- `/api/users/invite/${verificationId}`,
55
- {
56
- method: "POST",
57
- body: payload,
58
- }
59
- );
53
+ return $fetch<Record<string, any>>(`/api/users/invite/${verificationId}`, {
54
+ method: "POST",
55
+ body: payload,
56
+ });
60
57
  }
61
58
 
62
59
  function createMemberInvite(verificatonId: string) {
63
- return useNuxtApp().$api<TMember>(
64
- `/api/members/verification/${verificatonId}`,
65
- {
66
- method: "POST",
67
- }
68
- );
60
+ return $fetch<TMember>(`/api/members/verification/${verificatonId}`, {
61
+ method: "POST",
62
+ });
69
63
  }
70
64
  function updateMemberStatus(id: string, status: string) {
71
- return useNuxtApp().$api<Record<string, any>>(
65
+ return $fetch<Record<string, any>>(
72
66
  `/api/members/status/${status}/id/${id}`,
73
67
  {
74
68
  method: "PUT",
@@ -82,7 +76,7 @@ export default function useMember() {
82
76
  type: string,
83
77
  org: string
84
78
  ) {
85
- return useNuxtApp().$api<Record<string, any>>(
79
+ return $fetch<Record<string, any>>(
86
80
  `/api/members/id/${id}/role/${role}/type/${type}/org/${org}`,
87
81
  {
88
82
  method: "PUT",
@@ -5,7 +5,7 @@ export default function useOrder() {
5
5
  page = 1,
6
6
  status = "succeeded",
7
7
  } = {}) {
8
- return useNuxtApp().$api<Record<string, any>>("/api/orders", {
8
+ return $fetch<Record<string, any>>("/api/orders", {
9
9
  method: "GET",
10
10
  query: {
11
11
  search,