From 3476b4807f1743d06d973b5f58b4cdcf9aa71109 Mon Sep 17 00:00:00 2001 From: Javier Segarra Date: Wed, 25 Sep 2024 15:25:43 +0200 Subject: [PATCH] feat: refs #7793 sortByWeight --- src/components/common/VnSelect.vue | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/src/components/common/VnSelect.vue b/src/components/common/VnSelect.vue index aa629767d..800ecbdad 100644 --- a/src/components/common/VnSelect.vue +++ b/src/components/common/VnSelect.vue @@ -86,6 +86,10 @@ const $props = defineProps({ type: Boolean, default: false, }, + sortByWeight: { + type: Boolean, + default: false, + }, }); const { validations } = useValidator(); const requiredFieldRule = (val) => validations().required($attrs.required, val); @@ -186,11 +190,24 @@ async function fetchFilter(val) { $props.exprBuilder && Object.assign(where, $props.exprBuilder(key, val)); const fetchOptions = { where, include, limit }; if (fields) fetchOptions.fields = fields; - if (sortBy) fetchOptions.order = sortBy; + if (sortBy) { + let sort = sortBy; + if (typeof sort === 'string') sort = [getOrderCaseString(key, val), sortBy]; + else sort = [getOrderCaseString(key, val), ...sortBy]; + fetchOptions.order = sort; + } return dataRef.value.fetch(fetchOptions); } +function getOrderCaseString(prop, value) { + return `CASE + WHEN ${prop} LIKE '${value}%' THEN 1 + WHEN ${prop} LIKE '%${value}%' THEN 2 + ELSE 3 + END, ${prop} DESC`; +} + async function filterHandler(val, update) { if (!val && lastVal.value === val) { lastVal.value = val;