Skip to content

Commit 7e922bf

Browse files
committed
Implement bulk deletion modal for selected identities #62
1 parent 9857dae commit 7e922bf

File tree

2 files changed

+127
-22
lines changed

2 files changed

+127
-22
lines changed
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
<template lang="pug">
2+
q-dialog(
3+
ref="dialogRef",
4+
@hide="onDialogHide",
5+
)
6+
q-card.q-dialog-plugin
7+
q-card-section
8+
q-card-title.text-h6
9+
| Suppression en masse des identités
10+
q-card-section
11+
q-card-main
12+
13+
p {{ mainText }}
14+
15+
q-card-actions
16+
q-space
17+
q-btn(
18+
color="positive",
19+
label="Valider",
20+
@click="syncIdentities"
21+
)
22+
q-btn(
23+
color="negative",
24+
label="Annuler",
25+
@click="cancelSync"
26+
)
27+
</template>
28+
29+
<script lang="ts" setup>
30+
import { ref, computed } from 'vue'
31+
import { useDialogPluginComponent } from 'quasar'
32+
33+
const props = defineProps({
34+
selectedIdentities: {
35+
type: Array,
36+
default: () => [],
37+
},
38+
})
39+
40+
defineEmits([...useDialogPluginComponent.emits])
41+
42+
const mainText = computed(() => `Vous êtes sur le point de supprimer ${props.selectedIdentities.length} identités. Voulez-vous continuer ?`)
43+
44+
const syncIdentities = () => {
45+
console.log('syncIdentities')
46+
onDialogOK({ success: true })
47+
}
48+
49+
const cancelSync = () => {
50+
console.log('cancelSync')
51+
onDialogCancel()
52+
}
53+
54+
const { dialogRef, onDialogHide, onDialogOK, onDialogCancel } = useDialogPluginComponent()
55+
</script>

apps/web/src/components/table/top-left.vue

Lines changed: 72 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,9 @@ q-btn-group(rounded flat)
88
q-tooltip.text-body2(transition-show="scale" transition-hide="scale") Mettre à synchroniser les identités sélectionnées
99
q-btn(flat icon="mdi-email-arrow-right" color="primary" rounded @click="openInitModale" size="md" :disable="selected.length === 0")
1010
q-tooltip.text-body2(transition-show="scale" transition-hide="scale") Envoyer le mail d'invitation
11-
q-btn(flat icon="mdi-close" color="negative" rounded @click="clearSelection" size="md" :disable="selected.length === 0")
11+
q-btn(flat icon="mdi-delete" color="negative" rounded @click="openTrashModale" size="md" :disable="selected.length === 0")
12+
q-tooltip.text-body2(transition-show="scale" transition-hide="scale") Supprimer en masse
13+
q-btn(flat icon="mdi-cancel" color="warning" rounded @click="clearSelection" size="md" v-show="selected.length !== 0")
1214
q-tooltip.text-body2(transition-show="scale" transition-hide="scale") Nettoyer la selection
1315
</template>
1416

