16 Commits
Author SHA1 Message Date
tothbt 6319f2c270 fix: small bugfixes
Build and Release Court Pilot / draft (push) Canceled after 0s
Build and Release Court Pilot / build (ubuntu-22.04) (push) Canceled after 0s
Build and Release Court Pilot / build (windows-latest) (push) Canceled after 0s
Build and Release Court Pilot / publish (push) Canceled after 0s
* Typo in the Hungarian vocab
* Translate language labels
* Start app on full screen
* Clear TOs data in the add-modal
* Change version number to 1.1.1
2026-09-05 11:13:43 +02:00
tothbt 0dd30c6c14 fix releaser 2026-09-04 22:06:06 +02:00
tothbt 06f7cb5c8c fix releaser 2026-09-04 21:35:21 +02:00
tothbt e1c519adf5 fix releaser 2026-09-04 20:33:08 +02:00
tothbt ae86f6962a fix(git): add path to publish job 2026-09-04 19:45:52 +02:00
tothbt 4f95404f0b fix(git): remove duplicated process 2026-09-04 19:14:58 +02:00
tothbt 0d7e4b5c3a fix(git): install ionic for Github acitons 2026-09-04 18:46:59 +02:00
tothbt ac133fd5b6 feat(git): add github release yml
Build and Release Court Pilot / draft (push) Canceled after 0s
Build and Release Court Pilot / build (ubuntu-22.04) (push) Canceled after 0s
Build and Release Court Pilot / build (windows-latest) (push) Canceled after 0s
Build and Release Court Pilot / publish (push) Canceled after 0s
2026-09-04 18:33:50 +02:00
tothbt 35c30b8213 feat(tauri): setup auto-update on startup 2026-08-30 18:48:42 +02:00
tothbt 948b930395 tauri updates to make my first release 2026-08-30 17:44:29 +02:00
tothbt a2a7bc6100 add logos and version number to settings tab 2026-08-29 14:38:56 +02:00
tothbt 0c1a9f86d6 feat: add english and hungarian translations 2026-08-29 11:42:16 +02:00
tothbt ab32f01e07 some tauri updates 2026-08-29 09:48:38 +02:00
tothbt 07f6919617 feat: handle service judge setting on the UI 2026-08-18 11:51:42 +02:00
tothbt 1d84985a76 chore(npm): update packages 2026-08-18 09:55:16 +02:00
tothbt 33d635839f feat(settings): handle warning message setting 2026-06-06 19:54:44 +02:00
78 changed files with 4774 additions and 1789 deletions
+102
View File
@@ -0,0 +1,102 @@
name: Build and Release Court Pilot
on:
push:
tags:
- 'v*'
workflow_dispatch:
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true
env:
CN_APPLICATION: "trweb/court-pilot"
jobs:
draft:
runs-on: ubuntu-22.04
steps:
- uses: actions/checkout@v4
- name: Create CrabNebula draft release
uses: crabnebula-dev/cloud-release@v0
with:
command: release draft ${{ env.CN_APPLICATION }} --framework tauri
api-key: ${{ secrets.CN_API_KEY }}
build:
needs: draft
strategy:
fail-fast: false
matrix:
os:
- ubuntu-22.04
- windows-latest
runs-on: ${{ matrix.os }}
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Setup Node
uses: actions/setup-node@v4
with:
node-version: 22
cache: npm
- name: Setup Rust
uses: actions-rust-lang/setup-rust-toolchain@v1
with:
toolchain: stable
cache: true
- name: Install Linux dependencies
if: matrix.os == 'ubuntu-22.04'
run: |
sudo apt-get update
sudo apt-get install -y \
webkit2gtk-4.1 \
libappindicator3-dev \
librsvg2-dev \
patchelf
- name: Install dependencies
run: npm ci
- name: Install Ionic CLI
run: npm install -g @ionic/cli
- name: Build Tauri app
env:
TAURI_SIGNING_PRIVATE_KEY: ${{ secrets.TAURI_SIGNING_PRIVATE_KEY }}
TAURI_SIGNING_PRIVATE_KEY_PASSWORD: ${{ secrets.TAURI_SIGNING_PRIVATE_KEY_PASSWORD }}
run: npm run tauri build
- name: Upload release assets to CrabNebula
uses: crabnebula-dev/cloud-release@v0
with:
command: release upload ${{ env.CN_APPLICATION }} --framework tauri
api-key: ${{ secrets.CN_API_KEY }}
path: ./src-tauri
publish:
needs: build
runs-on: ubuntu-22.04
steps:
- uses: actions/checkout@v4
- name: Publish CrabNebula release
uses: crabnebula-dev/cloud-release@v0
with:
command: release publish ${{ env.CN_APPLICATION }} --framework tauri
api-key: ${{ secrets.CN_API_KEY }}
path: ./src-tauri
working-directory: ./src-tauri
+3630 -1662
View File
File diff suppressed because it is too large Load Diff
+22 -19
View File
@@ -1,6 +1,6 @@
{ {
"name": "court-pilot", "name": "court-pilot",
"version": "0.0.1", "version": "1.1.1",
"author": "Ionic Framework", "author": "Ionic Framework",
"homepage": "https://ionicframework.com/", "homepage": "https://ionicframework.com/",
"scripts": { "scripts": {
@@ -9,25 +9,28 @@
"build": "ng build", "build": "ng build",
"watch": "ng build --watch --configuration development", "watch": "ng build --watch --configuration development",
"test": "ng test", "test": "ng test",
"lint": "ng lint" "lint": "ng lint",
"tauri": "tauri"
}, },
"private": true, "private": true,
"dependencies": { "dependencies": {
"@angular/animations": "^20.0.0", "@angular/animations": "^20.3.28",
"@angular/cdk": "^20.2.14", "@angular/cdk": "^20.2.14",
"@angular/common": "^20.0.0", "@angular/common": "^20.3.28",
"@angular/compiler": "^20.0.0", "@angular/compiler": "^20.3.28",
"@angular/core": "^20.0.0", "@angular/core": "^20.3.28",
"@angular/forms": "^20.0.0", "@angular/forms": "^20.3.28",
"@angular/platform-browser": "^20.0.0", "@angular/platform-browser": "^20.3.28",
"@angular/platform-browser-dynamic": "^20.0.0", "@angular/platform-browser-dynamic": "^20.3.28",
"@angular/router": "^20.0.0", "@angular/router": "^20.3.28",
"@capacitor/app": "8.1.0", "@capacitor/app": "8.1.0",
"@capacitor/core": "8.3.4", "@capacitor/core": "8.3.4",
"@capacitor/haptics": "8.0.2", "@capacitor/haptics": "8.0.2",
"@capacitor/keyboard": "8.0.3", "@capacitor/keyboard": "8.0.3",
"@capacitor/status-bar": "8.0.2", "@capacitor/status-bar": "8.0.2",
"@ionic/angular": "^8.0.0", "@ionic/angular": "^8.0.0",
"@tauri-apps/plugin-process": "^2.3.1",
"@tauri-apps/plugin-updater": "^2.10.1",
"dexie": "^4.4.2", "dexie": "^4.4.2",
"ionicons": "^7.0.0", "ionicons": "^7.0.0",
"rxjs": "~7.8.0", "rxjs": "~7.8.0",
@@ -35,15 +38,15 @@
"zone.js": "~0.15.0" "zone.js": "~0.15.0"
}, },
"devDependencies": { "devDependencies": {
"@angular-devkit/build-angular": "^20.0.0", "@angular-devkit/build-angular": "^20.3.34",
"@angular-eslint/builder": "^20.0.0", "@angular-eslint/builder": "^20.3.0",
"@angular-eslint/eslint-plugin": "^20.0.0", "@angular-eslint/eslint-plugin": "^20.3.0",
"@angular-eslint/eslint-plugin-template": "^20.0.0", "@angular-eslint/eslint-plugin-template": "^20.3.0",
"@angular-eslint/schematics": "^20.0.0", "@angular-eslint/schematics": "^20.3.0",
"@angular-eslint/template-parser": "^20.0.0", "@angular-eslint/template-parser": "^20.3.0",
"@angular/cli": "^20.0.0", "@angular/cli": "^20.3.34",
"@angular/compiler-cli": "^20.0.0", "@angular/compiler-cli": "^20.3.28",
"@angular/language-service": "^20.0.0", "@angular/language-service": "^20.3.28",
"@capacitor/cli": "8.3.4", "@capacitor/cli": "8.3.4",
"@ionic/angular-toolkit": "^12.0.0", "@ionic/angular-toolkit": "^12.0.0",
"@tauri-apps/cli": "^2.11.2", "@tauri-apps/cli": "^2.11.2",
+494 -6
View File
@@ -85,6 +85,17 @@ dependencies = [
"tauri", "tauri",
"tauri-build", "tauri-build",
"tauri-plugin-log", "tauri-plugin-log",
"tauri-plugin-process",
"tauri-plugin-updater",
]
[[package]]
name = "arbitrary"
version = "1.4.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c3d036a3c4ab069c7b410a2ce876bd74808d2d0888a82667669f8e783a898bf1"
dependencies = [
"derive_arbitrary",
] ]
[[package]] [[package]]
@@ -640,6 +651,17 @@ dependencies = [
"serde_core", "serde_core",
] ]
[[package]]
name = "derive_arbitrary"
version = "1.4.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1e567bd82dcff979e4b03460c307b3cdc9e96fde3d73bed1496d2bc75d9dd62a"
dependencies = [
"proc-macro2",
"quote",
"syn 2.0.117",
]
[[package]] [[package]]
name = "derive_more" name = "derive_more"
version = "2.1.1" version = "2.1.1"
@@ -851,6 +873,16 @@ dependencies = [
"typeid", "typeid",
] ]
[[package]]
name = "errno"
version = "0.3.14"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb"
dependencies = [
"libc",
"windows-sys 0.61.2",
]
[[package]] [[package]]
name = "fastrand" name = "fastrand"
version = "2.4.1" version = "2.4.1"
@@ -885,6 +917,16 @@ dependencies = [
"rustc_version", "rustc_version",
] ]
[[package]]
name = "filetime"
version = "0.2.29"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5c287a33c7f0a620c38e641e7f60827713987b3c0f26e8ddc9462cc69cf75759"
dependencies = [
"cfg-if",
"libc",
]
[[package]] [[package]]
name = "find-msvc-tools" name = "find-msvc-tools"
version = "0.1.9" version = "0.1.9"
@@ -1436,6 +1478,21 @@ dependencies = [
"want", "want",
] ]
[[package]]
name = "hyper-rustls"
version = "0.27.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "33ca68d021ef39cf6463ab54c1d0f5daf03377b70561305bb89a8f83aab66e0f"
dependencies = [
"http",
"hyper",
"hyper-util",
"rustls",
"tokio",
"tokio-rustls",
"tower-service",
]
[[package]] [[package]]
name = "hyper-util" name = "hyper-util"
version = "0.1.20" version = "0.1.20"
@@ -1691,6 +1748,36 @@ dependencies = [
"windows-sys 0.45.0", "windows-sys 0.45.0",
] ]
[[package]]
name = "jni"
version = "0.22.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5efd9a482cf3a427f00d6b35f14332adc7902ce91efb778580e180ff90fa3498"
dependencies = [
"cfg-if",
"combine",
"jni-macros",
"jni-sys 0.4.1",
"log",
"simd_cesu8",
"thiserror 2.0.18",
"walkdir",
"windows-link 0.2.1",
]
[[package]]
name = "jni-macros"
version = "0.22.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a00109accc170f0bdb141fed3e393c565b6f5e072365c3bd58f5b062591560a3"
dependencies = [
"proc-macro2",
"quote",
"rustc_version",
"simd_cesu8",
"syn 2.0.117",
]
[[package]] [[package]]
name = "jni-sys" name = "jni-sys"
version = "0.3.1" version = "0.3.1"
@@ -1828,6 +1915,12 @@ dependencies = [
"libc", "libc",
] ]
[[package]]
name = "linux-raw-sys"
version = "0.12.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "32a66949e030da00e8c7d4434b251670a91556f4144941d37452769c25d58a53"
[[package]] [[package]]
name = "litemap" name = "litemap"
version = "0.8.2" version = "0.8.2"
@@ -1884,6 +1977,12 @@ version = "0.3.17"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a"
[[package]]
name = "minisign-verify"
version = "0.2.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "22f9645cb765ea72b8111f36c522475d2daa0d22c957a9826437e97534bc4e9e"
[[package]] [[package]]
name = "miniz_oxide" name = "miniz_oxide"
version = "0.8.9" version = "0.8.9"
@@ -2125,6 +2224,7 @@ checksum = "e3e0adef53c21f888deb4fa59fc59f7eb17404926ee8a6f59f5df0fd7f9f3272"
dependencies = [ dependencies = [
"bitflags 2.11.1", "bitflags 2.11.1",
"block2", "block2",
"libc",
"objc2", "objc2",
"objc2-core-foundation", "objc2-core-foundation",
] ]
@@ -2140,6 +2240,18 @@ dependencies = [
"objc2-core-foundation", "objc2-core-foundation",
] ]
[[package]]
name = "objc2-osa-kit"
version = "0.3.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f112d1746737b0da274ef79a23aac283376f335f4095a083a267a082f21db0c0"
dependencies = [
"bitflags 2.11.1",
"objc2",
"objc2-app-kit",
"objc2-foundation",
]
[[package]] [[package]]
name = "objc2-quartz-core" name = "objc2-quartz-core"
version = "0.3.2" version = "0.3.2"
@@ -2203,12 +2315,32 @@ version = "1.21.4"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9f7c3e4beb33f85d45ae3e3a1792185706c8e16d043238c593331cc7cd313b50" checksum = "9f7c3e4beb33f85d45ae3e3a1792185706c8e16d043238c593331cc7cd313b50"
[[package]]
name = "openssl-probe"
version = "0.2.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7c87def4c32ab89d880effc9e097653c8da5d6ef28e6b539d313baaacfbafcbe"
[[package]] [[package]]
name = "option-ext" name = "option-ext"
version = "0.2.0" version = "0.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d" checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d"
[[package]]
name = "osakit"
version = "0.3.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "732c71caeaa72c065bb69d7ea08717bd3f4863a4f451402fc9513e29dbd5261b"
dependencies = [
"objc2",
"objc2-foundation",
"objc2-osa-kit",
"serde",
"serde_json",
"thiserror 2.0.18",
]
[[package]] [[package]]
name = "pango" name = "pango"
version = "0.18.3" version = "0.18.3"
@@ -2653,15 +2785,20 @@ dependencies = [
"http-body", "http-body",
"http-body-util", "http-body-util",
"hyper", "hyper",
"hyper-rustls",
"hyper-util", "hyper-util",
"js-sys", "js-sys",
"log", "log",
"percent-encoding", "percent-encoding",
"pin-project-lite", "pin-project-lite",
"rustls",
"rustls-pki-types",
"rustls-platform-verifier",
"serde", "serde",
"serde_json", "serde_json",
"sync_wrapper", "sync_wrapper",
"tokio", "tokio",
"tokio-rustls",
"tokio-util", "tokio-util",
"tower", "tower",
"tower-http", "tower-http",
@@ -2673,6 +2810,20 @@ dependencies = [
"web-sys", "web-sys",
] ]
[[package]]
name = "ring"
version = "0.17.14"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a4689e6c2294d81e88dc6261c768b63bc4fcdb852be6d1352498b114f61383b7"
dependencies = [
"cc",
"cfg-if",
"getrandom 0.2.17",
"libc",
"untrusted",
"windows-sys 0.52.0",
]
[[package]] [[package]]
name = "rkyv" name = "rkyv"
version = "0.7.46" version = "0.7.46"
@@ -2734,6 +2885,92 @@ dependencies = [
"semver", "semver",
] ]
[[package]]
name = "rustix"
version = "1.1.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b6fe4565b9518b83ef4f91bb47ce29620ca828bd32cb7e408f0062e9930ba190"
dependencies = [
"bitflags 2.11.1",
"errno",
"libc",
"linux-raw-sys",
"windows-sys 0.61.2",
]
[[package]]
name = "rustls"
version = "0.23.43"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0283386ce02abc0151e1761d08802dfe86c173b0b494af5cbc086574e453da06"
dependencies = [
"once_cell",
"ring",
"rustls-pki-types",
"rustls-webpki",
"subtle",
"zeroize",
]
[[package]]
name = "rustls-native-certs"
version = "0.8.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "dab5152771c58876a2146916e53e35057e1a4dfa2b9df0f0305b07f611fdea4d"
dependencies = [
"openssl-probe",
"rustls-pki-types",
"schannel",
"security-framework",
]
[[package]]
name = "rustls-pki-types"
version = "1.15.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2f4925028c7eb5d1fcdaf196971378ed9d2c1c4efc7dc5d011256f76c99c0a96"
dependencies = [
"zeroize",
]
[[package]]
name = "rustls-platform-verifier"
version = "0.7.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "26d1e2536ce4f35f4846aa13bff16bd0ff40157cdb14cc056c7b14ba41233ba0"
dependencies = [
"core-foundation",
"core-foundation-sys",
"jni 0.22.4",
"log",
"once_cell",
"rustls",
"rustls-native-certs",
"rustls-platform-verifier-android",
"rustls-webpki",
"security-framework",
"security-framework-sys",
"webpki-root-certs",
"windows-sys 0.61.2",
]
[[package]]
name = "rustls-platform-verifier-android"
version = "0.1.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f87165f0995f63a9fbeea62b64d10b4d9d8e78ec6d7d51fb2125fda7bb36788f"
[[package]]
name = "rustls-webpki"
version = "0.103.15"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f3c3cf1d8b1e7d4927e2d154c3fcb02979afb9939629c62cd9048d4f07b60ac2"
dependencies = [
"ring",
"rustls-pki-types",
"untrusted",
]
[[package]] [[package]]
name = "rustversion" name = "rustversion"
version = "1.0.22" version = "1.0.22"
@@ -2749,6 +2986,15 @@ dependencies = [
"winapi-util", "winapi-util",
] ]
[[package]]
name = "schannel"
version = "0.1.29"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "91c1b7e4904c873ef0710c1f407dde2e6287de2bebc1bbbf7d430bb7cbffd939"
dependencies = [
"windows-sys 0.61.2",
]
[[package]] [[package]]
name = "schemars" name = "schemars"
version = "0.8.22" version = "0.8.22"
@@ -2812,6 +3058,29 @@ version = "4.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1c107b6f4780854c8b126e228ea8869f4d7b71260f962fefb57b996b8959ba6b" checksum = "1c107b6f4780854c8b126e228ea8869f4d7b71260f962fefb57b996b8959ba6b"
[[package]]
name = "security-framework"
version = "3.7.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b7f4bc775c73d9a02cde8bf7b2ec4c9d12743edf609006c7facc23998404cd1d"
dependencies = [
"bitflags 2.11.1",
"core-foundation",
"core-foundation-sys",
"libc",
"security-framework-sys",
]
[[package]]
name = "security-framework-sys"
version = "2.17.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6ce2691df843ecc5d231c0b14ece2acc3efb62c0a398c7e1d875f3983ce020e3"
dependencies = [
"core-foundation-sys",
"libc",
]
[[package]] [[package]]
name = "selectors" name = "selectors"
version = "0.36.1" version = "0.36.1"
@@ -3022,6 +3291,16 @@ version = "0.3.9"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "703d5c7ef118737c72f1af64ad2f6f8c5e1921f818cdcb97b8fe6fc69bf66214" checksum = "703d5c7ef118737c72f1af64ad2f6f8c5e1921f818cdcb97b8fe6fc69bf66214"
[[package]]
name = "simd_cesu8"
version = "1.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "11031e251abf8611c80f460e19dbdeb54a66db918e49c65a7065b46ac7aec520"
dependencies = [
"rustc_version",
"simdutf8",
]
[[package]] [[package]]
name = "simdutf8" name = "simdutf8"
version = "0.1.5" version = "0.1.5"
@@ -3140,6 +3419,12 @@ version = "0.11.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f"
[[package]]
name = "subtle"
version = "2.6.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292"
[[package]] [[package]]
name = "swift-rs" name = "swift-rs"
version = "1.0.7" version = "1.0.7"
@@ -3224,7 +3509,7 @@ dependencies = [
"gdkwayland-sys", "gdkwayland-sys",
"gdkx11-sys", "gdkx11-sys",
"gtk", "gtk",
"jni", "jni 0.21.1",
"libc", "libc",
"log", "log",
"ndk", "ndk",
@@ -3263,6 +3548,17 @@ version = "1.0.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369"
[[package]]
name = "tar"
version = "0.4.46"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3f6221d9a6003c78398e3b239969f352578258df48c8eb051caadae0015bc840"
dependencies = [
"filetime",
"libc",
"xattr",
]
[[package]] [[package]]
name = "target-lexicon" name = "target-lexicon"
version = "0.12.16" version = "0.12.16"
@@ -3286,7 +3582,7 @@ dependencies = [
"gtk", "gtk",
"heck 0.5.0", "heck 0.5.0",
"http", "http",
"jni", "jni 0.21.1",
"libc", "libc",
"log", "log",
"mime", "mime",
@@ -3420,6 +3716,49 @@ dependencies = [
"time", "time",
] ]
[[package]]
name = "tauri-plugin-process"
version = "2.3.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d55511a7bf6cd70c8767b02c97bf8134fa434daf3926cfc1be0a0f94132d165a"
dependencies = [
"tauri",
"tauri-plugin",
]
[[package]]
name = "tauri-plugin-updater"
version = "2.10.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "806d9dac662c2e4594ff03c647a552f2c9bd544e7d0f683ec58f872f952ce4af"
dependencies = [
"base64 0.22.1",
"dirs",
"flate2",
"futures-util",
"http",
"infer",
"log",
"minisign-verify",
"osakit",
"percent-encoding",
"reqwest",
"rustls",
"semver",
"serde",
"serde_json",
"tar",
"tauri",
"tauri-plugin",
"tempfile",
"thiserror 2.0.18",
"time",
"tokio",
"url",
"windows-sys 0.60.2",
"zip",
]
[[package]] [[package]]
name = "tauri-runtime" name = "tauri-runtime"
version = "2.11.2" version = "2.11.2"
@@ -3430,7 +3769,7 @@ dependencies = [
"dpi", "dpi",
"gtk", "gtk",
"http", "http",
"jni", "jni 0.21.1",
"objc2", "objc2",
"objc2-ui-kit", "objc2-ui-kit",
"objc2-web-kit", "objc2-web-kit",
@@ -3453,7 +3792,7 @@ checksum = "b83849ee63ecb27a8e8d0fe51915ca215076914aca43f96db1179f0f415f6cd9"
dependencies = [ dependencies = [
"gtk", "gtk",
"http", "http",
"jni", "jni 0.21.1",
"log", "log",
"objc2", "objc2",
"objc2-app-kit", "objc2-app-kit",
@@ -3520,6 +3859,19 @@ dependencies = [
"toml 1.1.2+spec-1.1.0", "toml 1.1.2+spec-1.1.0",
] ]
[[package]]
name = "tempfile"
version = "3.27.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "32497e9a4c7b38532efcdebeef879707aa9f794296a4f0244f6f69e9bc8574bd"
dependencies = [
"fastrand",
"getrandom 0.4.2",
"once_cell",
"rustix",
"windows-sys 0.61.2",
]
[[package]] [[package]]
name = "tendril" name = "tendril"
version = "0.5.0" version = "0.5.0"
@@ -3642,6 +3994,16 @@ dependencies = [
"windows-sys 0.61.2", "windows-sys 0.61.2",
] ]
[[package]]
name = "tokio-rustls"
version = "0.26.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1729aa945f29d91ba541258c8df89027d5792d85a8841fb65e8bf0f4ede4ef61"
dependencies = [
"rustls",
"tokio",
]
[[package]] [[package]]
name = "tokio-util" name = "tokio-util"
version = "0.7.18" version = "0.7.18"
@@ -3938,6 +4300,12 @@ version = "0.2.6"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853"
[[package]]
name = "untrusted"
version = "0.9.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1"
[[package]] [[package]]
name = "url" name = "url"
version = "2.5.8" version = "2.5.8"
@@ -4242,6 +4610,15 @@ dependencies = [
"system-deps", "system-deps",
] ]
[[package]]
name = "webpki-root-certs"
version = "1.0.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b96554aa2acc8ccdb7e1c9a58a7a68dd5d13bccc69cd124cb09406db612a1c9b"
dependencies = [
"rustls-pki-types",
]
[[package]] [[package]]
name = "webview2-com" name = "webview2-com"
version = "0.38.2" version = "0.38.2"
@@ -4472,6 +4849,15 @@ dependencies = [
"windows-targets 0.42.2", "windows-targets 0.42.2",
] ]
[[package]]
name = "windows-sys"
version = "0.52.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d"
dependencies = [
"windows-targets 0.52.6",
]
[[package]] [[package]]
name = "windows-sys" name = "windows-sys"
version = "0.59.0" version = "0.59.0"
@@ -4481,6 +4867,15 @@ dependencies = [
"windows-targets 0.52.6", "windows-targets 0.52.6",
] ]
[[package]]
name = "windows-sys"
version = "0.60.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f2f500e4d28234f72040990ec9d39e3a6b950f9f22d3dba18416c35882612bcb"
dependencies = [
"windows-targets 0.53.5",
]
[[package]] [[package]]
name = "windows-sys" name = "windows-sys"
version = "0.61.2" version = "0.61.2"
@@ -4514,13 +4909,30 @@ dependencies = [
"windows_aarch64_gnullvm 0.52.6", "windows_aarch64_gnullvm 0.52.6",
"windows_aarch64_msvc 0.52.6", "windows_aarch64_msvc 0.52.6",
"windows_i686_gnu 0.52.6", "windows_i686_gnu 0.52.6",
"windows_i686_gnullvm", "windows_i686_gnullvm 0.52.6",
"windows_i686_msvc 0.52.6", "windows_i686_msvc 0.52.6",
"windows_x86_64_gnu 0.52.6", "windows_x86_64_gnu 0.52.6",
"windows_x86_64_gnullvm 0.52.6", "windows_x86_64_gnullvm 0.52.6",
"windows_x86_64_msvc 0.52.6", "windows_x86_64_msvc 0.52.6",
] ]
[[package]]
name = "windows-targets"
version = "0.53.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4945f9f551b88e0d65f3db0bc25c33b8acea4d9e41163edf90dcd0b19f9069f3"
dependencies = [
"windows-link 0.2.1",
"windows_aarch64_gnullvm 0.53.1",
"windows_aarch64_msvc 0.53.1",
"windows_i686_gnu 0.53.1",
"windows_i686_gnullvm 0.53.1",
"windows_i686_msvc 0.53.1",
"windows_x86_64_gnu 0.53.1",
"windows_x86_64_gnullvm 0.53.1",
"windows_x86_64_msvc 0.53.1",
]
[[package]] [[package]]
name = "windows-threading" name = "windows-threading"
version = "0.1.0" version = "0.1.0"
@@ -4551,6 +4963,12 @@ version = "0.52.6"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3"
[[package]]
name = "windows_aarch64_gnullvm"
version = "0.53.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a9d8416fa8b42f5c947f8482c43e7d89e73a173cead56d044f6a56104a6d1b53"
[[package]] [[package]]
name = "windows_aarch64_msvc" name = "windows_aarch64_msvc"
version = "0.42.2" version = "0.42.2"
@@ -4563,6 +4981,12 @@ version = "0.52.6"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469"
[[package]]
name = "windows_aarch64_msvc"
version = "0.53.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b9d782e804c2f632e395708e99a94275910eb9100b2114651e04744e9b125006"
[[package]] [[package]]
name = "windows_i686_gnu" name = "windows_i686_gnu"
version = "0.42.2" version = "0.42.2"
@@ -4575,12 +4999,24 @@ version = "0.52.6"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b"
[[package]]
name = "windows_i686_gnu"
version = "0.53.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "960e6da069d81e09becb0ca57a65220ddff016ff2d6af6a223cf372a506593a3"
[[package]] [[package]]
name = "windows_i686_gnullvm" name = "windows_i686_gnullvm"
version = "0.52.6" version = "0.52.6"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66"
[[package]]
name = "windows_i686_gnullvm"
version = "0.53.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "fa7359d10048f68ab8b09fa71c3daccfb0e9b559aed648a8f95469c27057180c"
[[package]] [[package]]
name = "windows_i686_msvc" name = "windows_i686_msvc"
version = "0.42.2" version = "0.42.2"
@@ -4593,6 +5029,12 @@ version = "0.52.6"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66"
[[package]]
name = "windows_i686_msvc"
version = "0.53.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1e7ac75179f18232fe9c285163565a57ef8d3c89254a30685b57d83a38d326c2"
[[package]] [[package]]
name = "windows_x86_64_gnu" name = "windows_x86_64_gnu"
version = "0.42.2" version = "0.42.2"
@@ -4605,6 +5047,12 @@ version = "0.52.6"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78"
[[package]]
name = "windows_x86_64_gnu"
version = "0.53.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9c3842cdd74a865a8066ab39c8a7a473c0778a3f29370b5fd6b4b9aa7df4a499"
[[package]] [[package]]
name = "windows_x86_64_gnullvm" name = "windows_x86_64_gnullvm"
version = "0.42.2" version = "0.42.2"
@@ -4617,6 +5065,12 @@ version = "0.52.6"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d"
[[package]]
name = "windows_x86_64_gnullvm"
version = "0.53.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0ffa179e2d07eee8ad8f57493436566c7cc30ac536a3379fdf008f47f6bb7ae1"
[[package]] [[package]]
name = "windows_x86_64_msvc" name = "windows_x86_64_msvc"
version = "0.42.2" version = "0.42.2"
@@ -4629,6 +5083,12 @@ version = "0.52.6"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec"
[[package]]
name = "windows_x86_64_msvc"
version = "0.53.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d6bbff5f0aada427a1e5a6da5f1f98158182f26556f345ac9e04d36d0ebed650"
[[package]] [[package]]
name = "winnow" name = "winnow"
version = "0.5.40" version = "0.5.40"
@@ -4781,7 +5241,7 @@ dependencies = [
"gtk", "gtk",
"http", "http",
"javascriptcore-rs", "javascriptcore-rs",
"jni", "jni 0.21.1",
"libc", "libc",
"ndk", "ndk",
"objc2", "objc2",
@@ -4837,6 +5297,16 @@ dependencies = [
"pkg-config", "pkg-config",
] ]
[[package]]
name = "xattr"
version = "1.6.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "32e45ad4206f6d2479085147f02bc2ef834ac85886624a23575ae137c8aa8156"
dependencies = [
"libc",
"rustix",
]
[[package]] [[package]]
name = "yoke" name = "yoke"
version = "0.8.2" version = "0.8.2"
@@ -4901,6 +5371,12 @@ dependencies = [
"synstructure", "synstructure",
] ]
[[package]]
name = "zeroize"
version = "1.9.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e13c156562582aa81c60cb29407084cdb54c4164760106ab78e6c5b0858cf64e"
[[package]] [[package]]
name = "zerotrie" name = "zerotrie"
version = "0.2.4" version = "0.2.4"
@@ -4934,6 +5410,18 @@ dependencies = [
"syn 2.0.117", "syn 2.0.117",
] ]
[[package]]
name = "zip"
version = "4.6.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "caa8cd6af31c3b31c6631b8f483848b91589021b28fffe50adada48d4f4d2ed1"
dependencies = [
"arbitrary",
"crc32fast",
"indexmap 2.14.0",
"memchr",
]
[[package]] [[package]]
name = "zmij" name = "zmij"
version = "1.0.21" version = "1.0.21"
+4
View File
@@ -23,3 +23,7 @@ serde = { version = "1.0", features = ["derive"] }
log = "0.4" log = "0.4"
tauri = { version = "2.11.2", features = [] } tauri = { version = "2.11.2", features = [] }
tauri-plugin-log = "2" tauri-plugin-log = "2"
tauri-plugin-process = "2"
[target.'cfg(not(any(target_os = "android", target_os = "ios")))'.dependencies]
tauri-plugin-updater = "2"
+1 -1
View File
@@ -1,3 +1,3 @@
fn main() { fn main() {
tauri_build::build() tauri_build::build()
} }
+2 -1
View File
@@ -6,6 +6,7 @@
"main" "main"
], ],
"permissions": [ "permissions": [
"core:default" "core:default",
"process:default"
] ]
} }
+14
View File
@@ -0,0 +1,14 @@
{
"identifier": "desktop-capability",
"platforms": [
"macOS",
"windows",
"linux"
],
"windows": [
"main"
],
"permissions": [
"updater:default"
]
}
Binary file not shown.

