A lot more code changes

This commit is contained in:
Lordmau5 2023-11-18 12:37:16 +01:00
parent a5cf6e3918
commit cc9282e661
46 changed files with 4124 additions and 10766 deletions

10
custom.d.ts vendored Normal file
View File

@ -0,0 +1,10 @@
// / <reference types="node" />
import 'pinia';
declare module 'pinia' {
// eslint-disable-next-line @typescript-eslint/no-unused-vars
export interface DefineStoreOptionsBase<S, Store> {
// allow defining a number of ms for any of the actions
debounce?: Partial<Record<keyof StoreActions<Store>, number>>
}
}

2
env.d.ts vendored
View File

@ -1 +1 @@
/// <reference types="vite/client" />
// / <reference types="vite/client" />

2
generated/src/App.vue.d.ts vendored Normal file
View File

@ -0,0 +1,2 @@
declare const _default: import("vue").DefineComponent<{}, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").VNodeProps & import("vue").AllowedComponentProps & import("vue").ComponentCustomProps, Readonly<globalThis.ExtractPropTypes<{}>>, {}, {}>;
export default _default;

View File

@ -0,0 +1,2 @@
declare const _default: import("vue").DefineComponent<{}, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").VNodeProps & import("vue").AllowedComponentProps & import("vue").ComponentCustomProps, Readonly<globalThis.ExtractPropTypes<{}>>, {}, {}>;
export default _default;

View File

@ -0,0 +1,8 @@
declare const _default: import("vue").DefineComponent<{
editMode: BooleanConstructor;
}, {}, unknown, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").VNodeProps & import("vue").AllowedComponentProps & import("vue").ComponentCustomProps, Readonly<globalThis.ExtractPropTypes<{
editMode: BooleanConstructor;
}>>, {
editMode: boolean;
}, {}>;
export default _default;

View File

@ -0,0 +1,16 @@
declare const _default: import("vue").DefineComponent<{
text: {
type: StringConstructor;
required: true;
default: string;
};
}, {}, unknown, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").VNodeProps & import("vue").AllowedComponentProps & import("vue").ComponentCustomProps, Readonly<globalThis.ExtractPropTypes<{
text: {
type: StringConstructor;
required: true;
default: string;
};
}>>, {
text: string;
}, {}>;
export default _default;

View File

@ -0,0 +1,6 @@
declare const _default: import("vue").DefineComponent<{}, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
toggleLeftDrawer: (...args: any[]) => void;
}, string, import("vue").VNodeProps & import("vue").AllowedComponentProps & import("vue").ComponentCustomProps, Readonly<globalThis.ExtractPropTypes<{}>> & {
onToggleLeftDrawer?: ((...args: any[]) => any) | undefined;
}, {}, {}>;
export default _default;

View File

@ -0,0 +1,14 @@
declare const _default: import("vue").DefineComponent<{
drawer: {
type: BooleanConstructor;
required: true;
default: boolean;
};
}, {}, unknown, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").VNodeProps & import("vue").AllowedComponentProps & import("vue").ComponentCustomProps, Readonly<globalThis.ExtractPropTypes<{
drawer: {
type: BooleanConstructor;
required: true;
default: boolean;
};
}>>, {}, {}>;
export default _default;

2
generated/src/js/ParseGamesJSON.d.ts vendored Normal file
View File

@ -0,0 +1,2 @@
import BingoGame from '@/js/lib/BingoGame.ts';
export declare const games: BingoGame[];

12
generated/src/js/lib/BingoCategory.d.ts vendored Normal file
View File

@ -0,0 +1,12 @@
import BingoGoal from '@/js/lib/BingoGoal.ts';
import BingoGoalList from '@/js/lib/BingoGoalList';
import SuccessResponse from '@/js/lib/SuccessResponse.ts';
export default class BingoCategory {
name: string;
goal_lists: BingoGoalList[];
constructor(name: string);
hasGoalList(subgroup: BingoGoalList): boolean;
addGoalList(subgroup: BingoGoalList): SuccessResponse;
removeGoalList(subgroup: BingoGoalList): SuccessResponse;
getAllGoals(): BingoGoal[];
}

20
generated/src/js/lib/BingoGame.d.ts vendored Normal file
View File

@ -0,0 +1,20 @@
import BingoCategory from '@/js/lib/BingoCategory.ts';
import BingoGoal from '@/js/lib/BingoGoal.ts';
import BingoGoalList from '@/js/lib/BingoGoalList.ts';
import SuccessResponse from '@/js/lib/SuccessResponse.ts';
type BingoCategoryOrGoalList = BingoCategory | BingoGoalList;
export default class BingoGame {
id: string;
name: string;
short_description: string;
description: string;
items: BingoCategoryOrGoalList[];
generator: 'simple' | 'srl_v5' | 'srl_v8';
is_local: boolean;
constructor(id: string, name: string, short_description: string, description: string);
addItem(group: BingoCategoryOrGoalList): SuccessResponse;
removeItem(group: BingoCategoryOrGoalList): SuccessResponse;
removeItemByName(name: string): SuccessResponse;
getGoalsByTags(...tags: string[]): BingoGoal[];
}
export {};

9
generated/src/js/lib/BingoGoal.d.ts vendored Normal file
View File

@ -0,0 +1,9 @@
import SuccessResponse from '@/js/lib/SuccessResponse.js';
export default class BingoGoal {
name: string;
tags: string[];
possible_spaces: number[];
constructor(name: string);
addTag(tag: string): SuccessResponse;
removeTag(tag: string): SuccessResponse;
}

View File

@ -0,0 +1,8 @@
import BingoGoal from '@/js/lib/BingoGoal.ts';
export default class BingoGoalList {
name: string;
goals: BingoGoal[];
constructor(name: string);
addGoal(goal: BingoGoal): void;
removeGoal(goal: BingoGoal): void;
}

5
generated/src/js/lib/LocalGames.d.ts vendored Normal file
View File

@ -0,0 +1,5 @@
import type BingoGame from '@/js/lib/BingoGame.ts';
export declare function getLocalGames(): Promise<Map<string, BingoGame>>;
export declare function getGameByID(id: string): Promise<BingoGame | undefined>;
export declare function saveGame(game: BingoGame): Promise<void>;
export declare function deleteGame(id: string): Promise<void>;

5
generated/src/js/lib/Parser.d.ts vendored Normal file
View File

@ -0,0 +1,5 @@
import BingoGame from '@/js/lib/BingoGame.ts';
export default class Parser {
static from_json(input: string): BingoGame;
static to_json(game: BingoGame): Record<string, any>;
}

View File

@ -0,0 +1,8 @@
export default class SuccessResponse {
#private;
constructor(success: boolean, message?: string);
get success(): boolean;
get message(): string | undefined;
static success(): SuccessResponse;
static error(message: string): SuccessResponse;
}

1
generated/src/js/lib/Test.d.ts vendored Normal file
View File

@ -0,0 +1 @@
export {};

3
generated/src/js/lib/Util.d.ts vendored Normal file
View File

@ -0,0 +1,3 @@
export default class Util {
static stringCompare(str1: string, str2: string): boolean;
}

2
generated/src/js/testmarkdown.d.ts vendored Normal file
View File

@ -0,0 +1,2 @@
declare const text = "---\n__Advertisement :)__\n\n- __[pica](https://nodeca.github.io/pica/demo/)__ - high quality and fast image\n resize in browser.\n- __[babelfish](https://github.com/nodeca/babelfish/)__ - developer friendly\n i18n with plurals support and easy syntax.\n\nYou will like those projects!\n\n---\n\n# h1 Heading 8-)\n## h2 Heading\n### h3 Heading\n#### h4 Heading\n##### h5 Heading\n###### h6 Heading\n\n\n## Horizontal Rules\n\n___\n\n---\n\n***\n\n\n## Typographic replacements\n\nEnable typographer option to see result.\n\n(c) (C) (r) (R) (tm) (TM) (p) (P) +-\n\ntest.. test... test..... test?..... test!....\n\n!!!!!! ???? ,, -- ---\n\n\"Smartypants, double quotes\" and 'single quotes'\n\n\n## Emphasis\n\n**This is bold text**\n\n__This is bold text__\n\n*This is italic text*\n\n_This is italic text_\n\n~~Strikethrough~~\n\n\n## Blockquotes\n\n\n> Blockquotes can also be nested...\n>> ...by using additional greater-than signs right next to each other...\n> > > ...or with spaces between arrows.\n\n\n## Lists\n\nUnordered\n\n+ Create a list by starting a line with `+`, `-`, or `*`\n+ Sub-lists are made by indenting 2 spaces:\n - Marker character change forces new list start:\n * Ac tristique libero volutpat at\n + Facilisis in pretium nisl aliquet\n - Nulla volutpat aliquam velit\n+ Very easy!\n\nOrdered\n\n1. Lorem ipsum dolor sit amet\n2. Consectetur adipiscing elit\n3. Integer molestie lorem at massa\n\n\n1. You can use sequential numbers...\n1. ...or keep all the numbers as `1.`\n\nStart numbering with offset:\n\n57. foo\n1. bar\n\n\n## Code\n\nInline `code`\n\nIndented code\n\n // Some comments\n line 1 of code\n line 2 of code\n line 3 of code\n\n\nBlock code \"fences\"\n\n```\nSample text here...\n```\n\nSyntax highlighting\n\n``` js\nvar foo = function (bar) {\n return bar++;\n};\n\nconsole.log(foo(5));\n```\n\n## Tables\n\n| Option | Description |\n| ------ | ----------- |\n| data | path to data files to supply the data that will be passed into templates. |\n| engine | engine to be used for processing templates. Handlebars is the default. |\n| ext | extension to be used for dest files. |\n\nRight aligned columns\n\n| Option | Description |\n| ------:| -----------:|\n| data | path to data files to supply the data that will be passed into templates. |\n| engine | engine to be used for processing templates. Handlebars is the default. |\n| ext | extension to be used for dest files. |\n\n\n## Links\n\n[link text](http://dev.nodeca.com)\n\n[link with title](http://nodeca.github.io/pica/demo/ \"title text!\")\n\nAutoconverted link https://github.com/nodeca/pica (enable linkify to see)\n\n\n## Images\n\n![Minion](https://octodex.github.com/images/minion.png)\n![Stormtroopocat](https://octodex.github.com/images/stormtroopocat.jpg \"The Stormtroopocat\")\n\nLike links, Images also have a footnote style syntax\n\n![Alt text][id]\n\nWith a reference later in the document defining the URL location:\n\n[id]: https://octodex.github.com/images/dojocat.jpg \"The Dojocat\"\n\n\n## Plugins\n\nThe killer feature of `markdown-it` is very effective support of\n[syntax plugins](https://www.npmjs.org/browse/keyword/markdown-it-plugin).\n\n\n### [Emojies](https://github.com/markdown-it/markdown-it-emoji)\n\n> Classic markup: :wink: :crush: :cry: :tear: :laughing: :yum:\n>\n> Shortcuts (emoticons): :-) :-( 8-) ;)\n\nsee [how to change output](https://github.com/markdown-it/markdown-it-emoji#change-output) with twemoji.\n\n\n### [Subscript](https://github.com/markdown-it/markdown-it-sub) / [Superscript](https://github.com/markdown-it/markdown-it-sup)\n\n- 19^th^\n- H~2~O\n\n\n### [<ins>](https://github.com/markdown-it/markdown-it-ins)\n\n++Inserted text++\n\n\n### [<mark>](https://github.com/markdown-it/markdown-it-mark)\n\n==Marked text==\n\n\n### [Footnotes](https://github.com/markdown-it/markdown-it-footnote)\n\nFootnote 1 link[^first].\n\nFootnote 2 link[^second].\n\nInline footnote^[Text of inline footnote] definition.\n\nDuplicated footnote reference[^second].\n\n[^first]: Footnote **can have markup**\n\n and multiple paragraphs.\n\n[^second]: Footnote text.\n\n\n### [Definition lists](https://github.com/markdown-it/markdown-it-deflist)\n\nTerm 1\n\n: Definition 1\nwith lazy continuation.\n\nTerm 2 with *inline markup*\n\n: Definition 2\n\n { some code, part of Definition 2 }\n\n Third paragraph of definition 2.\n\n_Compact style:_\n\nTerm 1\n ~ Definition 1\n\nTerm 2\n ~ Definition 2a\n ~ Definition 2b\n\n\n### [Abbreviations](https://github.com/markdown-it/markdown-it-abbr)\n\nThis is HTML abbreviation example.\n\nIt converts \"HTML\", but keep intact partial entries like \"xxxHTMLyyy\" and so on.\n\n*[HTML]: Hyper Text Markup Language\n\n### [Custom containers](https://github.com/markdown-it/markdown-it-container)\n\n::: warning\n*here be dragons*\n:::";
export default text;