@@ -18,10 +20,11 @@ import type { PropType } from 'vue'
1820
import { useRouter } from 'nuxt/app'
1921
import updateIdentityModale from '../updateIdentityModale.vue'
2022
import updateInitModale from '../updateInitModale.vue'
23+
import deleteManyModale from '../deleteManyModale.vue'
2124
import { useIdentityStates } from '#imports'
2225
import { IdentityState } from '~/composables'
2326
import { useIdentityStateStore } from '~/stores/identityState'
24-
import {computed} from "vue";
27+
import { computed } from 'vue'
2528
2629
const $q = useQuasar()
2730
@@ -32,8 +35,8 @@ const props = defineProps({
3235
},
3336
total: {
3437
type: Number,
35-
default:0
36-
}
38+
default: 0,
39+
},
3740
})
3841
3942
const emit = defineEmits(['updateLifestep', 'clear', 'refresh'])
@@ -78,21 +81,20 @@ function openUpdateModale() {
7881
console.log('cancelSync')
7982
})
8083
}
81-
function returnFilter(){
82-
const rest = route.query
83-
let filters={}
84-
for (const [key, value] of Object.entries(rest)){
85-
if (key === 'limit' || key === 'skip' || key === 'sort' || key === 'read'){
84+
85+
function returnFilter() {
86+
const rest = route.query
87+
let filters = {}
88+
for (const [key, value] of Object.entries(rest)) {
89+
if (key === 'limit' || key === 'skip' || key === 'sort' || key === 'read') {
8690
delete rest[key]
8791
}
8892
}
8993
9094
return rest
9195
}
96+
9297
function openInitModale() {
93-
// console.log('filters', route.query)
94-
// console.log('props.selected', props.selected)
95-
// const identityState: IdentityState = parseInt(`${query['filters[@state][]']}`, 10)
9698
const identityState: IdentityState = props.selected[0].state
9799
if (typeof identityState !== 'number') {
98100
console.error('Invalid state', identityState)
@@ -102,7 +104,6 @@ function openInitModale() {
102104
103105
const name = getStateName(identityState)
104106
105-
106107
$q.dialog({
107108
component: updateInitModale,
108109
componentProps: {
@@ -112,15 +113,39 @@ function openInitModale() {
112113
},
113114
})
114115
.onOk(async (data) => {
115-
if (data.initAllIdentities === true){
116+
if (data.initAllIdentities === true) {
116117
await sendInitToAllIdentities()
117-
}else{
118+
} else {
118119
await sendInitToIdentity(props.selected)
119120
}
120121
})
121-
.onCancel(() => {
122+
.onCancel(() => {})
123+
}
124+
125+
function openTrashModale() {
126+
const identityState: IdentityState = props.selected[0].state
127+
if (typeof identityState !== 'number') {
128+
console.error('Invalid state', identityState)
129+
return
130+
}
131+
console.log('openTrashModale', identityState)
132+
133+
const name = getStateName(identityState)
134+
135+
console.log('openTrashModale', props.selected)
136+
137+
$q.dialog({
138+
component: deleteManyModale,
139+
componentProps: {
140+
selectedIdentities: props.selected,
141+
},
142+
})
143+
.onOk(async (data) => {
144+
await trashManySelected(props.selected)
122145
})
146+
.onCancel(() => {})
123147
}
148+
124149
function getTargetState(state: IdentityState) {
125150
switch (state) {
126151
case IdentityState.TO_VALIDATE:
@@ -137,10 +162,10 @@ function getTargetState(state: IdentityState) {
137162
138163
async function updateAllIdentities(state: IdentityState) {
139164
debugger
140-
const f=returnFilter()
165+
const f = returnFilter()
141166
const { data: identities } = await useHttp(`/management/identities?limit=999999&&filters[@state][]=${state}`, {
142167
method: 'get',
143-
query:f
168+
query: f,
144169
})
145170
146171
if (!identities) {
@@ -190,7 +215,7 @@ async function sendInitToIdentity(identities) {
190215
const { data, error } = await useHttp(`/management/passwd/initmany`, {
191216
method: 'post',
192217
body: {
193-
ids
218+
ids,
194219
},
195220
})
196221
@@ -211,10 +236,37 @@ async function sendInitToIdentity(identities) {
211236
emit('clear')
212237
}
213238
239+
async function trashManySelected(identities) {
240+
console.log('trashManySelected', identities)
241+
const ids = identities.map((identity) => identity._id)
242+
console.log('trashManySelected', ids)
243+
244+
try {
245+
const { data } = await $http.$post(`/core/backends/delete`, {
246+
body: {
247+
payload: ids,
248+
},
249+
})
250+
251+
$q.notify({
252+
message: `Les identités ont été supprimées avec succès`,
253+
color: 'positive',
254+
})
255+
await fetchAllStateCount()
256+
emit('refresh')
257+
emit('clear')
258+
} catch (error) {
259+
$q.notify({
260+
message: error.data.message,
261+
color: 'negative',
262+
})
263+
}
264+
}
265+
214266
async function sendInitToAllIdentities() {
215267
const { data: identities } = await useHttp('/management/identities?limit=99999', {
216268
method: 'get',
217-
query:returnFilter()
269+
query: returnFilter(),
218270
})
219271
if (!identities) {
220272
$q.notify({
@@ -226,8 +278,6 @@ async function sendInitToAllIdentities() {
226278
sendInitToIdentity(identities.value.data)
227279
}
228280
229-
230-
231281
function clearSelection() {
232282
emit('clear')
233283
}

0 commit comments

Comments
 (0)