Before

Width:  |  Height:  |  Size: 11 KiB

After

Width:  |  Height:  |  Size: 4.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 23 KiB

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.2 KiB

After

Width:  |  Height:  |  Size: 838 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.0 KiB

After

Width:  |  Height:  |  Size: 3.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 12 KiB

After

Width:  |  Height:  |  Size: 5.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 13 KiB

After

Width:  |  Height:  |  Size: 5.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 25 KiB

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.0 KiB

After

Width:  |  Height:  |  Size: 790 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 28 KiB

After

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.3 KiB

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.9 KiB

After

Width:  |  Height:  |  Size: 2.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.4 KiB

After

Width:  |  Height:  |  Size: 2.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.9 KiB

After

Width:  |  Height:  |  Size: 1.4 KiB

@@ -0,0 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
<foreground android:drawable="@mipmap/ic_launcher_foreground"/>
<background android:drawable="@color/ic_launcher_background"/>
</adaptive-icon>
Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 31 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.4 KiB

@@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<color name="ic_launcher_background">#fff</color>
</resources>
Binary file not shown.
Binary file not shown.

Before

Width:  |  Height:  |  Size: 37 KiB

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 49 KiB

After

Width:  |  Height:  |  Size: 44 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 513 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 751 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 164 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.6 KiB

