Skip to content

Commit 8e4294b

Browse files
committed
bug #169 rafraichissement de Etat dans le twopan
1 parent 76dc0f6 commit 8e4294b

4 files changed

Lines changed: 49 additions & 5 deletions

File tree

‎apps/web/src/layouts/default.vue‎

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -242,6 +242,9 @@ export default defineNuxtComponent({
242242
this.eventSeamless = false
243243
}, 2000)
244244
await this.identityStateStore.fetchAllStateCount()
245+
// Les états n'ont leur valeur définitive qu'une fois les jobs terminés : on
246+
// prévient les vues ouvertes (liste du twopane, fiche) pour qu'elles se rechargent.
247+
this.identityStateStore.notifyIdentitiesChanged()
245248
}
246249
break
247250
}

‎apps/web/src/pages/identities/table.vue‎

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -136,7 +136,8 @@ export default defineNuxtComponent({
136136
137137
const { toPathWithQueries, navigateToTab } = useRouteQueries()
138138
const { columns, visibleColumns, columnsType } = useColumnsIdentites()
139-
const { getStateValue, fetchAllStateCount } = useIdentityStateStore()
139+
const identityStateStore = useIdentityStateStore()
140+
const { getStateValue, fetchAllStateCount } = identityStateStore
140141
const { getStateName } = useIdentityStates()
141142
const { countFilters, hasFilters, getFilters, removeFilter } = useFiltersQuery(columns)
142143
const { useHttpPaginationOptions, useHttpPaginationReactive } = usePagination()
@@ -204,6 +205,7 @@ export default defineNuxtComponent({
204205
debug,
205206
page,
206207
hasPermission,
208+
identityStateStore,
207209
identities,
208210
identityTableRowKey,
209211
pending,
@@ -282,10 +284,21 @@ export default defineNuxtComponent({
282284
}
283285
},
284286
computed: {
287+
identitiesRevision(): number {
288+
return this.identityStateStore.revision
289+
},
285290
targetId(): LocationQueryValue[] | string {
286291
return `${this.$route.params._id || ''}`
287292
},
288293
},
294+
watch: {
295+
// L'état d'une identité évolue de façon asynchrone après la sauvegarde (jobs de
296+
// synchronisation) : sans cela, la colonne « États » resterait figée sur la valeur lue
297+
// juste après le PATCH.
298+
identitiesRevision() {
299+
this.refresh()
300+
},
301+
},
289302
methods: {
290303
getTableSelection(): Record<string, unknown>[] {
291304
const pan = this.$refs.twoPan as { getSelectedRows?: () => unknown[] } | undefined

‎apps/web/src/pages/identities/table/[_id].vue‎

Lines changed: 22 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,10 @@ export default defineNuxtComponent({
6161
// savable: this.savable,
6262
save: this.save,
6363
sync: this.sync,
64-
refresh: this.refresh,
64+
// `refreshAll` et non `refresh` : toute mutation faite depuis le volet de droite
65+
// (etat, cycle de vie, mot de passe, invitation...) change aussi des colonnes de la
66+
// liste du twopane, qui doit donc etre rechargee en meme temps que la fiche.
67+
refresh: this.refreshAll,
6568
}
6669
},
6770
async setup() {
@@ -72,6 +75,7 @@ export default defineNuxtComponent({
7275
7376
if (NewTargetId === $route.params._id) {
7477
return {
78+
identityStateStore,
7579
// `ref` obligatoire : un objet litteral renvoye par `setup` n'est pas reactif,
7680
// les erreurs de validation posees sur `additionalFields.validations` ne seraient pas affichees.
7781
identity: ref({
@@ -116,6 +120,7 @@ export default defineNuxtComponent({
116120
}
117121
118122
return {
123+
identityStateStore,
119124
identity,
120125
originTarget,
121126
refresh,
@@ -124,6 +129,9 @@ export default defineNuxtComponent({
124129
}
125130
},
126131
computed: {
132+
identitiesRevision(): number {
133+
return this.identityStateStore.revision
134+
},
127135
isNew(): boolean {
128136
return this.$route.params._id === NewTargetId
129137
},
@@ -139,6 +147,13 @@ export default defineNuxtComponent({
139147
},
140148
},
141149
},
150+
watch: {
151+
// Même raison que dans la liste : l'état définitif n'est connu qu'à la fin des jobs
152+
// de synchronisation déclenchés par la sauvegarde.
153+
identitiesRevision() {
154+
if (!this.isNew) this.refresh()
155+
},
156+
},
142157
methods: {
143158
async save() {
144159
const sanitizedIdentity = { ...this.identity }
@@ -168,8 +183,7 @@ export default defineNuxtComponent({
168183
icon: 'mdi-check-circle-outline',
169184
})
170185
171-
this.refresh()
172-
this.$emit('refresh')
186+
await this.refreshAll()
173187
} catch (error: any) {
174188
this.$q.notify({
175189
message: formatApiErrorMessage(error, "Erreur lors de la sauvegarde de l'identité"),
@@ -209,7 +223,11 @@ export default defineNuxtComponent({
209223
})
210224
}
211225
212-
this.refresh()
226+
await this.refreshAll()
227+
},
228+
/** Recharge la fiche courante puis la liste du twopane (volet de gauche). */
229+
async refreshAll() {
230+
await this.refresh()
213231
this.$emit('refresh')
214232
},
215233
},

‎apps/web/src/stores/identityState.ts‎

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,21 @@ export const useIdentityStateStore = defineStore('identityStates', {
77
initialized: false,
88
filters: {},
99
counters: {},
10+
// Incrémenté quand les jobs de synchronisation d'identités se terminent. Les vues qui
11+
// affichent un état (liste du twopane, fiche identité) s'y abonnent pour se recharger :
12+
// l'état évolue de façon asynchrone après la sauvegarde (à synchroniser -> en cours ->
13+
// synchronisée) et un simple rechargement juste après le PATCH ne voit que l'état transitoire.
14+
revision: 0,
1015
}),
1116
getters: {
1217
getStateValue: (state) => (key: IdentityState | string) => state.counters[key],
1318
},
1419
actions: {
20+
/** Signale aux vues abonnées que les identités ont changé côté backend. */
21+
notifyIdentitiesChanged() {
22+
this.revision++
23+
},
24+
1525
async initialize(filters = {}) {
1626
if (this.initialized) return
1727

0 commit comments

Comments
 (0)