#7874 add observation type #765

Merged
jorgep merged 22 commits from 7874-addObservationType into dev 2024-10-14 14:16:45 +00:00
2 changed files with 81 additions and 37 deletions
Showing only changes of commit 709a662ceb - Show all commits

View File

@ -1,6 +1,6 @@
<script setup>
import axios from 'axios';
import { ref } from 'vue';
import { ref, reactive } from 'vue';
import { onBeforeRouteLeave } from 'vue-router';
import { useI18n } from 'vue-i18n';
import { useQuasar } from 'quasar';
@ -12,36 +12,39 @@ import VnPaginate from 'components/ui/VnPaginate.vue';
import VnUserLink from 'components/ui/VnUserLink.vue';
import VnConfirm from 'components/ui/VnConfirm.vue';
import VnAvatar from 'components/ui/VnAvatar.vue';
import VnRow from './VnRow.vue';
jorgep marked this conversation as resolved Outdated

Podemos seguir el standard de las lineas superiores, queda raro 2 formatos en el mismo archivo

Podemos seguir el standard de las lineas superiores, queda raro 2 formatos en el mismo archivo
import VnSelect from '../common/VnSelect.vue';
import FetchData from '../FetchData.vue';
import VnInput from '../common/VnInput.vue';
const $props = defineProps({
url: { type: String, default: null },
filter: { type: Object, default: () => {} },
body: { type: Object, default: () => {} },
addNote: { type: Boolean, default: false },
selectType: { type: Boolean, default: false },
});
const { t } = useI18n();
const state = useState();
const quasar = useQuasar();
const currentUser = ref(state.getUser());
const newNote = ref('');
const newNote = reactive({ text: '', observationTypeFk: null });
jorgep marked this conversation as resolved Outdated

porque no puede ser null?

porque no puede ser null?
const observationTypes = ref([]);
const vnPaginateRef = ref();
function handleKeyUp(event) {
if (event.key === 'Enter') {
event.preventDefault();
if (!event.shiftKey) insert();
}
}
async function insert() {
const body = $props.body;
const newBody = { ...body, ...{ text: newNote.value } };
const newBody = {
...body,
...{ text: newNote.text, observationTypeFk: newNote.observationTypeFk },
};
await axios.post($props.url, newBody);
await vnPaginateRef.value.fetch();
newNote.value = '';
}
onBeforeRouteLeave((to, from, next) => {
if (newNote.value)
if (newNote.text)
quasar.dialog({
component: VnConfirm,
componentProps: {
@ -54,6 +57,12 @@ onBeforeRouteLeave((to, from, next) => {
});
</script>
<template>
<FetchData
url="ObservationTypes"
:filter="{ fields: ['id', 'description'] }"
:auto-load="selectType"
@on-fetch="(data) => observationTypes.push(...data)"
/>
<QCard class="q-pa-xs q-mb-xl full-width" v-if="$props.addNote">
<QCardSection horizontal>
<VnAvatar :worker-id="currentUser.id" size="md" />
@ -62,29 +71,38 @@ onBeforeRouteLeave((to, from, next) => {
{{ t('globals.now') }}
</div>
</QCardSection>
<QCardSection class="q-pa-xs q-my-none q-py-none" horizontal>
<QInput
v-model="newNote"
class="full-width"
type="textarea"
:label="t('Add note here...')"
filled
size="lg"
autogrow
autofocus
@keyup="handleKeyUp"
clearable
>
<template #append>
<QBtn
:title="t('Save (Enter)')"
icon="save"
color="primary"
flat
@click="insert"
/>
</template>
</QInput>
<QCardSection class="q-px-xs q-my-none q-py-none">
<VnRow class="full-width">
<VnSelect
:label="t('Observation type')"
v-if="selectType"
url="ObservationTypes"
v-model="newNote.observationTypeFk"
option-label="description"
style="flex: 0.15; margin-left: 0"
/>
<VnInput
v-model.trim="newNote.text"
type="textarea"
:label="t('Add note here...')"
filled
size="lg"
autogrow
autofocus
@keyup.enter="insert"
clearable
>
<template #append>
<QBtn
:title="t('Save (Enter)')"
icon="save"
color="primary"
flat
@click="insert"
/>
</template>
</VnInput>
</VnRow>
</QCardSection>
</QCard>
<VnPaginate
@ -98,6 +116,10 @@ onBeforeRouteLeave((to, from, next) => {
class="show"
v-bind="$attrs"
search-url="notes"
@on-fetch="
newNote.text = '';
newNote.observationTypeFk = null;
"
>
<template #body="{ rows }">
<TransitionGroup name="list" tag="div" class="column items-center full-width">
@ -111,17 +133,38 @@ onBeforeRouteLeave((to, from, next) => {
:descriptor="false"
:worker-id="note.workerFk"
size="md"
:title="note.worker?.user.nickname"
/>
<div class="full-width row justify-between q-pa-xs">
<VnUserLink
:name="`${note.worker.user.nickname}`"
:worker-id="note.worker.id"
/>
{{ toDateHourMin(note.created) }}
<span v-text="toDateHourMin(note.created)" />
</div>
</QCardSection>
<QCardSection class="q-pa-xs q-my-none q-py-none">
{{ note.text }}
<VnRow>
<VnSelect
:label="t('Observation type')"
v-if="selectType && note.observationTypeFk"
url="ObservationTypes"
v-model="note.observationTypeFk"
option-label="description"
style="flex: 0.15"
dense
readonly
:is-clearable="false"
/>
<span
:style="{
flex: 0.85,
'align-self':
jorgep marked this conversation as resolved Outdated

Porque usamos vnselect para informar al usuario del tipo? Entendería esto si de alguna manera cambiase de estado, es decir readonly o no.
Mi propuesta es que sea un texto o por ejemplo un QBadge outlined
Veo consigo usar vnselect readonly

Porque usamos vnselect para informar al usuario del tipo? Entendería esto si de alguna manera cambiase de estado, es decir readonly o no. Mi propuesta es que sea un texto o por ejemplo un QBadge outlined Veo consigo usar vnselect readonly

Es para seguir el patrón de estilo de otras secciones. @jgallego que opinas?

Es para seguir el patrón de estilo de otras secciones. @jgallego que opinas?
selectType & $q.screen.gt.xs ? 'end' : 'baseline',
}"
v-text="note.text"
/>
</VnRow>
</QCardSection>
</QCard>
</TransitionGroup>
@ -156,5 +199,5 @@ onBeforeRouteLeave((to, from, next) => {
Add note here...: Añadir nota aquí...
New note: Nueva nota
Save (Enter): Guardar (Intro)
Observation type: Tipo de observación
</i18n>

View File

@ -22,5 +22,6 @@ const noteFilter = computed(() => {
:filter="noteFilter"
:body="{ clientFk: route.params.id }"
style="overflow-y: auto"
:select-type="true"
/>
</template>