diff --git a/apps/ops/src/components/shared/TagEditor.vue b/apps/ops/src/components/shared/TagEditor.vue index 03e3116..acabb11 100644 --- a/apps/ops/src/components/shared/TagEditor.vue +++ b/apps/ops/src/components/shared/TagEditor.vue @@ -12,6 +12,7 @@ */ import { ref, computed, nextTick, watch, onMounted } from 'vue' import { useQuasar } from 'quasar' +import draggable from 'vuedraggable' // réordonnancement des chips (priorité de compétence) — glisser-déposer, marche au doigt const $q = useQuasar() const isDark = computed(() => $q.dark.isActive) @@ -29,6 +30,7 @@ const props = defineProps({ showRequired:{ type: Boolean, default: false }, // show required pin per tag (jobs) compact: { type: Boolean, default: false }, // smaller chips autofocus: { type: Boolean, default: false }, // focus l'input au montage (ouvre la liste direct) + sortable: { type: Boolean, default: false }, // glisser-déposer pour réordonner les chips (ORDRE = priorité) ; 1er = principal }) const emit = defineEmits(['update:modelValue', 'create', 'update-tag', 'rename-tag', 'delete-tag']) @@ -36,6 +38,9 @@ const emit = defineEmits(['update:modelValue', 'create', 'update-tag', 'rename-t function _labels () { return props.modelValue.map(v => typeof v === 'string' ? v : v.tag) } +function _lbl (v) { return typeof v === 'string' ? v : (v && v.tag) } // libellé d'un item (string ou {tag}) +function _itemKey (v) { return _lbl(v) } +function onReorder (v) { emit('update:modelValue', v) } // glisser-déposer → nouvel ordre = nouvelle priorité (émis tel quel, préserve level/required) function _getLevel (label) { const item = props.modelValue.find(v => typeof v !== 'string' && v.tag === label) return item?.level ?? 0 @@ -187,17 +192,25 @@ onMounted(() => { if (props.autofocus) nextTick(() => { inputEl.value?.focus();