4
generated/src/main.d.ts vendored Normal file
View File

@ -0,0 +1,4 @@
import '@/assets/main.css';
import '@quasar/extras/material-icons/material-icons.css';
import 'quasar/src/css/index.sass';
import 'reflect-metadata';

2
generated/src/router/index.d.ts vendored Normal file
View File

@ -0,0 +1,2 @@
declare const router: import("vue-router").Router;
export default router;

4
generated/src/stores/local-games.d.ts vendored Normal file
View File

@ -0,0 +1,4 @@
import BingoGame from '@/js/lib/BingoGame.ts';
export declare const useLocalGamesStore: import("pinia").StoreDefinition<"localGames", {
games: Map<string, BingoGame>;
}, {}, {}>;

View File

@ -0,0 +1,6 @@
import BingoGame from '@/js/lib/BingoGame.ts';
export declare const useRemoteGamesStore: import("pinia").StoreDefinition<"remoteGames", {
games: BingoGame[];
}, {}, {
fetchRemoteGames(): Promise<void>;
}>;

View File

@ -0,0 +1,2 @@
declare const _default: import("vue").DefineComponent<{}, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").VNodeProps & import("vue").AllowedComponentProps & import("vue").ComponentCustomProps, Readonly<globalThis.ExtractPropTypes<{}>>, {}, {}>;
export default _default;

View File

@ -0,0 +1,2 @@
declare const _default: import("vue").DefineComponent<{}, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").VNodeProps & import("vue").AllowedComponentProps & import("vue").ComponentCustomProps, Readonly<globalThis.ExtractPropTypes<{}>>, {}, {}>;
export default _default;

2
generated/src/views/MainPage.vue.d.ts vendored Normal file
View File

@ -0,0 +1,2 @@
declare const _default: import("vue").DefineComponent<{}, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").VNodeProps & import("vue").AllowedComponentProps & import("vue").ComponentCustomProps, Readonly<globalThis.ExtractPropTypes<{}>>, {}, {}>;
export default _default;

File diff suppressed because one or more lines are too long

View File

@ -8,43 +8,47 @@
"preview": "vite preview",
"test:unit": "vitest",
"build-only": "vite build",
"type-check": "vue-tsc --noEmit -p tsconfig.vitest.json --composite false",
"type-check__OLD": "vue-tsc --noEmit -p tsconfig.vitest.json --composite false",
"type-check": "vue-tsc -p tsconfig.vitest.json",
"lint": "eslint . --ext .vue,.js,.jsx,.cjs,.mjs,.ts,.tsx,.cts,.mts --fix --ignore-path .gitignore"
},
"dependencies": {
"@quasar/extras": "^1.16.8",
"@types/markdown-it": "^13.0.6",
"@vue/runtime-core": "^3.3.8",
"class-transformer": "^0.5.1",
"idb-keyval": "^6.2.1",
"markdown-it": "^13.0.2",
"pinia": "^2.1.7",
"quasar": "^2.13.1",
"quasar": "^2.14.0",
"reflect-metadata": "^0.1.13",
"vue": "^3.3.4",
"ts-debounce": "^4.0.0",
"vue": "^3.3.8",
"vue-router": "^4.2.5"
},
"devDependencies": {
"@quasar/vite-plugin": "^1.6.0",
"@rushstack/eslint-patch": "^1.3.3",
"@stylistic/eslint-plugin": "^1.1.0",
"@rushstack/eslint-patch": "^1.5.1",
"@stylistic/eslint-plugin": "^1.2.0",
"@tsconfig/node18": "^18.2.2",
"@types/jsdom": "^21.1.3",
"@types/node": "^18.18.5",
"@vitejs/plugin-vue": "^4.4.0",
"@types/jsdom": "^21.1.5",
"@types/node": "^18.18.9",
"@vitejs/plugin-vue": "^4.4.1",
"@vitejs/plugin-vue-jsx": "^3.0.2",
"@vue/eslint-config-typescript": "^12.0.0",
"@vue/test-utils": "^2.4.1",
"@vue/test-utils": "^2.4.2",
"@vue/tsconfig": "^0.4.0",
"eslint": "^8.53.0",
"eslint-plugin-vue": "^9.17.0",
"eslint-plugin-vue": "^9.18.1",
"jsdom": "^22.1.0",
"npm-run-all2": "^6.1.1",
"sass": "1.32.12",
"typescript": "~5.2.0",
"sass": "1.33.0",
"typescript": "~5.2.2",
"unplugin-auto-import": "^0.16.7",
"unplugin-vue-components": "^0.25.2",
"unplugin-vue-router": "^0.7.0",
"vite": "^4.4.11",
"vite": "^4.5.0",
"vitest": "^0.34.6",
"vue-tsc": "^1.8.19"
"vue-tsc": "^1.8.22"
}
}

415
pnpm-lock.yaml generated
View File

