diff --git a/src/boot/axios.js b/src/boot/axios.js
index 5da26a404..aee38e887 100644
--- a/src/boot/axios.js
+++ b/src/boot/axios.js
@@ -4,8 +4,9 @@ import { Router } from 'src/router';
import useNotify from 'src/composables/useNotify.js';
import { useStateQueryStore } from 'src/stores/useStateQueryStore';
-let session, notify, stateQuery;
-
+const session = useSession();
+const { notify } = useNotify();
+const stateQuery = useStateQueryStore();
const baseUrl = '/api/';
axios.defaults.baseURL = baseUrl;
@@ -50,15 +51,9 @@ const onResponseError = (error) => {
return Promise.reject(error);
};
-export function setupAxios() {
- session = useSession();
- notify = useNotify().notify;
- stateQuery = useStateQueryStore();
-
- axios.interceptors.request.use(onRequest, onRequestError);
- axios.interceptors.response.use(onResponse, onResponseError);
- axiosNoError.interceptors.request.use(onRequest);
- axiosNoError.interceptors.response.use(onResponse);
-}
+axios.interceptors.request.use(onRequest, onRequestError);
+axios.interceptors.response.use(onResponse, onResponseError);
+axiosNoError.interceptors.request.use(onRequest);
+axiosNoError.interceptors.response.use(onResponse);
export { onRequest, onResponseError, axiosNoError };
diff --git a/src/boot/quasar.js b/src/boot/quasar.js
index 1cc2e82cf..01fe68d8b 100644
--- a/src/boot/quasar.js
+++ b/src/boot/quasar.js
@@ -1,7 +1,6 @@
import { boot } from 'quasar/wrappers';
import qFormMixin from './qformMixin';
import keyShortcut from './keyShortcut';
-import { setupAxios } from 'src/boot/axios';
import useNotify from 'src/composables/useNotify.js';
import { CanceledError } from 'axios';
@@ -49,5 +48,4 @@ export default boot(({ app }) => {
notify(message ?? 'globals.error', 'negative', 'error');
};
- setupAxios();
});
diff --git a/src/components/ui/VnLinkPhone.vue b/src/components/ui/VnLinkPhone.vue
index 3b63889e1..4c045968f 100644
--- a/src/components/ui/VnLinkPhone.vue
+++ b/src/components/ui/VnLinkPhone.vue
@@ -17,19 +17,12 @@ const config = reactive({
const type = Object.keys(config).find((key) => key in useAttrs()) || 'sip';
onBeforeMount(async () => {
- let url;
let { channel } = config[type];
if (type === 'say-simple') {
- url = (await axios.get('SaySimpleConfigs/findOne')).data.url;
- if (!channel)
- channel = (
- await axios.get('SaySimpleCountries/findOne', {
- params: {
- filter: { fields: ['channel'], where: { countryFk: 0 } },
- },
- })
- ).data?.channel;
+ const { url, defaultChannel } = (await axios.get('SaySimpleConfigs/findOne'))
+ .data;
+ if (!channel) channel = defaultChannel;
config[
type
diff --git a/src/composables/useArrayData.js b/src/composables/useArrayData.js
index 747c6ab64..9348793d2 100644
--- a/src/composables/useArrayData.js
+++ b/src/composables/useArrayData.js
@@ -247,6 +247,7 @@ export function useArrayData(key = useRoute().meta.moduleName, userOptions) {
}
function updateStateParams() {
+ if (!route?.path) return;
const newUrl = { path: route.path, query: { ...(route.query ?? {}) } };
if (store?.searchUrl)
newUrl.query[store.searchUrl] = JSON.stringify(store.currentFilter);
diff --git a/src/composables/useSession.js b/src/composables/useSession.js
index 5097a1fee..633a30bb0 100644
--- a/src/composables/useSession.js
+++ b/src/composables/useSession.js
@@ -8,13 +8,9 @@ import useNotify from './useNotify';
import { useTokenConfig } from './useTokenConfig';
const TOKEN_MULTIMEDIA = 'tokenMultimedia';
const TOKEN = 'token';
-let router;
-export default {
- setup() {
- router = useRouter();
- },
-};
+
export function useSession() {
+ const router = useRouter();
const { notify } = useNotify();
let isCheckingToken = false;
let intervalId = null;
diff --git a/src/pages/Customer/Card/CustomerUnpaid.vue b/src/pages/Customer/Card/CustomerUnpaid.vue
index d7f933a7f..ef3ff3b94 100644
--- a/src/pages/Customer/Card/CustomerUnpaid.vue
+++ b/src/pages/Customer/Card/CustomerUnpaid.vue
@@ -2,10 +2,9 @@
import { computed, onBeforeMount, ref, watch, nextTick } from 'vue';
import { useI18n } from 'vue-i18n';
import { useRoute } from 'vue-router';
-
import VnInputDate from 'components/common/VnInputDate.vue';
import VnInput from 'src/components/common/VnInput.vue';
-
+import VnRow from 'components/ui/VnRow.vue';
import axios from 'axios';
import useNotify from 'src/composables/useNotify';
import { useStateStore } from 'stores/useStateStore';
diff --git a/src/pages/Customer/components/CustomerSummaryTable.vue b/src/pages/Customer/components/CustomerSummaryTable.vue
index 1c0dfd2ce..c1ba506fd 100644
--- a/src/pages/Customer/components/CustomerSummaryTable.vue
+++ b/src/pages/Customer/components/CustomerSummaryTable.vue
@@ -194,14 +194,14 @@ const getItemPackagingType = (ticketSales) => {
redirect="ticket"
>
-
+
{{ row.nickname }}
-
+
{{ row.routeFk }}
@@ -218,7 +218,7 @@ const getItemPackagingType = (ticketSales) => {
{{ toCurrency(row.totalWithVat) }}
-
+
{{ row.invoiceOut.ref }}
diff --git a/src/pages/Entry/EntryStockBought.vue b/src/pages/Entry/EntryStockBought.vue
index 7ae6901d3..3f0cd2d99 100644
--- a/src/pages/Entry/EntryStockBought.vue
+++ b/src/pages/Entry/EntryStockBought.vue
@@ -99,7 +99,7 @@ const travelDialogRef = ref(false);
const tableRef = ref();
const travel = ref(null);
const userParams = ref({
- dated: Date.vnNew(),
+ dated: Date.vnNew().toJSON(),
});
const filter = ref({
@@ -219,6 +219,7 @@ function round(value) {
data-key="StockBoughts"
url="StockBoughts/getStockBought"
save-url="StockBoughts/crud"
+ search-url="StockBoughts"
order="reserve DESC"
:right-search="false"
:is-editable="true"
diff --git a/src/pages/Entry/EntryStockBoughtDetail.vue b/src/pages/Entry/EntryStockBoughtDetail.vue
index 0fd775ee6..812171825 100644
--- a/src/pages/Entry/EntryStockBoughtDetail.vue
+++ b/src/pages/Entry/EntryStockBoughtDetail.vue
@@ -18,7 +18,7 @@ const $props = defineProps({
required: true,
},
});
-const customUrl = `StockBoughts/getStockBoughtDetail?workerFk=${$props.workerFk}&date=${$props.dated}`;
+const customUrl = `StockBoughts/getStockBoughtDetail?workerFk=${$props.workerFk}&dated=${$props.dated}`;
const columns = [
{
align: 'left',
diff --git a/src/pages/Entry/EntryStockBoughtFilter.vue b/src/pages/Entry/EntryStockBoughtFilter.vue
index 7694cfe6c..e59332064 100644
--- a/src/pages/Entry/EntryStockBoughtFilter.vue
+++ b/src/pages/Entry/EntryStockBoughtFilter.vue
@@ -27,7 +27,7 @@ onMounted(async () => {
@@ -36,12 +36,19 @@ onMounted(async () => {
{{ formatFn(tag.value) }}
-
+
{
+ params.dated = value;
+ setUserParams(params);
+ searchFn();
+ }
+ "
:label="t('Date')"
is-outlined
/>
diff --git a/src/pages/Ticket/Card/TicketPurchaseRequest.vue b/src/pages/Ticket/Card/TicketPurchaseRequest.vue
index 7715e9e21..fdc35d369 100644
--- a/src/pages/Ticket/Card/TicketPurchaseRequest.vue
+++ b/src/pages/Ticket/Card/TicketPurchaseRequest.vue
@@ -268,6 +268,7 @@ onMounted(() => (stateStore.rightDrawer = false));
:label="t('basicData.price')"
type="number"
min="0"
+ step="any"
/>
diff --git a/src/pages/Zone/ZoneDeliveryPanel.vue b/src/pages/Zone/ZoneDeliveryPanel.vue
index bb92ccc6a..255c891a1 100644
--- a/src/pages/Zone/ZoneDeliveryPanel.vue
+++ b/src/pages/Zone/ZoneDeliveryPanel.vue
@@ -105,11 +105,14 @@ watch(
- {{ opt.code }}
- {{ opt.town?.province?.name }},
- {{ opt.town?.province?.country?.name }}
+
+ {{ `${opt.code}, ${opt.town?.name}` }}
+
+
+ {{
+ `${opt.town?.province?.name}, ${opt.town?.province?.country?.name}`
+ }}
+
diff --git a/src/pages/Zone/ZoneFilterPanel.vue b/src/pages/Zone/ZoneFilterPanel.vue
index efe710360..25d6c340f 100644
--- a/src/pages/Zone/ZoneFilterPanel.vue
+++ b/src/pages/Zone/ZoneFilterPanel.vue
@@ -22,7 +22,12 @@ const agencies = ref([]);
- (agencies = data)" auto-load />
+ (agencies = data)"
+ auto-load
+ />
[
inWhere: true,
attrs: {
url: 'AgencyModes',
+ fields: ['id', 'name'],
},
},
columnField: {
diff --git a/src/router/index.js b/src/router/index.js
index 5ed8ad9ed..18541c0b2 100644
--- a/src/router/index.js
+++ b/src/router/index.js
@@ -14,8 +14,8 @@ import { useUserConfig } from 'src/composables/useUserConfig';
import { useTokenConfig } from 'src/composables/useTokenConfig';
import { useAcl } from 'src/composables/useAcl';
-let state, session;
-
+const state = useState();
+const session = useSession();
const { t, te } = i18n.global;
const createHistory = process.env.SERVER
@@ -43,10 +43,8 @@ const Router = createRouter({
* with the Router instance.
*/
export { Router };
-export default route((/* { store, ssrContext } */) => {
+export default route(function (/* { store, ssrContext } */) {
Router.beforeEach(async (to, from, next) => {
- state = useState();
- session = useSession();
const { isLoggedIn } = session;
const outLayout = Router.options.routes[0].children.map((r) => r.name);
if (!isLoggedIn() && !outLayout.includes(to.name)) {
diff --git a/test/vitest/__tests__/boot/axios.spec.js b/test/vitest/__tests__/boot/axios.spec.js
index 3c59dbc48..19d396ec5 100644
--- a/test/vitest/__tests__/boot/axios.spec.js
+++ b/test/vitest/__tests__/boot/axios.spec.js
@@ -1,38 +1,23 @@
-import { describe, it, expect, beforeEach, vi } from 'vitest';
-import { setupAxios, onRequest, onResponseError } from 'src/boot/axios';
-import { useSession } from 'src/composables/useSession';
-import useNotify from 'src/composables/useNotify';
-import { useStateQueryStore } from 'src/stores/useStateQueryStore';
+import { Notify } from 'quasar';
+import { onRequest, onResponseError } from 'src/boot/axios';
+import { describe, expect, it, vi } from 'vitest';
-vi.mock('src/composables/useSession');
-vi.mock('src/composables/useNotify');
-vi.mock('src/stores/useStateQueryStore');
+vi.mock('src/composables/useSession', () => ({
+ useSession: () => ({
+ getToken: () => 'DEFAULT_TOKEN',
+ isLoggedIn: () => vi.fn(),
+ destroy: () => vi.fn(),
+ }),
+}));
+
+vi.mock('src/stores/useStateQueryStore', () => ({
+ useStateQueryStore: () => ({
+ add: () => vi.fn(),
+ remove: () => vi.fn(),
+ }),
+}));
describe('Axios boot', () => {
- let sessionMock, notifyMock, stateQueryMock;
-
- beforeEach(() => {
- sessionMock = {
- getToken: vi.fn().mockReturnValue('DEFAULT_TOKEN'),
- isLoggedIn: vi.fn().mockReturnValue(true),
- destroy: vi.fn(),
- };
-
- notifyMock = {
- notify: vi.fn(),
- };
-
- stateQueryMock = {
- add: vi.fn(),
- remove: vi.fn(),
- };
-
- useSession.mockReturnValue(sessionMock);
- useNotify.mockReturnValue(notifyMock);
- useStateQueryStore.mockReturnValue(stateQueryMock);
-
- setupAxios();
- });
describe('onRequest()', async () => {
it('should set the "Authorization" property on the headers', async () => {
const config = { headers: {} };