From 849b628130342c9ac62e8631fb7ac85337069bd3 Mon Sep 17 00:00:00 2001 From: HumanoidSandvichDispenser Date: Fri, 25 Oct 2024 09:51:36 -0700 Subject: [PATCH] Add better player card details and ringers --- availabili.tf/package-lock.json | 125 +++++++++++++++++- availabili.tf/package.json | 2 + availabili.tf/src/assets/base.css | 3 + .../src/assets/fonts/tf2-classicons.eot | Bin 0 -> 13392 bytes .../src/assets/fonts/tf2-classicons.svg | 58 ++++++++ .../src/assets/fonts/tf2-classicons.ttf | Bin 0 -> 13200 bytes .../src/assets/fonts/tf2-classicons.woff | Bin 0 -> 13280 bytes availabili.tf/src/assets/main.css | 20 ++- availabili.tf/src/assets/tf2icons.css | 75 +++++++++++ availabili.tf/src/components/PlayerCard.vue | 102 +++++++++++--- availabili.tf/src/player.ts | 1 + availabili.tf/src/router/index.ts | 2 +- availabili.tf/src/stores/roster.ts | 40 +++++- availabili.tf/src/views/RosterBuilderView.vue | 61 +++++++-- .../src/views/RosterBuilderViewDragDrop.vue | 79 +++++++++++ 15 files changed, 530 insertions(+), 38 deletions(-) create mode 100644 availabili.tf/src/assets/fonts/tf2-classicons.eot create mode 100644 availabili.tf/src/assets/fonts/tf2-classicons.svg create mode 100644 availabili.tf/src/assets/fonts/tf2-classicons.ttf create mode 100644 availabili.tf/src/assets/fonts/tf2-classicons.woff create mode 100644 availabili.tf/src/assets/tf2icons.css create mode 100644 availabili.tf/src/views/RosterBuilderViewDragDrop.vue diff --git a/availabili.tf/package-lock.json b/availabili.tf/package-lock.json index 5cd61f8..f2db542 100644 --- a/availabili.tf/package-lock.json +++ b/availabili.tf/package-lock.json @@ -9,7 +9,9 @@ "version": "0.0.0", "dependencies": { "axios": "^1.7.7", + "bootstrap-icons": "^1.11.3", "pinia": "^2.2.4", + "v-tooltip": "^2.1.3", "vue": "^3.5.12", "vue-router": "^4.4.5" }, @@ -68,6 +70,18 @@ "node": ">=6.0.0" } }, + "node_modules/@babel/runtime": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.25.9.tgz", + "integrity": "sha512-4zpTHZ9Cm6L9L+uIqghQX8ZXg8HKFcjYO3qHoO8zTmRm6HQUJ8SSJ+KRvbMBZn0EGVlT4DRYeQ/6hjlyXBh+Kg==", + "license": "MIT", + "dependencies": { + "regenerator-runtime": "^0.14.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@babel/types": { "version": "7.25.9", "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.25.9.tgz", @@ -2064,6 +2078,22 @@ "dev": true, "license": "ISC" }, + "node_modules/bootstrap-icons": { + "version": "1.11.3", + "resolved": "https://registry.npmjs.org/bootstrap-icons/-/bootstrap-icons-1.11.3.tgz", + "integrity": "sha512-+3lpHrCw/it2/7lBL15VR0HEumaBss0+f/Lb6ZvHISn1mlK83jjFpooTLsMWbIjJMDjDjOExMsTxnXSIT4k4ww==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/twbs" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/bootstrap" + } + ], + "license": "MIT" + }, "node_modules/brace-expansion": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", @@ -4442,7 +4472,6 @@ "version": "4.17.21", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "dev": true, "license": "MIT" }, "node_modules/lodash.merge": { @@ -5171,6 +5200,17 @@ } } }, + "node_modules/popper.js": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/popper.js/-/popper.js-1.16.1.tgz", + "integrity": "sha512-Wb4p1J4zyFTbM+u6WuO4XstYx4Ky9Cewe4DWrel7B0w6VVICvPwdOpotjzcf6eD8TsckVnIMNONQyPIUFOUbCQ==", + "deprecated": "You can find the new Popper v2 at @popperjs/core, this package is dedicated to the legacy v1", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/popperjs" + } + }, "node_modules/postcss": { "version": "8.4.47", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.47.tgz", @@ -5374,6 +5414,12 @@ "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, + "node_modules/regenerator-runtime": { + "version": "0.14.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", + "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==", + "license": "MIT" + }, "node_modules/request-progress": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/request-progress/-/request-progress-3.0.0.tgz", @@ -5676,6 +5722,16 @@ "node": ">=8" } }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "license": "BSD-3-Clause", + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/source-map-js": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", @@ -6195,6 +6251,73 @@ "uuid": "dist/bin/uuid" } }, + "node_modules/v-tooltip": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/v-tooltip/-/v-tooltip-2.1.3.tgz", + "integrity": "sha512-xXngyxLQTOx/yUEy50thb8te7Qo4XU6h4LZB6cvEfVd9mnysUxLEoYwGWDdqR+l69liKsy3IPkdYff3J1gAJ5w==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.13.10", + "lodash": "^4.17.21", + "popper.js": "^1.16.1", + "vue-resize": "^1.0.1" + } + }, + "node_modules/v-tooltip/node_modules/@vue/compiler-sfc": { + "version": "2.7.16", + "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-2.7.16.tgz", + "integrity": "sha512-KWhJ9k5nXuNtygPU7+t1rX6baZeqOYLEforUPjgNDBnLicfHCoi48H87Q8XyLZOrNNsmhuwKqtpDQWjEFe6Ekg==", + "peer": true, + "dependencies": { + "@babel/parser": "^7.23.5", + "postcss": "^8.4.14", + "source-map": "^0.6.1" + }, + "optionalDependencies": { + "prettier": "^1.18.2 || ^2.0.0" + } + }, + "node_modules/v-tooltip/node_modules/prettier": { + "version": "2.8.8", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz", + "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==", + "license": "MIT", + "optional": true, + "peer": true, + "bin": { + "prettier": "bin-prettier.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "node_modules/v-tooltip/node_modules/vue": { + "version": "2.7.16", + "resolved": "https://registry.npmjs.org/vue/-/vue-2.7.16.tgz", + "integrity": "sha512-4gCtFXaAA3zYZdTp5s4Hl2sozuySsgz4jy1EnpBHNfpMa9dK1ZCG7viqBPCwXtmgc8nHqUsAu3G4gtmXkkY3Sw==", + "deprecated": "Vue 2 has reached EOL and is no longer actively maintained. See https://v2.vuejs.org/eol/ for more details.", + "license": "MIT", + "peer": true, + "dependencies": { + "@vue/compiler-sfc": "2.7.16", + "csstype": "^3.1.0" + } + }, + "node_modules/v-tooltip/node_modules/vue-resize": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/vue-resize/-/vue-resize-1.0.1.tgz", + "integrity": "sha512-z5M7lJs0QluJnaoMFTIeGx6dIkYxOwHThlZDeQnWZBizKblb99GSejPnK37ZbNE/rVwDcYcHY+Io+AxdpY952w==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.13.10" + }, + "peerDependencies": { + "vue": "^2.6.0" + } + }, "node_modules/verror": { "version": "1.10.0", "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", diff --git a/availabili.tf/package.json b/availabili.tf/package.json index 72e9569..829c0b7 100644 --- a/availabili.tf/package.json +++ b/availabili.tf/package.json @@ -15,7 +15,9 @@ }, "dependencies": { "axios": "^1.7.7", + "bootstrap-icons": "^1.11.3", "pinia": "^2.2.4", + "v-tooltip": "^2.1.3", "vue": "^3.5.12", "vue-router": "^4.4.5" }, diff --git a/availabili.tf/src/assets/base.css b/availabili.tf/src/assets/base.css index 0864268..60a8f37 100644 --- a/availabili.tf/src/assets/base.css +++ b/availabili.tf/src/assets/base.css @@ -1,3 +1,6 @@ +@import url("tf2icons.css"); +@import url("https://cdn.jsdelivr.net/npm/bootstrap-icons@1.11.3/font/bootstrap-icons.min.css"); + /* color palette from */ :root { --vt-c-white: #ffffff; diff --git a/availabili.tf/src/assets/fonts/tf2-classicons.eot b/availabili.tf/src/assets/fonts/tf2-classicons.eot new file mode 100644 index 0000000000000000000000000000000000000000..31312e34863385b922e51b76341c89b0c25e7067 GIT binary patch literal 13392 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 literal 0 HcmV?d00001 diff --git a/availabili.tf/src/assets/fonts/tf2-classicons.svg b/availabili.tf/src/assets/fonts/tf2-classicons.svg new file mode 100644 index 0000000..952a1b4 --- /dev/null +++ b/availabili.tf/src/assets/fonts/tf2-classicons.svg @@ -0,0 +1,58 @@ + + + + + + +{ + "fontFamily": "tf2-classicons", + "majorVersion": 1, + "minorVersion": 0, + "fontURL": "https://github.com/Qixalite/tf2-classfont", + "description": "A web icon font representing TF2 core gamemodes classes\nFont generated by IcoMoon.", + "copyright": "Qixalite / qix.tf", + "designer": "Sickday", + "license": "MIT", + "licenseURL": "https://github.com/Qixalite/tf2-classfont/blob/master/LICENSE", + "version": "Version 1.0", + "fontId": "tf2-classicons", + "psName": "tf2-classicons", + "subFamily": "Regular", + "fullName": "tf2-classicons" +} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/availabili.tf/src/assets/fonts/tf2-classicons.ttf b/availabili.tf/src/assets/fonts/tf2-classicons.ttf new file mode 100644 index 0000000000000000000000000000000000000000..816bb7633133a4b243e839c6c82e1c370324244e GIT binary patch literal 13200 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 G*Z%}Jv{DEF literal 0 HcmV?d00001 diff --git a/availabili.tf/src/assets/main.css b/availabili.tf/src/assets/main.css index 5924315..b4051ce 100644 --- a/availabili.tf/src/assets/main.css +++ b/availabili.tf/src/assets/main.css @@ -23,12 +23,26 @@ a, } button { - color: var(--text); - border: none; + font-weight: 700; + color: var(--text); + background-color: var(--surface-0); + border: none; + padding: 8px; + border-radius: 4px; } +button.accent { + background-color: var(--accent); + color: var(--base); + text-transform: uppercase; +} h1 { font-weight: 800; - font-size: 300%; + font-size: 200%; + line-height: 2em; +} + +em.aside { + color: var(--overlay-0); } diff --git a/availabili.tf/src/assets/tf2icons.css b/availabili.tf/src/assets/tf2icons.css new file mode 100644 index 0000000..6220b4c --- /dev/null +++ b/availabili.tf/src/assets/tf2icons.css @@ -0,0 +1,75 @@ +@font-face { + font-family: 'tf2-classicons'; + src: url('fonts/tf2-classicons.eot?bv99da'); + src: url('fonts/tf2-classicons.eot?bv99da#iefix') format('embedded-opentype'), + url('fonts/tf2-classicons.ttf?bv99da') format('truetype'), + url('fonts/tf2-classicons.woff?bv99da') format('woff'), + url('fonts/tf2-classicons.svg?bv99da#tf2-classicons') format('svg'); + font-weight: normal; + font-style: normal; +} + +i, .icomoon-liga { + /* use !important to prevent issues with browser extensions that change fonts */ + font-family: 'tf2-classicons' !important; + speak: none; + font-style: normal; + font-weight: normal; + font-variant: normal; + text-transform: none; + line-height: 1; + + /* Enable Ligatures ================ */ + letter-spacing: 0; + -webkit-font-feature-settings: "liga"; + -moz-font-feature-settings: "liga=1"; + -moz-font-feature-settings: "liga"; + -ms-font-feature-settings: "liga" 1; + font-feature-settings: "liga"; + -webkit-font-variant-ligatures: discretionary-ligatures; + font-variant-ligatures: discretionary-ligatures; + + /* Better Font Rendering =========== */ + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +.tf2-Heavy:before { + content: "\1f4aa"; +} +.tf2-Medic:before { + content: "\1f497"; +} +.tf2-Pyro:before { + content: "\1f525"; +} +.tf2-Scout:before { + content: "\1f407"; +} +.tf2-Sniper:before { + content: "\1f3b7"; +} +.tf2-Soldier:before { + content: "\1f4a5"; +} +.tf2-Spy:before { + content: "\1f4e6"; +} +.tf2-Demo:before { + content: "\1f4a3"; +} +.tf2-Engineer:before { + content: "\1f527"; +} +.tf2-FlankSoldier:before { + content: "\1f400"; +} +.tf2-PocketSoldier:before { + content: "\1f418"; +} +.tf2-FlankScout:before { + content: "\1f43f"; +} +.tf2-PocketScout:before { + content: "\1f416"; +} diff --git a/availabili.tf/src/components/PlayerCard.vue b/availabili.tf/src/components/PlayerCard.vue index 978264a..2c2fc95 100644 --- a/availabili.tf/src/components/PlayerCard.vue +++ b/availabili.tf/src/components/PlayerCard.vue @@ -9,21 +9,47 @@ const props = defineProps({ roleTitle: String, player: Object as PropType, isRoster: Boolean, + isRinger: Boolean, }); const isSelected = computed(() => { if (props.isRoster) { return rosterStore.selectedRole == props.roleTitle; } + + if (props.isRinger) { + return rosterStore.selectedPlayers[props.roleTitle]?.playtime == -1; + } + return Object.values(rosterStore.selectedPlayers).includes(props.player); }); function onClick() { if (props.isRoster) { - rosterStore.selectedRole = props.roleTitle; + if (rosterStore.selectedRole == props.roleTitle) { + rosterStore.selectedRole = undefined; + } else { + rosterStore.selectedRole = props.roleTitle; + } } else { // we are selecting the player - rosterStore.selectPlayerForRole(props.player, props.roleTitle); + if (isSelected.value) { + rosterStore.selectPlayerForRole(undefined, props.roleTitle); + } else { + if (props.isRinger) { + const ringerPlayer: PlayerTeamRole = { + steamId: -1, + name: "Ringer", + role: props.roleTitle, + main: false, + availability: 1, + playtime: -1, + }; + rosterStore.selectPlayerForRole(ringerPlayer, props.roleTitle); + } else { + rosterStore.selectPlayerForRole(props.player, props.roleTitle); + } + } } }; @@ -31,45 +57,81 @@ function onClick() { diff --git a/availabili.tf/src/player.ts b/availabili.tf/src/player.ts index 2a0ba6d..38ba1b3 100644 --- a/availabili.tf/src/player.ts +++ b/availabili.tf/src/player.ts @@ -9,4 +9,5 @@ export interface PlayerTeamRole { role: string; main: boolean; availability: number; + playtime: number; } diff --git a/availabili.tf/src/router/index.ts b/availabili.tf/src/router/index.ts index 983edb8..4c87438 100644 --- a/availabili.tf/src/router/index.ts +++ b/availabili.tf/src/router/index.ts @@ -20,7 +20,7 @@ const router = createRouter({ path: "/schedule/roster", name: "roster-builder", component: RosterBuilderView - } + }, ] }) diff --git a/availabili.tf/src/stores/roster.ts b/availabili.tf/src/stores/roster.ts index c3b0adb..c45d0c2 100644 --- a/availabili.tf/src/stores/roster.ts +++ b/availabili.tf/src/stores/roster.ts @@ -14,7 +14,7 @@ export const useRosterStore = defineStore("roster", () => { const selectedPlayers: Reactive<{ [key: string]: PlayerTeamRole }> = reactive({}); - const selectedRole: Ref = ref("Pocket Scout"); + const selectedRole: Ref = ref(undefined); const availablePlayers: Reactive> = reactive([ { @@ -23,6 +23,7 @@ export const useRosterStore = defineStore("roster", () => { role: "Flank Scout", main: true, availability: 1, + playtime: 35031, }, { steamId: 2839, @@ -30,6 +31,7 @@ export const useRosterStore = defineStore("roster", () => { role: "Flank Scout", main: false, availability: 1, + playtime: 28811, }, { steamId: 2839, @@ -37,6 +39,7 @@ export const useRosterStore = defineStore("roster", () => { role: "Pocket Scout", main: true, availability: 1, + playtime: 28811, }, { steamId: 2841, @@ -44,6 +47,7 @@ export const useRosterStore = defineStore("roster", () => { role: "Pocket Soldier", main: true, availability: 2, + playtime: 98372, }, { steamId: 2841, @@ -51,6 +55,7 @@ export const useRosterStore = defineStore("roster", () => { role: "Roamer", main: false, availability: 2, + playtime: 98372, }, { steamId: 2282, @@ -58,6 +63,7 @@ export const useRosterStore = defineStore("roster", () => { role: "Demoman", main: true, availability: 2, + playtime: 47324, }, { steamId: 2842, @@ -65,6 +71,7 @@ export const useRosterStore = defineStore("roster", () => { role: "Roamer", main: false, availability: 2, + playtime: 12028, }, { steamId: 2842, @@ -72,6 +79,7 @@ export const useRosterStore = defineStore("roster", () => { role: "Demoman", main: false, availability: 2, + playtime: 12028, }, { steamId: 2842, @@ -79,6 +87,7 @@ export const useRosterStore = defineStore("roster", () => { role: "Pocket Scout", main: false, availability: 2, + playtime: 12028, }, //{ // steamId: 2843, @@ -93,6 +102,7 @@ export const useRosterStore = defineStore("roster", () => { role: "Pocket Soldier", main: false, availability: 2, + playtime: 50201, }, { steamId: 2843, @@ -100,6 +110,7 @@ export const useRosterStore = defineStore("roster", () => { role: "Roamer", main: false, availability: 2, + playtime: 50201, }, { steamId: 2844, @@ -107,6 +118,7 @@ export const useRosterStore = defineStore("roster", () => { role: "Roamer", main: true, availability: 1, + playtime: 4732, }, { steamId: 2844, @@ -114,6 +126,7 @@ export const useRosterStore = defineStore("roster", () => { role: "Pocket Soldier", main: false, availability: 1, + playtime: 4732, }, ]); @@ -129,9 +142,27 @@ export const useRosterStore = defineStore("roster", () => { return availablePlayerRoles.value.filter((player) => player.availability == 1); }); + const mainRoles = computed(() => { + return availablePlayerRoles.value.filter((player) => player.main) + .sort((a, b) => b.playtime - a.playtime); + }); + + const alternateRoles = computed(() => { + return availablePlayerRoles.value.filter((player) => !player.main) + .sort((a, b) => b.playtime - a.playtime); + }); + + const roleIcons = reactive({ + "Pocket Scout": "tf2-PocketScout", + "Flank Scout": "tf2-FlankScout", + "Pocket Soldier": "tf2-PocketSoldier", + "Roamer": "tf2-FlankSoldier", + "Demoman": "tf2-Demo", + "Medic": "tf2-Medic", + }); + function selectPlayerForRole(player: PlayerTeamRole, role: string) { - console.log("selecting."); - if (player) { + if (player && player.steamId > 0) { const existingRole = Object.keys(selectedPlayers).find((selectedRole) => { return selectedPlayers[selectedRole]?.steamId == player.steamId && role != selectedRole; @@ -154,5 +185,8 @@ export const useRosterStore = defineStore("roster", () => { selectPlayerForRole, definitelyAvailable, canBeAvailable, + roleIcons, + mainRoles, + alternateRoles, } }); diff --git a/availabili.tf/src/views/RosterBuilderView.vue b/availabili.tf/src/views/RosterBuilderView.vue index 34b5239..c8108d5 100644 --- a/availabili.tf/src/views/RosterBuilderView.vue +++ b/availabili.tf/src/views/RosterBuilderView.vue @@ -10,11 +10,27 @@ const rosterStore = useRosterStore(); const hasAvailablePlayers = computed(() => { return rosterStore.availablePlayerRoles.length > 0; }); + +const hasAlternates = computed(() => { + return rosterStore.alternateRoles.length > 0; +}); diff --git a/availabili.tf/src/views/RosterBuilderViewDragDrop.vue b/availabili.tf/src/views/RosterBuilderViewDragDrop.vue new file mode 100644 index 0000000..fe132fe --- /dev/null +++ b/availabili.tf/src/views/RosterBuilderViewDragDrop.vue @@ -0,0 +1,79 @@ + + + + +