From 8cda54548f007c867d817c7715f0ecc938c5ba83 Mon Sep 17 00:00:00 2001 From: Dian Afif Date: Wed, 29 Apr 2026 00:45:48 +0400 Subject: [PATCH] api specs --- Dockerfile.phoenix | 44 + Makefile | 23 +- README.md | 40 +- backend/ai_handlers.go | 2 +- backend/api_docs.go | 145 ++ backend/gemini.go | 2 +- backend/handlers.go | 4 +- backend/openapi/openapi.json | 1408 +++++++++++++++++ backend/routes.go | 4 + frontend/public/arture_logo.png | Bin 0 -> 53946 bytes frontend/public/datwyler_logo.png | Bin 0 -> 14206 bytes frontend/public/simon_logo.png | Bin 0 -> 91975 bytes frontend/src/App.vue | 110 +- frontend/src/components/AdminPanel.vue | 5 + frontend/src/components/AppHeader.vue | 37 +- frontend/src/components/LiveModePanel.vue | 33 +- .../admin/MultiRoundScoreEditor.vue | 7 +- .../src/components/admin/ScoreStageEditor.vue | 7 +- frontend/src/constants/i18n.js | 10 +- frontend/src/style.css | 311 +++- getdata.json | 137 ++ phoenix/.formatter.exs | 5 + phoenix/.gitignore | 31 + phoenix/AGENTS.md | 111 ++ phoenix/README.md | 51 + phoenix/config/config.exs | 35 + phoenix/config/dev.exs | 60 + phoenix/config/prod.exs | 19 + phoenix/config/runtime.exs | 92 ++ phoenix/config/test.exs | 28 + phoenix/lib/shooting_event_phx.ex | 9 + phoenix/lib/shooting_event_phx/ai/gemini.ex | 199 +++ phoenix/lib/shooting_event_phx/application.ex | 43 + phoenix/lib/shooting_event_phx/auth.ex | 51 + .../shooting_event_phx/auth/session_store.ex | 46 + .../shooting_event_phx/domain/app_setting.ex | 11 + .../lib/shooting_event_phx/domain/derived.ex | 272 ++++ .../shooting_event_phx/domain/event_data.ex | 353 +++++ .../lib/shooting_event_phx/domain/player.ex | 14 + .../lib/shooting_event_phx/domain/score.ex | 13 + .../domain/score_attachment.ex | 13 + .../lib/shooting_event_phx/domain/settings.ex | 297 ++++ .../lib/shooting_event_phx/domain/stages.ex | 42 + .../domain/state_service.ex | 43 + phoenix/lib/shooting_event_phx/events.ex | 15 + phoenix/lib/shooting_event_phx/repo.ex | 5 + phoenix/lib/shooting_event_phx_web.ex | 63 + .../controllers/api_controller.ex | 221 +++ .../controllers/error_json.ex | 21 + .../controllers/events_controller.ex | 40 + .../controllers/static_controller.ex | 57 + .../lib/shooting_event_phx_web/endpoint.ex | 50 + .../plugs/admin_only.ex | 18 + .../lib/shooting_event_phx_web/plugs/cors.ex | 20 + phoenix/lib/shooting_event_phx_web/router.ex | 49 + .../lib/shooting_event_phx_web/telemetry.ex | 93 ++ phoenix/mix.exs | 70 + phoenix/mix.lock | 32 + phoenix/priv/repo/migrations/.formatter.exs | 4 + .../20260403095800_init_event_schema.exs | 92 ++ phoenix/priv/repo/seeds.exs | 11 + phoenix/priv/static/favicon.ico | Bin 0 -> 152 bytes phoenix/priv/static/robots.txt | 5 + .../controllers/error_json_test.exs | 14 + phoenix/test/support/conn_case.ex | 38 + phoenix/test/support/data_case.ex | 58 + phoenix/test/test_helper.exs | 2 + 67 files changed, 5052 insertions(+), 93 deletions(-) create mode 100644 Dockerfile.phoenix create mode 100644 backend/api_docs.go create mode 100644 backend/openapi/openapi.json create mode 100644 frontend/public/arture_logo.png create mode 100644 frontend/public/datwyler_logo.png create mode 100644 frontend/public/simon_logo.png create mode 100644 getdata.json create mode 100644 phoenix/.formatter.exs create mode 100644 phoenix/.gitignore create mode 100644 phoenix/AGENTS.md create mode 100644 phoenix/README.md create mode 100644 phoenix/config/config.exs create mode 100644 phoenix/config/dev.exs create mode 100644 phoenix/config/prod.exs create mode 100644 phoenix/config/runtime.exs create mode 100644 phoenix/config/test.exs create mode 100644 phoenix/lib/shooting_event_phx.ex create mode 100644 phoenix/lib/shooting_event_phx/ai/gemini.ex create mode 100644 phoenix/lib/shooting_event_phx/application.ex create mode 100644 phoenix/lib/shooting_event_phx/auth.ex create mode 100644 phoenix/lib/shooting_event_phx/auth/session_store.ex create mode 100644 phoenix/lib/shooting_event_phx/domain/app_setting.ex create mode 100644 phoenix/lib/shooting_event_phx/domain/derived.ex create mode 100644 phoenix/lib/shooting_event_phx/domain/event_data.ex create mode 100644 phoenix/lib/shooting_event_phx/domain/player.ex create mode 100644 phoenix/lib/shooting_event_phx/domain/score.ex create mode 100644 phoenix/lib/shooting_event_phx/domain/score_attachment.ex create mode 100644 phoenix/lib/shooting_event_phx/domain/settings.ex create mode 100644 phoenix/lib/shooting_event_phx/domain/stages.ex create mode 100644 phoenix/lib/shooting_event_phx/domain/state_service.ex create mode 100644 phoenix/lib/shooting_event_phx/events.ex create mode 100644 phoenix/lib/shooting_event_phx/repo.ex create mode 100644 phoenix/lib/shooting_event_phx_web.ex create mode 100644 phoenix/lib/shooting_event_phx_web/controllers/api_controller.ex create mode 100644 phoenix/lib/shooting_event_phx_web/controllers/error_json.ex create mode 100644 phoenix/lib/shooting_event_phx_web/controllers/events_controller.ex create mode 100644 phoenix/lib/shooting_event_phx_web/controllers/static_controller.ex create mode 100644 phoenix/lib/shooting_event_phx_web/endpoint.ex create mode 100644 phoenix/lib/shooting_event_phx_web/plugs/admin_only.ex create mode 100644 phoenix/lib/shooting_event_phx_web/plugs/cors.ex create mode 100644 phoenix/lib/shooting_event_phx_web/router.ex create mode 100644 phoenix/lib/shooting_event_phx_web/telemetry.ex create mode 100644 phoenix/mix.exs create mode 100644 phoenix/mix.lock create mode 100644 phoenix/priv/repo/migrations/.formatter.exs create mode 100644 phoenix/priv/repo/migrations/20260403095800_init_event_schema.exs create mode 100644 phoenix/priv/repo/seeds.exs create mode 100644 phoenix/priv/static/favicon.ico create mode 100644 phoenix/priv/static/robots.txt create mode 100644 phoenix/test/shooting_event_phx_web/controllers/error_json_test.exs create mode 100644 phoenix/test/support/conn_case.ex create mode 100644 phoenix/test/support/data_case.ex create mode 100644 phoenix/test/test_helper.exs diff --git a/Dockerfile.phoenix b/Dockerfile.phoenix new file mode 100644 index 0000000..1f9b0ee --- /dev/null +++ b/Dockerfile.phoenix @@ -0,0 +1,44 @@ +# syntax=docker/dockerfile:1.7 + +FROM --platform=$BUILDPLATFORM node:20-alpine AS frontend-builder +WORKDIR /app/frontend +COPY frontend/package.json frontend/pnpm-lock.yaml ./ +RUN corepack enable && pnpm install --frozen-lockfile +COPY frontend/ ./ +RUN pnpm build + +FROM --platform=$BUILDPLATFORM elixir:1.18.4-otp-28 AS phoenix-builder +ENV MIX_ENV=prod +WORKDIR /app/phoenix + +RUN mix local.hex --force && mix local.rebar --force + +COPY phoenix/mix.exs phoenix/mix.lock ./ +RUN mix deps.get --only prod +RUN mix deps.compile + +COPY phoenix/config ./config +COPY phoenix/lib ./lib +COPY phoenix/priv ./priv +RUN mix compile +RUN mix release + +FROM --platform=$TARGETPLATFORM elixir:1.18.4-otp-28 +RUN groupadd -r app && useradd -r -g app app +WORKDIR /app + +COPY --from=phoenix-builder /app/phoenix/_build/prod/rel/shooting_event_phx /app +COPY --from=frontend-builder /app/frontend/dist /app/web + +RUN mkdir -p /app/data && chown -R app:app /app +USER app + +ENV PHX_SERVER=true +ENV PORT=8080 +ENV DB_PATH=/app/data/shooting.db +ENV WEB_DIR=/app/web +ENV SECRET_KEY_BASE=pxh_v1_V2Y3TXF4Rk9OUm5FdlVQc2s3M2hqd0t1Q2pwYUx4N3Vjb2I5Wk1qXzJ5RWRmQnJ + +EXPOSE 8080 +ENTRYPOINT ["/app/bin/shooting_event_phx"] +CMD ["start"] diff --git a/Makefile b/Makefile index 3571e9f..ca61f9a 100644 --- a/Makefile +++ b/Makefile @@ -4,15 +4,17 @@ PNPM ?= pnpm GO ?= go CONTAINER_REG ?= repo.ssp-itinfra.com/admin IMAGE_NAME ?= shooting-event +PHOENIX_IMAGE_NAME ?= $(IMAGE_NAME)-phoenix ARCH ?= amd64 BUILD_DATE ?= $(shell date -u +"%Y-%m-%dT%H:%M:%SZ") BUILD_VERSION ?= $(shell git describe --tags --always --dirty) -.PHONY: install dev dev-backend dev-frontend build build-frontend build-backend docker-build docker-run clean +.PHONY: install dev dev-backend dev-frontend build build-frontend build-backend phoenix-dev phoenix-build docker-build docker-run docker-build-phoenix docker-run-phoenix clean install: cd frontend && $(PNPM) install cd backend && $(GO) mod tidy + cd phoenix && mix deps.get dev-backend: cd backend && $(GO) run . @@ -40,6 +42,12 @@ build: build-frontend cp -R frontend/dist/. backend/web/ $(MAKE) build-backend +phoenix-dev: + cd phoenix && mix deps.get && mix ecto.create && mix ecto.migrate && PORT=$${PORT:-8080} mix phx.server + +phoenix-build: + cd phoenix && MIX_ENV=prod mix deps.get --only prod && MIX_ENV=prod mix compile + docker-build: docker buildx build --load --platform=linux/$(ARCH) -t $(CONTAINER_REG)/$(IMAGE_NAME):$(ARCH) . docker tag $(CONTAINER_REG)/$(IMAGE_NAME):$(ARCH) $(CONTAINER_REG)/$(IMAGE_NAME):$(ARCH)-latest @@ -52,7 +60,20 @@ docker-run: mkdir -p data docker run --rm -p 8080:8080 -v $(PWD)/data:/app/data $(CONTAINER_REG)/$(IMAGE_NAME):$(ARCH) +docker-build-phoenix: + docker buildx build --load --platform=linux/$(ARCH) -f Dockerfile.phoenix -t $(CONTAINER_REG)/$(PHOENIX_IMAGE_NAME):$(ARCH) . + docker tag $(CONTAINER_REG)/$(PHOENIX_IMAGE_NAME):$(ARCH) $(CONTAINER_REG)/$(PHOENIX_IMAGE_NAME):$(ARCH)-latest + docker tag $(CONTAINER_REG)/$(PHOENIX_IMAGE_NAME):$(ARCH) $(CONTAINER_REG)/$(PHOENIX_IMAGE_NAME):$(ARCH)-$(BUILD_VERSION) + docker push $(CONTAINER_REG)/$(PHOENIX_IMAGE_NAME):$(ARCH) + docker push $(CONTAINER_REG)/$(PHOENIX_IMAGE_NAME):$(ARCH)-latest + docker push $(CONTAINER_REG)/$(PHOENIX_IMAGE_NAME):$(ARCH)-$(BUILD_VERSION) + +docker-run-phoenix: + mkdir -p data + docker run --rm -p 8080:8080 -v $(PWD)/data:/app/data $(CONTAINER_REG)/$(PHOENIX_IMAGE_NAME):$(ARCH) + release: + ${MAKE} build $(MAKE) docker-build clean: diff --git a/README.md b/README.md index ea9982c..7aee4a9 100644 --- a/README.md +++ b/README.md @@ -34,29 +34,39 @@ Production-ready full-stack web app based on your original live score concept. 8. Podium is determined automatically. 9. If top-3 tie exists, podium tie-break stage appears. -## API Highlights +## API Documentation (OpenAPI) -Public: +Interactive docs are now built in: -- `GET /api/health` -- `GET /api/state` +- Swagger UI: `GET /api/docs` +- OpenAPI JSON: `GET /api/openapi.json` -Admin: +### Testing with Auth in Swagger UI -- `POST /api/admin/login` -- `POST /api/admin/logout` -- `POST /api/admin/players` -- `PUT /api/admin/players/:id` -- `DELETE /api/admin/players/:id` -- `PUT /api/admin/scores/:stage/:id` -- `POST /api/admin/scores/:stage/:id/advice` -- `POST /api/admin/scores/:stage/reset` +1. Open `/api/docs`. +2. Use the **Login & Authorize** form at the top: + - Username: `datwyler` (default) + - Password: `datwyler` (default) +3. The page calls `POST /api/admin/login`, retrieves the token, and auto-authorizes Swagger. +4. Use **Try it out** on any admin endpoint. -Stages: +### Stage Values + +For score update/proof/advice endpoints (`/api/admin/scores/{stage}/...`), use: + +- `prelim_r1` +- `prelim_r2` +- `prelim_r3` +- `final_r1` +- `final_r2` +- `prelim_tiebreak` +- `final_tiebreak` + +For reset endpoint (`POST /api/admin/scores/{stage}/reset`), use: - `preliminary` -- `prelim_tiebreak` - `final` +- `prelim_tiebreak` - `final_tiebreak` ## Local Development diff --git a/backend/ai_handlers.go b/backend/ai_handlers.go index 4d747e9..7fd7942 100644 --- a/backend/ai_handlers.go +++ b/backend/ai_handlers.go @@ -69,7 +69,7 @@ func (a *App) loadCurrentScore(stage string, playerID int) (int, error) { } func (a *App) buildAdviceResponse(stage string, playerID int, raw scoreAdviceModelResponse) ScoreAdviceResponse { - advised := clampInt(raw.AdvisedScore, 0, 9999) + advised := clampInt(raw.AdvisedScore, 0, 100) reason := strings.TrimSpace(raw.Reason) if reason == "" { reason = "AI estimated the score from visible impacts." diff --git a/backend/api_docs.go b/backend/api_docs.go new file mode 100644 index 0000000..bf9bfe7 --- /dev/null +++ b/backend/api_docs.go @@ -0,0 +1,145 @@ +package main + +import ( + _ "embed" + "fmt" + "net/http" + + "github.com/labstack/echo/v4" +) + +//go:embed openapi/openapi.json +var openAPISpecJSON string + +func (a *App) handleOpenAPISpec(c echo.Context) error { + return c.Blob(http.StatusOK, "application/json; charset=utf-8", []byte(openAPISpecJSON)) +} + +func (a *App) handleOpenAPIDocs(c echo.Context) error { + html := fmt.Sprintf(` + + + + + Shooting Event API Docs + + + + +
+

