diff --git a/CHANGELOG.md b/CHANGELOG.md index f1d10b26e..88abb9ae0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,183 @@ +# Version 24.40 - 2024-10-02 + +### Added 🆕 + +- chore: refs #4074 admit several acls by:jorgep +- chore: refs #4074 drop workerCreate by:jorgep +- chore: refs #4074 fix tests by:jorgep +- chore: refs #4074 wip replace useRole for useAcl by:jorgep +- chore: refs #7155 remove console.log by:alexm +- chore: refs #7155 typo by:alexm +- chore: refs #7663 add test by:jorgep +- chore: refs #7663 create test wip by:jorgep +- chore: refs #7663 drop useless code (origin/7663-setWeight) by:jorgep +- chore: refs #7828 fix e2e by:jorgep +- feat(AccountBasicData): add twoFactorFk by:alexm +- feat: add max rule by:Javier Segarra +- feat: add shortcut add event in some subSections by:Javier Segarra +- feat: add shortcut more buttons (origin/add_shortcut_add_subSections) by:Javier Segarra +- feat: add tooltip CustomerNewCustomAgent by:Javier Segarra +- feat: apply color when today by:Javier Segarra +- feat: change label because its more natural by:Javier Segarra +- feat: change order by:Javier Segarra +- feat: change QBadge color by:Javier Segarra +- feat: change url CustomerList by:Javier Segarra +- feat: copy customer countryFk by:Javier Segarra +- feat: create VnSelectEnum and add in AccountBasicData and ClaimBasicData by:alexm +- feat: CustomerBalance by:Javier Segarra +- feat: CustomerConsumptionFilter by:Javier Segarra +- feat: customer consumption (origin/7830-customerDesplegables, 7830-customerDesplegables) by:alexm +- feat: CustomerCreateTicket by:Javier Segarra +- feat: CustomerCredit section by:Javier Segarra +- feat: CustomerGreuges by:Javier Segarra +- feat: CustomerSample to VnTable by:Javier Segarra +- feat: global handler (origin/fix_global_handler, fix_global_handler) by:alexm +- feat: goToSupplier by:Javier Segarra +- feat: handle newValue by:Javier Segarra +- feat: handle same multiple CP by:Javier Segarra +- feat: hide menus on small view (origin/hideMenu) by:jorgep +- feat: minor changes by:Javier Segarra +- feat: orderCreateDialog by:Javier Segarra +- feat: refs #4074 drop useless code by:jorgep +- feat: refs #4074 useAcl in vnSelectDialog by:jorgep +- feat: refs #6346 new wagon type section by:Jon +- feat: refs #7404 add m3 and fix detail by:pablone +- feat: refs #7404 add some style to the form and reorganize fields by:pablone +- feat: refs #7404 add travel m3 to reserves form by:pablone +- feat: refs #7404 style dynamic text color by:pablone +- feat: refs #7404 travel m3 form by:pablone +- feat: refs #7500 added VnImg to show files by:Jon +- feat: refs #7663 add setWeight menu opt (wip) by:jorgep +- feat: refs #7663 fine tunning by:jorgep +- feat: refs #7828 create axios instance which no manage errors (origin/7828-makeCorrectCalls) by:jorgep +- feat: refs #7828 useAcl & cherry pick mail data worker by:jorgep +- feat: remove cli warnings by:Javier Segarra +- feat: show preparation field by:Javier Segarra +- feat: stateGroupedFilter by:Javier Segarra +- feat: translations fixed by:jgallego +- feat(TravelList): add daysOnward by:alexm +- feat: travel m3 by:pablone +- feat: use disableInifiniteScroll property by:Javier Segarra +- feat: VnImg draggable by:Javier Segarra +- feat: vnLocation changes by:Javier Segarra +- feat: vnSelect exprBuilder by:Javier Segarra +- fix: refs #7404 remove some style by:pablone +- fix: refs #7404 style non center pop up (origin/7404-fixFront) by:pablone +- fix: refs #7404 translates and some minor style fixes by:pablone +- fix: styles by:Javier Segarra +- perf: improve style by:Javier Segarra + +### Changed 📦 + +- perf: CustomerBalance by:Javier Segarra +- perf: CustomerBasicData by:Javier Segarra +- perf: CustomerBasicData.salesPersonFk by:Javier Segarra +- perf: CustomerSummary by:Javier Segarra +- perf: customerSummaryTable by:Javier Segarra +- perf: disable card option by:Javier Segarra +- perf: i18n by:Javier Segarra +- perf: improve by:Javier Segarra +- perf: improve style by:Javier Segarra +- perf: imrpove exprBuilder by:Javier Segarra +- perf: minor comments by:Javier Segarra +- perf: refs #6346 previous changes by:Jon +- perf: sendEmail customerConsumption by:Javier Segarra +- perf: solve reload CardSummary component by:Javier Segarra +- perf: update CustommerDescriptor by:Javier Segarra +- refactor: refs #4074 accept array by:jorgep +- refactor: refs #4074 rollback by:jorgep +- refactor: refs #4074 use acl & drop useless roles by:jorgep +- refactor: refs #4074 useAcl in navigationStore & router by:jorgep +- refactor: refs #4074 use fn (origin/4074-useAcls) by:jorgep +- refactor: refs #4074 use VnTitle by:jorgep +- refactor: refs #6346 deleted front error checking by:Jon +- refactor: refs #6346 requested changes by:Jon +- refactor: refs #6346 wagons to VnTable by:Jon +- refactor: refs #7500 deleted useless code by:Jon +- refactor: refs #7500 refactor vnimg when storage is dms by:Jon +- refactor: refs #7828 wip by:jorgep + +### Fixed 🛠️ + +- chore: refs #4074 fix tests by:jorgep +- chore: refs #7828 fix e2e by:jorgep +- feat: refs #7404 add m3 and fix detail by:pablone +- feat: translations fixed by:jgallego +- fix: #5938 grouped filter by:Javier Segarra +- fix: #6943 fix customerSummaryTable by:Javier Segarra +- fix: #6943 show nickname salesPerson by:Javier Segarra +- fix: address-create i18n by:Javier Segarra +- fix: comments (origin/6943_fix_customer_module, 6943_fix_customer_module) by:Javier Segarra +- fix: CusomerSummary to Address by:Javier Segarra +- fix: CustomerAddress mobile by:Javier Segarra +- fix: CustomerBillingData by:Javier Segarra +- fix: Customerconsumption by:Javier Segarra +- fix: customer credit opinion by:alexm +- fix: CustomerCreditOpinion workerDescriptor by:Javier Segarra +- fix: CustomerDescriptorAccount by:Javier Segarra +- fix: CustomerDescriptor.bussinessTypeFk by:Javier Segarra +- fix: CustomerFilter by:Javier Segarra +- fix: CustomerGreuges by:Javier Segarra +- fix: CustomerMandates by:Javier Segarra +- fix: Customer module find salesPersons out of first get by:Javier Segarra +- fix: CustomerRecovery transalate label by:Javier Segarra +- fix: CustomerSamples by:Javier Segarra +- fix: customerSummaryToTicketList button by:Javier Segarra +- fix: CustomerWebPayment by:Javier Segarra +- fix: CustommerSummaryTable Proxy by:Javier Segarra +- fix: deleted code by:Jon +- fix: duplicate code by:alexm +- fix: emit:updateModelValue by:Javier Segarra +- fix: fixed wagon tests by:Jon +- fix: fix wagon list reload by:Jon +- fix: i18n en preparation label by:Javier Segarra +- fix: infiniteScroll by:Javier Segarra +- fix: isFullMovable checkbox by:Javier Segarra +- fix: merge conflicts by:Javier Segarra +- fix: merge in dev by:alexm +- fix: missing code by:Jon +- fix: Options VnSelect properties by:Javier Segarra +- fix: refs #4074 await to watch by:jorgep +- fix: refs #4074 drop wrong acl by:jorgep +- fix: refs #4074 workerCard data-key by:jorgep +- fix: refs #6346 fix list and create by:pablone +- fix: refs #6943 prevent null (origin/6943-warmfix-preventNull) by:jorgep +- fix: refs #7155 remove userParams in watcher (7155-travel_daysOnward) by:alexm +- fix: refs #7155 use chip-locale (origin/7155-travel_daysOnward_2, 7155-travel_daysOnward_2) by:alexm +- fix: refs #7404 remove console.log by:pablone +- fix: refs #7404 remove from test by:pablone +- fix: refs #7404 remove some style by:pablone +- fix: refs #7404 revert commit prevent production access by:pablone +- fix: refs #7404 style non center pop up (origin/7404-fixFront) by:pablone +- fix: refs #7404 translates and some minor style fixes by:pablone +- fix: refs #7500 fixed e2e test by:Jon +- fix: refs #7500 fixed showing images wrongly by:Jon +- fix: refs #7830 customer credit by:pablone +- fix: refs #7830 remove console.log by:pablone +- fix: remove console.log by:pablone +- fix: remove FetchData by:Javier Segarra +- fix: remove FIXME (origin/6943_fix_customerSummaryTable) by:Javier Segarra +- fix: remove print variable by:Javier Segarra +- fix: remove promise execution by:Javier Segarra +- fix: reset VnTable scroll properties by:Javier Segarra +- fix: rule by:Javier Segarra +- fix: solve conflicts from master to test by:Javier Segarra +- fix: split params (origin/warmfix-addSearchUrl) by:jorgep +- fix: state cell by:Javier Segarra +- fix: stop call back event hasMoreData by:Javier Segarra +- fix: styles by:Javier Segarra +- fix: SupplierFiscalData VnLocation (origin/fix_supplierFD_location) by:Javier Segarra +- fix: VnLocation test by:Javier Segarra +- fix(VnTable): header background-color by:alexm +- fix(VnTable): sanitizer value is defined by:carlossa +- fix: wagon reload (origin/FixWagonRedirect) by:Jon +- fix: workerDms filter workerFk by:alexm +- fix(WorkerList): add type email by:alexm +- Merge remote-tracking branch 'origin/7830-customerDesplegables' into 6943_fix_customerSummaryTable by:Javier Segarra +- refs #7155 scopeDays fix (origin/7155-scopeDays) by:carlossa +- revert: vnUSerLink change by:Javier Segarra +- test: fix test (7677_vnLocation_perf) by:Javier Segarra + # Version 24.38 - 2024-09-17 ### Added 🆕 diff --git a/src/components/VnTable/VnTable.vue b/src/components/VnTable/VnTable.vue index 53db777df..5a30f4d53 100644 --- a/src/components/VnTable/VnTable.vue +++ b/src/components/VnTable/VnTable.vue @@ -317,7 +317,7 @@ defineExpose({ params, }); -function handleOnDataSaved(_, res) { +function handleOnDataSaved(_) { if (_.onDataSaved) _.onDataSaved({ CrudModelRef: CrudModelRef.value }); else $props.create.onDataSaved(_); } @@ -497,6 +497,7 @@ function handleOnDataSaved(_, res) { auto-width class="no-margin q-px-xs" :class="[getColAlign(col), col.columnClass]" + :style="col.style" v-if="col.visible ?? true" @click.ctrl=" ($event) => @@ -525,6 +526,7 @@ function handleOnDataSaved(_, res) { :class="getColAlign(col)" class="sticky no-padding" @click="stopEventPropagation($event)" + :style="col.style" > <QBtn v-for="(btn, index) of col.actions" @@ -710,7 +712,7 @@ function handleOnDataSaved(_, res) { icon="add" shortcut="+" /> - <QTooltip> + <QTooltip self="top right"> {{ createForm?.title }} </QTooltip> </QPageSticky> diff --git a/src/composables/useArrayData.js b/src/composables/useArrayData.js index b1c150410..30bcac66b 100644 --- a/src/composables/useArrayData.js +++ b/src/composables/useArrayData.js @@ -114,7 +114,7 @@ export function useArrayData(key = useRoute().meta.moduleName, userOptions) { for (const row of response.data) store.data.push(row); } else { store.data = response.data; - if (!document.querySelectorAll('[role="dialog"]').length) + if (!document.querySelectorAll('[role="dialog"][aria-modal="true"]').length) updateRouter && updateStateParams(); } diff --git a/src/i18n/locale/en.yml b/src/i18n/locale/en.yml index b76c147cd..b73395df2 100644 --- a/src/i18n/locale/en.yml +++ b/src/i18n/locale/en.yml @@ -105,6 +105,7 @@ globals: campaign: Campaign weight: Weight error: Ups! Something went wrong + recalc: Recalculate pageTitles: logIn: Login addressEdit: Update address @@ -275,6 +276,7 @@ globals: serial: Serial medical: Mutual RouteExtendedList: Router + wasteRecalc: Waste recaclulate supplier: Supplier created: Created worker: Worker @@ -293,6 +295,7 @@ globals: maxTemperature: Max minTemperature: Min params: + id: ID clientFk: Client id salesPersonFk: Sales person warehouseFk: Warehouse @@ -300,7 +303,12 @@ globals: from: From To: To stateFk: State + departmentFk: Department + email: Email + SSN: SSN + fi: FI changePass: Change password + deleteConfirmTitle: Delete selected elements errors: statusUnauthorized: Access denied statusInternalServerError: An internal server error has ocurred @@ -807,14 +815,14 @@ worker: bankEntity: Swift / BIC formation: tableVisibleColumns: - course: Curso - startDate: Fecha Inicio - endDate: Fecha Fin - center: Centro Formación - invoice: Factura - amount: Importe - remark: Bonficado - hasDiploma: Diploma + course: Course + startDate: Start date + endDate: End date + center: Training center + invoice: Invoice + amount: Amount + remark: Remark + hasDiploma: Has diploma medical: tableVisibleColumns: date: Date diff --git a/src/i18n/locale/es.yml b/src/i18n/locale/es.yml index d0d5bdc0d..2552c9549 100644 --- a/src/i18n/locale/es.yml +++ b/src/i18n/locale/es.yml @@ -107,6 +107,7 @@ globals: campaign: Campaña weight: Peso error: ¡Ups! Algo salió mal + recalc: Recalcular pageTitles: logIn: Inicio de sesión addressEdit: Modificar consignatario @@ -279,6 +280,7 @@ globals: clientsActionsMonitor: Clientes y acciones serial: Facturas por serie medical: Mutua + wasteRecalc: Recalcular mermas supplier: Proveedor created: Fecha creación worker: Trabajador @@ -297,6 +299,7 @@ globals: maxTemperature: Máx minTemperature: Mín params: + id: Id clientFk: Id cliente salesPersonFk: Comercial warehouseFk: Almacén @@ -304,7 +307,12 @@ globals: from: Desde To: Hasta stateFk: Estado + departmentFk: Departamento + email: Correo + SSN: NSS + fi: NIF changePass: Cambiar contraseña + deleteConfirmTitle: Eliminar los elementos seleccionados errors: statusUnauthorized: Acceso denegado statusInternalServerError: Ha ocurrido un error interno del servidor diff --git a/src/pages/Account/AccountList.vue b/src/pages/Account/AccountList.vue index 1beac0d0b..72c445fa9 100644 --- a/src/pages/Account/AccountList.vue +++ b/src/pages/Account/AccountList.vue @@ -5,7 +5,8 @@ import VnTable from 'components/VnTable/VnTable.vue'; import VnSearchbar from 'components/ui/VnSearchbar.vue'; import AccountSummary from './Card/AccountSummary.vue'; import { useSummaryDialog } from 'src/composables/useSummaryDialog'; - +import AccountFilter from './AccountFilter.vue'; +import RightMenu from 'src/components/common/RightMenu.vue'; const { t } = useI18n(); const { viewSummary } = useSummaryDialog(); const tableRef = ref(); @@ -20,14 +21,6 @@ const columns = computed(() => [ isId: true, field: 'id', cardVisible: true, - columnFilter: { - component: 'select', - name: 'search', - attrs: { - url: 'VnUsers/preview', - fields: ['id', 'name'], - }, - }, }, { align: 'left', @@ -53,9 +46,6 @@ const columns = computed(() => [ columnField: { component: null, }, - columnFilter: { - inWhere: true, - }, cardVisible: true, create: true, }, @@ -67,9 +57,6 @@ const columns = computed(() => [ columnField: { component: null, }, - columnFilter: { - inWhere: true, - }, cardVisible: true, create: true, }, @@ -123,6 +110,11 @@ const exprBuilder = (param, value) => { :info="t('account.searchInfo')" :filter="filter" /> + <RightMenu> + <template #right-panel> + <AccountFilter data-key="AccountUsers" /> + </template> + </RightMenu> <VnTable ref="tableRef" data-key="AccountUsers" @@ -133,6 +125,8 @@ const exprBuilder = (param, value) => { default-mode="table" redirect="account" :use-model="true" + :right-search="false" + auto-load /> </template> diff --git a/src/pages/Account/Card/AccountCard.vue b/src/pages/Account/Card/AccountCard.vue index 5ba2415c4..119a7fd07 100644 --- a/src/pages/Account/Card/AccountCard.vue +++ b/src/pages/Account/Card/AccountCard.vue @@ -10,10 +10,7 @@ const { t } = useI18n(); <VnCard data-key="Account" :descriptor="AccountDescriptor" - search-data-key="AccountUsers" - :filter="{ - include: { relation: 'role', scope: { fields: ['id', 'name'] } }, - }" + search-data-key="AccountList" :searchbar-props="{ url: 'VnUsers/preview', label: t('account.search'), diff --git a/src/pages/Entry/EntryWasteRecalc.vue b/src/pages/Entry/EntryWasteRecalc.vue new file mode 100644 index 000000000..cd823beb4 --- /dev/null +++ b/src/pages/Entry/EntryWasteRecalc.vue @@ -0,0 +1,72 @@ +<script setup> +import { ref, computed, watch } from 'vue'; +import VnInputDate from 'components/common/VnInputDate.vue'; +import useNotify from 'src/composables/useNotify.js'; +import axios from 'axios'; + +const isLoading = ref(false); +const dateFrom = ref(); +const dateTo = ref(); + +const optionsTo = computed(() => (date) => { + if (!dateFrom.value) return true; + return new Date(date) >= new Date(dateFrom.value); +}); + +watch(dateFrom, (newDateFrom) => { + if (dateTo.value && new Date(dateTo.value) < new Date(newDateFrom)) + dateTo.value = newDateFrom; +}); + +const recalc = async () => { + const { notify } = useNotify(); + + const params = { + schema: 'bs', + params: [new Date(dateFrom.value), new Date(dateTo.value)], + }; + + try { + isLoading.value = true; + await axios.post('Applications/waste_addSales/execute-proc', params); + notify('wasteRecalc.recalcOk', 'positive'); + } catch (err) { + console.error(err); + } finally { + isLoading.value = false; + } +}; +</script> + +<template> + <div class="q-pa-lg row justify-center"> + <QCard class="bg-light" style="width: 300px"> + <QCardSection> + <VnInputDate + class="q-mb-lg" + v-model="dateFrom" + :label="$t('globals.from')" + rounded + dense + /> + <VnInputDate + class="q-mb-lg" + v-model="dateTo" + :options="optionsTo" + :label="$t('globals.to')" + :disable="!dateFrom" + rounded + dense + /> + <QBtn + color="primary" + text-color="white" + :label="$t('globals.recalc')" + :loading="isLoading" + :disable="isLoading || !(dateFrom && dateTo)" + @click="recalc()" + /> + </QCardSection> + </QCard> + </div> +</template> diff --git a/src/pages/Entry/locale/en.yml b/src/pages/Entry/locale/en.yml index b4d7c33bc..f9dbd0589 100644 --- a/src/pages/Entry/locale/en.yml +++ b/src/pages/Entry/locale/en.yml @@ -18,3 +18,5 @@ myEntries: warehouseInFk: Warehouse in daysOnward: Days onward daysAgo: Days ago +wasteRecalc: + recalcOk: The wastes were successfully recalculated diff --git a/src/pages/Entry/locale/es.yml b/src/pages/Entry/locale/es.yml index 2dfd601b1..feeea1fc9 100644 --- a/src/pages/Entry/locale/es.yml +++ b/src/pages/Entry/locale/es.yml @@ -21,3 +21,5 @@ myEntries: warehouseInFk: Alm. entrada daysOnward: Días adelante daysAgo: Días atras +wasteRecalc: + recalcOk: Se han recalculado las mermas correctamente diff --git a/src/pages/InvoiceOut/Card/InvoiceOutDescriptorMenu.vue b/src/pages/InvoiceOut/Card/InvoiceOutDescriptorMenu.vue index 08b21fb4a..70d38cb93 100644 --- a/src/pages/InvoiceOut/Card/InvoiceOutDescriptorMenu.vue +++ b/src/pages/InvoiceOut/Card/InvoiceOutDescriptorMenu.vue @@ -9,7 +9,6 @@ import RefundInvoiceForm from 'src/components/RefundInvoiceForm.vue'; import SendEmailDialog from 'components/common/SendEmailDialog.vue'; import useNotify from 'src/composables/useNotify'; -import { useSession } from 'src/composables/useSession'; import { usePrintService } from 'composables/usePrintService'; import { useVnConfirm } from 'composables/useVnConfirm'; import { getUrl } from 'src/composables/getUrl'; @@ -30,8 +29,6 @@ const $props = defineProps({ const { notify } = useNotify(); const router = useRouter(); -const session = useSession(); -const token = session.getToken(); const { t } = useI18n(); const { openReport, sendEmail } = usePrintService(); const { openConfirmationModal } = useVnConfirm(); diff --git a/src/pages/Monitor/MonitorOrders.vue b/src/pages/Monitor/MonitorOrders.vue index 52d442d0a..fac601735 100644 --- a/src/pages/Monitor/MonitorOrders.vue +++ b/src/pages/Monitor/MonitorOrders.vue @@ -139,33 +139,35 @@ const openTab = (id) => :disable-option="{ card: true }" > <template #top-left> - <QBtn - icon="refresh" - size="md" - color="primary" - dense - flat - @click="$refs.table.reload()" - > - <QTooltip>{{ $t('globals.refresh') }}</QTooltip> - </QBtn> - <QBtn - v-if="selectedRows.length" - icon="delete" - size="md" - dense - flat - color="primary" - @click=" - openConfirmationModal( - $t('salesOrdersTable.deleteConfirmTitle'), - $t('salesOrdersTable.deleteConfirmMessage'), - removeOrders - ) - " - > - <QTooltip>{{ t('salesOrdersTable.delete') }}</QTooltip> - </QBtn> + <div class="q-mt-sm"> + <QBtn + icon="refresh" + size="md" + color="primary" + dense + flat + @click="$refs.table.reload()" + > + <QTooltip>{{ $t('globals.refresh') }}</QTooltip> + </QBtn> + <QBtn + v-if="selectedRows.length" + icon="delete" + size="md" + dense + flat + color="primary" + @click=" + openConfirmationModal( + $t('globals.deleteConfirmTitle'), + $t('salesOrdersTable.deleteConfirmMessage'), + removeOrders + ) + " + > + <QTooltip>{{ t('salesOrdersTable.delete') }}</QTooltip> + </QBtn> + </div> </template> <template #column-dateSend="{ row }"> <QTd> diff --git a/src/pages/Monitor/locale/en.yml b/src/pages/Monitor/locale/en.yml index 4cdd245aa..b8082f02a 100644 --- a/src/pages/Monitor/locale/en.yml +++ b/src/pages/Monitor/locale/en.yml @@ -15,7 +15,6 @@ salesOrdersTable: dateMake: Make date client: Client salesPerson: Salesperson - deleteConfirmTitle: Delete selected elements deleteConfirmMessage: All the selected elements will be deleted. Are you sure you want to continue? agency: Agency import: Import diff --git a/src/pages/Monitor/locale/es.yml b/src/pages/Monitor/locale/es.yml index 8087bb444..4ee5b90a9 100644 --- a/src/pages/Monitor/locale/es.yml +++ b/src/pages/Monitor/locale/es.yml @@ -15,7 +15,6 @@ salesOrdersTable: dateMake: Fecha de realización client: Cliente salesPerson: Comercial - deleteConfirmTitle: Eliminar los elementos seleccionados deleteConfirmMessage: Todos los elementos seleccionados serán eliminados. ¿Seguro que quieres continuar? agency: Agencia import: Importe diff --git a/src/pages/Order/Card/OrderCatalog.vue b/src/pages/Order/Card/OrderCatalog.vue index 68bf9511f..b13e8661d 100644 --- a/src/pages/Order/Card/OrderCatalog.vue +++ b/src/pages/Order/Card/OrderCatalog.vue @@ -130,4 +130,5 @@ function extractValueTags(items) { <i18n> es: You can search items by name or id: Puedes buscar items por nombre o id + Search items: Buscar items </i18n> diff --git a/src/pages/Order/Card/OrderCatalogFilter.vue b/src/pages/Order/Card/OrderCatalogFilter.vue index 354c44747..6de43e86a 100644 --- a/src/pages/Order/Card/OrderCatalogFilter.vue +++ b/src/pages/Order/Card/OrderCatalogFilter.vue @@ -247,6 +247,7 @@ function addOrder(value, field, params) { rounded emit-value use-input + sort-by="name ASC" :disable="!selectedCategoryFk" @update:model-value=" (value) => { diff --git a/src/pages/Order/Card/OrderCatalogItemDialog.vue b/src/pages/Order/Card/OrderCatalogItemDialog.vue index 46a50c021..09a25fcb8 100644 --- a/src/pages/Order/Card/OrderCatalogItemDialog.vue +++ b/src/pages/Order/Card/OrderCatalogItemDialog.vue @@ -20,8 +20,10 @@ const props = defineProps({ const fields = ref((props.prices || []).map((item) => ({ ...item, quantity: 0 }))); const descriptorData = useArrayData('orderData'); - +const isLoading = ref(false); const addToOrder = async () => { + if (isLoading.value) return; + isLoading.value = true; const items = (fields.value || []).filter((item) => Number(item.quantity) > 0); await axios.post('/OrderRows/addToOrder', { items, @@ -30,6 +32,10 @@ const addToOrder = async () => { notify(t('globals.dataSaved'), 'positive'); emit('added'); descriptorData.fetch({}); + isLoading.value = false; +}; +const canAddToOrder = () => { + return (fields.value || []).some((item) => Number(item.quantity) > 0); }; </script> @@ -68,7 +74,11 @@ const addToOrder = async () => { </tbody> </QMarkupTable> <div class="flex justify-center q-mt-lg"> - <QBtn color="primary" type="submit"> + <QBtn + color="primary" + type="submit" + :disable="!isLoading && !canAddToOrder()" + > {{ t('globals.add') }} </QBtn> </div> @@ -81,3 +91,10 @@ const addToOrder = async () => { width: 200px; } </style> + +<i18n> +es: + noAmount: La cantidad no puede ser 0 +en: + noAmount: Amount can not be 0 +</i18n> diff --git a/src/pages/Order/Card/OrderCreateDialog.vue b/src/pages/Order/Card/OrderCreateDialog.vue index 9d5c9281e..27b0171f2 100644 --- a/src/pages/Order/Card/OrderCreateDialog.vue +++ b/src/pages/Order/Card/OrderCreateDialog.vue @@ -1,5 +1,5 @@ <script setup> -import { useRoute, useRouter } from 'vue-router'; +import { useRouter } from 'vue-router'; import { onMounted, ref } from 'vue'; import { useI18n } from 'vue-i18n'; import axios from 'axios'; @@ -13,12 +13,10 @@ import { reactive } from 'vue'; import FetchData from 'components/FetchData.vue'; const { t } = useI18n(); -const route = useRoute(); const state = useState(); const ORDER_MODEL = 'order'; const router = useRouter(); -const clientList = ref([]); const agencyList = ref([]); const addressList = ref([]); defineEmits(['confirm', ...useDialogPluginComponent.emits]); diff --git a/src/pages/Ticket/Card/TicketNotes.vue b/src/pages/Ticket/Card/TicketNotes.vue index ea06cd9f6..b5302d15f 100644 --- a/src/pages/Ticket/Card/TicketNotes.vue +++ b/src/pages/Ticket/Card/TicketNotes.vue @@ -49,7 +49,13 @@ async function handleSave() { <template> <FetchData - @on-fetch="(data) => (observationTypes = data)" + @on-fetch=" + (data) => + (observationTypes = data.map((type) => { + type.label = t(`ticketNotes.observationTypes.${type.description}`); + return type; + })) + " auto-load url="ObservationTypes" /> @@ -76,7 +82,7 @@ async function handleSave() { :label="t('ticketNotes.observationType')" :options="observationTypes" hide-selected - option-label="description" + option-label="label" option-value="id" v-model="row.observationTypeFk" :disable="!!row.id" diff --git a/src/pages/Ticket/Card/TicketSummary.vue b/src/pages/Ticket/Card/TicketSummary.vue index 2ca0b5727..af96c2724 100644 --- a/src/pages/Ticket/Card/TicketSummary.vue +++ b/src/pages/Ticket/Card/TicketSummary.vue @@ -82,29 +82,6 @@ async function changeState(value) { } } -function getNoteValue(description) { - switch (description) { - case 'ItemPicker': - return t('ItemPicker'); - case 'Packager': - return t('Packager'); - case 'Delivery': - return t('Delivery'); - case 'SalesPerson': - return t('SalesPerson'); - case 'Administrative': - return t('Administrative'); - case 'Weight': - return t('Weight'); - case 'InvoiceOut': - return t('InvoiceOut'); - case 'DropOff': - return t('DropOff'); - case 'Sustitución': - return t('Sustitución'); - } -} - function toTicketUrl(section) { return '#/ticket/' + entityId.value + '/' + section; } @@ -276,23 +253,32 @@ function toTicketUrl(section) { :url="toTicketUrl('observation')" :text="t('ticket.pageTitles.notes')" /> - <VnLv - v-for="note in entity.notes" - :key="note.id" - :label="getNoteValue(note.observationType.description)" - :value="note.description" + <QVirtualScroll + :items="entity.notes" + v-slot="{ item, index }" + style="max-height: 300px" + separator > - <template #value> - <QInput - v-model="note.description" - filled - type="textarea" - class="notes" - readonly - autogrow - /> - </template> - </VnLv> + <QItem + :key="index" + class="vn-label-value" + style=" + display: inline-block; + padding: unset; + min-height: max-content; + " + > + <span class="label" style="margin-right: 4px"> + ({{ + t( + `ticketNotes.observationTypes.${item.observationType.description}` + ) + }}): + </span> + + <span>{{ item.description }}</span> + </QItem> + </QVirtualScroll> </QCard> <QCard class="vn-one"> <VnTitle :text="t('ticket.summary.summaryAmount')" /> @@ -621,28 +607,3 @@ function toTicketUrl(section) { color: $primary-light; } </style> - -<i18n> -en: - ItemPicker: Item Picker - Packager: Packager - Delivery: Delivery - SalesPerson: Sales Person - Administrative: Administrative - Weight: Weight - InvoiceOut: Invoice Out - DropOff: Drop Off - Sustitución: Sustitution -es: - ItemPicker: Items - Packager: Encajador - Delivery: Envío - SalesPerson: Comercial - Administrative: Administrativa - Weight: Peso - InvoiceOut: Facturas - DropOff: Despacho - Sustitución: Sustitución - Accepted: Aceptado - Denied: Denegado -</i18n> diff --git a/src/pages/Ticket/locale/en.yml b/src/pages/Ticket/locale/en.yml index 58367e3a2..829ea7a91 100644 --- a/src/pages/Ticket/locale/en.yml +++ b/src/pages/Ticket/locale/en.yml @@ -14,6 +14,16 @@ ticketNotes: description: Description removeNote: Remove note addNote: Add note + observationTypes: + ItemPicker: Item picker + Packager: Packager + Delivery: Delivery + SalesPerson: Sales person + Administrative: Administrative + Weight: Weight + InvoiceOut: Invoice Out + DropOff: Drop Off + Sustitución: Sustitution ticketSale: id: Id visible: Visible diff --git a/src/pages/Ticket/locale/es.yml b/src/pages/Ticket/locale/es.yml index 1acaf154b..b372e48ef 100644 --- a/src/pages/Ticket/locale/es.yml +++ b/src/pages/Ticket/locale/es.yml @@ -29,6 +29,18 @@ ticketNotes: description: Descripción removeNote: Quitar nota addNote: Añadir nota + observationTypes: + ItemPicker: Sacador + Packager: Encajador + Delivery: Envío + SalesPerson: Comercial + Administrative: Administrativa + Weight: Peso + InvoiceOut: Facturas + DropOff: Despacho + Sustitución: Sustitución + Accepted: Aceptado + Denied: Denegado purchaseRequest: Id: Id description: Descripción @@ -86,7 +98,7 @@ weeklyTickets: search: Buscar por tickets programados searchInfo: Buscar tickets programados por el identificador o el identificador del cliente advanceTickets: - preparation: Preparación + preparation: Preparación origin: Origen destination: Destinatario originAgency: 'Agencia origen: {agency}' diff --git a/src/pages/Worker/Card/WorkerBalance.vue b/src/pages/Worker/Card/WorkerBalance.vue index 037a65eaf..c5367a281 100644 --- a/src/pages/Worker/Card/WorkerBalance.vue +++ b/src/pages/Worker/Card/WorkerBalance.vue @@ -57,9 +57,21 @@ const columns = computed(() => [ field: 'concept', cardVisible: true, }, + { + align: 'right', + name: 'tableActions', + style: 'max-width: 20px; text-align: initial;', + actions: [ + { + title: t('delete'), + icon: 'delete', + action: async (row) => await tableRef.value.CrudModelRef.remove([row]), + isPrimary: true, + }, + ], + }, ]); </script> - <template> <VnTable ref="tableRef" @@ -69,7 +81,7 @@ const columns = computed(() => [ save-url="WorkerIncomes/crud" :create="{ urlCreate: 'workerIncomes', - title: t('Create workerBalance'), + title: t('Create balance'), onDataSaved: () => tableRef.reload(), formInitialData: { workerFk: entityId, @@ -81,10 +93,10 @@ const columns = computed(() => [ :right-search="false" :is-editable="true" :use-model="true" + :default-remove="false" /> </template> - <i18n> es: - Create workerBalance: Crear balance + Create balance: Crear balance </i18n> diff --git a/src/pages/Worker/Card/WorkerFormation.vue b/src/pages/Worker/Card/WorkerFormation.vue index 71c5cba5d..c11dd019e 100644 --- a/src/pages/Worker/Card/WorkerFormation.vue +++ b/src/pages/Worker/Card/WorkerFormation.vue @@ -96,10 +96,23 @@ const columns = computed(() => [ label: t('worker.formation.tableVisibleColumns.hasDiploma'), create: true, }, + { + align: 'right', + name: 'tableActions', + actions: [ + { + title: t('delete'), + icon: 'delete', + action: async (row) => await tableRef.value.CrudModelRef.remove([row]), + isPrimary: true, + }, + ], + }, ]); </script> <template> <VnTable + class="worker-formation" ref="tableRef" data-key="WorkerFormation" :url="`Workers/${entityId}/trainingCourse`" @@ -120,8 +133,15 @@ const columns = computed(() => [ :right-search="false" :is-editable="true" :use-model="true" + :default-remove="false" /> </template> +<style lang="scss" scoped> +:global(.worker-formation thead > tr > th:nth-child(7)), +:global(.worker-formation thead > tr > th:nth-child(8)) { + max-width: 50px; +} +</style> <i18n> es: Create training course: Crear curso de formación diff --git a/src/pages/Worker/Card/WorkerMedical.vue b/src/pages/Worker/Card/WorkerMedical.vue index 6bca4ae85..fab1416c9 100644 --- a/src/pages/Worker/Card/WorkerMedical.vue +++ b/src/pages/Worker/Card/WorkerMedical.vue @@ -65,6 +65,18 @@ const columns = [ create: true, component: 'input', }, + { + align: 'right', + name: 'tableActions', + actions: [ + { + title: t('delete'), + icon: 'delete', + action: async (row) => await tableRef.value.CrudModelRef.remove([row]), + isPrimary: true, + }, + ], + }, ]; </script> <template> @@ -87,5 +99,6 @@ const columns = [ :right-search="false" :is-editable="true" :use-model="true" + :default-remove="false" /> </template> diff --git a/src/pages/Worker/Card/WorkerTimeControl.vue b/src/pages/Worker/Card/WorkerTimeControl.vue index fbfd4b28d..39fb536b6 100644 --- a/src/pages/Worker/Card/WorkerTimeControl.vue +++ b/src/pages/Worker/Card/WorkerTimeControl.vue @@ -326,16 +326,20 @@ const updateData = async () => { }; const getMailStates = async (date) => { + const url = `WorkerTimeControls/${route.params.id}/getMailStates`; + const month = date.getMonth() + 1; + const prevMonth = month == 1 ? 12 : month - 1; const params = { - month: date.getMonth() + 1, + month, year: date.getFullYear(), }; - const { data } = await axios.get( - `WorkerTimeControls/${route.params.id}/getMailStates`, - { params } - ); - workerTimeControlMails.value = data; + const curMonthStates = (await axios.get(url, { params })).data; + const prevMonthStates = ( + await axios.get(url, { params: { ...params, month: prevMonth } }) + ).data; + + workerTimeControlMails.value = curMonthStates.concat(prevMonthStates); }; const showWorkerTimeForm = (propValue, formType) => { diff --git a/src/pages/Worker/WorkerFilter.vue b/src/pages/Worker/WorkerFilter.vue index 765241341..dfb5659fe 100644 --- a/src/pages/Worker/WorkerFilter.vue +++ b/src/pages/Worker/WorkerFilter.vue @@ -7,7 +7,7 @@ import VnFilterPanel from 'src/components/ui/VnFilterPanel.vue'; import VnInput from 'src/components/common/VnInput.vue'; import VnSelect from 'src/components/common/VnSelect.vue'; -const { t } = useI18n(); +const { t, te } = useI18n(); const props = defineProps({ dataKey: { type: String, @@ -16,6 +16,11 @@ const props = defineProps({ }); const departments = ref(); + +const getLocale = (label) => { + const globalLocale = `globals.params.${label}`; + return te(globalLocale) ? t(globalLocale) : t(`params.${label}`); +}; </script> <template> @@ -23,7 +28,7 @@ const departments = ref(); <VnFilterPanel :data-key="props.dataKey" :search-button="true"> <template #tags="{ tag, formatFn }"> <div class="q-gutter-x-xs"> - <strong>{{ t(`params.${tag.label}`) }}: </strong> + <strong>{{ getLocale(tag.label) }}: </strong> <span>{{ formatFn(tag.value) }}</span> </div> </template> @@ -64,10 +69,7 @@ const departments = ref(); </QItemSection> </QItem> <QItem> - <QItemSection v-if="!departments"> - <QSkeleton type="QInput" class="full-width" /> - </QItemSection> - <QItemSection v-if="departments"> + <QItemSection> <VnSelect :label="t('Department')" v-model="params.departmentFk" @@ -82,6 +84,11 @@ const departments = ref(); /> </QItemSection> </QItem> + <QItem> + <QItemSection> + <VnInput :label="t('Email')" v-model="params.email" is-outlined /> + </QItemSection> + </QItem> <QItem> <QItemSection> <VnInput @@ -99,23 +106,17 @@ const departments = ref(); en: params: search: Contains - fi: FI firstName: First name lastName: Last name userName: User extension: Extension - departmentFk: Department - id: ID es: params: search: Contiene - fi: NIF firstName: Nombre lastName: Apellidos userName: Usuario extension: Extensión - departmentFk: Departamento - id: ID FI: NIF First Name: Nombre Last Name: Apellidos diff --git a/src/pages/Worker/WorkerList.vue b/src/pages/Worker/WorkerList.vue index f4ae20591..9795cbed0 100644 --- a/src/pages/Worker/WorkerList.vue +++ b/src/pages/Worker/WorkerList.vue @@ -39,13 +39,31 @@ const columns = computed(() => [ }, { align: 'left', - name: 'nickname', - label: t('tableColumns.name'), + name: 'firstName', + label: t('tableColumns.firstName'), isTitle: true, columnFilter: { name: 'firstName', }, }, + { + align: 'left', + name: 'lastName', + label: t('tableColumns.lastName'), + isTitle: true, + columnFilter: { + name: 'lastName', + }, + }, + { + align: 'left', + name: 'nickname', + label: t('tableColumns.userName'), + isTitle: true, + columnFilter: { + name: 'userName', + }, + }, { align: 'left', name: 'departmentFk', @@ -66,10 +84,17 @@ const columns = computed(() => [ label: t('tableColumns.email'), cardVisible: true, columnFilter: { - alias: 'mu', - inWhere: true, + name: 'email', + }, + }, + { + align: 'left', + name: 'extension', + label: t('tableColumns.extension'), + cardVisible: true, + columnFilter: { + name: 'extension', }, - hidden: true, }, { align: 'right', @@ -180,7 +205,7 @@ async function autofillBic(worker) { default-mode="table" redirect="worker" :right-search="false" - auto-load + :order="['id DESC']" > <template #more-create-dialog="{ data }"> <div class="q-pa-lg full-width"> diff --git a/src/pages/Worker/locale/en.yml b/src/pages/Worker/locale/en.yml index 96764ffd1..8276977fd 100644 --- a/src/pages/Worker/locale/en.yml +++ b/src/pages/Worker/locale/en.yml @@ -1,7 +1,12 @@ passwordRequirements: 'The password must have at least { length } length characters, {nAlpha} alphabetic characters, {nUpper} capital letters, {nDigits} digits and {nPunct} symbols (Ex: $%&.)\n' tableColumns: id: ID - name: Name + firstName: First name + lastName: Last Name + userName: User Name department: Department email: Email + fi: FI + SSN: SSN + extension: Extension queue: Queue diff --git a/src/pages/Worker/locale/es.yml b/src/pages/Worker/locale/es.yml index cf6bc3afe..9c7618bc3 100644 --- a/src/pages/Worker/locale/es.yml +++ b/src/pages/Worker/locale/es.yml @@ -6,7 +6,12 @@ External: Externo passwordRequirements: 'La contraseña debe tener al menos { length } caracteres de longitud, {nAlpha} caracteres alfabéticos, {nUpper} letras mayúsculas, {nDigits} dígitos y {nPunct} símbolos (Ej: $%&.)' tableColumns: id: ID - name: Nombre + firstName: Nombre + lastName: Apellidos + userName: Nombre de usuario department: Departamento email: Email + fi: NIF + SSN: NSS + extension: Extensión queue: Cola diff --git a/src/pages/Zone/ZoneDeliveryPanel.vue b/src/pages/Zone/ZoneDeliveryPanel.vue index d6c96b935..088811b01 100644 --- a/src/pages/Zone/ZoneDeliveryPanel.vue +++ b/src/pages/Zone/ZoneDeliveryPanel.vue @@ -94,7 +94,7 @@ watch( url="Postcodes/location" :fields="['geoFk', 'code', 'townFk', 'countryFk']" sort-by="code, townFk" - option-value="geoFk" + option-value="code" option-label="code" option-filter="code" hide-selected diff --git a/src/router/modules/entry.js b/src/router/modules/entry.js index 4750a4301..3add239df 100644 --- a/src/router/modules/entry.js +++ b/src/router/modules/entry.js @@ -12,7 +12,13 @@ export default { component: RouterView, redirect: { name: 'EntryMain' }, menus: { - main: ['EntryList', 'MyEntries', 'EntryLatestBuys', 'EntryStockBought'], + main: [ + 'EntryList', + 'MyEntries', + 'EntryLatestBuys', + 'EntryStockBought', + 'EntryWasteRecalc', + ], card: ['EntryBasicData', 'EntryBuys', 'EntryNotes', 'EntryDms', 'EntryLog'], }, children: [ @@ -67,6 +73,15 @@ export default { }, component: () => import('src/pages/Entry/EntryStockBought.vue'), }, + { + path: 'waste-recalc', + name: 'EntryWasteRecalc', + meta: { + title: 'wasteRecalc', + icon: 'compost', + }, + component: () => import('src/pages/Entry/EntryWasteRecalc.vue'), + }, ], }, { diff --git a/src/router/modules/worker.js b/src/router/modules/worker.js index b2716474b..7258881be 100644 --- a/src/router/modules/worker.js +++ b/src/router/modules/worker.js @@ -168,6 +168,7 @@ export default { meta: { title: 'log', icon: 'vn:History', + acls: [{ model: 'WorkerLog', props: 'find', accessType: 'READ' }], }, component: () => import('src/pages/Worker/Card/WorkerLog.vue'), },