Commit b09c118a authored by Anthony Gautreau's avatar Anthony Gautreau
Browse files

On peut choisir un role sans périmètre, sans faire planter utilisateur

parent 16e38c76
Loading
Loading
Loading
Loading
+1990 −1915

File changed.

Preview size limit exceeded, changes collapsed.

+1 −1

File changed.

Preview size limit exceeded, changes collapsed.

+25 −2
Changes for frontend/src/components/UserPermissionsCard/UserPermissionEditor.vue: 25 added lines, 2 removed lines.
Original line number Diff line number Diff line
@@ -15,7 +15,16 @@
        />
      </div>

      <div class="col-4">
      <div class="col-3">
        <q-toggle
            v-model="withPerimetre"
            label="Restreindre à un périmètre"
            dense
        />
      </div>

      <template v-if="withPerimetre">
        <div class="col-3">
          <q-select
              v-model="pur.perimetre"
              :options="perimetresUserRoleStore.getPerimetres()"
@@ -29,7 +38,7 @@
          />
        </div>

      <div class="col-4">
        <div class="col-2">
          <q-select
              :key="props.pur.perimetre"
              v-model="pur.resourceId"
@@ -47,6 +56,10 @@
              outlined
          />
        </div>
      </template>
      <div v-else class="col-5 text-caption text-grey">
        Rôle appliqué sans restriction de périmètre
      </div>

      <div class="col-1 text-right">
        <q-btn dense flat icon="save" color="positive" @click="$emit('save')" />
@@ -70,6 +83,16 @@ const props = defineProps({

defineEmits(['save', 'cancel'])

// Le périmètre est optionnel : coché seulement si la ligne en a déjà un
const withPerimetre = ref(!!props.pur.perimetre)

watch(withPerimetre, (enabled) => {
  if (!enabled) {
    props.pur.perimetre = null
    props.pur.resourceId = null
  }
})

const perimetreDataOptions = ref(perimetresUserRoleStore.getPerimetreDataOptions(props.pur.resourceClass))
const perimetreDataOptionsFiltered = ref(perimetreDataOptions)

+40 −15
Changes for frontend/src/components/UserPermissionsCard/UserPermissionsDrawer.vue: 40 added lines, 15 removed lines.
Original line number Diff line number Diff line
@@ -106,7 +106,10 @@ const perimetresUserRoleStore = usePerimetresUserRole()
const roleStore = useRoleStore()
const utilisateurStore = useUtilisateurStore()

const purList = ref({})
const purList = computed(() => {
  if (!props.user || !props.user['@id']) return []
  return perimetresUserRoleStore.getPerUserRoleStructuredByUser(props.user['@id'])
})
const userDraft = ref({
  '@id': null,
  id: null,
@@ -152,7 +155,6 @@ watch(
        password: null,
        isActive: user.isActive
      }
      purList.value = perimetresUserRoleStore.getPerUserRoleStructuredByUser(user['@id'])
    },
    { immediate: true }
)
@@ -219,6 +221,8 @@ async function saveDraft() {
      return
    }

    // Le périmètre est optionnel : on ne crée le PerimetreUserRole que si un périmètre a été choisi
    if (draft.value.perimetre) {
      await perimetresUserRoleStore.createPerimetreUserRole(
          {
            perimetre: draft.value.perimetre,
@@ -226,20 +230,10 @@ async function saveDraft() {
            userRole: userRole['@id']
          }
      )

    // await perimetresUserRoleStore.createPerimetreUserRole(
    //     {
    //       user: props.user['@id'],
    //       role: draft.value.role,
    //       perimetre: draft.value.perimetre,
    //       resourceId: draft.value.resourceId
    //     }
    // )
    }
  } else{
    const purBase = purList.value.find((pur) => pur['@id'] === draft.value['@id'])
    console.log(draft.value, purBase)
    if(purBase.role !== draft.value.role) {
      console.log('but different',purBase.role , draft.value.role)
      await perimetresUserRoleStore.patchUserRole(
          {
            user: props.user['@id'],
@@ -249,6 +243,9 @@ async function saveDraft() {
      )
    }

    if (draft.value.id) {
      // Un PerimetreUserRole existe déjà pour cette ligne
      if (draft.value.perimetre) {
        await perimetresUserRoleStore.patchPerimetreUserRole(
            {
              userRole: draft.value.userRole,
@@ -257,13 +254,41 @@ async function saveDraft() {
            },
            draft.value.id
        )
      } else {
        // Le périmètre a été retiré : on supprime le PerimetreUserRole (le rôle reste)
        await perimetresUserRoleStore.deletePerimetreUserRole(draft.value.id)
      }
    } else if (draft.value.perimetre) {
      // Rôle sans périmètre auquel on vient d'en associer un
      await perimetresUserRoleStore.createPerimetreUserRole(
          {
            userRole: draft.value.userRole,
            perimetre: draft.value.perimetre,
            resourceId: draft.value.resourceId
          }
      )
    }
  }
  // Resynchroniser la ligne du tableau (user.roles est recalculé côté back)
  if (props.user && props.user.id) {
    await utilisateurStore.refreshUtilisateur(props.user.id)
  }
  purList.value = perimetresUserRoleStore.getPerUserRoleStructuredByUser(props.user['@id'])
  resetDraft()
}

async function deletePur(pur) {
  if (pur.id) {
    await perimetresUserRoleStore.deletePerimetreUserRole(pur.id)
  purList.value = perimetresUserRoleStore.getPerUserRoleStructuredByUser(props.user['@id'])
  } else {
    // Rôle sans périmètre : il n'y a pas de PerimetreUserRole, on supprime le UserRole
    const userRole = perimetresUserRoleStore.userRoles.find((ur) => ur['@id'] === pur.userRole)
    if (userRole) {
      await perimetresUserRoleStore.deleteUserRole(userRole.id)
    }
  }
  // Resynchroniser la ligne du tableau (user.roles est recalculé côté back)
  if (props.user && props.user.id) {
    await utilisateurStore.refreshUtilisateur(props.user.id)
  }
}
</script>
 No newline at end of file
+15 −4
Changes for frontend/src/stores/perimetresUserRole.js: 15 added lines, 4 removed lines.
Original line number Diff line number Diff line
@@ -54,18 +54,29 @@ export const usePerimetresUserRole = defineStore('perimetresUserRole', ()=> {
            return ur.user === userIri
        })
        let res = []
        perimetresUserRole.value.forEach(pur => {
        uRList.forEach((ur) => {
                if(ur['@id'] === pur.userRole) {
            const purs = perimetresUserRole.value.filter(pur => pur.userRole === ur['@id'])
            if (purs.length === 0) {
                // Rôle affecté sans périmètre : on l'affiche quand même
                res.push({
                    '@id': ur['@id'],
                    id: null,
                    userRole: ur['@id'],
                    role: ur.role,
                    perimetre: null,
                    resourceClass: null,
                    resourceId: null,
                })
            } else {
                purs.forEach(pur => {
                    res.push({
                        ...pur,
                        role: ur.role,
                        resourceClass: perimetres.value.find((p) => p['@id'] === pur.perimetre)?.resourceClass
                    })
                }
                })
            }
        })
        console.log('res', res)
        return res
    }

Loading