Apply workerDms changes
gitea/salix-front/pipeline/pr-dev There was a failure building this commit Details

This commit is contained in:
William Buezas 2024-04-09 08:28:00 -03:00
parent 0d6d18b8c8
commit f6e140e369
11 changed files with 163 additions and 125 deletions

View File

@ -198,9 +198,11 @@ function addDefaultData(data) {
en:
contentTypesInfo: Allowed file types {allowedContentTypes}
EntryDmsDescription: Reference {reference}
WorkersDescription: Working of employee id {reference}
es:
Generate identifier for original file: Generar identificador para archivo original
contentTypesInfo: Tipos de archivo permitidos {allowedContentTypes}
EntryDmsDescription: Referencia {reference}
WorkersDescription: Laboral del empleado {reference}
</i18n>

View File

@ -5,11 +5,12 @@ import { useRoute } from 'vue-router';
import { useQuasar, QCheckbox, QBtn, QInput } from 'quasar';
import axios from 'axios';
import FetchData from 'components/FetchData.vue';
import VnPaginate from 'components/ui/VnPaginate.vue';
import VnDms from 'src/components/common/VnDms.vue';
import VnConfirm from 'components/ui/VnConfirm.vue';
import VnInputDate from 'components/common/VnInputDate.vue';
import VnUserLink from '../ui/VnUserLink.vue';
import { downloadFile } from 'src/composables/downloadFile';
import { getUrlFindOne } from 'composables/getUrl';
const route = useRoute();
const quasar = useQuasar();
@ -27,6 +28,11 @@ const $props = defineProps({
type: String,
default: null,
},
downloadModel: {
type: String,
required: false,
default: null,
},
defaultDmsCode: {
type: String,
required: true,
@ -75,7 +81,7 @@ const dmsFilter = {
],
},
},
order: ['dmsFk DESC'],
where: { [$props.filter]: route.params.id },
};
const columns = computed(() => [
@ -95,12 +101,12 @@ const columns = computed(() => [
props: (prop) => ({
readonly: true,
borderless: true,
'model-value': prop.row.dmsType.name,
'model-value': prop.row.dmsType?.name,
}),
},
{
align: 'left',
field: 'order',
field: 'hardCopyNumber',
label: t('globals.order'),
name: 'order',
component: 'span',
@ -118,6 +124,7 @@ const columns = computed(() => [
label: t('globals.description'),
name: 'description',
component: 'span',
props: (prop) => ({ value: prop.value?.toUpperCase() }),
},
{
align: 'left',
@ -137,6 +144,28 @@ const columns = computed(() => [
name: 'file',
component: 'span',
},
{
align: 'left',
field: 'worker',
label: t('globals.worker'),
name: 'worker',
component: VnUserLink,
props: (prop) => ({
name: prop.row.worker?.user?.name.toLowerCase(),
workerId: prop.row.worker?.id,
}),
},
{
align: 'left',
field: 'created',
label: t('globals.created'),
name: 'created',
component: VnInputDate,
props: (prop) => ({
disable: true,
'model-value': prop.row.created,
}),
},
{
field: 'options',
name: 'options',
@ -144,16 +173,24 @@ const columns = computed(() => [
{
component: QBtn,
name: 'download',
isDocuware: true,
props: () => ({
icon: 'cloud_download',
flat: true,
color: 'primary',
}),
click: (prop) => downloadFile(prop.row.id, prop.row.isDocuware),
click: (prop) =>
downloadFile(
prop.row.id,
$props.downloadModel,
null,
prop.row.download
),
},
{
component: QBtn,
name: 'edit',
external: false,
props: () => ({
icon: 'edit',
flat: true,
@ -164,6 +201,7 @@ const columns = computed(() => [
{
component: QBtn,
name: 'delete',
external: false,
props: () => ({
icon: 'delete',
flat: true,
@ -173,20 +211,22 @@ const columns = computed(() => [
},
{
component: QBtn,
name: 'openDocuware',
name: 'open',
external: true,
props: () => ({
icon: 'open_in_new',
flat: true,
color: 'primary',
}),
click: () => openDocuware(),
click: (prop) => open(prop.row.url),
},
],
},
]);
function setData(data) {
const newData = data.map((value) => value.dms);
const newData = data.map((value) => value.dms || value);
newData.sort((a, b) => new Date(b.created) - new Date(a.created));
rows.value = newData;
}
@ -221,100 +261,105 @@ function parseDms(data) {
return data;
}
async function openDocuware() {
const url = await getUrlFindOne('WebClient', 'docuware');
if (url) window.open(url).focus();
async function open(url) {
window.open(url).focus();
}
function shouldRenderButton(buttonName, isDocuware = false) {
// Renderizar el botón si no se llama 'openDocuware' o (se llama 'openDocuware' y props.row.isDocuware = true)
return buttonName !== 'openDocuware' || (buttonName === 'openDocuware' && isDocuware);
function shouldRenderButton(button, isExternal = false) {
if (button.name == 'download') return true;
return button.external === isExternal;
}
</script>
<template>
<FetchData
<VnPaginate
ref="dmsRef"
:data-key="$props.model"
:url="$props.model"
:filter="dmsFilter"
:where="{ [$props.filter]: route.params.id }"
:order="['dmsFk DESC']"
:auto-load="true"
@on-fetch="setData"
auto-load
/>
<QTable
:columns="columns"
:rows="rows"
class="full-width q-mt-md"
hide-bottom
row-key="clientFk"
:grid="$q.screen.lt.sm"
>
<template #body-cell="props">
<QTd :props="props">
<QTr :props="props">
<component
v-if="props.col.component"
:is="props.col.component"
v-bind="props.col.props && props.col.props(props)"
>
<span
v-if="props.col.component == 'span'"
style="white-space: wrap"
>{{ props.value }}</span
>
</component>
</QTr>
<div class="flex justify-center" v-if="props.col.name == 'options'">
<div v-for="button of props.col.components" :key="button.id">
<component
v-if="shouldRenderButton(button.name, props.row.isDocuware)"
:is="button.component"
v-bind="button.props(props)"
@click="button.click(props)"
/>
</div>
</div>
</QTd>
</template>
<template #item="props">
<div class="q-pa-xs col-xs-12 col-sm-6 grid-style-transition">
<QCard
bordered
flat
@keyup.ctrl.enter.stop="claimDevelopmentForm?.saveChanges()"
>
<QSeparator />
<QList dense>
<QItem v-for="col in props.cols" :key="col.name">
<div v-if="col.name != 'options'" class="row">
<span class="labelColor">{{ col.label }}:</span>
<span>{{ col.value }}</span>
</div>
<div v-if="col.name == 'options'" class="row">
<div
v-for="button of col.components"
:key="button.id"
class="row"
<template #body>
<QTable
:columns="columns"
:rows="rows"
class="full-width q-mt-md"
hide-bottom
row-key="clientFk"
:grid="$q.screen.lt.sm"
>
<template #body-cell="props">
<QTd :props="props">
<QTr :props="props">
<component
v-if="props.col.component"
:is="props.col.component"
v-bind="props.col.props && props.col.props(props)"
>
<span
v-if="props.col.component == 'span'"
style="white-space: wrap"
>{{ props.value }}</span
>
<component
v-if="
shouldRenderButton(
button.name,
props.row.isDocuware
)
"
:is="button.component"
v-bind="button.props(col)"
@click="button.click(col)"
/>
</div>
</component>
</QTr>
<div class="row no-wrap" v-if="props.col.name == 'options'">
<div v-for="button of props.col.components" :key="button.id">
<component
v-if="
shouldRenderButton(button, props.row.isDocuware)
"
:is="button.component"
v-bind="button.props(props)"
@click="button.click(props)"
/>
</div>
</QItem>
</QList>
</QCard>
</div>
</div>
</QTd>
</template>
<template #item="props">
<div class="q-pa-xs col-xs-12 col-sm-6 grid-style-transition">
<QCard
bordered
flat
@keyup.ctrl.enter.stop="claimDevelopmentForm?.saveChanges()"
>
<QSeparator />
<QList dense>
<QItem v-for="col in props.cols" :key="col.name">
<div v-if="col.name != 'options'" class="row">
<span class="labelColor">{{ col.label }}:</span>
<span>{{ col.value }}</span>
</div>
<div v-if="col.name == 'options'" class="row">
<div
v-for="button of col.components"
:key="button.id"
class="row"
>
<component
v-if="
shouldRenderButton(
button.name,
props.row.isDocuware
)
"
:is="button.component"
v-bind="button.props(col)"
@click="button.click(col)"
/>
</div>
</div>
</QItem>
</QList>
</QCard>
</div>
</template>
</QTable>
</template>
</QTable>
</VnPaginate>
<QDialog v-model="formDialog.show">
<VnDms
:model="updateModel ?? model"

View File

@ -110,7 +110,7 @@ async function paginate() {
if (!arrayData.hasMoreData.value) {
if (store.userParamsChanged) arrayData.hasMoreData.value = true;
store.userParamsChanged = false;
isLoading.value = false;
endPagination();
return;
}
@ -120,12 +120,14 @@ async function paginate() {
pagination.value.sortBy = sortBy;
pagination.value.descending = descending;
isLoading.value = false;
endPagination();
}
function endPagination() {
isLoading.value = false;
emit('onFetch', store.data);
emit('onPaginate');
}
async function onLoad(index, done) {
if (!store.data) {
return done();
@ -188,6 +190,12 @@ async function onLoad(index, done) {
<QSpinner color="orange" size="md" />
</div>
</QInfiniteScroll>
<div
v-if="!isLoading && arrayData.hasMoreData"
class="w-full flex justify-center q-mt-md"
>
<QBtn color="primary" :label="t('Load more data')" @click="paginate()" />
</div>
</template>
<style lang="scss" scoped>
@ -204,4 +212,5 @@ async function onLoad(index, done) {
es:
No data to display: Sin datos que mostrar
No results found: No se han encontrado resultados
Load more data: Cargar más resultados
</i18n>

View File

@ -76,7 +76,7 @@ const removeNode = (node) => {
notify(t('department.departmentRemoved'), 'positive');
await fetchNodeLeaves(parentFk);
} catch (err) {
console.log('Error removing department');
console.error('Error removing department');
}
});
};

View File

@ -4,9 +4,8 @@ import { getUrl } from './getUrl';
const { getTokenMultimedia } = useSession();
const token = getTokenMultimedia();
export async function downloadFile(dmsId, isDocuware = false) {
export async function downloadFile(id, model = 'dms', urlPath = '/downloadFile', url) {
let appUrl = await getUrl('', 'lilium');
appUrl = appUrl.replace('/#/', '');
const urlPath = isDocuware ? '/docuwareDownload' : '/downloadFile';
window.open(`${appUrl}/api/dms/${dmsId}${urlPath}?access_token=${token}`);
window.open(url ?? `${appUrl}/api/${model}/${id}${urlPath}?access_token=${token}`);
}

View File

@ -1,7 +1,4 @@
import axios from 'axios';
import useNotify from 'src/composables/useNotify.js';
const { notify } = useNotify();
export async function getUrl(route, app = 'salix') {
let url;
@ -11,24 +8,3 @@ export async function getUrl(route, app = 'salix') {
});
return url;
}
export async function getUrlFindOne(route, app = 'salix') {
try {
const env = process.env.NODE_ENV;
const filter = {
where: { and: [{ appName: app }, { environment: env }] },
};
const { data } = await axios.get('Urls/findOne', {
params: { filter: JSON.stringify(filter) },
});
if (!data) return null;
return data.url + route;
} catch (err) {
notify('Direction not found', 'negative');
console.error('Error finding url: ', err);
}
}

View File

@ -98,7 +98,7 @@ export function useArrayData(key, userOptions) {
const { limit } = filter;
hasMoreData.value = response.data.length === limit;
hasMoreData.value = response.data.length >= limit;
if (append) {
if (!store.data) store.data = [];

View File

@ -92,6 +92,8 @@ export default {
log: 'Logs',
parkingList: 'Parkings list',
},
created: 'Created',
worker: 'Worker',
},
errors: {
statusUnauthorized: 'Access denied',

View File

@ -92,6 +92,8 @@ export default {
log: 'Historial',
parkingList: 'Listado de parkings',
},
created: 'Fecha creación',
worker: 'Trabajador',
},
errors: {
statusUnauthorized: 'Acceso denegado',

View File

@ -63,7 +63,7 @@ const removeDepartment = () => {
router.push({ name: 'WorkerDepartment' });
notify('department.departmentRemoved', 'positive');
} catch (err) {
console.log('Error removing department');
console.error('Error removing department');
}
});
};

View File

@ -1,11 +1,14 @@
<script setup>
import VnDmsList from 'src/components/common/VnDmsList.vue';
import { useRoute } from 'vue-router';
const route = useRoute();
</script>
<template>
<VnDmsList
model="WorkerDms"
:model="`WorkerDms/${route.params.id}/filter`"
update-model="Workers"
download-model="WorkerDms"
default-dms-code="hhrrData"
filter="workerFk"
filter="worker"
/>
</template>