Skip to content

Commit c0afaaf

Browse files
committed
corrections
1 parent a9821e1 commit c0afaaf

File tree

6 files changed

+248
-8
lines changed

6 files changed

+248
-8
lines changed

src/components/2pan/index.vue

Lines changed: 22 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ q-splitter(
1212
q-card.full-height.q-pa-sm(bordered :class='{"hidden": isSimple && targetId}')
1313
q-table.sesame-sticky-last-column-table.full-height(
1414
v-bind="$attrs"
15-
selection="multiple"
15+
:selection="selectedIsHidden()"
1616
v-model:selected="selected"
1717
v-model:pagination="pagination"
1818
:hide-pagination="hidePagination"
@@ -33,12 +33,12 @@ q-splitter(
3333
)
3434
template(v-for="(_, name) in $slots" v-slot:[name]="slotData")
3535
slot(:name="name" v-bind="slotData")
36-
template(v-slot:top-left)
36+
template(v-slot:top-left v-if="hideLeftButtons === false")
3737
q-btn-group( rounded flat)
3838
slot(name="top-left-btn-grp" :selectedValues="selected")
3939
slot(name="top-left-btn-grp-content-before")
4040
slot(name="top-left-btn-grp-content-after")
41-
template(v-slot:top-right)
41+
template(v-slot:top-right v-if="hideRightButtons === false")
4242
q-btn-group(rounded flat)
4343
slot(name="top-right-btn-grp")
4444
slot(name="top-right-btn-grp-content-before")
@@ -128,6 +128,18 @@ const props = defineProps({
128128
type: Boolean,
129129
default: false,
130130
},
131+
hideSelection: {
132+
type: Boolean,
133+
default: false,
134+
},
135+
hideLeftButtons:{
136+
type: Boolean,
137+
default: false,
138+
},
139+
hideRightButtons:{
140+
type: Boolean,
141+
default: false,
142+
},
131143
hidePagination: {
132144
type: Boolean,
133145
default: false,
@@ -284,6 +296,13 @@ function highlightRow(rowKey) {
284296
return 'sesame-table-td-highlight'
285297
}
286298
}
299+
function selectedIsHidden() {
300+
if (props.hideSelection === false){
301+
return "multiple"
302+
}else {
303+
return "none"
304+
}
305+
}
287306
288307
async function refresh() {
289308
await props.refresh()

src/components/identityForm/actions.vue

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ div.flex
2222
q-tooltip.text-body2(slot="trigger" v-else) L'état de l'identité ne permet pas de la synchroniser
2323
q-btn.q-mx-xs(v-if="props.identity?._id" @click="logs" color="grey-8" icon="mdi-file-document" :href="'/jobs?filters[:concernedTo.id]=' + props.identity?._id")
2424
q-tooltip.text-body2(slot="trigger") Voir les logs de l'identité
25-
q-btn.q-mx-xs(v-if="props.identity?._id" @click="deleteIdentity" :disabled="!props.identity.lastSync" color="negative" icon="mdi-delete")
25+
q-btn.q-mx-xs(v-if="props.identity?._id" @click="deleteIdentity" color="negative" icon="mdi-delete")
2626
q-tooltip.text-body2(slot="trigger") Supprimer l'identité
2727
</template>
2828

src/components/identityForm/index.vue

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -175,14 +175,26 @@ function getTabValidations(tab: string) {
175175
}
176176
177177
async function deleteIdentity() {
178-
await useHttp('/core/backends/delete', {
178+
const { data: result, pending, error, refresh } = await useHttp('/core/backends/delete', {
179179
method: 'POST',
180180
body: {
181181
payload: [
182182
props.identity._id,
183183
],
184184
},
185185
})
186+
if (error.value) {
187+
// Handle error during sync
188+
} else {
189+
$q.notify({
190+
message: "Identité supprimée",
191+
color: 'positive',
192+
position: 'top-right',
193+
icon: 'mdi-check-circle-outline',
194+
})
195+
emits('refreshTarget', result.value.data)
196+
// props.identity. = result.value.data
197+
}
186198
}
187199
188200
async function sync() {
@@ -197,7 +209,7 @@ async function sync() {
197209
// Handle error during sync
198210
} else {
199211
$q.notify({
200-
message: 'Synchronisation effectuée',
212+
message: "Mise en état, à synchroniser",
201213
color: 'positive',
202214
position: 'top-right',
203215
icon: 'mdi-check-circle-outline',

src/composables/useMenu.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,7 @@ function useMenu(identityStateStore, identityAffectationStore) {
8585
{
8686
icon: 'mdi-sync',
8787
label: 'A synchroniser',
88-
path: `/identities?sort[metadata.lastUpdatedAt]=desc&skip=0&filters[@state][]=${IdentityState.TO_SYNC}`,
88+
path: `/identities/readonly?sort[metadata.lastUpdatedAt]=desc&skip=0&filters[@state][]=${IdentityState.TO_SYNC}`,
8989
color: 'primary',
9090
part: 'Etats',
9191
badgeValue: 'TO_SYNC',
@@ -94,7 +94,7 @@ function useMenu(identityStateStore, identityAffectationStore) {
9494
{
9595
icon: 'mdi-loading',
9696
label: 'En cours de synchro.',
97-
path: `/identities?sort[metadata.lastUpdatedAt]=desc&skip=0&filters[@state][]=${IdentityState.PROCESSING}`,
97+
path: `/identities/readonly?sort[metadata.lastUpdatedAt]=desc&skip=0&filters[@state][]=${IdentityState.PROCESSING}`,
9898
color: 'primary',
9999
part: 'Etats',
100100
badgeValue: 'PROCESSING',

src/pages/identities/index.vue

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ q-page.container
1111
:visibleColumns="visibleColumns"
1212
:fieldsList="fieldsList"
1313
:selected="selected"
14+
:hide-selection="false"
1415
:pagination="pagination"
1516
:pending="pending"
1617
:refresh="refreshEvent"

src/pages/identities/readonly.vue

Lines changed: 208 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,208 @@
1+
<template lang="pug">
2+
q-page.container
3+
.q-px-md
4+
sesame-searchfilters(:fields="fieldsList")
5+
6+
sesame-2pan(
7+
ref="twopan"
8+
:data="identities?.data"
9+
:total="identities?.total"
10+
:columns="columns"
11+
:visibleColumns="visibleColumns"
12+
:fieldsList="fieldsList"
13+
:selected="selected"
14+
:hide-selection="true"
15+
:pagination="pagination"
16+
:pending="pending"
17+
:refresh="refreshEvent"
18+
:error="error"
19+
:titleKey=["inetOrgPerson.cn"]
20+
:crud="crud"
21+
:actions="actions"
22+
hide-left-buttons="true"
23+
:defaultRightPanelButton="false"
24+
)
25+
template(#right-panel-title-before="props")
26+
q-icon(name="mdi-circle" :color="getStateColor(props?.target?.state)" class="q-mr-xs")
27+
q-tooltip.text-body2(slot="trigger") {{ getStateName(props.target.state) }}
28+
q-icon(:name="getInitStateIcon(props?.target?.initState)" :color="getInitStateColor(props?.target?.initState)" class="q-mr-xs")
29+
q-tooltip.text-body2(slot="trigger") {{ getInitStateName(props.target.initState) }}
30+
template(#top-left-btn-grp="{selectedValues}")
31+
sesame-table-top-left( :selected="selectedValues" @refresh="refresh" @clear="clearSelected" :total="identities?.total")
32+
template(#body-cell-states="props")
33+
sesame-table-state-col(:identity="props.row")
34+
35+
template(#right-panel-content="{payload, isNew}")
36+
sesame-identity-form(
37+
:identity="{...payload.target}"
38+
ref="form"
39+
:isNew="isNew"
40+
@refresh="refresh"
41+
@submit="submit($event)"
42+
@sync="sync" @logs="logs"
43+
@refreshTarget="refreshTarget"
44+
)
45+
</template>
46+
47+
<script lang="ts" setup>
48+
import usePagination from '~/composables/usePagination'
49+
import { ref, provide, watch, computed } from 'vue'
50+
import { useFetch, useRoute, useRouter } from 'nuxt/app'
51+
import { useQuasar } from 'quasar'
52+
import type { QTableProps } from 'quasar'
53+
import type { components, operations } from '#build/types/service-api'
54+
import { useErrorHandling } from '#imports'
55+
import { useIdentityStates, useIdentityInitStates } from '~/composables'
56+
import { identity } from '@vueuse/core'
57+
import { useIdentityStateStore } from "~/stores/identityState"
58+
type Identity = components['schemas']['IdentitiesDto']
59+
type Response = operations['IdentitiesController_search']['responses']['200']['content']['application/json']
60+
61+
const identityStateStore = useIdentityStateStore()
62+
63+
defineOptions({
64+
name: 'Identities',
65+
})
66+
67+
const twopan = ref<any>(null)
68+
const route = useRoute()
69+
const router = useRouter()
70+
const $q = useQuasar()
71+
const { handleError } = useErrorHandling()
72+
const form = ref<any>(null)
73+
const { getStateColor, getStateName } = useIdentityStates()
74+
const { getInitStateColor, getInitStateName, getInitStateIcon } = useIdentityInitStates()
75+
76+
onMounted(() => {
77+
initializePagination(identities.value?.total)
78+
})
79+
80+
async function refreshTarget(target: Identity) {
81+
twopan.value.read(target)
82+
await identityStateStore.fetchToSyncCount()
83+
refreshEvent()
84+
}
85+
86+
const { pagination, onRequest, initializePagination } = usePagination()
87+
88+
const queryWithoutRead = computed(() => {
89+
const { read, ...rest } = route.query
90+
return {
91+
limit: pagination.value?.rowsPerPage,
92+
...rest,
93+
}
94+
})
95+
96+
const {
97+
data: identities,
98+
pending,
99+
refresh,
100+
error,
101+
} = await useHttp<Response>('/management/identities', {
102+
method: 'get',
103+
query: queryWithoutRead,
104+
})
105+
106+
if (error.value) {
107+
$q.notify({
108+
message: 'Impossible de récupérer les identités',
109+
type: 'negative',
110+
})
111+
}
112+
113+
const { columns, visibleColumns, columnsType } = useColumnsIdentites()
114+
115+
const selected = ref([])
116+
117+
function clearSelected() {
118+
(twopan as any).value.clearSelected()
119+
}
120+
121+
function refreshEvent() {
122+
refresh()
123+
selected.value = []
124+
}
125+
126+
const crud = {
127+
create: false,
128+
read: true,
129+
update: true,
130+
delete: false,
131+
}
132+
133+
async function submit(identity: Identity) {
134+
console.log('submit from index')
135+
form.value.submit()
136+
}
137+
138+
async function create(identity: Identity) {
139+
console.log('create from index')
140+
form.value.create()
141+
}
142+
143+
async function sync(identity: Identity) {
144+
console.log('sync')
145+
form.value.sync()
146+
}
147+
148+
async function deleteIdentity(identity: Identity) {
149+
console.log('deleteIdentity')
150+
form.value.deleteIdentity()
151+
}
152+
153+
function logs(identity: Identity & { _id: string }) {
154+
router.push(`/logs?filters[:concernedTo.id]=${identity?._id}`)
155+
}
156+
157+
const actions = {
158+
cancel: async (row: Identity) => {
159+
console.log('cancel')
160+
},
161+
read: async (row, onMounted = false) => {
162+
if (!onMounted) pushQuery({ key: 'read', value: row._id })
163+
const data = await $http.get(`/management/identities/${row._id}`, {
164+
method: 'get',
165+
})
166+
return { ...data._data?.data }
167+
},
168+
add: async () => {
169+
return {
170+
state: IdentityState.TO_CREATE,
171+
additionalFields: {
172+
attributes: {},
173+
objectClasses: [],
174+
},
175+
}
176+
},
177+
onMounted: async () => {
178+
if (route.query.read) {
179+
const id = route.query.read as string
180+
// const row = identities.value?.data.find((row) => row._id === id)
181+
// if (row) {
182+
// return row
183+
// }
184+
const { data } = await useHttp<Identity>(`/management/identities/${id}`, {
185+
method: 'get',
186+
})
187+
return { ...data.value?.data }
188+
}
189+
return null
190+
},
191+
}
192+
193+
const fieldsList = computed(() => {
194+
return columns.value!.reduce((acc: { name: string; label: string; type?: string }[], column) => {
195+
if (visibleColumns.value!.includes(column.name) && column.name !== 'actions' && column.name !== 'states') {
196+
const type = columnsType.value.find((type) => type.name === column.name)?.type
197+
acc.push({
198+
name: column.name,
199+
label: column.label,
200+
type,
201+
})
202+
}
203+
return acc
204+
}, [])
205+
})
206+
207+
provide('fieldsList', fieldsList.value)
208+
</script>

0 commit comments

Comments
 (0)