diff --git a/.env.example b/.env.example index eeecf5b..a806b71 100644 --- a/.env.example +++ b/.env.example @@ -66,6 +66,7 @@ AWS_BUCKET= AWS_USE_PATH_STYLE_ENDPOINT=false VITE_APP_NAME="${APP_NAME}" +VITE_APP_VERSION=local REVERB_APP_ID=local REVERB_APP_KEY=local-key diff --git a/.github/workflows/ci_cd.yml b/.github/workflows/ci_cd.yml index 56f621d..bacbf39 100644 --- a/.github/workflows/ci_cd.yml +++ b/.github/workflows/ci_cd.yml @@ -49,6 +49,7 @@ jobs: printf -v run_attempt '%03d' "${GITHUB_RUN_ATTEMPT}" tag="main-${GITHUB_RUN_NUMBER}-${run_attempt}-${GITHUB_SHA:0:12}" environment="staging" + vite_app_version="staging-${GITHUB_SHA:0:12}" vite_reverb_app_key="1af96b48d2ef78983e4ef281eed3a48b" vite_reverb_host="scrum-poker.twyco-staging.de" ;; @@ -68,6 +69,7 @@ jobs: fi environment="production" + vite_app_version="${tag}" vite_reverb_app_key="cfd9d925ff339374c04997beb90fbc32" vite_reverb_host="scrum-poker.petsch-studios.de" ;; @@ -81,6 +83,7 @@ jobs: echo "image=${image}" echo "tag=${tag}" echo "environment=${environment}" + echo "vite_app_version=${vite_app_version}" echo "vite_reverb_app_key=${vite_reverb_app_key}" echo "vite_reverb_host=${vite_reverb_host}" } >> "${GITHUB_OUTPUT}" @@ -110,6 +113,7 @@ jobs: IMAGE: ${{ steps.image.outputs.image }} IMAGE_TAG: ${{ steps.image.outputs.tag }} DEPLOYMENT_ENVIRONMENT: ${{ steps.image.outputs.environment }} + VITE_APP_VERSION: ${{ steps.image.outputs.vite_app_version }} VITE_REVERB_APP_KEY: ${{ steps.image.outputs.vite_reverb_app_key }} VITE_REVERB_HOST: ${{ steps.image.outputs.vite_reverb_host }} VITE_REVERB_PORT: "443" @@ -126,6 +130,7 @@ jobs: docker buildx build \ --file Dockerfile \ --target runtime \ + --build-arg "VITE_APP_VERSION=${VITE_APP_VERSION}" \ --build-arg "VITE_REVERB_APP_KEY=${VITE_REVERB_APP_KEY}" \ --build-arg "VITE_REVERB_HOST=${VITE_REVERB_HOST}" \ --build-arg "VITE_REVERB_PORT=${VITE_REVERB_PORT}" \ diff --git a/Dockerfile b/Dockerfile index 3069ebf..d107f92 100644 --- a/Dockerfile +++ b/Dockerfile @@ -51,12 +51,14 @@ WORKDIR /var/www FROM php_base AS build +ARG VITE_APP_VERSION=local ARG VITE_REVERB_APP_KEY ARG VITE_REVERB_HOST ARG VITE_REVERB_PORT ARG VITE_REVERB_SCHEME -ENV VITE_REVERB_APP_KEY=${VITE_REVERB_APP_KEY} \ +ENV VITE_APP_VERSION=${VITE_APP_VERSION} \ + VITE_REVERB_APP_KEY=${VITE_REVERB_APP_KEY} \ VITE_REVERB_HOST=${VITE_REVERB_HOST} \ VITE_REVERB_PORT=${VITE_REVERB_PORT} \ VITE_REVERB_SCHEME=${VITE_REVERB_SCHEME} diff --git a/resources/js/components/AppVersion.vue b/resources/js/components/AppVersion.vue new file mode 100644 index 0000000..8b4a714 --- /dev/null +++ b/resources/js/components/AppVersion.vue @@ -0,0 +1,12 @@ + + + + + {{ appVersion }} + + diff --git a/resources/js/components/rooms/RoomHeader.vue b/resources/js/components/rooms/RoomHeader.vue index 67f5d38..5dea09c 100644 --- a/resources/js/components/rooms/RoomHeader.vue +++ b/resources/js/components/rooms/RoomHeader.vue @@ -3,10 +3,12 @@ import { Link } from '@inertiajs/vue3'; import { Check, Copy } from '@lucide/vue'; import { ref } from 'vue'; +import { Checkbox } from '@/components/ui/checkbox'; import { favorite } from '@/routes/room'; -import type { RoomHeaderProps } from '@/types/room'; +import type { RoomHeaderEmits, RoomHeaderProps } from '@/types/room'; const props = defineProps(); +const emit = defineEmits(); const copied = ref(false); @@ -24,7 +26,7 @@ async function copyInviteLink(): Promise { @@ -45,21 +47,39 @@ async function copyInviteLink(): Promise { - - - - Raumcode + + + + + Raumcode + + + {{ join_code }} + - - {{ join_code }} - - - - - + + + + + + + Präsentatormodus + + diff --git a/resources/js/components/rooms/RoomModeratorControls.vue b/resources/js/components/rooms/RoomModeratorControls.vue index 406477f..4747577 100644 --- a/resources/js/components/rooms/RoomModeratorControls.vue +++ b/resources/js/components/rooms/RoomModeratorControls.vue @@ -106,4 +106,24 @@ function resetVotes(): void { left: 1rem; } } + +@media (min-width: 768px) and (max-height: 800px) { + .moderator-controls, + .reset-controls { + bottom: 0.75rem; + } + + .moderator-controls { + right: 0.75rem; + } + + .reset-controls { + left: 0.75rem; + } + + button { + padding: 0.5rem 0.75rem; + font-size: 0.875rem; + } +} diff --git a/resources/js/components/rooms/RoomSeat.vue b/resources/js/components/rooms/RoomSeat.vue index 7c6e27f..2c4a227 100644 --- a/resources/js/components/rooms/RoomSeat.vue +++ b/resources/js/components/rooms/RoomSeat.vue @@ -39,7 +39,7 @@ function playerVote(): string | null { :aria-label="`${player.name} hat eine Karte gewählt`" > @@ -313,6 +313,27 @@ function playerVote(): string | null { } } +@media (min-width: 768px) and (max-height: 800px) { + .player-seat { + width: 7rem; + } + + .player-details { + margin-top: 0.25rem; + } + + .seat-card { + top: 1.5rem; + width: 2.75rem; + height: 3.8rem; + } + + .own-vote-card, + .flip-card-face { + font-size: 1rem; + } +} + @media (prefers-reduced-motion: reduce) { .flip-card-inner { transition: none; diff --git a/resources/js/components/rooms/RoomTable.vue b/resources/js/components/rooms/RoomTable.vue index 6f325a8..b68501f 100644 --- a/resources/js/components/rooms/RoomTable.vue +++ b/resources/js/components/rooms/RoomTable.vue @@ -1,4 +1,5 @@ - + @@ -109,6 +113,7 @@ const voteCount = computed( :current-vote="currentPlayer.current_vote" :cards="room.deck.cards" :revealed="room.revealed" + :presenter-mode="presenterMode" :is-paper-ball-hit="hitPlayerIds.includes(player.id)" :throw-disabled="throwingAtPlayerId !== null" @throw-paper-ball="throwPaperBall" @@ -132,6 +137,13 @@ const voteCount = computed( isolation: isolate; } +@media (min-width: 768px) { + .game-board { + height: 100%; + min-height: 0; + } +} + .poker-table { position: absolute; inset: 20% 15% 21%; diff --git a/resources/js/components/rooms/RoomVoteDeck.vue b/resources/js/components/rooms/RoomVoteDeck.vue index 6070b85..54e79ec 100644 --- a/resources/js/components/rooms/RoomVoteDeck.vue +++ b/resources/js/components/rooms/RoomVoteDeck.vue @@ -1,5 +1,7 @@ - + - {{ card.label }} + {{ card.label }} + + + {{ shortcutForCard(index) }} + @@ -78,6 +149,7 @@ function submitVote(value: string): void {