From 31f18507045e186fa65c8ae98c32fb4ee17b1a0a Mon Sep 17 00:00:00 2001 From: Javier Segarra Date: Wed, 16 Apr 2025 14:12:23 +0200 Subject: [PATCH 01/67] feat: add multiple attribute --- src/components/common/VnInputDate.vue | 54 ++++++++++++++++++++++----- 1 file changed, 44 insertions(+), 10 deletions(-) diff --git a/src/components/common/VnInputDate.vue b/src/components/common/VnInputDate.vue index 343130f1d..f361fb536 100644 --- a/src/components/common/VnInputDate.vue +++ b/src/components/common/VnInputDate.vue @@ -6,7 +6,6 @@ import { useRequired } from 'src/composables/useRequired'; const $attrs = useAttrs(); const { isRequired, requiredFieldRule } = useRequired($attrs); -const model = defineModel({ type: [String, Date] }); const $props = defineProps({ isOutlined: { @@ -17,6 +16,15 @@ const $props = defineProps({ type: Boolean, default: true, }, + multiple: { + type: Boolean, + default: false, + }, +}); + +const model = defineModel({ + type: [String, Date, Array], + default: null, }); const vnInputDateRef = ref(null); @@ -31,10 +39,17 @@ const mixinRules = [requiredFieldRule, ...($attrs.rules ?? [])]; const formattedDate = computed({ get() { if (!model.value) return model.value; + if ($props.multiple) { + return model.value + .map((d) => date.formatDate(new Date(d), dateFormat)) + .join(', '); + } return date.formatDate(new Date(model.value), dateFormat); }, set(value) { if (value == model.value) return; + if ($props.multiple) return; // No permitir edición manual en modo múltiple + let newDate; if (value) { // parse input @@ -47,7 +62,7 @@ const formattedDate = computed({ } const [year, month, day] = value.split('-').map((e) => parseInt(e)); newDate = new Date(year, month - 1, day); - if (model.value) { + if (model.value && !$props.multiple) { const orgDate = model.value instanceof Date ? model.value : new Date(model.value); @@ -63,12 +78,19 @@ const formattedDate = computed({ }, }); -const popupDate = computed(() => - model.value ? date.formatDate(new Date(model.value), 'YYYY/MM/DD') : model.value, -); +const popupDate = computed(() => { + if (!model.value) return model.value; + if ($props.multiple) { + return model.value.map((d) => date.formatDate(new Date(d), 'YYYY/MM/DD')); + } + return date.formatDate(new Date(model.value), 'YYYY/MM/DD'); +}); onMounted(() => { // fix quasar bug mask.value = '##/##/####'; + if ($props.multiple && !model.value) { + model.value = []; + } }); watch( () => model.value, @@ -86,8 +108,12 @@ const styleAttrs = computed(() => { : {}; }); -const manageDate = (date) => { - formattedDate.value = date; +const manageDate = (dates) => { + if ($props.multiple) { + model.value = dates.map((d) => new Date(d).toISOString()); + } else { + formattedDate.value = dates; + } isPopupOpen.value = false; }; @@ -98,7 +124,7 @@ const manageDate = (date) => { ref="vnInputDateRef" v-model="formattedDate" class="vn-input-date" - :mask="mask" + :mask="$props.multiple ? undefined : mask" placeholder="dd/mm/aaaa" v-bind="{ ...$attrs, ...styleAttrs }" :class="{ required: isRequired }" @@ -136,10 +162,18 @@ const manageDate = (date) => { :no-focus="true" :no-parent-event="true" > - + - + From 6c0fcc38b0cd8d329301f6eab8d486adb7876f48 Mon Sep 17 00:00:00 2001 From: Javier Segarra Date: Wed, 16 Apr 2025 14:13:08 +0200 Subject: [PATCH 02/67] feat: apply multiple --- .../Ticket/Negative/TicketLackFilter.vue | 22 +++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) diff --git a/src/pages/Ticket/Negative/TicketLackFilter.vue b/src/pages/Ticket/Negative/TicketLackFilter.vue index 78c030476..055b86ffd 100644 --- a/src/pages/Ticket/Negative/TicketLackFilter.vue +++ b/src/pages/Ticket/Negative/TicketLackFilter.vue @@ -7,6 +7,9 @@ import VnFilterPanel from 'src/components/ui/VnFilterPanel.vue'; import VnInput from 'src/components/common/VnInput.vue'; import VnSelect from 'src/components/common/VnSelect.vue'; import VnInputDateTime from 'src/components/common/VnInputDateTime.vue'; +import VnDate from 'src/components/common/VnDate.vue'; +import VnInputDate from 'src/components/common/VnInputDate.vue'; + const { t } = useI18n(); const props = defineProps({ dataKey: { @@ -67,7 +70,6 @@ const setUserParams = (params) => { :data-key="props.dataKey" :search-button="true" @set-user-params="setUserParams" - :unremovable-params="['warehouseFk']" > + diff --git a/src/components/ui/VnSearchbar.vue b/src/components/ui/VnSearchbar.vue index 7b82aece8..59bcdf524 100644 --- a/src/components/ui/VnSearchbar.vue +++ b/src/components/ui/VnSearchbar.vue @@ -46,7 +46,7 @@ const props = defineProps({ default: null, }, order: { - type: String, + type: [String, Array], default: '', }, limit: { diff --git a/src/composables/getColAlign.js b/src/composables/getColAlign.js index c1841e134..a930fd7d8 100644 --- a/src/composables/getColAlign.js +++ b/src/composables/getColAlign.js @@ -9,8 +9,6 @@ export function getColAlign(col) { case 'number': align = 'right'; break; - case 'time': - case 'date': case 'checkbox': align = 'center'; break; diff --git a/src/pages/Entry/Card/EntryCard.vue b/src/pages/Entry/Card/EntryCard.vue index e9d07889f..50f8b8e55 100644 --- a/src/pages/Entry/Card/EntryCard.vue +++ b/src/pages/Entry/Card/EntryCard.vue @@ -8,6 +8,6 @@ import filter from './EntryFilter.js'; data-key="Entry" url="Entries" :descriptor="EntryDescriptor" - :filter="{ ...filter, where: { id: $route.params.id } }" + :filter="filter" /> diff --git a/src/pages/Item/ItemList.vue b/src/pages/Item/ItemList.vue index 8057eb7ad..d1c56852f 100644 --- a/src/pages/Item/ItemList.vue +++ b/src/pages/Item/ItemList.vue @@ -28,6 +28,7 @@ const dataKey = 'ItemList'; const validPriorities = ref([]); const defaultTag = ref(); const defaultPriority = ref(); +const defaultItem = ref(); const itemFilter = { include: [ @@ -59,15 +60,14 @@ const itemFilter = { }; const columns = computed(() => [ { - label: '', name: 'image', align: 'left', columnFilter: false, }, { + align: 'right', label: t('item.list.id'), name: 'id', - align: 'left', isId: true, chip: { condition: () => true, @@ -75,36 +75,36 @@ const columns = computed(() => [ cardVisible: true, }, { + align: 'right', label: t('entry.summary.grouping'), name: 'grouping', - align: 'left', columnFilter: { component: 'number', inWhere: true, }, }, { + align: 'right', label: t('entry.summary.packing'), name: 'packing', - align: 'left', columnFilter: { component: 'number', inWhere: true, }, }, { + align: 'left', label: t('globals.description'), name: 'description', - align: 'left', columnFilter: { name: 'search', }, columnClass: 'expand', }, { + align: 'right', label: t('item.list.stems'), name: 'stems', - align: 'left', columnFilter: { component: 'number', inWhere: true, @@ -112,19 +112,20 @@ const columns = computed(() => [ cardVisible: true, }, { + align: 'right', label: t('globals.size'), name: 'size', - align: 'left', columnFilter: { component: 'number', inWhere: true, }, cardVisible: true, + columnClass: 'expand', }, { + align: 'left', label: t('item.list.typeName'), name: 'typeFk', - align: 'left', component: 'select', attrs: { url: 'ItemTypes', @@ -173,26 +174,17 @@ const columns = computed(() => [ }, { label: t('globals.intrastat'), - name: 'intrastat', + name: 'intrastatFk', align: 'left', component: 'select', attrs: { url: 'Intrastats', - optionValue: 'description', + fields: ['id', 'description'], optionLabel: 'description', - }, - columnFilter: { - name: 'intrastat', - attrs: { - url: 'Intrastats', - optionValue: 'description', - optionLabel: 'description', - }, - }, - columnField: { - component: null, + optionValue: 'id', }, cardVisible: true, + format: (row, dashIfEmpty) => dashIfEmpty(row.intrastat), }, { label: t('item.list.origin'), @@ -238,21 +230,15 @@ const columns = computed(() => [ }, }, { - label: t('item.list.weight'), + label: t('item.list.weightByPiece'), toolTip: t('item.list.weightByPiece'), name: 'weightByPiece', component: 'input', - columnField: { - component: null, - }, - columnFilter: { - inWhere: true, - }, }, { + align: 'right', label: t('item.list.stemMultiplier'), name: 'stemMultiplier', - align: 'left', component: 'input', columnField: { component: null, @@ -317,15 +303,12 @@ const columns = computed(() => [ ]); onBeforeMount(async () => { - const { data } = await axios.get('ItemConfigs'); - defaultTag.value = data[0].defaultTag; - defaultPriority.value = data[0].defaultPriority; - data.forEach((priority) => { - validPriorities.value = priority.validPriorities; - }); + const { data } = await axios.get('ItemConfigs/findOne'); + defaultItem.value = data; + console.log('defaultItem.value: ', defaultItem.value); }); +const dafaultComputed = computed(() => defaultItem.value); -