1
0
Fork 0
forked from Kispi/Core

feat(core): add companies and csv data import
All checks were successful
continuous-integration/drone/push Build is passing

This commit is contained in:
Simon Giesel 2023-07-07 00:10:50 +02:00
parent 9a092e9324
commit 4f80b7e895
11 changed files with 556 additions and 347 deletions

View file

@ -1,59 +1,4 @@
[
{
"id": "w85pgrtrmovf916",
"name": "transactions",
"type": "base",
"system": false,
"schema": [
{
"id": "5aeh5giq",
"name": "account",
"type": "relation",
"system": false,
"required": true,
"options": {
"collectionId": "74ftooxenpeq14b",
"cascadeDelete": false,
"minSelect": null,
"maxSelect": 1,
"displayFields": [
"firstName",
"lastName"
]
}
},
{
"id": "2bzqyeuk",
"name": "label",
"type": "text",
"system": false,
"required": true,
"options": {
"min": null,
"max": null,
"pattern": ""
}
},
{
"id": "zsx9i8w7",
"name": "amount",
"type": "number",
"system": false,
"required": false,
"options": {
"min": null,
"max": null
}
}
],
"indexes": [],
"listRule": "",
"viewRule": "",
"createRule": "",
"updateRule": null,
"deleteRule": null,
"options": {}
},
{
"id": "t4gewf713jqhz3i",
"name": "settings",
@ -113,12 +58,148 @@
"deleteRule": null,
"options": {}
},
{
"id": "w85pgrtrmovf916",
"name": "transactions",
"type": "base",
"system": false,
"schema": [
{
"id": "5aeh5giq",
"name": "account",
"type": "relation",
"system": false,
"required": true,
"options": {
"collectionId": "74ftooxenpeq14b",
"cascadeDelete": false,
"minSelect": null,
"maxSelect": 1,
"displayFields": [
"firstName",
"lastName"
]
}
},
{
"id": "2bzqyeuk",
"name": "label",
"type": "text",
"system": false,
"required": true,
"options": {
"min": null,
"max": null,
"pattern": ""
}
},
{
"id": "zsx9i8w7",
"name": "amount",
"type": "number",
"system": false,
"required": false,
"options": {
"min": null,
"max": null
}
}
],
"indexes": [],
"listRule": "",
"viewRule": "",
"createRule": "",
"updateRule": null,
"deleteRule": null,
"options": {}
},
{
"id": "c3zz98wpbn7m6zw",
"name": "accountsList",
"type": "view",
"system": false,
"schema": [
{
"id": "1bun3uqx",
"name": "accountNumber",
"type": "text",
"system": false,
"required": false,
"options": {
"min": null,
"max": null,
"pattern": ""
}
},
{
"id": "wxxggcda",
"name": "name",
"type": "json",
"system": false,
"required": false,
"options": {}
},
{
"id": "bvxbuhbg",
"name": "grade",
"type": "text",
"system": false,
"required": true,
"options": {
"min": null,
"max": null,
"pattern": ""
}
},
{
"id": "ej2e7wwa",
"name": "lastCheckIn",
"type": "date",
"system": false,
"required": false,
"options": {
"min": "",
"max": ""
}
},
{
"id": "ggzmwskm",
"name": "balance",
"type": "json",
"system": false,
"required": false,
"options": {}
}
],
"indexes": [],
"listRule": null,
"viewRule": null,
"createRule": null,
"updateRule": null,
"deleteRule": null,
"options": {
"query": "SELECT\n a.id AS id,\n a.accountNumber AS accountNumber,\n (a.firstName || ' ' || a.lastName) AS name,\n a.grade AS grade,\n a.lastCheckIn AS lastCheckIn,\n SUM(t.amount) AS balance\nFROM\n accounts AS a\nLEFT JOIN\n transactions AS t\nON\n a.id = t.account\nGROUP BY\n a.id\nORDER BY\n a.grade, a.lastName"
}
},
{
"id": "s854d2w72fvyl54",
"name": "companies",
"type": "auth",
"system": false,
"schema": [],
"schema": [
{
"id": "cvcgnf4x",
"name": "name",
"type": "text",
"system": false,
"required": true,
"options": {
"min": null,
"max": null,
"pattern": ""
}
}
],
"indexes": [],
"listRule": null,
"viewRule": null,
@ -206,7 +287,7 @@
"name": "company",
"type": "relation",
"system": false,
"required": true,
"required": false,
"options": {
"collectionId": "s854d2w72fvyl54",
"cascadeDelete": false,
@ -248,73 +329,5 @@
"updateRule": "(@request.data.id = null && @request.data.accountNumber = null && @request.data.firstName = null && @request.data.lastName = null && @request.data.grade = null && @request.data.created = null && @request.data.updated = null && @request.data.company = null && @request.data.shift = null && @request.data.wageFactor = null) || (@request.data.id = null && @request.data.accountNumber = null && @request.data.firstName = null && @request.data.lastName = null && @request.data.created = null && @request.data.updated = null && @request.data.company = null && @request.auth.id = company.id)",
"deleteRule": null,
"options": {}
},
{
"id": "c3zz98wpbn7m6zw",
"name": "accountsList",
"type": "view",
"system": false,
"schema": [
{
"id": "jt2uello",
"name": "accountNumber",
"type": "text",
"system": false,
"required": false,
"options": {
"min": null,
"max": null,
"pattern": ""
}
},
{
"id": "4f91nhpf",
"name": "name",
"type": "json",
"system": false,
"required": false,
"options": {}
},
{
"id": "wjpwvg9r",
"name": "grade",
"type": "text",
"system": false,
"required": true,
"options": {
"min": null,
"max": null,
"pattern": ""
}
},
{
"id": "fpfm6h6j",
"name": "lastCheckIn",
"type": "date",
"system": false,
"required": false,
"options": {
"min": "",
"max": ""
}
},
{
"id": "t6bhf98j",
"name": "balance",
"type": "json",
"system": false,
"required": false,
"options": {}
}
],
"indexes": [],
"listRule": null,
"viewRule": null,
"createRule": null,
"updateRule": null,
"deleteRule": null,
"options": {
"query": "SELECT\n a.id AS id,\n a.accountNumber AS accountNumber,\n (a.firstName || ' ' || a.lastName) AS name,\n a.grade AS grade,\n a.lastCheckIn AS lastCheckIn,\n SUM(t.amount) AS balance\nFROM\n accounts AS a\nLEFT JOIN\n transactions AS t\nON\n a.id = t.account\nGROUP BY\n a.id\nORDER BY\n a.grade, a.lastName"
}
}
]

View file

@ -15,17 +15,17 @@
"@heroicons/vue": "^2.0.18",
"@vueuse/core": "^10.2.1",
"canvas-confetti": "^1.6.0",
"daisyui": "^3.1.7",
"daisyui": "^3.1.9",
"pocketbase": "^0.15.2",
"vue": "^3.3.4",
"vue-router": "4.2.2"
"vue-router": "4.2.4"
},
"devDependencies": {
"@tailwindcss/container-queries": "^0.1.1",
"@tailwindcss/typography": "^0.5.9",
"@types/canvas-confetti": "^1.6.0",
"@typescript-eslint/eslint-plugin": "^5.60.1",
"@typescript-eslint/parser": "^5.60.1",
"@typescript-eslint/eslint-plugin": "^5.61.0",
"@typescript-eslint/parser": "^5.61.0",
"@vitejs/plugin-vue": "^4.2.3",
"autoprefixer": "^10.4.14",
"eslint": "^8.44.0",
@ -33,13 +33,13 @@
"eslint-plugin-vue": "^9.15.1",
"eslint-plugin-vue-scoped-css": "^2.5.0",
"pocketbase-typegen": "^1.1.11",
"postcss": "^8.4.24",
"postcss": "^8.4.25",
"sass": "^1.63.6",
"svgo": "^3.0.2",
"tailwindcss": "^3.3.2",
"typescript": "^5.1.6",
"vite": "^4.3.9",
"vite": "^4.4.1",
"vue-eslint-parser": "^9.3.1",
"vue-tsc": "^1.8.3"
"vue-tsc": "^1.8.4"
}
}

View file

