@@ -4,7 +4,9 @@ import { startCase, lowerCase, cloneDeep } from 'lodash'
4
4
import { apiClient , tryRequest } from ' @services/ApiService'
5
5
import ModalBox from ' @components/ModalBox.vue'
6
6
import SidePanel from ' @components/SidePanel.vue'
7
- import type { Status , UserCreate , UserResponse , UserUpdate } from ' ccat-api'
7
+ import type { AuthPermission , Status , UserCreate , UserResponse , UserUpdate } from ' ccat-api'
8
+ import type { Option } from ' vue3-select-component'
9
+ import VueSelect from ' vue3-select-component'
8
10
9
11
const getStatus = async () => {
10
12
const result = await tryRequest (apiClient ?.api ?.status .home (), ' Getting Cheshire Cat status' , ' Unable to fetch Cheshire Cat status' )
@@ -55,6 +57,10 @@ const createOrUpdateUser = () => {
55
57
else createUser (userInfo as UserCreate )
56
58
editPanel .value ?.togglePanel ()
57
59
}
60
+
61
+ const permissionsOptions = computed (() => Object .values (availablePerms .value )[0 ].map (permission => ({ label: permission , value: permission })))
62
+
63
+ const fillAll = (resource : string ) => currentUser .value ! .permissions ! [resource ] = availablePerms .value [resource ]
58
64
</script >
59
65
60
66
<template >
@@ -135,18 +141,20 @@ const createOrUpdateUser = () => {
135
141
</button>
136
142
</div>-->
137
143
<div class =" tooltip tooltip-left" data-tip =" Edit" >
138
- <button class =" btn btn-square btn-info btn-xs" :disabled =" cannot('EDIT', 'USERS')" @click =" () => {
139
- currentUser = cloneDeep(item)
140
- editPanel?.togglePanel()
141
- }" >
144
+ <button class =" btn btn-square btn-info btn-xs" :disabled =" cannot('EDIT', 'USERS')"
145
+ @click =" () => {
146
+ currentUser = cloneDeep(item)
147
+ editPanel?.togglePanel()
148
+ }" >
142
149
<ph-pencil-fill class =" size-4" />
143
150
</button >
144
151
</div >
145
152
<div class =" tooltip tooltip-left" data-tip =" Delete" >
146
- <button :disabled =" cannot('DELETE', 'USERS')" class =" btn btn-square btn-error btn-xs" @click =" () => {
147
- currentUser = cloneDeep(item)
148
- deleteModal?.toggleModal()
149
- }" >
153
+ <button :disabled =" cannot('DELETE', 'USERS')"
154
+ class =" btn btn-square btn-error btn-xs" @click =" () => {
155
+ currentUser = cloneDeep(item)
156
+ deleteModal?.toggleModal()
157
+ }" >
150
158
<ph-trash-fill class =" size-4" />
151
159
</button >
152
160
</div >
@@ -192,22 +200,20 @@ const createOrUpdateUser = () => {
192
200
<div class =" label py-0" >
193
201
<span class =" label-text" >{{ startCase(lowerCase(r)) }}</span >
194
202
</div >
195
- <div class =" flex items-center gap-2" >
196
- <div v-for =" p in l" :key =" p" class =" form-control" >
197
- <label class =" label cursor-pointer gap-2 py-1" >
198
- <input :checked =" currentUser?.permissions?.[r]?.includes(p)" type =" checkbox"
199
- class =" checkbox-primary checkbox checkbox-xs rounded" @click =" () => {
200
- if (currentUser?.permissions?.[r]?.includes(p)) {
201
- currentUser.permissions[r] = currentUser.permissions[r].filter((perm: string) => perm !== p)
202
- } else if (currentUser?.permissions?.[r]) {
203
- currentUser!.permissions![r].push(p)
204
- } else {
205
- currentUser!.permissions![r] = [p]
206
- }
207
- }" />
208
- <span class =" label-text" >{{ p }}</span >
209
- </label >
210
- </div >
203
+ <div class =" label py-0" >
204
+ <VueSelect :modelValue =" currentUser?.permissions?.[r] ?? []" :options =" permissionsOptions"
205
+ is-multi :placeholder =" `Select permission`" class =" w-full" @update:modelValue =" (options: AuthPermission[]) => {
206
+ if (options.length < (currentUser!.permissions?.[r]?.length || 0)) return
207
+
208
+ if (!currentUser!.permissions || !(r in currentUser!.permissions))
209
+ currentUser!.permissions = { [r]: options } as Record<string, AuthPermission[]>
210
+ else currentUser!.permissions![r] = [...new Set([...currentUser!.permissions![r], ...options])]
211
+ }" @option-deselected =" (option: Option<AuthPermission>) => {
212
+ if (currentUser!.permissions && (r in currentUser!.permissions)) {
213
+ currentUser!.permissions![r] = currentUser!.permissions![r].filter(p => p !== option.value)
214
+ }
215
+ }" />
216
+ <button class =" btn btn-outline btn-info btn-xs ml-1" @click =" fillAll(r)" >All</button >
211
217
</div >
212
218
</label >
213
219
</div >
0 commit comments