From 71389caecca85e36d218e2c7b37c1fc6aab06ddd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michal=20Kv=C3=A1=C4=8Dek?= Date: Sun, 10 Dec 2023 10:19:03 +0100 Subject: [PATCH] Reorganizace skeletonu, aktualizace app-vite a quasaru --- Dockerfile | 5 +- package.json | 7 +- quasar.config.js | 5 +- src/boot/apollo.js | 22 +- src/components/FormSubmitButton.vue | 5 + src/components/FormWrapper.vue | 11 +- src/components/aircrafts/AircraftForm.vue | 71 +- .../AircraftDetailSkeleton.vue | 0 .../{ => skeletons}/AircraftEditSkeleton.vue | 0 .../basicSkeletons/BasicListSkeleton.vue | 3 +- src/components/copilots/CopilotForm.vue | 7 +- src/components/copilots/CopilotsList.vue | 5 +- .../{ => skeletons}/CopilotDetailSkeleton.vue | 0 .../{ => skeletons}/CopilotEditSkeleton.vue | 0 src/components/event/EventForm.vue | 7 +- src/components/event/EventsList.vue | 2 +- .../{ => skeletons}/EventDetailSkeleton.vue | 2 +- .../{ => skeletons}/EventEditSkeleton.vue | 0 .../flights/form/FlightFormBasic.vue | 7 +- .../flights/form/FlightFormNotes.vue | 7 +- .../{ => skeletons}/FlightDetailSkeleton.vue | 0 .../skeletons/FlightEditCopilotSkeleton.vue | 7 + .../{ => skeletons}/FlightEditSkeleton.vue | 0 .../{ => skeletons}/FlightsListSkeleton.vue | 2 +- .../navigation/BreadcrumbsNavigation.vue | 2 +- .../navigation/BreadcrumbsSkeleton.vue | 14 + .../navigation/CommonEditSwitcher.vue | 27 + .../organizations/OrganizationForm.vue | 8 +- .../OrganizationDetailSkeleton.vue | 0 .../OrganizationEditSkeleton.vue | 0 .../photos/BatchPhotoFormDialog.vue | 38 +- src/components/photos/PhotoFormDialog.vue | 18 +- src/components/photos/PhotosEditorList.vue | 54 +- .../{ => skeletons}/PhotoEditorSkeleton.vue | 0 .../photos/skeletons/PhotoGallerySkeleton.vue | 7 + .../poi/{ => skeletons}/POIDetailSkeleton.vue | 0 .../poi/{ => skeletons}/POIEditSkeleton.vue | 0 src/components/profile/ProfileForm.vue | 23 +- src/components/profile/PublicProfileInfo.vue | 7 +- .../{ => skeletons}/PublicProfileSkeleton.vue | 0 src/composables/form/props.js | 10 - src/composables/form/rules.js | 11 +- src/composables/meta.js | 59 +- src/graphql/fragments/aircraft.js | 5 + src/graphql/fragments/copilot.js | 32 + src/graphql/fragments/flight.js | 5 + src/graphql/fragments/photo.js | 2 +- src/graphql/fragments/poi.js | 11 +- src/graphql/mutations/copilot.js | 11 +- src/graphql/queries/photo.js | 2 +- src/layouts/ProfileLayout.vue | 11 +- src/layouts/PublicLayout.vue | 5 +- .../profile/aircraft/AircraftDetailPage.vue | 2 +- src/pages/profile/aircraft/AircraftsPage.vue | 14 +- .../profile/aircraft/EditAircraftPage.vue | 78 +- .../profile/copilot/CopilotDetailPage.vue | 15 +- src/pages/profile/copilot/CopilotsPage.vue | 15 +- src/pages/profile/copilot/EditCopilotPage.vue | 42 +- src/pages/profile/event/EditEventPage.vue | 2 +- src/pages/profile/event/EventDetailPage.vue | 2 +- src/pages/profile/event/EventsPage.vue | 9 +- src/pages/profile/flight/EditFlightPage.vue | 71 +- src/pages/profile/flight/FlightDetailPage.vue | 10 +- src/pages/profile/flight/FlightsPage.vue | 15 +- src/pages/profile/flight/NewFlightPage.vue | 2 +- src/pages/profile/flight/PhotoEditorPage.vue | 2 +- .../organization/EditOrganizationPage.vue | 2 +- .../organization/OrganizationsPage.vue | 8 +- .../profile/poi/EditPointOfInterestPage.vue | 81 +- .../profile/poi/PointOfInterestDetailPage.vue | 32 +- .../profile/poi/PointsOfInterestPage.vue | 19 +- src/pages/public/AircraftDetailPage.vue | 4 +- src/pages/public/PilotProfilePage.vue | 2 +- .../public/PointOfInterestDetailPage.vue | 2 +- .../public/pilotProfile/CopilotDetailPage.vue | 2 +- .../public/pilotProfile/EventDetailPage.vue | 2 +- .../public/pilotProfile/EventsListPage.vue | 2 +- .../public/pilotProfile/FlightDetailPage.vue | 6 +- .../public/pilotProfile/FlightsListPage.vue | 9 +- src/router/index.js | 10 +- src/router/routes.js | 2 +- src/stores/Aircrafts.js | 61 +- src/stores/App.js | 4 +- src/stores/Copilots.js | 11 +- src/stores/Flights.js | 114 +- src/stores/PointsOfInterest.js | 94 +- yarn.lock | 1751 +++++++++-------- 87 files changed, 1666 insertions(+), 1368 deletions(-) rename src/components/aircrafts/{ => skeletons}/AircraftDetailSkeleton.vue (100%) rename src/components/aircrafts/{ => skeletons}/AircraftEditSkeleton.vue (100%) rename src/components/copilots/{ => skeletons}/CopilotDetailSkeleton.vue (100%) rename src/components/copilots/{ => skeletons}/CopilotEditSkeleton.vue (100%) rename src/components/event/{ => skeletons}/EventDetailSkeleton.vue (87%) rename src/components/event/{ => skeletons}/EventEditSkeleton.vue (100%) rename src/components/flights/{ => skeletons}/FlightDetailSkeleton.vue (100%) create mode 100644 src/components/flights/skeletons/FlightEditCopilotSkeleton.vue rename src/components/flights/{ => skeletons}/FlightEditSkeleton.vue (100%) rename src/components/flights/{ => skeletons}/FlightsListSkeleton.vue (91%) create mode 100644 src/components/navigation/BreadcrumbsSkeleton.vue create mode 100644 src/components/navigation/CommonEditSwitcher.vue rename src/components/organizations/{ => skeletons}/OrganizationDetailSkeleton.vue (100%) rename src/components/organizations/{ => skeletons}/OrganizationEditSkeleton.vue (100%) rename src/components/photos/{ => skeletons}/PhotoEditorSkeleton.vue (100%) create mode 100644 src/components/photos/skeletons/PhotoGallerySkeleton.vue rename src/components/poi/{ => skeletons}/POIDetailSkeleton.vue (100%) rename src/components/poi/{ => skeletons}/POIEditSkeleton.vue (100%) rename src/components/profile/{ => skeletons}/PublicProfileSkeleton.vue (100%) delete mode 100644 src/composables/form/props.js 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";