@ -11,9 +11,15 @@ dependencies:
'@types/markdown-it':
specifier: ^13.0.6
version: 13.0.6
'@vue/runtime-core':
specifier: ^3.3.8
version: 3.3.8
class-transformer:
specifier: ^0.5.1
version: 0.5.1
idb-keyval:
specifier: ^6.2.1
version: 6.2.1
markdown-it:
specifier: ^13.0.2
version: 13.0.2
@ -21,13 +27,16 @@ dependencies:
specifier: ^2.1.7
version: 2.1.7(typescript@5.2.2)(vue@3.3.8)
quasar:
specifier: ^2.13.1
version: 2.13.1
specifier: ^2.14.0
version: 2.14.0
reflect-metadata:
specifier: ^0.1.13
version: 0.1.13
ts-debounce:
specifier: ^4.0.0
version: 4.0.0
vue:
specifier: ^3.3.4
specifier: ^3.3.8
version: 3.3.8(typescript@5.2.2)
vue-router:
specifier: ^4.2.5
@ -36,24 +45,24 @@ dependencies:
devDependencies:
'@quasar/vite-plugin':
specifier: ^1.6.0
version: 1.6.0(@vitejs/plugin-vue@4.4.1)(quasar@2.13.1)(vite@4.5.0)(vue@3.3.8)
version: 1.6.0(@vitejs/plugin-vue@4.4.1)(quasar@2.14.0)(vite@4.5.0)(vue@3.3.8)
'@rushstack/eslint-patch':
specifier: ^1.3.3
specifier: ^1.5.1
version: 1.5.1
'@stylistic/eslint-plugin':
specifier: ^1.1.0
version: 1.1.0(eslint@8.53.0)(typescript@5.2.2)
specifier: ^1.2.0
version: 1.2.0(eslint@8.53.0)(typescript@5.2.2)
'@tsconfig/node18':
specifier: ^18.2.2
version: 18.2.2
'@types/jsdom':
specifier: ^21.1.3
specifier: ^21.1.5
version: 21.1.5
'@types/node':
specifier: ^18.18.5
specifier: ^18.18.9
version: 18.18.9
'@vitejs/plugin-vue':
specifier: ^4.4.0
specifier: ^4.4.1
version: 4.4.1(vite@4.5.0)(vue@3.3.8)
'@vitejs/plugin-vue-jsx':
specifier: ^3.0.2
@ -62,8 +71,8 @@ devDependencies:
specifier: ^12.0.0
version: 12.0.0(eslint-plugin-vue@9.18.1)(eslint@8.53.0)(typescript@5.2.2)
'@vue/test-utils':
specifier: ^2.4.1
version: 2.4.1(vue@3.3.8)
specifier: ^2.4.2
version: 2.4.2(vue@3.3.8)
'@vue/tsconfig':
specifier: ^0.4.0
version: 0.4.0
@ -71,7 +80,7 @@ devDependencies:
specifier: ^8.53.0
version: 8.53.0
eslint-plugin-vue:
specifier: ^9.17.0
specifier: ^9.18.1
version: 9.18.1(eslint@8.53.0)
jsdom:
specifier: ^22.1.0
@ -80,10 +89,10 @@ devDependencies:
specifier: ^6.1.1
version: 6.1.1
sass:
specifier: 1.32.12
version: 1.32.12
specifier: 1.33.0
version: 1.33.0
typescript:
specifier: ~5.2.0
specifier: ~5.2.2
version: 5.2.2
unplugin-auto-import:
specifier: ^0.16.7
@ -95,13 +104,13 @@ devDependencies:
specifier: ^0.7.0
version: 0.7.0(vue-router@4.2.5)(vue@3.3.8)
vite:
specifier: ^4.4.11
version: 4.5.0(@types/node@18.18.9)(sass@1.32.12)
specifier: ^4.5.0
version: 4.5.0(@types/node@18.18.9)(sass@1.33.0)
vitest:
specifier: ^0.34.6
version: 0.34.6(jsdom@22.1.0)(sass@1.32.12)
version: 0.34.6(jsdom@22.1.0)(sass@1.33.0)
vue-tsc:
specifier: ^1.8.19
specifier: ^1.8.22
version: 1.8.22(typescript@5.2.2)
packages:
@ -661,6 +670,18 @@ packages:
resolution: {integrity: sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw==}
dev: true
/@isaacs/cliui@8.0.2:
resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==}
engines: {node: '>=12'}
dependencies:
string-width: 5.1.2
string-width-cjs: /string-width@4.2.3
strip-ansi: 7.1.0
strip-ansi-cjs: /strip-ansi@6.0.1
wrap-ansi: 8.1.0
wrap-ansi-cjs: /wrap-ansi@7.0.0
dev: true
/@jest/schemas@29.6.3:
resolution: {integrity: sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==}
engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
@ -722,11 +743,18 @@ packages:
resolution: {integrity: sha512-XuySG1E38YScSJoMlqovLru4KTUNSjgVTIjyh7qMX6aNN5HY5Ct5LhRJdxO79JtTzKfzV/bnWpz+zquYrISsvw==}
dev: true
/@pkgjs/parseargs@0.11.0:
resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==}
engines: {node: '>=14'}
requiresBuild: true
dev: true
optional: true
/@quasar/extras@1.16.8:
resolution: {integrity: sha512-mNSwQ6wkIVoAemhYdLm9q/FVqLHmVONZgCYdLLeqpakKNsR0r/zHQnCngzdDaXI7veYEvE0uW1gJa1wdQsxXxA==}
dev: false
/@quasar/vite-plugin@1.6.0(@vitejs/plugin-vue@4.4.1)(quasar@2.13.1)(vite@4.5.0)(vue@3.3.8):
/@quasar/vite-plugin@1.6.0(@vitejs/plugin-vue@4.4.1)(quasar@2.14.0)(vite@4.5.0)(vue@3.3.8):
resolution: {integrity: sha512-LmbV76G1CwWZbrEQhqyZpkRQTJyO3xpW55aXY1zWN+JhyUeG77CcMCEWteBVnJ6I6ehUPFDC9ONd2+WlwH6rNQ==}
engines: {node: '>=12'}
peerDependencies:
@ -736,8 +764,8 @@ packages:
vue: ^3.0.0
dependencies:
'@vitejs/plugin-vue': 4.4.1(vite@4.5.0)(vue@3.3.8)
quasar: 2.13.1
vite: 4.5.0(@types/node@18.18.9)(sass@1.32.12)
quasar: 2.14.0
vite: 4.5.0(@types/node@18.18.9)(sass@1.33.0)
vue: 3.3.8(typescript@5.2.2)
dev: true
@ -763,8 +791,8 @@ packages:
resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==}
dev: true
/@stylistic/eslint-plugin-js@1.1.0:
resolution: {integrity: sha512-7yDOvKQvtTXIJMVcKNGfpYSJJhwTbOrDcMDgYqWbtS9LyHmuzxvnR748bQ21pQyi6aZR2E7edwKsdKmZlXc9Rg==}
/@stylistic/eslint-plugin-js@1.2.0:
resolution: {integrity: sha512-1Zi/AlQzOzTlTegupd3vrUYHd02ilvk7x5O9ZRFjYGtUcwHVk+WTEKk/3Nmr8yuvzEiXqUNFJ8bv8b4rLYCPRQ==}
dependencies:
acorn: 8.11.2
escape-string-regexp: 4.0.0
@ -773,20 +801,20 @@ packages:
graphemer: 1.4.0
dev: true
/@stylistic/eslint-plugin-jsx@1.1.0:
resolution: {integrity: sha512-XMTAYQ9t7ZoWjqciqOy99O0sRCHh/6x/Q4Dm8sCVKzKlsnPzVlXzAD0htNqHG+Fu7qyGblDqb0/7PNJXBdQc5Q==}
/@stylistic/eslint-plugin-jsx@1.2.0:
resolution: {integrity: sha512-8YHFw8x6nObGtJSMrFt40+nth6fI1lLJASg12qB1nfeLQYEGlPv5UCOA0sysKATnQF12j6wVO68CdeEsp0RZgA==}
dependencies:
'@stylistic/eslint-plugin-js': 1.1.0
'@stylistic/eslint-plugin-js': 1.2.0
estraverse: 5.3.0
dev: true
/@stylistic/eslint-plugin-ts@1.1.0(eslint@8.53.0)(typescript@5.2.2):
resolution: {integrity: sha512-vqlinwzTNSKoFaVcVKE2iVGKX62NKIJfkhEI+5uuufYcAhfjfOK3KQY0zhdUeshEUkBVR0uRrJzH1/Cj/2Unfg==}
/@stylistic/eslint-plugin-ts@1.2.0(eslint@8.53.0)(typescript@5.2.2):
resolution: {integrity: sha512-fWP8Q4K92Gm0qeqvZJk0THlS+8ynX4UluMuY/cJ1g/I4ntY0eNDLs/m1uWGitky33GOnM5DiW8riV8yLRNQ0Fg==}
peerDependencies:
eslint: '*'
dependencies:
'@stylistic/eslint-plugin-js': 1.1.0
'@typescript-eslint/utils': 6.10.0(eslint@8.53.0)(typescript@5.2.2)
'@stylistic/eslint-plugin-js': 1.2.0
'@typescript-eslint/utils': 6.11.0(eslint@8.53.0)(typescript@5.2.2)
eslint: 8.53.0
graphemer: 1.4.0
transitivePeerDependencies:
@ -794,14 +822,14 @@ packages:
- typescript
dev: true
/@stylistic/eslint-plugin@1.1.0(eslint@8.53.0)(typescript@5.2.2):
resolution: {integrity: sha512-PcJgMTNiIZ1d+aQt7OM50hRkeOIB7FyfRofNEe1PykG7NvSjjwQ7fS2XN+eN/SmoPN4ocZkacZHOv5cDNrFEqQ==}
/@stylistic/eslint-plugin@1.2.0(eslint@8.53.0)(typescript@5.2.2):
resolution: {integrity: sha512-WtY9pxiXFfNTkHOCrXCN7diWB49KqyBCwDjIhXVrN2rCJ6ZA7bnlDtDjwSvU3Gnb/kTEYnt6aVXjprFi0f7S0g==}
peerDependencies:
eslint: '*'
dependencies:
'@stylistic/eslint-plugin-js': 1.1.0
'@stylistic/eslint-plugin-jsx': 1.1.0
'@stylistic/eslint-plugin-ts': 1.1.0(eslint@8.53.0)(typescript@5.2.2)
'@stylistic/eslint-plugin-js': 1.2.0
'@stylistic/eslint-plugin-jsx': 1.2.0
'@stylistic/eslint-plugin-ts': 1.2.0(eslint@8.53.0)(typescript@5.2.2)
eslint: 8.53.0
transitivePeerDependencies:
- supports-color
@ -876,8 +904,8 @@ packages:
resolution: {integrity: sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA==}
dev: true
/@typescript-eslint/eslint-plugin@6.10.0(@typescript-eslint/parser@6.10.0)(eslint@8.53.0)(typescript@5.2.2):
resolution: {integrity: sha512-uoLj4g2OTL8rfUQVx2AFO1hp/zja1wABJq77P6IclQs6I/m9GLrm7jCdgzZkvWdDCQf1uEvoa8s8CupsgWQgVg==}
/@typescript-eslint/eslint-plugin@6.11.0(@typescript-eslint/parser@6.11.0)(eslint@8.53.0)(typescript@5.2.2):
resolution: {integrity: sha512-uXnpZDc4VRjY4iuypDBKzW1rz9T5YBBK0snMn8MaTSNd2kMlj50LnLBABELjJiOL5YHk7ZD8hbSpI9ubzqYI0w==}
engines: {node: ^16.0.0 || >=18.0.0}
peerDependencies:
'@typescript-eslint/parser': ^6.0.0 || ^6.0.0-alpha
@ -888,11 +916,11 @@ packages:
optional: true
dependencies:
'@eslint-community/regexpp': 4.10.0
'@typescript-eslint/parser': 6.10.0(eslint@8.53.0)(typescript@5.2.2)
'@typescript-eslint/scope-manager': 6.10.0
'@typescript-eslint/type-utils': 6.10.0(eslint@8.53.0)(typescript@5.2.2)
'@typescript-eslint/utils': 6.10.0(eslint@8.53.0)(typescript@5.2.2)
'@typescript-eslint/visitor-keys': 6.10.0
'@typescript-eslint/parser': 6.11.0(eslint@8.53.0)(typescript@5.2.2)
'@typescript-eslint/scope-manager': 6.11.0
'@typescript-eslint/type-utils': 6.11.0(eslint@8.53.0)(typescript@5.2.2)
'@typescript-eslint/utils': 6.11.0(eslint@8.53.0)(typescript@5.2.2)
'@typescript-eslint/visitor-keys': 6.11.0
debug: 4.3.4
eslint: 8.53.0
graphemer: 1.4.0
@ -905,8 +933,8 @@ packages:
- supports-color
dev: true
/@typescript-eslint/parser@6.10.0(eslint@8.53.0)(typescript@5.2.2):
resolution: {integrity: sha512-+sZwIj+s+io9ozSxIWbNB5873OSdfeBEH/FR0re14WLI6BaKuSOnnwCJ2foUiu8uXf4dRp1UqHP0vrZ1zXGrog==}
/@typescript-eslint/parser@6.11.0(eslint@8.53.0)(typescript@5.2.2):
resolution: {integrity: sha512-+whEdjk+d5do5nxfxx73oanLL9ghKO3EwM9kBCkUtWMRwWuPaFv9ScuqlYfQ6pAD6ZiJhky7TZ2ZYhrMsfMxVQ==}
engines: {node: ^16.0.0 || >=18.0.0}
peerDependencies:
eslint: ^7.0.0 || ^8.0.0
@ -915,10 +943,10 @@ packages:
typescript:
optional: true
dependencies:
'@typescript-eslint/scope-manager': 6.10.0
'@typescript-eslint/types': 6.10.0
'@typescript-eslint/typescript-estree': 6.10.0(typescript@5.2.2)
'@typescript-eslint/visitor-keys': 6.10.0
'@typescript-eslint/scope-manager': 6.11.0
'@typescript-eslint/types': 6.11.0
'@typescript-eslint/typescript-estree': 6.11.0(typescript@5.2.2)
'@typescript-eslint/visitor-keys': 6.11.0
debug: 4.3.4
eslint: 8.53.0
typescript: 5.2.2
@ -926,16 +954,16 @@ packages:
- supports-color
dev: true
/@typescript-eslint/scope-manager@6.10.0:
resolution: {integrity: sha512-TN/plV7dzqqC2iPNf1KrxozDgZs53Gfgg5ZHyw8erd6jd5Ta/JIEcdCheXFt9b1NYb93a1wmIIVW/2gLkombDg==}
/@typescript-eslint/scope-manager@6.11.0:
resolution: {integrity: sha512-0A8KoVvIURG4uhxAdjSaxy8RdRE//HztaZdG8KiHLP8WOXSk0vlF7Pvogv+vlJA5Rnjj/wDcFENvDaHb+gKd1A==}
engines: {node: ^16.0.0 || >=18.0.0}
dependencies:
'@typescript-eslint/types': 6.10.0
'@typescript-eslint/visitor-keys': 6.10.0
'@typescript-eslint/types': 6.11.0
'@typescript-eslint/visitor-keys': 6.11.0
dev: true
/@typescript-eslint/type-utils@6.10.0(eslint@8.53.0)(typescript@5.2.2):
resolution: {integrity: sha512-wYpPs3hgTFblMYwbYWPT3eZtaDOjbLyIYuqpwuLBBqhLiuvJ+9sEp2gNRJEtR5N/c9G1uTtQQL5AhV0fEPJYcg==}
/@typescript-eslint/type-utils@6.11.0(eslint@8.53.0)(typescript@5.2.2):
resolution: {integrity: sha512-nA4IOXwZtqBjIoYrJcYxLRO+F9ri+leVGoJcMW1uqr4r1Hq7vW5cyWrA43lFbpRvQ9XgNrnfLpIkO3i1emDBIA==}
engines: {node: ^16.0.0 || >=18.0.0}
peerDependencies:
eslint: ^7.0.0 || ^8.0.0
@ -944,8 +972,8 @@ packages:
typescript:
optional: true
dependencies:
'@typescript-eslint/typescript-estree': 6.10.0(typescript@5.2.2)
'@typescript-eslint/utils': 6.10.0(eslint@8.53.0)(typescript@5.2.2)
'@typescript-eslint/typescript-estree': 6.11.0(typescript@5.2.2)
'@typescript-eslint/utils': 6.11.0(eslint@8.53.0)(typescript@5.2.2)
debug: 4.3.4
eslint: 8.53.0
ts-api-utils: 1.0.3(typescript@5.2.2)
@ -954,13 +982,13 @@ packages:
- supports-color
dev: true
/@typescript-eslint/types@6.10.0:
resolution: {integrity: sha512-36Fq1PWh9dusgo3vH7qmQAj5/AZqARky1Wi6WpINxB6SkQdY5vQoT2/7rW7uBIsPDcvvGCLi4r10p0OJ7ITAeg==}
/@typescript-eslint/types@6.11.0:
resolution: {integrity: sha512-ZbEzuD4DwEJxwPqhv3QULlRj8KYTAnNsXxmfuUXFCxZmO6CF2gM/y+ugBSAQhrqaJL3M+oe4owdWunaHM6beqA==}
engines: {node: ^16.0.0 || >=18.0.0}
dev: true
/@typescript-eslint/typescript-estree@6.10.0(typescript@5.2.2):
resolution: {integrity: sha512-ek0Eyuy6P15LJVeghbWhSrBCj/vJpPXXR+EpaRZqou7achUWL8IdYnMSC5WHAeTWswYQuP2hAZgij/bC9fanBg==}
/@typescript-eslint/typescript-estree@6.11.0(typescript@5.2.2):
resolution: {integrity: sha512-Aezzv1o2tWJwvZhedzvD5Yv7+Lpu1by/U1LZ5gLc4tCx8jUmuSCMioPFRjliN/6SJIvY6HpTtJIWubKuYYYesQ==}
engines: {node: ^16.0.0 || >=18.0.0}
peerDependencies:
typescript: '*'
@ -968,8 +996,8 @@ packages:
typescript:
optional: true
dependencies:
'@typescript-eslint/types': 6.10.0
'@typescript-eslint/visitor-keys': 6.10.0
'@typescript-eslint/types': 6.11.0
'@typescript-eslint/visitor-keys': 6.11.0
debug: 4.3.4
globby: 11.1.0
is-glob: 4.0.3
@ -980,8 +1008,8 @@ packages:
- supports-color
dev: true
/@typescript-eslint/utils@6.10.0(eslint@8.53.0)(typescript@5.2.2):
resolution: {integrity: sha512-v+pJ1/RcVyRc0o4wAGux9x42RHmAjIGzPRo538Z8M1tVx6HOnoQBCX/NoadHQlZeC+QO2yr4nNSFWOoraZCAyg==}
/@typescript-eslint/utils@6.11.0(eslint@8.53.0)(typescript@5.2.2):
resolution: {integrity: sha512-p23ibf68fxoZy605dc0dQAEoUsoiNoP3MD9WQGiHLDuTSOuqoTsa4oAy+h3KDkTcxbbfOtUjb9h3Ta0gT4ug2g==}
engines: {node: ^16.0.0 || >=18.0.0}
peerDependencies:
eslint: ^7.0.0 || ^8.0.0
@ -989,9 +1017,9 @@ packages:
'@eslint-community/eslint-utils': 4.4.0(eslint@8.53.0)
'@types/json-schema': 7.0.15
'@types/semver': 7.5.5
'@typescript-eslint/scope-manager': 6.10.0
'@typescript-eslint/types': 6.10.0
'@typescript-eslint/typescript-estree': 6.10.0(typescript@5.2.2)
'@typescript-eslint/scope-manager': 6.11.0
'@typescript-eslint/types': 6.11.0
'@typescript-eslint/typescript-estree': 6.11.0(typescript@5.2.2)
eslint: 8.53.0
semver: 7.5.4
transitivePeerDependencies:
@ -999,11 +1027,11 @@ packages:
- typescript
dev: true
/@typescript-eslint/visitor-keys@6.10.0:
resolution: {integrity: sha512-xMGluxQIEtOM7bqFCo+rCMh5fqI+ZxV5RUUOa29iVPz1OgCZrtc7rFnz5cLUazlkPKYqX+75iuDq7m0HQ48nCg==}
/@typescript-eslint/visitor-keys@6.11.0:
resolution: {integrity: sha512-+SUN/W7WjBr05uRxPggJPSzyB8zUpaYo2hByKasWbqr3PM8AXfZt8UHdNpBS1v9SA62qnSSMF3380SwDqqprgQ==}
engines: {node: ^16.0.0 || >=18.0.0}
dependencies:
'@typescript-eslint/types': 6.10.0
'@typescript-eslint/types': 6.11.0
eslint-visitor-keys: 3.4.3
dev: true
@ -1021,7 +1049,7 @@ packages:
'@babel/core': 7.23.3
'@babel/plugin-transform-typescript': 7.23.3(@babel/core@7.23.3)
'@vue/babel-plugin-jsx': 1.1.5(@babel/core@7.23.3)
vite: 4.5.0(@types/node@18.18.9)(sass@1.32.12)
vite: 4.5.0(@types/node@18.18.9)(sass@1.33.0)
vue: 3.3.8(typescript@5.2.2)
transitivePeerDependencies:
- supports-color
@ -1034,7 +1062,7 @@ packages:
vite: ^4.0.0
vue: ^3.2.25
dependencies:
vite: 4.5.0(@types/node@18.18.9)(sass@1.32.12)
vite: 4.5.0(@types/node@18.18.9)(sass@1.33.0)
vue: 3.3.8(typescript@5.2.2)
dev: true
@ -1186,8 +1214,8 @@ packages:
typescript:
optional: true
dependencies:
'@typescript-eslint/eslint-plugin': 6.10.0(@typescript-eslint/parser@6.10.0)(eslint@8.53.0)(typescript@5.2.2)
'@typescript-eslint/parser': 6.10.0(eslint@8.53.0)(typescript@5.2.2)
'@typescript-eslint/eslint-plugin': 6.11.0(@typescript-eslint/parser@6.11.0)(eslint@8.53.0)(typescript@5.2.2)
'@typescript-eslint/parser': 6.11.0(eslint@8.53.0)(typescript@5.2.2)
eslint: 8.53.0
eslint-plugin-vue: 9.18.1(eslint@8.53.0)
typescript: 5.2.2
@ -1254,8 +1282,8 @@ packages:
/@vue/shared@3.3.8:
resolution: {integrity: sha512-8PGwybFwM4x8pcfgqEQFy70NaQxASvOC5DJwLQfpArw1UDfUXrJkdxD3BhVTMS+0Lef/TU7YO0Jvr0jJY8T+mw==}
/@vue/test-utils@2.4.1(vue@3.3.8):
resolution: {integrity: sha512-VO8nragneNzUZUah6kOjiFmD/gwRjUauG9DROh6oaOeFwX1cZRUNHhdeogE8635cISigXFTtGLUQWx5KCb0xeg==}
/@vue/test-utils@2.4.2(vue@3.3.8):
resolution: {integrity: sha512-07lLjpG1o9tEBoWQfVOFhDT7+WFCdDeECoeSdzOuVgIi6nxb2JDLGNNOV6+3crPpyg/jMlIocj96UROcgomiGg==}
peerDependencies:
'@vue/server-renderer': ^3.0.1
vue: ^3.0.1
@ -1263,9 +1291,9 @@ packages:
'@vue/server-renderer':
optional: true
dependencies:
js-beautify: 1.14.9
js-beautify: 1.14.11
vue: 3.3.8(typescript@5.2.2)
vue-component-type-helpers: 1.8.4
vue-component-type-helpers: 1.8.22
dev: true
/@vue/tsconfig@0.4.0:
@ -1276,8 +1304,9 @@ packages:
resolution: {integrity: sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==}
dev: true
/abbrev@1.1.1:
resolution: {integrity: sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==}
/abbrev@2.0.0:
resolution: {integrity: sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ==}
engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0}
dev: true
/acorn-jsx@5.3.2(acorn@8.11.2):
@ -1322,6 +1351,11 @@ packages:
engines: {node: '>=8'}
dev: true
/ansi-regex@6.0.1:
resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==}
engines: {node: '>=12'}
dev: true
/ansi-styles@3.2.1:
resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==}
engines: {node: '>=4'}
@ -1440,8 +1474,8 @@ packages:
engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7}
hasBin: true
dependencies:
caniuse-lite: 1.0.30001561
electron-to-chromium: 1.4.580
caniuse-lite: 1.0.30001562
electron-to-chromium: 1.4.585
node-releases: 2.0.13
update-browserslist-db: 1.0.13(browserslist@4.22.1)
dev: true
@ -1461,8 +1495,8 @@ packages:
engines: {node: '>=10'}
dev: true
/caniuse-lite@1.0.30001561:
resolution: {integrity: sha512-NTt0DNoKe958Q0BE0j0c1V9jbUzhBxHIEJy7asmGrpE0yG63KTV7PLHPnK2E1O9RsQrQ081I3NLuXGS6zht3cw==}
/caniuse-lite@1.0.30001562:
resolution: {integrity: sha512-kfte3Hym//51EdX4239i+Rmp20EsLIYGdPkERegTgU19hQWCRhsRFGKHTliUlsry53tv17K7n077Kqa0WJU4ng==}
dev: true
/chai@4.3.10:
@ -1668,6 +1702,10 @@ packages:
webidl-conversions: 7.0.0
dev: true
/eastasianwidth@0.2.0:
resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==}
dev: true
/editorconfig@1.0.4:
resolution: {integrity: sha512-L9Qe08KWTlqYMVvMcTIvMAdl1cDUubzRNYL+WfA4bLDMHe4nemKkpmYzkznE1FwLKu0EEmy6obgQKzMJrg4x9Q==}
engines: {node: '>=14'}
@ -1679,8 +1717,16 @@ packages:
semver: 7.5.4
dev: true
/electron-to-chromium@1.4.580:
resolution: {integrity: sha512-T5q3pjQon853xxxHUq3ZP68ZpvJHuSMY2+BZaW3QzjS4HvNuvsMmZ/+lU+nCrftre1jFZ+OSlExynXWBihnXzw==}
/electron-to-chromium@1.4.585:
resolution: {integrity: sha512-B4yBlX0azdA3rVMxpYwLQfDpdwOgcnLCkpvSOd68iFmeedo+WYjaBJS3/W58LVD8CB2nf+o7C4K9xz1l09RkWg==}
dev: true
/emoji-regex@8.0.0:
resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==}
dev: true
/emoji-regex@9.2.2:
resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==}
dev: true
/entities@3.0.1:
@ -1896,7 +1942,7 @@ packages:
resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==}
engines: {node: ^10.12.0 || >=12.0.0}
dependencies:
flat-cache: 3.1.1
flat-cache: 3.2.0
dev: true
/fill-range@7.0.1:
@ -1914,9 +1960,9 @@ packages:
path-exists: 4.0.0
dev: true
/flat-cache@3.1.1:
resolution: {integrity: sha512-/qM2b3LUIaIgviBQovTLvijfyOQXPtSRnRK26ksj2J7rzPIecePUIpJsZ4T02Qg+xiAEKIs5K8dsHEd+VaKa/Q==}
engines: {node: '>=12.0.0'}
/flat-cache@3.2.0:
resolution: {integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==}
engines: {node: ^10.12.0 || >=12.0.0}
dependencies:
flatted: 3.2.9
keyv: 4.5.4
@ -1927,6 +1973,14 @@ packages:
resolution: {integrity: sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==}
dev: true
/foreground-child@3.1.1:
resolution: {integrity: sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==}
engines: {node: '>=14'}
dependencies:
cross-spawn: 7.0.3
signal-exit: 4.1.0
dev: true
/form-data@4.0.0:
resolution: {integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==}
engines: {node: '>= 6'}
@ -1975,6 +2029,18 @@ packages:
is-glob: 4.0.3
dev: true
/glob@10.3.10:
resolution: {integrity: sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==}
engines: {node: '>=16 || 14 >=14.17'}
hasBin: true
dependencies:
foreground-child: 3.1.1
jackspeak: 2.3.6
minimatch: 9.0.3
minipass: 7.0.4
path-scurry: 1.10.1
dev: true
/glob@7.2.3:
resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==}
dependencies:
@ -1986,17 +2052,6 @@ packages:
path-is-absolute: 1.0.1
dev: true
/glob@8.1.0:
resolution: {integrity: sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==}
engines: {node: '>=12'}
dependencies:
fs.realpath: 1.0.0
inflight: 1.0.6
inherits: 2.0.4
minimatch: 5.1.6
once: 1.4.0
dev: true
/globals@11.12.0:
resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==}
engines: {node: '>=4'}
@ -2094,6 +2149,10 @@ packages:
safer-buffer: 2.1.2
dev: true
/idb-keyval@6.2.1:
resolution: {integrity: sha512-8Sb3veuYCyrZL+VBt9LJfZjLUPWVvqn8tG28VqYNFCo43KHcKuq+b4EiXGeuaLAQWL2YmyDgMp2aSpH9JHsEQg==}
dev: false
/ignore@5.2.4:
resolution: {integrity: sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==}
engines: {node: '>= 4'}
@ -2149,6 +2208,11 @@ packages:
engines: {node: '>=0.10.0'}
dev: true
/is-fullwidth-code-point@3.0.0:
resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==}
engines: {node: '>=8'}
dev: true
/is-glob@4.0.3:
resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==}
engines: {node: '>=0.10.0'}
@ -2174,15 +2238,24 @@ packages:
resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==}
dev: true
/js-beautify@1.14.9:
resolution: {integrity: sha512-coM7xq1syLcMyuVGyToxcj2AlzhkDjmfklL8r0JgJ7A76wyGMpJ1oA35mr4APdYNO/o/4YY8H54NQIJzhMbhBg==}
engines: {node: '>=12'}
/jackspeak@2.3.6:
resolution: {integrity: sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==}
engines: {node: '>=14'}
dependencies:
'@isaacs/cliui': 8.0.2
optionalDependencies:
'@pkgjs/parseargs': 0.11.0
dev: true
/js-beautify@1.14.11:
resolution: {integrity: sha512-rPogWqAfoYh1Ryqqh2agUpVfbxAhbjuN1SmU86dskQUKouRiggUTCO4+2ym9UPXllc2WAp0J+T5qxn7Um3lCdw==}
engines: {node: '>=14'}
hasBin: true
dependencies:
config-chain: 1.1.13
editorconfig: 1.0.4
glob: 8.1.0
nopt: 6.0.0
glob: 10.3.10
nopt: 7.2.0
dev: true
/js-tokens@4.0.0:
@ -2410,13 +2483,6 @@ packages:
brace-expansion: 1.1.11
dev: true
/minimatch@5.1.6:
resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==}
engines: {node: '>=10'}
dependencies:
brace-expansion: 2.0.1
dev: true
/minimatch@9.0.1:
resolution: {integrity: sha512-0jWhJpD/MdhPXwPuiRkCbfYfSKp2qnn2eOc279qI7f+osl/l+prKSrvhg157zSYvx/1nmgn2NqdT6k2Z7zSH9w==}
engines: {node: '>=16 || 14 >=14.17'}
@ -2431,13 +2497,18 @@ packages:
brace-expansion: 2.0.1
dev: true
/minipass@7.0.4:
resolution: {integrity: sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==}
engines: {node: '>=16 || 14 >=14.17'}
dev: true
/mlly@1.4.2:
resolution: {integrity: sha512-i/Ykufi2t1EZ6NaPLdfnZk2AX8cs0d+mTzVKuPfqPKPatxLApaBoxJQ9x1/uckXtrS/U5oisPMDkNs0yQTaBRg==}
dependencies:
acorn: 8.11.2
pathe: 1.1.1
pkg-types: 1.0.3
ufo: 1.3.1
ufo: 1.3.2
dev: true
/ms@2.1.2:
@ -2461,12 +2532,12 @@ packages:
resolution: {integrity: sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==}
dev: true
/nopt@6.0.0:
resolution: {integrity: sha512-ZwLpbTgdhuZUnZzjd7nb1ZV+4DoiC6/sfiVKok72ym/4Tlf+DFdlHYmT2JPmcNNWV6Pi3SDf1kT+A4r9RTuT9g==}
engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0}
/nopt@7.2.0:
resolution: {integrity: sha512-CVDtwCdhYIvnAzFoJ6NJ6dX3oga9/HyciQDnG1vQDjSLMeKLJ4A93ZqYKDrgYSr1FBY5/hMYC+2VCi24pgpkGA==}
engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0}
hasBin: true
dependencies:
abbrev: 1.1.1
abbrev: 2.0.0
dev: true
/normalize-package-data@6.0.0:
@ -2594,6 +2665,14 @@ packages:
resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==}
dev: true
/path-scurry@1.10.1:
resolution: {integrity: sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==}
engines: {node: '>=16 || 14 >=14.17'}
dependencies:
lru-cache: 10.0.2
minipass: 7.0.4
dev: true
/path-type@4.0.0:
resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==}
engines: {node: '>=8'}
@ -2690,8 +2769,8 @@ packages:
engines: {node: '>=6'}
dev: true
/quasar@2.13.1:
resolution: {integrity: sha512-Q8pNpjPOBn1K5IJ19daI3hAxwnXbHv9EyOiJIZFxA6W0KfVdJwcYJkDcmN2BtCdXxc3QmW8WEZ8+jz3/yp8X8g==}
/quasar@2.14.0:
resolution: {integrity: sha512-hxaQ/yd/qNGgpUrww4fQRSpklKnZN90HXhmhmPE5h+yFCcXreU+JgM3m/Mf6Qv7lMNQZQkYipgZ5Ja41DYkVUQ==}
engines: {node: '>= 10.18.1', npm: '>= 6.13.4', yarn: '>= 1.21.1'}
/querystringify@2.2.0:
@ -2779,8 +2858,8 @@ packages:
resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==}
dev: true
/sass@1.32.12:
resolution: {integrity: sha512-zmXn03k3hN0KaiVTjohgkg98C3UowhL1/VSGdj4/VAAiMKGQOE80PFPxFP2Kyq0OUskPKcY5lImkhBKEHlypJA==}
/sass@1.33.0:
resolution: {integrity: sha512-9v0MUXnSi62FtfjqcwZ+b8B9FIxdwFEb3FPUkjEPXWd0b5KcnPGSp2XF9WrzcH1ZxedfgJVTdA3A1j4eEj53xg==}
engines: {node: '>=8.9.0'}
hasBin: true
dependencies:
@ -2794,8 +2873,8 @@ packages:
xmlchars: 2.2.0
dev: true
/scule@1.0.0:
resolution: {integrity: sha512-4AsO/FrViE/iDNEPaAQlb77tf0csuq27EsVpy6ett584EcRTp6pTDLoGWVxCD77y5iU5FauOvhsI4o1APwPoSQ==}
/scule@1.1.0:
resolution: {integrity: sha512-vRUjqhyM/YWYzT+jsMk6tnl3NkY4A4soJ8uyh3O6Um+JXEQL9ozUCe7pqrxn3CSKokw0hw3nFStfskzpgYwR0g==}
dev: true
/semver@6.3.1:
@ -2831,6 +2910,11 @@ packages:
resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==}
dev: true
/signal-exit@4.1.0:
resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==}
engines: {node: '>=14'}
dev: true
/slash@3.0.0:
resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==}
engines: {node: '>=8'}
@ -2866,8 +2950,26 @@ packages:
resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==}
dev: true
/std-env@3.4.3:
resolution: {integrity: sha512-f9aPhy8fYBuMN+sNfakZV18U39PbalgjXG3lLB9WkaYTxijru61wb57V9wxxNthXM5Sd88ETBWi29qLAsHO52Q==}
/std-env@3.5.0:
resolution: {integrity: sha512-JGUEaALvL0Mf6JCfYnJOTcobY+Nc7sG/TemDRBqCA0wEr4DER7zDchaaixTlmOxAjG1uRJmX82EQcxwTQTkqVA==}
dev: true
/string-width@4.2.3:
resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==}
engines: {node: '>=8'}
dependencies:
emoji-regex: 8.0.0
is-fullwidth-code-point: 3.0.0
strip-ansi: 6.0.1
dev: true
/string-width@5.1.2:
resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==}
engines: {node: '>=12'}
dependencies:
eastasianwidth: 0.2.0
emoji-regex: 9.2.2
strip-ansi: 7.1.0
dev: true
/strip-ansi@6.0.1:
@ -2877,6 +2979,13 @@ packages:
ansi-regex: 5.0.1
dev: true
/strip-ansi@7.1.0:
resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==}
engines: {node: '>=12'}
dependencies:
ansi-regex: 6.0.1
dev: true
/strip-json-comments@3.1.1:
resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==}
engines: {node: '>=8'}
@ -2970,6 +3079,10 @@ packages:
typescript: 5.2.2
dev: true
/ts-debounce@4.0.0:
resolution: {integrity: sha512-+1iDGY6NmOGidq7i7xZGA4cm8DAa6fqdYcvO5Z6yBevH++Bdo9Qt/mN0TzHUgcCcKv1gmh9+W5dHqz8pMWbCbg==}
dev: false
/type-check@0.4.0:
resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==}
engines: {node: '>= 0.8.0'}
@ -3006,8 +3119,8 @@ packages:
resolution: {integrity: sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==}
dev: false
/ufo@1.3.1:
resolution: {integrity: sha512-uY/99gMLIOlJPwATcMVYfqDSxUR9//AUcgZMzwfSTJPDKzA1S8mX4VLqa+fiAtveraQUBCz4FFcwVZBGbwBXIw==}
/ufo@1.3.2:
resolution: {integrity: sha512-o+ORpgGwaYQXgqGDwd+hkS4PuZ3QnmqMMxRuajK/a38L6fTpcE5GPIfrf+L/KemFzfUpeUQc1rRS1iDBozvnFA==}
dev: true
/undici-types@5.26.5:
@ -3025,7 +3138,7 @@ packages:
mlly: 1.4.2
pathe: 1.1.1
pkg-types: 1.0.3
scule: 1.0.0
scule: 1.1.0
strip-literal: 1.3.0
unplugin: 1.5.0
transitivePeerDependencies:
@ -3108,7 +3221,7 @@ packages:
local-pkg: 0.4.3
mlly: 1.4.2
pathe: 1.1.1
scule: 1.0.0
scule: 1.1.0
unplugin: 1.5.0
vue-router: 4.2.5(vue@3.3.8)
yaml: 2.3.4
@ -3161,7 +3274,7 @@ packages:
spdx-expression-parse: 3.0.1
dev: true
/vite-node@0.34.6(@types/node@18.18.9)(sass@1.32.12):
/vite-node@0.34.6(@types/node@18.18.9)(sass@1.33.0):
resolution: {integrity: sha512-nlBMJ9x6n7/Amaz6F3zJ97EBwR2FkzhBRxF5e+jE6LA3yi6Wtc2lyTij1OnDMIr34v5g/tVQtsVAzhT0jc5ygA==}
engines: {node: '>=v14.18.0'}
hasBin: true
@ -3171,7 +3284,7 @@ packages:
mlly: 1.4.2
pathe: 1.1.1
picocolors: 1.0.0
vite: 4.5.0(@types/node@18.18.9)(sass@1.32.12)
vite: 4.5.0(@types/node@18.18.9)(sass@1.33.0)
transitivePeerDependencies:
- '@types/node'
- less
@ -3183,7 +3296,7 @@ packages:
- terser
dev: true
/vite@4.5.0(@types/node@18.18.9)(sass@1.32.12):
/vite@4.5.0(@types/node@18.18.9)(sass@1.33.0):
resolution: {integrity: sha512-ulr8rNLA6rkyFAlVWw2q5YJ91v098AFQ2R0PRFwPzREXOUJQPtFUG0t+/ZikhaOCDqFoDhN6/v8Sq0o4araFAw==}
engines: {node: ^14.18.0 || >=16.0.0}
hasBin: true
@ -3215,12 +3328,12 @@ packages:
esbuild: 0.18.20
postcss: 8.4.31
rollup: 3.29.4
sass: 1.32.12
sass: 1.33.0
optionalDependencies:
fsevents: 2.3.3
dev: true
/vitest@0.34.6(jsdom@22.1.0)(sass@1.32.12):
/vitest@0.34.6(jsdom@22.1.0)(sass@1.33.0):
resolution: {integrity: sha512-+5CALsOvbNKnS+ZHMXtuUC7nL8/7F1F2DnHGjSsszX8zCjWSSviphCb/NuS9Nzf4Q03KyyDRBAXhF/8lffME4Q==}
engines: {node: '>=v14.18.0'}
hasBin: true
@ -3269,12 +3382,12 @@ packages:
magic-string: 0.30.5
pathe: 1.1.1
picocolors: 1.0.0
std-env: 3.4.3
std-env: 3.5.0
strip-literal: 1.3.0
tinybench: 2.5.1
tinypool: 0.7.0
vite: 4.5.0(@types/node@18.18.9)(sass@1.32.12)
vite-node: 0.34.6(@types/node@18.18.9)(sass@1.32.12)
vite: 4.5.0(@types/node@18.18.9)(sass@1.33.0)
vite-node: 0.34.6(@types/node@18.18.9)(sass@1.33.0)
why-is-node-running: 2.2.2
transitivePeerDependencies:
- less
@ -3286,8 +3399,8 @@ packages:
- terser
dev: true
/vue-component-type-helpers@1.8.4:
resolution: {integrity: sha512-6bnLkn8O0JJyiFSIF0EfCogzeqNXpnjJ0vW/SZzNHfe6sPx30lTtTXlE5TFs2qhJlAtDFybStVNpL73cPe3OMQ==}
/vue-component-type-helpers@1.8.22:
resolution: {integrity: sha512-LK3wJHs3vJxHG292C8cnsRusgyC5SEZDCzDCD01mdE/AoREFMl2tzLRuzwyuEsOIz13tqgBcnvysN3Lxsa14Fw==}
dev: true
/vue-demi@0.14.6(vue@3.3.8):
@ -3423,6 +3536,24 @@ packages:
stackback: 0.0.2
dev: true
/wrap-ansi@7.0.0:
resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==}
engines: {node: '>=10'}
dependencies:
ansi-styles: 4.3.0
string-width: 4.2.3
strip-ansi: 6.0.1
dev: true
/wrap-ansi@8.1.0:
resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==}
engines: {node: '>=12'}
dependencies:
ansi-styles: 6.2.1
string-width: 5.1.2
strip-ansi: 7.1.0
dev: true
/wrappy@1.0.2:
resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==}
dev: true