+15 -13
View File
@@ -1,16 +1,18 @@
#[cfg_attr(mobile, tauri::mobile_entry_point)] #[cfg_attr(mobile, tauri::mobile_entry_point)]
pub fn run() { pub fn run() {
tauri::Builder::default() tauri::Builder::default()
.setup(|app| { .plugin(tauri_plugin_process::init())
if cfg!(debug_assertions) { .plugin(tauri_plugin_updater::Builder::new().build())
app.handle().plugin( .setup(|app| {
tauri_plugin_log::Builder::default() if cfg!(debug_assertions) {
.level(log::LevelFilter::Info) app.handle().plugin(
.build(), tauri_plugin_log::Builder::default()
)?; .level(log::LevelFilter::Info)
} .build(),
Ok(()) )?;
}) }
.run(tauri::generate_context!()) Ok(())
.expect("error while running tauri application"); })
.run(tauri::generate_context!())
.expect("error while running tauri application");
} }
+1 -1
View File
@@ -2,5 +2,5 @@
#![cfg_attr(not(debug_assertions), windows_subsystem = "windows")] #![cfg_attr(not(debug_assertions), windows_subsystem = "windows")]
fn main() { fn main() {
app_lib::run(); app_lib::run();
} }
+15 -6
View File
@@ -1,10 +1,10 @@
{ {
"$schema": "../node_modules/@tauri-apps/cli/config.schema.json", "$schema": "../node_modules/@tauri-apps/cli/config.schema.json",
"productName": "court-pilot", "productName": "court-pilot",
"version": "0.1.0", "version": "1.1.1",
"identifier": "com.tauri.dev", "identifier": "com.courtpilot.dev",
"build": { "build": {
"frontendDist": "../wwww", "frontendDist": "../www",
"devUrl": "http://localhost:8103", "devUrl": "http://localhost:8103",
"beforeDevCommand": "npm start", "beforeDevCommand": "npm start",
"beforeBuildCommand": "ionic build" "beforeBuildCommand": "ionic build"
@@ -15,10 +15,10 @@
"minHeight": 600, "minHeight": 600,
"minWidth": 800, "minWidth": 800,
"title": "Court Pilot", "title": "Court Pilot",
"width": 800, "width": 1366,
"height": 600, "height": 768,
"resizable": true, "resizable": true,
"fullscreen": false "fullscreen": true
} }
], ],
"security": { "security": {
@@ -37,6 +37,15 @@
], ],
"android": { "android": {
"debugApplicationIdSuffix": ".debug" "debugApplicationIdSuffix": ".debug"
},
"createUpdaterArtifacts": true
},
"plugins": {
"updater": {
"endpoints": [
"https://cdn.crabnebula.app/update/trweb/court-pilot/{{target}}-{{arch}}/{{current_version}}"
],
"pubkey": "dW50cnVzdGVkIGNvbW1lbnQ6IG1pbmlzaWduIHB1YmxpYyBrZXk6IEY3MDU5NkNDN0Y3QTQ3RDgKUldUWVIzcC96SllGOTduTUFweEUraTE2WUxjczRJNDdoaFFIb1VRT1o5aHdJeFg2RlRlUGoxRTcK"
} }
} }
} }
+56 -4
View File
@@ -1,11 +1,63 @@
import { Component } from '@angular/core'; import { Component, inject } from '@angular/core';
import { IonApp, IonRouterOutlet } from '@ionic/angular/standalone'; import {
AlertController,
IonApp,
IonRouterOutlet
} from '@ionic/angular/standalone';
import { check } from '@tauri-apps/plugin-updater';
import { isTauri } from '@tauri-apps/api/core';
import { relaunch } from '@tauri-apps/plugin-process';
import { TranslationService } from './i18n/translation.service';
@Component({ @Component({
selector: 'app-root', selector: 'app-root',
templateUrl: 'app.component.html', templateUrl: 'app.component.html',
imports: [IonApp, IonRouterOutlet], imports: [IonApp, IonRouterOutlet]
}) })
export class AppComponent { export class AppComponent {
constructor() {} readonly alertController: AlertController = inject(AlertController);
readonly translationService: TranslationService = inject(TranslationService);
constructor() {
this.checkForUpdates();
}
private async checkForUpdates(): Promise<void> {
if (!isTauri()) {
return;
}
try {
const update = await check();
if (update) {
const alert = await this.alertController.create({
header: this.translationService.translate('updateAvailable'),
message: this.translationService.translate('newVersion', {
version: update.version
}),
buttons: [
{
text: 'OK',
handler: async () => {
try {
await update.downloadAndInstall();
await relaunch();
} catch (error) {
console.error('Failed to install update:', error);
}
}
}
]
});
await alert.present();
return;
}
console.log('No updates available.');
} catch (error) {
console.error('Failed to check for updates:', error);
}
}
} }
+11 -3
View File
@@ -1,16 +1,24 @@
import { Pipe, PipeTransform } from '@angular/core'; import { inject, Pipe, PipeTransform } from '@angular/core';
import { Umpire } from 'db'; import { Umpire } from 'db';
import { TranslationService } from './i18n/translation.service';
@Pipe({ @Pipe({
name: 'fullname', name: 'fullname',
standalone: true standalone: true,
pure: false
}) })
export class FullnamePipe implements PipeTransform { export class FullnamePipe implements PipeTransform {
readonly translationService = inject(TranslationService);
transform(value: Umpire | undefined, ...args: unknown[]): string { transform(value: Umpire | undefined, ...args: unknown[]): string {
if (typeof value === 'undefined') { if (typeof value === 'undefined') {
return ''; return '';
} }
// TODO: in case of multilang, change here
if (this.translationService.language() === 'en') {
return value.firstName + ' ' + value.lastName;
}
return value.lastName + ' ' + value.firstName; return value.lastName + ' ' + value.firstName;
} }
} }
+16
View File
@@ -0,0 +1,16 @@
import { Pipe, PipeTransform, inject } from '@angular/core';
import { TranslationKey, TranslationParams } from './translations';
import { TranslationService } from './translation.service';
@Pipe({
name: 'translate',
standalone: true,
pure: false
})
export class TranslatePipe implements PipeTransform {
private readonly translationService = inject(TranslationService);
transform(key: TranslationKey, params: TranslationParams = {}): string {
return this.translationService.translate(key, params);
}
}
+47
View File
@@ -0,0 +1,47 @@
import { Injectable, signal } from '@angular/core';
import {
translations,
Language,
TranslationKey,
TranslationParams
} from './translations';
@Injectable({
providedIn: 'root'
})
export class TranslationService {
private readonly storageKey = 'language';
readonly language = signal<Language>(this.getInitialLanguage());
setLanguage(language: Language): void {
this.language.set(language);
localStorage.setItem(this.storageKey, language);
}
translate(key: TranslationKey, params: TranslationParams = {}): string {
let text: string = translations[this.language()][key];
for (const [param, value] of Object.entries(params)) {
text = text.replaceAll(`{${param}}`, String(value));
}
return text;
}
private getInitialLanguage(): Language {
const stored = localStorage.getItem(this.storageKey);
if (stored && stored in translations) {
return stored as Language;
}
const browserLanguage = navigator.language.split('-')[0] as Language;
if (browserLanguage in translations) {
return browserLanguage;
}
return 'en';
}
}
+96
View File
@@ -0,0 +1,96 @@
import { language, male, settings } from 'ionicons/icons';
import { noop } from 'rxjs';
export const translations = {
en: {
courts: 'Courts',
numberOfCourts: 'Number of Courts',
showAlerts: 'Show alerts on quick buttons',
serviceJudge: 'Service Judge',
language: 'Language',
settings: 'Settings',
courtOfficials: 'Court Officials',
add: 'Add',
noCourtOfficials: 'No court officials',
newCourtOfficial: 'New Court Official',
cancel: 'Cancel',
save: 'Save',
firstName: 'First Name',
lastName: 'Last Name',
country: 'Country',
gender: 'Gender',
male: 'Male',
female: 'Female',
confirmation: 'Confirmation',
confirmDeleteUmpire: 'Do you really want to delete this court official?',
no: 'No',
yes: 'Yes',
umpires: 'Umpires',
serviceJudges: 'Service Judges',
notOnDuty: 'Not on Duty',
shortCourtName: 'C',
court: 'Court',
umpire: 'Umpire',
removeUmpireFromCourt:
'Are you sure you want to remove them from the court?',
removeUmpiresFromCourt:
'Are you sure you want to remove them from the court?',
courtConfirm: 'Court {courtNo}',
sendUmpireToCourt: 'Are you sure you want to send them to the court?',
sendUmpiresToCourt: 'Are you sure you want to send them to the court?',
sendUmpireMessage: '{umpire}',
sendUmpiresMessage: '{umpire} - {serviceJudge}',
version: 'Version',
updateAvailable: 'Update available',
newVersion: 'A new version {version} is available. The application will restart to install the update.',
english: 'English',
hungarian: 'Hungarian',
},
hu: {
courts: 'Pályák',
numberOfCourts: 'Pályák száma',
showAlerts: 'Figyelmeztetések megjelenítése a gyors gomboknál',
serviceJudge: 'Adogatásbíró',
language: 'Nyelv',
settings: 'Beállítások',
courtOfficials: 'Tisztségviselők',
add: 'Hozzáadás',
noCourtOfficials: 'Nincsenek tisztségviselők',
newCourtOfficial: 'Új Tisztségviselő',
cancel: 'Mégse',
save: 'Mentés',
firstName: 'Keresztnév',
lastName: 'Vezetéknév',
country: 'Ország',
gender: 'Nem',
male: 'Férfi',
female: 'Nő',
confirmation: 'Megerősítés',
confirmDeleteUmpire: 'Biztosan törölni szeretnéd ezt a tisztségviselőt?',
no: 'Nem',
yes: 'Igen',
umpires: 'Játékvezetők',
serviceJudges: 'Adogatásbírók',
notOnDuty: 'Pihenő',
shortCourtName: 'P',
court: 'Pálya',
umpire: 'Játékvezető',
removeUmpireFromCourt: 'Biztos leveszed őt a pályáról?',
removeUmpiresFromCourt: 'Biztos leveszed őket a pályáról?',
courtConfirm: 'Pálya {courtNo}',
sendUmpireToCourt: 'Biztos pályára küldöd őt?',
sendUmpiresToCourt: 'Biztos pályára küldöd őket?',
sendUmpireMessage: '{umpire}',
sendUmpiresMessage: '{umpire} - {serviceJudge}',
version: 'Verzió',
updateAvailable: 'Új verzió elérhető',
newVersion: 'Új elérhető verzió: {version} is available. A frissítések telepítése után az alkalmazás újraindul.',
english: 'Angol',
hungarian: 'Magyar',
}
} as const;
export type Language = keyof typeof translations;
export type TranslationKey = keyof typeof translations.en;
export type TranslationParams = Record<string, string | number>;
+25 -15
View File
@@ -1,34 +1,36 @@
<ion-header [translucent]="true"> <ion-header [translucent]="true">
<ion-toolbar> <ion-toolbar>
<ion-title> Pályák </ion-title> <ion-title> {{ 'courts' | translate }} </ion-title>
</ion-toolbar> </ion-toolbar>
</ion-header> </ion-header>
<ion-content [fullscreen]="true" cdkDropListGroup> <ion-content [fullscreen]="true" cdkDropListGroup>
<ion-header collapse="condense"> <ion-header collapse="condense">
<ion-toolbar> <ion-toolbar>
<ion-title size="large">Pályák</ion-title> <ion-title size="large">{{ 'courts' | translate }}</ion-title>
</ion-toolbar> </ion-toolbar>
</ion-header> </ion-header>
<ion-grid [fixed]="'fixed'" class="bottom-lists"> <ion-grid [fixed]="'fixed'" class="bottom-lists">
<ion-row> <ion-row>
<ion-col [size]="1" class="ion-display-none ion-display-xl-block"> <ion-col [size]="1" class="ion-display-none ion-display-xl-block">
<ion-item [lines]="'none'">Pálya</ion-item> <ion-item [lines]="'none'">{{ 'court' | translate }}</ion-item>
</ion-col> </ion-col>
<ion-col [size]="1" class="ion-display-xl-none"> <ion-col [size]="1" class="ion-display-xl-none">
<ion-item [lines]="'none'">P</ion-item> <ion-item [lines]="'none'">{{ 'shortCourtName' | translate }}</ion-item>
</ion-col> </ion-col>
<ion-col> <ion-col>
<ion-item [lines]="'none'"> <ion-item [lines]="'none'">
<ion-label class="ion-text-center"> Játékvezető </ion-label> <ion-label class="ion-text-center"> {{ 'umpire' | translate }} </ion-label>
</ion-item> </ion-item>
</ion-col> </ion-col>
@if (serviceJudgeEnabled()) {
<ion-col> <ion-col>
<ion-item [lines]="'none'"> <ion-item [lines]="'none'">
<ion-label class="ion-text-center"> Adogatásbíró </ion-label> <ion-label class="ion-text-center"> {{ 'serviceJudge' | translate }} </ion-label>
</ion-item> </ion-item>
</ion-col> </ion-col>
}
<ion-col size="2" sizeLg="1"></ion-col> <ion-col size="2" sizeLg="1"></ion-col>
</ion-row> </ion-row>
@for (item of [].constructor(settings()?.numberOfCourts); track $index) { @for (item of [].constructor(settings()?.numberOfCourts); track $index) {
@@ -58,6 +60,7 @@
} }
</ion-list> </ion-list>
</ion-col> </ion-col>
@if (serviceJudgeEnabled()) {
<ion-col> <ion-col>
<ion-list <ion-list
[lines]="'none'" [lines]="'none'"
@@ -77,11 +80,13 @@
} }
</ion-list> </ion-list>
</ion-col> </ion-col>
}
<ion-col size="2" sizeLg="1"> <ion-col size="2" sizeLg="1">
<ion-list> <ion-list>
<ion-item lines="none"> <ion-item lines="none">
@if (umpireByCourt().get($index + 1) && @if ( (umpireByCourt().get($index + 1) &&
serviceJudgeByCourt().get($index + 1)) { serviceJudgeByCourt().get($index + 1)) ||
(umpireByCourt().get($index + 1) && !serviceJudgeEnabled()) ) {
<ion-button <ion-button
[color]="'danger'" [color]="'danger'"
(click)="showRemoveConfirmation($index + 1)"> (click)="showRemoveConfirmation($index + 1)">
@@ -90,9 +95,10 @@
size="large" size="large"
name="exit-outline"></ion-icon> name="exit-outline"></ion-icon>
</ion-button> </ion-button>
} @else if (!umpireByCourt().get($index + 1) && } @else if ((!umpireByCourt().get($index + 1) &&
!serviceJudgeByCourt().get($index + 1) && waitingUmpires().length && !serviceJudgeByCourt().get($index + 1) && waitingUmpires().length &&
waitingServiceJudges().length) { waitingServiceJudges().length) || (!umpireByCourt().get($index + 1)
&& waitingUmpires().length && !serviceJudgeEnabled())) {
<ion-button <ion-button
[color]="'success'" [color]="'success'"
[disabled]="" [disabled]=""
@@ -111,19 +117,21 @@
</ion-grid> </ion-grid>
<ion-grid [fixed]="'fixed'" class="ion-margin-top bottom-lists"> <ion-grid [fixed]="'fixed'" class="ion-margin-top bottom-lists">
<ion-row> <ion-row>
<ion-col [size]="4"> <ion-col [size]="!serviceJudgeEnabled() ? 6 : 4">
<ion-item color="primary"> <ion-item color="primary">
<ion-label class="ion-text-center"> Játékvezetők </ion-label> <ion-label class="ion-text-center"> {{ 'umpires' | translate }} </ion-label>
</ion-item> </ion-item>
</ion-col> </ion-col>
@if (serviceJudgeEnabled()) {
<ion-col [size]="4"> <ion-col [size]="4">
<ion-item color="primary"> <ion-item color="primary">
<ion-label class="ion-text-center"> Adogatásbírók </ion-label> <ion-label class="ion-text-center"> {{ 'serviceJudges' | translate }} </ion-label>
</ion-item> </ion-item>
</ion-col> </ion-col>
<ion-col [size]="4"> }
<ion-col [size]="!serviceJudgeEnabled() ? 6 : 4">
<ion-item color="medium"> <ion-item color="medium">
<ion-label class="ion-text-center"> Pihenők </ion-label> <ion-label class="ion-text-center"> {{ 'notOnDuty' | translate }} </ion-label>
</ion-item> </ion-item>
</ion-col> </ion-col>
</ion-row> </ion-row>
@@ -145,6 +153,7 @@
} }
</ion-list> </ion-list>
</ion-col> </ion-col>
@if (serviceJudgeEnabled()) {
<ion-col> <ion-col>
<ion-list <ion-list
[lines]="'none'" [lines]="'none'"
@@ -162,6 +171,7 @@
} }
</ion-list> </ion-list>
</ion-col> </ion-col>
}
<ion-col> <ion-col>
<ion-list <ion-list
[lines]="'none'" [lines]="'none'"
+101 -15
View File
@@ -32,6 +32,8 @@ import { CourtUmpireService } from '../services/court.umpire.service';
import { CourtServiceJudgeService } from '../services/court.service.judge.service'; import { CourtServiceJudgeService } from '../services/court.service.judge.service';
import { addIcons } from 'ionicons'; import { addIcons } from 'ionicons';
import { enterOutline, exitOutline } from 'ionicons/icons'; import { enterOutline, exitOutline } from 'ionicons/icons';
import { TranslatePipe } from '../i18n/translation.pipe';
import { TranslationService } from '../i18n/translation.service';
@Component({ @Component({
selector: 'app-tab1', selector: 'app-tab1',
@@ -56,7 +58,8 @@ import { enterOutline, exitOutline } from 'ionicons/icons';
CdkDrag, CdkDrag,
CommonModule, CommonModule,
CdkDragPlaceholder, CdkDragPlaceholder,
CdkDropListGroup CdkDropListGroup,
TranslatePipe
] ]
}) })
export class Tab1Page { export class Tab1Page {
@@ -70,6 +73,7 @@ export class Tab1Page {
readonly waitingServiceJudgeService = inject(WaitingServiceJudgesService); readonly waitingServiceJudgeService = inject(WaitingServiceJudgesService);
readonly courtUmpireService = inject(CourtUmpireService); readonly courtUmpireService = inject(CourtUmpireService);
readonly courtServiceJudgeService = inject(CourtServiceJudgeService); readonly courtServiceJudgeService = inject(CourtServiceJudgeService);
readonly translationService = inject(TranslationService);
private alertController = inject(AlertController); private alertController = inject(AlertController);
private fullnamePipe = inject(FullnamePipe); private fullnamePipe = inject(FullnamePipe);
@@ -270,6 +274,13 @@ export class Tab1Page {
return Array.from({ length: count }, (_, i) => i + 1); return Array.from({ length: count }, (_, i) => i + 1);
}); });
/**
* Is service judge functionality enabled in settings.
*/
readonly serviceJudgeEnabled = computed(() => {
return this.settings()?.withServiceJudge ?? false;
});
dropToRest(event: CdkDragDrop<Umpire[]>) { dropToRest(event: CdkDragDrop<Umpire[]>) {
if (event.previousContainer === event.container) { if (event.previousContainer === event.container) {
return; return;
@@ -378,25 +389,48 @@ export class Tab1Page {
const umpire = this.umpireByCourt().get(courtNo); const umpire = this.umpireByCourt().get(courtNo);
const serviceJudge = this.serviceJudgeByCourt().get(courtNo); const serviceJudge = this.serviceJudgeByCourt().get(courtNo);
if (typeof umpire === 'undefined' || typeof serviceJudge === 'undefined') { if (
typeof umpire === 'undefined' ||
(typeof serviceJudge === 'undefined' && this.serviceJudgeEnabled())
) {
return;
}
if (!this.settings()?.showAlert) {
this.removeUmpiresFromCourt(courtNo);
return; return;
} }
const alert = await this.alertController.create({ const alert = await this.alertController.create({
header: `Pálya ${courtNo}`, header: this.translationService.translate('courtConfirm', {
subHeader: 'Biztos leveszed őket pályáról?', courtNo
}),
subHeader: this.translationService.translate(
serviceJudge ? 'removeUmpiresFromCourt' : 'removeUmpireFromCourt'
),
cssClass: 'wide', cssClass: 'wide',
message: `${this.fullnamePipe.transform(umpire)} - ${this.fullnamePipe.transform(serviceJudge)}`,
message: `${this.fullnamePipe.transform(umpire)}${
serviceJudge ? ' - ' : ''
}${this.fullnamePipe.transform(serviceJudge)}`,
buttons: [ buttons: [
{ {
text: 'Nem', text: this.translationService.translate('no'),
role: 'cancel' role: 'cancel'
}, },
{ {
text: 'Igen', text: this.translationService.translate('yes'),
role: 'confirm', role: 'confirm',
handler: () => { handler: () => {
this.removeUmpiresFromCourt(courtNo); if (this.serviceJudgeEnabled()) {
this.removeUmpiresFromCourt(courtNo);
return;
}
this.removeUmpireFromCourt(courtNo);
} }
} }
] ]
@@ -405,6 +439,9 @@ export class Tab1Page {
await alert.present(); await alert.present();
} }
/**
* This is for removing both umpire and service judge from the court (when service judge is enabled).
*/
private async removeUmpiresFromCourt(courtNo: number) { private async removeUmpiresFromCourt(courtNo: number) {
const umpire = this.umpireByCourt().get(courtNo); const umpire = this.umpireByCourt().get(courtNo);
const serviceJudge = this.serviceJudgeByCourt().get(courtNo); const serviceJudge = this.serviceJudgeByCourt().get(courtNo);
@@ -419,30 +456,74 @@ export class Tab1Page {
await this.waitingServiceJudgeService.add(umpire.id); await this.waitingServiceJudgeService.add(umpire.id);
} }
/**
* This is for removing 1 umpire only (when service judge is not enabled).
*/
private async removeUmpireFromCourt(courtNo: number) {
const umpire = this.umpireByCourt().get(courtNo);
if (typeof umpire === 'undefined') {
return;
}
await this.courtUmpireService.removeByUmpireId(umpire.id);
await this.waitingUmpireService.add(umpire.id);
}
public async showAddConfirmation(courtNo: number) { public async showAddConfirmation(courtNo: number) {
const umpire = await this.waitingUmpireService.getCurrentUmpire(); const umpire = await this.waitingUmpireService.getCurrentUmpire();
const serviceJudge = const serviceJudge =
await this.waitingServiceJudgeService.getCurrentUmpire(); await this.waitingServiceJudgeService.getCurrentUmpire();
if (typeof umpire === 'undefined' || typeof serviceJudge === 'undefined') { if (
typeof umpire === 'undefined' ||
(typeof serviceJudge === 'undefined' && this.serviceJudgeEnabled())
) {
return;
}
if (!this.settings()?.showAlert) {
if (this.serviceJudgeEnabled() && serviceJudge) {
this.addUmpiresToCourt(courtNo, umpire, serviceJudge);
return;
}
this.addUmpireToCourt(courtNo, umpire);
return; return;
} }
const alert = await this.alertController.create({ const alert = await this.alertController.create({
header: `Pálya ${courtNo}`, header: this.translationService.translate('court', {
courtNo
}),
cssClass: 'wide', cssClass: 'wide',
subHeader: 'Biztos pályára küldöd őket?',
message: `${this.fullnamePipe.transform(umpire)} - ${this.fullnamePipe.transform(serviceJudge)}`, subHeader: this.translationService.translate(
serviceJudge ? 'sendUmpiresToCourt' : 'sendUmpireToCourt'
),
message: this.translationService.translate(
serviceJudge ? 'sendUmpiresMessage' : 'sendUmpireMessage',
{
umpire: this.fullnamePipe.transform(umpire),
serviceJudge: this.fullnamePipe.transform(serviceJudge)
}
),
buttons: [ buttons: [
{ {
text: 'Nem', text: this.translationService.translate('no'),
role: 'cancel' role: 'cancel'
}, },
{ {
text: 'Igen', text: this.translationService.translate('yes'),
role: 'confirm', role: 'confirm',
handler: () => { handler: () => {
this.addUmpiresToCourt(courtNo, umpire, serviceJudge); if (this.serviceJudgeEnabled() && serviceJudge) {
this.addUmpiresToCourt(courtNo, umpire, serviceJudge);
} else {
this.addUmpireToCourt(courtNo, umpire);
}
} }
} }
] ]
@@ -465,4 +546,9 @@ export class Tab1Page {
await this.waitingUmpireService.removeByUmpireId(umpire.id); await this.waitingUmpireService.removeByUmpireId(umpire.id);
await this.waitingServiceJudgeService.removeByUmpireId(serviceJudge.id); await this.waitingServiceJudgeService.removeByUmpireId(serviceJudge.id);
} }
private async addUmpireToCourt(courtNo: number, umpire: Umpire) {
await this.courtUmpireService.save({ courtNo, umpireId: umpire.id });
await this.waitingUmpireService.removeByUmpireId(umpire.id);
}
} }
+19 -14
View File
@@ -1,10 +1,10 @@
<ion-header [translucent]="true"> <ion-header [translucent]="true">
<ion-toolbar> <ion-toolbar>
<ion-title> Játékvezetők </ion-title> <ion-title> {{ 'courtOfficials' | translate }} </ion-title>
<ion-buttons [slot]="'end'"> <ion-buttons [slot]="'end'">
<ion-button [color]="'primary'" [fill]="'solid'" id="open-modal"> <ion-button [color]="'primary'" [fill]="'solid'" id="open-modal">
<ion-icon slot="start" name="add"></ion-icon> <ion-icon slot="start" name="add"></ion-icon>
Hozzáadás {{ 'add' | translate }}
</ion-button> </ion-button>
</ion-buttons> </ion-buttons>
</ion-toolbar> </ion-toolbar>
@@ -32,7 +32,7 @@
</ion-button> </ion-button>
</ion-item> </ion-item>
} @empty { } @empty {
<ion-item> Nincsenek játékvezetők </ion-item> <ion-item> {{ 'noCourtOfficials' | translate }} </ion-item>
} }
</ion-list> </ion-list>
</ion-col> </ion-col>
@@ -44,15 +44,17 @@
<ion-header> <ion-header>
<ion-toolbar> <ion-toolbar>
<ion-buttons slot="start"> <ion-buttons slot="start">
<ion-button (click)="cancel()">Mégse</ion-button> <ion-button (click)="cancel()"
>{{ 'cancel' | translate }}</ion-button
>
</ion-buttons> </ion-buttons>
<ion-title>Új játékvezető</ion-title> <ion-title>{{ 'newCourtOfficial' | translate }}</ion-title>
<ion-buttons slot="end"> <ion-buttons slot="end">
<ion-button <ion-button
[disabled]="!isValidUmpire()" [disabled]="!isValidUmpire()"
(click)="confirm()" (click)="confirm()"
[strong]="true"> [strong]="true">
Mentés {{ 'save' | translate }}
</ion-button> </ion-button>
</ion-buttons> </ion-buttons>
</ion-toolbar> </ion-toolbar>
@@ -61,33 +63,36 @@
<ion-list> <ion-list>
<ion-item> <ion-item>
<ion-input <ion-input
label="Vezetéknév" [label]="'lastName' | translate"
labelPlacement="stacked" labelPlacement="stacked"
type="text" type="text"
placeholder="Vezetéknév" placeholder="{{ 'lastName' | translate }}"
[(ngModel)]="lastName" /> [(ngModel)]="lastName" />
</ion-item> </ion-item>
<ion-item> <ion-item>
<ion-input <ion-input
label="Keresztnév" [label]="'firstName' | translate"
labelPlacement="stacked" labelPlacement="stacked"
type="text" type="text"
placeholder="Keresztnév" placeholder="{{ 'firstName' | translate }}"
[(ngModel)]="firstName" /> [(ngModel)]="firstName" />
</ion-item> </ion-item>
<ion-item> <ion-item>
<ion-input <ion-input
label="Ország" [label]="'country' | translate"
labelPlacement="stacked" labelPlacement="stacked"
type="text" type="text"
placeholder="Ország" placeholder="{{ 'country' | translate }}"
[(ngModel)]="country" /> [(ngModel)]="country" />
</ion-item> </ion-item>
<ion-item> <ion-item>
<ion-select label="Nem" placeholder="Válassz" [(ngModel)]="gender"> <ion-select
[label]="'gender' | translate"
placeholder="{{ 'gender' | translate }}"
[(ngModel)]="gender">
@for (item of genders; track item.code) { @for (item of genders; track item.code) {
<ion-select-option [value]="item.code"> <ion-select-option [value]="item.code">
{{item.label}} {{item.label | translate }}
</ion-select-option> </ion-select-option>
} }
</ion-select> </ion-select>
+28 -17
View File
@@ -1,4 +1,4 @@
import { Component, ViewChild } from '@angular/core'; import { Component, inject, ViewChild } from '@angular/core';
import { import {
IonHeader, IonHeader,
IonToolbar, IonToolbar,
@@ -26,6 +26,9 @@ import { add, trash } from 'ionicons/icons';
import { OverlayEventDetail } from '@ionic/core/components'; import { OverlayEventDetail } from '@ionic/core/components';
import { FormsModule } from '@angular/forms'; import { FormsModule } from '@angular/forms';
import { FullnamePipe } from '../fullname-pipe'; import { FullnamePipe } from '../fullname-pipe';
import { TranslatePipe } from '../i18n/translation.pipe';
import { TranslationKey } from '../i18n/translations';
import { TranslationService } from '../i18n/translation.service';
@Component({ @Component({
selector: 'app-tab2', selector: 'app-tab2',
@@ -51,12 +54,19 @@ import { FullnamePipe } from '../fullname-pipe';
IonSelect, IonSelect,
IonSelectOption, IonSelectOption,
IonList, IonList,
FullnamePipe FullnamePipe,
TranslatePipe
] ]
}) })
export class Tab2Page { export class Tab2Page {
readonly translationService = inject(TranslationService);
@ViewChild(IonModal) modal!: IonModal; @ViewChild(IonModal) modal!: IonModal;
public readonly umpireService = inject(UmpireService);
public readonly fullnamePipe = inject(FullnamePipe);
public readonly alertController = inject(AlertController);
public readonly umpires = this.umpireService.umpires; public readonly umpires = this.umpireService.umpires;
public lastName: string = ''; public lastName: string = '';
@@ -64,16 +74,12 @@ export class Tab2Page {
public country: string = ''; public country: string = '';
public gender: string = ''; public gender: string = '';
public genders = [ public genders: { label: TranslationKey; code: string }[] = [
{ label: 'gender.male', code: 'M' }, { label: 'male', code: 'M' },
{ label: 'gender.female', code: 'W' } { label: 'female', code: 'W' }
]; ];
constructor( constructor() {
private umpireService: UmpireService,
private alertController: AlertController,
private fullnamePipe: FullnamePipe
) {
addIcons({ add, trash }); addIcons({ add, trash });
} }
@@ -96,8 +102,8 @@ export class Tab2Page {
this.modal.dismiss(null, 'cancel'); this.modal.dismiss(null, 'cancel');
} }
confirm() { async confirm() {
this.modal.dismiss( await this.modal.dismiss(
{ {
lastName: this.lastName, lastName: this.lastName,
firstName: this.firstName, firstName: this.firstName,
@@ -106,24 +112,29 @@ export class Tab2Page {
}, },
'confirm' 'confirm'
); );
this.lastName = '';
this.firstName = '';
this.country = '';
this.gender = '';
} }
isValidUmpire(): boolean { isValidUmpire(): boolean {
return this.lastName !== '' && this.firstName !== ''; return this.lastName !== '' && this.firstName !== '';
} }
public async showDeleteConfirmation(umpire: Umpire) { public async showDeleteConfirmation(umpire: Umpire): Promise<void> {
const alert = await this.alertController.create({ const alert = await this.alertController.create({
header: 'Megerősítés', header: this.translationService.translate('confirmation'),
subHeader: 'Biztos törlöd a következő játékvezetőt?', subHeader: this.translationService.translate('confirmDeleteUmpire'),
message: this.fullnamePipe.transform(umpire), message: this.fullnamePipe.transform(umpire),
buttons: [ buttons: [
{ {
text: 'Nem', text: this.translationService.translate('no'),
role: 'cancel' role: 'cancel'
}, },
{ {
text: 'Igen', text: this.translationService.translate('yes'),
role: 'confirm', role: 'confirm',
handler: () => { handler: () => {
// TODO: also remove from first tab // TODO: also remove from first tab
+29 -4
View File
@@ -1,6 +1,6 @@
<ion-header> <ion-header>
<ion-toolbar> <ion-toolbar>
<ion-title>Beállítások</ion-title> <ion-title>{{ 'settings' | translate }}</ion-title>
</ion-toolbar> </ion-toolbar>
</ion-header> </ion-header>
@@ -11,11 +11,27 @@
@if (settings(); as currentSettings) { @if (settings(); as currentSettings) {
<ion-list> <ion-list>
<ion-item>
<ion-select
[label]="'language' | translate"
[value]="translationService.language()"
(ionChange)="updateLanguage($event)"
interface="popover">
<ion-select-option value="en">
{{ 'english' | translate }}
</ion-select-option>
<ion-select-option value="hu">
{{ 'hungarian' | translate }}
</ion-select-option>
</ion-select>
</ion-item>
<ion-item> <ion-item>
<ion-toggle <ion-toggle
[checked]="currentSettings.withServiceJudge" [checked]="currentSettings.withServiceJudge"
(ionChange)="updateWithServiceJudge($event)"> (ionChange)="updateWithServiceJudge($event)">
Adogatásbíró {{ 'serviceJudge' | translate }}
</ion-toggle> </ion-toggle>
</ion-item> </ion-item>
@@ -23,13 +39,13 @@
<ion-toggle <ion-toggle
[checked]="currentSettings.showAlert" [checked]="currentSettings.showAlert"
(ionChange)="updateShowAlert($event)"> (ionChange)="updateShowAlert($event)">
Figyelmeztetések megjelenítése a gyors gomboknál {{ 'showAlerts' | translate }}
</ion-toggle> </ion-toggle>
</ion-item> </ion-item>
<ion-item> <ion-item>
<ion-input <ion-input
label="Pályák száma" [label]="'numberOfCourts' | translate"
type="number" type="number"
min="1" min="1"
labelPlacement="floating" labelPlacement="floating"
@@ -42,5 +58,14 @@
} }
</ion-col> </ion-col>
</ion-row> </ion-row>
<ion-row>
<ion-col sizeLg="6" pushLg="3">
<ion-item>
<ion-label class="ion-text-center"
>{{ 'version' | translate }}: 1.0.0</ion-label
>
</ion-item>
</ion-col>
</ion-row>
</ion-grid> </ion-grid>
</ion-content> </ion-content>
+30 -2
View File
@@ -10,11 +10,19 @@ import {
IonInput, IonInput,
IonGrid, IonGrid,
IonCol, IonCol,
IonRow IonRow,
IonSelect,
IonSelectOption,
IonLabel
} from '@ionic/angular/standalone'; } from '@ionic/angular/standalone';
import { SettingsService } from '../services/settings-service'; import { SettingsService } from '../services/settings-service';
import { CourtUmpireService } from '../services/court.umpire.service'; import { CourtUmpireService } from '../services/court.umpire.service';
import { CourtServiceJudgeService } from '../services/court.service.judge.service'; import { CourtServiceJudgeService } from '../services/court.service.judge.service';
import { CourtServiceJudge } from 'db';
import { WaitingServiceJudgesService } from '../services/waiting-service-judges.service';
import { TranslationService } from '../i18n/translation.service';
import { Language } from '../i18n/translations';
import { TranslatePipe } from '../i18n/translation.pipe';
@Component({ @Component({
selector: 'app-tab3', selector: 'app-tab3',
@@ -31,13 +39,19 @@ import { CourtServiceJudgeService } from '../services/court.service.judge.servic
IonHeader, IonHeader,
IonToolbar, IonToolbar,
IonTitle, IonTitle,
IonContent IonContent,
IonSelect,
IonSelectOption,
TranslatePipe,
IonLabel
] ]
}) })
export class Tab3Page { export class Tab3Page {
readonly settingsService = inject(SettingsService); readonly settingsService = inject(SettingsService);
readonly courtUmpireService = inject(CourtUmpireService); readonly courtUmpireService = inject(CourtUmpireService);
readonly courtServiceJudgeService = inject(CourtServiceJudgeService); readonly courtServiceJudgeService = inject(CourtServiceJudgeService);
readonly waitingServiceJudgeService = inject(WaitingServiceJudgesService);
readonly translationService = inject(TranslationService);
readonly settings = this.settingsService.settings; readonly settings = this.settingsService.settings;
@@ -69,6 +83,16 @@ export class Tab3Page {
await this.settingsService.update({ await this.settingsService.update({
withServiceJudge: event.detail.checked withServiceJudge: event.detail.checked
}); });
if (!event.detail.checked) {
this.courtServiceJudgeService.umpires().map((csj: CourtServiceJudge) => {
this.courtServiceJudgeService.delete(csj.id);
});
this.waitingServiceJudgeService.waitingServiceJudges().map((wsj) => {
this.waitingServiceJudgeService.remove(wsj.id);
});
}
} }
async updateShowAlert(event: CustomEvent): Promise<void> { async updateShowAlert(event: CustomEvent): Promise<void> {
@@ -76,4 +100,8 @@ export class Tab3Page {
showAlert: event.detail.checked showAlert: event.detail.checked
}); });
} }
updateLanguage(event: CustomEvent): void {
this.translationService.setLanguage(event.detail.value as Language);
}
} }
+3 -3
View File
@@ -2,17 +2,17 @@
<ion-tab-bar slot="bottom"> <ion-tab-bar slot="bottom">
<ion-tab-button tab="pilot" href="/tabs/pilot"> <ion-tab-button tab="pilot" href="/tabs/pilot">
<ion-icon aria-hidden="true" name="grid-outline"></ion-icon> <ion-icon aria-hidden="true" name="grid-outline"></ion-icon>
<ion-label>Pályák</ion-label> <ion-label>{{ 'courts' | translate }}</ion-label>
</ion-tab-button> </ion-tab-button>
<ion-tab-button tab="umpires" href="/tabs/umpires"> <ion-tab-button tab="umpires" href="/tabs/umpires">
<ion-icon aria-hidden="true" name="people-outline"></ion-icon> <ion-icon aria-hidden="true" name="people-outline"></ion-icon>
<ion-label>Játékvezetők</ion-label> <ion-label>{{ 'courtOfficials' | translate }}</ion-label>
</ion-tab-button> </ion-tab-button>
<ion-tab-button tab="settings" href="/tabs/settings"> <ion-tab-button tab="settings" href="/tabs/settings">
<ion-icon aria-hidden="true" name="settings-outline"></ion-icon> <ion-icon aria-hidden="true" name="settings-outline"></ion-icon>
<ion-label>Beállítások</ion-label> <ion-label>{{ 'settings' | translate }}</ion-label>
</ion-tab-button> </ion-tab-button>
</ion-tab-bar> </ion-tab-bar>
</ion-tabs> </ion-tabs>
+2 -1
View File
@@ -8,12 +8,13 @@ import {
} from '@ionic/angular/standalone'; } from '@ionic/angular/standalone';
import { addIcons } from 'ionicons'; import { addIcons } from 'ionicons';
import { gridOutline, peopleOutline, settingsOutline } from 'ionicons/icons'; import { gridOutline, peopleOutline, settingsOutline } from 'ionicons/icons';
import { TranslatePipe } from '../i18n/translation.pipe';
@Component({ @Component({
selector: 'app-tabs', selector: 'app-tabs',
templateUrl: 'tabs.page.html', templateUrl: 'tabs.page.html',
styleUrls: ['tabs.page.scss'], styleUrls: ['tabs.page.scss'],
imports: [IonTabs, IonTabBar, IonTabButton, IonIcon, IonLabel] imports: [IonTabs, IonTabBar, IonTabButton, IonIcon, IonLabel, TranslatePipe]
}) })
export class TabsPage { export class TabsPage {
public environmentInjector = inject(EnvironmentInjector); public environmentInjector = inject(EnvironmentInjector);
Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 MiB

+1 -1
View File
@@ -18,7 +18,7 @@
"importHelpers": true, "importHelpers": true,
"target": "es2022", "target": "es2022",
"module": "es2020", "module": "es2020",
"lib": ["es2018", "dom"], "lib": ["es2021", "dom"],
"skipLibCheck": true, "skipLibCheck": true,
"useDefineForClassFields": false "useDefineForClassFields": false
}, },