diff --git a/src/components/FormModel.vue b/src/components/FormModel.vue index 43a792845..a49ce583f 100644 --- a/src/components/FormModel.vue +++ b/src/components/FormModel.vue @@ -287,7 +287,7 @@ function updateAndEmit(evt, { val, res, old } = { val: null, res: null, old: nul state.set(modelValue, val); if (!$props.url) arrayData.store.data = val; - emit(evt, state.get(modelValue), res, old); + emit(evt, state.get(modelValue), res, old, formData); } function trimData(data) { diff --git a/src/components/VnTable/VnTable.vue b/src/components/VnTable/VnTable.vue index 8915500fc..3c431fa14 100644 --- a/src/components/VnTable/VnTable.vue +++ b/src/components/VnTable/VnTable.vue @@ -34,7 +34,7 @@ import VnTableFilter from './VnTableFilter.vue'; import { getColAlign } from 'src/composables/getColAlign'; import RightMenu from '../common/RightMenu.vue'; import VnScroll from '../common/VnScroll.vue'; -import VnMultiCheck from '../common/VnMultiCheck.vue'; +import VnCheckboxMenu from '../common/VnCheckboxMenu.vue'; const arrayData = useArrayData(useAttrs()['data-key']); const $props = defineProps({ @@ -644,21 +644,15 @@ const rowCtrlClickFunction = computed(() => { }; return () => {}; }); -const handleMultiCheck = (value) => { - if (value) { +const handleHeaderSelection = (evt, data) => { + if (evt === 'selected' && data) { selected.value = tableRef.value.rows; - } else { - selected.value = []; - } - emit('update:selected', selected.value); -}; - -const handleSelectedAll = (data) => { - if (data) { + } else if (evt === 'selectAll') { selected.value = data; } else { selected.value = []; } + emit('update:selected', selected.value); }; @@ -724,14 +718,14 @@ const handleSelectedAll = (data) => { :data-cy > - + @update:selected="handleHeaderSelection('selected', $event)" + @select:all="handleHeaderSelection('selectAll', $event)" + /> diff --git a/src/components/common/VnCard.vue b/src/components/common/VnCard.vue index 0b9cc2cce..fb3ece207 100644 --- a/src/components/common/VnCard.vue +++ b/src/components/common/VnCard.vue @@ -33,7 +33,7 @@ onBeforeRouteLeave(() => { }); onBeforeMount(async () => { - stateStore.cardDescriptorChangeValue(markRaw(props.descriptor)); + if (props.visual) stateStore.cardDescriptorChangeValue(markRaw(props.descriptor)); const route = router.currentRoute.value; try { diff --git a/src/components/common/VnCheckboxMenu.vue b/src/components/common/VnCheckboxMenu.vue new file mode 100644 index 000000000..bfb5b4441 --- /dev/null +++ b/src/components/common/VnCheckboxMenu.vue @@ -0,0 +1,113 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + +en: + tooManyResults: Too many results. Please narrow down your search. + records: '{rows} records' +es: + Select all: Seleccionar todo + tooManyResults: Demasiados registros. Restringe la búsqueda. + records: '{rows} registros' + diff --git a/src/components/common/VnDmsList.vue b/src/components/common/VnDmsList.vue index 345870aa4..d175a4167 100644 --- a/src/components/common/VnDmsList.vue +++ b/src/components/common/VnDmsList.vue @@ -4,6 +4,7 @@ import { useI18n } from 'vue-i18n'; import { useRoute } from 'vue-router'; import { useQuasar, QCheckbox, QBtn, QInput } from 'quasar'; import axios from 'axios'; +import { usePrintService } from 'composables/usePrintService'; import VnUserLink from '../ui/VnUserLink.vue'; import { downloadFile } from 'src/composables/downloadFile'; @@ -23,6 +24,7 @@ const rows = ref([]); const dmsRef = ref(); const formDialog = ref({}); const token = useSession().getTokenMultimedia(); +const { openReport } = usePrintService(); const $props = defineProps({ model: { @@ -199,12 +201,7 @@ const columns = computed(() => [ color: 'primary', }), click: (prop) => - downloadFile( - prop.row.id, - $props.downloadModel, - undefined, - prop.row.download, - ), + openReport(`dms/${prop.row.id}/downloadFile`, {}, '_blank'), }, { component: QBtn, diff --git a/src/components/common/VnLog.vue b/src/components/common/VnLog.vue index 7020c8489..6e9128a43 100644 --- a/src/components/common/VnLog.vue +++ b/src/components/common/VnLog.vue @@ -1,5 +1,5 @@ - - - - - - - - - {{ t('Select all', { rows: rows.length }) }} - - - - - - - - -en: - Select all: 'Select all ({rows})' -fr: - Select all: 'Sélectionner tout ({rows})' -es: - Select all: 'Seleccionar todo ({rows})' -de: - Select all: 'Alle auswählen ({rows})' -it: - Select all: 'Seleziona tutto ({rows})' -pt: - Select all: 'Selecionar tudo ({rows})' - diff --git a/src/components/common/VnSelect.vue b/src/components/common/VnSelect.vue index 2cb72261f..97fec882c 100644 --- a/src/components/common/VnSelect.vue +++ b/src/components/common/VnSelect.vue @@ -161,7 +161,7 @@ const arrayData = useArrayData(arrayDataKey, { searchUrl: false, mapKey: $attrs['map-key'], }); - +const isMenuOpened = ref(false); const computedSortBy = computed(() => { return $props.sortBy || $props.optionLabel + ' ASC'; }); @@ -186,7 +186,9 @@ onMounted(() => { if ($props.focusOnMount) setTimeout(() => vnSelectRef.value.showPopup(), 300); }); -const someIsLoading = computed(() => isLoading.value || !!arrayData?.isLoading?.value); +const someIsLoading = computed( + () => (isLoading.value || !!arrayData?.isLoading?.value) && !isMenuOpened.value, +); function findKeyInOptions() { if (!$props.options) return; return filter($props.modelValue, $props.options)?.length; @@ -369,6 +371,8 @@ function getCaption(opt) { :input-debounce="useURL ? '300' : '0'" :loading="someIsLoading" @virtual-scroll="onScroll" + @popup-hide="isMenuOpened = false" + @popup-show="isMenuOpened = true" @keydown="handleKeyDown" :data-cy="$attrs.dataCy ?? $attrs.label + '_select'" :data-url="url" diff --git a/src/components/ui/EntityDescriptor.vue b/src/components/ui/EntityDescriptor.vue index 751a6bd9c..e4baabe34 100644 --- a/src/components/ui/EntityDescriptor.vue +++ b/src/components/ui/EntityDescriptor.vue @@ -1,8 +1,6 @@ - + diff --git a/src/components/ui/VnPaginate.vue b/src/components/ui/VnPaginate.vue index 8a3c5a616..14401f6e3 100644 --- a/src/components/ui/VnPaginate.vue +++ b/src/components/ui/VnPaginate.vue @@ -146,14 +146,14 @@ const addFilter = async (filter, params) => { }; async function fetch(params) { - useArrayData(props.dataKey, params); + arrayData.setOptions(params); arrayData.resetPagination(); await arrayData.fetch({ append: false }); return emitStoreData(); } async function update(params) { - useArrayData(props.dataKey, params); + arrayData.setOptions(params); const { limit, skip } = store; store.limit = limit + skip; store.skip = 0; diff --git a/src/composables/useArrayData.js b/src/composables/useArrayData.js index 9828b35ae..a071b9928 100644 --- a/src/composables/useArrayData.js +++ b/src/composables/useArrayData.js @@ -19,7 +19,7 @@ export function useArrayData(key, userOptions) { let canceller = null; onMounted(() => { - setOptions(); + setOptions(userOptions ?? {}); reset(['skip']); const query = route.query; @@ -39,9 +39,10 @@ export function useArrayData(key, userOptions) { setCurrentFilter(); }); - if (key && userOptions) setOptions(); + if (userOptions) setOptions(userOptions); - function setOptions() { + function setOptions(params) { + if (!params) return; const allowedOptions = [ 'url', 'filter', @@ -57,14 +58,14 @@ export function useArrayData(key, userOptions) { 'mapKey', 'oneRecord', ]; - if (typeof userOptions === 'object') { - for (const option in userOptions) { - const isEmpty = userOptions[option] == null || userOptions[option] === ''; + if (typeof params === 'object') { + for (const option in params) { + const isEmpty = params[option] == null || params[option] === ''; if (isEmpty || !allowedOptions.includes(option)) continue; if (Object.hasOwn(store, option)) { - const defaultOpts = userOptions[option]; - store[option] = userOptions.keepOpts?.includes(option) + const defaultOpts = params[option]; + store[option] = params.keepOpts?.includes(option) ? Object.assign(defaultOpts, store[option]) : defaultOpts; if (option === 'userParams') store.defaultParams = store[option]; @@ -367,5 +368,6 @@ export function useArrayData(key, userOptions) { deleteOption, reset, resetPagination, + setOptions, }; } diff --git a/src/pages/Account/Card/AccountDescriptorProxy.vue b/src/pages/Account/Card/AccountDescriptorProxy.vue index 6a4b3e267..b7bbc1ef9 100644 --- a/src/pages/Account/Card/AccountDescriptorProxy.vue +++ b/src/pages/Account/Card/AccountDescriptorProxy.vue @@ -4,11 +4,6 @@ import AccountSummary from './AccountSummary.vue'; - + diff --git a/src/pages/Claim/Card/ClaimDescriptor.vue b/src/pages/Claim/Card/ClaimDescriptor.vue index 3728a18c0..01937a87a 100644 --- a/src/pages/Claim/Card/ClaimDescriptor.vue +++ b/src/pages/Claim/Card/ClaimDescriptor.vue @@ -1,5 +1,5 @@ @@ -126,7 +120,7 @@ onMounted(async () => { size="md" icon="assignment" color="primary" - :href="salixUrl + 'ticket/' + entity.ticketFk + '/sale-tracking'" + :to="{ name: 'TicketSaleTracking', params: { id: entity.ticketFk } }" > {{ t('claim.saleTracking') }} @@ -134,7 +128,7 @@ onMounted(async () => { size="md" icon="visibility" color="primary" - :href="salixUrl + 'ticket/' + entity.ticketFk + '/tracking/index'" + :to="{ name: 'TicketTracking', params: { id: entity.ticketFk } }" > {{ t('claim.ticketTracking') }} diff --git a/src/pages/Claim/Card/ClaimDescriptorProxy.vue b/src/pages/Claim/Card/ClaimDescriptorProxy.vue index 78e686745..f4eff0843 100644 --- a/src/pages/Claim/Card/ClaimDescriptorProxy.vue +++ b/src/pages/Claim/Card/ClaimDescriptorProxy.vue @@ -4,11 +4,6 @@ import ClaimSummary from './ClaimSummary.vue'; - + diff --git a/src/pages/Customer/Notifications/CustomerNotifications.vue b/src/pages/Customer/Notifications/CustomerNotifications.vue index 02792182c..84babe24d 100644 --- a/src/pages/Customer/Notifications/CustomerNotifications.vue +++ b/src/pages/Customer/Notifications/CustomerNotifications.vue @@ -89,7 +89,6 @@ const columns = computed(() => [ diff --git a/src/pages/Customer/Notifications/CustomerNotificationsCampaignConsumption.vue b/src/pages/Customer/Notifications/CustomerNotificationsCampaignConsumption.vue index 141a02bfc..36157082b 100644 --- a/src/pages/Customer/Notifications/CustomerNotificationsCampaignConsumption.vue +++ b/src/pages/Customer/Notifications/CustomerNotificationsCampaignConsumption.vue @@ -142,13 +142,13 @@ onMounted(async () => { valentinesDay: Valentine's Day mothersDay: Mother's Day allSaints: All Saints' Day - Campaign consumption: Campaign consumption ({rows}) + Campaign consumption: Campaign consumption - {rows} records es: params: valentinesDay: Día de San Valentín mothersDay: Día de la Madre allSaints: Día de Todos los Santos - Campaign consumption: Consumo campaña ({rows}) + Campaign consumption: Consumo campaña - {rows} registros Campaign: Campaña From: Desde To: Hasta diff --git a/src/pages/Shelving/Parking/Card/ParkingDescriptorProxy.vue b/src/pages/Shelving/Parking/Card/ParkingDescriptorProxy.vue index e78a2b238..cff1f75c2 100644 --- a/src/pages/Shelving/Parking/Card/ParkingDescriptorProxy.vue +++ b/src/pages/Shelving/Parking/Card/ParkingDescriptorProxy.vue @@ -4,11 +4,6 @@ import ParkingSummary from './ParkingSummary.vue'; - + diff --git a/src/pages/Ticket/Card/BasicData/TicketBasicDataForm.vue b/src/pages/Ticket/Card/BasicData/TicketBasicDataForm.vue index d157916ac..5b04e9cfd 100644 --- a/src/pages/Ticket/Card/BasicData/TicketBasicDataForm.vue +++ b/src/pages/Ticket/Card/BasicData/TicketBasicDataForm.vue @@ -70,8 +70,6 @@ async function getDate(query, params) { for (const param in params) { if (!params[param]) return; } - - formData.value.zoneFk = null; zonesOptions.value = []; const { data } = await axios.get(query, { params }); if (!data) return notify(t('basicData.noDeliveryZoneAvailable'), 'negative'); @@ -79,7 +77,7 @@ async function getDate(query, params) { formData.value.zoneFk = data.zoneFk; formData.value.landed = data.landed; const shippedDate = new Date(params.shipped); - const landedDate = new Date(data.landed); + const landedDate = new Date(data.hour); shippedDate.setHours( landedDate.getHours(), landedDate.getMinutes(), @@ -427,6 +425,14 @@ async function getZone(options) { :rules="validate('ticketList.shipped')" @update:model-value="setShipped" /> + -import { reactive } from 'vue'; import { useI18n } from 'vue-i18n'; import { useRouter } from 'vue-router'; @@ -30,31 +29,29 @@ const { t } = useI18n(); const router = useRouter(); const { notify } = useNotify(); -const newTicketFormData = reactive({}); const date = new Date(); -const createTicket = async () => { +async function createTicket(formData) { const expeditionIds = $props.selectedExpeditions.map((expedition) => expedition.id); const params = { clientId: $props.ticket.clientFk, - landed: newTicketFormData.landed, + landed: formData.landed, warehouseId: $props.ticket.warehouseFk, addressId: $props.ticket.addressFk, agencyModeId: $props.ticket.agencyModeFk, - routeId: newTicketFormData.routeFk, + routeId: formData.routeFk, expeditionIds: expeditionIds, }; - const { data } = await axios.post('Expeditions/moveExpeditions', params); notify(t('globals.dataSaved'), 'positive'); router.push({ name: 'TicketSummary', params: { id: data.id } }); -}; +} diff --git a/src/pages/Worker/Card/WorkerBasicData.vue b/src/pages/Worker/Card/WorkerBasicData.vue index f2a16b7e1..cb5ead5e3 100644 --- a/src/pages/Worker/Card/WorkerBasicData.vue +++ b/src/pages/Worker/Card/WorkerBasicData.vue @@ -1,6 +1,5 @@ { ref="form" :url-update="`Workers/${$route.params.id}`" auto-load - model="Worker" + :model + @on-fetch="(data, res, old, formData) => addAdvancedData(formData)" > diff --git a/src/pages/Worker/Card/WorkerCard.vue b/src/pages/Worker/Card/WorkerCard.vue index 591dadcd2..b1bde6d75 100644 --- a/src/pages/Worker/Card/WorkerCard.vue +++ b/src/pages/Worker/Card/WorkerCard.vue @@ -4,9 +4,11 @@ import VnCard from 'src/components/common/VnCard.vue'; diff --git a/src/pages/Worker/Card/WorkerDescriptor.vue b/src/pages/Worker/Card/WorkerDescriptor.vue index 9576e7e84..db0c7c096 100644 --- a/src/pages/Worker/Card/WorkerDescriptor.vue +++ b/src/pages/Worker/Card/WorkerDescriptor.vue @@ -2,7 +2,6 @@ import { computed, ref } from 'vue'; import { useRoute } from 'vue-router'; import { useI18n } from 'vue-i18n'; -import EntityDescriptor from 'src/components/ui/EntityDescriptor.vue'; import VnLv from 'src/components/ui/VnLv.vue'; import VnLinkPhone from 'src/components/ui/VnLinkPhone.vue'; import VnChangePassword from 'src/components/common/VnChangePassword.vue'; @@ -11,6 +10,8 @@ import VnImg from 'src/components/ui/VnImg.vue'; import EditPictureForm from 'components/EditPictureForm.vue'; import WorkerDescriptorMenu from './WorkerDescriptorMenu.vue'; import DepartmentDescriptorProxy from 'src/pages/Worker/Department/Card/DepartmentDescriptorProxy.vue'; +import CardDescriptor from 'src/components/ui/CardDescriptor.vue'; +import WorkerCard from './WorkerCard.vue'; const $props = defineProps({ id: { @@ -52,14 +53,17 @@ const handlePhotoUpdated = (evt = false) => { }; - { - +