Shooting Event OpenAPI Docs

+

+ Use Try it out for live testing. For admin endpoints: login with the form below, + then your token is auto-attached to Swagger Authorize. +

+ +
+ + + + +
+
+ +
+ + + + +`, "/api/openapi.json") + + return c.HTML(http.StatusOK, html) +} diff --git a/backend/gemini.go b/backend/gemini.go index caeaccb..1a9f65d 100644 --- a/backend/gemini.go +++ b/backend/gemini.go @@ -198,6 +198,6 @@ func scoreAdvicePrompt(stage string, currentScore int) string { return fmt.Sprintf(`Target scoring assistant. Stage: %s. Current score: %d. Return STRICT JSON only: -{"advisedScore":,"reason":""} +{"advisedScore":,"reason":""} Do not add markdown or extra fields.`, stage, currentScore) } diff --git a/backend/handlers.go b/backend/handlers.go index 46bc026..443808c 100644 --- a/backend/handlers.go +++ b/backend/handlers.go @@ -310,8 +310,8 @@ func (a *App) handleUpdateScore(c echo.Context) error { if err := c.Bind(&req); err != nil { return writeError(c, http.StatusBadRequest, "invalid request body") } - if req.Score < 0 || req.Score > 9999 { - return writeError(c, http.StatusBadRequest, "score must be between 0 and 9999") + if req.Score < 0 || req.Score > 100 { + return writeError(c, http.StatusBadRequest, "score must be between 0 and 100") } res, err := a.db.Exec(` diff --git a/backend/openapi/openapi.json b/backend/openapi/openapi.json new file mode 100644 index 0000000..2b224a5 --- /dev/null +++ b/backend/openapi/openapi.json @@ -0,0 +1,1408 @@ +{ + "openapi": "3.0.3", + "info": { + "title": "Shooting Event API", + "description": "REST API for live scoring, admin control, proof images, and AI score advice.", + "version": "1.0.0" + }, + "servers": [ + { + "url": "/api", + "description": "Same host API base path" + } + ], + "tags": [ + { + "name": "Public", + "description": "Public endpoints available without admin authentication" + }, + { + "name": "Admin", + "description": "Admin endpoints protected by bearer token" + } + ], + "paths": { + "/health": { + "get": { + "tags": [ + "Public" + ], + "summary": "Health check", + "operationId": "getHealth", + "responses": { + "200": { + "description": "Service is healthy", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HealthResponse" + } + } + } + } + } + } + }, + "/state": { + "get": { + "tags": [ + "Public" + ], + "summary": "Get application state", + "description": "Returns public state by default. If a valid admin bearer token is sent, `scoreProofs` is included.", + "operationId": "getState", + "security": [ + {}, + { + "bearerAuth": [] + } + ], + "responses": { + "200": { + "description": "Current application state", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/StateResponse" + } + } + } + }, + "500": { + "$ref": "#/components/responses/InternalServerError" + } + } + } + }, + "/events": { + "get": { + "tags": [ + "Public" + ], + "summary": "Live update stream (SSE)", + "description": "Server-Sent Events stream. Emits `ready` and `state` events plus periodic keepalive pings.", + "operationId": "streamEvents", + "responses": { + "200": { + "description": "Event stream opened", + "content": { + "text/event-stream": { + "schema": { + "type": "string", + "example": "event: ready\\ndata: {\"ts\":\"2026-04-28T10:00:00Z\"}\\n\\n" + } + } + } + }, + "500": { + "$ref": "#/components/responses/InternalServerError" + } + } + } + }, + "/admin/login": { + "post": { + "tags": [ + "Admin" + ], + "summary": "Admin login", + "description": "Authenticates admin credentials and returns a bearer token valid for 8 hours.", + "operationId": "adminLogin", + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/AdminLoginRequest" + } + } + } + }, + "responses": { + "200": { + "description": "Login successful", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/AdminLoginResponse" + } + } + } + }, + "400": { + "$ref": "#/components/responses/BadRequest" + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + }, + "500": { + "$ref": "#/components/responses/InternalServerError" + } + } + } + }, + "/admin/logout": { + "post": { + "tags": [ + "Admin" + ], + "summary": "Admin logout", + "operationId": "adminLogout", + "security": [ + { + "bearerAuth": [] + } + ], + "responses": { + "200": { + "description": "Token invalidated", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/OkResponse" + } + } + } + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + } + } + } + }, + "/admin/state": { + "get": { + "tags": [ + "Admin" + ], + "summary": "Get full admin state", + "description": "Same shape as `/state`, always includes admin-visible fields such as `scoreProofs`.", + "operationId": "getAdminState", + "security": [ + { + "bearerAuth": [] + } + ], + "responses": { + "200": { + "description": "Full admin state", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/StateResponse" + } + } + } + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + }, + "500": { + "$ref": "#/components/responses/InternalServerError" + } + } + } + }, + "/admin/settings": { + "put": { + "tags": [ + "Admin" + ], + "summary": "Update app settings", + "operationId": "updateAdminSettings", + "security": [ + { + "bearerAuth": [] + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/AdminSettingsUpdateRequest" + } + } + } + }, + "responses": { + "200": { + "description": "Updated state", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/StateResponse" + } + } + } + }, + "400": { + "$ref": "#/components/responses/BadRequest" + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + }, + "500": { + "$ref": "#/components/responses/InternalServerError" + } + } + } + }, + "/admin/players": { + "post": { + "tags": [ + "Admin" + ], + "summary": "Create player", + "operationId": "createPlayer", + "security": [ + { + "bearerAuth": [] + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PlayerCreateRequest" + } + } + } + }, + "responses": { + "201": { + "description": "Player created; full updated state returned", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/StateResponse" + } + } + } + }, + "400": { + "$ref": "#/components/responses/BadRequest" + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + }, + "500": { + "$ref": "#/components/responses/InternalServerError" + } + } + } + }, + "/admin/players/auto-group": { + "post": { + "tags": [ + "Admin" + ], + "summary": "Auto-assign player groups", + "description": "Randomly shuffles players and assigns group codes in round-robin order.", + "operationId": "autoGroupPlayers", + "security": [ + { + "bearerAuth": [] + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/AutoGroupPlayersRequest" + } + } + } + }, + "responses": { + "200": { + "description": "Updated state", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/StateResponse" + } + } + } + }, + "400": { + "$ref": "#/components/responses/BadRequest" + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + }, + "500": { + "$ref": "#/components/responses/InternalServerError" + } + } + } + }, + "/admin/players/{id}": { + "put": { + "tags": [ + "Admin" + ], + "summary": "Update player", + "operationId": "updatePlayer", + "security": [ + { + "bearerAuth": [] + } + ], + "parameters": [ + { + "$ref": "#/components/parameters/PlayerIdParam" + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PlayerUpdateRequest" + } + } + } + }, + "responses": { + "200": { + "description": "Updated state", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/StateResponse" + } + } + } + }, + "400": { + "$ref": "#/components/responses/BadRequest" + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + }, + "404": { + "$ref": "#/components/responses/NotFound" + }, + "500": { + "$ref": "#/components/responses/InternalServerError" + } + } + }, + "delete": { + "tags": [ + "Admin" + ], + "summary": "Delete player", + "operationId": "deletePlayer", + "security": [ + { + "bearerAuth": [] + } + ], + "parameters": [ + { + "$ref": "#/components/parameters/PlayerIdParam" + } + ], + "responses": { + "200": { + "description": "Updated state", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/StateResponse" + } + } + } + }, + "400": { + "$ref": "#/components/responses/BadRequest" + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + }, + "404": { + "$ref": "#/components/responses/NotFound" + }, + "500": { + "$ref": "#/components/responses/InternalServerError" + } + } + } + }, + "/admin/scores/{stage}/{id}": { + "put": { + "tags": [ + "Admin" + ], + "summary": "Set a score", + "description": "Upserts score for a given stage/player. Score must be 0..100.", + "operationId": "updateScore", + "security": [ + { + "bearerAuth": [] + } + ], + "parameters": [ + { + "$ref": "#/components/parameters/ScoreStageParam" + }, + { + "$ref": "#/components/parameters/PlayerIdParam" + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ScoreUpdateRequest" + } + } + } + }, + "responses": { + "200": { + "description": "Updated state", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/StateResponse" + } + } + } + }, + "400": { + "$ref": "#/components/responses/BadRequest" + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + }, + "500": { + "$ref": "#/components/responses/InternalServerError" + } + } + } + }, + "/admin/scores/{stage}/{id}/proof": { + "put": { + "tags": [ + "Admin" + ], + "summary": "Upload score proof image", + "description": "Stores proof image data (typically a data URL string).", + "operationId": "updateScoreProof", + "security": [ + { + "bearerAuth": [] + } + ], + "parameters": [ + { + "$ref": "#/components/parameters/ScoreStageParam" + }, + { + "$ref": "#/components/parameters/PlayerIdParam" + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ScoreProofUpdateRequest" + } + } + } + }, + "responses": { + "200": { + "description": "Updated state", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/StateResponse" + } + } + } + }, + "400": { + "$ref": "#/components/responses/BadRequest" + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + }, + "500": { + "$ref": "#/components/responses/InternalServerError" + } + } + }, + "delete": { + "tags": [ + "Admin" + ], + "summary": "Delete score proof image", + "operationId": "deleteScoreProof", + "security": [ + { + "bearerAuth": [] + } + ], + "parameters": [ + { + "$ref": "#/components/parameters/ScoreStageParam" + }, + { + "$ref": "#/components/parameters/PlayerIdParam" + } + ], + "responses": { + "200": { + "description": "Updated state", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/StateResponse" + } + } + } + }, + "400": { + "$ref": "#/components/responses/BadRequest" + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + }, + "500": { + "$ref": "#/components/responses/InternalServerError" + } + } + } + }, + "/admin/scores/{stage}/{id}/advice": { + "post": { + "tags": [ + "Admin" + ], + "summary": "Get AI score advice", + "description": "Uses configured Gemini model with uploaded proof image to propose a score and reason.", + "operationId": "getScoreAdvice", + "security": [ + { + "bearerAuth": [] + } + ], + "parameters": [ + { + "$ref": "#/components/parameters/ScoreStageParam" + }, + { + "$ref": "#/components/parameters/PlayerIdParam" + } + ], + "responses": { + "200": { + "description": "Advice generated", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ScoreAdviceResponse" + } + } + } + }, + "400": { + "$ref": "#/components/responses/BadRequest" + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + }, + "502": { + "description": "AI upstream returned an error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "503": { + "description": "AI service not configured", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "$ref": "#/components/responses/InternalServerError" + } + } + } + }, + "/admin/scores/{stage}/reset": { + "post": { + "tags": [ + "Admin" + ], + "summary": "Reset a stage family", + "description": "Resets scores to zero for one stage family or tie-break stage. Optionally removes proofs.", + "operationId": "resetStage", + "security": [ + { + "bearerAuth": [] + } + ], + "parameters": [ + { + "$ref": "#/components/parameters/ResetStageParam" + } + ], + "requestBody": { + "required": false, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ResetStageRequest" + } + } + } + }, + "responses": { + "200": { + "description": "Updated state", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/StateResponse" + } + } + } + }, + "400": { + "$ref": "#/components/responses/BadRequest" + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + }, + "500": { + "$ref": "#/components/responses/InternalServerError" + } + } + } + } + }, + "components": { + "securitySchemes": { + "bearerAuth": { + "type": "http", + "scheme": "bearer", + "bearerFormat": "Token" + } + }, + "parameters": { + "PlayerIdParam": { + "name": "id", + "in": "path", + "required": true, + "description": "Player ID", + "schema": { + "type": "integer", + "minimum": 1 + } + }, + "ScoreStageParam": { + "name": "stage", + "in": "path", + "required": true, + "description": "Score stage key", + "schema": { + "type": "string", + "enum": [ + "prelim_r1", + "prelim_r2", + "prelim_r3", + "final_r1", + "final_r2", + "prelim_tiebreak", + "final_tiebreak" + ] + } + }, + "ResetStageParam": { + "name": "stage", + "in": "path", + "required": true, + "description": "Reset target", + "schema": { + "type": "string", + "enum": [ + "preliminary", + "final", + "prelim_tiebreak", + "final_tiebreak" + ] + } + } + }, + "responses": { + "BadRequest": { + "description": "Invalid input", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "Unauthorized": { + "description": "Missing or invalid bearer token", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "NotFound": { + "description": "Resource not found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "InternalServerError": { + "description": "Internal server error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + } + }, + "schemas": { + "ErrorResponse": { + "type": "object", + "required": [ + "message" + ], + "properties": { + "message": { + "type": "string" + } + } + }, + "OkResponse": { + "type": "object", + "required": [ + "ok" + ], + "properties": { + "ok": { + "type": "boolean" + } + } + }, + "HealthResponse": { + "type": "object", + "required": [ + "status" + ], + "properties": { + "status": { + "type": "string", + "example": "ok" + } + } + }, + "AdminLoginRequest": { + "type": "object", + "required": [ + "username", + "password" + ], + "properties": { + "username": { + "type": "string" + }, + "password": { + "type": "string" + } + } + }, + "AdminLoginResponse": { + "type": "object", + "required": [ + "token", + "expiresAt", + "username" + ], + "properties": { + "token": { + "type": "string" + }, + "expiresAt": { + "type": "string", + "format": "date-time" + }, + "username": { + "type": "string" + } + } + }, + "CompetitionMeta": { + "type": "object", + "required": [ + "titleAr", + "titleEn" + ], + "properties": { + "titleAr": { + "type": "string" + }, + "titleEn": { + "type": "string" + } + } + }, + "Player": { + "type": "object", + "required": [ + "id", + "nameAr", + "nameEn", + "groupCode", + "imageData" + ], + "properties": { + "id": { + "type": "integer" + }, + "nameAr": { + "type": "string" + }, + "nameEn": { + "type": "string" + }, + "groupCode": { + "type": "string" + }, + "imageData": { + "type": "string" + } + } + }, + "RankingRow": { + "type": "object", + "required": [ + "playerId", + "nameAr", + "nameEn", + "groupCode", + "imageData", + "score", + "tieBreak", + "rank", + "seed", + "finalGroup" + ], + "properties": { + "playerId": { + "type": "integer" + }, + "nameAr": { + "type": "string" + }, + "nameEn": { + "type": "string" + }, + "groupCode": { + "type": "string" + }, + "imageData": { + "type": "string" + }, + "score": { + "type": "integer" + }, + "tieBreak": { + "type": "integer" + }, + "rank": { + "type": "integer" + }, + "seed": { + "type": "integer" + }, + "finalGroup": { + "type": "integer" + } + } + }, + "TieBreakInfo": { + "type": "object", + "required": [ + "required", + "resolved", + "slots", + "playerIds" + ], + "properties": { + "required": { + "type": "boolean" + }, + "resolved": { + "type": "boolean" + }, + "slots": { + "type": "integer" + }, + "playerIds": { + "type": "array", + "items": { + "type": "integer" + } + } + } + }, + "RankingBundle": { + "type": "object", + "required": [ + "rows", + "tieBreak", + "unresolved" + ], + "properties": { + "rows": { + "type": "array", + "items": { + "$ref": "#/components/schemas/RankingRow" + } + }, + "tieBreak": { + "$ref": "#/components/schemas/TieBreakInfo" + }, + "unresolved": { + "type": "boolean" + } + } + }, + "FinalGroups": { + "type": "object", + "required": [ + "group1", + "group2" + ], + "properties": { + "group1": { + "type": "array", + "items": { + "$ref": "#/components/schemas/RankingRow" + } + }, + "group2": { + "type": "array", + "items": { + "$ref": "#/components/schemas/RankingRow" + } + } + } + }, + "DerivedState": { + "type": "object", + "required": [ + "preliminaryRanking", + "finalists", + "finalGroups", + "finalRanking", + "podium" + ], + "properties": { + "preliminaryRanking": { + "$ref": "#/components/schemas/RankingBundle" + }, + "finalists": { + "type": "array", + "items": { + "$ref": "#/components/schemas/RankingRow" + } + }, + "finalGroups": { + "$ref": "#/components/schemas/FinalGroups" + }, + "finalRanking": { + "$ref": "#/components/schemas/RankingBundle" + }, + "podium": { + "type": "array", + "items": { + "$ref": "#/components/schemas/RankingRow" + } + } + } + }, + "LiveModeSettings": { + "type": "object", + "required": [ + "activeView", + "showGroupLive", + "groupDisplayMode", + "groupFixedCode", + "showPrelimTie", + "showPrelimOverall", + "showFinalGroups", + "finalDisplayMode", + "finalFixedGroup", + "showFinalTie", + "showPodium", + "rotationIntervalSec", + "rotationPlayerCount" + ], + "properties": { + "activeView": { + "type": "string", + "enum": [ + "group_live", + "prelim_tie", + "prelim_overall", + "final_groups", + "final_tie", + "podium" + ] + }, + "showGroupLive": { + "type": "boolean" + }, + "groupDisplayMode": { + "type": "string", + "enum": [ + "rotate", + "fixed" + ] + }, + "groupFixedCode": { + "type": "string" + }, + "showPrelimTie": { + "type": "boolean" + }, + "showPrelimOverall": { + "type": "boolean" + }, + "showFinalGroups": { + "type": "boolean" + }, + "finalDisplayMode": { + "type": "string", + "enum": [ + "rotate", + "fixed" + ] + }, + "finalFixedGroup": { + "type": "integer", + "enum": [ + 1, + 2 + ] + }, + "showFinalTie": { + "type": "boolean" + }, + "showPodium": { + "type": "boolean" + }, + "rotationIntervalSec": { + "type": "integer", + "minimum": 3, + "maximum": 30 + }, + "rotationPlayerCount": { + "type": "integer", + "minimum": 3, + "maximum": 40 + } + } + }, + "LiveModeSettingsUpdateRequest": { + "type": "object", + "description": "Partial patch. Send only fields that need to change.", + "properties": { + "activeView": { + "type": "string", + "enum": [ + "group_live", + "prelim_tie", + "prelim_overall", + "final_groups", + "final_tie", + "podium" + ] + }, + "showGroupLive": { + "type": "boolean" + }, + "groupDisplayMode": { + "type": "string", + "enum": [ + "rotate", + "fixed" + ] + }, + "groupFixedCode": { + "type": "string" + }, + "showPrelimTie": { + "type": "boolean" + }, + "showPrelimOverall": { + "type": "boolean" + }, + "showFinalGroups": { + "type": "boolean" + }, + "finalDisplayMode": { + "type": "string", + "enum": [ + "rotate", + "fixed" + ] + }, + "finalFixedGroup": { + "type": "integer", + "enum": [ + 1, + 2 + ] + }, + "showFinalTie": { + "type": "boolean" + }, + "showPodium": { + "type": "boolean" + }, + "rotationIntervalSec": { + "type": "integer", + "minimum": 3, + "maximum": 30 + }, + "rotationPlayerCount": { + "type": "integer", + "minimum": 3, + "maximum": 40 + } + } + }, + "AppSettings": { + "type": "object", + "required": [ + "viewProofInView", + "liveMode" + ], + "properties": { + "viewProofInView": { + "type": "boolean" + }, + "liveMode": { + "$ref": "#/components/schemas/LiveModeSettings" + } + } + }, + "StateResponse": { + "type": "object", + "required": [ + "competition", + "players", + "scores", + "settings", + "derived", + "serverTime" + ], + "properties": { + "competition": { + "$ref": "#/components/schemas/CompetitionMeta" + }, + "players": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Player" + } + }, + "scores": { + "type": "object", + "additionalProperties": { + "type": "object", + "additionalProperties": { + "type": "integer" + } + } + }, + "scoreProofs": { + "type": "object", + "additionalProperties": { + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "description": "Included for admin-authenticated state requests." + }, + "settings": { + "$ref": "#/components/schemas/AppSettings" + }, + "derived": { + "$ref": "#/components/schemas/DerivedState" + }, + "serverTime": { + "type": "string", + "format": "date-time" + } + } + }, + "AdminSettingsUpdateRequest": { + "type": "object", + "description": "At least one field must be provided.", + "properties": { + "viewProofInView": { + "type": "boolean" + }, + "liveMode": { + "$ref": "#/components/schemas/LiveModeSettingsUpdateRequest" + } + } + }, + "PlayerCreateRequest": { + "type": "object", + "required": [ + "nameAr", + "nameEn", + "groupCode" + ], + "properties": { + "nameAr": { + "type": "string" + }, + "nameEn": { + "type": "string" + }, + "groupCode": { + "type": "string" + } + } + }, + "PlayerUpdateRequest": { + "type": "object", + "description": "Partial patch. Set `clearImage` true to remove image.", + "properties": { + "nameAr": { + "type": "string" + }, + "nameEn": { + "type": "string" + }, + "groupCode": { + "type": "string" + }, + "imageData": { + "type": "string", + "description": "Base64/data URL payload. Max about 2.5MB characters." + }, + "clearImage": { + "type": "boolean" + } + } + }, + "AutoGroupPlayersRequest": { + "type": "object", + "required": [ + "groups" + ], + "properties": { + "groups": { + "type": "array", + "items": { + "type": "string" + }, + "minItems": 1 + } + } + }, + "ScoreUpdateRequest": { + "type": "object", + "required": [ + "score" + ], + "properties": { + "score": { + "type": "integer", + "minimum": 0, + "maximum": 100 + } + } + }, + "ScoreProofUpdateRequest": { + "type": "object", + "required": [ + "imageData" + ], + "properties": { + "imageData": { + "type": "string", + "description": "Base64/data URL payload. Max about 5MB characters." + } + } + }, + "ResetStageRequest": { + "type": "object", + "properties": { + "resetProofs": { + "type": "boolean" + } + } + }, + "ScoreAdviceResponse": { + "type": "object", + "required": [ + "stage", + "playerId", + "advisedScore", + "reason", + "generatedAt" + ], + "properties": { + "stage": { + "type": "string" + }, + "playerId": { + "type": "integer" + }, + "advisedScore": { + "type": "integer", + "minimum": 0, + "maximum": 100 + }, + "reason": { + "type": "string" + }, + "generatedAt": { + "type": "string", + "format": "date-time" + } + } + } + } + } +} diff --git a/backend/routes.go b/backend/routes.go index 43ab6f7..22d77de 100644 --- a/backend/routes.go +++ b/backend/routes.go @@ -11,6 +11,10 @@ import ( func registerAPIRoutes(e *echo.Echo, app *App) { api := e.Group("/api") + api.GET("/docs", app.handleOpenAPIDocs) + api.GET("/docs/", app.handleOpenAPIDocs) + api.GET("/openapi.json", app.handleOpenAPISpec) + api.GET("/health", app.handleHealth) api.GET("/state", app.handleGetState) api.GET("/events", app.handleEvents) diff --git a/frontend/public/arture_logo.png b/frontend/public/arture_logo.png new file mode 100644 index 0000000000000000000000000000000000000000..98a6c0ed0847636eb98b98a874365604b0874539 GIT binary patch literal 53946 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 F^&e2(q5l8? literal 0 HcmV?d00001 diff --git a/frontend/public/datwyler_logo.png b/frontend/public/datwyler_logo.png new file mode 100644 index 0000000000000000000000000000000000000000..2ade7055d9573ca50fed1bd3afaa14a6c90851b5 GIT binary patch literal 14206 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 VO8xs)=W0p5jP8XJRPu9YkT^W{&j$7rjZIx(5{4 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
@@ -133,6 +135,7 @@ :display-name="displayName" :secondary-name="secondaryName" :score-input-value="scoreInputValue" + :score-input-invalid="scoreInputInvalid" :on-score-focus="onScoreFocus" :on-score-input="onScoreInput" :on-score-commit="onScoreCommit" @@ -222,6 +225,7 @@ const mode = ref('live') const viewTab = ref('groups') const adminTab = ref('players') const language = ref(localStorage.getItem('shooting_lang') === 'en' ? 'en' : 'ar') +const isFullscreen = ref(false) const state = ref(createInitialState()) const primaryGroups = ref(loadPrimaryGroups(localStorage)) @@ -640,6 +644,11 @@ watch( ) onMounted(async () => { + onFullscreenChange() + document.addEventListener('fullscreenchange', onFullscreenChange) + document.addEventListener('webkitfullscreenchange', onFullscreenChange) + document.addEventListener('mozfullscreenchange', onFullscreenChange) + document.addEventListener('MSFullscreenChange', onFullscreenChange) document.documentElement.lang = language.value document.documentElement.dir = language.value === 'ar' ? 'rtl' : 'ltr' await fetchState() @@ -647,6 +656,10 @@ onMounted(async () => { }) onBeforeUnmount(() => { + document.removeEventListener('fullscreenchange', onFullscreenChange) + document.removeEventListener('webkitfullscreenchange', onFullscreenChange) + document.removeEventListener('mozfullscreenchange', onFullscreenChange) + document.removeEventListener('MSFullscreenChange', onFullscreenChange) stopLiveRotation() stopLiveMonitorRotation() stopRealtimeSync() @@ -662,6 +675,57 @@ function setLanguage(next) { if (next === 'ar' || next === 'en') language.value = next } +function getFullscreenElement() { + return ( + document.fullscreenElement || + document.webkitFullscreenElement || + document.mozFullScreenElement || + document.msFullscreenElement || + null + ) +} + +function onFullscreenChange() { + isFullscreen.value = Boolean(getFullscreenElement()) +} + +function requestFullscreenFor(element) { + if (!element) return Promise.resolve() + const fn = + element.requestFullscreen || + element.webkitRequestFullscreen || + element.mozRequestFullScreen || + element.msRequestFullscreen + if (!fn) return Promise.resolve() + const result = fn.call(element) + if (result && typeof result.then === 'function') return result + return Promise.resolve() +} + +function exitFullscreen() { + const fn = + document.exitFullscreen || + document.webkitExitFullscreen || + document.mozCancelFullScreen || + document.msExitFullscreen + if (!fn) return Promise.resolve() + const result = fn.call(document) + if (result && typeof result.then === 'function') return result + return Promise.resolve() +} + +async function toggleFullscreen() { + try { + if (getFullscreenElement()) { + await exitFullscreen() + return + } + await requestFullscreenFor(document.documentElement) + } catch { + // Ignore fullscreen errors, mostly caused by browser policy. + } +} + function normalizeLiveActiveView(value) { const normalized = String(value || '').trim().toLowerCase() const allowed = new Set(['group_live', 'prelim_tie', 'prelim_overall', 'final_groups', 'final_tie', 'podium']) @@ -1209,7 +1273,7 @@ async function applySuggestedScore() { if (!scoreAdviceModal.advice) return const stage = scoreAdviceModal.stage const playerId = scoreAdviceModal.playerId - const score = Number(scoreAdviceModal.advice.advisedScore || 0) + const score = clampScoreValue(scoreAdviceModal.advice.advisedScore) await updateScoreValue(stage, playerId, score) scoreAdviceModal.currentScore = score closeScoreAdviceModal() @@ -1287,26 +1351,48 @@ function scoreDraftKey(stage, playerId) { return `${stage}:${playerId}` } +function clampScoreValue(value) { + let score = Number(value) + if (!Number.isFinite(score)) score = 0 + score = Math.trunc(score) + if (score < 0) return 0 + if (score > 100) return 100 + return score +} + function scoreInputValue(stage, playerId) { const draft = scoreDrafts[scoreDraftKey(stage, playerId)] if (draft) return draft.value return String(scoreFor(stage, playerId)) } +function scoreInputInvalid(stage, playerId) { + const draft = scoreDrafts[scoreDraftKey(stage, playerId)] + return Boolean(draft?.invalid) +} + +function parseDraftScoreValue(value) { + let score = Number(value === '' ? 0 : value) + if (!Number.isFinite(score)) score = 0 + return Math.trunc(score) +} + function onScoreFocus(stage, playerId) { const key = scoreDraftKey(stage, playerId) if (!scoreDrafts[key]) { - scoreDrafts[key] = { value: String(scoreFor(stage, playerId)), committing: false } + scoreDrafts[key] = { value: String(scoreFor(stage, playerId)), committing: false, invalid: false } } } function onScoreInput(stage, playerId, event) { const key = scoreDraftKey(stage, playerId) const raw = String(event?.target?.value ?? '') - const cleaned = raw.replace(/[^\d]/g, '').slice(0, 4) - const current = scoreDrafts[key] || { value: String(scoreFor(stage, playerId)), committing: false } - scoreDrafts[key] = { ...current, value: cleaned } - if (event?.target && event.target.value !== cleaned) event.target.value = cleaned + const digits = raw.replace(/[^\d]/g, '').slice(0, 3) + const parsed = parseDraftScoreValue(digits) + const invalid = digits !== '' && (parsed < 0 || parsed > 100) + const current = scoreDrafts[key] || { value: String(scoreFor(stage, playerId)), committing: false, invalid: false } + scoreDrafts[key] = { ...current, value: digits, invalid } + if (event?.target && event.target.value !== digits) event.target.value = digits } async function onScoreCommit(stage, playerId) { @@ -1314,11 +1400,11 @@ async function onScoreCommit(stage, playerId) { const draft = scoreDrafts[key] if (!draft || draft.committing) return - let score = Number(draft.value === '' ? 0 : draft.value) - if (!Number.isFinite(score)) score = 0 - score = Math.trunc(score) + const score = parseDraftScoreValue(draft.value) + const invalid = score < 0 || score > 100 - if (score < 0 || score > 9999) { + if (invalid) { + scoreDrafts[key] = { ...draft, invalid: true } showToast(t('messages.invalidScore'), 'error') return } @@ -1328,12 +1414,12 @@ async function onScoreCommit(stage, playerId) { return } - scoreDrafts[key] = { ...draft, committing: true } + scoreDrafts[key] = { ...draft, invalid: false, committing: true } await updateScoreValue(stage, playerId, score, key) } async function updateScoreValue(stage, playerId, score, draftKey = '') { - if (score < 0 || score > 9999) { + if (score < 0 || score > 100) { showToast(t('messages.invalidScore'), 'error') return } diff --git a/frontend/src/components/AdminPanel.vue b/frontend/src/components/AdminPanel.vue index dbe1bb5..52ecb4b 100644 --- a/frontend/src/components/AdminPanel.vue +++ b/frontend/src/components/AdminPanel.vue @@ -98,6 +98,7 @@ :display-name="displayName" :secondary-name="secondaryName" :score-input-value="scoreInputValue" + :score-input-invalid="scoreInputInvalid" :on-score-focus="onScoreFocus" :on-score-input="onScoreInput" :on-score-commit="onScoreCommit" @@ -139,6 +140,7 @@ :display-name="displayName" :secondary-name="secondaryName" :score-input-value="scoreInputValue" + :score-input-invalid="scoreInputInvalid" :on-score-focus="onScoreFocus" :on-score-input="onScoreInput" :on-score-commit="onScoreCommit" @@ -188,6 +190,7 @@ :display-name="displayName" :secondary-name="secondaryName" :score-input-value="scoreInputValue" + :score-input-invalid="scoreInputInvalid" :on-score-focus="onScoreFocus" :on-score-input="onScoreInput" :on-score-commit="onScoreCommit" @@ -224,6 +227,7 @@ :display-name="displayName" :secondary-name="secondaryName" :score-input-value="scoreInputValue" + :score-input-invalid="scoreInputInvalid" :on-score-focus="onScoreFocus" :on-score-input="onScoreInput" :on-score-commit="onScoreCommit" @@ -313,6 +317,7 @@ defineProps({ displayName: { type: Function, required: true }, secondaryName: { type: Function, required: true }, scoreInputValue: { type: Function, required: true }, + scoreInputInvalid: { type: Function, required: true }, onScoreFocus: { type: Function, required: true }, onScoreInput: { type: Function, required: true }, onScoreCommit: { type: Function, required: true }, diff --git a/frontend/src/components/AppHeader.vue b/frontend/src/components/AppHeader.vue index 270a56b..5c555a3 100644 --- a/frontend/src/components/AppHeader.vue +++ b/frontend/src/components/AppHeader.vue @@ -16,6 +16,35 @@ {{ optionsLabel }} {{ modeShort }} · {{ languageShort }} + @@ -57,9 +86,10 @@ const props = defineProps({ mode: { type: String, required: true }, language: { type: String, required: true }, serverTime: { type: String, default: '' }, + isFullscreen: { type: Boolean, default: false }, }) -const emit = defineEmits(['change-mode', 'change-language']) +const emit = defineEmits(['change-mode', 'change-language', 'toggle-fullscreen']) const controlsOpen = ref(false) const controlsRoot = ref(null) @@ -71,6 +101,7 @@ const modeShort = computed(() => { return props.language === 'ar' ? 'إدارة' : 'Admin' }) const languageShort = computed(() => (props.language === 'ar' ? 'AR' : 'EN')) +const fullscreenActionLabel = computed(() => (props.isFullscreen ? props.t('actions.exitFullscreen') : props.t('actions.enterFullscreen'))) const modeStatusLabel = computed(() => { if (props.mode === 'view') return '● ' + props.t('labels.liveTracker') if (props.mode === 'live') return '● ' + props.t('liveMode') @@ -91,6 +122,10 @@ function changeLanguage(nextLanguage) { controlsOpen.value = false } +function toggleFullscreen() { + emit('toggle-fullscreen') +} + function onGlobalPointerDown(event) { if (!controlsOpen.value) return const root = controlsRoot.value diff --git a/frontend/src/components/LiveModePanel.vue b/frontend/src/components/LiveModePanel.vue index 4fa5d88..2fbe4ae 100644 --- a/frontend/src/components/LiveModePanel.vue +++ b/frontend/src/components/LiveModePanel.vue @@ -1,14 +1,15 @@