@ -15,8 +15,8 @@ dependencies:
specifier: ^1.6.0
version: 1.6.0
daisyui:
specifier: ^3.1.7
version: 3.1.7(postcss@8.4.24)
specifier: ^3.1.9
version: 3.1.9(postcss@8.4.25)
pocketbase:
specifier: ^0.15.2
version: 0.15.2
@ -24,8 +24,8 @@ dependencies:
specifier: ^3.3.4
version: 3.3.4
vue-router:
specifier: 4.2.2
version: 4.2.2(vue@3.3.4)
specifier: 4.2.4
version: 4.2.4(vue@3.3.4)
devDependencies:
'@tailwindcss/container-queries':
@ -38,17 +38,17 @@ devDependencies:
specifier: ^1.6.0
version: 1.6.0
'@typescript-eslint/eslint-plugin':
specifier: ^5.60.1
version: 5.60.1(@typescript-eslint/parser@5.60.1)(eslint@8.44.0)(typescript@5.1.6)
specifier: ^5.61.0
version: 5.61.0(@typescript-eslint/parser@5.61.0)(eslint@8.44.0)(typescript@5.1.6)
'@typescript-eslint/parser':
specifier: ^5.60.1
version: 5.60.1(eslint@8.44.0)(typescript@5.1.6)
specifier: ^5.61.0
version: 5.61.0(eslint@8.44.0)(typescript@5.1.6)
'@vitejs/plugin-vue':
specifier: ^4.2.3
version: 4.2.3(vite@4.3.9)(vue@3.3.4)
version: 4.2.3(vite@4.4.1)(vue@3.3.4)
autoprefixer:
specifier: ^10.4.14
version: 10.4.14(postcss@8.4.24)
version: 10.4.14(postcss@8.4.25)
eslint:
specifier: ^8.44.0
version: 8.44.0
@ -65,8 +65,8 @@ devDependencies:
specifier: ^1.1.11
version: 1.1.11
postcss:
specifier: ^8.4.24
version: 8.4.24
specifier: ^8.4.25
version: 8.4.25
sass:
specifier: ^1.63.6
version: 1.63.6
@ -80,14 +80,14 @@ devDependencies:
specifier: ^5.1.6
version: 5.1.6
vite:
specifier: ^4.3.9
version: 4.3.9(sass@1.63.6)
specifier: ^4.4.1
version: 4.4.1(sass@1.63.6)
vue-eslint-parser:
specifier: ^9.3.1
version: 9.3.1(eslint@8.44.0)
vue-tsc:
specifier: ^1.8.3
version: 1.8.3(typescript@5.1.6)
specifier: ^1.8.4
version: 1.8.4(typescript@5.1.6)
packages:
@ -118,8 +118,8 @@ packages:
'@babel/helper-validator-identifier': 7.18.6
to-fast-properties: 2.0.0
/@esbuild/android-arm64@0.17.19:
resolution: {integrity: sha512-KBMWvEZooR7+kzY0BtbTQn0OAYY7CsiydT63pVEaPtVYF0hXbUaOyZog37DKxK7NF3XacBJOpYT4adIJh+avxA==}
/@esbuild/android-arm64@0.18.11:
resolution: {integrity: sha512-snieiq75Z1z5LJX9cduSAjUr7vEI1OdlzFPMw0HH5YI7qQHDd3qs+WZoMrWYDsfRJSq36lIA6mfZBkvL46KoIw==}
engines: {node: '>=12'}
cpu: [arm64]
os: [android]
@ -127,8 +127,8 @@ packages:
dev: true
optional: true
/@esbuild/android-arm@0.17.19:
resolution: {integrity: sha512-rIKddzqhmav7MSmoFCmDIb6e2W57geRsM94gV2l38fzhXMwq7hZoClug9USI2pFRGL06f4IOPHHpFNOkWieR8A==}
/@esbuild/android-arm@0.18.11:
resolution: {integrity: sha512-q4qlUf5ucwbUJZXF5tEQ8LF7y0Nk4P58hOsGk3ucY0oCwgQqAnqXVbUuahCddVHfrxmpyewRpiTHwVHIETYu7Q==}
engines: {node: '>=12'}
cpu: [arm]
os: [android]
@ -136,8 +136,8 @@ packages:
dev: true
optional: true
/@esbuild/android-x64@0.17.19:
resolution: {integrity: sha512-uUTTc4xGNDT7YSArp/zbtmbhO0uEEK9/ETW29Wk1thYUJBz3IVnvgEiEwEa9IeLyvnpKrWK64Utw2bgUmDveww==}
/@esbuild/android-x64@0.18.11:
resolution: {integrity: sha512-iPuoxQEV34+hTF6FT7om+Qwziv1U519lEOvekXO9zaMMlT9+XneAhKL32DW3H7okrCOBQ44BMihE8dclbZtTuw==}
engines: {node: '>=12'}
cpu: [x64]
os: [android]
@ -145,8 +145,8 @@ packages:
dev: true
optional: true
/@esbuild/darwin-arm64@0.17.19:
resolution: {integrity: sha512-80wEoCfF/hFKM6WE1FyBHc9SfUblloAWx6FJkFWTWiCoht9Mc0ARGEM47e67W9rI09YoUxJL68WHfDRYEAvOhg==}
/@esbuild/darwin-arm64@0.18.11:
resolution: {integrity: sha512-Gm0QkI3k402OpfMKyQEEMG0RuW2LQsSmI6OeO4El2ojJMoF5NLYb3qMIjvbG/lbMeLOGiW6ooU8xqc+S0fgz2w==}
engines: {node: '>=12'}
cpu: [arm64]
os: [darwin]
@ -154,8 +154,8 @@ packages:
dev: true
optional: true
/@esbuild/darwin-x64@0.17.19:
resolution: {integrity: sha512-IJM4JJsLhRYr9xdtLytPLSH9k/oxR3boaUIYiHkAawtwNOXKE8KoU8tMvryogdcT8AU+Bflmh81Xn6Q0vTZbQw==}
/@esbuild/darwin-x64@0.18.11:
resolution: {integrity: sha512-N15Vzy0YNHu6cfyDOjiyfJlRJCB/ngKOAvoBf1qybG3eOq0SL2Lutzz9N7DYUbb7Q23XtHPn6lMDF6uWbGv9Fw==}
engines: {node: '>=12'}
cpu: [x64]
os: [darwin]
@ -163,8 +163,8 @@ packages:
dev: true
optional: true
/@esbuild/freebsd-arm64@0.17.19:
resolution: {integrity: sha512-pBwbc7DufluUeGdjSU5Si+P3SoMF5DQ/F/UmTSb8HXO80ZEAJmrykPyzo1IfNbAoaqw48YRpv8shwd1NoI0jcQ==}
/@esbuild/freebsd-arm64@0.18.11:
resolution: {integrity: sha512-atEyuq6a3omEY5qAh5jIORWk8MzFnCpSTUruBgeyN9jZq1K/QI9uke0ATi3MHu4L8c59CnIi4+1jDKMuqmR71A==}
engines: {node: '>=12'}
cpu: [arm64]
os: [freebsd]
@ -172,8 +172,8 @@ packages:
dev: true
optional: true
/@esbuild/freebsd-x64@0.17.19:
resolution: {integrity: sha512-4lu+n8Wk0XlajEhbEffdy2xy53dpR06SlzvhGByyg36qJw6Kpfk7cp45DR/62aPH9mtJRmIyrXAS5UWBrJT6TQ==}
/@esbuild/freebsd-x64@0.18.11:
resolution: {integrity: sha512-XtuPrEfBj/YYYnAAB7KcorzzpGTvOr/dTtXPGesRfmflqhA4LMF0Gh/n5+a9JBzPuJ+CGk17CA++Hmr1F/gI0Q==}
engines: {node: '>=12'}
cpu: [x64]
os: [freebsd]
@ -181,8 +181,8 @@ packages:
dev: true
optional: true
/@esbuild/linux-arm64@0.17.19:
resolution: {integrity: sha512-ct1Tg3WGwd3P+oZYqic+YZF4snNl2bsnMKRkb3ozHmnM0dGWuxcPTTntAF6bOP0Sp4x0PjSF+4uHQ1xvxfRKqg==}
/@esbuild/linux-arm64@0.18.11:
resolution: {integrity: sha512-c6Vh2WS9VFKxKZ2TvJdA7gdy0n6eSy+yunBvv4aqNCEhSWVor1TU43wNRp2YLO9Vng2G+W94aRz+ILDSwAiYog==}
engines: {node: '>=12'}
cpu: [arm64]
os: [linux]
@ -190,8 +190,8 @@ packages:
dev: true
optional: true
/@esbuild/linux-arm@0.17.19:
resolution: {integrity: sha512-cdmT3KxjlOQ/gZ2cjfrQOtmhG4HJs6hhvm3mWSRDPtZ/lP5oe8FWceS10JaSJC13GBd4eH/haHnqf7hhGNLerA==}
/@esbuild/linux-arm@0.18.11:
resolution: {integrity: sha512-Idipz+Taso/toi2ETugShXjQ3S59b6m62KmLHkJlSq/cBejixmIydqrtM2XTvNCywFl3VC7SreSf6NV0i6sRyg==}
engines: {node: '>=12'}
cpu: [arm]
os: [linux]
@ -199,8 +199,8 @@ packages:
dev: true
optional: true
/@esbuild/linux-ia32@0.17.19:
resolution: {integrity: sha512-w4IRhSy1VbsNxHRQpeGCHEmibqdTUx61Vc38APcsRbuVgK0OPEnQ0YD39Brymn96mOx48Y2laBQGqgZ0j9w6SQ==}
/@esbuild/linux-ia32@0.18.11:
resolution: {integrity: sha512-S3hkIF6KUqRh9n1Q0dSyYcWmcVa9Cg+mSoZEfFuzoYXXsk6196qndrM+ZiHNwpZKi3XOXpShZZ+9dfN5ykqjjw==}
engines: {node: '>=12'}
cpu: [ia32]
os: [linux]
@ -208,8 +208,8 @@ packages:
dev: true
optional: true
/@esbuild/linux-loong64@0.17.19:
resolution: {integrity: sha512-2iAngUbBPMq439a+z//gE+9WBldoMp1s5GWsUSgqHLzLJ9WoZLZhpwWuym0u0u/4XmZ3gpHmzV84PonE+9IIdQ==}
/@esbuild/linux-loong64@0.18.11:
resolution: {integrity: sha512-MRESANOoObQINBA+RMZW+Z0TJWpibtE7cPFnahzyQHDCA9X9LOmGh68MVimZlM9J8n5Ia8lU773te6O3ILW8kw==}
engines: {node: '>=12'}
cpu: [loong64]
os: [linux]
@ -217,8 +217,8 @@ packages:
dev: true
optional: true
/@esbuild/linux-mips64el@0.17.19:
resolution: {integrity: sha512-LKJltc4LVdMKHsrFe4MGNPp0hqDFA1Wpt3jE1gEyM3nKUvOiO//9PheZZHfYRfYl6AwdTH4aTcXSqBerX0ml4A==}
/@esbuild/linux-mips64el@0.18.11:
resolution: {integrity: sha512-qVyPIZrXNMOLYegtD1u8EBccCrBVshxMrn5MkuFc3mEVsw7CCQHaqZ4jm9hbn4gWY95XFnb7i4SsT3eflxZsUg==}
engines: {node: '>=12'}
cpu: [mips64el]
os: [linux]
@ -226,8 +226,8 @@ packages:
dev: true
optional: true
/@esbuild/linux-ppc64@0.17.19:
resolution: {integrity: sha512-/c/DGybs95WXNS8y3Ti/ytqETiW7EU44MEKuCAcpPto3YjQbyK3IQVKfF6nbghD7EcLUGl0NbiL5Rt5DMhn5tg==}
/@esbuild/linux-ppc64@0.18.11:
resolution: {integrity: sha512-T3yd8vJXfPirZaUOoA9D2ZjxZX4Gr3QuC3GztBJA6PklLotc/7sXTOuuRkhE9W/5JvJP/K9b99ayPNAD+R+4qQ==}
engines: {node: '>=12'}
cpu: [ppc64]
os: [linux]
@ -235,8 +235,8 @@ packages:
dev: true
optional: true
/@esbuild/linux-riscv64@0.17.19:
resolution: {integrity: sha512-FC3nUAWhvFoutlhAkgHf8f5HwFWUL6bYdvLc/TTuxKlvLi3+pPzdZiFKSWz/PF30TB1K19SuCxDTI5KcqASJqA==}
/@esbuild/linux-riscv64@0.18.11:
resolution: {integrity: sha512-evUoRPWiwuFk++snjH9e2cAjF5VVSTj+Dnf+rkO/Q20tRqv+644279TZlPK8nUGunjPAtQRCj1jQkDAvL6rm2w==}
engines: {node: '>=12'}
cpu: [riscv64]
os: [linux]
@ -244,8 +244,8 @@ packages:
dev: true
optional: true
/@esbuild/linux-s390x@0.17.19:
resolution: {integrity: sha512-IbFsFbxMWLuKEbH+7sTkKzL6NJmG2vRyy6K7JJo55w+8xDk7RElYn6xvXtDW8HCfoKBFK69f3pgBJSUSQPr+4Q==}
/@esbuild/linux-s390x@0.18.11:
resolution: {integrity: sha512-/SlRJ15XR6i93gRWquRxYCfhTeC5PdqEapKoLbX63PLCmAkXZHY2uQm2l9bN0oPHBsOw2IswRZctMYS0MijFcg==}
engines: {node: '>=12'}
cpu: [s390x]
os: [linux]
@ -253,8 +253,8 @@ packages:
dev: true
optional: true
/@esbuild/linux-x64@0.17.19:
resolution: {integrity: sha512-68ngA9lg2H6zkZcyp22tsVt38mlhWde8l3eJLWkyLrp4HwMUr3c1s/M2t7+kHIhvMjglIBrFpncX1SzMckomGw==}
/@esbuild/linux-x64@0.18.11:
resolution: {integrity: sha512-xcncej+wF16WEmIwPtCHi0qmx1FweBqgsRtEL1mSHLFR6/mb3GEZfLQnx+pUDfRDEM4DQF8dpXIW7eDOZl1IbA==}
engines: {node: '>=12'}
cpu: [x64]
os: [linux]
@ -262,8 +262,8 @@ packages:
dev: true
optional: true
/@esbuild/netbsd-x64@0.17.19:
resolution: {integrity: sha512-CwFq42rXCR8TYIjIfpXCbRX0rp1jo6cPIUPSaWwzbVI4aOfX96OXY8M6KNmtPcg7QjYeDmN+DD0Wp3LaBOLf4Q==}
/@esbuild/netbsd-x64@0.18.11:
resolution: {integrity: sha512-aSjMHj/F7BuS1CptSXNg6S3M4F3bLp5wfFPIJM+Km2NfIVfFKhdmfHF9frhiCLIGVzDziggqWll0B+9AUbud/Q==}
engines: {node: '>=12'}
cpu: [x64]
os: [netbsd]
@ -271,8 +271,8 @@ packages:
dev: true
optional: true
/@esbuild/openbsd-x64@0.17.19:
resolution: {integrity: sha512-cnq5brJYrSZ2CF6c35eCmviIN3k3RczmHz8eYaVlNasVqsNY+JKohZU5MKmaOI+KkllCdzOKKdPs762VCPC20g==}
/@esbuild/openbsd-x64@0.18.11:
resolution: {integrity: sha512-tNBq+6XIBZtht0xJGv7IBB5XaSyvYPCm1PxJ33zLQONdZoLVM0bgGqUrXnJyiEguD9LU4AHiu+GCXy/Hm9LsdQ==}
engines: {node: '>=12'}
cpu: [x64]
os: [openbsd]
@ -280,8 +280,8 @@ packages:
dev: true
optional: true
/@esbuild/sunos-x64@0.17.19:
resolution: {integrity: sha512-vCRT7yP3zX+bKWFeP/zdS6SqdWB8OIpaRq/mbXQxTGHnIxspRtigpkUcDMlSCOejlHowLqII7K2JKevwyRP2rg==}
/@esbuild/sunos-x64@0.18.11:
resolution: {integrity: sha512-kxfbDOrH4dHuAAOhr7D7EqaYf+W45LsAOOhAet99EyuxxQmjbk8M9N4ezHcEiCYPaiW8Dj3K26Z2V17Gt6p3ng==}
engines: {node: '>=12'}
cpu: [x64]
os: [sunos]
@ -289,8 +289,8 @@ packages:
dev: true
optional: true
/@esbuild/win32-arm64@0.17.19:
resolution: {integrity: sha512-yYx+8jwowUstVdorcMdNlzklLYhPxjniHWFKgRqH7IFlUEa0Umu3KuYplf1HUZZ422e3NU9F4LGb+4O0Kdcaag==}
/@esbuild/win32-arm64@0.18.11:
resolution: {integrity: sha512-Sh0dDRyk1Xi348idbal7lZyfSkjhJsdFeuC13zqdipsvMetlGiFQNdO+Yfp6f6B4FbyQm7qsk16yaZk25LChzg==}
engines: {node: '>=12'}
cpu: [arm64]
os: [win32]
@ -298,8 +298,8 @@ packages:
dev: true
optional: true
/@esbuild/win32-ia32@0.17.19:
resolution: {integrity: sha512-eggDKanJszUtCdlVs0RB+h35wNlb5v4TWEkq4vZcmVt5u/HiDZrTXe2bWFQUez3RgNHwx/x4sk5++4NSSicKkw==}
/@esbuild/win32-ia32@0.18.11:
resolution: {integrity: sha512-o9JUIKF1j0rqJTFbIoF4bXj6rvrTZYOrfRcGyL0Vm5uJ/j5CkBD/51tpdxe9lXEDouhRgdr/BYzUrDOvrWwJpg==}
engines: {node: '>=12'}
cpu: [ia32]
os: [win32]
@ -307,8 +307,8 @@ packages:
dev: true
optional: true
/@esbuild/win32-x64@0.17.19:
resolution: {integrity: sha512-lAhycmKnVOuRYNtRtatQR1LPQf2oYCkRGkSFnseDAKPl8lu5SOsK/e1sXe5a0Pc5kHIHe6P2I/ilntNv2xf3cA==}
/@esbuild/win32-x64@0.18.11:
resolution: {integrity: sha512-rQI4cjLHd2hGsM1LqgDI7oOCYbQ6IBOVsX9ejuRMSze0GqXUG2ekwiKkiBU1pRGSeCqFFHxTrcEydB2Hyoz9CA==}
engines: {node: '>=12'}
cpu: [x64]
os: [win32]
@ -515,8 +515,8 @@ packages:
resolution: {integrity: sha512-4p9vcSmxAayx72yn70joFoL44c9MO/0+iVEBIQXe3v2h2SiAsEIo/G5v6ObFWvNKRFjbrVadNf9LqEEZeQPzdA==}
dev: false
/@typescript-eslint/eslint-plugin@5.60.1(@typescript-eslint/parser@5.60.1)(eslint@8.44.0)(typescript@5.1.6):
resolution: {integrity: sha512-KSWsVvsJsLJv3c4e73y/Bzt7OpqMCADUO846bHcuWYSYM19bldbAeDv7dYyV0jwkbMfJ2XdlzwjhXtuD7OY6bw==}
/@typescript-eslint/eslint-plugin@5.61.0(@typescript-eslint/parser@5.61.0)(eslint@8.44.0)(typescript@5.1.6):
resolution: {integrity: sha512-A5l/eUAug103qtkwccSCxn8ZRwT+7RXWkFECdA4Cvl1dOlDUgTpAOfSEElZn2uSUxhdDpnCdetrf0jvU4qrL+g==}
engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
peerDependencies:
'@typescript-eslint/parser': ^5.0.0
@ -527,13 +527,13 @@ packages:
optional: true
dependencies:
'@eslint-community/regexpp': 4.5.1
'@typescript-eslint/parser': 5.60.1(eslint@8.44.0)(typescript@5.1.6)
'@typescript-eslint/scope-manager': 5.60.1
'@typescript-eslint/type-utils': 5.60.1(eslint@8.44.0)(typescript@5.1.6)
'@typescript-eslint/utils': 5.60.1(eslint@8.44.0)(typescript@5.1.6)
'@typescript-eslint/parser': 5.61.0(eslint@8.44.0)(typescript@5.1.6)
'@typescript-eslint/scope-manager': 5.61.0
'@typescript-eslint/type-utils': 5.61.0(eslint@8.44.0)(typescript@5.1.6)
'@typescript-eslint/utils': 5.61.0(eslint@8.44.0)(typescript@5.1.6)
debug: 4.3.4
eslint: 8.44.0
grapheme-splitter: 1.0.4
graphemer: 1.4.0
ignore: 5.2.0
natural-compare-lite: 1.4.0
semver: 7.5.1
@ -543,8 +543,8 @@ packages:
- supports-color
dev: true
/@typescript-eslint/parser@5.60.1(eslint@8.44.0)(typescript@5.1.6):
resolution: {integrity: sha512-pHWlc3alg2oSMGwsU/Is8hbm3XFbcrb6P5wIxcQW9NsYBfnrubl/GhVVD/Jm/t8HXhA2WncoIRfBtnCgRGV96Q==}
/@typescript-eslint/parser@5.61.0(eslint@8.44.0)(typescript@5.1.6):
resolution: {integrity: sha512-yGr4Sgyh8uO6fSi9hw3jAFXNBHbCtKKFMdX2IkT3ZqpKmtAq3lHS4ixB/COFuAIJpwl9/AqF7j72ZDWYKmIfvg==}
engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
peerDependencies:
eslint: ^6.0.0 || ^7.0.0 || ^8.0.0
@ -553,9 +553,9 @@ packages:
typescript:
optional: true
dependencies:
'@typescript-eslint/scope-manager': 5.60.1
'@typescript-eslint/types': 5.60.1
'@typescript-eslint/typescript-estree': 5.60.1(typescript@5.1.6)
'@typescript-eslint/scope-manager': 5.61.0
'@typescript-eslint/types': 5.61.0
'@typescript-eslint/typescript-estree': 5.61.0(typescript@5.1.6)
debug: 4.3.4
eslint: 8.44.0
typescript: 5.1.6
@ -563,16 +563,16 @@ packages:
- supports-color
dev: true
/@typescript-eslint/scope-manager@5.60.1:
resolution: {integrity: sha512-Dn/LnN7fEoRD+KspEOV0xDMynEmR3iSHdgNsarlXNLGGtcUok8L4N71dxUgt3YvlO8si7E+BJ5Fe3wb5yUw7DQ==}
/@typescript-eslint/scope-manager@5.61.0:
resolution: {integrity: sha512-W8VoMjoSg7f7nqAROEmTt6LoBpn81AegP7uKhhW5KzYlehs8VV0ZW0fIDVbcZRcaP3aPSW+JZFua+ysQN+m/Nw==}
engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
dependencies:
'@typescript-eslint/types': 5.60.1
'@typescript-eslint/visitor-keys': 5.60.1
'@typescript-eslint/types': 5.61.0
'@typescript-eslint/visitor-keys': 5.61.0
dev: true
/@typescript-eslint/type-utils@5.60.1(eslint@8.44.0)(typescript@5.1.6):
resolution: {integrity: sha512-vN6UztYqIu05nu7JqwQGzQKUJctzs3/Hg7E2Yx8rz9J+4LgtIDFWjjl1gm3pycH0P3mHAcEUBd23LVgfrsTR8A==}
/@typescript-eslint/type-utils@5.61.0(eslint@8.44.0)(typescript@5.1.6):
resolution: {integrity: sha512-kk8u//r+oVK2Aj3ph/26XdH0pbAkC2RiSjUYhKD+PExemG4XSjpGFeyZ/QM8lBOa7O8aGOU+/yEbMJgQv/DnCg==}
engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
peerDependencies:
eslint: '*'
@ -581,8 +581,8 @@ packages:
typescript:
optional: true
dependencies:
'@typescript-eslint/typescript-estree': 5.60.1(typescript@5.1.6)
'@typescript-eslint/utils': 5.60.1(eslint@8.44.0)(typescript@5.1.6)
'@typescript-eslint/typescript-estree': 5.61.0(typescript@5.1.6)
'@typescript-eslint/utils': 5.61.0(eslint@8.44.0)(typescript@5.1.6)
debug: 4.3.4
eslint: 8.44.0
tsutils: 3.21.0(typescript@5.1.6)
@ -591,13 +591,13 @@ packages:
- supports-color
dev: true
/@typescript-eslint/types@5.60.1:
resolution: {integrity: sha512-zDcDx5fccU8BA0IDZc71bAtYIcG9PowaOwaD8rjYbqwK7dpe/UMQl3inJ4UtUK42nOCT41jTSCwg76E62JpMcg==}
/@typescript-eslint/types@5.61.0:
resolution: {integrity: sha512-ldyueo58KjngXpzloHUog/h9REmHl59G1b3a5Sng1GfBo14BkS3ZbMEb3693gnP1k//97lh7bKsp6/V/0v1veQ==}
engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
dev: true
/@typescript-eslint/typescript-estree@5.60.1(typescript@5.1.6):
resolution: {integrity: sha512-hkX70J9+2M2ZT6fhti5Q2FoU9zb+GeZK2SLP1WZlvUDqdMbEKhexZODD1WodNRyO8eS+4nScvT0dts8IdaBzfw==}
/@typescript-eslint/typescript-estree@5.61.0(typescript@5.1.6):
resolution: {integrity: sha512-Fud90PxONnnLZ36oR5ClJBLTLfU4pIWBmnvGwTbEa2cXIqj70AEDEmOmpkFComjBZ/037ueKrOdHuYmSFVD7Rw==}
engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
peerDependencies:
typescript: '*'
@ -605,8 +605,8 @@ packages:
typescript:
optional: true
dependencies:
'@typescript-eslint/types': 5.60.1
'@typescript-eslint/visitor-keys': 5.60.1
'@typescript-eslint/types': 5.61.0
'@typescript-eslint/visitor-keys': 5.61.0
debug: 4.3.4
globby: 11.1.0
is-glob: 4.0.3
@ -617,8 +617,8 @@ packages:
- supports-color
dev: true
/@typescript-eslint/utils@5.60.1(eslint@8.44.0)(typescript@5.1.6):
resolution: {integrity: sha512-tiJ7FFdFQOWssFa3gqb94Ilexyw0JVxj6vBzaSpfN/8IhoKkDuSAenUKvsSHw2A/TMpJb26izIszTXaqygkvpQ==}
/@typescript-eslint/utils@5.61.0(eslint@8.44.0)(typescript@5.1.6):
resolution: {integrity: sha512-mV6O+6VgQmVE6+xzlA91xifndPW9ElFW8vbSF0xCT/czPXVhwDewKila1jOyRwa9AE19zKnrr7Cg5S3pJVrTWQ==}
engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
peerDependencies:
eslint: ^6.0.0 || ^7.0.0 || ^8.0.0
@ -626,9 +626,9 @@ packages:
'@eslint-community/eslint-utils': 4.4.0(eslint@8.44.0)
'@types/json-schema': 7.0.11
'@types/semver': 7.5.0
'@typescript-eslint/scope-manager': 5.60.1
'@typescript-eslint/types': 5.60.1
'@typescript-eslint/typescript-estree': 5.60.1(typescript@5.1.6)
'@typescript-eslint/scope-manager': 5.61.0
'@typescript-eslint/types': 5.61.0
'@typescript-eslint/typescript-estree': 5.61.0(typescript@5.1.6)
eslint: 8.44.0
eslint-scope: 5.1.1
semver: 7.5.1
@ -637,41 +637,41 @@ packages:
- typescript
dev: true
/@typescript-eslint/visitor-keys@5.60.1:
resolution: {integrity: sha512-xEYIxKcultP6E/RMKqube11pGjXH1DCo60mQoWhVYyKfLkwbIVVjYxmOenNMxILx0TjCujPTjjnTIVzm09TXIw==}
/@typescript-eslint/visitor-keys@5.61.0:
resolution: {integrity: sha512-50XQ5VdbWrX06mQXhy93WywSFZZGsv3EOjq+lqp6WC2t+j3mb6A9xYVdrRxafvK88vg9k9u+CT4l6D8PEatjKg==}
engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
dependencies:
'@typescript-eslint/types': 5.60.1
'@typescript-eslint/types': 5.61.0
eslint-visitor-keys: 3.4.1
dev: true
/@vitejs/plugin-vue@4.2.3(vite@4.3.9)(vue@3.3.4):
/@vitejs/plugin-vue@4.2.3(vite@4.4.1)(vue@3.3.4):
resolution: {integrity: sha512-R6JDUfiZbJA9cMiguQ7jxALsgiprjBeHL5ikpXfJCH62pPHtI+JdJ5xWj6Ev73yXSlYl86+blXn1kZHQ7uElxw==}
engines: {node: ^14.18.0 || >=16.0.0}
peerDependencies:
vite: ^4.0.0
vue: ^3.2.25
dependencies:
vite: 4.3.9(sass@1.63.6)
vite: 4.4.1(sass@1.63.6)
vue: 3.3.4
dev: true
/@volar/language-core@1.7.10:
resolution: {integrity: sha512-18Gmth5M0UI3hDDqhZngjMnb6WCslcfglkOdepRIhGxRYe7xR7DRRzciisYDMZsvOQxDYme+uaohg0dKUxLV2Q==}
/@volar/language-core@1.8.0:
resolution: {integrity: sha512-ZHTvZPM3pEbOOuaq+ybNz5TQlHUqPQPK0G1+SonvApGq0e3qgGijjhtL5T7hsCtUEmxfix8FrAuCH14tMBOhTg==}
dependencies:
'@volar/source-map': 1.7.10
'@volar/source-map': 1.8.0
dev: true
/@volar/source-map@1.7.10:
resolution: {integrity: sha512-FBpLEOKJpRxeh2nYbw1mTI5sZOPXYU8LlsCz6xuBY3yNtAizDTTIZtBHe1V8BaMpoSMgRysZe4gVxMEi3rDGVA==}
/@volar/source-map@1.8.0:
resolution: {integrity: sha512-d35aV0yFkIrkynRSKgrN5hgbMv6ekkFvcJsJGmOZ8UEjqLStto9zq7RSvpp6/PZ7/pa4Gn1f6K1qDt0bq0oUew==}
dependencies:
muggle-string: 0.3.1
dev: true
/@volar/typescript@1.7.10:
resolution: {integrity: sha512-yqIov4wndLU3GE1iE25bU5W6T+P+exPePcE1dFPPBKzQIBki1KvmdQN5jBlJp3Wo+wp7UIxa/RsdNkXT+iFBjg==}
/@volar/typescript@1.8.0:
resolution: {integrity: sha512-T/U1XLLhXv6tNr40Awznfc6QZWizSL99t6M0DeXtIMbnvSCqjjCVRnwlsq+DK9C1RlO3k8+i0Z8iJn7O1GGtoA==}
dependencies:
'@volar/language-core': 1.7.10
'@volar/language-core': 1.8.0
dev: true
/@vue/compiler-core@3.3.4:
@ -699,7 +699,7 @@ packages:
'@vue/shared': 3.3.4
estree-walker: 2.0.2
magic-string: 0.30.0
postcss: 8.4.24
postcss: 8.4.25
source-map-js: 1.0.2
/@vue/compiler-ssr@3.3.4:
@ -712,16 +712,16 @@ packages:
resolution: {integrity: sha512-o9KfBeaBmCKl10usN4crU53fYtC1r7jJwdGKjPT24t348rHxgfpZ0xL3Xm/gLUYnc0oTp8LAmrxOeLyu6tbk2Q==}
dev: false
/@vue/language-core@1.8.3(typescript@5.1.6):
resolution: {integrity: sha512-AzhvMYoQkK/tg8CpAAttO19kx1zjS3+weYIr2AhlH/M5HebVzfftQoq4jZNFifjq+hyLKi8j9FiDMS8oqA89+A==}
/@vue/language-core@1.8.4(typescript@5.1.6):
resolution: {integrity: sha512-pnNtNcJVfkGYluW0vsVO+Y1gyX+eA0voaS7+1JOhCp5zKeCaL/PAmGYOgfvwML62neL+2H8pnhY7sffmrGpEhw==}
peerDependencies:
typescript: '*'
peerDependenciesMeta:
typescript:
optional: true
dependencies:
'@volar/language-core': 1.7.10
'@volar/source-map': 1.7.10
'@volar/language-core': 1.8.0
'@volar/source-map': 1.8.0
'@vue/compiler-dom': 3.3.4
'@vue/reactivity': 3.3.4
'@vue/shared': 3.3.4
@ -770,11 +770,11 @@ packages:
/@vue/shared@3.3.4:
resolution: {integrity: sha512-7OjdcV8vQ74eiz1TZLzZP4JwqM5fA94K6yntPS5Z25r9HDuGNzaGdgvwKYq6S+MxwF0TFRwe50fIR/MYnakdkQ==}
/@vue/typescript@1.8.3(typescript@5.1.6):
resolution: {integrity: sha512-6bdgSnIFpRYHlt70pHmnmNksPU00bfXgqAISeaNz3W6d2cH0OTfH8h/IhligQ82sJIhsuyfftQJ5518ZuKIhtA==}
/@vue/typescript@1.8.4(typescript@5.1.6):
resolution: {integrity: sha512-sioQfIY5xcmEAz+cPLvv6CtzGPtGhIdR0Za87zB8M4mPe4OSsE3MBGkXcslf+EzQgF+fm6Gr1SRMSX8r5ZmzDA==}
dependencies:
'@volar/typescript': 1.7.10
'@vue/language-core': 1.8.3(typescript@5.1.6)
'@volar/typescript': 1.8.0
'@vue/language-core': 1.8.4(typescript@5.1.6)
transitivePeerDependencies:
- typescript
dev: true
@ -940,7 +940,7 @@ packages:
hasBin: true
dev: true
/autoprefixer@10.4.14(postcss@8.4.24):
/autoprefixer@10.4.14(postcss@8.4.25):
resolution: {integrity: sha512-FQzyfOsTlwVzjHxKEqRIAdJx9niO6VCBCoEwax/VLSoQF29ggECcPuBqUMZ+u8jCZOPSy8b8/8KnuFbp0SaFZQ==}
engines: {node: ^10 || ^12 || >=14}
hasBin: true
@ -952,7 +952,7 @@ packages:
fraction.js: 4.2.0
normalize-range: 0.1.2
picocolors: 1.0.0
postcss: 8.4.24
postcss: 8.4.25
postcss-value-parser: 4.2.0
dev: true
@ -1199,16 +1199,16 @@ packages:
/csstype@3.1.2:
resolution: {integrity: sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==}
/daisyui@3.1.7(postcss@8.4.24):
resolution: {integrity: sha512-VQhaunQlB7Buo+AbE+S3i6H/eYknKEuKVHG67y7sbG58uEjeLK6n2rojG3YE7fwoOss6ldbUL8Oy0MyoJi0CHw==}
/daisyui@3.1.9(postcss@8.4.25):
resolution: {integrity: sha512-GkQR3iLnTfxNsQz7EZXS5bPY65iJM7jdiHtQZWDpRVmBrMlq8Nmrc+t8XmjGdOmJljAPFjtMSD9E9zAnhXF7qg==}
engines: {node: '>=16.9.0'}
peerDependencies:
postcss: ^8
dependencies:
colord: 2.9.3
css-selector-tokenizer: 0.8.0
postcss: 8.4.24
postcss-js: 4.0.1(postcss@8.4.24)
postcss: 8.4.25
postcss-js: 4.0.1(postcss@8.4.25)
tailwindcss: 3.3.2
transitivePeerDependencies:
- ts-node
@ -1343,34 +1343,34 @@ packages:
dev: true
optional: true
/esbuild@0.17.19:
resolution: {integrity: sha512-XQ0jAPFkK/u3LcVRcvVHQcTIqD6E2H1fvZMA5dQPSOWb3suUbWbfbRf94pjc0bNzRYLfIrDRQXr7X+LHIm5oHw==}
/esbuild@0.18.11:
resolution: {integrity: sha512-i8u6mQF0JKJUlGR3OdFLKldJQMMs8OqM9Cc3UCi9XXziJ9WERM5bfkHaEAy0YAvPRMgqSW55W7xYn84XtEFTtA==}
engines: {node: '>=12'}
hasBin: true
requiresBuild: true
optionalDependencies:
'@esbuild/android-arm': 0.17.19
'@esbuild/android-arm64': 0.17.19
'@esbuild/android-x64': 0.17.19
'@esbuild/darwin-arm64': 0.17.19
'@esbuild/darwin-x64': 0.17.19
'@esbuild/freebsd-arm64': 0.17.19
'@esbuild/freebsd-x64': 0.17.19
'@esbuild/linux-arm': 0.17.19
'@esbuild/linux-arm64': 0.17.19
'@esbuild/linux-ia32': 0.17.19
'@esbuild/linux-loong64': 0.17.19
'@esbuild/linux-mips64el': 0.17.19
'@esbuild/linux-ppc64': 0.17.19
'@esbuild/linux-riscv64': 0.17.19
'@esbuild/linux-s390x': 0.17.19
'@esbuild/linux-x64': 0.17.19
'@esbuild/netbsd-x64': 0.17.19
'@esbuild/openbsd-x64': 0.17.19
'@esbuild/sunos-x64': 0.17.19
'@esbuild/win32-arm64': 0.17.19
'@esbuild/win32-ia32': 0.17.19
'@esbuild/win32-x64': 0.17.19
'@esbuild/android-arm': 0.18.11
'@esbuild/android-arm64': 0.18.11
'@esbuild/android-x64': 0.18.11
'@esbuild/darwin-arm64': 0.18.11
'@esbuild/darwin-x64': 0.18.11
'@esbuild/freebsd-arm64': 0.18.11
'@esbuild/freebsd-x64': 0.18.11
'@esbuild/linux-arm': 0.18.11
'@esbuild/linux-arm64': 0.18.11
'@esbuild/linux-ia32': 0.18.11
'@esbuild/linux-loong64': 0.18.11
'@esbuild/linux-mips64el': 0.18.11
'@esbuild/linux-ppc64': 0.18.11
'@esbuild/linux-riscv64': 0.18.11
'@esbuild/linux-s390x': 0.18.11
'@esbuild/linux-x64': 0.18.11
'@esbuild/netbsd-x64': 0.18.11
'@esbuild/openbsd-x64': 0.18.11
'@esbuild/sunos-x64': 0.18.11
'@esbuild/win32-arm64': 0.18.11
'@esbuild/win32-ia32': 0.18.11
'@esbuild/win32-x64': 0.18.11
dev: true
/escalade@3.1.1:
@ -1390,7 +1390,7 @@ packages:
tailwindcss: ^3.3.2
dependencies:
fast-glob: 3.2.12
postcss: 8.4.24
postcss: 8.4.25
tailwindcss: 3.3.2
dev: true
@ -1404,9 +1404,9 @@ packages:
eslint: 8.44.0
eslint-utils: 3.0.0(eslint@8.44.0)
lodash: 4.17.21
postcss: 8.4.24
postcss-safe-parser: 6.0.0(postcss@8.4.24)
postcss-scss: 4.0.4(postcss@8.4.24)
postcss: 8.4.25
postcss-safe-parser: 6.0.0(postcss@8.4.25)
postcss-scss: 4.0.4(postcss@8.4.25)
postcss-selector-parser: 6.0.13
postcss-styl: 0.12.3
vue-eslint-parser: 9.3.1(eslint@8.44.0)
@ -1754,10 +1754,6 @@ packages:
dev: true
optional: true
/grapheme-splitter@1.0.4:
resolution: {integrity: sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==}
dev: true
/graphemer@1.4.0:
resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==}
dev: true
@ -2365,27 +2361,27 @@ packages:
resolution: {integrity: sha512-dGSwO2j3XqtFMANNNEVh/moRw0ItOraKC1p3J+I0y/tPEfgleCAUptMWhqHrFNS+jM5r21eSS1U48N9/OmHFzA==}
dev: false
/postcss-import@15.1.0(postcss@8.4.24):
/postcss-import@15.1.0(postcss@8.4.25):
resolution: {integrity: sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==}
engines: {node: '>=14.0.0'}
peerDependencies:
postcss: ^8.0.0
dependencies:
postcss: 8.4.24
postcss: 8.4.25
postcss-value-parser: 4.2.0
read-cache: 1.0.0
resolve: 1.22.2
/postcss-js@4.0.1(postcss@8.4.24):
/postcss-js@4.0.1(postcss@8.4.25):
resolution: {integrity: sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==}
engines: {node: ^12 || ^14 || >= 16}
peerDependencies:
postcss: ^8.4.21
dependencies:
camelcase-css: 2.0.1
postcss: 8.4.24
postcss: 8.4.25
/postcss-load-config@4.0.1(postcss@8.4.24):
/postcss-load-config@4.0.1(postcss@8.4.25):
resolution: {integrity: sha512-vEJIc8RdiBRu3oRAI0ymerOn+7rPuMvRXslTvZUKZonDHFIczxztIyJ1urxM1x9JXEikvpWWTUUqal5j/8QgvA==}
engines: {node: '>= 14'}
peerDependencies:
@ -2398,34 +2394,34 @@ packages:
optional: true
dependencies:
lilconfig: 2.1.0
postcss: 8.4.24
postcss: 8.4.25
yaml: 2.3.1
/postcss-nested@6.0.1(postcss@8.4.24):
/postcss-nested@6.0.1(postcss@8.4.25):
resolution: {integrity: sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==}
engines: {node: '>=12.0'}
peerDependencies:
postcss: ^8.2.14
dependencies:
postcss: 8.4.24
postcss: 8.4.25
postcss-selector-parser: 6.0.13
/postcss-safe-parser@6.0.0(postcss@8.4.24):
/postcss-safe-parser@6.0.0(postcss@8.4.25):
resolution: {integrity: sha512-FARHN8pwH+WiS2OPCxJI8FuRJpTVnn6ZNFiqAM2aeW2LwTHWWmWgIyKC6cUo0L8aeKiF/14MNvnpls6R2PBeMQ==}
engines: {node: '>=12.0'}
peerDependencies:
postcss: ^8.3.3
dependencies:
postcss: 8.4.24
postcss: 8.4.25
dev: true
/postcss-scss@4.0.4(postcss@8.4.24):
/postcss-scss@4.0.4(postcss@8.4.25):
resolution: {integrity: sha512-aBBbVyzA8b3hUL0MGrpydxxXKXFZc5Eqva0Q3V9qsBOLEMsjb6w49WfpsoWzpEgcqJGW4t7Rio8WXVU9Gd8vWg==}
engines: {node: '>=12.0'}
peerDependencies:
postcss: ^8.3.3
dependencies:
postcss: 8.4.24
postcss: 8.4.25
dev: true
/postcss-selector-parser@6.0.10:
@ -2450,7 +2446,7 @@ packages:
debug: 4.3.4
fast-diff: 1.2.0
lodash.sortedlastindex: 4.1.0
postcss: 8.4.24
postcss: 8.4.25
stylus: 0.57.0
transitivePeerDependencies:
- supports-color
@ -2459,8 +2455,8 @@ packages:
/postcss-value-parser@4.2.0:
resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==}
/postcss@8.4.24:
resolution: {integrity: sha512-M0RzbcI0sO/XJNucsGjvWU9ERWxb/ytp1w6dKtxTKgixdtQDq4rmx/g8W1hnaheq9jgwL/oyEdH5Bc4WwJKMqg==}
/postcss@8.4.25:
resolution: {integrity: sha512-7taJ/8t2av0Z+sQEvNzCkpDynl0tX3uJMCODi6nT3PfASC7dYCWV9aQ+uiCf+KBD4SEFcu+GvJdGdwzQ6OSjCw==}
engines: {node: ^10 || ^12 || >=14}
dependencies:
nanoid: 3.3.6
@ -2549,8 +2545,8 @@ packages:
glob: 7.2.3
dev: true
/rollup@3.23.0:
resolution: {integrity: sha512-h31UlwEi7FHihLe1zbk+3Q7z1k/84rb9BSwmBSr/XjOCEaBJ2YyedQDuM0t/kfOS0IxM+vk1/zI9XxYj9V+NJQ==}
/rollup@3.26.2:
resolution: {integrity: sha512-6umBIGVz93er97pMgQO08LuH3m6PUb3jlDUUGFsNJB6VgTCUaDFpupf5JfU30529m/UKOgmiX+uY6Sx8cOYpLA==}
engines: {node: '>=14.18.0', npm: '>=8.0.0'}
hasBin: true
optionalDependencies:
@ -2798,11 +2794,11 @@ packages:
normalize-path: 3.0.0
object-hash: 3.0.0
picocolors: 1.0.0
postcss: 8.4.24
postcss-import: 15.1.0(postcss@8.4.24)
postcss-js: 4.0.1(postcss@8.4.24)
postcss-load-config: 4.0.1(postcss@8.4.24)
postcss-nested: 6.0.1(postcss@8.4.24)
postcss: 8.4.25
postcss-import: 15.1.0(postcss@8.4.25)
postcss-js: 4.0.1(postcss@8.4.25)
postcss-load-config: 4.0.1(postcss@8.4.25)
postcss-nested: 6.0.1(postcss@8.4.25)
postcss-selector-parser: 6.0.13
postcss-value-parser: 4.2.0
resolve: 1.22.2
@ -2920,13 +2916,14 @@ packages:
/util-deprecate@1.0.2:
resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==}
/vite@4.3.9(sass@1.63.6):
resolution: {integrity: sha512-qsTNZjO9NoJNW7KnOrgYwczm0WctJ8m/yqYAMAK9Lxt4SoySUfS5S8ia9K7JHpa3KEeMfyF8LoJ3c5NeBJy6pg==}
/vite@4.4.1(sass@1.63.6):
resolution: {integrity: sha512-8mmwPlsy7t+ZcTme7vdbVGuZ3Tri+lrLXr6hsF5UHdyYyARPPPMtM16QlqC9TZuCd5j3NmWs1rwka3cVSRHZTw==}
engines: {node: ^14.18.0 || >=16.0.0}
hasBin: true
peerDependencies:
'@types/node': '>= 14'
less: '*'
lightningcss: ^1.21.0
sass: '*'
stylus: '*'
sugarss: '*'
@ -2936,6 +2933,8 @@ packages:
optional: true
less:
optional: true
lightningcss:
optional: true
sass:
optional: true
stylus:
@ -2945,9 +2944,9 @@ packages:
terser:
optional: true
dependencies:
esbuild: 0.17.19
postcss: 8.4.24
rollup: 3.23.0
esbuild: 0.18.11
postcss: 8.4.25
rollup: 3.26.2
sass: 1.63.6
optionalDependencies:
fsevents: 2.3.2
@ -2986,8 +2985,8 @@ packages:
- supports-color
dev: true
/vue-router@4.2.2(vue@3.3.4):
resolution: {integrity: sha512-cChBPPmAflgBGmy3tBsjeoe3f3VOSG6naKyY5pjtrqLGbNEXdzCigFUHgBvp9e3ysAtFtEx7OLqcSDh/1Cq2TQ==}
/vue-router@4.2.4(vue@3.3.4):
resolution: {integrity: sha512-9PISkmaCO02OzPVOMq2w82ilty6+xJmQrarYZDkjZBfl4RvYAlt4PKnEX21oW4KTtWfa9OuO/b3qk1Od3AEdCQ==}
peerDependencies:
vue: ^3.2.0
dependencies:
@ -3002,14 +3001,14 @@ packages:
he: 1.2.0
dev: true
/vue-tsc@1.8.3(typescript@5.1.6):
resolution: {integrity: sha512-Ua4DHuYxjudlhCW2nRZtaXbhIDVncRGIbDjZhHpF8Z8vklct/G/35/kAPuGNSOmq0JcvhPAe28Oa7LWaUerZVA==}
/vue-tsc@1.8.4(typescript@5.1.6):
resolution: {integrity: sha512-+hgpOhIx11vbi8/AxEdaPj3fiRwN9wy78LpsNNw2V995/IWa6TMyQxHbaw2ZKUpdwjySSHgrT6ohDEhUgFxGYw==}
hasBin: true
peerDependencies:
typescript: '*'
dependencies:
'@vue/language-core': 1.8.3(typescript@5.1.6)
'@vue/typescript': 1.8.3(typescript@5.1.6)
'@vue/language-core': 1.8.4(typescript@5.1.6)
'@vue/typescript': 1.8.4(typescript@5.1.6)
semver: 7.5.1
typescript: 5.1.6
dev: true

View file

@ -3,8 +3,11 @@
:drawer-id="drawerId"
:navigation-entries="navigationEntries"
>
<RouterView v-if="route.name != 'radio'" />
<ViewRadio v-show="route.name == 'radio'" />
<div class="flex min-h-full grow flex-col">
<RouterView v-if="route.name != 'radio'" />
<ViewRadio v-show="route.name == 'radio'" />
</div>
<AtomFooter v-if="route.name != 'bank'" />
</MoleculeNavigationDrawer>
</template>
@ -20,6 +23,7 @@ import {
import MoleculeNavigationDrawer from './components/molecules/MoleculeNavigationDrawer.vue';
import ViewRadio from './components/views/ViewRadio.vue';
import { useRoute } from 'vue-router';
import AtomFooter from './components/atoms/AtomFooter.vue';
const route = useRoute();
const drawerId = 'default-drawer';

View file

@ -0,0 +1,16 @@
<template>
<footer class="footer footer-center bg-base-100 p-4 text-base-content">
<div>
<p>Made with by Simon Giesel</p>
<p>Copyright © 2023 - All right reserved</p>
</div>
</footer>
</template>
<script lang="ts" setup>
</script>
<style lang="scss" scoped>
</style>

View file

@ -0,0 +1,16 @@
<template>
<textarea
v-model="modelValue"
class="textarea-primary textarea h-auto"
/>
</template>
<script lang="ts" setup>
/* global defineModel */
const modelValue = defineModel();
</script>
<style lang="scss" scoped>
</style>

View file

@ -0,0 +1,54 @@
<template>
<AtomModal
:id="id"
ref="modal"
:title="title"
>
<div class="flex flex-col gap-2">
<AtomTextarea v-model="modelValue" />
</div>
<template #action>
<label
class="btn gap-2"
:for="id"
@click="modal?.close()"
>
<XCircleIcon class="h-6 w-6" />
Schließen
</label>
</template>
</AtomModal>
</template>
<script lang="ts" setup>
import { ref } from 'vue';
import { XCircleIcon } from '@heroicons/vue/24/outline';
import AtomModal from '../atoms/AtomModal.vue';
import AtomTextarea from '../atoms/AtomTextarea.vue';
const modal = ref<InstanceType<typeof AtomModal>>();
defineProps({
id: {
type: String,
required: true,
},
title: {
type: String,
required: true,
},
});
defineExpose({
show: () => modal.value?.show(),
close: () => modal.value?.close(),
isOpen: () => modal.value?.isOpen(),
});
/* global defineModel */
const modelValue = defineModel();
</script>
<style lang="scss" scoped>
</style>

View file

@ -6,7 +6,7 @@
>
<div class="flex flex-col gap-2">
<AtomFileInput @change="file = ($event.target as HTMLInputElement)?.files?.[0]" />
<p>Datei für den Import der Stammdaten im CSV-Format auswählen.</p>
<p>Datei für den Import der Stammdaten im CSV-Format auswählen.<br /><b>! Achtung !</b> Die Datei muss eine Kopfzeile besitzen.</p>
</div>
<template #action>
<label
@ -50,10 +50,6 @@ defineProps({
type: String,
required: true,
},
inputLabel: {
type: String,
required: true,
},
});
const emit = defineEmits(['submit']);

View file

@ -1,5 +1,5 @@
<template>
<div class="h-full w-full @container">
<div class="min-h-full w-full @container">
<OrganismAuthWrapper class="flex h-full flex-wrap justify-center gap-4 p-6 @[832px]:justify-normal">
<AtomCard class="w-96">
<template #title>
@ -60,7 +60,7 @@
<MagnifyingGlassIcon class="h-6 w-6" />Verwaltung
</template>
<div class="mt-4 flex h-full flex-col gap-4">
<button class="btn">
<button class="btn-disabled btn">
<QueueListIcon class="h-5 w-5" />
Fehlende Schüler
</button>
@ -85,12 +85,40 @@
<div class="flex items-center gap-2 text-error"><ExclamationTriangleIcon class="h-6 w-6" />Danger Zone</div>
</template>
<div class="mt-4 flex h-full flex-col gap-4">
<MoleculeImportDataModal
id="import-companies-modal"
ref="importCompaniesModal"
title="Firmen importieren"
action-label="Importieren"
@submit="importCompanies"
/>
<button
class="btn"
@click="importCompaniesModal?.show()"
>
<BriefcaseIcon class="h-5 w-5" />
Jobs importieren
</button>
<MoleculeImportDataModal
id="import-companies-modal"
ref="importCompaniesModal"
title="Firmen importieren"
action-label="Importieren"
@submit="importCompanies"
/>
<button
v-if="createdCompanies.length"
class="btn"
@click="showCreatedCompaniesPrintWindow"
>
<PrinterIcon class="h-5 w-5" />
Jobs & Passwörter drucken
</button>
<MoleculeImportDataModal
id="import-accounts-modal"
ref="importAccountsModal"
title="Stammdaten importieren"
action-label="Importieren"
input-label="Stammdaten CSV"
@submit="importAccounts"
/>
<button
@ -102,22 +130,28 @@
</button>
</div>
<div
v-if="importAccountsPending"
v-if="importPending"
class="toast z-10"
>
<div class="alert alert-info">
<span>Stammdaten werden importiert. Bitte warten...</span>
<span>Daten werden importiert. Bitte warten...</span>
</div>
</div>
<div
v-if="importAccountsDone"
v-if="importDone"
class="toast z-10"
>
<div class="alert alert-success">
<span>Stammdaten wurden erfolgreich importiert.</span>
<span>Daten wurden erfolgreich importiert.</span>
</div>
</div>
</AtomCard>
<MoleculeErrorModal
id="error-modal"
ref="errorModal"
v-model="errorMsg"
title="Fehler beim Importieren bei folgenden Datensätzen"
/>
</OrganismAuthWrapper>
</div>
</template>
@ -125,10 +159,14 @@
<script lang="ts" setup>
import { onMounted, ref } from 'vue';
import { SettingsResponse } from '../../types/pocketbase.types';
import { AccountService } from '../../services/account.service';
import { CompanyService } from '../../services/company.service';
import { SettingsService } from '../../services/settings.service';
import {
BriefcaseIcon,
ExclamationTriangleIcon,
MagnifyingGlassIcon,
PrinterIcon,
QueueListIcon,
StarIcon,
TableCellsIcon,
@ -141,10 +179,12 @@ import AtomCurrencyInput from '../atoms/AtomCurrencyInput.vue';
import AtomPercentInput from '../atoms/AtomPercentInput.vue';
import AtomFactorInput from '../atoms/AtomFactorInput.vue';
import OrganismAuthWrapper from '../organisms/OrganismAuthWrapper.vue';
import { AccountService } from '../../services/account.service';
import MoleculeImportDataModal from '../molecules/MoleculeImportDataModal.vue';
import MoleculeErrorModal from '../molecules/MoleculeErrorModal.vue';
const importAccountsModal = ref<InstanceType<typeof MoleculeImportDataModal>>();
const importCompaniesModal = ref<InstanceType<typeof MoleculeImportDataModal>>();
const errorModal = ref<InstanceType<typeof MoleculeErrorModal>>();
const minWage = ref<number>();
const incomeTax = ref<number>();
const maxWageFactor = ref<number>();
@ -152,34 +192,90 @@ const radioUrl = ref<string>();
const settings = ref<SettingsResponse>();
const settingsSaveSuccess = ref<boolean>(false);
const settingsSaveError = ref<boolean>(false);
const importAccountsPending = ref<boolean>(false);
const importAccountsDone = ref<boolean>(false);
const importPending = ref<boolean>(false);
const importDone = ref<boolean>(false);
const errorMsg = ref<string>();
const createdCompanies = ref<{ name: string, password: string }[]>([]);
async function importAccounts(file: File) {
async function importAccounts(file: File): Promise<void> {
const data = await file.text();
const promises = [];
for(const line of data.split('\n')) {
const [lastName, firstName, grade, job] = line.split(';');
const companies = await CompanyService.getCompanies();
const errors = [];
for(const line of data.split('\n').slice(1)) {
const [lastName, firstName, grade, job] = line.trim().split(';');
const company = companies.find((company) => company.name === (job.trim() ? job.trim() : 'Aufsicht'));
if(!company) {
errors.push(line);
continue;
}
promises.push(AccountService.addAccount({
firstName,
lastName,
grade,
company: 'c09ncb3l2pi6i0u',
firstName: firstName.trim(),
lastName: lastName.trim(),
grade: grade.trim(),
company: company?.id,
shift: 'Keine Schicht',
wageFactor: 1,
// TODO: job,
}));
}
importAccountsPending.value = true;
if(errors.length) {
errorMsg.value = errors.join('\n');
errorModal.value?.show();
}
importPending.value = true;
await Promise.all(promises);
importAccountsPending.value = false;
importAccountsDone.value = true;
importPending.value = false;
importDone.value = true;
const timeout = setTimeout(() => {
importAccountsDone.value = false;
importDone.value = false;
clearTimeout(timeout);
}, 5000);
}
async function importCompanies(file: File): Promise<void> {
const data = await file.text();
const promises = [];
const companies = [];
for(const line of data.split('\n').slice(1)) {
if(!line) { continue; }
const company = {
name: line.trim().split(';')[0],
password: window.crypto.getRandomValues(new BigUint64Array(1))[0].toString(36),
};
companies.push(company);
promises.push(CompanyService.addCompany(company));
}
importPending.value = true;
createdCompanies.value = companies;
await Promise.all(promises);
importPending.value = false;
importDone.value = true;
const timeout = setTimeout(() => {
importDone.value = false;
clearTimeout(timeout);
}, 5000);
}
function showCreatedCompaniesPrintWindow(): void {
const printWindow = window.open('', '', 'height=400,width=800');
if(!printWindow) {
alert('Druckansicht konnte nicht erstellt werden.');
} else {
printWindow.document.write('<html><head><title>Job-Übersicht</title></head><body>');
printWindow.document.write('<table style="border-collapse: collapse;">');
printWindow.document.write('<tbody>');
for(const company of createdCompanies.value) {
printWindow.document.write(`<tr><td style="padding: 1rem; border: 1px solid black">${company.name}</td>`);
printWindow.document.write(`<td style="padding: 1rem; border: 1px solid black">${company.password}</td></tr>`);
}
printWindow.document.write('</tbody>');
printWindow.document.write('</table>');
printWindow.document.write('</body></html>');
printWindow.document.close();
printWindow.print();
}
}
onMounted(async () => {
settings.value = await SettingsService.getSettings();
minWage.value = settings.value.minWage / 100;

View file

@ -0,0 +1,13 @@
import { Collections, CompaniesRecord, CompaniesResponse } from '../types/pocketbase.types';
import { PocketbaseService } from './pocketbase.service';
const COLLECTION = PocketbaseService.getApi().collection(Collections.Companies);
export class CompanyService {
public static async addCompany(company: CompaniesRecord & {password: string}): Promise<CompaniesResponse> {
return COLLECTION.create({ ...company, passwordConfirm: company.password }, { $cancelKey: `${company.name}` });
}
public static async getCompanies(): Promise<CompaniesResponse[]> {
return COLLECTION.getFullList();
}
}

View file

@ -40,7 +40,7 @@ export type AccountsRecord = {
lastName: string
grade: string
lastCheckIn?: IsoDateString
company: RecordIdString
company?: RecordIdString
shift: string
wageFactor: number
}
@ -53,7 +53,9 @@ export type AccountsListRecord<Tbalance = unknown, Tname = unknown> = {
balance?: null | Tbalance
}
export type CompaniesRecord = never
export type CompaniesRecord = {
name: string
}
export type SettingsRecord = {
minWage: number