forked from verdnatura/salix-front
Merge branch 'dev' of https://gitea.verdnatura.es/verdnatura/salix-front into 7283-itemMigration
This commit is contained in:
commit
fc26fa12be
181
CHANGELOG.md
181
CHANGELOG.md
|
@ -1,3 +1,184 @@
|
|||
# Version 24.38 - 2024-09-17
|
||||
|
||||
### Added 🆕
|
||||
|
||||
- chore: refs #6772 fix e2e (origin/6772-warmfix-fixE2e) by:jorgep
|
||||
- chore: refs #7323 worker changes by:jorgep
|
||||
- chore: refs #7353 fix warnings by:jorgep
|
||||
- chore: refs #7353 use Vue component nomenclature by:jorgep
|
||||
- chore: refs #7356 fix type by:jorgep
|
||||
- feat(AccountConnections): use VnToken by:alexm
|
||||
- feat: add key to routerView by:Javier Segarra
|
||||
- feat: add plus shortcut in VnTable by:Javier Segarra
|
||||
- feat: add row by:Javier Segarra
|
||||
- feat: addRow withour dialog by:Javier Segarra
|
||||
- feat: apply mixin by:Javier Segarra
|
||||
- feat by:Javier Segarra
|
||||
- feat: change navBar buttons by:Javier Segarra
|
||||
- feat: dense rows by:Javier Segarra
|
||||
- feat: fields with wrong name by:jgallego
|
||||
- feat: fix bugs and filters by:Javier Segarra
|
||||
- feat: fix refund parameters by:jgallego
|
||||
- feat: handle create row by:Javier Segarra
|
||||
- feat: handle dates by:Javier Segarra
|
||||
- feat: handle qCheckbox 3rd state by:Javier Segarra
|
||||
- feat: imrpove VnInputTime to set cursor at start by:Javier Segarra
|
||||
- feat: keyShortcut directive by:Javier Segarra
|
||||
- feat: minor fixes by:jgallego
|
||||
- feat: only filter by isDestiny by:Javier Segarra
|
||||
- feat: refs #211153 businessDataLinkGrafana by:robert
|
||||
- feat: refs #7129 add km start and end on create form by:pablone
|
||||
- feat: refs #7353 add filter & fix customTags by:jorgep
|
||||
- feat: refs #7353 add locale by:jorgep
|
||||
- feat: refs #7353 add no one opt by:jorgep
|
||||
- feat: refs #7353 add right icons by:jorgep
|
||||
- feat: refs #7353 imporve toDateFormat by:jorgep
|
||||
- feat: refs #7353 salesPerson nickname & id by:jorgep
|
||||
- feat: refs #7353 split sections by:jorgep
|
||||
- feat: refs #7847 remove reload btn by:jorgep
|
||||
- feat: refs #7847 remove reload fn by:jorgep
|
||||
- feat: refs #7889 added shortcuts to modules by:Jon
|
||||
- feat: refs #7911 added shortcut to modules by:Jon
|
||||
- feat: refuncInvoiceForm component by:jgallego
|
||||
- feat: remove duplicity by:Javier Segarra
|
||||
- feat: remove future itemFixedPrices by:Javier Segarra
|
||||
- feat: replace stickyButtons by subtoolbar by:Javier Segarra
|
||||
- feat: required validation by:Javier Segarra
|
||||
- feat: show bad dates by:Javier Segarra
|
||||
- feat: showdate icons by:Javier Segarra
|
||||
- feat: solve ItemFixedFilterPanel by:Javier Segarra
|
||||
- feat: transfer an invoice by:jgallego
|
||||
- feat: try to fix ItemFixedFilterPanel by:Javier Segarra
|
||||
- feat: unnecessary changes by:Javier Segarra
|
||||
- feat: update changelog (origin/7896_down_devToTest_2436) by:Javier Segarra
|
||||
- feat: updates by:Javier Segarra
|
||||
- feat: update version and changelog by:Javier Segarra
|
||||
- feat: vnInput\* by:Javier Segarra
|
||||
- feat: with VnTable by:Javier Segarra
|
||||
- refs #6772 feat: fix approach by:Javier Segarra
|
||||
- refs #6772 feat: refresh shelving.basic-data by:Javier Segarra
|
||||
- style: show subName value by:Javier Segarra
|
||||
|
||||
### Changed 📦
|
||||
|
||||
- perf: add v-shortcut in VnCard by:Javier Segarra
|
||||
- perf: approach by:Javier Segarra
|
||||
- perf: change directive location by:Javier Segarra
|
||||
- perf: change slots order by:Javier Segarra
|
||||
- perf: examples by:Javier Segarra
|
||||
- perf: hide icon for VnInputDate by:Javier Segarra
|
||||
- perf: improve ItemFixedPricefilterPanel by:Javier Segarra
|
||||
- perf: improve mainShrotcutMixin by:Javier Segarra
|
||||
- perf: minor clean code by:Javier Segarra
|
||||
- perf: onRowchange by:Javier Segarra
|
||||
- perf: order by by:Javier Segarra
|
||||
- perf: order components by:Javier Segarra
|
||||
- perf: refs #7889 perf shortcut test by:Jon
|
||||
- perf: remove console.log by:Javier Segarra
|
||||
- perf: remove icons in header slot by:Javier Segarra
|
||||
- perf: remove print variables by:Javier Segarra
|
||||
- perf: restore CustomerBasicData by:Javier Segarra
|
||||
- refactor: deleted useless prop by:Jon
|
||||
- refactor: deleted useless prop in FetchedTags by:Jon
|
||||
- refactor: refs #7323 drop useless code by:jorgep
|
||||
- refactor: refs #7353 clients correction by:jorgep
|
||||
- refactor: refs #7353 clients correction wip by:jorgep
|
||||
- refactor: refs #7353 ease logic by:jorgep
|
||||
- refactor: refs #7353 order correction by:jorgep
|
||||
- refactor: refs #7353 simplify code by:jorgep
|
||||
- refactor: refs #7353 tickets correction by:jorgep
|
||||
- refactor: refs #7353 use global locales by:jorgep
|
||||
- refactor: refs #7354 changed descriptor menu options by:Jon
|
||||
- refactor: refs #7354 changed icon color in table and notification when deleting a zone by:Jon
|
||||
- refactor: refs #7354 fix tableFilters by:Jon
|
||||
- refactor: refs #7354 modified VnInputTime by:Jon
|
||||
- refactor: refs #7354 refactor deliveryPanel by:Jon
|
||||
- refactor: refs #7354 refactor zones section and fixed e2e tests by:Jon
|
||||
- refactor: refs #7354 requested changes by:Jon
|
||||
- refactor: refs #7354 reverse deliveryPanel changes by:Jon
|
||||
- refactor: refs #7354 Zone migration changes by:Jon
|
||||
- refactor: refs #7889 deleted subtitle attr and use keyBinding instead by:Jon
|
||||
- refactor: refs #7889 modified shortcut and dashboard, and added tootlip in LeftMenu by:Jon
|
||||
- refs #6722 perf: not fetch when id not exists by:Javier Segarra
|
||||
- refs #6772 perf: change variable name by:JAVIER SEGARRA MARTINEZ
|
||||
- refs #6772 perf: use ArrayData (6772_reload_sections) by:Javier Segarra
|
||||
- refs #7283 refactor fix ItemDescriptor by:carlossa
|
||||
- refs #7283 refactor ItexDescriptor by:carlossa
|
||||
|
||||
### Fixed 🛠️
|
||||
|
||||
- chore: refs #6772 fix e2e (origin/6772-warmfix-fixE2e) by:jorgep
|
||||
- chore: refs #7353 fix warnings by:jorgep
|
||||
- chore: refs #7356 fix type by:jorgep
|
||||
- feat: fix bugs and filters by:Javier Segarra
|
||||
- feat: fix refund parameters by:jgallego
|
||||
- feat: minor fixes by:jgallego
|
||||
- feat: refs #7353 add filter & fix customTags by:jorgep
|
||||
- feat: try to fix ItemFixedFilterPanel by:Javier Segarra
|
||||
- fix: add border-top by:Javier Segarra
|
||||
- fix: added missing descriptors and small details by:Jon
|
||||
- fix branch by:carlossa
|
||||
- fix: call upsert when crudModel haschanges by:Javier Segarra
|
||||
- fix(ClaimList): fix summary by:alexm
|
||||
- fix: cli warnings by:Javier Segarra
|
||||
- fix: editTableOptions by:Javier Segarra
|
||||
- fix events and descriptor menu by:Jon
|
||||
- fix: InvoiceIn sections (origin/6772_reload_sections) by:Javier Segarra
|
||||
- fix: minor changes by:Javier Segarra
|
||||
- fix: minor error whit dates by:Javier Segarra
|
||||
- fix: module icon by:Javier Segarra
|
||||
- fix: options QDate by:Javier Segarra
|
||||
- fix: refs #6900 e2e error by:jorgep
|
||||
- fix: refs #6900 rollback by:jorgep
|
||||
- fix: refs #7353 css by:jorgep
|
||||
- fix: refs #7353 hide search param (origin/7353-warmfix-fixSearchbar) by:jorgep
|
||||
- fix: refs #7353 iron out filter by:jorgep
|
||||
- fix: refs #7353 iron out ticket table by:jorgep
|
||||
- fix: refs #7353 padding by:jorgep
|
||||
- fix: refs #7353 salesClientTable by:jorgep
|
||||
- fix: refs #7353 salesorderTable by:jorgep
|
||||
- fix: refs #7353 saleTicketMonitors by:jorgep
|
||||
- fix: refs #7353 use same datakey by:jorgep
|
||||
- fix: refs #7353 vnTable colors by:jorgep
|
||||
- fix: refs #7354 e2e tests by:Jon
|
||||
- fix: refs #7354 fix delivery days by:Jon
|
||||
- fix: refs #7354 fix list searchbar and filters by:Jon
|
||||
- fix: refs #7354 fix VnSearchbar search for zone section & finished basic tests by:Jon
|
||||
- fix: refs #7354 fix VnTable filters and agency field by:Jon
|
||||
- fix: refs #7354 fix zoneSearchbar by:Jon
|
||||
- fix: refs #7354 requested changes by:Jon
|
||||
- fix: refs #7356 colors by:jorgep
|
||||
- fix: refs #7356 create claim dialog by:jorgep
|
||||
- fix: refs #7889 fixed shortcut test by:Jon
|
||||
- fix: refs #7903 fixed ticket's search bar and keybinding tooltip by:Jon
|
||||
- fix: refs #7911 fixed shortcut and related files by:Jon
|
||||
- fix: remove condition duplicated by:Javier Segarra
|
||||
- fix: remove property by:Javier Segarra
|
||||
- fix tootltip by:carlossa
|
||||
- fix traduction by:carlossa
|
||||
- fix(VnSectionMain): add QPage by:alexm
|
||||
- fix(zone): zoneLocation and the others searchbar by:alexm
|
||||
- refactor: refs #7354 fix tableFilters by:Jon
|
||||
- refactor: refs #7354 refactor zones section and fixed e2e tests by:Jon
|
||||
- refs #6772 feat: fix approach by:Javier Segarra
|
||||
- refs #6772 fix: claimPhoto reload by:Javier Segarra
|
||||
- refs #6896 fix searchbar by:carlossa
|
||||
- refs #6897 fix entry by:carlossa
|
||||
- refs #6899 fix invoiceFix by:carlossa
|
||||
- refs #6899 fix order by:carlossa
|
||||
- refs #7283 fix by:carlossa
|
||||
- refs #7283 fix ItemDescriptor warehouse by:carlossa
|
||||
- refs #7283 refactor fix ItemDescriptor by:carlossa
|
||||
- refs #7355 #7366 fix account, summary, list, travelList, tooltip by:carlossa
|
||||
- refs #7355 fix accountPrivileges by:carlossa
|
||||
- refs #7355 fix accounts, vnTable by:carlossa
|
||||
- refs #7355 fix privileges by:carlossa
|
||||
- refs #7355 fix roles filters by:carlossa
|
||||
- refs #7355 fix total by:carlossa
|
||||
- refs #7355 fix views summarys, entryList, travelList refact by:carlossa
|
||||
- refs #7366 fix travel hours by:carlossa
|
||||
- test: fix e2e by:Javier Segarra
|
||||
|
||||
# Version 24.36 - 2024-08-27
|
||||
|
||||
### Added 🆕
|
||||
|
|
|
@ -62,4 +62,4 @@
|
|||
"vite": "^5.1.4",
|
||||
"vitest": "^0.31.1"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -200,7 +200,7 @@ function setUserParams(watchedParams, watchedOrder) {
|
|||
|
||||
function sanitizer(params) {
|
||||
for (const [key, value] of Object.entries(params)) {
|
||||
if (typeof value == 'object') {
|
||||
if (value && typeof value == 'object') {
|
||||
const param = Object.values(value)[0];
|
||||
if (typeof param == 'string') params[key] = param.replaceAll('%', '');
|
||||
}
|
||||
|
|
|
@ -24,7 +24,9 @@ const stateStore = useStateStore();
|
|||
const route = useRoute();
|
||||
const router = useRouter();
|
||||
const url = computed(() => {
|
||||
if (props.baseUrl) return `${props.baseUrl}/${route.params.id}`;
|
||||
if (props.baseUrl) {
|
||||
return `${props.baseUrl}/${route.params.id}`;
|
||||
}
|
||||
return props.customUrl;
|
||||
});
|
||||
const searchRightDataKey = computed(() => {
|
||||
|
@ -40,8 +42,10 @@ onBeforeMount(async () => {
|
|||
try {
|
||||
if (!props.baseUrl) arrayData.store.filter.where = { id: route.params.id };
|
||||
await arrayData.fetch({ append: false, updateRouter: false });
|
||||
} catch (e) {
|
||||
router.push({ name: 'WorkerList' });
|
||||
} catch {
|
||||
const { matched: matches } = router.currentRoute.value;
|
||||
const { path } = matches.at(-1);
|
||||
router.push({ path: path.replace(/:id.*/, '') });
|
||||
}
|
||||
});
|
||||
|
||||
|
|
|
@ -0,0 +1,52 @@
|
|||
<script setup>
|
||||
import { onBeforeMount, ref, useAttrs } from 'vue';
|
||||
import axios from 'axios';
|
||||
import VnSelect from 'components/common/VnSelect.vue';
|
||||
|
||||
const { schema, table, column, translation, defaultOptions } = defineProps({
|
||||
schema: {
|
||||
type: String,
|
||||
default: 'vn',
|
||||
},
|
||||
table: {
|
||||
type: String,
|
||||
required: true,
|
||||
},
|
||||
column: {
|
||||
type: String,
|
||||
required: true,
|
||||
},
|
||||
translation: {
|
||||
type: Function,
|
||||
default: null,
|
||||
},
|
||||
defaultOptions: {
|
||||
type: Array,
|
||||
default: () => [],
|
||||
},
|
||||
});
|
||||
|
||||
const $attrs = useAttrs();
|
||||
const options = ref([]);
|
||||
onBeforeMount(async () => {
|
||||
options.value = [].concat(defaultOptions);
|
||||
const { data } = await axios.get(`Applications/get-enum-values`, {
|
||||
params: { schema, table, column },
|
||||
});
|
||||
|
||||
for (const value of data)
|
||||
options.value.push({
|
||||
[$attrs['option-value'] ?? 'id']: value,
|
||||
[$attrs['option-label'] ?? 'name']: translation ? translation(value) : value,
|
||||
});
|
||||
});
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<VnSelect
|
||||
v-bind="$attrs"
|
||||
:options="options"
|
||||
:key="options.length"
|
||||
:input-debounce="0"
|
||||
/>
|
||||
</template>
|
|
@ -2,6 +2,7 @@
|
|||
import { useRoute } from 'vue-router';
|
||||
import { useI18n } from 'vue-i18n';
|
||||
import VnSelect from 'src/components/common/VnSelect.vue';
|
||||
import VnSelectEnum from 'src/components/common/VnSelectEnum.vue';
|
||||
import FormModel from 'components/FormModel.vue';
|
||||
import VnInput from 'src/components/common/VnInput.vue';
|
||||
import { ref, watch } from 'vue';
|
||||
|
@ -24,7 +25,7 @@ watch(
|
|||
<template>
|
||||
<FormModel
|
||||
ref="formModelRef"
|
||||
:url="`VnUsers/preview`"
|
||||
url="VnUsers/preview"
|
||||
:url-update="`VnUsers/${route.params.id}/update-user`"
|
||||
:filter="accountFilter"
|
||||
model="Accounts"
|
||||
|
@ -43,6 +44,15 @@ watch(
|
|||
option-value="code"
|
||||
option-label="code"
|
||||
/>
|
||||
<VnSelectEnum
|
||||
schema="account"
|
||||
table="user"
|
||||
column="twoFactor"
|
||||
v-model="data.twoFactor"
|
||||
:label="t('account.card.twoFactor')"
|
||||
option-value="code"
|
||||
option-label="code"
|
||||
/>
|
||||
</div>
|
||||
</template>
|
||||
</FormModel>
|
||||
|
|
|
@ -35,6 +35,7 @@ account:
|
|||
willDeactivated: User will be deactivated
|
||||
activated: User activated!
|
||||
deactivated: User deactivated!
|
||||
twoFactor: Two factor
|
||||
actions:
|
||||
setPassword: Set password
|
||||
disableAccount:
|
||||
|
|
|
@ -32,6 +32,7 @@ account:
|
|||
activated: ¡Usuario activado!
|
||||
deactivated: ¡Usuario desactivado!
|
||||
newUser: Nuevo usuario
|
||||
twoFactor: Doble factor
|
||||
privileges:
|
||||
delegate: Puede delegar privilegios
|
||||
actions:
|
||||
|
|
|
@ -3,58 +3,18 @@ import { ref } from 'vue';
|
|||
import { useRoute } from 'vue-router';
|
||||
import { useI18n } from 'vue-i18n';
|
||||
import VnSelect from 'src/components/common/VnSelect.vue';
|
||||
import VnSelectEnum from 'src/components/common/VnSelectEnum.vue';
|
||||
import FetchData from 'components/FetchData.vue';
|
||||
import FormModel from 'components/FormModel.vue';
|
||||
import VnRow from 'components/ui/VnRow.vue';
|
||||
import VnInput from 'src/components/common/VnInput.vue';
|
||||
import VnInputDate from 'components/common/VnInputDate.vue';
|
||||
|
||||
import axios from 'axios';
|
||||
import VnAvatar from 'src/components/ui/VnAvatar.vue';
|
||||
|
||||
const route = useRoute();
|
||||
const { t } = useI18n();
|
||||
|
||||
const claimStates = ref([]);
|
||||
const claimStatesCopy = ref([]);
|
||||
const optionsList = ref([]);
|
||||
|
||||
const workersOptions = ref([]);
|
||||
|
||||
function setClaimStates(data) {
|
||||
claimStates.value = data;
|
||||
claimStatesCopy.value = data;
|
||||
}
|
||||
|
||||
async function getEnumValues() {
|
||||
optionsList.value = [{ id: null, description: t('claim.null') }];
|
||||
const { data } = await axios.get(`Applications/get-enum-values`, {
|
||||
params: {
|
||||
schema: 'vn',
|
||||
table: 'claim',
|
||||
column: 'pickup',
|
||||
},
|
||||
});
|
||||
for (let value of data)
|
||||
optionsList.value.push({ id: value, description: t(`claim.${value}`) });
|
||||
}
|
||||
|
||||
getEnumValues();
|
||||
|
||||
const statesFilter = {
|
||||
options: claimStates,
|
||||
filterFn: (options, value) => {
|
||||
const search = value.toLowerCase();
|
||||
|
||||
if (value === '') return claimStatesCopy.value;
|
||||
|
||||
return options.value.filter((row) => {
|
||||
const description = row.description.toLowerCase();
|
||||
|
||||
return description.indexOf(search) > -1;
|
||||
});
|
||||
},
|
||||
};
|
||||
</script>
|
||||
<template>
|
||||
<FetchData
|
||||
|
@ -70,7 +30,7 @@ const statesFilter = {
|
|||
auto-load
|
||||
:reload="true"
|
||||
>
|
||||
<template #form="{ data, validate, filter }">
|
||||
<template #form="{ data, validate }">
|
||||
<VnRow>
|
||||
<VnInput
|
||||
v-model="data.client.name"
|
||||
|
@ -101,20 +61,14 @@ const statesFilter = {
|
|||
/>
|
||||
</template>
|
||||
</VnSelect>
|
||||
<QSelect
|
||||
<VnSelect
|
||||
v-model="data.claimStateFk"
|
||||
:options="claimStates"
|
||||
option-value="id"
|
||||
option-label="description"
|
||||
emit-value
|
||||
url="ClaimStates"
|
||||
:label="t('claim.state')"
|
||||
map-options
|
||||
use-input
|
||||
@filter="(value, update) => filter(value, update, statesFilter)"
|
||||
option-label="description"
|
||||
:rules="validate('claim.claimStateFk')"
|
||||
:input-debounce="0"
|
||||
>
|
||||
</QSelect>
|
||||
/>
|
||||
</VnRow>
|
||||
<VnRow>
|
||||
<QInput
|
||||
|
@ -123,16 +77,14 @@ const statesFilter = {
|
|||
:rules="validate('claim.packages')"
|
||||
type="number"
|
||||
/>
|
||||
<QSelect
|
||||
<VnSelectEnum
|
||||
v-model="data.pickup"
|
||||
:options="optionsList"
|
||||
option-value="id"
|
||||
option-label="description"
|
||||
emit-value
|
||||
:label="t('claim.pickup')"
|
||||
map-options
|
||||
use-input
|
||||
:input-debounce="0"
|
||||
table="claim"
|
||||
column="pickup"
|
||||
option-label="description"
|
||||
:translation="(value) => t(`claim.${value}`)"
|
||||
:default-options="[{ id: null, description: t('claim.null') }]"
|
||||
/>
|
||||
</VnRow>
|
||||
</template>
|
||||
|
|
|
@ -177,7 +177,7 @@ watchEffect(selectedRows);
|
|||
<VnSearchbar
|
||||
:info="t('youCanSearchByInvoiceReference')"
|
||||
:label="t('searchInvoice')"
|
||||
data-key="InvoiceOutList"
|
||||
data-key="invoiceOut"
|
||||
/>
|
||||
<VnSubToolbar>
|
||||
<template #st-actions>
|
||||
|
|
|
@ -12,7 +12,7 @@ import ItemListFilter from '../ItemListFilter.vue';
|
|||
search-data-key="ItemList"
|
||||
:searchbar-props="{
|
||||
url: 'Items/filter',
|
||||
label: 'item.searchbar.label',
|
||||
label: 'searchbar.label',
|
||||
info: 'searchbar.info',
|
||||
}"
|
||||
/>
|
||||
|
|
|
@ -11,8 +11,8 @@ import VnConfirm from 'components/ui/VnConfirm.vue';
|
|||
import RegularizeStockForm from 'components/RegularizeStockForm.vue';
|
||||
import ItemDescriptorImage from 'src/pages/Item/Card/ItemDescriptorImage.vue';
|
||||
import useCardDescription from 'src/composables/useCardDescription';
|
||||
import { getUrl } from 'src/composables/getUrl';
|
||||
import axios from 'axios';
|
||||
import { getUrl } from 'src/composables/getUrl';
|
||||
import { dashIfEmpty } from 'src/filters';
|
||||
import { useArrayData } from 'src/composables/useArrayData';
|
||||
|
||||
|
@ -192,16 +192,11 @@ const openCloneDialog = async () => {
|
|||
<template #actions="{}">
|
||||
<QCardActions class="row justify-center">
|
||||
<QBtn
|
||||
:href="
|
||||
salixUrl +
|
||||
'item/' +
|
||||
entityId +
|
||||
'/diary?' +
|
||||
'warehouseFk=' +
|
||||
warehouseFk +
|
||||
'&lineFk=' +
|
||||
$props.saleFk
|
||||
"
|
||||
:to="{
|
||||
name: 'ItemDiary',
|
||||
params: { id: entityId },
|
||||
query: { warehouseFk, lineFk: $props.saleFk },
|
||||
}"
|
||||
size="md"
|
||||
icon="vn:transaction"
|
||||
color="primary"
|
||||
|
|
|
@ -19,8 +19,8 @@ const sageTransactionTypesOptions = ref([]);
|
|||
const supplierActivitiesOptions = ref([]);
|
||||
|
||||
function handleLocation(data, location) {
|
||||
const { town, label, provinceFk, countryFk } = location ?? {};
|
||||
data.postCode = label;
|
||||
const { town, code, provinceFk, countryFk } = location ?? {};
|
||||
data.postCode = code;
|
||||
data.city = town;
|
||||
data.provinceFk = provinceFk;
|
||||
data.countryFk = countryFk;
|
||||
|
|
Loading…
Reference in New Issue