forked from verdnatura/salix-front
Merge branch 'dev' of https://gitea.verdnatura.es/verdnatura/salix-front into 6897-entryMigration2
This commit is contained in:
commit
dc9463f249
|
@ -90,7 +90,7 @@ const $props = defineProps({
|
||||||
});
|
});
|
||||||
const emit = defineEmits(['onFetch', 'onDataSaved']);
|
const emit = defineEmits(['onFetch', 'onDataSaved']);
|
||||||
const modelValue = computed(
|
const modelValue = computed(
|
||||||
() => $props.model ?? `formModel_${route?.meta?.title ?? route.name}`
|
() => $props.model ?? `formModel_${route?.meta?.title ?? route.name}`,
|
||||||
).value;
|
).value;
|
||||||
const componentIsRendered = ref(false);
|
const componentIsRendered = ref(false);
|
||||||
const arrayData = useArrayData(modelValue);
|
const arrayData = useArrayData(modelValue);
|
||||||
|
@ -137,7 +137,7 @@ onMounted(async () => {
|
||||||
JSON.stringify(newVal) !== JSON.stringify(originalData.value);
|
JSON.stringify(newVal) !== JSON.stringify(originalData.value);
|
||||||
isResetting.value = false;
|
isResetting.value = false;
|
||||||
},
|
},
|
||||||
{ deep: true }
|
{ deep: true },
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
@ -145,7 +145,7 @@ onMounted(async () => {
|
||||||
if (!$props.url)
|
if (!$props.url)
|
||||||
watch(
|
watch(
|
||||||
() => arrayData.store.data,
|
() => arrayData.store.data,
|
||||||
(val) => updateAndEmit('onFetch', val)
|
(val) => updateAndEmit('onFetch', val),
|
||||||
);
|
);
|
||||||
|
|
||||||
watch(formUrl, async () => {
|
watch(formUrl, async () => {
|
||||||
|
@ -206,11 +206,11 @@ async function save() {
|
||||||
|
|
||||||
updateAndEmit('onDataSaved', formData.value, response?.data);
|
updateAndEmit('onDataSaved', formData.value, response?.data);
|
||||||
if ($props.reload) await arrayData.fetch({});
|
if ($props.reload) await arrayData.fetch({});
|
||||||
|
hasChanges.value = false;
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
console.error(err);
|
console.error(err);
|
||||||
notify('errors.writeRequest', 'negative');
|
notify('errors.writeRequest', 'negative');
|
||||||
} finally {
|
} finally {
|
||||||
hasChanges.value = false;
|
|
||||||
isLoading.value = false;
|
isLoading.value = false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -239,7 +239,7 @@ function filter(value, update, filterOptions) {
|
||||||
(ref) => {
|
(ref) => {
|
||||||
ref.setOptionIndex(-1);
|
ref.setOptionIndex(-1);
|
||||||
ref.moveOptionSelection(1, true);
|
ref.moveOptionSelection(1, true);
|
||||||
}
|
},
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -7,6 +7,7 @@ import { useArrayData } from 'composables/useArrayData';
|
||||||
import VnSelect from 'components/common/VnSelect.vue';
|
import VnSelect from 'components/common/VnSelect.vue';
|
||||||
import VnInput from 'components/common/VnInput.vue';
|
import VnInput from 'components/common/VnInput.vue';
|
||||||
import VnInputDate from 'components/common/VnInputDate.vue';
|
import VnInputDate from 'components/common/VnInputDate.vue';
|
||||||
|
import VnInputTime from 'components/common/VnInputTime.vue';
|
||||||
import VnTableColumn from 'components/VnTable/VnColumn.vue';
|
import VnTableColumn from 'components/VnTable/VnColumn.vue';
|
||||||
|
|
||||||
const $props = defineProps({
|
const $props = defineProps({
|
||||||
|
@ -75,6 +76,17 @@ const components = {
|
||||||
},
|
},
|
||||||
forceAttrs,
|
forceAttrs,
|
||||||
},
|
},
|
||||||
|
time: {
|
||||||
|
component: markRaw(VnInputTime),
|
||||||
|
event: updateEvent,
|
||||||
|
attrs: {
|
||||||
|
...defaultAttrs,
|
||||||
|
disable: !$props.isEditable,
|
||||||
|
},
|
||||||
|
forceAttrs: {
|
||||||
|
label: $props.showLabel && $props.column.label,
|
||||||
|
},
|
||||||
|
},
|
||||||
checkbox: {
|
checkbox: {
|
||||||
component: markRaw(QCheckbox),
|
component: markRaw(QCheckbox),
|
||||||
event: updateEvent,
|
event: updateEvent,
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
<script setup>
|
<script setup>
|
||||||
import { onBeforeMount, computed } from 'vue';
|
import { onBeforeMount, computed } from 'vue';
|
||||||
import { useRoute } from 'vue-router';
|
import { useRoute, onBeforeRouteUpdate } from 'vue-router';
|
||||||
import { useArrayData } from 'src/composables/useArrayData';
|
import { useArrayData } from 'src/composables/useArrayData';
|
||||||
import { useStateStore } from 'stores/useStateStore';
|
import { useStateStore } from 'stores/useStateStore';
|
||||||
import useCardSize from 'src/composables/useCardSize';
|
import useCardSize from 'src/composables/useCardSize';
|
||||||
|
@ -41,6 +41,15 @@ onBeforeMount(async () => {
|
||||||
if (!props.baseUrl) arrayData.store.filter.where = { id: route.params.id };
|
if (!props.baseUrl) arrayData.store.filter.where = { id: route.params.id };
|
||||||
await arrayData.fetch({ append: false });
|
await arrayData.fetch({ append: false });
|
||||||
});
|
});
|
||||||
|
|
||||||
|
if (props.baseUrl) {
|
||||||
|
onBeforeRouteUpdate(async (to, from) => {
|
||||||
|
if (to.params.id !== from.params.id) {
|
||||||
|
arrayData.store.url = `${props.baseUrl}/${to.params.id}`;
|
||||||
|
await arrayData.fetch({ append: false, updateRouter: false });
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
</script>
|
</script>
|
||||||
<template>
|
<template>
|
||||||
<QDrawer
|
<QDrawer
|
||||||
|
|
|
@ -1,84 +1,31 @@
|
||||||
<script setup>
|
<script setup>
|
||||||
import { computed, ref } from 'vue';
|
import { onMounted, watch, computed, ref } from 'vue';
|
||||||
|
import { date } from 'quasar';
|
||||||
import { useI18n } from 'vue-i18n';
|
import { useI18n } from 'vue-i18n';
|
||||||
import isValidDate from 'filters/isValidDate';
|
|
||||||
|
|
||||||
const props = defineProps({
|
const model = defineModel({ type: String });
|
||||||
modelValue: {
|
const $props = defineProps({
|
||||||
type: String,
|
|
||||||
default: null,
|
|
||||||
},
|
|
||||||
readonly: {
|
|
||||||
type: Boolean,
|
|
||||||
default: false,
|
|
||||||
},
|
|
||||||
isOutlined: {
|
isOutlined: {
|
||||||
type: Boolean,
|
type: Boolean,
|
||||||
default: false,
|
default: false,
|
||||||
},
|
},
|
||||||
emitDateFormat: {
|
|
||||||
type: Boolean,
|
|
||||||
default: false,
|
|
||||||
},
|
|
||||||
});
|
});
|
||||||
const hover = ref(false);
|
|
||||||
|
|
||||||
const emit = defineEmits(['update:modelValue']);
|
|
||||||
|
|
||||||
const { t } = useI18n();
|
const { t } = useI18n();
|
||||||
const requiredFieldRule = (val) => !!val || t('globals.fieldRequired');
|
const requiredFieldRule = (val) => !!val || t('globals.fieldRequired');
|
||||||
|
|
||||||
const joinDateAndTime = (date, time) => {
|
const dateFormat = 'DD/MM/YYYY';
|
||||||
if (!date) {
|
const isPopupOpen = ref();
|
||||||
return null;
|
const hover = ref();
|
||||||
}
|
const mask = ref();
|
||||||
if (!time) {
|
|
||||||
return new Date(date).toISOString();
|
|
||||||
}
|
|
||||||
const [year, month, day] = date.split('/');
|
|
||||||
return new Date(`${year}-${month}-${day}T${time}`).toISOString();
|
|
||||||
};
|
|
||||||
|
|
||||||
const time = computed(() => (props.modelValue ? props.modelValue.split('T')?.[1] : null));
|
onMounted(() => {
|
||||||
const value = computed({
|
// fix quasar bug
|
||||||
get() {
|
mask.value = '##/##/####';
|
||||||
return props.modelValue;
|
|
||||||
},
|
|
||||||
set(value) {
|
|
||||||
emit(
|
|
||||||
'update:modelValue',
|
|
||||||
props.emitDateFormat ? new Date(value) : joinDateAndTime(value, time.value)
|
|
||||||
);
|
|
||||||
},
|
|
||||||
});
|
});
|
||||||
|
|
||||||
const isPopupOpen = ref(false);
|
|
||||||
|
|
||||||
const onDateUpdate = (date) => {
|
|
||||||
value.value = date;
|
|
||||||
isPopupOpen.value = false;
|
|
||||||
};
|
|
||||||
|
|
||||||
const padDate = (value) => value.toString().padStart(2, '0');
|
|
||||||
const formatDate = (dateString) => {
|
|
||||||
const date = new Date(dateString || '');
|
|
||||||
return `${date.getFullYear()}/${padDate(date.getMonth() + 1)}/${padDate(
|
|
||||||
date.getDate()
|
|
||||||
)}`;
|
|
||||||
};
|
|
||||||
const displayDate = (dateString) => {
|
|
||||||
if (!dateString || !isValidDate(dateString)) {
|
|
||||||
return '';
|
|
||||||
}
|
|
||||||
return new Date(dateString).toLocaleDateString([], {
|
|
||||||
year: 'numeric',
|
|
||||||
month: '2-digit',
|
|
||||||
day: '2-digit',
|
|
||||||
});
|
|
||||||
};
|
|
||||||
|
|
||||||
const styleAttrs = computed(() => {
|
const styleAttrs = computed(() => {
|
||||||
return props.isOutlined
|
return $props.isOutlined
|
||||||
? {
|
? {
|
||||||
dense: true,
|
dense: true,
|
||||||
outlined: true,
|
outlined: true,
|
||||||
|
@ -86,52 +33,101 @@ const styleAttrs = computed(() => {
|
||||||
}
|
}
|
||||||
: {};
|
: {};
|
||||||
});
|
});
|
||||||
|
|
||||||
|
const formattedDate = computed({
|
||||||
|
get() {
|
||||||
|
if (!model.value) return model.value;
|
||||||
|
return date.formatDate(new Date(model.value), dateFormat);
|
||||||
|
},
|
||||||
|
set(value) {
|
||||||
|
if (value == model.value) return;
|
||||||
|
let newDate;
|
||||||
|
if (value) {
|
||||||
|
// parse input
|
||||||
|
if (value.includes('/') && value.length >= 10) {
|
||||||
|
if (value.at(2) == '/') value = value.split('/').reverse().join('/');
|
||||||
|
value = date.formatDate(
|
||||||
|
new Date(value).toISOString(),
|
||||||
|
'YYYY-MM-DDTHH:mm:ss.SSSZ'
|
||||||
|
);
|
||||||
|
}
|
||||||
|
let ymd = value.split('-').map((e) => parseInt(e));
|
||||||
|
newDate = new Date(ymd[0], ymd[1] - 1, ymd[2]);
|
||||||
|
if (model.value) {
|
||||||
|
const orgDate =
|
||||||
|
model.value instanceof Date ? model.value : new Date(model.value);
|
||||||
|
|
||||||
|
newDate.setHours(
|
||||||
|
orgDate.getHours(),
|
||||||
|
orgDate.getMinutes(),
|
||||||
|
orgDate.getSeconds(),
|
||||||
|
orgDate.getMilliseconds()
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!isNaN(newDate)) model.value = newDate.toISOString();
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
const popupDate = computed(() =>
|
||||||
|
model.value ? date.formatDate(new Date(model.value), 'YYYY/MM/DD') : model.value
|
||||||
|
);
|
||||||
|
|
||||||
|
watch(
|
||||||
|
() => model.value,
|
||||||
|
(val) => (formattedDate.value = val),
|
||||||
|
{ immediate: true }
|
||||||
|
);
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<template>
|
<template>
|
||||||
<div @mouseover="hover = true" @mouseleave="hover = false">
|
<div @mouseover="hover = true" @mouseleave="hover = false">
|
||||||
<QInput
|
<QInput
|
||||||
|
v-model="formattedDate"
|
||||||
class="vn-input-date"
|
class="vn-input-date"
|
||||||
readonly
|
:mask="mask"
|
||||||
:model-value="displayDate(value)"
|
placeholder="dd/mm/aaaa"
|
||||||
v-bind="{ ...$attrs, ...styleAttrs }"
|
v-bind="{ ...$attrs, ...styleAttrs }"
|
||||||
:class="{ required: $attrs.required }"
|
:class="{ required: $attrs.required }"
|
||||||
:rules="$attrs.required ? [requiredFieldRule] : null"
|
:rules="$attrs.required ? [requiredFieldRule] : null"
|
||||||
@click="isPopupOpen = true"
|
:clearable="false"
|
||||||
>
|
>
|
||||||
<template #append>
|
<template #append>
|
||||||
<QIcon
|
<QIcon
|
||||||
name="close"
|
name="close"
|
||||||
size="xs"
|
size="xs"
|
||||||
v-if="hover && value && !readonly"
|
v-if="
|
||||||
@click="onDateUpdate(null)"
|
($attrs.clearable == undefined || $attrs.clearable) &&
|
||||||
></QIcon>
|
hover &&
|
||||||
<QIcon name="event" class="cursor-pointer">
|
model &&
|
||||||
<QPopupProxy
|
!$attrs.disable
|
||||||
v-model="isPopupOpen"
|
"
|
||||||
cover
|
@click="
|
||||||
|
model = null;
|
||||||
|
isPopupOpen = false;
|
||||||
|
"
|
||||||
|
/>
|
||||||
|
<QIcon name="event" class="cursor-pointer" />
|
||||||
|
</template>
|
||||||
|
<QMenu
|
||||||
transition-show="scale"
|
transition-show="scale"
|
||||||
transition-hide="scale"
|
transition-hide="scale"
|
||||||
:no-parent-event="props.readonly"
|
v-model="isPopupOpen"
|
||||||
|
anchor="bottom left"
|
||||||
|
self="top start"
|
||||||
|
:no-focus="true"
|
||||||
>
|
>
|
||||||
<QDate
|
<QDate
|
||||||
|
v-model="popupDate"
|
||||||
:today-btn="true"
|
:today-btn="true"
|
||||||
:model-value="formatDate(value)"
|
@update:model-value="
|
||||||
@update:model-value="onDateUpdate"
|
(date) => {
|
||||||
|
formattedDate = date;
|
||||||
|
isPopupOpen = false;
|
||||||
|
}
|
||||||
|
"
|
||||||
/>
|
/>
|
||||||
</QPopupProxy>
|
</QMenu>
|
||||||
</QIcon>
|
|
||||||
</template>
|
|
||||||
</QInput>
|
</QInput>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<style lang="scss">
|
|
||||||
.vn-input-date.q-field--standard.q-field--readonly .q-field__control:before {
|
|
||||||
border-bottom-style: solid;
|
|
||||||
}
|
|
||||||
|
|
||||||
.vn-input-date.q-field--outlined.q-field--readonly .q-field__control:before {
|
|
||||||
border-style: solid;
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
|
|
|
@ -1,14 +1,11 @@
|
||||||
<script setup>
|
<script setup>
|
||||||
import { computed, ref } from 'vue';
|
import { watch, computed, ref } from 'vue';
|
||||||
import { useI18n } from 'vue-i18n';
|
import { useI18n } from 'vue-i18n';
|
||||||
import isValidDate from 'filters/isValidDate';
|
import { date } from 'quasar';
|
||||||
|
|
||||||
|
const model = defineModel({ type: String });
|
||||||
const props = defineProps({
|
const props = defineProps({
|
||||||
modelValue: {
|
timeOnly: {
|
||||||
type: String,
|
|
||||||
default: null,
|
|
||||||
},
|
|
||||||
readonly: {
|
|
||||||
type: Boolean,
|
type: Boolean,
|
||||||
default: false,
|
default: false,
|
||||||
},
|
},
|
||||||
|
@ -17,43 +14,12 @@ const props = defineProps({
|
||||||
default: false,
|
default: false,
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
const emit = defineEmits(['update:modelValue']);
|
|
||||||
const { t } = useI18n();
|
const { t } = useI18n();
|
||||||
const requiredFieldRule = (val) => !!val || t('globals.fieldRequired');
|
const requiredFieldRule = (val) => !!val || t('globals.fieldRequired');
|
||||||
|
|
||||||
const value = computed({
|
const dateFormat = 'HH:mm';
|
||||||
get() {
|
const isPopupOpen = ref();
|
||||||
return props.modelValue;
|
const hover = ref();
|
||||||
},
|
|
||||||
set(value) {
|
|
||||||
const [hours, minutes] = value.split(':');
|
|
||||||
const date = new Date(props.modelValue);
|
|
||||||
date.setHours(Number.parseInt(hours) || 0, Number.parseInt(minutes) || 0, 0, 0);
|
|
||||||
emit('update:modelValue', value ? date.toISOString() : null);
|
|
||||||
},
|
|
||||||
});
|
|
||||||
|
|
||||||
const isPopupOpen = ref(false);
|
|
||||||
const onDateUpdate = (date) => {
|
|
||||||
internalValue.value = date;
|
|
||||||
};
|
|
||||||
|
|
||||||
const save = () => {
|
|
||||||
value.value = internalValue.value;
|
|
||||||
};
|
|
||||||
const formatTime = (dateString) => {
|
|
||||||
if (!dateString || !isValidDate(dateString)) {
|
|
||||||
return '';
|
|
||||||
}
|
|
||||||
|
|
||||||
const date = new Date(dateString || '');
|
|
||||||
return date.toLocaleTimeString([], {
|
|
||||||
hour: '2-digit',
|
|
||||||
minute: '2-digit',
|
|
||||||
});
|
|
||||||
};
|
|
||||||
|
|
||||||
const internalValue = ref(formatTime(value));
|
|
||||||
|
|
||||||
const styleAttrs = computed(() => {
|
const styleAttrs = computed(() => {
|
||||||
return props.isOutlined
|
return props.isOutlined
|
||||||
|
@ -64,65 +30,84 @@ const styleAttrs = computed(() => {
|
||||||
}
|
}
|
||||||
: {};
|
: {};
|
||||||
});
|
});
|
||||||
|
|
||||||
|
const formattedTime = computed({
|
||||||
|
get() {
|
||||||
|
if (!model.value || model.value?.length <= 5) return model.value;
|
||||||
|
return dateToTime(model.value);
|
||||||
|
},
|
||||||
|
set(value) {
|
||||||
|
if (value == model.value) return;
|
||||||
|
let time = value;
|
||||||
|
if (time) {
|
||||||
|
if (time?.length > 5) time = dateToTime(time);
|
||||||
|
if (!props.timeOnly) {
|
||||||
|
const hours = time.split(':');
|
||||||
|
const date = new Date();
|
||||||
|
date.setHours(hours[0], hours[1], 0);
|
||||||
|
time = date.toISOString();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
model.value = time;
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
function dateToTime(newDate) {
|
||||||
|
return date.formatDate(new Date(newDate), dateFormat);
|
||||||
|
}
|
||||||
|
|
||||||
|
watch(
|
||||||
|
() => model.value,
|
||||||
|
(val) => (formattedTime.value = val),
|
||||||
|
{ immediate: true }
|
||||||
|
);
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<template>
|
<template>
|
||||||
|
<div @mouseover="hover = true" @mouseleave="hover = false">
|
||||||
<QInput
|
<QInput
|
||||||
class="vn-input-time"
|
class="vn-input-time"
|
||||||
readonly
|
mask="##:##"
|
||||||
:model-value="formatTime(value)"
|
placeholder="--:--"
|
||||||
|
v-model="formattedTime"
|
||||||
v-bind="{ ...$attrs, ...styleAttrs }"
|
v-bind="{ ...$attrs, ...styleAttrs }"
|
||||||
:class="{ required: $attrs.required }"
|
:class="{ required: $attrs.required }"
|
||||||
|
style="min-width: 100px"
|
||||||
:rules="$attrs.required ? [requiredFieldRule] : null"
|
:rules="$attrs.required ? [requiredFieldRule] : null"
|
||||||
@click="isPopupOpen = true"
|
|
||||||
>
|
>
|
||||||
<template #append>
|
<template #append>
|
||||||
<QIcon name="Schedule" class="cursor-pointer">
|
<QIcon
|
||||||
<QPopupProxy
|
name="close"
|
||||||
v-model="isPopupOpen"
|
size="xs"
|
||||||
cover
|
v-if="
|
||||||
|
($attrs.clearable == undefined || $attrs.clearable) &&
|
||||||
|
hover &&
|
||||||
|
model &&
|
||||||
|
!$attrs.disable
|
||||||
|
"
|
||||||
|
@click="
|
||||||
|
model = null;
|
||||||
|
isPopupOpen = false;
|
||||||
|
"
|
||||||
|
/>
|
||||||
|
<QIcon name="Schedule" class="cursor-pointer" />
|
||||||
|
</template>
|
||||||
|
<QMenu
|
||||||
transition-show="scale"
|
transition-show="scale"
|
||||||
transition-hide="scale"
|
transition-hide="scale"
|
||||||
:no-parent-event="props.readonly"
|
v-model="isPopupOpen"
|
||||||
|
anchor="bottom left"
|
||||||
|
self="top start"
|
||||||
|
:no-focus="true"
|
||||||
>
|
>
|
||||||
<QTime
|
<QTime
|
||||||
:format24h="false"
|
:format24h="false"
|
||||||
:model-value="formatTime(value)"
|
v-model="formattedTime"
|
||||||
@update:model-value="onDateUpdate"
|
mask="HH:mm"
|
||||||
>
|
landscape
|
||||||
<div class="row items-center justify-end q-gutter-sm">
|
now-btn
|
||||||
<QBtn
|
|
||||||
:label="t('Cancel')"
|
|
||||||
color="primary"
|
|
||||||
flat
|
|
||||||
v-close-popup
|
|
||||||
/>
|
/>
|
||||||
<QBtn
|
</QMenu>
|
||||||
label="Ok"
|
|
||||||
color="primary"
|
|
||||||
flat
|
|
||||||
@click="save"
|
|
||||||
v-close-popup
|
|
||||||
/>
|
|
||||||
</div>
|
|
||||||
</QTime>
|
|
||||||
</QPopupProxy>
|
|
||||||
</QIcon>
|
|
||||||
</template>
|
|
||||||
</QInput>
|
</QInput>
|
||||||
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<style lang="scss">
|
|
||||||
.vn-input-time.q-field--standard.q-field--readonly .q-field__control:before {
|
|
||||||
border-bottom-style: solid;
|
|
||||||
}
|
|
||||||
|
|
||||||
.vn-input-time.q-field--outlined.q-field--readonly .q-field__control:before {
|
|
||||||
border-style: solid;
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
|
|
||||||
<i18n>
|
|
||||||
es:
|
|
||||||
Cancel: Cancelar
|
|
||||||
</i18n>
|
|
||||||
|
|
|
@ -46,7 +46,7 @@ let arrayData;
|
||||||
let store;
|
let store;
|
||||||
let entity;
|
let entity;
|
||||||
const isLoading = ref(false);
|
const isLoading = ref(false);
|
||||||
|
const isSameDataKey = computed(() => $props.dataKey === route.meta.moduleName);
|
||||||
defineExpose({ getData });
|
defineExpose({ getData });
|
||||||
|
|
||||||
onBeforeMount(async () => {
|
onBeforeMount(async () => {
|
||||||
|
@ -58,10 +58,12 @@ onBeforeMount(async () => {
|
||||||
store = arrayData.store;
|
store = arrayData.store;
|
||||||
entity = computed(() => (Array.isArray(store.data) ? store.data[0] : store.data));
|
entity = computed(() => (Array.isArray(store.data) ? store.data[0] : store.data));
|
||||||
// It enables to load data only once if the module is the same as the dataKey
|
// It enables to load data only once if the module is the same as the dataKey
|
||||||
if ($props.dataKey !== route.meta.moduleName || !route.params.id) await getData();
|
if (!isSameDataKey.value || !route.params.id) await getData();
|
||||||
watch(
|
watch(
|
||||||
() => [$props.url, $props.filter],
|
() => [$props.url, $props.filter],
|
||||||
async () => await getData()
|
async () => {
|
||||||
|
if (!isSameDataKey.value) await getData();
|
||||||
|
}
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -77,6 +79,19 @@ async function getData() {
|
||||||
isLoading.value = false;
|
isLoading.value = false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function getValueFromPath(path) {
|
||||||
|
if (!path) return;
|
||||||
|
const keys = path.toString().split('.');
|
||||||
|
let current = entity.value;
|
||||||
|
|
||||||
|
for (let i = 0; i < keys.length; i++) {
|
||||||
|
if (current[keys[i]] === undefined) return undefined;
|
||||||
|
else current = current[keys[i]];
|
||||||
|
}
|
||||||
|
return current;
|
||||||
|
}
|
||||||
|
|
||||||
const emit = defineEmits(['onFetch']);
|
const emit = defineEmits(['onFetch']);
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
|
@ -139,8 +154,8 @@ const emit = defineEmits(['onFetch']);
|
||||||
<QList dense>
|
<QList dense>
|
||||||
<QItemLabel header class="ellipsis text-h5" :lines="1">
|
<QItemLabel header class="ellipsis text-h5" :lines="1">
|
||||||
<div class="title">
|
<div class="title">
|
||||||
<span v-if="$props.title" :title="$props.title">
|
<span v-if="$props.title" :title="getValueFromPath(title)">
|
||||||
{{ entity[title] ?? $props.title }}
|
{{ getValueFromPath(title) ?? $props.title }}
|
||||||
</span>
|
</span>
|
||||||
<slot v-else name="description" :entity="entity">
|
<slot v-else name="description" :entity="entity">
|
||||||
<span :title="entity.name">
|
<span :title="entity.name">
|
||||||
|
@ -151,7 +166,7 @@ const emit = defineEmits(['onFetch']);
|
||||||
</QItemLabel>
|
</QItemLabel>
|
||||||
<QItem dense>
|
<QItem dense>
|
||||||
<QItemLabel class="subtitle" caption>
|
<QItemLabel class="subtitle" caption>
|
||||||
#{{ $props.subtitle ?? entity.id }}
|
#{{ getValueFromPath(subtitle) ?? entity.id }}
|
||||||
</QItemLabel>
|
</QItemLabel>
|
||||||
</QItem>
|
</QItem>
|
||||||
</QList>
|
</QList>
|
||||||
|
|
|
@ -114,6 +114,7 @@ async function search(evt) {
|
||||||
store.userParamsChanged = true;
|
store.userParamsChanged = true;
|
||||||
store.filter.skip = 0;
|
store.filter.skip = 0;
|
||||||
store.skip = 0;
|
store.skip = 0;
|
||||||
|
store.page = 1;
|
||||||
const { params: newParams } = await arrayData.addFilter({ params: userParams.value });
|
const { params: newParams } = await arrayData.addFilter({ params: userParams.value });
|
||||||
userParams.value = newParams;
|
userParams.value = newParams;
|
||||||
|
|
||||||
|
@ -126,7 +127,8 @@ async function search(evt) {
|
||||||
async function reload() {
|
async function reload() {
|
||||||
isLoading.value = true;
|
isLoading.value = true;
|
||||||
const params = Object.values(userParams.value).filter((param) => param);
|
const params = Object.values(userParams.value).filter((param) => param);
|
||||||
|
store.skip = 0;
|
||||||
|
store.page = 1;
|
||||||
await arrayData.fetch({ append: false });
|
await arrayData.fetch({ append: false });
|
||||||
if (!$props.showAll && !params.length) store.data = [];
|
if (!$props.showAll && !params.length) store.data = [];
|
||||||
isLoading.value = false;
|
isLoading.value = false;
|
||||||
|
@ -138,6 +140,7 @@ async function clearFilters() {
|
||||||
store.userParamsChanged = true;
|
store.userParamsChanged = true;
|
||||||
store.filter.skip = 0;
|
store.filter.skip = 0;
|
||||||
store.skip = 0;
|
store.skip = 0;
|
||||||
|
store.page = 1;
|
||||||
// Filtrar los params no removibles
|
// Filtrar los params no removibles
|
||||||
const removableFilters = Object.keys(userParams.value).filter((param) =>
|
const removableFilters = Object.keys(userParams.value).filter((param) =>
|
||||||
$props.unremovableParams.includes(param)
|
$props.unremovableParams.includes(param)
|
||||||
|
|
|
@ -104,6 +104,7 @@ async function search() {
|
||||||
([key, value]) => value && (props.staticParams || []).includes(key)
|
([key, value]) => value && (props.staticParams || []).includes(key)
|
||||||
);
|
);
|
||||||
store.skip = 0;
|
store.skip = 0;
|
||||||
|
store.page = 1;
|
||||||
|
|
||||||
if (props.makeFetch)
|
if (props.makeFetch)
|
||||||
await arrayData.applyFilter({
|
await arrayData.applyFilter({
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
import { onMounted, ref, computed } from 'vue';
|
import { onMounted, computed } from 'vue';
|
||||||
import { useRouter, useRoute } from 'vue-router';
|
import { useRouter, useRoute } from 'vue-router';
|
||||||
import axios from 'axios';
|
import axios from 'axios';
|
||||||
import { useArrayDataStore } from 'stores/useArrayDataStore';
|
import { useArrayDataStore } from 'stores/useArrayDataStore';
|
||||||
|
@ -16,8 +16,6 @@ export function useArrayData(key = useRoute().meta.moduleName, userOptions) {
|
||||||
const router = useRouter();
|
const router = useRouter();
|
||||||
let canceller = null;
|
let canceller = null;
|
||||||
|
|
||||||
const page = ref(1);
|
|
||||||
|
|
||||||
onMounted(() => {
|
onMounted(() => {
|
||||||
setOptions();
|
setOptions();
|
||||||
store.skip = 0;
|
store.skip = 0;
|
||||||
|
@ -87,13 +85,13 @@ export function useArrayData(key = useRoute().meta.moduleName, userOptions) {
|
||||||
}
|
}
|
||||||
|
|
||||||
Object.assign(filter, store.userFilter, exprFilter);
|
Object.assign(filter, store.userFilter, exprFilter);
|
||||||
Object.assign(store.filter, { ...filter, skip: store.skip });
|
Object.assign(store.filter, filter);
|
||||||
const params = {
|
const params = { filter: store.filter };
|
||||||
filter: JSON.stringify(store.filter),
|
|
||||||
};
|
|
||||||
|
|
||||||
Object.assign(params, userParams);
|
Object.assign(params, userParams);
|
||||||
|
params.filter.skip = store.skip;
|
||||||
|
|
||||||
|
params.filter = JSON.stringify(params.filter);
|
||||||
store.currentFilter = params;
|
store.currentFilter = params;
|
||||||
store.isLoading = true;
|
store.isLoading = true;
|
||||||
const response = await axios.get(store.url, {
|
const response = await axios.get(store.url, {
|
||||||
|
@ -154,8 +152,7 @@ export function useArrayData(key = useRoute().meta.moduleName, userOptions) {
|
||||||
store.userParams = userParams;
|
store.userParams = userParams;
|
||||||
store.skip = 0;
|
store.skip = 0;
|
||||||
store.filter.skip = 0;
|
store.filter.skip = 0;
|
||||||
page.value = 1;
|
store.page = 1;
|
||||||
|
|
||||||
await fetch({ append: false });
|
await fetch({ append: false });
|
||||||
return { filter, params };
|
return { filter, params };
|
||||||
}
|
}
|
||||||
|
@ -187,10 +184,11 @@ export function useArrayData(key = useRoute().meta.moduleName, userOptions) {
|
||||||
async function loadMore() {
|
async function loadMore() {
|
||||||
if (!store.hasMoreData) return;
|
if (!store.hasMoreData) return;
|
||||||
|
|
||||||
store.skip = store.limit * page.value;
|
store.skip = store.limit * store.page;
|
||||||
page.value += 1;
|
store.page += 1;
|
||||||
|
|
||||||
await fetch({ append: true });
|
await fetch({ append: true });
|
||||||
|
updateStateParams();
|
||||||
}
|
}
|
||||||
|
|
||||||
async function refresh() {
|
async function refresh() {
|
||||||
|
|
|
@ -56,8 +56,7 @@ onMounted(async () => {
|
||||||
:url="`Claims/${entityId}`"
|
:url="`Claims/${entityId}`"
|
||||||
:filter="filter"
|
:filter="filter"
|
||||||
module="Claim"
|
module="Claim"
|
||||||
:title="data.title"
|
title="client.name"
|
||||||
:subtitle="data.subtitle"
|
|
||||||
@on-fetch="setData"
|
@on-fetch="setData"
|
||||||
data-key="Claim"
|
data-key="Claim"
|
||||||
>
|
>
|
||||||
|
|
|
@ -200,16 +200,10 @@ onUnmounted(() => (stateStore.rightDrawer = false));
|
||||||
<VnInputDate
|
<VnInputDate
|
||||||
:label="t('lastEntries.since')"
|
:label="t('lastEntries.since')"
|
||||||
dense
|
dense
|
||||||
emit-date-format
|
|
||||||
v-model="from"
|
v-model="from"
|
||||||
class="q-mr-lg"
|
class="q-mr-lg"
|
||||||
/>
|
/>
|
||||||
<VnInputDate
|
<VnInputDate :label="t('lastEntries.to')" dense v-model="to" />
|
||||||
:label="t('lastEntries.to')"
|
|
||||||
dense
|
|
||||||
emit-date-format
|
|
||||||
v-model="to"
|
|
||||||
/>
|
|
||||||
</div>
|
</div>
|
||||||
<QSpace />
|
<QSpace />
|
||||||
<div id="st-actions"></div>
|
<div id="st-actions"></div>
|
||||||
|
|
|
@ -192,7 +192,6 @@ const decrement = (paramsObj, key) => {
|
||||||
v-model="params.from"
|
v-model="params.from"
|
||||||
@update:model-value="searchFn()"
|
@update:model-value="searchFn()"
|
||||||
is-outlined
|
is-outlined
|
||||||
emit-date-format
|
|
||||||
/>
|
/>
|
||||||
</QItemSection>
|
</QItemSection>
|
||||||
</QItem>
|
</QItem>
|
||||||
|
@ -203,7 +202,6 @@ const decrement = (paramsObj, key) => {
|
||||||
v-model="params.to"
|
v-model="params.to"
|
||||||
@update:model-value="searchFn()"
|
@update:model-value="searchFn()"
|
||||||
is-outlined
|
is-outlined
|
||||||
emit-date-format
|
|
||||||
/>
|
/>
|
||||||
</QItemSection>
|
</QItemSection>
|
||||||
</QItem>
|
</QItem>
|
||||||
|
|
|
@ -169,7 +169,6 @@ const columns = computed(() => [
|
||||||
<VnInputDate
|
<VnInputDate
|
||||||
:label="t('salesClientsTable.from')"
|
:label="t('salesClientsTable.from')"
|
||||||
dense
|
dense
|
||||||
emit-date-format
|
|
||||||
v-model="from"
|
v-model="from"
|
||||||
class="q-mr-lg"
|
class="q-mr-lg"
|
||||||
style="width: 150px"
|
style="width: 150px"
|
||||||
|
@ -177,7 +176,6 @@ const columns = computed(() => [
|
||||||
<VnInputDate
|
<VnInputDate
|
||||||
:label="t('salesClientsTable.to')"
|
:label="t('salesClientsTable.to')"
|
||||||
dense
|
dense
|
||||||
emit-date-format
|
|
||||||
v-model="to"
|
v-model="to"
|
||||||
style="width: 150px"
|
style="width: 150px"
|
||||||
/>
|
/>
|
||||||
|
|
|
@ -2,7 +2,6 @@
|
||||||
import VnCard from 'components/common/VnCard.vue';
|
import VnCard from 'components/common/VnCard.vue';
|
||||||
import OrderDescriptor from 'pages/Order/Card/OrderDescriptor.vue';
|
import OrderDescriptor from 'pages/Order/Card/OrderDescriptor.vue';
|
||||||
import OrderFilter from './OrderFilter.vue';
|
import OrderFilter from './OrderFilter.vue';
|
||||||
import OrderSearchbar from './OrderSearchbar.vue';
|
|
||||||
</script>
|
</script>
|
||||||
<template>
|
<template>
|
||||||
<VnCard
|
<VnCard
|
||||||
|
@ -11,9 +10,7 @@ import OrderSearchbar from './OrderSearchbar.vue';
|
||||||
:descriptor="OrderDescriptor"
|
:descriptor="OrderDescriptor"
|
||||||
:filter-panel="OrderFilter"
|
:filter-panel="OrderFilter"
|
||||||
search-data-key="OrderList"
|
search-data-key="OrderList"
|
||||||
>
|
searchbar-label="Search order"
|
||||||
<template #searchbar>
|
searchbar-info="ypu can search by order id or name"
|
||||||
<OrderSearchbar />
|
/>
|
||||||
</template>
|
|
||||||
</VnCard>
|
|
||||||
</template>
|
</template>
|
||||||
|
|
|
@ -37,6 +37,10 @@ const selectedOrder = ref(null);
|
||||||
const selectedOrderField = ref(null);
|
const selectedOrderField = ref(null);
|
||||||
const moreFields = ref([]);
|
const moreFields = ref([]);
|
||||||
const moreFieldsOrder = ref([]);
|
const moreFieldsOrder = ref([]);
|
||||||
|
const selectedTag = ref(null);
|
||||||
|
const tagValues = ref([{}]);
|
||||||
|
const tagOptions = ref([]);
|
||||||
|
|
||||||
const createValue = (val, done) => {
|
const createValue = (val, done) => {
|
||||||
if (val.length > 2) {
|
if (val.length > 2) {
|
||||||
if (!tagOptions.value.includes(val)) {
|
if (!tagOptions.value.includes(val)) {
|
||||||
|
@ -95,10 +99,6 @@ function exprBuilder(param, value) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const selectedTag = ref(null);
|
|
||||||
const tagValues = ref([{}]);
|
|
||||||
const tagOptions = ref([]);
|
|
||||||
|
|
||||||
const applyTagFilter = (params, search) => {
|
const applyTagFilter = (params, search) => {
|
||||||
if (!tagValues.value?.length) {
|
if (!tagValues.value?.length) {
|
||||||
params.tagGroups = null;
|
params.tagGroups = null;
|
||||||
|
@ -139,34 +139,22 @@ const onOrderChange = (value, params) => {
|
||||||
};
|
};
|
||||||
|
|
||||||
const onOrderFieldChange = (value, params) => {
|
const onOrderFieldChange = (value, params) => {
|
||||||
const tagObj = JSON.parse(params.orderBy); // esto donde va
|
const tagObj = JSON.parse(params.orderBy);
|
||||||
const fields = {
|
|
||||||
Relevancy: (value) => value + ' DESC, name',
|
|
||||||
ColorAndPrice: 'showOrder, price',
|
|
||||||
Name: 'name',
|
|
||||||
Price: 'price',
|
|
||||||
};
|
|
||||||
let tagField = fields[value];
|
|
||||||
if (!tagField) return;
|
|
||||||
|
|
||||||
if (typeof tagField === 'function') tagField = tagField(value);
|
|
||||||
tagObj.field = tagField;
|
|
||||||
params.orderBy = JSON.stringify(tagObj);
|
|
||||||
switch (value) {
|
switch (value) {
|
||||||
case 'Relevancy':
|
case 'Relevancy':
|
||||||
tagObj.field = value + ' DESC, name';
|
tagObj.name = value + ' DESC, name';
|
||||||
params.orderBy = JSON.stringify(tagObj);
|
params.orderBy = JSON.stringify(tagObj);
|
||||||
break;
|
break;
|
||||||
case 'ColorAndPrice':
|
case 'ColorAndPrice':
|
||||||
tagObj.field = 'showOrder, price';
|
tagObj.name = 'showOrder, price';
|
||||||
params.orderBy = JSON.stringify(tagObj);
|
params.orderBy = JSON.stringify(tagObj);
|
||||||
break;
|
break;
|
||||||
case 'Name':
|
case 'Name':
|
||||||
tagObj.field = 'name';
|
tagObj.name = 'name';
|
||||||
params.orderBy = JSON.stringify(tagObj);
|
params.orderBy = JSON.stringify(tagObj);
|
||||||
break;
|
break;
|
||||||
case 'Price':
|
case 'Price':
|
||||||
tagObj.field = 'price';
|
tagObj.name = 'price';
|
||||||
params.orderBy = JSON.stringify(tagObj);
|
params.orderBy = JSON.stringify(tagObj);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -308,6 +296,7 @@ const useLang = (values) => {
|
||||||
v-model="selectedOrder"
|
v-model="selectedOrder"
|
||||||
:options="moreFields"
|
:options="moreFields"
|
||||||
option-label="label"
|
option-label="label"
|
||||||
|
option-value="way"
|
||||||
dense
|
dense
|
||||||
outlined
|
outlined
|
||||||
rounded
|
rounded
|
||||||
|
|
|
@ -27,7 +27,7 @@ const dialog = ref(null);
|
||||||
<div class="container order-catalog-item overflow-hidden">
|
<div class="container order-catalog-item overflow-hidden">
|
||||||
<QCard class="card shadow-6">
|
<QCard class="card shadow-6">
|
||||||
<div class="img-wrapper">
|
<div class="img-wrapper">
|
||||||
<VnImg :id="item.id" class="image" />
|
<VnImg :id="item.id" zoom-size="lg" class="image" />
|
||||||
<div v-if="item.hex" class="item-color-container">
|
<div v-if="item.hex" class="item-color-container">
|
||||||
<div
|
<div
|
||||||
class="item-color"
|
class="item-color"
|
||||||
|
|
|
@ -7,6 +7,8 @@ import VnLv from 'components/ui/VnLv.vue';
|
||||||
import CardSummary from 'components/ui/CardSummary.vue';
|
import CardSummary from 'components/ui/CardSummary.vue';
|
||||||
import CustomerDescriptorProxy from 'pages/Customer/Card/CustomerDescriptorProxy.vue';
|
import CustomerDescriptorProxy from 'pages/Customer/Card/CustomerDescriptorProxy.vue';
|
||||||
import FetchedTags from 'components/ui/FetchedTags.vue';
|
import FetchedTags from 'components/ui/FetchedTags.vue';
|
||||||
|
import VnTitle from 'src/components/common/VnTitle.vue';
|
||||||
|
import ItemDescriptorProxy from 'src/pages/Item/Card/ItemDescriptorProxy.vue';
|
||||||
|
|
||||||
const { t } = useI18n();
|
const { t } = useI18n();
|
||||||
const route = useRoute();
|
const route = useRoute();
|
||||||
|
@ -62,6 +64,10 @@ const detailsColumns = ref([
|
||||||
</template>
|
</template>
|
||||||
<template #body="{ entity }">
|
<template #body="{ entity }">
|
||||||
<QCard class="vn-one">
|
<QCard class="vn-one">
|
||||||
|
<VnTitle
|
||||||
|
:url="`#/order/${entity.id}/basic-data`"
|
||||||
|
:text="t('globals.pageTitles.basicData')"
|
||||||
|
/>
|
||||||
<VnLv label="ID" :value="entity.id" />
|
<VnLv label="ID" :value="entity.id" />
|
||||||
<VnLv :label="t('order.summary.nickname')" dash>
|
<VnLv :label="t('order.summary.nickname')" dash>
|
||||||
<template #value>
|
<template #value>
|
||||||
|
@ -81,6 +87,10 @@ const detailsColumns = ref([
|
||||||
/>
|
/>
|
||||||
</QCard>
|
</QCard>
|
||||||
<QCard class="vn-one">
|
<QCard class="vn-one">
|
||||||
|
<VnTitle
|
||||||
|
:url="`#/order/${entity.id}/basic-data`"
|
||||||
|
:text="t('globals.pageTitles.basicData')"
|
||||||
|
/>
|
||||||
<VnLv
|
<VnLv
|
||||||
:label="t('order.summary.created')"
|
:label="t('order.summary.created')"
|
||||||
:value="toDateHourMinSec(entity?.created)"
|
:value="toDateHourMinSec(entity?.created)"
|
||||||
|
@ -116,14 +126,13 @@ const detailsColumns = ref([
|
||||||
/>
|
/>
|
||||||
</QCard>
|
</QCard>
|
||||||
<QCard class="vn-one">
|
<QCard class="vn-one">
|
||||||
<p class="header">
|
<VnTitle :text="t('globals.pageTitles.notes')" />
|
||||||
{{ t('order.summary.notes') }}
|
|
||||||
</p>
|
|
||||||
<p v-if="entity?.note" class="no-margin">
|
<p v-if="entity?.note" class="no-margin">
|
||||||
{{ entity?.note }}
|
{{ entity?.note }}
|
||||||
</p>
|
</p>
|
||||||
</QCard>
|
</QCard>
|
||||||
<QCard class="vn-one">
|
<QCard class="vn-one">
|
||||||
|
<VnTitle :text="t('order.summary.total')" />
|
||||||
<VnLv>
|
<VnLv>
|
||||||
<template #label>
|
<template #label>
|
||||||
<span class="text-h6">{{ t('order.summary.subtotal') }}</span>
|
<span class="text-h6">{{ t('order.summary.subtotal') }}</span>
|
||||||
|
@ -152,9 +161,7 @@ const detailsColumns = ref([
|
||||||
</VnLv>
|
</VnLv>
|
||||||
</QCard>
|
</QCard>
|
||||||
<QCard>
|
<QCard>
|
||||||
<p class="header">
|
<VnTitle :text="t('order.summary.details')" />
|
||||||
{{ t('order.summary.details') }}
|
|
||||||
</p>
|
|
||||||
<QTable :columns="detailsColumns" :rows="entity?.rows" flat>
|
<QTable :columns="detailsColumns" :rows="entity?.rows" flat>
|
||||||
<template #header="props">
|
<template #header="props">
|
||||||
<QTr :props="props">
|
<QTr :props="props">
|
||||||
|
@ -168,7 +175,10 @@ const detailsColumns = ref([
|
||||||
<template #body="props">
|
<template #body="props">
|
||||||
<QTr :props="props">
|
<QTr :props="props">
|
||||||
<QTd key="item" :props="props" class="item">
|
<QTd key="item" :props="props" class="item">
|
||||||
|
<span class="link">
|
||||||
{{ props.row.item?.id }}
|
{{ props.row.item?.id }}
|
||||||
|
<ItemDescriptorProxy :id="props.row.item?.id" />
|
||||||
|
</span>
|
||||||
</QTd>
|
</QTd>
|
||||||
<QTd key="description" :props="props" class="description">
|
<QTd key="description" :props="props" class="description">
|
||||||
<div class="name">
|
<div class="name">
|
||||||
|
|
|
@ -70,6 +70,7 @@ function extractValueTags(items) {
|
||||||
:user-params="catalogParams"
|
:user-params="catalogParams"
|
||||||
auto-load
|
auto-load
|
||||||
@on-fetch="extractTags"
|
@on-fetch="extractTags"
|
||||||
|
:update-router="false"
|
||||||
>
|
>
|
||||||
<template #body="{ rows }">
|
<template #body="{ rows }">
|
||||||
<div class="catalog-list">
|
<div class="catalog-list">
|
||||||
|
|
|
@ -9,7 +9,7 @@ import WorkerDescriptorProxy from 'pages/Worker/Card/WorkerDescriptorProxy.vue';
|
||||||
import CustomerDescriptorProxy from 'pages/Customer/Card/CustomerDescriptorProxy.vue';
|
import CustomerDescriptorProxy from 'pages/Customer/Card/CustomerDescriptorProxy.vue';
|
||||||
import VnPaginate from 'components/ui/VnPaginate.vue';
|
import VnPaginate from 'components/ui/VnPaginate.vue';
|
||||||
import VnLv from 'components/ui/VnLv.vue';
|
import VnLv from 'components/ui/VnLv.vue';
|
||||||
import OrderSearchbar from 'pages/Order/Card/OrderSearchbar.vue';
|
import VnSearchbar from 'src/components/ui/VnSearchbar.vue';
|
||||||
import OrderFilter from 'pages/Order/Card/OrderFilter.vue';
|
import OrderFilter from 'pages/Order/Card/OrderFilter.vue';
|
||||||
import OrderSummary from 'pages/Order/Card/OrderSummary.vue';
|
import OrderSummary from 'pages/Order/Card/OrderSummary.vue';
|
||||||
import { useSummaryDialog } from 'src/composables/useSummaryDialog';
|
import { useSummaryDialog } from 'src/composables/useSummaryDialog';
|
||||||
|
@ -28,7 +28,11 @@ function navigate(id) {
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
<template>
|
<template>
|
||||||
<OrderSearchbar />
|
<VnSearchbar
|
||||||
|
data-key="OrderList"
|
||||||
|
:label="t('Search order')"
|
||||||
|
:info="t('You can search orders by reference')"
|
||||||
|
/>
|
||||||
<RightMenu>
|
<RightMenu>
|
||||||
<template #right-panel>
|
<template #right-panel>
|
||||||
<OrderFilter data-key="OrderList" />
|
<OrderFilter data-key="OrderList" />
|
||||||
|
|
|
@ -2,7 +2,6 @@
|
||||||
import { computed } from 'vue';
|
import { computed } from 'vue';
|
||||||
import { useI18n } from 'vue-i18n';
|
import { useI18n } from 'vue-i18n';
|
||||||
import { useRoute } from 'vue-router';
|
import { useRoute } from 'vue-router';
|
||||||
import { useArrayData } from 'src/composables/useArrayData';
|
|
||||||
import CardDescriptor from 'components/ui/CardDescriptor.vue';
|
import CardDescriptor from 'components/ui/CardDescriptor.vue';
|
||||||
import VnLv from 'components/ui/VnLv.vue';
|
import VnLv from 'components/ui/VnLv.vue';
|
||||||
|
|
||||||
|
@ -17,8 +16,7 @@ const props = defineProps({
|
||||||
const { t } = useI18n();
|
const { t } = useI18n();
|
||||||
const route = useRoute();
|
const route = useRoute();
|
||||||
const entityId = computed(() => props.id || route.params.id);
|
const entityId = computed(() => props.id || route.params.id);
|
||||||
const { store } = useArrayData('Parking');
|
|
||||||
const parking = computed(() => store.data);
|
|
||||||
const filter = {
|
const filter = {
|
||||||
fields: ['id', 'sectorFk', 'code', 'pickingOrder', 'row', 'column'],
|
fields: ['id', 'sectorFk', 'code', 'pickingOrder', 'row', 'column'],
|
||||||
include: [{ relation: 'sector', scope: { fields: ['id', 'description'] } }],
|
include: [{ relation: 'sector', scope: { fields: ['id', 'description'] } }],
|
||||||
|
@ -29,15 +27,13 @@ const filter = {
|
||||||
module="Parking"
|
module="Parking"
|
||||||
data-key="Parking"
|
data-key="Parking"
|
||||||
:url="`Parkings/${entityId}`"
|
:url="`Parkings/${entityId}`"
|
||||||
:title="parking?.code"
|
title="code"
|
||||||
:subtitle="parking?.id"
|
|
||||||
:filter="filter"
|
:filter="filter"
|
||||||
@on-fetch="(data) => (parking = data)"
|
|
||||||
>
|
>
|
||||||
<template #body>
|
<template #body="{ entity }">
|
||||||
<VnLv :label="t('globals.code')" :value="parking.code" />
|
<VnLv :label="t('globals.code')" :value="entity.code" />
|
||||||
<VnLv :label="t('parking.pickingOrder')" :value="parking.pickingOrder" />
|
<VnLv :label="t('parking.pickingOrder')" :value="entity.pickingOrder" />
|
||||||
<VnLv :label="t('parking.sector')" :value="parking.sector?.description" />
|
<VnLv :label="t('parking.sector')" :value="entity.sector?.description" />
|
||||||
</template>
|
</template>
|
||||||
</CardDescriptor>
|
</CardDescriptor>
|
||||||
</template>
|
</template>
|
||||||
|
|
|
@ -1,10 +1,9 @@
|
||||||
<script setup>
|
<script setup>
|
||||||
import { ref, computed } from 'vue';
|
import { computed } from 'vue';
|
||||||
import { useRoute } from 'vue-router';
|
import { useRoute } from 'vue-router';
|
||||||
import { useI18n } from 'vue-i18n';
|
import { useI18n } from 'vue-i18n';
|
||||||
import CardSummary from 'components/ui/CardSummary.vue';
|
import CardSummary from 'components/ui/CardSummary.vue';
|
||||||
import VnLv from 'components/ui/VnLv.vue';
|
import VnLv from 'components/ui/VnLv.vue';
|
||||||
import { useArrayData } from 'src/composables/useArrayData';
|
|
||||||
|
|
||||||
const $props = defineProps({
|
const $props = defineProps({
|
||||||
id: {
|
id: {
|
||||||
|
@ -15,9 +14,7 @@ const $props = defineProps({
|
||||||
const router = useRoute();
|
const router = useRoute();
|
||||||
const { t } = useI18n();
|
const { t } = useI18n();
|
||||||
const entityId = computed(() => $props.id || router.params.id);
|
const entityId = computed(() => $props.id || router.params.id);
|
||||||
const { store } = useArrayData('Parking');
|
|
||||||
|
|
||||||
const parking = ref(store.data);
|
|
||||||
const filter = {
|
const filter = {
|
||||||
fields: ['id', 'sectorFk', 'code', 'pickingOrder', 'row', 'column'],
|
fields: ['id', 'sectorFk', 'code', 'pickingOrder', 'row', 'column'],
|
||||||
include: [{ relation: 'sector', scope: { fields: ['id', 'description'] } }],
|
include: [{ relation: 'sector', scope: { fields: ['id', 'description'] } }],
|
||||||
|
@ -26,14 +23,9 @@ const filter = {
|
||||||
|
|
||||||
<template>
|
<template>
|
||||||
<div class="q-pa-md">
|
<div class="q-pa-md">
|
||||||
<CardSummary
|
<CardSummary :url="`Parkings/${entityId}`" data-key="Parking" :filter="filter">
|
||||||
:url="`Parkings/${entityId}`"
|
<template #header="{ entity }">{{ entity.code }}</template>
|
||||||
:filter="filter"
|
<template #body="{ entity }">
|
||||||
@on-fetch="(data) => (parking = data)"
|
|
||||||
data-key="Parking"
|
|
||||||
>
|
|
||||||
<template #header>{{ parking.code }}</template>
|
|
||||||
<template #body>
|
|
||||||
<QCard class="vn-one">
|
<QCard class="vn-one">
|
||||||
<QCardSection class="q-pa-none">
|
<QCardSection class="q-pa-none">
|
||||||
<a
|
<a
|
||||||
|
@ -44,17 +36,17 @@ const filter = {
|
||||||
<QIcon name="open_in_new" />
|
<QIcon name="open_in_new" />
|
||||||
</a>
|
</a>
|
||||||
</QCardSection>
|
</QCardSection>
|
||||||
<VnLv :label="t('globals.code')" :value="parking.code" />
|
<VnLv :label="t('globals.code')" :value="entity.code" />
|
||||||
<VnLv
|
<VnLv
|
||||||
:label="t('parking.pickingOrder')"
|
:label="t('parking.pickingOrder')"
|
||||||
:value="parking.pickingOrder"
|
:value="entity.pickingOrder"
|
||||||
/>
|
/>
|
||||||
<VnLv
|
<VnLv
|
||||||
:label="t('parking.sector')"
|
:label="t('parking.sector')"
|
||||||
:value="parking.sector?.description"
|
:value="entity.sector?.description"
|
||||||
/>
|
/>
|
||||||
<VnLv :label="t('parking.row')" :value="parking.row" />
|
<VnLv :label="t('parking.row')" :value="entity.row" />
|
||||||
<VnLv :label="t('parking.column')" :value="parking.column" />
|
<VnLv :label="t('parking.column')" :value="entity.column" />
|
||||||
</QCard>
|
</QCard>
|
||||||
</template>
|
</template>
|
||||||
</CardSummary>
|
</CardSummary>
|
||||||
|
|
|
@ -17,15 +17,6 @@ const props = defineProps({
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
const from = Date.vnNew();
|
|
||||||
const to = Date.vnNew();
|
|
||||||
to.setDate(to.getDate() + 1);
|
|
||||||
|
|
||||||
const defaultParams = {
|
|
||||||
from: toDateString(from),
|
|
||||||
to: toDateString(to),
|
|
||||||
};
|
|
||||||
|
|
||||||
const workers = ref();
|
const workers = ref();
|
||||||
const provinces = ref();
|
const provinces = ref();
|
||||||
const states = ref();
|
const states = ref();
|
||||||
|
@ -44,11 +35,7 @@ const warehouses = ref();
|
||||||
@on-fetch="(data) => (workers = data)"
|
@on-fetch="(data) => (workers = data)"
|
||||||
auto-load
|
auto-load
|
||||||
/>
|
/>
|
||||||
<VnFilterPanel
|
<VnFilterPanel :data-key="props.dataKey" :search-button="true">
|
||||||
:data-key="props.dataKey"
|
|
||||||
:params="defaultParams"
|
|
||||||
:search-button="true"
|
|
||||||
>
|
|
||||||
<template #tags="{ tag, formatFn }">
|
<template #tags="{ tag, formatFn }">
|
||||||
<div class="q-gutter-x-xs">
|
<div class="q-gutter-x-xs">
|
||||||
<strong>{{ t(`params.${tag.label}`) }}: </strong>
|
<strong>{{ t(`params.${tag.label}`) }}: </strong>
|
||||||
|
|
|
@ -26,8 +26,8 @@ const to = Date.vnNew();
|
||||||
to.setDate(to.getDate() + 1);
|
to.setDate(to.getDate() + 1);
|
||||||
|
|
||||||
const userParams = {
|
const userParams = {
|
||||||
from: toDateString(from),
|
from: from.toISOString(),
|
||||||
to: toDateString(to),
|
to: to.toISOString(),
|
||||||
};
|
};
|
||||||
|
|
||||||
function navigate(id) {
|
function navigate(id) {
|
||||||
|
|
|
@ -74,7 +74,7 @@ const agencyOptions = ref([]);
|
||||||
type="number"
|
type="number"
|
||||||
min="0"
|
min="0"
|
||||||
/>
|
/>
|
||||||
<VnInputTime v-model="data.hour" :label="t('Closing')" clearable />
|
<VnInputTime v-model="data.hour" :label="t('Closing')" />
|
||||||
</VnRow>
|
</VnRow>
|
||||||
|
|
||||||
<VnRow class="row q-gutter-md q-mb-md">
|
<VnRow class="row q-gutter-md q-mb-md">
|
||||||
|
|
|
@ -23,6 +23,7 @@ export const useArrayDataStore = defineStore('arrayDataStore', () => {
|
||||||
exprBuilder: null,
|
exprBuilder: null,
|
||||||
searchUrl: 'params',
|
searchUrl: 'params',
|
||||||
navigate: null,
|
navigate: null,
|
||||||
|
page: 1,
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue