diff --git a/Dockerfile b/Dockerfile index a1b7027..251de26 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,6 +1,8 @@ # develop stage FROM node:20-alpine as develop-stage +ENV TZ=Europe/Prague + WORKDIR /app RUN yarn global add @quasar/cli @@ -18,12 +20,13 @@ RUN quasar build -m ssr FROM node:20-alpine as production-stage ENV NODE_ENV production +ENV TZ=Europe/Prague EXPOSE 3000 WORKDIR /app COPY process.yml /app -COPY --from=build-stage /app/dict/ssr/package.json /app +COPY --from=build-stage /app/dist/ssr/package.json /app RUN yarn global add pm2 && yarn && yarn cache clean COPY --from=build-stage /app/dist/ssr /app diff --git a/package.json b/package.json index 3569a46..fef578e 100644 --- a/package.json +++ b/package.json @@ -22,7 +22,7 @@ "photoswipe": "^5.4.2", "photoswipe-dynamic-caption-plugin": "^1.2.7", "pinia": "^2.0.33", - "quasar": "^2.12.0", + "quasar": "^2.14.1", "vue": "^3.2.47", "vue-chartjs": "^5.2.0", "vue-picture-cropper": "^0.7.0", @@ -30,14 +30,13 @@ "vue3-google-map": "^0.15.0" }, "devDependencies": { - "@quasar/app-vite": "^1.3.0", + "@quasar/app-vite": "^1.7.1", "autoprefixer": "^10.4.2", "eslint": "^8.10.0", "eslint-config-prettier": "^8.1.0", "eslint-plugin-vue": "^9.0.0", "postcss": "^8.4.14", - "prettier": "^2.5.1", - "vite-plugin-rewrite-all": "^1.0.1" + "prettier": "^2.5.1" }, "engines": { "npm": ">= 6.13.4", diff --git a/quasar.config.js b/quasar.config.js index de24d6e..b7d3f55 100644 --- a/quasar.config.js +++ b/quasar.config.js @@ -83,10 +83,7 @@ module.exports = configure(function (ctx) { // extendViteConf (viteConf) {}, // viteVuePluginOptions: {}, - - vitePlugins: [ - [ require("vite-plugin-rewrite-all").default ] // slouzi k podpore tecky v params v routeru - ] + // vitePlugins: [] }, // Full list of options: https://v2.quasar.dev/quasar-cli-vite/quasar-config-js#devServer diff --git a/src/boot/apollo.js b/src/boot/apollo.js index 9a75832..f32c893 100644 --- a/src/boot/apollo.js +++ b/src/boot/apollo.js @@ -1,18 +1,19 @@ import {ApolloClient, ApolloLink, fromPromise, InMemoryCache} from '@apollo/client/core' -import {createUploadLink} from 'apollo-upload-client'; import {onError} from "@apollo/client/link/error"; import {useUserStore} from "stores/User"; import {useAppStore} from "stores/App"; import {Notify} from "quasar"; import {errorObject, warningObject} from "src/composables/dialog"; +import {createUploadLink} from "apollo-upload-client"; +// import createUploadLink from "apollo-upload-client/createUploadLink.mjs"; -const handleRefreshToken = (store, forward, operation) => { +const handleRefreshToken = (store, router, forward, operation) => { if (!operation.query?._refreshUnauthorizedUser) return; return fromPromise(useUserStore(store).refreshAccessToken() .catch((error) => { Notify.create(warningObject("Tvoje přihlášení vypřešlo. Přihlaš se prosím znovu.")); - if (window) window.location = "/login"; + router.push({name: "login"}) })) .filter((value) => Boolean(value)) .flatMap((accessToken) => { @@ -30,7 +31,7 @@ const handleRefreshToken = (store, forward, operation) => { } export const apolloWrapper = {}; -export default (({store}) => { +export default (({store, router}) => { const uploadLink = createUploadLink({ uri: process.env.API_URL + '/graphql', }) @@ -47,8 +48,9 @@ export default (({store}) => { }); const errorLink = onError(({graphQLErrors, networkError, operation, forward}) => { + console.log(networkError, graphQLErrors); if (networkError?.statusCode === 401) { - return handleRefreshToken(store, forward, operation); + return handleRefreshToken(store, router, forward, operation); } if (graphQLErrors) { @@ -56,7 +58,7 @@ export default (({store}) => { if (error.message === "Not found") { useAppStore(store).appStatus = 404; } else if (error.message.includes("401") || error.message.includes("Not authorized")) { - return handleRefreshToken(store, forward, operation); + return handleRefreshToken(store, router, forward, operation); } else { Notify.create(errorObject("API error: " + error.message)); } @@ -70,7 +72,9 @@ export default (({store}) => { apolloWrapper.query = (query, variables = {}) => { return apolloClient.query({ - query: query, fetchPolicy: 'no-cache', variables: variables + query: query, + fetchPolicy: 'no-cache', + variables: variables }) .then((response) => response) .catch(err => { @@ -82,7 +86,9 @@ export default (({store}) => { apolloWrapper.mutate = (mutation, variables) => { return apolloClient .mutate({ - mutation: mutation, fetchPolicy: 'no-cache', variables: variables, + mutation: mutation, + fetchPolicy: 'no-cache', + variables: variables, }) .then((response) => response) .catch(err => { diff --git a/src/components/FormSubmitButton.vue b/src/components/FormSubmitButton.vue index 22ad3aa..0e95c17 100644 --- a/src/components/FormSubmitButton.vue +++ b/src/components/FormSubmitButton.vue @@ -3,6 +3,11 @@ import {computed} from "vue"; import {useQuasar} from "quasar"; const props = defineProps({ + isRequestPending: { + type: Boolean, + required: false, + default: false, + }, saveButton: { type: [Object, Boolean], required: false, diff --git a/src/components/FormWrapper.vue b/src/components/FormWrapper.vue index ce8d8f4..1bb5437 100644 --- a/src/components/FormWrapper.vue +++ b/src/components/FormWrapper.vue @@ -1,14 +1,15 @@ diff --git a/src/components/event/EventEditSkeleton.vue b/src/components/event/skeletons/EventEditSkeleton.vue similarity index 100% rename from src/components/event/EventEditSkeleton.vue rename to src/components/event/skeletons/EventEditSkeleton.vue diff --git a/src/components/flights/form/FlightFormBasic.vue b/src/components/flights/form/FlightFormBasic.vue index 9209516..afd872a 100644 --- a/src/components/flights/form/FlightFormBasic.vue +++ b/src/components/flights/form/FlightFormBasic.vue @@ -6,7 +6,6 @@ import DatetimePicker from "components/inputs/DatetimePicker.vue"; import ComboboxInput from "components/inputs/ComboboxInput.vue"; import {commonProps} from "src/composables/inputs"; import {isRequired} from "src/composables/form/rules"; -import {isRequestPending} from "src/composables/form/props"; const props = defineProps({ aircrafts: { @@ -21,7 +20,11 @@ const props = defineProps({ type: Object, required: false }, - isRequestPending, + isRequestPending: { + type: Boolean, + required: false, + default: false, +} }); const airportName = (airport) => `${airport.icaoCode} (${airport.name})`; diff --git a/src/components/flights/form/FlightFormNotes.vue b/src/components/flights/form/FlightFormNotes.vue index 7bdcab2..afd2251 100644 --- a/src/components/flights/form/FlightFormNotes.vue +++ b/src/components/flights/form/FlightFormNotes.vue @@ -5,7 +5,6 @@ import {setDefaultData} from "src/composables/form/formHandling"; import RichTextEditor from "components/inputs/RichTextEditor.vue"; import {commonProps} from "src/composables/inputs"; import ComboboxInput from "components/inputs/ComboboxInput.vue"; -import {isRequestPending} from "src/composables/form/props"; const props = defineProps({ flight: { @@ -16,7 +15,11 @@ const props = defineProps({ type: Array, required: false, }, - isRequestPending + isRequestPending: { + type: Boolean, + required: false, + default: false, +} }); const formData = reactive({ diff --git a/src/components/flights/FlightDetailSkeleton.vue b/src/components/flights/skeletons/FlightDetailSkeleton.vue similarity index 100% rename from src/components/flights/FlightDetailSkeleton.vue rename to src/components/flights/skeletons/FlightDetailSkeleton.vue diff --git a/src/components/flights/skeletons/FlightEditCopilotSkeleton.vue b/src/components/flights/skeletons/FlightEditCopilotSkeleton.vue new file mode 100644 index 0000000..0e48e33 --- /dev/null +++ b/src/components/flights/skeletons/FlightEditCopilotSkeleton.vue @@ -0,0 +1,7 @@ + + + diff --git a/src/components/flights/FlightEditSkeleton.vue b/src/components/flights/skeletons/FlightEditSkeleton.vue similarity index 100% rename from src/components/flights/FlightEditSkeleton.vue rename to src/components/flights/skeletons/FlightEditSkeleton.vue diff --git a/src/components/flights/FlightsListSkeleton.vue b/src/components/flights/skeletons/FlightsListSkeleton.vue similarity index 91% rename from src/components/flights/FlightsListSkeleton.vue rename to src/components/flights/skeletons/FlightsListSkeleton.vue index ae68983..8ba4cfa 100644 --- a/src/components/flights/FlightsListSkeleton.vue +++ b/src/components/flights/skeletons/FlightsListSkeleton.vue @@ -3,7 +3,7 @@ import {randomInt} from "src/composables/random";