diff --git a/.gitignore b/.gitignore index f37f3ea..435cd2f 100644 --- a/.gitignore +++ b/.gitignore @@ -2,6 +2,7 @@ node_modules /dist /coverage +.prettierignore # local env files .env.local diff --git a/.nginx/compose/nginx-dev.conf b/.nginx/compose/nginx-dev.conf index 4f79692..ca51e31 100644 --- a/.nginx/compose/nginx-dev.conf +++ b/.nginx/compose/nginx-dev.conf @@ -16,38 +16,42 @@ server { proxy_pass http://keycloak/keycloak/; } - location /minigames/bugfinder/api/ { - proxy_pass http://bugfinder-backend/api/; - } + #location /minigames/bugfinder/api/ { + # proxy_pass http://bugfinder-backend/api/; + #} - location /minigames/chickenshock/api/ { - proxy_pass http://chickenshock-backend/api/; - } - - location /minigames/finitequiz/api/ { - proxy_pass http://finitequiz-backend/api/; - } + #location /minigames/chickenshock/api/ { + # proxy_pass http://chickenshock-backend/api/; + #} - location /minigames/crosswordpuzzle/api/ { - proxy_pass http://crosswordpuzzle-backend/api/; - } + #location /minigames/finitequiz/api/ { + # proxy_pass http://finitequiz-backend/api/; + #} - location /minigames/memory/api/ { - proxy_pass http://memory-backend/api/; - } + #location /minigames/crosswordpuzzle/api/ { + # proxy_pass http://crosswordpuzzle-backend/api/; + #} - location /minigames/regexgame/api/ { - proxy_pass http://regexgame-backend/api/; - } + #location /minigames/memory/api/ { + # proxy_pass http://memory-backend/api/; + #} - location /minigames/towercrush/api/ { - proxy_pass http://towercrush-backend/api/; - } + #location /minigames/regexgame/api/ { + # proxy_pass http://regexgame-backend/api/; + #} - location /minigames/towerdefense/api/ { - proxy_pass http://towerdefense-backend/api/; + #location /minigames/towercrush/api/ { + # proxy_pass http://towercrush-backend/api/; + #} + + location /minigames/umlgame/api/ { + proxy_pass http://umlgame-backend/api; } + #location /minigames/towerdefense/api/ { + # proxy_pass http://towerdefense-backend/api/; + #} + location /overworld/api/ { proxy_pass http://overworld-backend/api/; } @@ -56,37 +60,41 @@ server { proxy_pass http://overworld/; } - location /minigames/chickenshock/ { - proxy_pass http://chickenshock/; - } - - location /minigames/bugfinder/ { - proxy_pass http://bugfinder/; - } - - location /minigames/finitequiz/ { - proxy_pass http://finitequiz/; - } - - location /minigames/crosswordpuzzle/ { - proxy_pass http://crosswordpuzzle/; - } - - location /minigames/memory/ { - proxy_pass http://memory/; - } - - location /minigames/regexgame/ { - proxy_pass http://regexgame/; - } + #location /minigames/chickenshock/ { + # proxy_pass http://chickenshock/; + #} + # + #location /minigames/bugfinder/ { + # proxy_pass http://bugfinder/; + #} + # + #location /minigames/finitequiz/ { + # proxy_pass http://finitequiz/; + #} + # + #location /minigames/crosswordpuzzle/ { + # proxy_pass http://crosswordpuzzle/; + #} + # + #location /minigames/memory/ { + # proxy_pass http://memory/; + #} + # + #location /minigames/regexgame/ { + # proxy_pass http://regexgame/; + #} + # + #location /minigames/towercrush/ { + # proxy_pass http://towercrush/; + #} - location /minigames/towercrush/ { - proxy_pass http://towercrush/; + location /minigames/umlgame/ { + proxy_pass http://umlgame/; } - location /minigames/towerdefense/ { - proxy_pass http://towerdefense/; - } + #location /minigames/towerdefense/ { + # proxy_pass http://towerdefense/; + #} location /lecturer-interface/ { proxy_pass http://host.docker.internal:8000/lecturer-interface/; diff --git a/.nginx/compose/nginx.conf b/.nginx/compose/nginx.conf index 69cd48f..2dfbdc4 100644 --- a/.nginx/compose/nginx.conf +++ b/.nginx/compose/nginx.conf @@ -48,6 +48,10 @@ server { proxy_pass http://towercrush-backend/api/; } + location /minigames/umlgame/api/ { + proxy_pass http://umlgame-backend/api; + } + location /minigames/towerdefense/api/ { proxy_pass http://towerdefense-backend/api/; } @@ -84,6 +88,10 @@ server { proxy_pass http://towercrush/; } + location /minigames/umlgame/ { + proxy_pass http://umlgame/; + } + location /minigames/towerdefense/ { proxy_pass http://towerdefense/; } diff --git a/docker-compose-dev.yaml b/docker-compose-dev.yaml index 758309c..361fe03 100644 --- a/docker-compose-dev.yaml +++ b/docker-compose-dev.yaml @@ -89,8 +89,8 @@ services: container_name: regexgame-db image: postgres:14-alpine restart: always - ports: - - "5432:5432" + expose: + - "5432" environment: - POSTGRES_USER=postgres - POSTGRES_PASSWORD=postgres @@ -115,6 +115,16 @@ services: - POSTGRES_USER=postgres - POSTGRES_PASSWORD=postgres + umlgame-db: + container_name: umlgame-db + image: postgres:14-alpine + restart: always + expose: + - "5432" + environment: + - POSTGRES_USER=postgres + - POSTGRES_PASSWORD=postgres + #backends keycloak: container_name: keycloak @@ -139,7 +149,7 @@ services: overworld-backend: container_name: overworld-backend - image: ghcr.io/gamify-it/overworld-backend:main + image: ghcr.io/gamify-it/overworld-backend:umlgame-integration restart: always pull_policy: always expose: @@ -160,138 +170,154 @@ services: - KEYCLOAK_ISSUER=http://localhost/keycloak/realms/Gamify-IT - KEYCLOAK_URL=http://keycloak/keycloak/realms/Gamify-IT - chickenshock-backend: - container_name: chickenshock-backend - image: ghcr.io/gamify-it/chickenshock-backend:main - restart: always - pull_policy: always - expose: - - "80" - depends_on: - - chickenshock-db - environment: - - POSTGRES_USER=postgres - - POSTGRES_PASSWORD=postgres - - POSTGRES_URL=postgresql://chickenshock-db:5432/postgres - - OVERWORLD_URL=http://overworld-backend/api/v1 - - KEYCLOAK_ISSUER=http://localhost/keycloak/realms/Gamify-IT - - KEYCLOAK_URL=http://keycloak/keycloak/realms/Gamify-IT - - bugfinder-backend: - container_name: bugfinder-backend - image: ghcr.io/gamify-it/bugfinder-backend:main - restart: always - pull_policy: always - expose: - - "80" - depends_on: - - bugfinder-db - environment: - - POSTGRES_USER=postgres - - POSTGRES_PASSWORD=postgres - - POSTGRES_URL=postgresql://bugfinder-db:5432/postgres - - OVERWORLD_URL=http://overworld-backend/api/v1 - - KEYCLOAK_ISSUER=http://localhost/keycloak/realms/Gamify-IT - - KEYCLOAK_URL=http://keycloak/keycloak/realms/Gamify-IT - - finitequiz-backend: - container_name: finitequiz-backend - image: ghcr.io/gamify-it/finitequiz-backend:main - restart: always - pull_policy: always - expose: - - "80" - depends_on: - - chickenshock-db - environment: - - POSTGRES_USER=postgres - - POSTGRES_PASSWORD=postgres - - POSTGRES_URL=postgresql://finitequiz-db:5432/postgres - - OVERWORLD_URL=http://overworld-backend/api/v1 - - KEYCLOAK_ISSUER=http://localhost/keycloak/realms/Gamify-IT - - KEYCLOAK_URL=http://keycloak/keycloak/realms/Gamify-IT - - crosswordpuzzle-backend: - container_name: crosswordpuzzle-backend - image: ghcr.io/gamify-it/crosswordpuzzle-backend:main - restart: always - pull_policy: always - expose: - - "80" - depends_on: - - crosswordpuzzle-db - environment: - - POSTGRES_USER=postgres - - POSTGRES_PASSWORD=postgres - - POSTGRES_URL=postgresql://crosswordpuzzle-db:5432/postgres - - OVERWORLD_URL=http://overworld-backend/api/v1 - - KEYCLOAK_ISSUER=http://localhost/keycloak/realms/Gamify-IT - - KEYCLOAK_URL=http://keycloak/keycloak/realms/Gamify-IT - - memory-backend: - container_name: memory-backend - image: ghcr.io/gamify-it/memory-backend:main - restart: always - pull_policy: always - expose: - - "80" - depends_on: - - memory-db - environment: - - POSTGRES_USER=postgres - - POSTGRES_PASSWORD=postgres - - POSTGRES_URL=postgresql://memory-db:5432/postgres - - OVERWORLD_URL=http://overworld-backend/api/v1 - - KEYCLOAK_ISSUER=http://localhost/keycloak/realms/Gamify-IT - - KEYCLOAK_URL=http://keycloak/keycloak/realms/Gamify-IT - - regexgame-backend: - container_name: regexgame-backend - image: ghcr.io/gamify-it/regexgame-backend:main - restart: always - pull_policy: always - expose: - - "80" - depends_on: - - regexgame-db - environment: - - POSTGRES_USER=postgres - - POSTGRES_PASSWORD=postgres - - POSTGRES_URL=postgresql://regexgame-db:5432/postgres - - OVERWORLD_URL=http://overworld-backend/api/v1 - - KEYCLOAK_ISSUER=http://localhost/keycloak/realms/Gamify-IT - - KEYCLOAK_URL=http://keycloak/keycloak/realms/Gamify-IT + #chickenshock-backend: + # container_name: chickenshock-backend + # image: ghcr.io/gamify-it/chickenshock-backend:main + # restart: always + # pull_policy: always + # expose: + # - "80" + # depends_on: + # - chickenshock-db + # environment: + # - POSTGRES_USER=postgres + # - POSTGRES_PASSWORD=postgres + # - POSTGRES_URL=postgresql://chickenshock-db:5432/postgres + # - OVERWORLD_URL=http://overworld-backend/api/v1 + # - KEYCLOAK_ISSUER=http://localhost/keycloak/realms/Gamify-IT + # - KEYCLOAK_URL=http://keycloak/keycloak/realms/Gamify-IT + # + #bugfinder-backend: + # container_name: bugfinder-backend + # image: ghcr.io/gamify-it/bugfinder-backend:main + # restart: always + # pull_policy: always + # expose: + # - "80" + # depends_on: + # - bugfinder-db + # environment: + # - POSTGRES_USER=postgres + # - POSTGRES_PASSWORD=postgres + # - POSTGRES_URL=postgresql://bugfinder-db:5432/postgres + # - OVERWORLD_URL=http://overworld-backend/api/v1 + # - KEYCLOAK_ISSUER=http://localhost/keycloak/realms/Gamify-IT + # - KEYCLOAK_URL=http://keycloak/keycloak/realms/Gamify-IT + # + #finitequiz-backend: + # container_name: finitequiz-backend + # image: ghcr.io/gamify-it/finitequiz-backend:main + # restart: always + # pull_policy: always + # expose: + # - "80" + # depends_on: + # - chickenshock-db + # environment: + # - POSTGRES_USER=postgres + # - POSTGRES_PASSWORD=postgres + # - POSTGRES_URL=postgresql://finitequiz-db:5432/postgres + # - OVERWORLD_URL=http://overworld-backend/api/v1 + # - KEYCLOAK_ISSUER=http://localhost/keycloak/realms/Gamify-IT + # - KEYCLOAK_URL=http://keycloak/keycloak/realms/Gamify-IT + # + #crosswordpuzzle-backend: + # container_name: crosswordpuzzle-backend + # image: ghcr.io/gamify-it/crosswordpuzzle-backend:main + # restart: always + # pull_policy: always + # expose: + # - "80" + # depends_on: + # - crosswordpuzzle-db + # environment: + # - POSTGRES_USER=postgres + # - POSTGRES_PASSWORD=postgres + # - POSTGRES_URL=postgresql://crosswordpuzzle-db:5432/postgres + # - OVERWORLD_URL=http://overworld-backend/api/v1 + # - KEYCLOAK_ISSUER=http://localhost/keycloak/realms/Gamify-IT + # - KEYCLOAK_URL=http://keycloak/keycloak/realms/Gamify-IT + # + #memory-backend: + # container_name: memory-backend + # image: ghcr.io/gamify-it/memory-backend:main + # restart: always + # pull_policy: always + # expose: + # - "80" + # depends_on: + # - memory-db + # environment: + # - POSTGRES_USER=postgres + # - POSTGRES_PASSWORD=postgres + # - POSTGRES_URL=postgresql://memory-db:5432/postgres + # - OVERWORLD_URL=http://overworld-backend/api/v1 + # - KEYCLOAK_ISSUER=http://localhost/keycloak/realms/Gamify-IT + # - KEYCLOAK_URL=http://keycloak/keycloak/realms/Gamify-IT + # + #regexgame-backend: + # container_name: regexgame-backend + # image: ghcr.io/gamify-it/regexgame-backend:main + # restart: always + # pull_policy: always + # expose: + # - "80" + # depends_on: + # - regexgame-db + # environment: + # - POSTGRES_USER=postgres + # - POSTGRES_PASSWORD=postgres + # - POSTGRES_URL=postgresql://regexgame-db:5432/postgres + # - OVERWORLD_URL=http://overworld-backend/api/v1 + # - KEYCLOAK_ISSUER=http://localhost/keycloak/realms/Gamify-IT + # - KEYCLOAK_URL=http://keycloak/keycloak/realms/Gamify-IT + # + #towercrush-backend: + # container_name: towercrush-backend + # image: ghcr.io/gamify-it/towercrush-backend:main + # restart: always + # pull_policy: always + # expose: + # - "80" + # depends_on: + # - towercrush-db + # environment: + # - POSTGRES_USER=postgres + # - POSTGRES_PASSWORD=postgres + # - POSTGRES_URL=postgresql://towercrush-db:5432/postgres + # - OVERWORLD_URL=http://overworld-backend/api/v1 + # - KEYCLOAK_ISSUER=http://localhost/keycloak/realms/Gamify-IT + # - KEYCLOAK_URL=http://keycloak/keycloak/realms/Gamify-IT + # + #towerdefense-backend: + # container_name: towerdefense-backend + # image: ghcr.io/gamify-it/towerdefense-backend:main + # restart: always + # pull_policy: always + # expose: + # - "80" + # depends_on: + # - towerdefense-db + # environment: + # - POSTGRES_USER=postgres + # - POSTGRES_PASSWORD=postgres + # - POSTGRES_URL=postgresql://towerdefense-db:5432/postgres + # - OVERWORLD_URL=http://overworld-backend/api/v1 + # - KEYCLOAK_ISSUER=http://localhost/keycloak/realms/Gamify-IT + # - KEYCLOAK_URL=http://keycloak/keycloak/realms/Gamify-IT - towercrush-backend: - container_name: towercrush-backend - image: ghcr.io/gamify-it/towercrush-backend:main + umlgame-backend: + container_name: umlgame-backend + image: ghcr.io/gamify-it/umlgame-backend:development restart: always - pull_policy: always expose: - "80" depends_on: - - towercrush-db + - umlgame-db environment: - POSTGRES_USER=postgres - POSTGRES_PASSWORD=postgres - - POSTGRES_URL=postgresql://towercrush-db:5432/postgres - - OVERWORLD_URL=http://overworld-backend/api/v1 - - KEYCLOAK_ISSUER=http://localhost/keycloak/realms/Gamify-IT - - KEYCLOAK_URL=http://keycloak/keycloak/realms/Gamify-IT - - towerdefense-backend: - container_name: towerdefense-backend - image: ghcr.io/gamify-it/towerdefense-backend:main - restart: always - pull_policy: always - expose: - - "80" - depends_on: - - towerdefense-db - environment: - - POSTGRES_USER=postgres - - POSTGRES_PASSWORD=postgres - - POSTGRES_URL=postgresql://towerdefense-db:5432/postgres + - POSTGRES_URL=postgresql://umlgame-db:5432/postgres - OVERWORLD_URL=http://overworld-backend/api/v1 - KEYCLOAK_ISSUER=http://localhost/keycloak/realms/Gamify-IT - KEYCLOAK_URL=http://keycloak/keycloak/realms/Gamify-IT @@ -313,75 +339,75 @@ services: expose: - "80" - chickenshock: - container_name: chickenshock - image: ghcr.io/gamify-it/chickenshock:main - pull_policy: always + #chickenshock: + # container_name: chickenshock + # image: ghcr.io/gamify-it/chickenshock:main + # pull_policy: always + # restart: always + # expose: + # - "80" + # + #finitequiz: + # container_name: finitequiz + # image: ghcr.io/gamify-it/finitequiz:main + # pull_policy: always + # restart: always + # expose: + # - "80" + # + #crosswordpuzzle: + # container_name: crosswordpuzzle + # image: ghcr.io/gamify-it/crosswordpuzzle:main + # pull_policy: always + # restart: always + # expose: + # - "80" + # + #bugfinder: + # container_name: bugfinder + # image: ghcr.io/gamify-it/bugfinder:main + # pull_policy: always + # restart: always + # expose: + # - "80" + # + #memory: + # container_name: memory + # image: ghcr.io/gamify-it/memory:main + # pull_policy: always + # restart: always + # expose: + # - "80" + # + #regexgame: + # container_name: regexgame + # image: ghcr.io/gamify-it/regexgame:main + # pull_policy: always + # restart: always + # expose: + # - "80" + # + #towercrush: + # container_name: towercrush + # image: ghcr.io/gamify-it/towercrush:main + # pull_policy: always + # restart: always + # expose: + # - "80" + # + #towerdefense: + # container_name: towerdefense + # image: ghcr.io/gamify-it/towerdefense:main + # pull_policy: always + # restart: always + # expose: + # - "80" + + umlgame: + container_name: umlgame + image: ghcr.io/gamify-it/umlgame:main restart: always - expose: - - "80" - - finitequiz: - container_name: finitequiz - image: ghcr.io/gamify-it/finitequiz:main pull_policy: always - restart: always - expose: - - "80" - - crosswordpuzzle: - container_name: crosswordpuzzle - image: ghcr.io/gamify-it/crosswordpuzzle:main - pull_policy: always - restart: always - expose: - - "80" - - bugfinder: - container_name: bugfinder - image: ghcr.io/gamify-it/bugfinder:main - pull_policy: always - restart: always - expose: - - "80" - - memory: - container_name: memory - image: ghcr.io/gamify-it/memory:main - pull_policy: always - restart: always - expose: - - "80" - - regexgame: - container_name: regexgame - image: ghcr.io/gamify-it/regexgame:main - pull_policy: always - restart: always - expose: - - "80" - - towercrush: - container_name: towercrush - image: ghcr.io/gamify-it/towercrush:main - pull_policy: always - restart: always - expose: - - "80" - - towerdefense: - container_name: towerdefense - image: ghcr.io/gamify-it/towerdefense:main - pull_policy: always - restart: always - expose: - - "80" - - towerdefense: - container_name: towerdefense - image: ghcr.io/gamify-it/towerdefense:main - pull_policy: always - restart: always expose: - "80" diff --git a/docker-compose.yaml b/docker-compose.yaml index 024e52b..62c89a9 100644 --- a/docker-compose.yaml +++ b/docker-compose.yaml @@ -96,6 +96,16 @@ services: - POSTGRES_USER=postgres - POSTGRES_PASSWORD=postgres + umlgame-db: + container_name: umlgame-db + image: postgres:14-alpine + restart: always + ports: + - "5432:5432" + environment: + - POSTGRES_USER=postgres + - POSTGRES_PASSWORD=postgres + #backends keycloak: container_name: keycloak @@ -241,6 +251,22 @@ services: - KEYCLOAK_ISSUER=http://localhost/keycloak/realms/Gamify-IT - KEYCLOAK_URL=http://keycloak/keycloak/realms/Gamify-IT + umlgame-backend: + container_name: umlgame-backend + image: ghcr.io/gamify-it/umlgame-backend:main + restart: always + expose: + - "80" + depends_on: + - umlgame-db + environment: + - POSTGRES_USER=postgres + - POSTGRES_PASSWORD=postgres + - POSTGRES_URL=postgresql://umlgame-db:5432/postgres + - OVERWORLD_URL=http://overworld-backend/api/v1 + - KEYCLOAK_ISSUER=http://localhost/keycloak/realms/Gamify-IT + - KEYCLOAK_URL=http://keycloak/keycloak/realms/Gamify-IT + #frontends landing-page: container_name: landing-page @@ -312,6 +338,14 @@ services: expose: - "80" + umlgame: + container_name: umlgame + image: ghcr.io/gamify-it/umlgame:main + restart: always + pull_policy: always + expose: + - "80" + # reverse-proxy reverse-proxy: container_name: reverse-proxy diff --git a/package-lock.json b/package-lock.json index 4fc985e..953eb05 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8,6 +8,7 @@ "name": "lecturer-interface", "version": "0.1.0", "dependencies": { + "@joint/core": "^4.1.3", "@popperjs/core": "^2.11.5", "axios": "^0.27.2", "bootstrap": "^5.2.0", @@ -1104,6 +1105,11 @@ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, + "node_modules/@joint/core": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/@joint/core/-/core-4.1.3.tgz", + "integrity": "sha512-X769blCoVxtx6NNm/cbHDXDOa+Gt7eZwrJMLnqJw8c5NkjmcYWCY1kA3ep8RfRRVG76f3QLNd9a8Q/aItI/WWw==" + }, "node_modules/@jridgewell/gen-mapping": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", @@ -13955,6 +13961,11 @@ "chalk": "^4.0.0" } }, + "@joint/core": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/@joint/core/-/core-4.1.3.tgz", + "integrity": "sha512-X769blCoVxtx6NNm/cbHDXDOa+Gt7eZwrJMLnqJw8c5NkjmcYWCY1kA3ep8RfRRVG76f3QLNd9a8Q/aItI/WWw==" + }, "@jridgewell/gen-mapping": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", diff --git a/package.json b/package.json index 349403d..ade0b1c 100644 --- a/package.json +++ b/package.json @@ -9,6 +9,7 @@ "lint": "vue-cli-service lint" }, "dependencies": { + "@joint/core": "^4.1.3", "@popperjs/core": "^2.11.5", "axios": "^0.27.2", "bootstrap": "^5.2.0", diff --git a/src/components/EditMinigameModals/EditUmlGameConfigurationModal.vue b/src/components/EditMinigameModals/EditUmlGameConfigurationModal.vue new file mode 100644 index 0000000..faf3dd1 --- /dev/null +++ b/src/components/EditMinigameModals/EditUmlGameConfigurationModal.vue @@ -0,0 +1,320 @@ + + + diff --git a/src/components/EditMinigameModals/UmlModals/UmlEditorModal.vue b/src/components/EditMinigameModals/UmlModals/UmlEditorModal.vue new file mode 100644 index 0000000..d85b396 --- /dev/null +++ b/src/components/EditMinigameModals/UmlModals/UmlEditorModal.vue @@ -0,0 +1,941 @@ + + + diff --git a/src/config.ts b/src/config.ts index 5b1dd97..8b27aea 100644 --- a/src/config.ts +++ b/src/config.ts @@ -10,4 +10,5 @@ export default { memoryApiUrl: "/minigames/memory/api/v1", regexgameApiUrl: "/minigames/regexgame/api/v1", towerdefenseApiUrl: "/minigames/towerdefense/api/v1", + umlgameApiUrl: "/minigames/umlgame/api/v1", }; diff --git a/src/ts/models/links.ts b/src/ts/models/links.ts new file mode 100644 index 0000000..bacc634 --- /dev/null +++ b/src/ts/models/links.ts @@ -0,0 +1,138 @@ +import { shapes, util } from "@joint/core"; + +export class CustRect extends shapes.standard.Rectangle { + override defaults() { + return { + ...super.defaults, + type: "Rect", + size: { width: 100, height: 80 }, + attrs: { + body: { + width: "calc(w)", + height: "calc(h)", + fill: "white", + strokeWidth: 2, + stroke: "black", + }, + line1: { + x1: 0, + y1: 25, + x2: "calc(w)", + y2: 25, + stroke: "black", + strokeWidth: 1, + }, + line2: { + x1: 0, + y1: 50, + x2: "calc(w)", + y2: 50, + stroke: "black", + strokeWidth: 1, + }, + typeLabel: { + text: "", + textVerticalAnchor: "middle", + textAnchor: "middle", + fontSize: 8, + fontStyle: "italic", + x: "calc(w/2)", + y: 4, + }, + label: { + text: "Classname", + textVerticalAnchor: "middle", + textAnchor: "middle", + fontSize: 12, + x: "calc(w/2)", + y: 17, + }, + secondaryLabel: { + text: "Attributes", + textVerticalAnchor: "middle", + textAnchor: "middle", + fontSize: 12, + x: "calc(w/2)", + y: 37, + }, + thirdLabel: { + text: "Methods", + textVerticalAnchor: "middle", + textAnchor: "middle", + fontSize: 12, + x: "calc(w/2)", + y: 65, + }, + }, + }; + } + + override preinitialize() { + this.markup = util.svg/* xml */ ` + + + + + + + + `; + } +} + +export class InterfaceRect extends CustRect { + override defaults() { + return { + ...super.defaults(), + type: "InterfaceRect", + attrs: { + ...super.defaults().attrs, + body: { ...super.defaults().attrs.body, fill: "#cce5ff" }, + typeLabel: { + ...super.defaults().attrs.typeLabel, + text: "«interface»", + fontSize: 10, + y: 5, + }, + }, + }; + } +} + +export class AbstractRect extends CustRect { + override defaults() { + return { + ...super.defaults(), + type: "AbstractRect", + attrs: { + ...super.defaults().attrs, + body: { ...super.defaults().attrs.body, fill: "#ffe6cc" }, + typeLabel: { + ...super.defaults().attrs.typeLabel, + text: "«abstract»", + fontSize: 10, + y: 5, + }, + }, + }; + } +} + +export class EnumRect extends CustRect { + override defaults() { + return { + ...super.defaults(), + type: "EnumRect", + attrs: { + ...super.defaults().attrs, + body: { ...super.defaults().attrs.body, fill: "#d3f3d3" }, + typeLabel: { + ...super.defaults().attrs.typeLabel, + text: "«enum»", + fontSize: 10, + y: 5, + }, + }, + }; + } +} diff --git a/src/ts/models/overworld-models.ts b/src/ts/models/overworld-models.ts index e2785b6..9af7dd9 100644 --- a/src/ts/models/overworld-models.ts +++ b/src/ts/models/overworld-models.ts @@ -109,6 +109,7 @@ export enum Minigame { REGEXGAME = "REGEXGAME", TOWERCRUSH = "TOWERCRUSH", TOWERDEFENSE = "TOWERDEFENSE", + UMLGAME = "UMLGAME", } export class Course implements ICourse { diff --git a/src/ts/models/umlgame-models.ts b/src/ts/models/umlgame-models.ts new file mode 100644 index 0000000..7991b8a --- /dev/null +++ b/src/ts/models/umlgame-models.ts @@ -0,0 +1,49 @@ +export interface IUmlgameConfiguration { + id?: string; + taskList: UmlTask[]; +} + +export class UmlgameConfiguration implements IUmlgameConfiguration { + id?: string; + taskList: UmlTask[]; + public constructor(taskList: UmlTask[]) { + this.taskList = taskList; + } +} + +export class UmlTask { + id?: string; + taskNumber: string; + graph: string; + text: string; + taskType: TaskType; + + public constructor( + taskNumber: string, + graph: string, + text: string, + taskType: TaskType + ) { + this.taskNumber = taskNumber; + this.graph = graph; + this.text = text; + this.taskType = taskType; + } +} + +export enum TaskType { + COMPLETION, + ERRORHUNT, + CODETOUML, + UMLTOCODE, +} + +export class GraphData { + graphAsJson: string; + graphDescription: string; + + public constructor(json: string, text: string) { + this.graphAsJson = json; + this.graphDescription = text; + } +} diff --git a/src/ts/rest-clients/umlgame-rest-client.ts b/src/ts/rest-clients/umlgame-rest-client.ts new file mode 100644 index 0000000..3174cec --- /dev/null +++ b/src/ts/rest-clients/umlgame-rest-client.ts @@ -0,0 +1,23 @@ +import axios, { AxiosResponse } from "axios"; +import config from "@/config"; +import { IUmlgameConfiguration } from "@/ts/models/umlgame-models"; + +export async function putUmlgameConfig( + id: string, + umlGameConfig: IUmlgameConfiguration +): Promise { + return axios.put( + `${config.umlgameApiUrl}/configurations/${id}`, + umlGameConfig + ); +} + +export async function getUmlgameConfig(id: string): Promise { + return axios.get(`${config.umlgameApiUrl}/configurations/${id}`); +} + +export async function postUmlgameConfig( + umlGameConfig: IUmlgameConfiguration +): Promise { + return axios.post(`${config.umlgameApiUrl}/configurations`, umlGameConfig); +} diff --git a/src/views/MinigameTasksView.vue b/src/views/MinigameTasksView.vue index 1755989..47abac3 100644 --- a/src/views/MinigameTasksView.vue +++ b/src/views/MinigameTasksView.vue @@ -20,6 +20,7 @@ import MapImageModal from "@/components/MapImageModal.vue"; import EditBugfinderConifgurationModal from "@/components/EditMinigameModals/EditBugfinderConfigurationModal.vue"; import router from "@/router"; import { getCourse } from "@/ts/rest-clients/course-rest-client"; +import EditUmlGameConfigurationModal from "@/components/EditMinigameModals/EditUmlGameConfigurationModal.vue"; const availableMinigames = Object.values(Minigame); @@ -47,6 +48,7 @@ const showBugfinderModal = ref(false); const showMemoryModal = ref(false); const showRegexGameModal = ref(false); const showTowerDefenseModal = ref(false); +const showUMLGameModal = ref(false); const courseName = ref(""); watch( @@ -330,7 +332,7 @@ function changedMinigame(task: ITask) { ).then((response) => { task = response.data; toast.success( - `Minigame in ${courseName.value} was updated to ${task.game}! )` + `Minigame in ${courseName.value} was updated to ${task.game}!` ); console.log( "Changed minigame to " + task.game + " in course " + courseName.value @@ -369,6 +371,9 @@ function editMinigameConfiguration(task: ITask) { case Minigame.TOWERDEFENSE: showTowerDefenseModal.value = true; break; + case Minigame.UMLGAME: + showUMLGameModal.value = true; + break; default: console.log( "This minigame is currently not supported to be edited here." @@ -411,6 +416,7 @@ function closedEditModal() { showMemoryModal.value = false; showRegexGameModal.value = false; showTowerDefenseModal.value = false; + showUMLGameModal.value = false; } function redirectToStatisticView(task: ITask) { @@ -568,4 +574,10 @@ function redirectToStatisticView(task: ITask) { @updateMinigameConfiguration="updateMinigameConfiguration" @closedModal="closedEditModal" /> +