diff --git a/src/components/ItemsFilterPanel.vue b/src/components/ItemsFilterPanel.vue index f73753a6b..0f1e3f1eb 100644 --- a/src/components/ItemsFilterPanel.vue +++ b/src/components/ItemsFilterPanel.vue @@ -198,8 +198,7 @@ const setCategoryList = (data) => { v-model="params.typeFk" :options="itemTypesOptions" dense - outlined - rounded + filled use-input :disable="!selectedCategoryFk" @update:model-value=" @@ -235,8 +234,7 @@ const setCategoryList = (data) => { v-model="value.selectedTag" :options="tagOptions" dense - outlined - rounded + filled :emit-value="false" use-input :is-clearable="false" @@ -252,8 +250,7 @@ const setCategoryList = (data) => { option-value="value" option-label="value" dense - outlined - rounded + filled emit-value use-input :disable="!value" @@ -265,7 +262,6 @@ const setCategoryList = (data) => { v-model="value.value" :label="t('components.itemsFilterPanel.value')" :disable="!value" - is-outlined :is-clearable="false" @keyup.enter="applyTags(params, searchFn)" /> diff --git a/src/components/VnTable/VnTable.vue b/src/components/VnTable/VnTable.vue index c64217198..e8dd1b526 100644 --- a/src/components/VnTable/VnTable.vue +++ b/src/components/VnTable/VnTable.vue @@ -633,6 +633,7 @@ const rowCtrlClickFunction = computed(() => { :data-key="$attrs['data-key']" :columns="columns" :redirect="redirect" + v-bind="$attrs?.['table-filter']" > <template v-for="(_, slotName) in $slots" diff --git a/src/components/common/VnCard.vue b/src/components/common/VnCard.vue index 620dc2ad2..21cdc9df5 100644 --- a/src/components/common/VnCard.vue +++ b/src/components/common/VnCard.vue @@ -1,12 +1,15 @@ <script setup> -import { onBeforeMount } from 'vue'; -import { useRouter, onBeforeRouteUpdate, onBeforeRouteLeave } from 'vue-router'; +import { onBeforeMount, computed } from 'vue'; +import { useRoute, useRouter, onBeforeRouteUpdate, onBeforeRouteLeave } from 'vue-router'; import { useArrayData } from 'src/composables/useArrayData'; import { useStateStore } from 'stores/useStateStore'; import useCardSize from 'src/composables/useCardSize'; import VnSubToolbar from '../ui/VnSubToolbar.vue'; +const emit = defineEmits(['onFetch']); + const props = defineProps({ + id: { type: Number, required: false, default: null }, dataKey: { type: String, required: true }, url: { type: String, default: undefined }, idInWhere: { type: Boolean, default: false }, @@ -16,10 +19,13 @@ const props = defineProps({ searchDataKey: { type: String, default: undefined }, searchbarProps: { type: Object, default: undefined }, redirectOnError: { type: Boolean, default: false }, + visual: { type: Boolean, default: true }, }); +const route = useRoute(); const stateStore = useStateStore(); const router = useRouter(); +const entityId = computed(() => props.id || route?.params?.id); const arrayData = useArrayData(props.dataKey, { url: props.url, userFilter: props.filter, @@ -35,7 +41,7 @@ onBeforeMount(async () => { const route = router.currentRoute.value; try { - await fetch(route.params.id); + await fetch(entityId.value); } catch { const { matched: matches } = route; const { path } = matches.at(-1); @@ -51,8 +57,7 @@ onBeforeRouteUpdate(async (to, from) => { router.push({ name, params: to.params }); } } - const id = to.params.id; - if (id !== from.params.id) await fetch(id, true); + if (entityId.value !== to.params.id) await fetch(to.params.id, true); }); async function fetch(id, append = false) { @@ -61,14 +66,17 @@ async function fetch(id, append = false) { else if (!regex.test(props.url)) arrayData.store.url = `${props.url}/${id}`; else arrayData.store.url = props.url.replace(regex, `/${id}`); await arrayData.fetch({ append, updateRouter: false }); + emit('onFetch', arrayData.store.data); } function hasRouteParam(params, valueToCheck = ':addressId') { return Object.values(params).includes(valueToCheck); } </script> <template> - <VnSubToolbar /> - <div :class="[useCardSize(), $attrs.class]"> - <RouterView :key="$route.path" /> - </div> + <template v-if="visual"> + <VnSubToolbar /> + <div :class="[useCardSize(), $attrs.class]"> + <RouterView :key="$route.path" /> + </div> + </template> </template> diff --git a/src/components/common/VnLog.vue b/src/components/common/VnLog.vue index 136dbf2a4..a05da264b 100644 --- a/src/components/common/VnLog.vue +++ b/src/components/common/VnLog.vue @@ -708,6 +708,7 @@ watch( v-model="searchInput" class="full-width" clearable + filled clear-icon="close" @keyup.enter="() => selectFilter('search')" @focusout="() => selectFilter('search')" @@ -727,6 +728,7 @@ watch( v-model="selectedFilters.changedModel" option-label="locale" option-value="value" + filled :options="actions" @update:model-value="selectFilter('action')" hide-selected @@ -752,8 +754,7 @@ watch( class="full-width" :label="t('globals.user')" v-model="userSelect" - option-label="name" - option-value="id" + filled :url="`${model}Logs/${route.params.id}/editors`" :fields="['id', 'nickname', 'name', 'image']" sort-by="nickname" @@ -782,6 +783,7 @@ watch( :label="t('globals.changes')" v-model="changeInput" class="full-width" + filled clearable clear-icon="close" @keyup.enter="selectFilter('change')" @@ -818,6 +820,7 @@ watch( @clear="selectFilter('date', 'to')" v-model="dateFrom" clearable + filled clear-icon="close" /> </QItem> @@ -830,6 +833,7 @@ watch( @clear="selectFilter('date', 'from')" v-model="dateTo" clearable + filled clear-icon="close" /> </QItem> @@ -843,6 +847,7 @@ watch( dense flat minimal + filled @update:model-value=" (value) => { dateFromDialog = false; diff --git a/src/components/common/__tests__/VnDmsList.spec.js b/src/components/common/__tests__/VnDmsList.spec.js index 9649943a2..22101239e 100644 --- a/src/components/common/__tests__/VnDmsList.spec.js +++ b/src/components/common/__tests__/VnDmsList.spec.js @@ -4,12 +4,15 @@ import { vi, afterEach, beforeAll, describe, expect, it } from 'vitest'; describe('VnDmsList', () => { let vm; - const dms = { - userFk: 1, - name: 'DMS 1' + const dms = { + userFk: 1, + name: 'DMS 1', }; - + beforeAll(() => { + vi.mock('src/composables/getUrl', () => ({ + getUrl: vi.fn().mockResolvedValue(''), + })); vi.spyOn(axios, 'get').mockResolvedValue({ data: [] }); vm = createWrapper(VnDmsList, { props: { @@ -18,8 +21,8 @@ describe('VnDmsList', () => { filter: 'wd.workerFk', updateModel: 'Workers', deleteModel: 'WorkerDms', - downloadModel: 'WorkerDms' - } + downloadModel: 'WorkerDms', + }, }).vm; }); @@ -29,46 +32,45 @@ describe('VnDmsList', () => { describe('setData()', () => { const data = [ - { - userFk: 1, + { + userFk: 1, name: 'Jessica', lastName: 'Jones', file: '4.jpg', - created: '2021-07-28 21:00:00' + created: '2021-07-28 21:00:00', }, - { - userFk: 2, + { + userFk: 2, name: 'Bruce', lastName: 'Banner', created: '2022-07-28 21:00:00', dms: { - userFk: 2, + userFk: 2, name: 'Bruce', lastName: 'BannerDMS', created: '2022-07-28 21:00:00', file: '4.jpg', - } + }, }, { userFk: 3, name: 'Natasha', lastName: 'Romanoff', file: '4.jpg', - created: '2021-10-28 21:00:00' - } - ] + created: '2021-10-28 21:00:00', + }, + ]; it('Should replace objects that contain the "dms" property with the value of the same and sort by creation date', () => { vm.setData(data); expect([vm.rows][0][0].lastName).toEqual('BannerDMS'); expect([vm.rows][0][1].lastName).toEqual('Romanoff'); - }); }); describe('parseDms()', () => { - const resultDms = { ...dms, userId:1}; - + const resultDms = { ...dms, userId: 1 }; + it('Should add properties that end with "Fk" by changing the suffix to "Id"', () => { const parsedDms = vm.parseDms(dms); expect(parsedDms).toEqual(resultDms); @@ -76,12 +78,12 @@ describe('VnDmsList', () => { }); describe('showFormDialog()', () => { - const resultDms = { ...dms, userId:1}; - + const resultDms = { ...dms, userId: 1 }; + it('should call fn parseDms() and set show true if dms is defined', () => { vm.showFormDialog(dms); expect(vm.formDialog.show).toEqual(true); expect(vm.formDialog.dms).toEqual(resultDms); }); }); -}); \ No newline at end of file +}); diff --git a/src/components/ui/CardDescriptor.vue b/src/components/ui/CardDescriptor.vue index b7d03127c..5f9a89d64 100644 --- a/src/components/ui/CardDescriptor.vue +++ b/src/components/ui/CardDescriptor.vue @@ -1,375 +1,38 @@ <script setup> -import { onBeforeMount, watch, computed, ref } from 'vue'; -import { useI18n } from 'vue-i18n'; -import SkeletonDescriptor from 'components/ui/SkeletonDescriptor.vue'; -import { useArrayData } from 'composables/useArrayData'; -import { useSummaryDialog } from 'src/composables/useSummaryDialog'; -import { useState } from 'src/composables/useState'; -import { useRoute, useRouter } from 'vue-router'; -import { useClipboard } from 'src/composables/useClipboard'; -import VnMoreOptions from './VnMoreOptions.vue'; +import { ref } from 'vue'; +import VnDescriptor from './VnDescriptor.vue'; const $props = defineProps({ - url: { - type: String, - default: '', - }, - filter: { - type: Object, - default: null, - }, - title: { - type: String, - default: '', - }, - subtitle: { + id: { type: Number, - default: null, + default: false, }, - dataKey: { - type: String, - default: null, - }, - summary: { + card: { type: Object, default: null, }, - width: { - type: String, - default: 'md-width', - }, - toModule: { - type: String, - default: null, - }, }); -const state = useState(); -const route = useRoute(); -const router = useRouter(); -const { t } = useI18n(); -const { copyText } = useClipboard(); -const { viewSummary } = useSummaryDialog(); -let arrayData; -let store; -let entity; -const isLoading = ref(false); -const isSameDataKey = computed(() => $props.dataKey === route.meta.moduleName); -const DESCRIPTOR_PROXY = 'DescriptorProxy'; -const moduleName = ref(); -const isSameModuleName = route.matched[1].meta.moduleName !== moduleName.value; -defineExpose({ getData }); - -onBeforeMount(async () => { - arrayData = useArrayData($props.dataKey, { - url: $props.url, - userFilter: $props.filter, - skip: 0, - oneRecord: true, - }); - store = arrayData.store; - entity = computed(() => { - const data = store.data ?? {}; - if (data) emit('onFetch', data); - return data; - }); - - // It enables to load data only once if the module is the same as the dataKey - if (!isSameDataKey.value || !route.params.id) await getData(); - watch( - () => [$props.url, $props.filter], - async () => { - if (!isSameDataKey.value) await getData(); - }, - ); -}); - -function getName() { - let name = $props.dataKey; - if ($props.dataKey.includes(DESCRIPTOR_PROXY)) { - name = name.split(DESCRIPTOR_PROXY)[0]; - } - return name; -} -const routeName = computed(() => { - let routeName = getName(); - return `${routeName}Summary`; -}); - -async function getData() { - store.url = $props.url; - store.filter = $props.filter ?? {}; - isLoading.value = true; - try { - const { data } = await arrayData.fetch({ append: false, updateRouter: false }); - state.set($props.dataKey, data); - emit('onFetch', data); - } finally { - isLoading.value = false; - } -} - -function getValueFromPath(path) { - if (!path) return; - const keys = path.toString().split('.'); - let current = entity.value; - - for (const key of keys) { - if (current[key] === undefined) return undefined; - else current = current[key]; - } - return current; -} - -function copyIdText(id) { - copyText(id, { - component: { - copyValue: id, - }, - }); -} - const emit = defineEmits(['onFetch']); - -const iconModule = computed(() => { - moduleName.value = getName(); - if ($props.toModule) { - return router.getRoutes().find((r) => r.name === $props.toModule.name).meta.icon; - } - if (isSameModuleName) { - return router.options.routes[1].children.find((r) => r.name === moduleName.value) - ?.meta?.icon; - } else { - return route.matched[1].meta.icon; - } -}); - -const toModule = computed(() => { - moduleName.value = getName(); - if ($props.toModule) return $props.toModule; - if (isSameModuleName) { - return router.options.routes[1].children.find((r) => r.name === moduleName.value) - ?.redirect; - } else { - return route.matched[1].path.split('/').length > 2 - ? route.matched[1].redirect - : route.matched[1].children[0].redirect; - } -}); +const entity = ref(); </script> <template> - <div class="descriptor" data-cy="cardDescriptor"> - <template v-if="entity && !isLoading"> - <div class="header bg-primary q-pa-sm justify-between"> - <slot name="header-extra-action"> - <QBtn - round - flat - dense - size="md" - :icon="iconModule" - color="white" - class="link" - :to="toModule" - > - <QTooltip> - {{ t('globals.goToModuleIndex') }} - </QTooltip> - </QBtn> - </slot> - <QBtn - @click.stop="viewSummary(entity.id, $props.summary, $props.width)" - round - flat - dense - size="md" - icon="preview" - color="white" - class="link" - v-if="summary" - data-cy="openSummaryBtn" - > - <QTooltip> - {{ t('components.smartCard.openSummary') }} - </QTooltip> - </QBtn> - <RouterLink :to="{ name: routeName, params: { id: entity.id } }"> - <QBtn - class="link" - color="white" - dense - flat - icon="launch" - round - size="md" - data-cy="goToSummaryBtn" - > - <QTooltip> - {{ t('components.cardDescriptor.summary') }} - </QTooltip> - </QBtn> - </RouterLink> - <VnMoreOptions v-if="$slots.menu"> - <template #menu="{ menuRef }"> - <slot name="menu" :entity="entity" :menu-ref="menuRef" /> - </template> - </VnMoreOptions> - </div> - <slot name="before" /> - <div class="body q-py-sm"> - <QList dense> - <QItemLabel header class="ellipsis text-h5" :lines="1"> - <div class="title"> - <span - v-if="$props.title" - :title="getValueFromPath(title)" - :data-cy="`${$attrs['data-cy'] ?? 'cardDescriptor'}_title`" - > - {{ getValueFromPath(title) ?? $props.title }} - </span> - <slot v-else name="description" :entity="entity"> - <span - :title="entity.name" - :data-cy="`${$attrs['data-cy'] ?? 'cardDescriptor'}_description`" - v-text="entity.name" - /> - </slot> - </div> - </QItemLabel> - <QItem> - <QItemLabel - class="subtitle" - :data-cy="`${$attrs['data-cy'] ?? 'cardDescriptor'}_subtitle`" - > - #{{ getValueFromPath(subtitle) ?? entity.id }} - </QItemLabel> - <QBtn - round - flat - dense - size="sm" - icon="content_copy" - color="primary" - @click.stop="copyIdText(entity.id)" - > - <QTooltip> - {{ t('globals.copyId') }} - </QTooltip> - </QBtn> - </QItem> - </QList> - <div - class="list-box q-mt-xs" - :data-cy="`${$attrs['data-cy'] ?? 'cardDescriptor'}_listbox`" - > - <slot name="body" :entity="entity" /> - </div> - </div> - <div class="icons"> - <slot name="icons" :entity="entity" /> - </div> - <div class="actions justify-center" data-cy="descriptor_actions"> - <slot name="actions" :entity="entity" /> - </div> - <slot name="after" /> - </template> - <SkeletonDescriptor v-if="!entity || isLoading" /> - </div> - <QInnerLoading - :label="t('globals.pleaseWait')" - :showing="isLoading" - color="primary" - /> -</template> - -<style lang="scss"> -.body { - background-color: var(--vn-section-color); - .text-h5 { - font-size: 20px; - padding-top: 5px; - padding-bottom: 0px; - } - .q-item { - min-height: 20px; - - .link { - margin-left: 10px; - } - } - .vn-label-value { - display: flex; - padding: 0px 16px; - .label { - color: var(--vn-label-color); - font-size: 14px; - - &:not(:has(a))::after { - content: ':'; + <component + :is="card" + :id + :visual="false" + v-bind="$attrs" + @on-fetch=" + (data) => { + entity = data; + emit('onFetch', data); } - } - .value { - color: var(--vn-text-color); - font-size: 14px; - margin-left: 4px; - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; - text-align: left; - } - .info { - margin-left: 5px; - } - } -} -</style> - -<style lang="scss" scoped> -.title { - overflow: hidden; - text-overflow: ellipsis; - span { - color: var(--vn-text-color); - font-weight: bold; - } -} -.subtitle { - color: var(--vn-text-color); - font-size: 16px; - margin-bottom: 2px; -} -.list-box { - .q-item__label { - color: var(--vn-label-color); - padding-bottom: 0%; - } -} -.descriptor { - width: 256px; - .header { - display: flex; - align-items: center; - } - .icons { - margin: 0 10px; - display: flex; - justify-content: center; - .q-icon { - margin-right: 5px; - } - } - .actions { - margin: 0 5px; - justify-content: center !important; - } -} -</style> -<i18n> - en: - globals: - copyId: Copy ID - es: - globals: - copyId: Copiar ID -</i18n> + " + /> + <VnDescriptor v-model="entity" v-bind="$attrs"> + <template v-for="(_, slotName) in $slots" #[slotName]="slotData" :key="slotName"> + <slot :name="slotName" v-bind="slotData ?? {}" :key="slotName" /> + </template> + </VnDescriptor> +</template> diff --git a/src/components/ui/EntityDescriptor.vue b/src/components/ui/EntityDescriptor.vue new file mode 100644 index 000000000..a5dced551 --- /dev/null +++ b/src/components/ui/EntityDescriptor.vue @@ -0,0 +1,78 @@ +<script setup> +import { onBeforeMount, watch, computed, ref } from 'vue'; +import { useArrayData } from 'composables/useArrayData'; +import { useState } from 'src/composables/useState'; +import { useRoute } from 'vue-router'; +import VnDescriptor from './VnDescriptor.vue'; + +const $props = defineProps({ + url: { + type: String, + default: '', + }, + filter: { + type: Object, + default: null, + }, + dataKey: { + type: String, + default: null, + }, +}); + +const state = useState(); +const route = useRoute(); +let arrayData; +let store; +let entity; +const isLoading = ref(false); +const isSameDataKey = computed(() => $props.dataKey === route.meta.moduleName); +defineExpose({ getData }); + +onBeforeMount(async () => { + arrayData = useArrayData($props.dataKey, { + url: $props.url, + userFilter: $props.filter, + skip: 0, + oneRecord: true, + }); + store = arrayData.store; + entity = computed(() => { + const data = store.data ?? {}; + if (data) emit('onFetch', data); + return data; + }); + + // It enables to load data only once if the module is the same as the dataKey + if (!isSameDataKey.value || !route.params.id) await getData(); + watch( + () => [$props.url, $props.filter], + async () => { + if (!isSameDataKey.value) await getData(); + }, + ); +}); + +async function getData() { + store.url = $props.url; + store.filter = $props.filter ?? {}; + isLoading.value = true; + try { + const { data } = await arrayData.fetch({ append: false, updateRouter: false }); + state.set($props.dataKey, data); + emit('onFetch', data); + } finally { + isLoading.value = false; + } +} + +const emit = defineEmits(['onFetch']); +</script> + +<template> + <VnDescriptor v-model="entity" v-bind="$attrs" :module="dataKey"> + <template v-for="(_, slotName) in $slots" #[slotName]="slotData" :key="slotName"> + <slot :name="slotName" v-bind="slotData ?? {}" :key="slotName" /> + </template> + </VnDescriptor> +</template> diff --git a/src/components/ui/VnDescriptor.vue b/src/components/ui/VnDescriptor.vue new file mode 100644 index 000000000..47da98d74 --- /dev/null +++ b/src/components/ui/VnDescriptor.vue @@ -0,0 +1,318 @@ +<script setup> +import { computed, ref } from 'vue'; +import { useI18n } from 'vue-i18n'; +import SkeletonDescriptor from 'components/ui/SkeletonDescriptor.vue'; +import { useSummaryDialog } from 'src/composables/useSummaryDialog'; +import { useRoute, useRouter } from 'vue-router'; +import { useClipboard } from 'src/composables/useClipboard'; +import VnMoreOptions from './VnMoreOptions.vue'; + +const entity = defineModel({ type: Object, default: null }); +const $props = defineProps({ + title: { + type: String, + default: '', + }, + subtitle: { + type: Number, + default: null, + }, + summary: { + type: Object, + default: null, + }, + width: { + type: String, + default: 'md-width', + }, + module: { + type: String, + default: null, + }, + toModule: { + type: String, + default: null, + }, +}); + +const route = useRoute(); +const router = useRouter(); +const { t } = useI18n(); +const { copyText } = useClipboard(); +const { viewSummary } = useSummaryDialog(); +const DESCRIPTOR_PROXY = 'DescriptorProxy'; +const moduleName = ref(); +const isSameModuleName = route.matched[1].meta.moduleName !== moduleName.value; + +function getName() { + let name = $props.module; + if ($props.module.includes(DESCRIPTOR_PROXY)) { + name = name.split(DESCRIPTOR_PROXY)[0]; + } + return name; +} +const routeName = computed(() => { + let routeName = getName(); + return `${routeName}Summary`; +}); + +function getValueFromPath(path) { + if (!path) return; + const keys = path.toString().split('.'); + let current = entity.value; + + for (const key of keys) { + if (current[key] === undefined) return undefined; + else current = current[key]; + } + return current; +} + +function copyIdText(id) { + copyText(id, { + component: { + copyValue: id, + }, + }); +} + +const emit = defineEmits(['onFetch']); + +const iconModule = computed(() => { + moduleName.value = getName(); + if ($props.toModule) { + return router.getRoutes().find((r) => r.name === $props.toModule.name).meta.icon; + } + if (isSameModuleName) { + return router.options.routes[1].children.find((r) => r.name === moduleName.value) + ?.meta?.icon; + } else { + return route.matched[1].meta.icon; + } +}); + +const toModule = computed(() => { + moduleName.value = getName(); + if ($props.toModule) return $props.toModule; + if (isSameModuleName) { + return router.options.routes[1].children.find((r) => r.name === moduleName.value) + ?.redirect; + } else { + return route.matched[1].path.split('/').length > 2 + ? route.matched[1].redirect + : route.matched[1].children[0].redirect; + } +}); +</script> + +<template> + <div class="descriptor" data-cy="vnDescriptor"> + <template v-if="entity && entity?.id"> + <div class="header bg-primary q-pa-sm justify-between"> + <slot name="header-extra-action"> + <QBtn + round + flat + dense + size="md" + :icon="iconModule" + color="white" + class="link" + :to="toModule" + > + <QTooltip> + {{ t('globals.goToModuleIndex') }} + </QTooltip> + </QBtn> + </slot> + <QBtn + @click.stop="viewSummary(entity.id, summary, width)" + round + flat + dense + size="md" + icon="preview" + color="white" + class="link" + v-if="summary" + data-cy="openSummaryBtn" + > + <QTooltip> + {{ t('components.smartCard.openSummary') }} + </QTooltip> + </QBtn> + <RouterLink :to="{ name: routeName, params: { id: entity.id } }"> + <QBtn + class="link" + color="white" + dense + flat + icon="launch" + round + size="md" + data-cy="goToSummaryBtn" + > + <QTooltip> + {{ t('components.vnDescriptor.summary') }} + </QTooltip> + </QBtn> + </RouterLink> + <VnMoreOptions v-if="$slots.menu"> + <template #menu="{ menuRef }"> + <slot name="menu" :entity="entity" :menu-ref="menuRef" /> + </template> + </VnMoreOptions> + </div> + <slot name="before" /> + <div class="body q-py-sm"> + <QList dense> + <QItemLabel header class="ellipsis text-h5" :lines="1"> + <div class="title"> + <span + v-if="title" + :title="getValueFromPath(title)" + :data-cy="`${$attrs['data-cy'] ?? 'vnDescriptor'}_title`" + > + {{ getValueFromPath(title) ?? title }} + </span> + <slot v-else name="description" :entity="entity"> + <span + :title="entity.name" + :data-cy="`${$attrs['data-cy'] ?? 'vnDescriptor'}_description`" + v-text="entity.name" + /> + </slot> + </div> + </QItemLabel> + <QItem> + <QItemLabel + class="subtitle" + :data-cy="`${$attrs['data-cy'] ?? 'vnDescriptor'}_subtitle`" + > + #{{ getValueFromPath(subtitle) ?? entity.id }} + </QItemLabel> + <QBtn + round + flat + dense + size="sm" + icon="content_copy" + color="primary" + @click.stop="copyIdText(entity.id)" + > + <QTooltip> + {{ t('globals.copyId') }} + </QTooltip> + </QBtn> + </QItem> + </QList> + <div + class="list-box q-mt-xs" + :data-cy="`${$attrs['data-cy'] ?? 'vnDescriptor'}_listbox`" + > + <slot name="body" :entity="entity" /> + </div> + </div> + <div class="icons"> + <slot name="icons" :entity="entity" /> + </div> + <div class="actions justify-center" data-cy="descriptor_actions"> + <slot name="actions" :entity="entity" /> + </div> + <slot name="after" /> + </template> + <SkeletonDescriptor v-if="!entity" /> + </div> + <QInnerLoading :label="t('globals.pleaseWait')" :showing="!entity" color="primary" /> +</template> + +<style lang="scss"> +.body { + background-color: var(--vn-section-color); + .text-h5 { + font-size: 20px; + padding-top: 5px; + padding-bottom: 0px; + } + .q-item { + min-height: 20px; + + .link { + margin-left: 10px; + } + } + .vn-label-value { + display: flex; + padding: 0px 16px; + .label { + color: var(--vn-label-color); + font-size: 14px; + + &:not(:has(a))::after { + content: ':'; + } + } + .value { + color: var(--vn-text-color); + font-size: 14px; + margin-left: 4px; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + text-align: left; + } + .info { + margin-left: 5px; + } + } +} +</style> + +<style lang="scss" scoped> +.title { + overflow: hidden; + text-overflow: ellipsis; + span { + color: var(--vn-text-color); + font-weight: bold; + } +} +.subtitle { + color: var(--vn-text-color); + font-size: 16px; + margin-bottom: 2px; +} +.list-box { + .q-item__label { + color: var(--vn-label-color); + padding-bottom: 0%; + } +} +.descriptor { + width: 256px; + .header { + display: flex; + align-items: center; + } + .icons { + margin: 0 10px; + display: flex; + justify-content: center; + .q-icon { + margin-right: 5px; + } + } + .actions { + margin: 0 5px; + justify-content: center !important; + } +} +</style> +<i18n> + en: + globals: + copyId: Copy ID + es: + globals: + copyId: Copiar ID +</i18n> diff --git a/src/composables/__tests__/downloadFile.spec.js b/src/composables/__tests__/downloadFile.spec.js index f53b56b3e..f83a973b0 100644 --- a/src/composables/__tests__/downloadFile.spec.js +++ b/src/composables/__tests__/downloadFile.spec.js @@ -6,10 +6,12 @@ const session = useSession(); const token = session.getToken(); describe('downloadFile', () => { - const baseUrl = 'http://localhost:9000'; let defaulCreateObjectURL; beforeAll(() => { + vi.mock('src/composables/getUrl', () => ({ + getUrl: vi.fn().mockResolvedValue(''), + })); defaulCreateObjectURL = window.URL.createObjectURL; window.URL.createObjectURL = vi.fn(() => 'blob:http://localhost:9000/blob-id'); }); @@ -22,15 +24,14 @@ describe('downloadFile', () => { headers: { 'content-disposition': 'attachment; filename="test-file.txt"' }, }; vi.spyOn(axios, 'get').mockImplementation((url) => { - if (url == 'Urls/getUrl') return Promise.resolve({ data: baseUrl }); - else if (url.includes('downloadFile')) return Promise.resolve(res); + if (url.includes('downloadFile')) return Promise.resolve(res); }); await downloadFile(1); expect(axios.get).toHaveBeenCalledWith( - `${baseUrl}/api/dms/1/downloadFile?access_token=${token}`, - { responseType: 'blob' } + `/api/dms/1/downloadFile?access_token=${token}`, + { responseType: 'blob' }, ); }); }); diff --git a/src/composables/downloadFile.js b/src/composables/downloadFile.js index 4588265a2..302836e09 100644 --- a/src/composables/downloadFile.js +++ b/src/composables/downloadFile.js @@ -5,20 +5,30 @@ import { exportFile } from 'quasar'; const { getTokenMultimedia } = useSession(); const token = getTokenMultimedia(); +const appUrl = (await getUrl('', 'lilium')).replace('/#/', ''); export async function downloadFile(id, model = 'dms', urlPath = '/downloadFile', url) { - const appUrl = (await getUrl('', 'lilium')).replace('/#/', ''); const response = await axios.get( url ?? `${appUrl}/api/${model}/${id}${urlPath}?access_token=${token}`, { responseType: 'blob' } ); + download(response); +} + +export async function downloadDocuware(url, params) { + const response = await axios.get(`${appUrl}/api/` + url, { + responseType: 'blob', + params, + }); + + download(response); +} + +function download(response) { const contentDisposition = response.headers['content-disposition']; const matches = /filename[^;=\n]*=((['"]).*?\2|[^;\n]*)/.exec(contentDisposition); - const filename = - matches != null && matches[1] - ? matches[1].replace(/['"]/g, '') - : 'downloaded-file'; + const filename = matches?.[1] ? matches[1].replace(/['"]/g, '') : 'downloaded-file'; exportFile(filename, response.data); } diff --git a/src/i18n/locale/en.yml b/src/i18n/locale/en.yml index 6be11b5ed..7374cda68 100644 --- a/src/i18n/locale/en.yml +++ b/src/i18n/locale/en.yml @@ -646,6 +646,7 @@ worker: model: Model serialNumber: Serial number removePDA: Deallocate PDA + sendToTablet: Send to tablet create: lastName: Last name birth: Birth diff --git a/src/i18n/locale/es.yml b/src/i18n/locale/es.yml index 55e5abd95..f0ce53e37 100644 --- a/src/i18n/locale/es.yml +++ b/src/i18n/locale/es.yml @@ -731,6 +731,7 @@ worker: model: Modelo serialNumber: Número de serie removePDA: Desasignar PDA + sendToTablet: Enviar a la tablet create: lastName: Apellido birth: Fecha de nacimiento diff --git a/src/pages/Account/AccountFilter.vue b/src/pages/Account/AccountFilter.vue index 50c3ee1ac..732e92f77 100644 --- a/src/pages/Account/AccountFilter.vue +++ b/src/pages/Account/AccountFilter.vue @@ -47,7 +47,7 @@ const rolesOptions = ref([]); :label="t('globals.name')" v-model="params.name" lazy-rules - is-outlined + filled /> </QItemSection> </QItem> @@ -57,7 +57,7 @@ const rolesOptions = ref([]); :label="t('account.card.alias')" v-model="params.nickname" lazy-rules - is-outlined + filled /> </QItemSection> </QItem> @@ -75,8 +75,7 @@ const rolesOptions = ref([]); use-input hide-selected dense - outlined - rounded + filled :input-debounce="0" /> </QItemSection> diff --git a/src/pages/Account/Acls/AclFilter.vue b/src/pages/Account/Acls/AclFilter.vue index 8035f92b8..222fe5b77 100644 --- a/src/pages/Account/Acls/AclFilter.vue +++ b/src/pages/Account/Acls/AclFilter.vue @@ -56,8 +56,7 @@ onBeforeMount(() => { option-label="name" use-input dense - outlined - rounded + filled /> </QItemSection> </QItem> @@ -72,8 +71,7 @@ onBeforeMount(() => { option-label="name" use-input dense - outlined - rounded + filled /> </QItemSection> </QItem> @@ -83,7 +81,7 @@ onBeforeMount(() => { :label="t('acls.aclFilter.property')" v-model="params.property" lazy-rules - is-outlined + filled /> </QItemSection> </QItem> @@ -98,8 +96,7 @@ onBeforeMount(() => { option-label="name" use-input dense - outlined - rounded + filled /> </QItemSection> </QItem> @@ -114,8 +111,7 @@ onBeforeMount(() => { option-label="name" use-input dense - outlined - rounded + filled /> </QItemSection> </QItem> diff --git a/src/pages/Account/Alias/Card/AliasDescriptor.vue b/src/pages/Account/Alias/Card/AliasDescriptor.vue index 7f6992bf0..957047cc3 100644 --- a/src/pages/Account/Alias/Card/AliasDescriptor.vue +++ b/src/pages/Account/Alias/Card/AliasDescriptor.vue @@ -4,7 +4,7 @@ import { useRoute, useRouter } from 'vue-router'; import { useI18n } from 'vue-i18n'; import { useQuasar } from 'quasar'; -import CardDescriptor from 'components/ui/CardDescriptor.vue'; +import EntityDescriptor from 'components/ui/EntityDescriptor.vue'; import VnLv from 'src/components/ui/VnLv.vue'; import axios from 'axios'; @@ -48,7 +48,7 @@ const removeAlias = () => { </script> <template> - <CardDescriptor + <EntityDescriptor ref="descriptor" :url="`MailAliases/${entityId}`" data-key="Alias" @@ -63,7 +63,7 @@ const removeAlias = () => { <template #body="{ entity }"> <VnLv :label="t('role.description')" :value="entity.description" /> </template> - </CardDescriptor> + </EntityDescriptor> </template> <i18n> diff --git a/src/pages/Account/Card/AccountDescriptor.vue b/src/pages/Account/Card/AccountDescriptor.vue index 49328fe87..eb0a9013c 100644 --- a/src/pages/Account/Card/AccountDescriptor.vue +++ b/src/pages/Account/Card/AccountDescriptor.vue @@ -1,7 +1,7 @@ <script setup> import { ref, computed, onMounted } from 'vue'; import { useRoute } from 'vue-router'; -import CardDescriptor from 'components/ui/CardDescriptor.vue'; +import EntityDescriptor from 'components/ui/EntityDescriptor.vue'; import VnLv from 'src/components/ui/VnLv.vue'; import AccountDescriptorMenu from './AccountDescriptorMenu.vue'; import VnImg from 'src/components/ui/VnImg.vue'; @@ -20,7 +20,7 @@ onMounted(async () => { </script> <template> - <CardDescriptor + <EntityDescriptor ref="descriptor" :url="`VnUsers/preview`" :filter="{ ...filter, where: { id: entityId } }" @@ -78,7 +78,7 @@ onMounted(async () => { </QIcon> </QCardActions> </template> - </CardDescriptor> + </EntityDescriptor> </template> <style scoped> .q-item__label { diff --git a/src/pages/Account/Role/AccountRolesFilter.vue b/src/pages/Account/Role/AccountRolesFilter.vue index cbe7a70c8..1358236c6 100644 --- a/src/pages/Account/Role/AccountRolesFilter.vue +++ b/src/pages/Account/Role/AccountRolesFilter.vue @@ -27,7 +27,7 @@ const props = defineProps({ :label="t('globals.name')" v-model="params.name" lazy-rules - is-outlined + filled /> </QItemSection> </QItem> @@ -37,7 +37,7 @@ const props = defineProps({ :label="t('role.description')" v-model="params.description" lazy-rules - is-outlined + filled /> </QItemSection> </QItem> diff --git a/src/pages/Account/Role/Card/RoleDescriptor.vue b/src/pages/Account/Role/Card/RoleDescriptor.vue index 051359702..698bea4fa 100644 --- a/src/pages/Account/Role/Card/RoleDescriptor.vue +++ b/src/pages/Account/Role/Card/RoleDescriptor.vue @@ -2,7 +2,7 @@ import { computed } from 'vue'; import { useRoute } from 'vue-router'; import { useI18n } from 'vue-i18n'; -import CardDescriptor from 'components/ui/CardDescriptor.vue'; +import EntityDescriptor from 'components/ui/EntityDescriptor.vue'; import VnLv from 'src/components/ui/VnLv.vue'; import axios from 'axios'; import useNotify from 'src/composables/useNotify.js'; @@ -32,7 +32,7 @@ const removeRole = async () => { </script> <template> - <CardDescriptor + <EntityDescriptor url="VnRoles" :filter="{ where: { id: entityId } }" data-key="Role" @@ -47,7 +47,7 @@ const removeRole = async () => { <template #body="{ entity }"> <VnLv :label="t('role.description')" :value="entity.description" /> </template> - </CardDescriptor> + </EntityDescriptor> </template> <style scoped> .q-item__label { diff --git a/src/pages/Claim/Card/ClaimDescriptor.vue b/src/pages/Claim/Card/ClaimDescriptor.vue index d789b63d3..76ede81ed 100644 --- a/src/pages/Claim/Card/ClaimDescriptor.vue +++ b/src/pages/Claim/Card/ClaimDescriptor.vue @@ -6,7 +6,7 @@ import { toDateHourMinSec, toPercentage } from 'src/filters'; import TicketDescriptorProxy from 'pages/Ticket/Card/TicketDescriptorProxy.vue'; import ClaimDescriptorMenu from 'pages/Claim/Card/ClaimDescriptorMenu.vue'; import DepartmentDescriptorProxy from 'src/pages/Worker/Department/Card/DepartmentDescriptorProxy.vue'; -import CardDescriptor from 'components/ui/CardDescriptor.vue'; +import EntityDescriptor from 'components/ui/EntityDescriptor.vue'; import VnLv from 'src/components/ui/VnLv.vue'; import VnUserLink from 'src/components/ui/VnUserLink.vue'; import { getUrl } from 'src/composables/getUrl'; @@ -44,7 +44,7 @@ onMounted(async () => { </script> <template> - <CardDescriptor + <EntityDescriptor :url="`Claims/${entityId}`" :filter="filter" title="client.name" @@ -147,7 +147,7 @@ onMounted(async () => { </QBtn> </QCardActions> </template> - </CardDescriptor> + </EntityDescriptor> </template> <style scoped> .q-item__label { diff --git a/src/pages/Claim/ClaimFilter.vue b/src/pages/Claim/ClaimFilter.vue index 37146865c..51460f7e4 100644 --- a/src/pages/Claim/ClaimFilter.vue +++ b/src/pages/Claim/ClaimFilter.vue @@ -33,7 +33,7 @@ const props = defineProps({ :label="t('claim.customerId')" v-model="params.clientFk" lazy-rules - is-outlined + filled > <template #prepend> <QIcon name="badge" size="xs" /></template> </VnInput> @@ -41,12 +41,11 @@ const props = defineProps({ :label="t('Client Name')" v-model="params.clientName" lazy-rules - is-outlined + filled /> <VnSelect - outlined dense - rounded + filled :label="t('globals.params.departmentFk')" v-model="params.departmentFk" option-value="id" @@ -61,8 +60,7 @@ const props = defineProps({ :use-like="false" option-filter="firstName" dense - outlined - rounded + filled /> <VnSelect :label="t('claim.state')" @@ -70,14 +68,12 @@ const props = defineProps({ :options="states" option-label="description" dense - outlined - rounded + filled /> <VnInputDate v-model="params.created" :label="t('claim.created')" - outlined - rounded + filled dense /> <VnSelect @@ -86,8 +82,7 @@ const props = defineProps({ url="Items/withName" :use-like="false" sort-by="id DESC" - outlined - rounded + filled dense /> <VnSelect @@ -98,15 +93,13 @@ const props = defineProps({ :use-like="false" option-filter="firstName" dense - outlined - rounded + filled /> <VnSelect :label="t('claim.zone')" v-model="params.zoneFk" url="Zones" - outlined - rounded + filled dense /> <QCheckbox diff --git a/src/pages/Customer/Card/CustomerDescriptor.vue b/src/pages/Customer/Card/CustomerDescriptor.vue index 8978c00f1..cd18cf2c9 100644 --- a/src/pages/Customer/Card/CustomerDescriptor.vue +++ b/src/pages/Customer/Card/CustomerDescriptor.vue @@ -7,7 +7,7 @@ import { toCurrency, toDate } from 'src/filters'; import useCardDescription from 'src/composables/useCardDescription'; -import CardDescriptor from 'components/ui/CardDescriptor.vue'; +import EntityDescriptor from 'components/ui/EntityDescriptor.vue'; import VnLv from 'src/components/ui/VnLv.vue'; import CustomerDescriptorMenu from './CustomerDescriptorMenu.vue'; import DepartmentDescriptorProxy from 'src/pages/Worker/Department/Card/DepartmentDescriptorProxy.vue'; @@ -54,7 +54,7 @@ const debtWarning = computed(() => { </script> <template> - <CardDescriptor + <EntityDescriptor :url="`Clients/${entityId}/getCard`" :summary="$props.summary" data-key="Customer" @@ -232,7 +232,7 @@ const debtWarning = computed(() => { </QBtn> </QCardActions> </template> - </CardDescriptor> + </EntityDescriptor> </template> <i18n> diff --git a/src/pages/Customer/CustomerFilter.vue b/src/pages/Customer/CustomerFilter.vue index 2ace6dd02..55a7f565e 100644 --- a/src/pages/Customer/CustomerFilter.vue +++ b/src/pages/Customer/CustomerFilter.vue @@ -41,7 +41,7 @@ const exprBuilder = (param, value) => { <template #body="{ params, searchFn }"> <QItem class="q-my-sm"> <QItemSection> - <VnInput :label="t('FI')" v-model="params.fi" is-outlined> + <VnInput :label="t('FI')" v-model="params.fi" filled> <template #prepend> <QIcon name="badge" size="xs" /> </template> @@ -50,7 +50,7 @@ const exprBuilder = (param, value) => { </QItem> <QItem class="q-mb-sm"> <QItemSection> - <VnInput :label="t('Name')" v-model="params.name" is-outlined /> + <VnInput :label="t('Name')" v-model="params.name" filled /> </QItemSection> </QItem> <QItem class="q-mb-sm"> @@ -58,16 +58,15 @@ const exprBuilder = (param, value) => { <VnInput :label="t('customer.summary.socialName')" v-model="params.socialName" - is-outlined + filled /> </QItemSection> </QItem> <QItem class="q-mb-sm"> <QItemSection> <VnSelect - outlined dense - rounded + filled :label="t('globals.params.departmentFk')" v-model="params.departmentFk" option-value="id" @@ -89,8 +88,7 @@ const exprBuilder = (param, value) => { map-options hide-selected dense - outlined - rounded + filled auto-load :input-debounce="0" /> @@ -98,12 +96,12 @@ const exprBuilder = (param, value) => { </QItem> <QItem class="q-mb-sm"> <QItemSection> - <VnInput :label="t('City')" v-model="params.city" is-outlined /> + <VnInput :label="t('City')" v-model="params.city" filled /> </QItemSection> </QItem> <QItem class="q-mb-sm"> <QItemSection> - <VnInput :label="t('Phone')" v-model="params.phone" is-outlined> + <VnInput :label="t('Phone')" v-model="params.phone" filled> <template #prepend> <QIcon name="phone" size="xs" /> </template> @@ -112,7 +110,7 @@ const exprBuilder = (param, value) => { </QItem> <QItem class="q-mb-sm"> <QItemSection> - <VnInput :label="t('Email')" v-model="params.email" is-outlined> + <VnInput :label="t('Email')" v-model="params.email" filled> <template #prepend> <QIcon name="email" size="sm" /> </template> @@ -132,19 +130,14 @@ const exprBuilder = (param, value) => { map-options hide-selected dense - outlined - rounded + filled auto-load sortBy="name ASC" /></QItemSection> </QItem> <QItem class="q-mb-sm"> <QItemSection> - <VnInput - :label="t('Postcode')" - v-model="params.postcode" - is-outlined - /> + <VnInput :label="t('Postcode')" v-model="params.postcode" filled /> </QItemSection> </QItem> </template> diff --git a/src/pages/Customer/Defaulter/CustomerDefaulterFilter.vue b/src/pages/Customer/Defaulter/CustomerDefaulterFilter.vue index 0eab7b7c5..64e3baeb5 100644 --- a/src/pages/Customer/Defaulter/CustomerDefaulterFilter.vue +++ b/src/pages/Customer/Defaulter/CustomerDefaulterFilter.vue @@ -45,8 +45,7 @@ const departments = ref(); dense option-label="name" option-value="id" - outlined - rounded + filled emit-value hide-selected map-options @@ -67,8 +66,7 @@ const departments = ref(); map-options option-label="name" option-value="id" - outlined - rounded + filled use-input v-model="params.departmentFk" @update:model-value="searchFn()" @@ -91,8 +89,7 @@ const departments = ref(); map-options option-label="name" option-value="id" - outlined - rounded + filled use-input v-model="params.countryFk" @update:model-value="searchFn()" @@ -108,7 +105,7 @@ const departments = ref(); <VnInput :label="t('P. Method')" clearable - is-outlined + filled v-model="params.paymentMethod" /> </QItemSection> @@ -119,7 +116,7 @@ const departments = ref(); <VnInput :label="t('Balance D.')" clearable - is-outlined + filled v-model="params.balance" /> </QItemSection> @@ -137,8 +134,7 @@ const departments = ref(); map-options option-label="name" option-value="id" - outlined - rounded + filled use-input v-model="params.workerFk" @update:model-value="searchFn()" @@ -154,7 +150,7 @@ const departments = ref(); <VnInputDate :label="t('L. O. Date')" clearable - is-outlined + filled v-model="params.date" /> </QItemSection> @@ -165,7 +161,7 @@ const departments = ref(); <VnInput :label="t('Credit I.')" clearable - is-outlined + filled v-model="params.credit" /> </QItemSection> @@ -175,7 +171,7 @@ const departments = ref(); <QItemSection> <VnInputDate :label="t('From')" - is-outlined + filled v-model="params.defaulterSinced" /> </QItemSection> diff --git a/src/pages/Customer/Payments/CustomerPaymentsFilter.vue b/src/pages/Customer/Payments/CustomerPaymentsFilter.vue index 8982cba5a..ec20237b4 100644 --- a/src/pages/Customer/Payments/CustomerPaymentsFilter.vue +++ b/src/pages/Customer/Payments/CustomerPaymentsFilter.vue @@ -25,7 +25,7 @@ const props = defineProps({ <template #body="{ params }"> <QItem> <QItemSection> - <VnInput :label="t('Order ID')" v-model="params.orderFk" is-outlined> + <VnInput :label="t('Order ID')" v-model="params.orderFk" filled> <template #prepend> <QIcon name="vn:basket" size="xs" /> </template> @@ -34,11 +34,7 @@ const props = defineProps({ </QItem> <QItem> <QItemSection> - <VnInput - :label="t('Customer ID')" - v-model="params.clientFk" - is-outlined - > + <VnInput :label="t('Customer ID')" v-model="params.clientFk" filled> <template #prepend> <QIcon name="vn:client" size="xs" /> </template> @@ -47,19 +43,15 @@ const props = defineProps({ </QItem> <QItem> <QItemSection> - <VnInputNumber - :label="t('Amount')" - v-model="params.amount" - is-outlined - /> + <VnInputNumber :label="t('Amount')" v-model="params.amount" filled /> </QItemSection> </QItem> <QItem> <QItemSection> - <VnInputDate v-model="params.from" :label="t('From')" is-outlined /> + <VnInputDate v-model="params.from" :label="t('From')" filled /> </QItemSection> <QItemSection> - <VnInputDate v-model="params.to" :label="t('To')" is-outlined /> + <VnInputDate v-model="params.to" :label="t('To')" filled /> </QItemSection> </QItem> </template> diff --git a/src/pages/Entry/Card/EntryDescriptor.vue b/src/pages/Entry/Card/EntryDescriptor.vue index 313ed3d72..560114283 100644 --- a/src/pages/Entry/Card/EntryDescriptor.vue +++ b/src/pages/Entry/Card/EntryDescriptor.vue @@ -6,7 +6,7 @@ import { toDate } from 'src/filters'; import { getUrl } from 'src/composables/getUrl'; import { useQuasar } from 'quasar'; import { usePrintService } from 'composables/usePrintService'; -import CardDescriptor from 'components/ui/CardDescriptor.vue'; +import EntityDescriptor from 'components/ui/EntityDescriptor.vue'; import VnLv from 'src/components/ui/VnLv.vue'; import TravelDescriptorProxy from 'src/pages/Travel/Card/TravelDescriptorProxy.vue'; import axios from 'axios'; @@ -145,7 +145,7 @@ async function deleteEntry() { </script> <template> - <CardDescriptor + <EntityDescriptor :url="`Entries/${entityId}`" :filter="entryFilter" title="supplier.nickname" @@ -264,7 +264,7 @@ async function deleteEntry() { </QBtn> </QCardActions> </template> - </CardDescriptor> + </EntityDescriptor> </template> <i18n> es: diff --git a/src/pages/Entry/EntryFilter.vue b/src/pages/Entry/EntryFilter.vue index 82bcb1a79..19f4bca86 100644 --- a/src/pages/Entry/EntryFilter.vue +++ b/src/pages/Entry/EntryFilter.vue @@ -101,14 +101,14 @@ const entryFilterPanel = ref(); :label="t('params.landed')" v-model="params.landed" @update:model-value="searchFn()" - is-outlined + filled data-cy="landed" /> </QItemSection> </QItem> <QItem> <QItemSection> - <VnInput v-model="params.id" label="Id" is-outlined /> + <VnInput v-model="params.id" label="Id" filled /> </QItemSection> </QItem> <QItem> @@ -118,8 +118,7 @@ const entryFilterPanel = ref(); @update:model-value="searchFn()" hide-selected dense - outlined - rounded + filled /> </QItemSection> </QItem> @@ -128,7 +127,7 @@ const entryFilterPanel = ref(); <VnInput v-model="params.reference" :label="t('entry.list.tableVisibleColumns.reference')" - is-outlined + filled /> </QItemSection> </QItem> @@ -143,8 +142,7 @@ const entryFilterPanel = ref(); :fields="['id', 'name']" hide-selected dense - outlined - rounded + filled /> </QItemSection> </QItem> @@ -153,7 +151,7 @@ const entryFilterPanel = ref(); <VnInput v-model="params.evaNotes" :label="t('params.evaNotes')" - is-outlined + filled /> </QItemSection> </QItem> @@ -168,8 +166,7 @@ const entryFilterPanel = ref(); sort-by="name ASC" hide-selected dense - outlined - rounded + filled /> </QItemSection> </QItem> @@ -184,8 +181,7 @@ const entryFilterPanel = ref(); sort-by="name ASC" hide-selected dense - outlined - rounded + filled > <template #option="scope"> <QItem v-bind="scope.itemProps"> @@ -207,7 +203,7 @@ const entryFilterPanel = ref(); <VnInput v-model="params.invoiceNumber" :label="t('params.invoiceNumber')" - is-outlined + filled /> </QItemSection> </QItem> @@ -224,8 +220,16 @@ const entryFilterPanel = ref(); option-label="description" hide-selected dense - outlined - rounded + filled + /> + </QItemSection> + </QItem> + <QItem> + <QItemSection> + <VnInput + v-model="params.evaNotes" + :label="t('params.evaNotes')" + filled /> </QItemSection> </QItem> diff --git a/src/pages/InvoiceIn/Card/InvoiceInDescriptor.vue b/src/pages/InvoiceIn/Card/InvoiceInDescriptor.vue index eb673c546..e8df27511 100644 --- a/src/pages/InvoiceIn/Card/InvoiceInDescriptor.vue +++ b/src/pages/InvoiceIn/Card/InvoiceInDescriptor.vue @@ -5,7 +5,7 @@ import { useI18n } from 'vue-i18n'; import axios from 'axios'; import { toCurrency, toDate } from 'src/filters'; import VnLv from 'src/components/ui/VnLv.vue'; -import CardDescriptor from 'components/ui/CardDescriptor.vue'; +import EntityDescriptor from 'components/ui/EntityDescriptor.vue'; import SupplierDescriptorProxy from 'src/pages/Supplier/Card/SupplierDescriptorProxy.vue'; import filter from './InvoiceInFilter.js'; import InvoiceInDescriptorMenu from './InvoiceInDescriptorMenu.vue'; @@ -84,7 +84,7 @@ async function setInvoiceCorrection(id) { } </script> <template> - <CardDescriptor + <EntityDescriptor ref="cardDescriptorRef" data-key="InvoiceIn" :url="`InvoiceIns/${entityId}`" @@ -159,7 +159,7 @@ async function setInvoiceCorrection(id) { </QBtn> </QCardActions> </template> - </CardDescriptor> + </EntityDescriptor> </template> <style lang="scss" scoped> .q-dialog { diff --git a/src/pages/InvoiceIn/InvoiceInFilter.vue b/src/pages/InvoiceIn/InvoiceInFilter.vue index a4fb0d653..6551a7ca9 100644 --- a/src/pages/InvoiceIn/InvoiceInFilter.vue +++ b/src/pages/InvoiceIn/InvoiceInFilter.vue @@ -40,17 +40,13 @@ function handleDaysAgo(params, daysAgo) { <VnInputDate :label="$t('globals.from')" v-model="params.from" - is-outlined + filled /> </QItemSection> </QItem> <QItem> <QItemSection> - <VnInputDate - :label="$t('globals.to')" - v-model="params.to" - is-outlined - /> + <VnInputDate :label="$t('globals.to')" v-model="params.to" filled /> </QItemSection> </QItem> <QItem> @@ -58,7 +54,7 @@ function handleDaysAgo(params, daysAgo) { <VnInputNumber :label="$t('globals.daysAgo')" v-model="params.daysAgo" - is-outlined + filled :step="0" @update:model-value="(val) => handleDaysAgo(params, val)" @remove="(val) => handleDaysAgo(params, val)" @@ -67,12 +63,7 @@ function handleDaysAgo(params, daysAgo) { </QItem> <QItem> <QItemSection> - <VnSelectSupplier - v-model="params.supplierFk" - dense - outlined - rounded - /> + <VnSelectSupplier v-model="params.supplierFk" dense filled /> </QItemSection> </QItem> <QItem> @@ -80,7 +71,7 @@ function handleDaysAgo(params, daysAgo) { <VnInput :label="getLocale('supplierRef')" v-model="params.supplierRef" - is-outlined + filled lazy-rules /> </QItemSection> @@ -90,7 +81,7 @@ function handleDaysAgo(params, daysAgo) { <VnInput :label="getLocale('fi')" v-model="params.fi" - is-outlined + filled lazy-rules /> </QItemSection> @@ -100,7 +91,7 @@ function handleDaysAgo(params, daysAgo) { <VnInput :label="getLocale('serial')" v-model="params.serial" - is-outlined + filled lazy-rules /> </QItemSection> @@ -110,7 +101,7 @@ function handleDaysAgo(params, daysAgo) { <VnInput :label="getLocale('account')" v-model="params.account" - is-outlined + filled lazy-rules /> </QItemSection> @@ -120,7 +111,7 @@ function handleDaysAgo(params, daysAgo) { <VnInput :label="getLocale('globals.params.awbCode')" v-model="params.awbCode" - is-outlined + filled lazy-rules /> </QItemSection> @@ -130,7 +121,7 @@ function handleDaysAgo(params, daysAgo) { <VnInputNumber :label="$t('globals.amount')" v-model="params.amount" - is-outlined + filled /> </QItemSection> </QItem> @@ -142,7 +133,7 @@ function handleDaysAgo(params, daysAgo) { url="Companies" option-label="code" :fields="['id', 'code']" - is-outlined + filled /> </QItemSection> </QItem> diff --git a/src/pages/InvoiceIn/Serial/InvoiceInSerialFilter.vue b/src/pages/InvoiceIn/Serial/InvoiceInSerialFilter.vue index 19ed73e50..66b7fa433 100644 --- a/src/pages/InvoiceIn/Serial/InvoiceInSerialFilter.vue +++ b/src/pages/InvoiceIn/Serial/InvoiceInSerialFilter.vue @@ -25,8 +25,7 @@ const { t } = useI18n(); <VnInputNumber v-model="params.daysAgo" :label="t('params.daysAgo')" - outlined - rounded + filled dense /> </QItemSection> @@ -36,8 +35,7 @@ const { t } = useI18n(); <VnInput v-model="params.serial" :label="t('params.serial')" - outlined - rounded + filled dense /> </QItemSection> diff --git a/src/pages/InvoiceOut/Card/InvoiceOutDescriptor.vue b/src/pages/InvoiceOut/Card/InvoiceOutDescriptor.vue index 2402c0bf6..b93b8c8b7 100644 --- a/src/pages/InvoiceOut/Card/InvoiceOutDescriptor.vue +++ b/src/pages/InvoiceOut/Card/InvoiceOutDescriptor.vue @@ -3,7 +3,7 @@ import { ref, computed } from 'vue'; import { useRoute } from 'vue-router'; import { useI18n } from 'vue-i18n'; -import CardDescriptor from 'components/ui/CardDescriptor.vue'; +import EntityDescriptor from 'components/ui/EntityDescriptor.vue'; import CustomerDescriptorProxy from 'pages/Customer/Card/CustomerDescriptorProxy.vue'; import VnLv from 'src/components/ui/VnLv.vue'; import InvoiceOutDescriptorMenu from './InvoiceOutDescriptorMenu.vue'; @@ -34,7 +34,7 @@ function ticketFilter(invoice) { </script> <template> - <CardDescriptor + <EntityDescriptor ref="descriptor" :url="`InvoiceOuts/${entityId}`" :filter="filter" @@ -93,5 +93,5 @@ function ticketFilter(invoice) { </QBtn> </QCardActions> </template> - </CardDescriptor> + </EntityDescriptor> </template> diff --git a/src/pages/InvoiceOut/InvoiceOutFilter.vue b/src/pages/InvoiceOut/InvoiceOutFilter.vue index 99524e0d6..93a343565 100644 --- a/src/pages/InvoiceOut/InvoiceOutFilter.vue +++ b/src/pages/InvoiceOut/InvoiceOutFilter.vue @@ -33,17 +33,13 @@ const states = ref(); <VnInput :label="t('globals.params.clientFk')" v-model="params.clientFk" - is-outlined + filled /> </QItemSection> </QItem> <QItem> <QItemSection> - <VnInput - v-model="params.fi" - :label="t('globals.params.fi')" - is-outlined - /> + <VnInput v-model="params.fi" :label="t('globals.params.fi')" filled /> </QItemSection> </QItem> <QItem> @@ -51,7 +47,7 @@ const states = ref(); <VnInputNumber :label="t('globals.amount')" v-model="params.amount" - is-outlined + filled data-cy="InvoiceOutFilterAmountBtn" /> </QItemSection> @@ -62,8 +58,7 @@ const states = ref(); :label="t('invoiceOut.params.min')" dense lazy-rules - outlined - rounded + filled type="number" v-model.number="params.min" /> @@ -73,8 +68,7 @@ const states = ref(); :label="t('invoiceOut.params.max')" dense lazy-rules - outlined - rounded + filled type="number" v-model.number="params.max" /> @@ -94,7 +88,7 @@ const states = ref(); <VnInputDate v-model="params.created" :label="t('invoiceOut.params.created')" - is-outlined + filled /> </QItemSection> </QItem> @@ -103,15 +97,14 @@ const states = ref(); <VnInputDate v-model="params.dued" :label="t('invoiceOut.params.dued')" - is-outlined + filled /> </QItemSection> </QItem> <QItem> <QItemSection> <VnSelect - outlined - rounded + filled :label="t('globals.params.departmentFk')" v-model="params.departmentFk" option-value="id" diff --git a/src/pages/InvoiceOut/InvoiceOutGlobalForm.vue b/src/pages/InvoiceOut/InvoiceOutGlobalForm.vue index 392256473..53433c56b 100644 --- a/src/pages/InvoiceOut/InvoiceOutGlobalForm.vue +++ b/src/pages/InvoiceOut/InvoiceOutGlobalForm.vue @@ -26,7 +26,7 @@ const serialTypesOptions = ref([]); const handleInvoiceOutSerialsFetch = (data) => { serialTypesOptions.value = Array.from( - new Set(data.map((item) => item.type).filter((type) => type)) + new Set(data.map((item) => item.type).filter((type) => type)), ); }; @@ -99,8 +99,7 @@ onMounted(async () => { option-label="name" hide-selected dense - outlined - rounded + filled data-cy="InvoiceOutGlobalClientSelect" > <template #option="scope"> @@ -124,19 +123,18 @@ onMounted(async () => { option-label="type" hide-selected dense - outlined - rounded + filled data-cy="InvoiceOutGlobalSerialSelect" /> <VnInputDate v-model="formData.invoiceDate" :label="t('invoiceDate')" - is-outlined + filled /> <VnInputDate v-model="formData.maxShipped" :label="t('maxShipped')" - is-outlined + filled data-cy="InvoiceOutGlobalMaxShippedDate" /> <VnSelect @@ -145,8 +143,7 @@ onMounted(async () => { :options="companiesOptions" option-label="code" dense - outlined - rounded + filled data-cy="InvoiceOutGlobalCompanySelect" /> <VnSelect @@ -154,8 +151,7 @@ onMounted(async () => { v-model="formData.printer" :options="printersOptions" dense - outlined - rounded + filled data-cy="InvoiceOutGlobalPrinterSelect" /> </div> @@ -166,7 +162,7 @@ onMounted(async () => { color="primary" class="q-mt-md full-width" unelevated - rounded + filled dense /> <QBtn @@ -175,7 +171,7 @@ onMounted(async () => { color="primary" class="q-mt-md full-width" unelevated - rounded + filled dense @click="getStatus = 'stopping'" /> diff --git a/src/pages/InvoiceOut/InvoiceOutNegativeBasesFilter.vue b/src/pages/InvoiceOut/InvoiceOutNegativeBasesFilter.vue index b24c8b247..1e2f80ec2 100644 --- a/src/pages/InvoiceOut/InvoiceOutNegativeBasesFilter.vue +++ b/src/pages/InvoiceOut/InvoiceOutNegativeBasesFilter.vue @@ -35,17 +35,13 @@ const props = defineProps({ <VnInputDate v-model="params.from" :label="t('globals.from')" - is-outlined + filled /> </QItemSection> </QItem> <QItem> <QItemSection> - <VnInputDate - v-model="params.to" - :label="t('globals.to')" - is-outlined - /> + <VnInputDate v-model="params.to" :label="t('globals.to')" filled /> </QItemSection> </QItem> <QItem> @@ -57,8 +53,7 @@ const props = defineProps({ option-label="code" option-value="code" dense - outlined - rounded + filled @update:model-value="searchFn()" > <template #option="scope"> @@ -84,9 +79,8 @@ const props = defineProps({ v-model="params.country" option-label="name" option-value="name" - outlined dense - rounded + filled @update:model-value="searchFn()" > <template #option="scope"> @@ -110,9 +104,8 @@ const props = defineProps({ url="Clients" :label="t('globals.client')" v-model="params.clientId" - outlined dense - rounded + filled @update:model-value="searchFn()" /> </QItemSection> @@ -122,7 +115,7 @@ const props = defineProps({ <VnInputNumber v-model="params.amount" :label="t('globals.amount')" - is-outlined + filled :positive="false" /> </QItemSection> @@ -130,9 +123,8 @@ const props = defineProps({ <QItem> <QItemSection> <VnSelect - outlined dense - rounded + filled :label="t('globals.params.departmentFk')" v-model="params.departmentFk" option-value="id" diff --git a/src/pages/Item/Card/ItemDescriptor.vue b/src/pages/Item/Card/ItemDescriptor.vue index 84e07a293..09f63a3b1 100644 --- a/src/pages/Item/Card/ItemDescriptor.vue +++ b/src/pages/Item/Card/ItemDescriptor.vue @@ -3,7 +3,7 @@ import { computed, ref, onMounted } from 'vue'; import { useRoute } from 'vue-router'; import { useI18n } from 'vue-i18n'; -import CardDescriptor from 'src/components/ui/CardDescriptor.vue'; +import EntityDescriptor from 'src/components/ui/EntityDescriptor.vue'; import VnLv from 'src/components/ui/VnLv.vue'; import WorkerDescriptorProxy from 'src/pages/Worker/Card/WorkerDescriptorProxy.vue'; import ItemDescriptorImage from 'src/pages/Item/Card/ItemDescriptorImage.vue'; @@ -90,7 +90,7 @@ const updateStock = async () => { </script> <template> - <CardDescriptor + <EntityDescriptor data-key="Item" :summary="$props.summary" :url="`Items/${entityId}/getCard`" @@ -162,7 +162,7 @@ const updateStock = async () => { </QBtn> </QCardActions> </template> - </CardDescriptor> + </EntityDescriptor> </template> <i18n> diff --git a/src/pages/Item/ItemFixedPriceFilter.vue b/src/pages/Item/ItemFixedPriceFilter.vue index 8d92e245d..d68b966c6 100644 --- a/src/pages/Item/ItemFixedPriceFilter.vue +++ b/src/pages/Item/ItemFixedPriceFilter.vue @@ -13,7 +13,6 @@ const props = defineProps({ required: true, }, }); - </script> <template> @@ -28,8 +27,7 @@ const props = defineProps({ :fields="['id', 'nickname']" option-label="nickname" dense - outlined - rounded + filled use-input @update:model-value="searchFn()" sort-by="nickname ASC" @@ -46,8 +44,7 @@ const props = defineProps({ :label="t('params.warehouseFk')" v-model="params.warehouseFk" dense - outlined - rounded + filled use-input @update:model-value="searchFn()" /> @@ -58,7 +55,7 @@ const props = defineProps({ <VnInputDate :label="t('params.started')" v-model="params.started" - is-outlined + filled @update:model-value="searchFn()" /> </QItemSection> @@ -68,7 +65,7 @@ const props = defineProps({ <VnInputDate :label="t('params.ended')" v-model="params.ended" - is-outlined + filled @update:model-value="searchFn()" /> </QItemSection> diff --git a/src/pages/Item/ItemListFilter.vue b/src/pages/Item/ItemListFilter.vue index 22e948e06..f4500d5fa 100644 --- a/src/pages/Item/ItemListFilter.vue +++ b/src/pages/Item/ItemListFilter.vue @@ -177,11 +177,7 @@ onMounted(async () => { <template #body="{ params, searchFn }"> <QItem> <QItemSection> - <VnInput - v-model="params.search" - :label="t('params.search')" - is-outlined - /> + <VnInput v-model="params.search" :label="t('params.search')" filled /> </QItemSection> </QItem> <QItem> @@ -197,8 +193,7 @@ onMounted(async () => { option-label="name" hide-selected dense - outlined - rounded + filled /> </QItemSection> </QItem> @@ -213,8 +208,7 @@ onMounted(async () => { option-label="name" hide-selected dense - outlined - rounded + filled > <template #option="scope"> <QItem v-bind="scope.itemProps"> @@ -240,8 +234,7 @@ onMounted(async () => { option-label="nickname" hide-selected dense - outlined - rounded + filled /> </QItemSection> </QItem> @@ -252,8 +245,7 @@ onMounted(async () => { @update:model-value="searchFn()" hide-selected dense - outlined - rounded + filled /> </QItemSection> </QItem> @@ -282,8 +274,7 @@ onMounted(async () => { :options="tagOptions" option-label="name" dense - outlined - rounded + filled :emit-value="false" use-input :is-clearable="false" @@ -299,8 +290,7 @@ onMounted(async () => { option-value="value" option-label="value" dense - outlined - rounded + filled emit-value use-input :disable="!tag" @@ -312,7 +302,7 @@ onMounted(async () => { v-model="tag.value" :label="t('params.value')" :disable="!tag" - is-outlined + filled :is-clearable="false" @keydown.enter.prevent="applyTags(params, searchFn)" /> @@ -351,8 +341,7 @@ onMounted(async () => { option-label="label" option-value="label" dense - outlined - rounded + filled :emit-value="false" use-input :is-clearable="false" @@ -377,7 +366,7 @@ onMounted(async () => { v-model="fieldFilter.value" :label="t('params.value')" :disable="!fieldFilter.selectedField" - is-outlined + filled @keydown.enter="applyFieldFilters(params, searchFn)" /> </QItemSection> diff --git a/src/pages/Item/ItemRequestFilter.vue b/src/pages/Item/ItemRequestFilter.vue index a29203df3..68f36c566 100644 --- a/src/pages/Item/ItemRequestFilter.vue +++ b/src/pages/Item/ItemRequestFilter.vue @@ -87,11 +87,7 @@ onMounted(async () => { <template #body="{ params, searchFn }"> <QItem> <QItemSection> - <VnInput - v-model="params.search" - :label="t('params.search')" - is-outlined - /> + <VnInput v-model="params.search" :label="t('params.search')" filled /> </QItemSection> </QItem> <QItem> @@ -99,7 +95,7 @@ onMounted(async () => { <VnInput v-model="params.ticketFk" :label="t('params.ticketFk')" - is-outlined + filled /> </QItemSection> </QItem> @@ -114,8 +110,7 @@ onMounted(async () => { option-label="nickname" hide-selected dense - outlined - rounded + filled /> </QItemSection> </QItem> @@ -124,7 +119,7 @@ onMounted(async () => { <VnInput v-model="params.clientFk" :label="t('params.clientFk')" - is-outlined + filled /> </QItemSection> </QItem> @@ -139,8 +134,7 @@ onMounted(async () => { option-label="name" hide-selected dense - outlined - rounded + filled /> </QItemSection> </QItem> @@ -153,25 +147,16 @@ onMounted(async () => { :params="{ departmentCodes: ['VT'] }" hide-selected dense - outlined - rounded + filled /> </QItemSection> </QItem> <QItem> <QItemSection> - <VnInputDate - v-model="params.from" - :label="t('params.from')" - is-outlined - /> + <VnInputDate v-model="params.from" :label="t('params.from')" filled /> </QItemSection> <QItemSection> - <VnInputDate - v-model="params.to" - :label="t('params.to')" - is-outlined - /> + <VnInputDate v-model="params.to" :label="t('params.to')" filled /> </QItemSection> </QItem> <QItem> @@ -180,7 +165,7 @@ onMounted(async () => { :label="t('params.daysOnward')" v-model="params.daysOnward" lazy-rules - is-outlined + filled /> </QItemSection> </QItem> @@ -195,8 +180,7 @@ onMounted(async () => { option-label="name" hide-selected dense - outlined - rounded + filled /> </QItemSection> </QItem> diff --git a/src/pages/Item/ItemType/Card/ItemTypeDescriptor.vue b/src/pages/Item/ItemType/Card/ItemTypeDescriptor.vue index 972f4cad9..106b005bf 100644 --- a/src/pages/Item/ItemType/Card/ItemTypeDescriptor.vue +++ b/src/pages/Item/ItemType/Card/ItemTypeDescriptor.vue @@ -2,7 +2,7 @@ import { computed } from 'vue'; import { useRoute } from 'vue-router'; -import CardDescriptor from 'components/ui/CardDescriptor.vue'; +import EntityDescriptor from 'components/ui/EntityDescriptor.vue'; import VnLv from 'src/components/ui/VnLv.vue'; import WorkerDescriptorProxy from 'src/pages/Worker/Card/WorkerDescriptorProxy.vue'; import filter from './ItemTypeFilter.js'; @@ -25,7 +25,7 @@ const entityId = computed(() => { }); </script> <template> - <CardDescriptor + <EntityDescriptor :url="`ItemTypes/${entityId}`" :filter="filter" title="code" @@ -46,5 +46,5 @@ const entityId = computed(() => { :value="entity.category?.name" /> </template> - </CardDescriptor> + </EntityDescriptor> </template> diff --git a/src/pages/Monitor/Ticket/MonitorTicketFilter.vue b/src/pages/Monitor/Ticket/MonitorTicketFilter.vue index 447dd35b8..535906e17 100644 --- a/src/pages/Monitor/Ticket/MonitorTicketFilter.vue +++ b/src/pages/Monitor/Ticket/MonitorTicketFilter.vue @@ -77,7 +77,7 @@ const getLocale = (label) => { <VnInput :label="t('globals.params.clientFk')" v-model="params.clientFk" - is-outlined + filled /> </QItemSection> </QItem> @@ -86,7 +86,7 @@ const getLocale = (label) => { <VnInput :label="t('params.orderFk')" v-model="params.orderFk" - is-outlined + filled /> </QItemSection> </QItem> @@ -95,7 +95,7 @@ const getLocale = (label) => { <VnInputNumber :label="t('params.scopeDays')" v-model="params.scopeDays" - is-outlined + filled @update:model-value="(val) => handleScopeDays(params, val)" @remove="(val) => handleScopeDays(params, val)" /> @@ -106,66 +106,54 @@ const getLocale = (label) => { <VnInput :label="t('params.nickname')" v-model="params.nickname" - is-outlined + filled /> </QItemSection> </QItem> <QItem> <QItemSection> <VnSelect - outlined dense - rounded + filled :label="t('globals.params.departmentFk')" v-model="params.departmentFk" - option-value="id" - option-label="name" url="Departments" /> </QItemSection> </QItem> <QItem> <QItemSection> - <VnInput - :label="t('params.refFk')" - v-model="params.refFk" - is-outlined - /> + <VnInput :label="t('params.refFk')" v-model="params.refFk" filled /> </QItemSection> </QItem> <QItem> <QItemSection> <VnSelect - outlined dense - rounded + filled :label="t('params.agencyModeFk')" v-model="params.agencyModeFk" url="AgencyModes/isActive" - is-outlined /> </QItemSection> </QItem> <QItem> <QItemSection> <VnSelect - outlined dense - rounded + filled :label="t('globals.params.stateFk')" v-model="params.stateFk" url="States" - is-outlined /> </QItemSection> </QItem> <QItem> <QItemSection> <VnSelect - outlined dense - rounded + filled :label="t('params.groupedStates')" v-model="params.alertLevel" :options="groupedStates" @@ -176,9 +164,8 @@ const getLocale = (label) => { <QItem> <QItemSection> <VnSelect - outlined dense - rounded + filled :label="t('globals.params.warehouseFk')" v-model="params.warehouseFk" :options="warehouses" @@ -188,9 +175,8 @@ const getLocale = (label) => { <QItem> <QItemSection> <VnSelect - outlined dense - rounded + filled :label="t('globals.params.countryFk')" v-model="params.countryFk" url="Countries" @@ -200,9 +186,8 @@ const getLocale = (label) => { <QItem> <QItemSection> <VnSelect - outlined dense - rounded + filled :label="t('globals.params.provinceFk')" v-model="params.provinceFk" url="Provinces" @@ -212,9 +197,8 @@ const getLocale = (label) => { <QItem> <QItemSection> <VnSelect - outlined dense - rounded + filled :label="t('globals.params.departmentFk')" v-model="params.department" option-label="name" @@ -226,9 +210,8 @@ const getLocale = (label) => { <QItem> <QItemSection> <VnSelect - outlined dense - rounded + filled :label="t('globals.params.packing')" v-model="params.packing" url="ItemPackingTypes" diff --git a/src/pages/Order/Card/CatalogFilterValueDialog.vue b/src/pages/Order/Card/CatalogFilterValueDialog.vue index d1bd48c9e..10273a254 100644 --- a/src/pages/Order/Card/CatalogFilterValueDialog.vue +++ b/src/pages/Order/Card/CatalogFilterValueDialog.vue @@ -57,9 +57,8 @@ const getSelectedTagValues = async (tag) => { option-value="id" option-label="name" dense - outlined class="q-mb-md" - rounded + filled :emit-value="false" use-input @update:model-value="getSelectedTagValues" @@ -79,8 +78,7 @@ const getSelectedTagValues = async (tag) => { option-value="value" option-label="value" dense - outlined - rounded + filled emit-value use-input :disable="!value || !selectedTag" @@ -92,16 +90,14 @@ const getSelectedTagValues = async (tag) => { v-model="value.value" :label="t('components.itemsFilterPanel.value')" :disable="!value" - is-outlined class="col" data-cy="catalogFilterValueDialogValueInput" /> <QBtn icon="delete" size="md" - outlined dense - rounded + filled flat class="filter-icon col-2" @click="tagValues.splice(index, 1)" diff --git a/src/pages/Order/Card/OrderCard.vue b/src/pages/Order/Card/OrderCard.vue index 7dab307a0..11dbbe532 100644 --- a/src/pages/Order/Card/OrderCard.vue +++ b/src/pages/Order/Card/OrderCard.vue @@ -6,9 +6,11 @@ import filter from './OrderFilter.js'; <template> <VnCard - data-key="Order" + :data-key="$attrs['data-key'] ?? 'Order'" url="Orders" :filter="filter" :descriptor="OrderDescriptor" + v-bind="$attrs" + v-on="$attrs" /> </template> diff --git a/src/pages/Order/Card/OrderCatalogFilter.vue b/src/pages/Order/Card/OrderCatalogFilter.vue index d16a92017..cb380c48f 100644 --- a/src/pages/Order/Card/OrderCatalogFilter.vue +++ b/src/pages/Order/Card/OrderCatalogFilter.vue @@ -221,8 +221,7 @@ function addOrder(value, field, params) { option-value="id" option-label="name" dense - outlined - rounded + filled emit-value use-input sort-by="name ASC" @@ -251,8 +250,7 @@ function addOrder(value, field, params) { v-model="orderBySelected" :options="orderByList" dense - outlined - rounded + filled @update:model-value="(value) => addOrder(value, 'field', params)" /> </QItemSection> @@ -264,8 +262,7 @@ function addOrder(value, field, params) { v-model="orderWaySelected" :options="orderWayList" dense - outlined - rounded + filled @update:model-value="(value) => addOrder(value, 'way', params)" /> </QItemSection> @@ -275,8 +272,7 @@ function addOrder(value, field, params) { <VnInput :label="t('components.itemsFilterPanel.value')" dense - outlined - rounded + filled :is-clearable="false" v-model="searchByTag" @keyup.enter="(val) => onSearchByTag(val, params)" diff --git a/src/pages/Order/Card/OrderDescriptor.vue b/src/pages/Order/Card/OrderDescriptor.vue index f34549c1e..ee66bb57e 100644 --- a/src/pages/Order/Card/OrderDescriptor.vue +++ b/src/pages/Order/Card/OrderDescriptor.vue @@ -4,10 +4,10 @@ import { useRoute } from 'vue-router'; import { useI18n } from 'vue-i18n'; import { toCurrency, toDate } from 'src/filters'; import { useState } from 'src/composables/useState'; -import filter from './OrderFilter.js'; -import CardDescriptor from 'components/ui/CardDescriptor.vue'; import VnLv from 'src/components/ui/VnLv.vue'; import FetchData from 'components/FetchData.vue'; +import OrderCard from './OrderCard.vue'; +import CardDescriptor from 'src/components/ui/CardDescriptor.vue'; import DepartmentDescriptorProxy from 'src/pages/Worker/Department/Card/DepartmentDescriptorProxy.vue'; const DEFAULT_ITEMS = 0; @@ -24,11 +24,14 @@ const route = useRoute(); const state = useState(); const { t } = useI18n(); const getTotalRef = ref(); +const total = ref(0); const entityId = computed(() => { return $props.id || route.params.id; }); +const orderTotal = computed(() => state.get('orderTotal') ?? 0); + const setData = (entity) => { if (!entity) return; getTotalRef.value && getTotalRef.value.fetch(); @@ -38,9 +41,6 @@ const setData = (entity) => { const getConfirmationValue = (isConfirmed) => { return t(isConfirmed ? 'globals.confirmed' : 'order.summary.notConfirmed'); }; - -const orderTotal = computed(() => state.get('orderTotal') ?? 0); -const total = ref(0); </script> <template> @@ -54,12 +54,12 @@ const total = ref(0); " /> <CardDescriptor - ref="descriptor" - :url="`Orders/${entityId}`" - :filter="filter" + v-bind="$attrs" + :id="entityId" + :card="OrderCard" title="client.name" @on-fetch="setData" - data-key="Order" + module="Order" > <template #body="{ entity }"> <VnLv diff --git a/src/pages/Order/Card/OrderDescriptorProxy.vue b/src/pages/Order/Card/OrderDescriptorProxy.vue index 04ebb054a..1dff1b620 100644 --- a/src/pages/Order/Card/OrderDescriptorProxy.vue +++ b/src/pages/Order/Card/OrderDescriptorProxy.vue @@ -12,6 +12,11 @@ const $props = defineProps({ <template> <QPopupProxy> - <OrderDescriptor v-if="$props.id" :id="$props.id" :summary="OrderSummary" /> + <OrderDescriptor + v-if="$props.id" + :id="$props.id" + :summary="OrderSummary" + data-key="OrderDescriptor" + /> </QPopupProxy> </template> diff --git a/src/pages/Order/Card/OrderFilter.vue b/src/pages/Order/Card/OrderFilter.vue index 42578423f..609a1215a 100644 --- a/src/pages/Order/Card/OrderFilter.vue +++ b/src/pages/Order/Card/OrderFilter.vue @@ -49,8 +49,7 @@ const sourceList = ref([]); v-model="params.clientFk" lazy-rules dense - outlined - rounded + filled /> <VnSelect :label="t('agency')" @@ -58,13 +57,11 @@ const sourceList = ref([]); :options="agencyList" :input-debounce="0" dense - outlined - rounded + filled /> <VnSelect - outlined dense - rounded + filled :label="t('globals.params.departmentFk')" v-model="params.departmentFk" option-value="id" @@ -75,21 +72,14 @@ const sourceList = ref([]); v-model="params.from" :label="t('fromLanded')" dense - outlined - rounded - /> - <VnInputDate - v-model="params.to" - :label="t('toLanded')" - dense - outlined - rounded + filled /> + <VnInputDate v-model="params.to" :label="t('toLanded')" dense filled /> <VnInput :label="t('orderId')" v-model="params.orderFk" lazy-rules - is-outlined + filled /> <VnSelect :label="t('application')" @@ -98,8 +88,7 @@ const sourceList = ref([]); option-label="value" option-value="value" dense - outlined - rounded + filled :input-debounce="0" /> <QCheckbox diff --git a/src/pages/Route/Agency/Card/AgencyDescriptor.vue b/src/pages/Route/Agency/Card/AgencyDescriptor.vue index 46aa44be9..64b33cc06 100644 --- a/src/pages/Route/Agency/Card/AgencyDescriptor.vue +++ b/src/pages/Route/Agency/Card/AgencyDescriptor.vue @@ -3,7 +3,7 @@ import { computed } from 'vue'; import { useI18n } from 'vue-i18n'; import { useRoute } from 'vue-router'; import { useArrayData } from 'src/composables/useArrayData'; -import CardDescriptor from 'components/ui/CardDescriptor.vue'; +import EntityDescriptor from 'components/ui/EntityDescriptor.vue'; import VnLv from 'components/ui/VnLv.vue'; const props = defineProps({ @@ -21,7 +21,7 @@ const { store } = useArrayData(); const card = computed(() => store.data); </script> <template> - <CardDescriptor + <EntityDescriptor data-key="Agency" :url="`Agencies/${entityId}`" :title="card?.name" @@ -31,5 +31,5 @@ const card = computed(() => store.data); <template #body="{ entity: agency }"> <VnLv :label="t('globals.name')" :value="agency.name" /> </template> - </CardDescriptor> + </EntityDescriptor> </template> diff --git a/src/pages/Route/Card/RouteAutonomousFilter.vue b/src/pages/Route/Card/RouteAutonomousFilter.vue index f70f60e1c..fe631a0be 100644 --- a/src/pages/Route/Card/RouteAutonomousFilter.vue +++ b/src/pages/Route/Card/RouteAutonomousFilter.vue @@ -71,7 +71,7 @@ const exprBuilder = (param, value) => { <QList dense> <QItem class="q-my-sm"> <QItemSection> - <VnInput v-model="params.routeFk" :label="t('ID')" is-outlined /> + <VnInput v-model="params.routeFk" :label="t('ID')" filled /> </QItemSection> </QItem> <QItem class="q-my-sm" v-if="agencyList"> @@ -83,8 +83,7 @@ const exprBuilder = (param, value) => { option-value="id" option-label="name" dense - outlined - rounded + filled emit-value map-options use-input @@ -102,8 +101,7 @@ const exprBuilder = (param, value) => { option-value="id" option-label="name" dense - outlined - rounded + filled emit-value map-options use-input @@ -123,8 +121,7 @@ const exprBuilder = (param, value) => { option-value="name" option-label="name" dense - outlined - rounded + filled emit-value map-options use-input @@ -135,20 +132,12 @@ const exprBuilder = (param, value) => { </QItem> <QItem class="q-my-sm"> <QItemSection> - <VnInputDate - v-model="params.dated" - :label="t('Date')" - is-outlined - /> + <VnInputDate v-model="params.dated" :label="t('Date')" filled /> </QItemSection> </QItem> <QItem class="q-my-sm"> <QItemSection> - <VnInputDate - v-model="params.from" - :label="t('From')" - is-outlined - /> + <VnInputDate v-model="params.from" :label="t('From')" filled /> </QItemSection> </QItem> <QItem class="q-my-sm"> @@ -156,7 +145,7 @@ const exprBuilder = (param, value) => { <VnInputDate v-model="params.to" :label="t('To')" - is-outlined + filled is-clearable /> </QItemSection> @@ -166,23 +155,23 @@ const exprBuilder = (param, value) => { <VnInput v-model="params.packages" :label="t('Packages')" - is-outlined + filled /> </QItemSection> </QItem> <QItem class="q-my-sm"> <QItemSection> - <VnInput v-model="params.m3" :label="t('m3')" is-outlined /> + <VnInput v-model="params.m3" :label="t('m3')" filled /> </QItemSection> </QItem> <QItem class="q-my-sm"> <QItemSection> - <VnInput v-model="params.kmTotal" :label="t('Km')" is-outlined /> + <VnInput v-model="params.kmTotal" :label="t('Km')" filled /> </QItemSection> </QItem> <QItem class="q-my-sm"> <QItemSection> - <VnInput v-model="params.price" :label="t('Price')" is-outlined /> + <VnInput v-model="params.price" :label="t('Price')" filled /> </QItemSection> </QItem> <QItem class="q-my-sm"> @@ -190,7 +179,7 @@ const exprBuilder = (param, value) => { <VnInput v-model="params.invoiceInFk" :label="t('Received')" - is-outlined + filled /> </QItemSection> </QItem> diff --git a/src/pages/Route/Card/RouteDescriptor.vue b/src/pages/Route/Card/RouteDescriptor.vue index c57e51473..ee42d8e76 100644 --- a/src/pages/Route/Card/RouteDescriptor.vue +++ b/src/pages/Route/Card/RouteDescriptor.vue @@ -1,7 +1,7 @@ <script setup> import { ref, computed, onMounted } from 'vue'; import { useRoute } from 'vue-router'; -import CardDescriptor from 'components/ui/CardDescriptor.vue'; +import EntityDescriptor from 'components/ui/EntityDescriptor.vue'; import useCardDescription from 'composables/useCardDescription'; import VnLv from 'components/ui/VnLv.vue'; import { dashIfEmpty, toDate } from 'src/filters'; @@ -41,13 +41,12 @@ const getZone = async () => { zone.value = zoneData.name; }; const data = ref(useCardDescription()); -const setData = (entity) => (data.value = useCardDescription(entity.code, entity.id)); onMounted(async () => { getZone(); }); </script> <template> - <CardDescriptor + <EntityDescriptor :url="`Routes/${entityId}`" :filter="filter" :title="null" @@ -69,7 +68,7 @@ onMounted(async () => { <template #menu="{ entity }"> <RouteDescriptorMenu :route="entity" /> </template> - </CardDescriptor> + </EntityDescriptor> </template> <i18n> es: diff --git a/src/pages/Route/Card/RouteFilter.vue b/src/pages/Route/Card/RouteFilter.vue index cb5158517..f830b83e2 100644 --- a/src/pages/Route/Card/RouteFilter.vue +++ b/src/pages/Route/Card/RouteFilter.vue @@ -36,8 +36,7 @@ const emit = defineEmits(['search']); :label="t('globals.worker')" v-model="params.workerFk" dense - outlined - rounded + filled :input-debounce="0" /> </QItemSection> @@ -52,8 +51,7 @@ const emit = defineEmits(['search']); option-value="id" option-label="name" dense - outlined - rounded + filled :input-debounce="0" /> </QItemSection> @@ -63,7 +61,7 @@ const emit = defineEmits(['search']); <VnInputDate v-model="params.from" :label="t('globals.from')" - is-outlined + filled :disable="Boolean(params.scopeDays)" @update:model-value="params.scopeDays = null" /> @@ -74,7 +72,7 @@ const emit = defineEmits(['search']); <VnInputDate v-model="params.to" :label="t('globals.to')" - is-outlined + filled :disable="Boolean(params.scopeDays)" @update:model-value="params.scopeDays = null" /> @@ -86,7 +84,7 @@ const emit = defineEmits(['search']); v-model="params.scopeDays" type="number" :label="t('globals.daysOnward')" - is-outlined + filled clearable :disable="Boolean(params.from || params.to)" @update:model-value=" @@ -107,15 +105,14 @@ const emit = defineEmits(['search']); option-label="numberPlate" option-filter-value="numberPlate" dense - outlined - rounded + filled :input-debounce="0" /> </QItemSection> </QItem> <QItem class="q-my-sm"> <QItemSection> - <VnInput v-model="params.m3" label="m³" is-outlined clearable /> + <VnInput v-model="params.m3" label="m³" filled clearable /> </QItemSection> </QItem> <QItem class="q-my-sm"> @@ -127,8 +124,7 @@ const emit = defineEmits(['search']); option-value="id" option-label="name" dense - outlined - rounded + filled :input-debounce="0" /> </QItemSection> @@ -138,7 +134,7 @@ const emit = defineEmits(['search']); <VnInput v-model="params.description" :label="t('globals.description')" - is-outlined + filled clearable /> </QItemSection> diff --git a/src/pages/Route/Roadmap/RoadmapDescriptor.vue b/src/pages/Route/Roadmap/RoadmapDescriptor.vue index bc9230eda..dfa692feb 100644 --- a/src/pages/Route/Roadmap/RoadmapDescriptor.vue +++ b/src/pages/Route/Roadmap/RoadmapDescriptor.vue @@ -2,7 +2,7 @@ import { computed } from 'vue'; import { useRoute } from 'vue-router'; import { useI18n } from 'vue-i18n'; -import CardDescriptor from 'components/ui/CardDescriptor.vue'; +import EntityDescriptor from 'components/ui/EntityDescriptor.vue'; import VnLv from 'components/ui/VnLv.vue'; import { dashIfEmpty, toDateHourMin } from 'src/filters'; import SupplierDescriptorProxy from 'pages/Supplier/Card/SupplierDescriptorProxy.vue'; @@ -30,7 +30,7 @@ const entityId = computed(() => { </script> <template> - <CardDescriptor + <EntityDescriptor :url="`Roadmaps/${entityId}`" :filter="filter" data-key="Roadmap" @@ -52,7 +52,7 @@ const entityId = computed(() => { <template #menu="{ entity }"> <RoadmapDescriptorMenu :route="entity" /> </template> - </CardDescriptor> + </EntityDescriptor> </template> <i18n> es: diff --git a/src/pages/Route/Roadmap/RoadmapFilter.vue b/src/pages/Route/Roadmap/RoadmapFilter.vue index 982f1efba..9acbfb740 100644 --- a/src/pages/Route/Roadmap/RoadmapFilter.vue +++ b/src/pages/Route/Roadmap/RoadmapFilter.vue @@ -31,12 +31,12 @@ const emit = defineEmits(['search']); <template #body="{ params }"> <QItem class="q-my-sm"> <QItemSection> - <VnInputDate v-model="params.from" :label="t('From')" is-outlined /> + <VnInputDate v-model="params.from" :label="t('From')" filled /> </QItemSection> </QItem> <QItem class="q-my-sm"> <QItemSection> - <VnInputDate v-model="params.to" :label="t('To')" is-outlined /> + <VnInputDate v-model="params.to" :label="t('To')" filled /> </QItemSection> </QItem> <QItem class="q-my-sm"> @@ -44,7 +44,7 @@ const emit = defineEmits(['search']); <VnInput v-model="params.tractorPlate" :label="t('Tractor Plate')" - is-outlined + filled clearable /> </QItemSection> @@ -54,7 +54,7 @@ const emit = defineEmits(['search']); <VnInput v-model="params.trailerPlate" :label="t('Trailer Plate')" - is-outlined + filled clearable /> </QItemSection> @@ -66,8 +66,7 @@ const emit = defineEmits(['search']); :fields="['id', 'nickname']" v-model="params.supplierFk" dense - outlined - rounded + filled emit-value map-options use-input @@ -81,7 +80,7 @@ const emit = defineEmits(['search']); v-model="params.price" :label="t('Price')" type="number" - is-outlined + filled clearable /> </QItemSection> @@ -91,7 +90,7 @@ const emit = defineEmits(['search']); <VnInput v-model="params.driverName" :label="t('Driver name')" - is-outlined + filled clearable /> </QItemSection> @@ -101,7 +100,7 @@ const emit = defineEmits(['search']); <VnInput v-model="params.phone" :label="t('Phone')" - is-outlined + filled clearable /> </QItemSection> diff --git a/src/pages/Route/Vehicle/Card/VehicleDescriptor.vue b/src/pages/Route/Vehicle/Card/VehicleDescriptor.vue index 10c9fa9e2..bab7fa998 100644 --- a/src/pages/Route/Vehicle/Card/VehicleDescriptor.vue +++ b/src/pages/Route/Vehicle/Card/VehicleDescriptor.vue @@ -2,7 +2,7 @@ import { computed } from 'vue'; import { useRoute } from 'vue-router'; import VnLv from 'src/components/ui/VnLv.vue'; -import CardDescriptor from 'components/ui/CardDescriptor.vue'; +import EntityDescriptor from 'components/ui/EntityDescriptor.vue'; import axios from 'axios'; import useNotify from 'src/composables/useNotify.js'; @@ -20,7 +20,7 @@ const route = useRoute(); const entityId = computed(() => props.id || route.params.id); </script> <template> - <CardDescriptor + <EntityDescriptor :url="`Vehicles/${entityId}`" data-key="Vehicle" title="numberPlate" @@ -54,7 +54,7 @@ const entityId = computed(() => props.id || route.params.id); <VnLv :label="$t('globals.model')" :value="entity.model" /> <VnLv :label="$t('globals.country')" :value="entity.countryCodeFk" /> </template> - </CardDescriptor> + </EntityDescriptor> </template> <i18n> es: diff --git a/src/pages/Shelving/Card/ShelvingDescriptor.vue b/src/pages/Shelving/Card/ShelvingDescriptor.vue index 5e618aa7f..2405467da 100644 --- a/src/pages/Shelving/Card/ShelvingDescriptor.vue +++ b/src/pages/Shelving/Card/ShelvingDescriptor.vue @@ -2,7 +2,7 @@ import { computed } from 'vue'; import { useRoute } from 'vue-router'; import { useI18n } from 'vue-i18n'; -import CardDescriptor from 'components/ui/CardDescriptor.vue'; +import EntityDescriptor from 'components/ui/EntityDescriptor.vue'; import VnLv from 'components/ui/VnLv.vue'; import ShelvingDescriptorMenu from 'pages/Shelving/Card/ShelvingDescriptorMenu.vue'; import VnUserLink from 'src/components/ui/VnUserLink.vue'; @@ -24,7 +24,7 @@ const entityId = computed(() => { }); </script> <template> - <CardDescriptor + <EntityDescriptor :url="`Shelvings/${entityId}`" :filter="filter" title="code" @@ -45,5 +45,5 @@ const entityId = computed(() => { <template #menu="{ entity }"> <ShelvingDescriptorMenu :shelving="entity" /> </template> - </CardDescriptor> + </EntityDescriptor> </template> diff --git a/src/pages/Shelving/Card/ShelvingFilter.vue b/src/pages/Shelving/Card/ShelvingFilter.vue index 88d716046..35657a972 100644 --- a/src/pages/Shelving/Card/ShelvingFilter.vue +++ b/src/pages/Shelving/Card/ShelvingFilter.vue @@ -39,15 +39,14 @@ const emit = defineEmits(['search']); option-label="code" :filter-options="['id', 'code']" dense - outlined - rounded + filled sort-by="code ASC" /> </QItemSection> </QItem> <QItem class="q-mb-sm"> <QItemSection> - <VnSelectWorker v-model="params.userFk" outlined rounded /> + <VnSelectWorker v-model="params.userFk" filled /> </QItemSection> </QItem> <QItem class="q-mb-md"> diff --git a/src/pages/Shelving/Parking/Card/ParkingDescriptor.vue b/src/pages/Shelving/Parking/Card/ParkingDescriptor.vue index 07b168f87..0e01238a0 100644 --- a/src/pages/Shelving/Parking/Card/ParkingDescriptor.vue +++ b/src/pages/Shelving/Parking/Card/ParkingDescriptor.vue @@ -1,7 +1,7 @@ <script setup> import { computed } from 'vue'; import { useRoute } from 'vue-router'; -import CardDescriptor from 'components/ui/CardDescriptor.vue'; +import EntityDescriptor from 'components/ui/EntityDescriptor.vue'; import VnLv from 'components/ui/VnLv.vue'; import filter from './ParkingFilter.js'; const props = defineProps({ @@ -16,7 +16,7 @@ const route = useRoute(); const entityId = computed(() => props.id || route.params.id); </script> <template> - <CardDescriptor + <EntityDescriptor data-key="Parking" :url="`Parkings/${entityId}`" title="code" @@ -28,5 +28,5 @@ const entityId = computed(() => props.id || route.params.id); <VnLv :label="$t('parking.pickingOrder')" :value="entity.pickingOrder" /> <VnLv :label="$t('parking.sector')" :value="entity.sector?.description" /> </template> - </CardDescriptor> + </EntityDescriptor> </template> diff --git a/src/pages/Shelving/Parking/ParkingFilter.vue b/src/pages/Shelving/Parking/ParkingFilter.vue index 1d7c3a4b6..59cb49459 100644 --- a/src/pages/Shelving/Parking/ParkingFilter.vue +++ b/src/pages/Shelving/Parking/ParkingFilter.vue @@ -36,11 +36,7 @@ const emit = defineEmits(['search']); <template #body="{ params }"> <QItem> <QItemSection> - <VnInput - :label="t('params.code')" - v-model="params.code" - is-outlined - /> + <VnInput :label="t('params.code')" v-model="params.code" filled /> </QItemSection> </QItem> <QItem> @@ -51,8 +47,7 @@ const emit = defineEmits(['search']); option-label="description" :label="t('params.sectorFk')" dense - outlined - rounded + filled :options="sectors" use-input input-debounce="0" diff --git a/src/pages/Supplier/Card/SupplierBalanceFilter.vue b/src/pages/Supplier/Card/SupplierBalanceFilter.vue index c4b63d9c8..c727688ad 100644 --- a/src/pages/Supplier/Card/SupplierBalanceFilter.vue +++ b/src/pages/Supplier/Card/SupplierBalanceFilter.vue @@ -33,7 +33,7 @@ defineProps({ :label="t('params.from')" v-model="params.from" @update:model-value="searchFn()" - is-outlined + filled /> </QItemSection> </QItem> @@ -47,8 +47,7 @@ defineProps({ :include="{ relation: 'accountingType' }" sort-by="id" dense - outlined - rounded + filled > <template #option="scope"> <QItem v-bind="scope.itemProps"> @@ -74,8 +73,7 @@ defineProps({ option-label="name" hide-selected dense - outlined - rounded + filled /> </QItemSection> </QItem> diff --git a/src/pages/Supplier/Card/SupplierConsumptionFilter.vue b/src/pages/Supplier/Card/SupplierConsumptionFilter.vue index 390f7d9ff..e21e37eb3 100644 --- a/src/pages/Supplier/Card/SupplierConsumptionFilter.vue +++ b/src/pages/Supplier/Card/SupplierConsumptionFilter.vue @@ -25,20 +25,12 @@ defineProps({ <template #body="{ params, searchFn }"> <QItem> <QItemSection> - <VnInput - v-model="params.search" - :label="t('params.search')" - is-outlined - /> + <VnInput v-model="params.search" :label="t('params.search')" filled /> </QItemSection> </QItem> <QItem> <QItemSection> - <VnInput - v-model="params.itemId" - :label="t('params.itemId')" - is-outlined - /> + <VnInput v-model="params.itemId" :label="t('params.itemId')" filled /> </QItemSection> </QItem> <QItem> @@ -54,8 +46,7 @@ defineProps({ option-label="nickname" hide-selected dense - outlined - rounded + filled /> </QItemSection> </QItem> @@ -73,8 +64,7 @@ defineProps({ option-label="name" hide-selected dense - outlined - rounded + filled > <template #option="scope"> <QItem v-bind="scope.itemProps"> @@ -102,8 +92,7 @@ defineProps({ option-label="name" hide-selected dense - outlined - rounded + filled /> </QItemSection> </QItem> @@ -113,7 +102,7 @@ defineProps({ :label="t('params.from')" v-model="params.from" @update:model-value="searchFn()" - is-outlined + filled /> </QItemSection> </QItem> @@ -123,7 +112,7 @@ defineProps({ :label="t('params.to')" v-model="params.to" @update:model-value="searchFn()" - is-outlined + filled /> </QItemSection> </QItem> diff --git a/src/pages/Supplier/Card/SupplierDescriptor.vue b/src/pages/Supplier/Card/SupplierDescriptor.vue index 462bdf853..2863784ab 100644 --- a/src/pages/Supplier/Card/SupplierDescriptor.vue +++ b/src/pages/Supplier/Card/SupplierDescriptor.vue @@ -3,7 +3,7 @@ import { ref, computed, onMounted } from 'vue'; import { useRoute } from 'vue-router'; import { useI18n } from 'vue-i18n'; -import CardDescriptor from 'components/ui/CardDescriptor.vue'; +import EntityDescriptor from 'components/ui/EntityDescriptor.vue'; import VnLv from 'src/components/ui/VnLv.vue'; import { toDateString } from 'src/filters'; @@ -61,7 +61,7 @@ const getEntryQueryParams = (supplier) => { </script> <template> - <CardDescriptor + <EntityDescriptor :url="`Suppliers/${entityId}`" :filter="filter" data-key="Supplier" @@ -136,7 +136,7 @@ const getEntryQueryParams = (supplier) => { </QBtn> </QCardActions> </template> - </CardDescriptor> + </EntityDescriptor> </template> <i18n> diff --git a/src/pages/Ticket/Card/TicketDescriptor.vue b/src/pages/Ticket/Card/TicketDescriptor.vue index 743f2188c..96920231c 100644 --- a/src/pages/Ticket/Card/TicketDescriptor.vue +++ b/src/pages/Ticket/Card/TicketDescriptor.vue @@ -4,7 +4,7 @@ import { useRoute } from 'vue-router'; import { useI18n } from 'vue-i18n'; import CustomerDescriptorProxy from 'pages/Customer/Card/CustomerDescriptorProxy.vue'; import DepartmentDescriptorProxy from 'pages/Worker/Department/Card/DepartmentDescriptorProxy.vue'; -import CardDescriptor from 'components/ui/CardDescriptor.vue'; +import EntityDescriptor from 'components/ui/EntityDescriptor.vue'; import TicketDescriptorMenu from './TicketDescriptorMenu.vue'; import VnLv from 'src/components/ui/VnLv.vue'; import { toDateTimeFormat } from 'src/filters/date'; @@ -57,7 +57,7 @@ function getInfo() { </script> <template> - <CardDescriptor + <EntityDescriptor :url="`Tickets/${entityId}`" :filter="filter" data-key="Ticket" @@ -155,7 +155,7 @@ function getInfo() { </QBtn> </QCardActions> </template> - </CardDescriptor> + </EntityDescriptor> </template> <i18n> diff --git a/src/pages/Ticket/Negative/TicketLackFilter.vue b/src/pages/Ticket/Negative/TicketLackFilter.vue index 3762f453d..73d53b247 100644 --- a/src/pages/Ticket/Negative/TicketLackFilter.vue +++ b/src/pages/Ticket/Negative/TicketLackFilter.vue @@ -81,7 +81,7 @@ const setUserParams = (params) => { v-model="params.days" :label="t('negative.days')" dense - is-outlined + filled type="number" @update:model-value=" (value) => { @@ -97,7 +97,7 @@ const setUserParams = (params) => { v-model="params.id" :label="t('negative.id')" dense - is-outlined + filled /> </QItemSection> </QItem> @@ -107,7 +107,7 @@ const setUserParams = (params) => { v-model="params.producer" :label="t('negative.producer')" dense - is-outlined + filled /> </QItemSection> </QItem> @@ -117,7 +117,7 @@ const setUserParams = (params) => { v-model="params.origen" :label="t('negative.origen')" dense - is-outlined + filled /> </QItemSection> </QItem ><QItem> @@ -133,8 +133,7 @@ const setUserParams = (params) => { option-label="name" hide-selected dense - outlined - rounded + filled /> </QItemSection ><QItemSection v-else> <QSkeleton class="full-width" type="QSelect" /> @@ -151,8 +150,7 @@ const setUserParams = (params) => { option-label="name" hide-selected dense - outlined - rounded + filled > <template #option="scope"> <QItem v-bind="scope.itemProps"> diff --git a/src/pages/Ticket/TicketAdvanceFilter.vue b/src/pages/Ticket/TicketAdvanceFilter.vue index 6d5c7726e..f065eaf2e 100644 --- a/src/pages/Ticket/TicketAdvanceFilter.vue +++ b/src/pages/Ticket/TicketAdvanceFilter.vue @@ -71,7 +71,7 @@ onMounted(async () => await getItemPackingTypes()); <VnInputDate v-model="params.dateFuture" :label="t('params.dateFuture')" - is-outlined + filled /> </QItemSection> </QItem> @@ -80,7 +80,7 @@ onMounted(async () => await getItemPackingTypes()); <VnInputDate v-model="params.dateToAdvance" :label="t('params.dateToAdvance')" - is-outlined + filled /> </QItemSection> </QItem> @@ -95,8 +95,7 @@ onMounted(async () => await getItemPackingTypes()); :info="t('iptInfo')" @update:model-value="searchFn()" dense - outlined - rounded + filled :use-like="false" > </VnSelect> @@ -113,8 +112,7 @@ onMounted(async () => await getItemPackingTypes()); :info="t('iptInfo')" @update:model-value="searchFn()" dense - outlined - rounded + filled :use-like="false" > </VnSelect> @@ -125,7 +123,7 @@ onMounted(async () => await getItemPackingTypes()); <VnInputNumber v-model="params.scopeDays" :label="t('Days onward')" - is-outlined + filled /> </QItemSection> </QItem> @@ -147,8 +145,7 @@ onMounted(async () => await getItemPackingTypes()); url="Departments" :fields="['id', 'name']" dense - outlined - rounded + filled /> </QItemSection> </QItem> @@ -162,8 +159,7 @@ onMounted(async () => await getItemPackingTypes()); option-label="name" @update:model-value="searchFn()" dense - outlined - rounded + filled > </VnSelect> </QItemSection> diff --git a/src/pages/Ticket/TicketFilter.vue b/src/pages/Ticket/TicketFilter.vue index f959157f6..b763ef970 100644 --- a/src/pages/Ticket/TicketFilter.vue +++ b/src/pages/Ticket/TicketFilter.vue @@ -63,18 +63,10 @@ const getGroupedStates = (data) => { <template #body="{ params, searchFn }"> <QItem> <QItemSection> - <VnInput - v-model="params.clientFk" - :label="t('Customer ID')" - is-outlined - /> + <VnInput v-model="params.clientFk" :label="t('Customer ID')" filled /> </QItemSection> <QItemSection> - <VnInput - v-model="params.orderFk" - :label="t('Order ID')" - is-outlined - /> + <VnInput v-model="params.orderFk" :label="t('Order ID')" filled /> </QItemSection> </QItem> <QItem> @@ -82,7 +74,7 @@ const getGroupedStates = (data) => { <VnInputDate v-model="params.from" :label="t('From')" - is-outlined + filled data-cy="From_date" /> </QItemSection> @@ -90,7 +82,7 @@ const getGroupedStates = (data) => { <VnInputDate v-model="params.to" :label="t('To')" - is-outlined + filled data-cy="To_date" /> </QItemSection> @@ -98,9 +90,8 @@ const getGroupedStates = (data) => { <QItem> <QItemSection> <VnSelect - outlined dense - rounded + filled :label="t('globals.params.departmentFk')" v-model="params.departmentFk" option-value="id" @@ -125,8 +116,7 @@ const getGroupedStates = (data) => { map-options use-input dense - outlined - rounded + filled /> </QItemSection> </QItem> @@ -146,19 +136,14 @@ const getGroupedStates = (data) => { map-options use-input dense - outlined - rounded + filled sort-by="name ASC" /> </QItemSection> </QItem> <QItem> <QItemSection> - <VnInput - v-model="params.refFk" - :label="t('Invoice Ref.')" - is-outlined - /> + <VnInput v-model="params.refFk" :label="t('Invoice Ref.')" filled /> </QItemSection> </QItem> <QItem> @@ -166,17 +151,13 @@ const getGroupedStates = (data) => { <VnInput v-model="params.scopeDays" :label="t('Days onward')" - is-outlined + filled /> </QItemSection> </QItem> <QItem> <QItemSection> - <VnInput - v-model="params.nickname" - :label="t('Nickname')" - is-outlined - /> + <VnInput v-model="params.nickname" :label="t('Nickname')" filled /> </QItemSection> </QItem> <QItem> @@ -241,8 +222,7 @@ const getGroupedStates = (data) => { map-options use-input dense - outlined - rounded + filled /> </QItemSection> </QItem> @@ -260,8 +240,7 @@ const getGroupedStates = (data) => { map-options use-input dense - outlined - rounded + filled /> </QItemSection> </QItem> @@ -281,8 +260,7 @@ const getGroupedStates = (data) => { map-options use-input dense - outlined - rounded + filled /> </QItemSection> </QItem> @@ -291,7 +269,7 @@ const getGroupedStates = (data) => { <VnInput v-model="params.collectionFk" :label="t('Collection')" - is-outlined + filled /> </QItemSection> </QItem> diff --git a/src/pages/Ticket/TicketFutureFilter.vue b/src/pages/Ticket/TicketFutureFilter.vue index 64e060a39..033b47f72 100644 --- a/src/pages/Ticket/TicketFutureFilter.vue +++ b/src/pages/Ticket/TicketFutureFilter.vue @@ -73,7 +73,7 @@ onMounted(async () => { <VnInputDate v-model="params.originScopeDays" :label="t('params.originScopeDays')" - is-outlined + filled /> </QItemSection> </QItem> @@ -82,7 +82,7 @@ onMounted(async () => { <VnInputDate v-model="params.futureScopeDays" :label="t('params.futureScopeDays')" - is-outlined + filled /> </QItemSection> </QItem> @@ -91,7 +91,7 @@ onMounted(async () => { <VnInput :label="t('params.litersMax')" v-model="params.litersMax" - is-outlined + filled /> </QItemSection> </QItem> @@ -100,7 +100,7 @@ onMounted(async () => { <VnInput :label="t('params.linesMax')" v-model="params.linesMax" - is-outlined + filled /> </QItemSection> </QItem> @@ -115,8 +115,7 @@ onMounted(async () => { :info="t('iptInfo')" @update:model-value="searchFn()" dense - outlined - rounded + filled > </VnSelect> </QItemSection> @@ -132,8 +131,7 @@ onMounted(async () => { :info="t('iptInfo')" @update:model-value="searchFn()" dense - outlined - rounded + filled > </VnSelect> </QItemSection> @@ -148,8 +146,7 @@ onMounted(async () => { option-label="name" @update:model-value="searchFn()" dense - outlined - rounded + filled > </VnSelect> </QItemSection> @@ -164,8 +161,7 @@ onMounted(async () => { option-label="name" @update:model-value="searchFn()" dense - outlined - rounded + filled > </VnSelect> </QItemSection> @@ -191,8 +187,7 @@ onMounted(async () => { option-label="name" @update:model-value="searchFn()" dense - outlined - rounded + filled > </VnSelect> </QItemSection> diff --git a/src/pages/Travel/Card/TravelDescriptor.vue b/src/pages/Travel/Card/TravelDescriptor.vue index 922f89f33..d4903f794 100644 --- a/src/pages/Travel/Card/TravelDescriptor.vue +++ b/src/pages/Travel/Card/TravelDescriptor.vue @@ -3,7 +3,7 @@ import { computed, ref } from 'vue'; import { useRoute } from 'vue-router'; import { useI18n } from 'vue-i18n'; -import CardDescriptor from 'components/ui/CardDescriptor.vue'; +import EntityDescriptor from 'components/ui/EntityDescriptor.vue'; import VnLv from 'src/components/ui/VnLv.vue'; import useCardDescription from 'src/composables/useCardDescription'; import TravelDescriptorMenuItems from './TravelDescriptorMenuItems.vue'; @@ -31,7 +31,7 @@ const setData = (entity) => (data.value = useCardDescription(entity.ref, entity. </script> <template> - <CardDescriptor + <EntityDescriptor :url="`Travels/${entityId}`" :title="data.title" :subtitle="data.subtitle" @@ -79,7 +79,7 @@ const setData = (entity) => (data.value = useCardDescription(entity.ref, entity. </QBtn> </QCardActions> </template> - </CardDescriptor> + </EntityDescriptor> </template> <i18n> diff --git a/src/pages/Travel/ExtraCommunityFilter.vue b/src/pages/Travel/ExtraCommunityFilter.vue index ae6e695be..76ffdba20 100644 --- a/src/pages/Travel/ExtraCommunityFilter.vue +++ b/src/pages/Travel/ExtraCommunityFilter.vue @@ -87,7 +87,7 @@ warehouses(); <template #body="{ params, searchFn }"> <QItem> <QItemSection> - <VnInput label="id" v-model="params.id" is-outlined /> + <VnInput label="id" v-model="params.id" filled /> </QItemSection> </QItem> <QItem> @@ -95,7 +95,7 @@ warehouses(); <VnInput :label="t('extraCommunity.filter.reference')" v-model="params.reference" - is-outlined + filled /> </QItemSection> </QItem> @@ -106,8 +106,7 @@ warehouses(); type="number" :label="t('extraCommunity.filter.totalEntries')" dense - outlined - rounded + filled min="0" class="input-number" > @@ -141,8 +140,7 @@ warehouses(); option-label="name" hide-selected dense - outlined - rounded + filled /> </QItemSection> </QItem> @@ -152,7 +150,7 @@ warehouses(); :label="t('extraCommunity.filter.shippedFrom')" v-model="params.shippedFrom" @update:model-value="searchFn()" - is-outlined + filled /> </QItemSection> </QItem> @@ -162,7 +160,7 @@ warehouses(); :label="t('extraCommunity.filter.landedTo')" v-model="params.landedTo" @update:model-value="searchFn()" - is-outlined + filled /> </QItemSection> </QItem> @@ -176,8 +174,7 @@ warehouses(); option-label="name" hide-selected dense - outlined - rounded + filled /> </QItemSection> </QItem> @@ -191,8 +188,7 @@ warehouses(); option-label="name" hide-selected dense - outlined - rounded + filled /> </QItemSection> </QItem> @@ -206,8 +202,7 @@ warehouses(); option-label="name" hide-selected dense - outlined - rounded + filled /> </QItemSection> </QItem> @@ -218,8 +213,7 @@ warehouses(); v-model="params.cargoSupplierFk" hide-selected dense - outlined - rounded + filled /> </QItemSection> </QItem> @@ -229,8 +223,7 @@ warehouses(); v-model="params.entrySupplierFk" hide-selected dense - outlined - rounded + filled /> </QItemSection> </QItem> @@ -245,8 +238,7 @@ warehouses(); :filter-options="['code', 'name']" hide-selected dense - outlined - rounded + filled /> </QItemSection> </QItem> diff --git a/src/pages/Travel/TravelFilter.vue b/src/pages/Travel/TravelFilter.vue index 4a9c80952..a26cc0ec0 100644 --- a/src/pages/Travel/TravelFilter.vue +++ b/src/pages/Travel/TravelFilter.vue @@ -33,19 +33,14 @@ defineExpose({ states }); </template> <template #body="{ params, searchFn }"> <div class="q-pa-sm q-gutter-y-sm"> - <VnInput - :label="t('travel.Id')" - v-model="params.id" - lazy-rules - is-outlined - > + <VnInput :label="t('travel.Id')" v-model="params.id" lazy-rules filled> <template #prepend> <QIcon name="badge" size="xs" /></template> </VnInput> <VnInput :label="t('travel.ref')" v-model="params.ref" lazy-rules - is-outlined + filled /> <VnSelect :label="t('travel.agency')" @@ -56,8 +51,7 @@ defineExpose({ states }); :use-like="false" option-filter="name" dense - outlined - rounded + filled /> <VnSelect :label="t('travel.warehouseInFk')" @@ -69,22 +63,19 @@ defineExpose({ states }); option-label="name" option-filter="name" dense - outlined - rounded + filled /> <VnInputDate :label="t('travel.shipped')" v-model="params.shipped" @update:model-value="searchFn()" - outlined - rounded + filled /> <VnInputTime v-model="params.shipmentHour" @update:model-value="searchFn()" :label="t('travel.shipmentHour')" - outlined - rounded + filled dense /> <VnSelect @@ -97,36 +88,33 @@ defineExpose({ states }); option-label="name" option-filter="name" dense - outlined - rounded + filled /> <VnInputDate :label="t('travel.landed')" v-model="params.landed" @update:model-value="searchFn()" dense - outlined - rounded + filled /> <VnInputTime v-model="params.landingHour" @update:model-value="searchFn()" :label="t('travel.landingHour')" - outlined - rounded + filled dense /> <VnInput :label="t('travel.totalEntries')" v-model="params.totalEntries" lazy-rules - is-outlined + filled /> <VnInput :label="t('travel.daysOnward')" v-model="params.daysOnward" lazy-rules - is-outlined + filled /> </div> </template> diff --git a/src/pages/Worker/Card/WorkerCalendarFilter.vue b/src/pages/Worker/Card/WorkerCalendarFilter.vue index 48fc4094b..f0e2d758a 100644 --- a/src/pages/Worker/Card/WorkerCalendarFilter.vue +++ b/src/pages/Worker/Card/WorkerCalendarFilter.vue @@ -40,7 +40,7 @@ watch( (newValue) => { checkHolidays(newValue); }, - { deep: true, immediate: true } + { deep: true, immediate: true }, ); const emit = defineEmits(['update:businessFk', 'update:year', 'update:absenceType']); @@ -174,8 +174,7 @@ const yearList = ref(generateYears()); v-model="selectedYear" :options="yearList" dense - outlined - rounded + filled use-input :is-clearable="false" /> @@ -188,8 +187,7 @@ const yearList = ref(generateYears()); option-value="businessFk" option-label="businessFk" dense - outlined - rounded + filled use-input :is-clearable="false" > diff --git a/src/pages/Worker/Card/WorkerDescriptor.vue b/src/pages/Worker/Card/WorkerDescriptor.vue index 910c92fd8..060520e84 100644 --- a/src/pages/Worker/Card/WorkerDescriptor.vue +++ b/src/pages/Worker/Card/WorkerDescriptor.vue @@ -2,7 +2,7 @@ import { computed, ref } from 'vue'; import { useRoute } from 'vue-router'; import { useI18n } from 'vue-i18n'; -import CardDescriptor from 'src/components/ui/CardDescriptor.vue'; +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'; @@ -52,7 +52,7 @@ const handlePhotoUpdated = (evt = false) => { }; </script> <template> - <CardDescriptor + <EntityDescriptor ref="cardDescriptorRef" :data-key="dataKey" :summary="$props.summary" @@ -167,7 +167,7 @@ const handlePhotoUpdated = (evt = false) => { </QBtn> </QCardActions> </template> - </CardDescriptor> + </EntityDescriptor> <VnChangePassword ref="changePassRef" :submit-fn=" diff --git a/src/pages/Worker/Card/WorkerPda.vue b/src/pages/Worker/Card/WorkerPda.vue index d32941494..001eb368a 100644 --- a/src/pages/Worker/Card/WorkerPda.vue +++ b/src/pages/Worker/Card/WorkerPda.vue @@ -5,24 +5,25 @@ import { ref, computed } from 'vue'; import axios from 'axios'; import useNotify from 'src/composables/useNotify.js'; +import { useVnConfirm } from 'composables/useVnConfirm'; +import { useArrayData } from 'src/composables/useArrayData'; +import { downloadDocuware } from 'src/composables/downloadFile'; + import FetchData from 'components/FetchData.vue'; import FormModelPopup from 'src/components/FormModelPopup.vue'; -import { useVnConfirm } from 'composables/useVnConfirm'; - -import VnPaginate from 'src/components/ui/VnPaginate.vue'; import VnRow from 'components/ui/VnRow.vue'; import VnSelect from 'src/components/common/VnSelect.vue'; -import VnInput from 'src/components/common/VnInput.vue'; +import VnTable from 'src/components/VnTable/VnTable.vue'; const { t } = useI18n(); const { notify } = useNotify(); - -const paginate = ref(); +const loadingDocuware = ref(true); +const tableRef = ref(); const dialog = ref(); const route = useRoute(); const { openConfirmationModal } = useVnConfirm(); const routeId = computed(() => route.params.id); - +const worker = computed(() => useArrayData('Worker').store.data); const initialData = computed(() => { return { userFk: routeId.value, @@ -31,154 +32,268 @@ const initialData = computed(() => { }; }); -const deallocatePDA = async (deviceProductionFk) => { - await axios.post(`Workers/${route.params.id}/deallocatePDA`, { - pda: deviceProductionFk, - }); - notify(t('PDA deallocated'), 'positive'); - - paginate.value.fetch(); -}; +const columns = computed(() => [ + { + align: 'center', + label: t('globals.state'), + name: 'state', + format: (row) => row?.docuware?.state, + columnFilter: false, + chip: { + condition: (_, row) => !!row.docuware, + color: (row) => (isSigned(row) ? 'bg-positive' : 'bg-warning'), + }, + visible: false, + }, + { + align: 'right', + label: t('worker.pda.currentPDA'), + name: 'deviceProductionFk', + columnClass: 'shrink', + cardVisible: true, + }, + { + align: 'left', + label: t('Model'), + name: 'modelFk', + format: ({ deviceProduction }) => deviceProduction.modelFk, + cardVisible: true, + }, + { + align: 'right', + label: t('Serial number'), + name: 'serialNumber', + format: ({ deviceProduction }) => deviceProduction.serialNumber, + cardVisible: true, + }, + { + align: 'left', + label: t('Current SIM'), + name: 'simFk', + cardVisible: true, + }, + { + align: 'right', + name: 'actions', + columnFilter: false, + cardVisible: true, + }, +]); function reloadData() { initialData.value.deviceProductionFk = null; initialData.value.simFk = null; - paginate.value.fetch(); + tableRef.value.reload(); +} + +async function fetchDocuware() { + loadingDocuware.value = true; + + const id = `${worker.value?.lastName} ${worker.value?.firstName}`; + const rows = tableRef.value.CrudModelRef.formData; + + const promises = rows.map(async (row) => { + const { data } = await axios.post(`Docuwares/${id}/checkFile`, { + fileCabinet: 'hr', + signed: false, + mergeFilter: [ + { + DBName: 'TIPO_DOCUMENTO', + Value: ['PDA'], + }, + { + DBName: 'FILENAME', + Value: [`${row.deviceProductionFk}-pda`], + }, + ], + }); + row.docuware = data; + }); + + await Promise.allSettled(promises); + loadingDocuware.value = false; +} + +async function sendToTablet(rows) { + const promises = rows.map(async (row) => { + await axios.post(`Docuwares/upload-pda-pdf`, { + ids: [row.deviceProductionFk], + }); + row.docuware = true; + }); + await Promise.allSettled(promises); + notify(t('PDF sended to signed'), 'positive'); + tableRef.value.reload(); +} + +async function deallocatePDA(deviceProductionFk) { + await axios.post(`Workers/${route.params.id}/deallocatePDA`, { + pda: deviceProductionFk, + }); + const index = tableRef.value.CrudModelRef.formData.findIndex( + (data) => data?.deviceProductionFk == deviceProductionFk, + ); + delete tableRef.value.CrudModelRef.formData[index]; + notify(t('PDA deallocated'), 'positive'); +} + +function isSigned(row) { + return row.docuware?.state === 'Firmado'; } </script> <template> - <QPage class="column items-center q-pa-md centerCard"> - <FetchData - url="workers/getAvailablePda" - @on-fetch="(data) => (deviceProductions = data)" - auto-load - /> - <VnPaginate - ref="paginate" - data-key="WorkerPda" - url="DeviceProductionUsers" - :user-filter="{ where: { userFk: routeId } }" - order="id" - search-url="pda" - auto-load - > - <template #body="{ rows }"> - <QCard - flat - bordered - :key="row.id" - v-for="row of rows" - class="card q-px-md q-mb-sm container" - > - <VnRow> - <VnInput - :label="t('worker.pda.currentPDA')" - :model-value="row?.deviceProductionFk" - disable - /> - <VnInput - :label="t('Model')" - :model-value="row?.deviceProduction?.modelFk" - disable - /> - <VnInput - :label="t('Serial number')" - :model-value="row?.deviceProduction?.serialNumber" - disable - /> - <VnInput - :label="t('Current SIM')" - :model-value="row?.simFk" - disable - /> - <QBtn - flat - icon="delete" - color="primary" - class="btn-delete" - @click=" - openConfirmationModal( - t(`Remove PDA`), - t('Do you want to remove this PDA?'), - () => deallocatePDA(row.deviceProductionFk), - ) - " - > - <QTooltip> - {{ t('worker.pda.removePDA') }} - </QTooltip> - </QBtn> - </VnRow> - </QCard> - </template> - </VnPaginate> - <QPageSticky :offset="[18, 18]"> + <FetchData + url="workers/getAvailablePda" + @on-fetch="(data) => (deviceProductions = data)" + auto-load + /> + <VnTable + ref="tableRef" + data-key="WorkerPda" + url="DeviceProductionUsers" + :user-filter="{ order: 'id' }" + :filter="{ where: { userFk: routeId } }" + search-url="pda" + auto-load + :columns="columns" + @onFetch="fetchDocuware" + :hasSubToolbar="true" + :default-remove="false" + :default-reset="false" + :default-save="false" + :table="{ + 'row-key': 'deviceProductionFk', + selection: 'multiple', + }" + :table-filter="{ hiddenTags: ['userFk'] }" + > + <template #moreBeforeActions> <QBtn - @click.stop="dialog.show()" + :label="t('globals.refresh')" + icon="refresh" + @click="tableRef.reload()" + /> + <QBtn + :disable="!tableRef?.selected?.length" + :label="t('globals.send')" + icon="install_mobile" + @click="sendToTablet(tableRef?.selected)" + class="bg-primary" + /> + </template> + <template #column-actions="{ row }"> + <QBtn + flat + icon="delete" color="primary" - fab - icon="add" - v-shortcut="'+'" + @click=" + openConfirmationModal( + t(`Remove PDA`), + t('Do you want to remove this PDA?'), + () => deallocatePDA(row.deviceProductionFk), + ) + " + data-cy="workerPda-remove" > - <QDialog ref="dialog"> - <FormModelPopup - :title="t('Add new device')" - url-create="DeviceProductionUsers" - model="DeviceProductionUser" - :form-initial-data="initialData" - @on-data-saved="reloadData()" - > - <template #form-inputs="{ data }"> - <VnRow> - <VnSelect - :label="t('worker.pda.newPDA')" - v-model="data.deviceProductionFk" - :options="deviceProductions" - option-label="id" - option-value="id" - id="deviceProductionFk" - hide-selected - data-cy="pda-dialog-select" - :required="true" - > - <template #option="scope"> - <QItem v-bind="scope.itemProps"> - <QItemSection> - <QItemLabel - >ID: {{ scope.opt?.id }}</QItemLabel - > - <QItemLabel caption> - {{ scope.opt?.modelFk }}, - {{ scope.opt?.serialNumber }} - </QItemLabel> - </QItemSection> - </QItem> - </template> - </VnSelect> - <VnInput - v-model="data.simFk" - :label="t('SIM serial number')" - id="simSerialNumber" - use-input - /> - </VnRow> - </template> - </FormModelPopup> - </QDialog> + <QTooltip> + {{ t('worker.pda.removePDA') }} + </QTooltip> </QBtn> - <QTooltip> - {{ t('globals.new') }} - </QTooltip> - </QPageSticky> - </QPage> + <QBtn + v-if="!isSigned(row)" + :loading="loadingDocuware" + icon="install_mobile" + flat + color="primary" + @click=" + openConfirmationModal( + t('Sign PDA'), + t('Are you sure you want to send it?'), + () => sendToTablet([row]), + ) + " + data-cy="workerPda-send" + > + <QTooltip> + {{ t('worker.pda.sendToTablet') }} + </QTooltip> + </QBtn> + <QBtn + v-if="isSigned(row)" + :loading="loadingDocuware" + icon="cloud_download" + flat + color="primary" + @click=" + downloadDocuware('Docuwares/download-pda-pdf', { + file: row.deviceProductionFk + '-pda', + worker: worker?.lastName + ' ' + worker?.firstName, + }) + " + data-cy="workerPda-download" + > + <QTooltip> + {{ t('worker.pda.download') }} + </QTooltip> + </QBtn> + </template> + </VnTable> + <QPageSticky :offset="[18, 18]"> + <QBtn @click.stop="dialog.show()" color="primary" fab icon="add" v-shortcut="'+'"> + <QDialog ref="dialog"> + <FormModelPopup + :title="t('Add new device')" + url-create="DeviceProductionUsers" + model="DeviceProductionUser" + :form-initial-data="initialData" + @on-data-saved="reloadData()" + > + <template #form-inputs="{ data }"> + <VnRow> + <VnSelect + :label="t('PDA')" + v-model="data.deviceProductionFk" + :options="deviceProductions" + option-label="modelFk" + option-value="id" + id="deviceProductionFk" + hide-selected + data-cy="pda-dialog-select" + :required="true" + > + <template #option="scope"> + <QItem v-bind="scope.itemProps"> + <QItemSection> + <QItemLabel + >ID: {{ scope.opt?.id }}</QItemLabel + > + <QItemLabel caption> + {{ scope.opt?.modelFk }}, + {{ scope.opt?.serialNumber }} + </QItemLabel> + </QItemSection> + </QItem> + </template> + </VnSelect> + <VnSelect + url="Sims" + option-label="line" + option-value="code" + v-model="data.simFk" + :label="t('SIM serial number')" + id="simSerialNumber" + /> + </VnRow> + </template> + </FormModelPopup> + </QDialog> + </QBtn> + <QTooltip> + {{ t('globals.new') }} + </QTooltip> + </QPageSticky> </template> -<style lang="scss" scoped> -.btn-delete { - max-width: 4%; - margin-top: 30px; -} -</style> <i18n> es: Model: Modelo @@ -190,4 +305,6 @@ es: Do you want to remove this PDA?: ¿Desea eliminar este PDA? You can only have one PDA: Solo puedes tener un PDA si no eres autonomo This PDA is already assigned to another user: Este PDA ya está asignado a otro usuario + Are you sure you want to send it?: ¿Seguro que quieres enviarlo? + Sign PDA: Firmar PDA </i18n> diff --git a/src/pages/Worker/Department/Card/DepartmentDescriptor.vue b/src/pages/Worker/Department/Card/DepartmentDescriptor.vue index 4b7dfd9b8..820658593 100644 --- a/src/pages/Worker/Department/Card/DepartmentDescriptor.vue +++ b/src/pages/Worker/Department/Card/DepartmentDescriptor.vue @@ -4,7 +4,7 @@ import { useRoute, useRouter } from 'vue-router'; import { useI18n } from 'vue-i18n'; import { useVnConfirm } from 'composables/useVnConfirm'; import VnLv from 'src/components/ui/VnLv.vue'; -import CardDescriptor from 'src/components/ui/CardDescriptor.vue'; +import EntityDescriptor from 'src/components/ui/EntityDescriptor.vue'; import axios from 'axios'; import useNotify from 'src/composables/useNotify.js'; @@ -40,7 +40,7 @@ const removeDepartment = async () => { const { openConfirmationModal } = useVnConfirm(); </script> <template> - <CardDescriptor + <EntityDescriptor ref="DepartmentDescriptorRef" :url="`Departments/${entityId}`" :summary="$props.summary" @@ -95,7 +95,7 @@ const { openConfirmationModal } = useVnConfirm(); </QBtn> </QCardActions> </template> - </CardDescriptor> + </EntityDescriptor> </template> <i18n> diff --git a/src/pages/Worker/WorkerFilter.vue b/src/pages/Worker/WorkerFilter.vue index 8210ba0e3..44dfd32b4 100644 --- a/src/pages/Worker/WorkerFilter.vue +++ b/src/pages/Worker/WorkerFilter.vue @@ -35,7 +35,7 @@ const getLocale = (label) => { <template #body="{ params }"> <QItem> <QItemSection> - <VnInput :label="t('FI')" v-model="params.fi" is-outlined + <VnInput :label="t('FI')" v-model="params.fi" filled ><template #prepend> <QIcon name="badge" size="xs"></QIcon> </template ></VnInput> @@ -43,29 +43,17 @@ const getLocale = (label) => { </QItem> <QItem> <QItemSection> - <VnInput - :label="t('First Name')" - v-model="params.firstName" - is-outlined - /> + <VnInput :label="t('First Name')" v-model="params.firstName" filled /> </QItemSection> </QItem> <QItem> <QItemSection> - <VnInput - :label="t('Last Name')" - v-model="params.lastName" - is-outlined - /> + <VnInput :label="t('Last Name')" v-model="params.lastName" filled /> </QItemSection> </QItem> <QItem> <QItemSection> - <VnInput - :label="t('User Name')" - v-model="params.userName" - is-outlined - /> + <VnInput :label="t('User Name')" v-model="params.userName" filled /> </QItemSection> </QItem> <QItem> @@ -79,23 +67,18 @@ const getLocale = (label) => { emit-value map-options dense - outlined - rounded + filled /> </QItemSection> </QItem> <QItem> <QItemSection> - <VnInput :label="t('Email')" v-model="params.email" is-outlined /> + <VnInput :label="t('Email')" v-model="params.email" filled /> </QItemSection> </QItem> <QItem> <QItemSection> - <VnInput - :label="t('Extension')" - v-model="params.extension" - is-outlined - /> + <VnInput :label="t('Extension')" v-model="params.extension" filled /> </QItemSection> </QItem> <QItem> diff --git a/src/pages/Zone/Card/ZoneDescriptor.vue b/src/pages/Zone/Card/ZoneDescriptor.vue index 27676212e..f2bcc1247 100644 --- a/src/pages/Zone/Card/ZoneDescriptor.vue +++ b/src/pages/Zone/Card/ZoneDescriptor.vue @@ -2,7 +2,7 @@ import { computed } from 'vue'; import { useRoute } from 'vue-router'; -import CardDescriptor from 'components/ui/CardDescriptor.vue'; +import EntityDescriptor from 'components/ui/EntityDescriptor.vue'; import VnLv from 'src/components/ui/VnLv.vue'; import { toTimeFormat } from 'src/filters/date'; import { toCurrency } from 'filters/index'; @@ -25,7 +25,7 @@ const entityId = computed(() => { </script> <template> - <CardDescriptor :url="`Zones/${entityId}`" :filter="filter" data-key="Zone"> + <EntityDescriptor :url="`Zones/${entityId}`" :filter="filter" data-key="Zone"> <template #menu="{ entity }"> <ZoneDescriptorMenuItems :zone="entity" /> </template> @@ -36,5 +36,5 @@ const entityId = computed(() => { <VnLv :label="$t('list.price')" :value="toCurrency(entity.price)" /> <VnLv :label="$t('zone.bonus')" :value="toCurrency(entity.bonus)" /> </template> - </CardDescriptor> + </EntityDescriptor> </template> diff --git a/src/pages/Zone/ZoneDeliveryPanel.vue b/src/pages/Zone/ZoneDeliveryPanel.vue index a8cb05afc..fc5c04b41 100644 --- a/src/pages/Zone/ZoneDeliveryPanel.vue +++ b/src/pages/Zone/ZoneDeliveryPanel.vue @@ -95,8 +95,7 @@ watch( :filter-options="['code']" hide-selected dense - outlined - rounded + filled map-key="geoFk" data-cy="ZoneDeliveryDaysPostcodeSelect" > @@ -128,8 +127,7 @@ watch( option-label="name" hide-selected dense - outlined - rounded + filled data-cy="ZoneDeliveryDaysAgencySelect" /> <VnSelect @@ -144,7 +142,6 @@ watch( option-label="name" hide-selected dense - outlined rounded /> </div> diff --git a/test/cypress/integration/vnComponent/VnLog.spec.js b/test/cypress/integration/vnComponent/VnLog.spec.js index e857457a7..ae0013150 100644 --- a/test/cypress/integration/vnComponent/VnLog.spec.js +++ b/test/cypress/integration/vnComponent/VnLog.spec.js @@ -25,7 +25,7 @@ describe('VnLog', () => { it('should show claimDescriptor', () => { cy.dataCy('iconLaunch-claimFk').first().click(); - cy.dataCy('cardDescriptor_subtitle').contains('1'); + cy.dataCy('vnDescriptor_subtitle').contains('1'); cy.dataCy('iconLaunch-claimFk').first().click(); }); }); diff --git a/test/cypress/integration/worker/workerPda.spec.js b/test/cypress/integration/worker/workerPda.spec.js index 31ec19eda..2623e81cf 100644 --- a/test/cypress/integration/worker/workerPda.spec.js +++ b/test/cypress/integration/worker/workerPda.spec.js @@ -1,23 +1,80 @@ describe('WorkerPda', () => { - const select = '[data-cy="pda-dialog-select"]'; + const deviceId = 4; beforeEach(() => { - cy.viewport(1920, 1080); cy.login('developer'); cy.visit(`/#/worker/1110/pda`); }); - it('assign pda', () => { - cy.addBtnClick(); - cy.get(select).click(); - cy.get(select).type('{downArrow}{enter}'); - cy.get('.q-notification__message').should('have.text', 'Data created'); + it('assign and delete pda', () => { + creatNewPDA(); + cy.checkNotification('Data created'); + cy.visit(`/#/worker/1110/pda`); + removeNewPDA(); + cy.checkNotification('PDA deallocated'); }); - it('delete pda', () => { - cy.get('.btn-delete').click(); - cy.get( - '.q-card__actions > .q-btn--unelevated > .q-btn__content > .block' - ).click(); - cy.get('.q-notification__message').should('have.text', 'PDA deallocated'); + it('send and download pdf to docuware', () => { + //Send + cy.intercept('POST', '/api/Docuwares/upload-pda-pdf', (req) => { + req.reply({ + statusCode: 200, + body: {}, + }); + }); + + creatNewPDA(); + + cy.dataCy('workerPda-send').click(); + cy.clickConfirm(); + cy.checkNotification('PDF sended to signed'); + + //Download + cy.intercept('POST', /\/api\/Docuwares\/Jones%20Jessica\/checkFile/, (req) => { + req.reply({ + statusCode: 200, + body: { + id: deviceId, + state: 'Firmado', + }, + }); + }); + cy.get('#st-actions').contains('refresh').click(); + cy.intercept('GET', '/api/Docuwares/download-pda-pdf**', (req) => { + req.reply({ + statusCode: 200, + body: {}, + }); + }); + + cy.dataCy('workerPda-download').click(); + removeNewPDA(); }); + + it('send 2 pdfs to docuware', () => { + cy.intercept('POST', '/api/Docuwares/upload-pda-pdf', (req) => { + req.reply({ + statusCode: 200, + body: {}, + }); + }); + + creatNewPDA(); + creatNewPDA(2); + cy.selectRows([1, 2]); + cy.get('#st-actions').contains('Send').click(); + cy.checkNotification('PDF sended to signed'); + + removeNewPDA(); + }); + + function creatNewPDA(id = deviceId) { + cy.addBtnClick(); + cy.selectOption('[data-cy="pda-dialog-select"]', id); + cy.saveCard(); + } + + function removeNewPDA() { + cy.dataCy('workerPda-remove').first().click(); + cy.clickConfirm(); + } }); diff --git a/test/cypress/support/commands.js b/test/cypress/support/commands.js index de25959b2..fe8d38e79 100755 --- a/test/cypress/support/commands.js +++ b/test/cypress/support/commands.js @@ -371,7 +371,7 @@ Cypress.Commands.add('validateContent', (selector, expectedValue) => { }); Cypress.Commands.add('openActionsDescriptor', () => { - cy.get('[data-cy="cardDescriptor"] [data-cy="descriptor-more-opts"]').click(); + cy.get('[data-cy="vnDescriptor"] [data-cy="descriptor-more-opts"]').click(); }); Cypress.Commands.add('openUserPanel', () => { @@ -466,16 +466,16 @@ Cypress.Commands.add('validateDescriptor', (toCheck = {}) => { const popupSelector = popup ? '[role="menu"] ' : ''; - if (title) cy.get(`${popupSelector}[data-cy="cardDescriptor_title"]`).contains(title); + if (title) cy.get(`${popupSelector}[data-cy="vnDescriptor_title"]`).contains(title); if (description) - cy.get(`${popupSelector}[data-cy="cardDescriptor_description"]`).contains( + cy.get(`${popupSelector}[data-cy="vnDescriptor_description"]`).contains( description, ); if (subtitle) - cy.get(`${popupSelector}[data-cy="cardDescriptor_subtitle"]`).contains(subtitle); + cy.get(`${popupSelector}[data-cy="vnDescriptor_subtitle"]`).contains(subtitle); for (const index in listbox) - cy.get(`${popupSelector}[data-cy="cardDescriptor_listbox"] > *`) + cy.get(`${popupSelector}[data-cy="vnDescriptor_listbox"] > *`) .eq(index) .should('contain.text', listbox[index]); });