diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index d3ac84a96..c7ca7a98f 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -189,7 +189,7 @@ pages: .docker: &docker stage: docker - image: docker:20.10.12 + image: docker:20.10.18 variables: DOCKER_TLS_CERTDIR: "/certs" DOCKER_HOST: tcp://docker:2376 @@ -197,13 +197,13 @@ pages: DOCKER_CERT_PATH: "$DOCKER_TLS_CERTDIR/client" DOCKER_DRIVER: overlay2 services: - - docker:20.10.12-dind + - docker:20.10.18-dind cache: {} before_script: # Install buildx - - wget https://github.com/docker/buildx/releases/download/v0.8.1/buildx-v0.8.1.linux-amd64 + - wget https://github.com/docker/buildx/releases/download/v0.9.1/buildx-v0.9.1.linux-amd64 - mkdir -p ~/.docker/cli-plugins/ - - mv buildx-v0.8.1.linux-amd64 ~/.docker/cli-plugins/docker-buildx + - mv buildx-v0.9.1.linux-amd64 ~/.docker/cli-plugins/docker-buildx - chmod a+x ~/.docker/cli-plugins/docker-buildx # Create env - docker context create tls-environment @@ -244,7 +244,7 @@ build-docker-tag: # Packaging app for amd64 package-app: - image: mobilizon/buildpack:1.13.4-erlang-24.3.3-debian-buster + image: mobilizon/buildpack:1.14.1-erlang-25.1.1-debian-buster stage: package variables: &release-variables MIX_ENV: "prod" @@ -328,6 +328,7 @@ multi-arch-release: - if: '$CI_PIPELINE_SOURCE == "schedule"' - if: $CI_COMMIT_TAG timeout: 3h + allow_failure: true # Release release-upload: @@ -348,6 +349,7 @@ release-upload: parallel: matrix: - ARCH: ["amd64", "arm", "arm64"] + allow_failure: true release-create: stage: deploy diff --git a/.tool-versions b/.tool-versions index 73654c14d..e4f68f147 100644 --- a/.tool-versions +++ b/.tool-versions @@ -1,2 +1,2 @@ -elixir 1.14.0-otp-25 -erlang 25.0.4 +elixir 1.14.1-otp-25 +erlang 25.1.1 diff --git a/docker/production/Dockerfile b/docker/production/Dockerfile index 33612106f..7f19b640f 100644 --- a/docker/production/Dockerfile +++ b/docker/production/Dockerfile @@ -5,14 +5,12 @@ RUN apk add --no-cache python3 build-base libwebp-tools bash imagemagick ncurses WORKDIR /build COPY js . -ENV CYPRESS_INSTALL_BINARY 0 - # Network timeout because it's slow when cross-compiling RUN yarn install --network-timeout 100000 \ && yarn run build # Then, build the application binary -FROM elixir:1.13-alpine AS builder +FROM elixir:1.14-alpine AS builder RUN apk add --no-cache build-base git cmake diff --git a/js/package.json b/js/package.json index 506af534a..26df4a717 100644 --- a/js/package.json +++ b/js/package.json @@ -50,7 +50,7 @@ "@vue-a11y/announcer": "^2.1.0", "@vue-a11y/skip-to": "^2.1.2", "@vue-leaflet/vue-leaflet": "^0.6.1", - "@vue/apollo-composable": "^4.0.0-alpha.17", + "@vue/apollo-composable": "^4.0.0-beta.1", "@vue/compiler-sfc": "^3.2.37", "@vueuse/core": "^9.1.0", "@vueuse/head": "^0.9.6", @@ -111,8 +111,8 @@ "@types/prosemirror-view": "^1.11.4", "@types/sanitize-html": "^2.5.0", "@vitejs/plugin-vue": "^3.0.3", - "@vitest/coverage-c8": "^0.23.4", - "@vitest/ui": "^0.23.4", + "@vitest/coverage-c8": "^0.24.1", + "@vitest/ui": "^0.24.1", "@vue/eslint-config-prettier": "^7.0.0", "@vue/eslint-config-typescript": "^11.0.0", "@vue/test-utils": "^2.0.2", @@ -132,7 +132,7 @@ "typescript": "~4.8.3", "vite": "^3.0.9", "vite-plugin-pwa": "^0.13.0", - "vitest": "^0.23.3", + "vitest": "^0.24.1", "vue-i18n-extract": "^2.0.4" } } diff --git a/js/src/assets/oruga-tailwindcss.css b/js/src/assets/oruga-tailwindcss.css index e18222bda..e0e9830f2 100644 --- a/js/src/assets/oruga-tailwindcss.css +++ b/js/src/assets/oruga-tailwindcss.css @@ -16,6 +16,15 @@ body { .btn-outlined-primary { @apply bg-transparent text-black dark:text-white font-semibold py-2 px-4 border border-mbz-bluegreen dark:border-violet-3; } +.btn-outlined-success { + @apply border-mbz-success; +} +.btn-outlined-danger { + @apply border-mbz-danger; +} +.btn-outlined-warning { + @apply border-mbz-warning; +} .btn-outlined-:hover, .btn-outlined-primary:hover { @apply font-bold py-2 px-4 bg-mbz-bluegreen dark:bg-violet-3 text-white rounded; @@ -32,6 +41,9 @@ body { .btn-success { @apply bg-mbz-success; } +.btn-warning { + @apply bg-mbz-warning text-black hover:bg-mbz-warning/90 hover:text-slate-800; +} .btn-text { @apply bg-transparent border-transparent text-black dark:text-white font-normal underline hover:bg-zinc-200 hover:text-black; } @@ -171,7 +183,7 @@ body { /* Select */ .select { - @apply dark:bg-zinc-600 dark:placeholder:text-zinc-400 dark:text-zinc-50 rounded pl-2 pr-6 border-2 border-transparent h-10 shadow-none; + @apply dark:bg-zinc-600 dark:placeholder:text-zinc-400 dark:text-zinc-50 rounded pl-2 pr-6 border-2 border-transparent h-10 shadow-none border rounded; } /* Radio */ @@ -278,3 +290,35 @@ button.menubar__button { .menubar__button { @apply hover:bg-[rgba(0,0,0,.05)]; } + +/** Datepicker */ +.o-drop__menu--active { + @apply z-50; +} +.o-dpck__box { + @apply px-4 py-1; +} +.o-dpck__header { + @apply pb-2 mb-2; + border-bottom: 1px solid #dbdbdb; +} +.o-dpck__header__next, +.o-dpck__header__previous { + @apply justify-center text-center no-underline cursor-pointer items-center shadow-none inline-flex relative select-none leading-6 border rounded h-10 p-2 m-1; + min-width: 2.25em; +} +.o-dpck__header__list { + @apply order-2 items-center flex justify-center text-center list-none flex-wrap my-0 p-0 -mx-0.5; +} + +.o-dpck__header__list > * { + @apply mx-0.5; +} +.o-dpck__month__cell, +.o-dpck__table__cell { + @apply rounded py-2 px-3; +} +.o-dpck__month__head-cell, +.o-dpck__table__head-cell { + @apply font-semibold; +} diff --git a/js/src/components/Event/EventMetadataItem.vue b/js/src/components/Event/EventMetadataItem.vue index ff98a0476..6854eb777 100644 --- a/js/src/components/Event/EventMetadataItem.vue +++ b/js/src/components/Event/EventMetadataItem.vue @@ -53,7 +53,7 @@ :pattern=" modelValue.pattern ? modelValue.pattern.source : undefined " - :validation-message="$t(`This URL doesn't seem to be valid`)" + :validation-message="t(`This URL doesn't seem to be valid`)" required v-model="metadataItemValue" :placeholder="modelValue.placeholder" @@ -78,10 +78,11 @@ - + + + {{ t("Remove") }} + + @@ -89,6 +90,7 @@ import { EventMetadataKeyType, EventMetadataType } from "@/types/enums"; import { IEventMetadataDescription } from "@/types/event-metadata"; import { computed, ref } from "vue"; +import { useI18n } from "vue-i18n"; const props = defineProps<{ modelValue: IEventMetadataDescription; @@ -96,6 +98,8 @@ const props = defineProps<{ const emit = defineEmits(["update:modelValue", "removeItem"]); +const { t } = useI18n({ useScope: "global" }); + const urlInput = ref(null); const metadataItemValue = computed({ diff --git a/js/src/components/Event/FullAddressAutoComplete.vue b/js/src/components/Event/FullAddressAutoComplete.vue index f7f42ef26..a38995467 100644 --- a/js/src/components/Event/FullAddressAutoComplete.vue +++ b/js/src/components/Event/FullAddressAutoComplete.vue @@ -116,7 +116,6 @@ import { IAddress, addressFullName, addressToPoiInfos, - IPoiInfo, } from "../../types/address.model"; import AddressInfo from "../../components/Address/AddressInfo.vue"; import { computed, ref, watch, defineAsyncComponent } from "vue"; diff --git a/js/src/components/LeafletMap.vue b/js/src/components/LeafletMap.vue index 0426739ab..8aa613dda 100644 --- a/js/src/components/LeafletMap.vue +++ b/js/src/components/LeafletMap.vue @@ -141,10 +141,6 @@ const mountLocateControl = () => { icon.setAttribute("aria-hidden", "true"); icon.setAttribute("role", "img"); icon.insertAdjacentHTML("beforeend", locationIconHTML.value); - console.log("icon for location", { - link, - icon, - }); return { link, icon }; }, ...props.options, diff --git a/js/src/components/Local/CloseEvents.vue b/js/src/components/Local/CloseEvents.vue index d9b4c19ba..8f1ed5f83 100644 --- a/js/src/components/Local/CloseEvents.vue +++ b/js/src/components/Local/CloseEvents.vue @@ -94,7 +94,6 @@ const distance = computed(() => (suggestGeoloc.value ? 150 : 25)); const now = computed(() => roundToNearestMinute(new Date())); const searchEnabled = computed(() => geoHash.value != undefined); -const enabled = ref(false); const { result: eventsResult, diff --git a/js/src/components/Search/EventMarkerMap.vue b/js/src/components/Search/EventMarkerMap.vue index d67efc233..0f47e0e5a 100644 --- a/js/src/components/Search/EventMarkerMap.vue +++ b/js/src/components/Search/EventMarkerMap.vue @@ -162,13 +162,6 @@ onMounted(async () => { myBottomSheet.value.close(); } }); - // mapElement.value.on('load', function () { - // console.log('load event') - // setTimeout(() => { - // console.log('invalidate size') - // mapElement.value.invalidateSize() - // }, 1000) - // }) markers.value = new MarkerClusterGroup({ chunkedLoading: true }); mapElement.value.on("zoom", debounce(update, 1000)); diff --git a/js/src/components/core/CustomDialog.vue b/js/src/components/core/CustomDialog.vue index 7c5e87e9f..599d6df33 100644 --- a/js/src/components/core/CustomDialog.vue +++ b/js/src/components/core/CustomDialog.vue @@ -112,7 +112,7 @@ const iconByType = computed(() => { * Call the onConfirm prop (function) and close the Dialog. */ const confirm = () => { - console.log("dialog confirmed", input.value.$el); + console.debug("dialog confirmed", input.value?.$el); if (input.value !== undefined) { const inputElement = input.value.$el.querySelector("input"); if (!inputElement.checkValidity()) { diff --git a/js/src/components/core/MaterialIcon.vue b/js/src/components/core/MaterialIcon.vue index 491e45fde..4b69b3abe 100644 --- a/js/src/components/core/MaterialIcon.vue +++ b/js/src/components/core/MaterialIcon.vue @@ -1,5 +1,9 @@ + + diff --git a/js/src/views/Event/EventView.vue b/js/src/views/Event/EventView.vue index 539f79cc0..ae3a70f7c 100755 --- a/js/src/views/Event/EventView.vue +++ b/js/src/views/Event/EventView.vue @@ -837,7 +837,7 @@ const openDeleteEventModal = () => { pattern: escapeRegExp(event.value?.title ?? ""), }, onConfirm: (result: string) => { - console.log("calling delete event", result); + console.debug("calling delete event", result); if (result.trim() === event.value?.title) { event.value?.id ? deleteEvent({ eventId: event.value?.id }) : null; } @@ -1008,7 +1008,7 @@ const confirmLeave = (): void => { hasIcon: true, onConfirm: () => { if (event.value && currentActor.value?.id) { - console.log("calling leave event"); + console.debug("calling leave event"); leaveEvent(event.value, currentActor.value.id); } }, diff --git a/js/src/views/Settings/PreferencesView.vue b/js/src/views/Settings/PreferencesView.vue index 71e45159e..94fcf25a5 100644 --- a/js/src/views/Settings/PreferencesView.vue +++ b/js/src/views/Settings/PreferencesView.vue @@ -112,11 +112,7 @@