View File

@ -32,70 +32,85 @@
</div>
</div>
<div class="row q-pa-lg items-center justify-evenly q-col-gutter-md">
<div class="col-12">
<div class="row items-center justify-evenly">
<div class="col-4">
<q-input filled v-model="search" label="Search for games..." />
<div class="q-mx-auto" style="max-width: 70vw;">
<div class="row q-pa-lg items-center justify-evenly q-col-gutter-md">
<div class="col-12">
<div class="row items-center justify-evenly">
<div class="col-4">
<q-input filled v-model="search" label="Search for games..." />
</div>
</div>
</div>
</div>
<div class="col" v-for="(game, index) of filtered_games" :key="game.id" :style="{ 'max-width': '500px' }">
<q-card flat bordered>
<q-card-section horizontal>
<q-card-section>
<div class="text-h5 q-mt-sm q-mb-xs">{{ game.name }}</div>
<div class="text-caption text-grey">
{{ game.short_description }}
</div>
<div class="col" v-for="(game, index) of filtered_games" :key="game.id" :style="{ 'max-width': '500px' }">
<q-card flat bordered>
<q-card-section horizontal>
<q-card-section>
<q-badge v-if="game.is_local" outline color="orange">
<div class="text-weight-bold q-my-xs">Local Game</div>
</q-badge>
<div class="text-h5 q-mt-sm q-mb-xs">{{ game.name }}</div>
<div class="text-caption text-grey">
{{ game.short_description }}
</div>
</q-card-section>
<q-space></q-space>
<q-card-section class="col-5 flex justify-end">
<q-avatar square size="100px">
<q-img
:src="`https://picsum.photos/200/200?_=${index}`"
width="100%"
height="100%"
/>
</q-avatar>
</q-card-section>
</q-card-section>
<q-space></q-space>
<q-separator />
<q-card-section class="col-5 flex justify-end">
<q-avatar square size="100px">
<q-img
:src="`https://picsum.photos/200/200?_=${index}`"
width="100%"
height="100%"
/>
</q-avatar>
</q-card-section>
</q-card-section>
<q-card-actions>
<q-btn flat icon="help" @click="selected_game = game">
<q-tooltip>
Learn more...
</q-tooltip>
</q-btn>
<template v-if="game.is_local">
<q-btn flat icon="edit" color="green" :loading="loading">
<q-tooltip>
Edit
</q-tooltip>
</q-btn>
<q-btn flat icon="delete" color="red" :loading="loading" @click="deleteGameInternal(game.id)">
<q-tooltip>
Delete
</q-tooltip>
</q-btn>
<q-separator />
<q-space/>
<q-card-actions>
<q-btn flat icon="help" @click="selected_game = game">
<q-tooltip>
Learn more...
</q-tooltip>
</q-btn>
<q-btn flat icon="edit" color="green">
<q-tooltip>
Edit
</q-tooltip>
</q-btn>
<q-btn flat icon="delete" color="red">
<q-tooltip>
Delete
</q-tooltip>
</q-btn>
<q-space/>
<q-btn flat color="blue" icon="download" label="Export" />
</q-card-actions>
</q-card>
<q-btn flat color="blue" icon="download" label="Export" />
</template>
<template v-else>
<q-btn flat icon="content_copy" color="green" :loading="loading" :disabled="localGames.hasGame(game.id)" @click="saveGameInternal(game)">
<q-tooltip>
Copy to local
</q-tooltip>
</q-btn>
</template>
</q-card-actions>
</q-card>
</div>
</div>
</div>
<q-dialog v-model="learn_more">
<q-card style="min-width: 700px; max-width: 80vw; min-height: 10vh; max-height: 80vh;">
<q-card-section class="row items-start">
<q-card-section class="row items-start q-col-gutter-md">
<div class="col-2">
<q-avatar square size="200px">
<q-avatar square size="200px" style="width: 100%; height: auto; aspect-ratio: 1/1;">
<q-img
src="https://picsum.photos/200/200"
width="100%"
@ -124,9 +139,39 @@ import {
} from '@/js/ParseGamesJSON.js';
import BingoGame from '@/js/lib/BingoGame.ts';
// Local game store
import {
useLocalGamesStore
} from '@/stores/local-games.ts';
const localGames = useLocalGamesStore();
// All games
const games = ref<BingoGame[]>(Array.from(parsed_games.values()));
const loading = ref<boolean>(false);
onMounted(async() => {
await localGames.fetchGames();
});
async function saveGameInternal(game: BingoGame) {
loading.value = true;
localGames.addGame(game);
// await saveGame(game);
// local_games.value = await getLocalGames();
loading.value = false;
}
async function deleteGameInternal(id: string) {
loading.value = true;
localGames.deleteGame(id);
loading.value = false;
}
// Selected game
const selected_game = ref<BingoGame | undefined>(undefined);
@ -136,9 +181,16 @@ const learn_more = ref<boolean>(false);
// Search query
const search = ref<string>('');
const combined_games = computed(() => {
return [
...games.value,
...localGames.games.values()
];
});
// Filter games by search
const filtered_games = computed(() => {
return games.value.filter(game => game.name.toLocaleLowerCase().includes(search.value.toLocaleLowerCase()));
return combined_games.value.filter(game => game.name.toLocaleLowerCase().includes(search.value.toLocaleLowerCase()));
});
// On selected game change, open popup
@ -153,3 +205,4 @@ watch(learn_more, newValue => {
selected_game.value = undefined;
});
</script>
@/js/lib/LocalGames

View File

@ -9,33 +9,89 @@
>
<template v-slot:header-goal="prop">
<div class="row items-center">
<q-btn v-if="editMode" icon="edit" flat round size="sm" color="orange"/>
<div>{{ prop.node.label }}</div>
<q-badge outline v-for="tag in prop.node.goal.tags" :key="tag" :color="getColorForTag(tag)" class="q-ml-sm">
<div class="text-weight-bold">{{ tag }}</div>
<div class="text-weight-bold q-my-xs">{{ tag }}</div>
</q-badge>
</div>
</template>
<template v-slot:header-goal-list="prop">
<div class="row items-center">
<q-btn v-if="editMode" icon="edit" flat round size="sm" color="orange"/>
<div>{{ prop.node.label }}</div>
<q-badge outline color="orange" class="q-ml-sm">
<div class="text-weight-bold q-my-xs">Goal List</div>
</q-badge>
</div>
</template>
<template v-slot:header-category="prop">
<div class="row items-center">
<q-btn v-if="editMode" icon="edit" flat round size="sm" color="orange"/>
<div>{{ prop.node.label }}</div>
<q-badge outline color="blue" class="q-ml-sm">
<div class="text-weight-bold q-my-xs">Category</div>
</q-badge>
</div>
</template>
<!-- Add Goal -->
<template v-slot:header-add-goal="prop">
<div class="row items-center">
<q-btn outline icon="add" label="Goal" color="light-blue" size="sm"></q-btn>
</div>
</template>
<!-- Add Goal List -->
<template v-slot:header-add-goal-list="prop">
<div class="row items-center">
<q-btn outline icon="add" label="Goal List" color="light-blue" size="sm"></q-btn>
</div>
</template>
<!-- Add Category -->
<template v-slot:header-add-category="prop">
<div class="row items-center">
<q-btn outline icon="add" label="Category" color="light-blue" size="sm"></q-btn>
</div>
</template>
</q-tree>
</template>
<script setup lang="ts">
import {
games
} from '@/js/ParseGamesJSON.ts';
interface Node {
label: string;
header?: string; // 'goal' | 'goal-list' | 'category' | 'add-goal' | 'add-goal-list' | 'add-category'
children?: Node[];
goal?: BingoGoal;
tickable?: boolean;
noTick?: boolean;
}
import BingoCategory from '@/js/lib/BingoCategory.ts';
import type BingoGoal from '@/js/lib/BingoGoal.ts';
import BingoGoalList from '@/js/lib/BingoGoalList.ts';
interface Node {
label: string;
header?: string;
children?: Node[];
goal?: BingoGoal;
}
import {
useLocalGamesStore
} from '@/stores/local-games.ts';
const localGames = useLocalGamesStore();
const selected = ref([]);
const ticked = ref([]);
const expanded = ref([]);
onMounted(async() => {
await localGames.fetchGames();
});
const {
editMode
} = defineProps({
editMode: Boolean
});
const selected = ref<Node[]>([]);
const ticked = ref<Node[]>([]);
const expanded = ref<Node[]>([]);
const getColorForTag = (tag: string) => {
switch (tag) {
@ -50,52 +106,140 @@ const getColorForTag = (tag: string) => {
}
};
const getAllGoals = (node: Node): BingoGoal[] => {
const goals: BingoGoal[] = [];
if (node.children) {
for (const child of node.children) {
goals.push(...getAllGoals(child));
}
}
else if (node.goal) {
goals.push(node.goal);
}
return goals;
};
// eslint-disable-next-line @typescript-eslint/no-unused-vars
const selectByTag = (tag: string) => {
ticked.value.length = 0;
ticked.value.push(...nodes.value.filter(node => {
return getAllGoals(node).map(goal => goal.tags.includes(tag));
}));
console.log(ticked.value);
};
const nodes = computed(() => {
return games.map(game => {
return localGames.games.map(game => {
const game_node: Node = {
label: game.name,
children: []
children: [],
tickable: !editMode,
noTick: editMode
};
game_node.children = game.items.map(item => {
const is_category = item instanceof BingoCategory;
const is_goal_list = item instanceof BingoGoalList;
const group_node: Node = {
label: item.name,
children: []
header: is_category
? 'category'
: is_goal_list
? 'goal-list'
: '',
children: [],
tickable: !editMode,
noTick: editMode
};
if (item instanceof BingoCategory) {
if (is_category) {
group_node.children = item.goal_lists.map(goal_list => {
const goal_list_node: Node = {
label: goal_list.name,
children: goal_list.goals.map(goal => {
const goal_node: Node = {
label: goal.name,
header: 'goal',
goal
};
return goal_node;
})
header: 'goal-list',
children: [],
tickable: !editMode,
noTick: editMode
};
goal_list_node.children?.push(...goal_list.goals.map(goal => {
const goal_node: Node = {
label: goal.name,
header: 'goal',
goal,
tickable: !editMode,
noTick: editMode
};
return goal_node;
}));
if (editMode) {
goal_list_node.children?.push({
label: 'Add Goal',
header: 'add-goal',
tickable: false,
noTick: true
});
}
return goal_list_node;
});
if (editMode) {
group_node.children?.push({
label: 'Add Goal List',
header: 'add-goal-list',
tickable: false,
noTick: true
});
}
}
else if (item instanceof BingoGoalList) {
else if (is_goal_list) {
group_node.children = item.goals.map(goal => {
const goal_node: Node = {
label: goal.name,
header: 'goal',
goal
goal,
tickable: !editMode,
noTick: editMode
};
return goal_node;
});
if (editMode) {
group_node.children.push({
label: 'Add Goal',
header: 'add-goal',
tickable: false,
noTick: true
});
}
}
return group_node;
});
if (editMode) {
game_node.children.push({
label: 'Add Goal List',
header: 'add-goal-list',
tickable: false,
noTick: true
});
game_node.children.push({
label: 'Add Category',
header: 'add-category',
tickable: false,
noTick: true
});
}
return game_node;
});
});

View File

@ -1,16 +1,26 @@
// Example code to convert the old format to the new one
import json from './games.json';
import new_game from './new_game.json';
import markdown_text from '@/js/testmarkdown.js';
import BingoGame from '@/js/lib/BingoGame.ts';
import BingoGoal from '@/js/lib/BingoGoal.ts';
import BingoCategory from '@/js/lib/BingoCategory.ts';
import BingoGoalList from '@/js/lib/BingoGoalList.ts';
import Parser from '@/js/lib/Parser.ts';
export const games: BingoGame[] = [];
// export const games: Map<string, BingoGame> = new Map;
async function run_new_format() {
games.length = 0;
games.push(Parser.from_json(JSON.stringify(new_game)));
}
run_new_format();
function run_old_format() {
games.length = 0;
for (const j_game of json) {
const game = new BingoGame(
j_game.game_name,
@ -57,4 +67,4 @@ function run_old_format() {
// console.log(goals);
}
run_old_format();
// run_old_format();

View File

@ -5,7 +5,7 @@ import BingoGoalList from '@/js/lib/BingoGoalList.ts';
import SuccessResponse from '@/js/lib/SuccessResponse.ts';
import Util from '@/js/lib/Util.ts';
import {
Transform, plainToInstance, type TransformFnParams
Transform, plainToInstance, type TransformFnParams, Exclude
} from 'class-transformer';
type BingoCategoryOrGoalList = BingoCategory | BingoGoalList;
@ -34,6 +34,9 @@ export default class BingoGame {
generator: 'simple' | 'srl_v5' | 'srl_v8' = 'simple';
@Exclude()
is_local: boolean = false;
constructor(
id: string,
name: string,

46
src/js/lib/LocalGames.ts Normal file
View File

@ -0,0 +1,46 @@
import type BingoGame from '@/js/lib/BingoGame.ts';
import Parser from '@/js/lib/Parser.ts';
import {
get, set
} from 'idb-keyval';
// export async function getLocalGames(): Promise<Map<string, BingoGame>> {
// let games_array: BingoGame[] | undefined = await get('games');
// if (!Array.isArray(games_array)) {
// await set('games', games_array = new Array);
// }
// const games = new Map<string, BingoGame>();
// games_array.forEach(game => {
// game.is_local = true;
// games.set(game.id, game);
// });
// return games;
// }
// export async function getGameByID(id: string): Promise<BingoGame | undefined> {
// const games = await getLocalGames();
// return games.get(id);
// }
// async function saveGames(games: Map<string, BingoGame>) {
// await set('games', Array.from(games.values()).map(game => Parser.to_json(game)));
// }
// export async function saveGame(game: BingoGame) {
// // For testing this is important so we don't mess with the original BingoGame instance
// const clone = Parser.from_json(JSON.stringify(Parser.to_json(game)));
// const games = await getLocalGames();
// games.set(game.id, clone);
// await saveGames(games);
// }
// export async function deleteGame(id: string) {
// const games = await getLocalGames();
// games.delete(id);
// await saveGames(games);
// }

View File

@ -4,6 +4,12 @@ import {
} from 'class-transformer';
export default class Parser {
static from_json_raw(input: JSON): BingoGame {
const game = plainToInstance(BingoGame, input);
return game;
}
static from_json(input: string): BingoGame {
const json: JSON = JSON.parse(input);
const game = plainToInstance(BingoGame, json);

3160
src/js/new_game.json Normal file

File diff suppressed because it is too large Load Diff

View File

@ -1,73 +0,0 @@
[
{
"id": "yakuza_0",
"name": "Yakuza 0",
"short_description": "The funny game we used for all bingos.",
"description": "Very long text here haha lmao",
"generator": "simple",
"goals": [
{
"name": "Defeat 50 enemies on the street",
"tags": [
"Easy"
],
"possible_spaces": [
1
],
"group_id": "1"
},
{
"name": "Defeat 150 enemies on the street",
"tags": [
"Normal"
],
"possible_spaces": [
0,
2
],
"group_id": "2"
},
{
"name": "Defeat 300 enemies on the street",
"tags": [
"Hard"
],
"possible_spaces": [
0,
3,
4,
6,
7,
10,
12,
15,
17,
18,
20,
22
],
"group_id": "3"
}
],
"groups": [
{
"name": "1"
},
{
"name": "2",
"parent_id": "1"
},
{
"name": "3",
"parent_id": "2"
},
{
"name": "Battle"
},
{
"name": "Defeat enemies on the street",
"parent_id": "Battle"
}
]
}
]

File diff suppressed because it is too large Load Diff

View File

@ -4,6 +4,7 @@ import {
import {
createPinia
} from 'pinia';
import DebouncePlugin from '@/plugins/debounce.ts';
import '@/assets/main.css';
@ -24,12 +25,16 @@ import router from './router';
const app = createApp(App);
const pinia = createPinia();
pinia.use(DebouncePlugin);
app.use(Quasar, {
config: {
dark: true
}
});
app.use(createPinia());
// app.use(createPinia());
app.use(pinia);
app.use(router);
app.mount('#app');

23
src/plugins/debounce.ts Normal file
View File

@ -0,0 +1,23 @@
import {
debounce
} from 'ts-debounce';
const DebouncePlugin = (({
options, store
}: any) => {
if (options.debounce) {
// we are overriding the actions with new ones
return Object.keys(options.debounce).reduce((debouncedActions, action) => {
// @ts-ignore
debouncedActions[action] = debounce(
store[action],
options.debounce[action]
);
return debouncedActions;
}, {
});
}
});
export default DebouncePlugin;

110
src/stores/local-games.ts Normal file
View File

@ -0,0 +1,110 @@
import BingoGame from '@/js/lib/BingoGame.ts';
import {
defineStore
} from 'pinia';
import {
get, set
} from 'idb-keyval';
import Parser from '@/js/lib/Parser.ts';
/*
* TODO: Is an array for games really better?
* Wouldn't a map make more sense since we have direct ID => Game access?
*/
export const useLocalGamesStore = defineStore('localGames', () => {
const games: Ref<BingoGame[]> = ref([]);
async function fetchGames() {
console.info('--- Fetching games ...');
let games_array: JSON[] | undefined = await get('games');
if (!Array.isArray(games_array)) {
await set('games', games_array = new Array);
}
games.value.length = 0;
console.log(games_array);
games.value = games_array.map(game => {
const bingo_game = Parser.from_json_raw(game);
bingo_game.is_local = true;
return bingo_game;
});
// games_array.forEach(game => {
// game = Parser.from_json(JSON.stringify(game));
// game.is_local = true;
// games.value.set(game.id, game);
// });
console.info('--- Finished fetching games!');
console.info('');
console.log(games.value);
}
async function saveGames() {
console.info('--- Saving games ...');
await set('games', Array.from(games.value.values()).map(
game => Parser.to_json(game)
));
console.info('--- Finished saving games!');
console.info('');
}
function hasGame(id: string): boolean {
return games.value.some(game => game.id === id);
}
function addGame(game: BingoGame) {
if (hasGame(game.id)) {
console.error(`Failed to clone game with ID ${ game.id } because it already exists`);
return;
}
console.info(`--- Adding game with ID '${ game.id }' ...`);
const cloned_game = Parser.from_json(JSON.stringify(Parser.to_json(game)));
cloned_game.is_local = true;
games.value.push(cloned_game);
saveGames();
}
function deleteGame(id: string) {
if (hasGame(id)) {
console.error(`Failed to delete game with ID ${ id } because it doesn't exist`);
return;
}
console.info(`--- Deleting game with ID '${ id }' ...`);
games.value = games.value.filter(game => game.id !== id);
saveGames();
}
return {
games,
fetchGames,
saveGames,
hasGame,
addGame,
deleteGame
};
}, {
debounce: {
fetchGames: 0,
saveGames: 500
}
});

View File

@ -0,0 +1,18 @@
import BingoGame from '@/js/lib/BingoGame.ts';
import {
defineStore
} from 'pinia';
export const useRemoteGamesStore = defineStore('remoteGames', () => {
const games: Ref<BingoGame[]> = ref([]);
async function fetchGames() {
// TODO: Fetch games from server
}
return {
games,
fetchGames
};
});

View File

@ -1,10 +1,18 @@
<template>
<div class="q-pa-md q-gutter-md">
<q-card class="q-mx-auto" style="max-width: 800px; height: 800px;">
<q-scroll-area style="height: 100%;">
<GeneratorComponent />
</q-scroll-area>
</q-card>
<div class="row justify-around">
<q-card class="col-6" style="max-width: 800px; height: 800px;">
<q-scroll-area style="height: 100%;">
<GeneratorComponent />
</q-scroll-area>
</q-card>
<q-card class="col-6" style="max-width: 800px; height: 800px;">
<q-scroll-area style="height: 100%;">
<GeneratorComponent :edit-mode="true" />
</q-scroll-area>
</q-card>
</div>
</div>
</template>

View File

@ -4,6 +4,7 @@
"env.d.ts",
"components.d.ts",
"auto-imports.d.ts",
"custom.d.ts",
"src/**/*",
"src/**/*.vue",
"src/**/*.json"
@ -19,6 +20,7 @@
"./src/*"
]
},
"outDir": "generated",
"target": "ESNext",
"emitDecoratorMetadata": true,
"experimentalDecorators": true,

File diff suppressed because one or more lines are too long

View File

@ -9,9 +9,6 @@ import vue from '@vitejs/plugin-vue';
import vueJsx from '@vitejs/plugin-vue-jsx';
import Components from 'unplugin-vue-components/vite';
import {
QuasarResolver
} from 'unplugin-vue-components/resolvers';
import {
quasar, transformAssetUrls
@ -25,7 +22,6 @@ export default defineConfig({
plugins: [
VueRouter(),
Components({
resolvers: [ QuasarResolver() ],
dts: true
}),
AutoImport({
@ -39,7 +35,6 @@ export default defineConfig({
'vue',
'vue-router'
],
dirs: [ './src/components/**' ],
dts: true,
eslintrc: {
enabled: true