Compare commits
10 Commits
77618e46ea
...
v2.0.0
| Author | SHA1 | Date | |
|---|---|---|---|
| 4f4047b097 | |||
| 0537cc09cf | |||
| ad1795ba01 | |||
| 95b3e979ad | |||
| a6ff689847 | |||
| 117f52f585 | |||
| 065861a549 | |||
| 787b4f3ea9 | |||
| 710bfa432d | |||
| 518b9e5bf8 |
@@ -14,11 +14,12 @@ jobs:
|
||||
matrix:
|
||||
include:
|
||||
- platform: arch-latest
|
||||
output_dir: src-tauri/target/release/bundle/appimage/**.pkg.tar.zst
|
||||
##- platform: ubuntu-latest
|
||||
## output_dir_one: src-tauri/target/release/bundle/appimage/**.AppImage
|
||||
## output_dir_two: src-tauri/target/release/bundle/deb/**.deb
|
||||
- platform: windows-latest
|
||||
args: --bundles deb
|
||||
output_dir: src-tauri/target/release/bundle/deb/**.pkg.tar.zst
|
||||
- platform: ubuntu-latest
|
||||
output_dir_one: src-tauri/target/release/bundle/appimage/**.AppImage
|
||||
output_dir_two: src-tauri/target/release/bundle/deb/**.deb
|
||||
- platform: window-latest
|
||||
output_dir_one: src-tauri/target/release/bundle/msi/**.msi
|
||||
output_dir_two: src-tauri/target/release/bundle/nsis/**.exe
|
||||
#- platform.os: macos-latest
|
||||
@@ -31,13 +32,6 @@ jobs:
|
||||
# output_dir_two: src-tauri/target/x86_64-apple-darwin/release/bundle/dmg/**.dmg
|
||||
runs-on: ${{ matrix.platform }}
|
||||
steps:
|
||||
- name: Preinstall Arch dependencies
|
||||
if: matrix.platform == 'arch-latest'
|
||||
run: |
|
||||
pacman -Syyu --noconfirm
|
||||
pacman -S nodejs git git-lfs --noconfirm
|
||||
|
||||
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y
|
||||
- name: Setup Node.js
|
||||
uses: actions/setup-node@v4
|
||||
- name: Checkout repository
|
||||
@@ -51,7 +45,7 @@ jobs:
|
||||
touch src-tauri/src/config.rs
|
||||
echo 'pub(crate) static ENC_KEY: &str = "${{secrets.HASH_KEY}}";' > src-tauri/src/config.rs
|
||||
- name: Check files (Windows)
|
||||
if: matrix.platform == 'windows-latest'
|
||||
if: matrix.platform == 'window-latest'
|
||||
run: |
|
||||
New-Item -Path src-tauri/src -name "config.rs" -Value 'pub(crate) static ENC_KEY: &str = "${{secrets.HASH_KEY}}";'
|
||||
|
||||
@@ -73,15 +67,6 @@ jobs:
|
||||
libgtk-3-dev \
|
||||
libayatana-appindicator3-dev \
|
||||
librsvg2-dev -y
|
||||
- name: Install Arch dependencies
|
||||
if: matrix.platform == 'arch-latest'
|
||||
run: |
|
||||
|
||||
useradd -m user
|
||||
su user
|
||||
git clone https://aur.archlinux.org/yay.git && cd yay && makepkg -si --noconfirm
|
||||
exit
|
||||
yay -S debtap --noconfirm
|
||||
- name: Install frontend
|
||||
run: |
|
||||
npm install
|
||||
@@ -113,7 +98,7 @@ jobs:
|
||||
token: ${{secrets.RELEASE_TOKEN}}
|
||||
|
||||
- name: Publish Tauri App
|
||||
if: matrix.platform == 'ubuntu-latest' || matrix.platform == 'windows-latest'
|
||||
if: matrix.platform == 'ubuntu-latest' || matrix.platform == 'window-latest'
|
||||
uses: akkuman/gitea-release-action@v1
|
||||
with:
|
||||
tag_name: ${{gitea.ref_name}}
|
||||
|
||||
@@ -1,12 +0,0 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="ru">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||
<title>Api</title>
|
||||
</head>
|
||||
<body>
|
||||
<div id="app_api"></div>
|
||||
<script type="module" src="/src/api_window.js"></script>
|
||||
</body>
|
||||
</html>
|
||||
@@ -1,21 +1,21 @@
|
||||
{
|
||||
"name": "to-do-app",
|
||||
"version": "0.0.0",
|
||||
"version": "1.4.0",
|
||||
"lockfileVersion": 3,
|
||||
"requires": true,
|
||||
"packages": {
|
||||
"": {
|
||||
"name": "to-do-app",
|
||||
"version": "0.0.0",
|
||||
"version": "1.4.0",
|
||||
"dependencies": {
|
||||
"@tauri-apps/api": "^1",
|
||||
"@tauri-apps/api": "^2.0.1",
|
||||
"@tauri-apps/plugin-shell": "^2.0.0",
|
||||
"@vueuse/core": "^10.10.0",
|
||||
"vue": "^3.3.4",
|
||||
"vue-router": "^4.3.3"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@iconify/vue": "^4.1.2",
|
||||
"@tauri-apps/cli": "^1",
|
||||
"@tauri-apps/cli": "^2.0.1",
|
||||
"@vitejs/plugin-vue": "^5.0.4",
|
||||
"autoprefixer": "^10.4.19",
|
||||
"postcss": "^8.4.38",
|
||||
@@ -49,9 +49,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@esbuild/aix-ppc64": {
|
||||
"version": "0.20.2",
|
||||
"resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.20.2.tgz",
|
||||
"integrity": "sha512-D+EBOJHXdNZcLJRBkhENNG8Wji2kgc9AZ9KiPr1JuZjsNtyHzrsfLRrY0tk2H2aoFu6RANO1y1iPPUCDYWkb5g==",
|
||||
"version": "0.21.5",
|
||||
"resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz",
|
||||
"integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==",
|
||||
"cpu": [
|
||||
"ppc64"
|
||||
],
|
||||
@@ -66,9 +66,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@esbuild/android-arm": {
|
||||
"version": "0.20.2",
|
||||
"resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.20.2.tgz",
|
||||
"integrity": "sha512-t98Ra6pw2VaDhqNWO2Oph2LXbz/EJcnLmKLGBJwEwXX/JAN83Fym1rU8l0JUWK6HkIbWONCSSatf4sf2NBRx/w==",
|
||||
"version": "0.21.5",
|
||||
"resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz",
|
||||
"integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==",
|
||||
"cpu": [
|
||||
"arm"
|
||||
],
|
||||
@@ -83,9 +83,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@esbuild/android-arm64": {
|
||||
"version": "0.20.2",
|
||||
"resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.20.2.tgz",
|
||||
"integrity": "sha512-mRzjLacRtl/tWU0SvD8lUEwb61yP9cqQo6noDZP/O8VkwafSYwZ4yWy24kan8jE/IMERpYncRt2dw438LP3Xmg==",
|
||||
"version": "0.21.5",
|
||||
"resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz",
|
||||
"integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==",
|
||||
"cpu": [
|
||||
"arm64"
|
||||
],
|
||||
@@ -100,9 +100,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@esbuild/android-x64": {
|
||||
"version": "0.20.2",
|
||||
"resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.20.2.tgz",
|
||||
"integrity": "sha512-btzExgV+/lMGDDa194CcUQm53ncxzeBrWJcncOBxuC6ndBkKxnHdFJn86mCIgTELsooUmwUm9FkhSp5HYu00Rg==",
|
||||
"version": "0.21.5",
|
||||
"resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz",
|
||||
"integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==",
|
||||
"cpu": [
|
||||
"x64"
|
||||
],
|
||||
@@ -117,9 +117,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@esbuild/darwin-arm64": {
|
||||
"version": "0.20.2",
|
||||
"resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.20.2.tgz",
|
||||
"integrity": "sha512-4J6IRT+10J3aJH3l1yzEg9y3wkTDgDk7TSDFX+wKFiWjqWp/iCfLIYzGyasx9l0SAFPT1HwSCR+0w/h1ES/MjA==",
|
||||
"version": "0.21.5",
|
||||
"resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz",
|
||||
"integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==",
|
||||
"cpu": [
|
||||
"arm64"
|
||||
],
|
||||
@@ -134,9 +134,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@esbuild/darwin-x64": {
|
||||
"version": "0.20.2",
|
||||
"resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.20.2.tgz",
|
||||
"integrity": "sha512-tBcXp9KNphnNH0dfhv8KYkZhjc+H3XBkF5DKtswJblV7KlT9EI2+jeA8DgBjp908WEuYll6pF+UStUCfEpdysA==",
|
||||
"version": "0.21.5",
|
||||
"resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz",
|
||||
"integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==",
|
||||
"cpu": [
|
||||
"x64"
|
||||
],
|
||||
@@ -151,9 +151,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@esbuild/freebsd-arm64": {
|
||||
"version": "0.20.2",
|
||||
"resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.20.2.tgz",
|
||||
"integrity": "sha512-d3qI41G4SuLiCGCFGUrKsSeTXyWG6yem1KcGZVS+3FYlYhtNoNgYrWcvkOoaqMhwXSMrZRl69ArHsGJ9mYdbbw==",
|
||||
"version": "0.21.5",
|
||||
"resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz",
|
||||
"integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==",
|
||||
"cpu": [
|
||||
"arm64"
|
||||
],
|
||||
@@ -168,9 +168,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@esbuild/freebsd-x64": {
|
||||
"version": "0.20.2",
|
||||
"resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.20.2.tgz",
|
||||
"integrity": "sha512-d+DipyvHRuqEeM5zDivKV1KuXn9WeRX6vqSqIDgwIfPQtwMP4jaDsQsDncjTDDsExT4lR/91OLjRo8bmC1e+Cw==",
|
||||
"version": "0.21.5",
|
||||
"resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz",
|
||||
"integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==",
|
||||
"cpu": [
|
||||
"x64"
|
||||
],
|
||||
@@ -185,9 +185,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@esbuild/linux-arm": {
|
||||
"version": "0.20.2",
|
||||
"resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.20.2.tgz",
|
||||
"integrity": "sha512-VhLPeR8HTMPccbuWWcEUD1Az68TqaTYyj6nfE4QByZIQEQVWBB8vup8PpR7y1QHL3CpcF6xd5WVBU/+SBEvGTg==",
|
||||
"version": "0.21.5",
|
||||
"resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz",
|
||||
"integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==",
|
||||
"cpu": [
|
||||
"arm"
|
||||
],
|
||||
@@ -202,9 +202,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@esbuild/linux-arm64": {
|
||||
"version": "0.20.2",
|
||||
"resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.20.2.tgz",
|
||||
"integrity": "sha512-9pb6rBjGvTFNira2FLIWqDk/uaf42sSyLE8j1rnUpuzsODBq7FvpwHYZxQ/It/8b+QOS1RYfqgGFNLRI+qlq2A==",
|
||||
"version": "0.21.5",
|
||||
"resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz",
|
||||
"integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==",
|
||||
"cpu": [
|
||||
"arm64"
|
||||
],
|
||||
@@ -219,9 +219,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@esbuild/linux-ia32": {
|
||||
"version": "0.20.2",
|
||||
"resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.20.2.tgz",
|
||||
"integrity": "sha512-o10utieEkNPFDZFQm9CoP7Tvb33UutoJqg3qKf1PWVeeJhJw0Q347PxMvBgVVFgouYLGIhFYG0UGdBumROyiig==",
|
||||
"version": "0.21.5",
|
||||
"resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz",
|
||||
"integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==",
|
||||
"cpu": [
|
||||
"ia32"
|
||||
],
|
||||
@@ -236,9 +236,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@esbuild/linux-loong64": {
|
||||
"version": "0.20.2",
|
||||
"resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.20.2.tgz",
|
||||
"integrity": "sha512-PR7sp6R/UC4CFVomVINKJ80pMFlfDfMQMYynX7t1tNTeivQ6XdX5r2XovMmha/VjR1YN/HgHWsVcTRIMkymrgQ==",
|
||||
"version": "0.21.5",
|
||||
"resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz",
|
||||
"integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==",
|
||||
"cpu": [
|
||||
"loong64"
|
||||
],
|
||||
@@ -253,9 +253,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@esbuild/linux-mips64el": {
|
||||
"version": "0.20.2",
|
||||
"resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.20.2.tgz",
|
||||
"integrity": "sha512-4BlTqeutE/KnOiTG5Y6Sb/Hw6hsBOZapOVF6njAESHInhlQAghVVZL1ZpIctBOoTFbQyGW+LsVYZ8lSSB3wkjA==",
|
||||
"version": "0.21.5",
|
||||
"resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz",
|
||||
"integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==",
|
||||
"cpu": [
|
||||
"mips64el"
|
||||
],
|
||||
@@ -270,9 +270,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@esbuild/linux-ppc64": {
|
||||
"version": "0.20.2",
|
||||
"resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.20.2.tgz",
|
||||
"integrity": "sha512-rD3KsaDprDcfajSKdn25ooz5J5/fWBylaaXkuotBDGnMnDP1Uv5DLAN/45qfnf3JDYyJv/ytGHQaziHUdyzaAg==",
|
||||
"version": "0.21.5",
|
||||
"resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz",
|
||||
"integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==",
|
||||
"cpu": [
|
||||
"ppc64"
|
||||
],
|
||||
@@ -287,9 +287,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@esbuild/linux-riscv64": {
|
||||
"version": "0.20.2",
|
||||
"resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.20.2.tgz",
|
||||
"integrity": "sha512-snwmBKacKmwTMmhLlz/3aH1Q9T8v45bKYGE3j26TsaOVtjIag4wLfWSiZykXzXuE1kbCE+zJRmwp+ZbIHinnVg==",
|
||||
"version": "0.21.5",
|
||||
"resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz",
|
||||
"integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==",
|
||||
"cpu": [
|
||||
"riscv64"
|
||||
],
|
||||
@@ -304,9 +304,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@esbuild/linux-s390x": {
|
||||
"version": "0.20.2",
|
||||
"resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.20.2.tgz",
|
||||
"integrity": "sha512-wcWISOobRWNm3cezm5HOZcYz1sKoHLd8VL1dl309DiixxVFoFe/o8HnwuIwn6sXre88Nwj+VwZUvJf4AFxkyrQ==",
|
||||
"version": "0.21.5",
|
||||
"resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz",
|
||||
"integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==",
|
||||
"cpu": [
|
||||
"s390x"
|
||||
],
|
||||
@@ -321,9 +321,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@esbuild/linux-x64": {
|
||||
"version": "0.20.2",
|
||||
"resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.20.2.tgz",
|
||||
"integrity": "sha512-1MdwI6OOTsfQfek8sLwgyjOXAu+wKhLEoaOLTjbijk6E2WONYpH9ZU2mNtR+lZ2B4uwr+usqGuVfFT9tMtGvGw==",
|
||||
"version": "0.21.5",
|
||||
"resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz",
|
||||
"integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==",
|
||||
"cpu": [
|
||||
"x64"
|
||||
],
|
||||
@@ -338,9 +338,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@esbuild/netbsd-x64": {
|
||||
"version": "0.20.2",
|
||||
"resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.20.2.tgz",
|
||||
"integrity": "sha512-K8/DhBxcVQkzYc43yJXDSyjlFeHQJBiowJ0uVL6Tor3jGQfSGHNNJcWxNbOI8v5k82prYqzPuwkzHt3J1T1iZQ==",
|
||||
"version": "0.21.5",
|
||||
"resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz",
|
||||
"integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==",
|
||||
"cpu": [
|
||||
"x64"
|
||||
],
|
||||
@@ -355,9 +355,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@esbuild/openbsd-x64": {
|
||||
"version": "0.20.2",
|
||||
"resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.20.2.tgz",
|
||||
"integrity": "sha512-eMpKlV0SThJmmJgiVyN9jTPJ2VBPquf6Kt/nAoo6DgHAoN57K15ZghiHaMvqjCye/uU4X5u3YSMgVBI1h3vKrQ==",
|
||||
"version": "0.21.5",
|
||||
"resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz",
|
||||
"integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==",
|
||||
"cpu": [
|
||||
"x64"
|
||||
],
|
||||
@@ -372,9 +372,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@esbuild/sunos-x64": {
|
||||
"version": "0.20.2",
|
||||
"resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.20.2.tgz",
|
||||
"integrity": "sha512-2UyFtRC6cXLyejf/YEld4Hajo7UHILetzE1vsRcGL3earZEW77JxrFjH4Ez2qaTiEfMgAXxfAZCm1fvM/G/o8w==",
|
||||
"version": "0.21.5",
|
||||
"resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz",
|
||||
"integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==",
|
||||
"cpu": [
|
||||
"x64"
|
||||
],
|
||||
@@ -389,9 +389,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@esbuild/win32-arm64": {
|
||||
"version": "0.20.2",
|
||||
"resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.20.2.tgz",
|
||||
"integrity": "sha512-GRibxoawM9ZCnDxnP3usoUDO9vUkpAxIIZ6GQI+IlVmr5kP3zUq+l17xELTHMWTWzjxa2guPNyrpq1GWmPvcGQ==",
|
||||
"version": "0.21.5",
|
||||
"resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz",
|
||||
"integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==",
|
||||
"cpu": [
|
||||
"arm64"
|
||||
],
|
||||
@@ -406,9 +406,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@esbuild/win32-ia32": {
|
||||
"version": "0.20.2",
|
||||
"resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.20.2.tgz",
|
||||
"integrity": "sha512-HfLOfn9YWmkSKRQqovpnITazdtquEW8/SoHW7pWpuEeguaZI4QnCRW6b+oZTztdBnZOS2hqJ6im/D5cPzBTTlQ==",
|
||||
"version": "0.21.5",
|
||||
"resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz",
|
||||
"integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==",
|
||||
"cpu": [
|
||||
"ia32"
|
||||
],
|
||||
@@ -423,9 +423,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@esbuild/win32-x64": {
|
||||
"version": "0.20.2",
|
||||
"resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.20.2.tgz",
|
||||
"integrity": "sha512-N49X4lJX27+l9jbLKSqZ6bKNjzQvHaT8IIFUy+YIqmXQdjYCToGWwOItDrfby14c78aDd5NHQl29xingXfCdLQ==",
|
||||
"version": "0.21.5",
|
||||
"resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz",
|
||||
"integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==",
|
||||
"cpu": [
|
||||
"x64"
|
||||
],
|
||||
@@ -439,29 +439,6 @@
|
||||
"node": ">=12"
|
||||
}
|
||||
},
|
||||
"node_modules/@iconify/types": {
|
||||
"version": "2.0.0",
|
||||
"resolved": "https://registry.npmjs.org/@iconify/types/-/types-2.0.0.tgz",
|
||||
"integrity": "sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==",
|
||||
"dev": true,
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/@iconify/vue": {
|
||||
"version": "4.1.2",
|
||||
"resolved": "https://registry.npmjs.org/@iconify/vue/-/vue-4.1.2.tgz",
|
||||
"integrity": "sha512-CQnYqLiQD5LOAaXhBrmj1mdL2/NCJvwcC4jtW2Z8ukhThiFkLDkutarTOV2trfc9EXqUqRs0KqXOL9pZ/IyysA==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@iconify/types": "^2.0.0"
|
||||
},
|
||||
"funding": {
|
||||
"url": "https://github.com/sponsors/cyberalien"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"vue": ">=3"
|
||||
}
|
||||
},
|
||||
"node_modules/@isaacs/cliui": {
|
||||
"version": "8.0.2",
|
||||
"resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz",
|
||||
@@ -582,9 +559,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@rollup/rollup-android-arm-eabi": {
|
||||
"version": "4.18.0",
|
||||
"resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.18.0.tgz",
|
||||
"integrity": "sha512-Tya6xypR10giZV1XzxmH5wr25VcZSncG0pZIjfePT0OVBvqNEurzValetGNarVrGiq66EBVAFn15iYX4w6FKgQ==",
|
||||
"version": "4.24.0",
|
||||
"resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.24.0.tgz",
|
||||
"integrity": "sha512-Q6HJd7Y6xdB48x8ZNVDOqsbh2uByBhgK8PiQgPhwkIw/HC/YX5Ghq2mQY5sRMZWHb3VsFkWooUVOZHKr7DmDIA==",
|
||||
"cpu": [
|
||||
"arm"
|
||||
],
|
||||
@@ -596,9 +573,9 @@
|
||||
]
|
||||
},
|
||||
"node_modules/@rollup/rollup-android-arm64": {
|
||||
"version": "4.18.0",
|
||||
"resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.18.0.tgz",
|
||||
"integrity": "sha512-avCea0RAP03lTsDhEyfy+hpfr85KfyTctMADqHVhLAF3MlIkq83CP8UfAHUssgXTYd+6er6PaAhx/QGv4L1EiA==",
|
||||
"version": "4.24.0",
|
||||
"resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.24.0.tgz",
|
||||
"integrity": "sha512-ijLnS1qFId8xhKjT81uBHuuJp2lU4x2yxa4ctFPtG+MqEE6+C5f/+X/bStmxapgmwLwiL3ih122xv8kVARNAZA==",
|
||||
"cpu": [
|
||||
"arm64"
|
||||
],
|
||||
@@ -610,9 +587,9 @@
|
||||
]
|
||||
},
|
||||
"node_modules/@rollup/rollup-darwin-arm64": {
|
||||
"version": "4.18.0",
|
||||
"resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.18.0.tgz",
|
||||
"integrity": "sha512-IWfdwU7KDSm07Ty0PuA/W2JYoZ4iTj3TUQjkVsO/6U+4I1jN5lcR71ZEvRh52sDOERdnNhhHU57UITXz5jC1/w==",
|
||||
"version": "4.24.0",
|
||||
"resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.24.0.tgz",
|
||||
"integrity": "sha512-bIv+X9xeSs1XCk6DVvkO+S/z8/2AMt/2lMqdQbMrmVpgFvXlmde9mLcbQpztXm1tajC3raFDqegsH18HQPMYtA==",
|
||||
"cpu": [
|
||||
"arm64"
|
||||
],
|
||||
@@ -624,9 +601,9 @@
|
||||
]
|
||||
},
|
||||
"node_modules/@rollup/rollup-darwin-x64": {
|
||||
"version": "4.18.0",
|
||||
"resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.18.0.tgz",
|
||||
"integrity": "sha512-n2LMsUz7Ynu7DoQrSQkBf8iNrjOGyPLrdSg802vk6XT3FtsgX6JbE8IHRvposskFm9SNxzkLYGSq9QdpLYpRNA==",
|
||||
"version": "4.24.0",
|
||||
"resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.24.0.tgz",
|
||||
"integrity": "sha512-X6/nOwoFN7RT2svEQWUsW/5C/fYMBe4fnLK9DQk4SX4mgVBiTA9h64kjUYPvGQ0F/9xwJ5U5UfTbl6BEjaQdBQ==",
|
||||
"cpu": [
|
||||
"x64"
|
||||
],
|
||||
@@ -638,9 +615,9 @@
|
||||
]
|
||||
},
|
||||
"node_modules/@rollup/rollup-linux-arm-gnueabihf": {
|
||||
"version": "4.18.0",
|
||||
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.18.0.tgz",
|
||||
"integrity": "sha512-C/zbRYRXFjWvz9Z4haRxcTdnkPt1BtCkz+7RtBSuNmKzMzp3ZxdM28Mpccn6pt28/UWUCTXa+b0Mx1k3g6NOMA==",
|
||||
"version": "4.24.0",
|
||||
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.24.0.tgz",
|
||||
"integrity": "sha512-0KXvIJQMOImLCVCz9uvvdPgfyWo93aHHp8ui3FrtOP57svqrF/roSSR5pjqL2hcMp0ljeGlU4q9o/rQaAQ3AYA==",
|
||||
"cpu": [
|
||||
"arm"
|
||||
],
|
||||
@@ -652,9 +629,9 @@
|
||||
]
|
||||
},
|
||||
"node_modules/@rollup/rollup-linux-arm-musleabihf": {
|
||||
"version": "4.18.0",
|
||||
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.18.0.tgz",
|
||||
"integrity": "sha512-l3m9ewPgjQSXrUMHg93vt0hYCGnrMOcUpTz6FLtbwljo2HluS4zTXFy2571YQbisTnfTKPZ01u/ukJdQTLGh9A==",
|
||||
"version": "4.24.0",
|
||||
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.24.0.tgz",
|
||||
"integrity": "sha512-it2BW6kKFVh8xk/BnHfakEeoLPv8STIISekpoF+nBgWM4d55CZKc7T4Dx1pEbTnYm/xEKMgy1MNtYuoA8RFIWw==",
|
||||
"cpu": [
|
||||
"arm"
|
||||
],
|
||||
@@ -666,9 +643,9 @@
|
||||
]
|
||||
},
|
||||
"node_modules/@rollup/rollup-linux-arm64-gnu": {
|
||||
"version": "4.18.0",
|
||||
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.18.0.tgz",
|
||||
"integrity": "sha512-rJ5D47d8WD7J+7STKdCUAgmQk49xuFrRi9pZkWoRD1UeSMakbcepWXPF8ycChBoAqs1pb2wzvbY6Q33WmN2ftw==",
|
||||
"version": "4.24.0",
|
||||
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.24.0.tgz",
|
||||
"integrity": "sha512-i0xTLXjqap2eRfulFVlSnM5dEbTVque/3Pi4g2y7cxrs7+a9De42z4XxKLYJ7+OhE3IgxvfQM7vQc43bwTgPwA==",
|
||||
"cpu": [
|
||||
"arm64"
|
||||
],
|
||||
@@ -680,9 +657,9 @@
|
||||
]
|
||||
},
|
||||
"node_modules/@rollup/rollup-linux-arm64-musl": {
|
||||
"version": "4.18.0",
|
||||
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.18.0.tgz",
|
||||
"integrity": "sha512-be6Yx37b24ZwxQ+wOQXXLZqpq4jTckJhtGlWGZs68TgdKXJgw54lUUoFYrg6Zs/kjzAQwEwYbp8JxZVzZLRepQ==",
|
||||
"version": "4.24.0",
|
||||
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.24.0.tgz",
|
||||
"integrity": "sha512-9E6MKUJhDuDh604Qco5yP/3qn3y7SLXYuiC0Rpr89aMScS2UAmK1wHP2b7KAa1nSjWJc/f/Lc0Wl1L47qjiyQw==",
|
||||
"cpu": [
|
||||
"arm64"
|
||||
],
|
||||
@@ -694,9 +671,9 @@
|
||||
]
|
||||
},
|
||||
"node_modules/@rollup/rollup-linux-powerpc64le-gnu": {
|
||||
"version": "4.18.0",
|
||||
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.18.0.tgz",
|
||||
"integrity": "sha512-hNVMQK+qrA9Todu9+wqrXOHxFiD5YmdEi3paj6vP02Kx1hjd2LLYR2eaN7DsEshg09+9uzWi2W18MJDlG0cxJA==",
|
||||
"version": "4.24.0",
|
||||
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.24.0.tgz",
|
||||
"integrity": "sha512-2XFFPJ2XMEiF5Zi2EBf4h73oR1V/lycirxZxHZNc93SqDN/IWhYYSYj8I9381ikUFXZrz2v7r2tOVk2NBwxrWw==",
|
||||
"cpu": [
|
||||
"ppc64"
|
||||
],
|
||||
@@ -708,9 +685,9 @@
|
||||
]
|
||||
},
|
||||
"node_modules/@rollup/rollup-linux-riscv64-gnu": {
|
||||
"version": "4.18.0",
|
||||
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.18.0.tgz",
|
||||
"integrity": "sha512-ROCM7i+m1NfdrsmvwSzoxp9HFtmKGHEqu5NNDiZWQtXLA8S5HBCkVvKAxJ8U+CVctHwV2Gb5VUaK7UAkzhDjlg==",
|
||||
"version": "4.24.0",
|
||||
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.24.0.tgz",
|
||||
"integrity": "sha512-M3Dg4hlwuntUCdzU7KjYqbbd+BLq3JMAOhCKdBE3TcMGMZbKkDdJ5ivNdehOssMCIokNHFOsv7DO4rlEOfyKpg==",
|
||||
"cpu": [
|
||||
"riscv64"
|
||||
],
|
||||
@@ -722,9 +699,9 @@
|
||||
]
|
||||
},
|
||||
"node_modules/@rollup/rollup-linux-s390x-gnu": {
|
||||
"version": "4.18.0",
|
||||
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.18.0.tgz",
|
||||
"integrity": "sha512-0UyyRHyDN42QL+NbqevXIIUnKA47A+45WyasO+y2bGJ1mhQrfrtXUpTxCOrfxCR4esV3/RLYyucGVPiUsO8xjg==",
|
||||
"version": "4.24.0",
|
||||
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.24.0.tgz",
|
||||
"integrity": "sha512-mjBaoo4ocxJppTorZVKWFpy1bfFj9FeCMJqzlMQGjpNPY9JwQi7OuS1axzNIk0nMX6jSgy6ZURDZ2w0QW6D56g==",
|
||||
"cpu": [
|
||||
"s390x"
|
||||
],
|
||||
@@ -736,9 +713,9 @@
|
||||
]
|
||||
},
|
||||
"node_modules/@rollup/rollup-linux-x64-gnu": {
|
||||
"version": "4.18.0",
|
||||
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.18.0.tgz",
|
||||
"integrity": "sha512-xuglR2rBVHA5UsI8h8UbX4VJ470PtGCf5Vpswh7p2ukaqBGFTnsfzxUBetoWBWymHMxbIG0Cmx7Y9qDZzr648w==",
|
||||
"version": "4.24.0",
|
||||
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.24.0.tgz",
|
||||
"integrity": "sha512-ZXFk7M72R0YYFN5q13niV0B7G8/5dcQ9JDp8keJSfr3GoZeXEoMHP/HlvqROA3OMbMdfr19IjCeNAnPUG93b6A==",
|
||||
"cpu": [
|
||||
"x64"
|
||||
],
|
||||
@@ -750,9 +727,9 @@
|
||||
]
|
||||
},
|
||||
"node_modules/@rollup/rollup-linux-x64-musl": {
|
||||
"version": "4.18.0",
|
||||
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.18.0.tgz",
|
||||
"integrity": "sha512-LKaqQL9osY/ir2geuLVvRRs+utWUNilzdE90TpyoX0eNqPzWjRm14oMEE+YLve4k/NAqCdPkGYDaDF5Sw+xBfg==",
|
||||
"version": "4.24.0",
|
||||
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.24.0.tgz",
|
||||
"integrity": "sha512-w1i+L7kAXZNdYl+vFvzSZy8Y1arS7vMgIy8wusXJzRrPyof5LAb02KGr1PD2EkRcl73kHulIID0M501lN+vobQ==",
|
||||
"cpu": [
|
||||
"x64"
|
||||
],
|
||||
@@ -764,9 +741,9 @@
|
||||
]
|
||||
},
|
||||
"node_modules/@rollup/rollup-win32-arm64-msvc": {
|
||||
"version": "4.18.0",
|
||||
"resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.18.0.tgz",
|
||||
"integrity": "sha512-7J6TkZQFGo9qBKH0pk2cEVSRhJbL6MtfWxth7Y5YmZs57Pi+4x6c2dStAUvaQkHQLnEQv1jzBUW43GvZW8OFqA==",
|
||||
"version": "4.24.0",
|
||||
"resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.24.0.tgz",
|
||||
"integrity": "sha512-VXBrnPWgBpVDCVY6XF3LEW0pOU51KbaHhccHw6AS6vBWIC60eqsH19DAeeObl+g8nKAz04QFdl/Cefta0xQtUQ==",
|
||||
"cpu": [
|
||||
"arm64"
|
||||
],
|
||||
@@ -778,9 +755,9 @@
|
||||
]
|
||||
},
|
||||
"node_modules/@rollup/rollup-win32-ia32-msvc": {
|
||||
"version": "4.18.0",
|
||||
"resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.18.0.tgz",
|
||||
"integrity": "sha512-Txjh+IxBPbkUB9+SXZMpv+b/vnTEtFyfWZgJ6iyCmt2tdx0OF5WhFowLmnh8ENGNpfUlUZkdI//4IEmhwPieNg==",
|
||||
"version": "4.24.0",
|
||||
"resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.24.0.tgz",
|
||||
"integrity": "sha512-xrNcGDU0OxVcPTH/8n/ShH4UevZxKIO6HJFK0e15XItZP2UcaiLFd5kiX7hJnqCbSztUF8Qot+JWBC/QXRPYWQ==",
|
||||
"cpu": [
|
||||
"ia32"
|
||||
],
|
||||
@@ -792,9 +769,9 @@
|
||||
]
|
||||
},
|
||||
"node_modules/@rollup/rollup-win32-x64-msvc": {
|
||||
"version": "4.18.0",
|
||||
"resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.18.0.tgz",
|
||||
"integrity": "sha512-UOo5FdvOL0+eIVTgS4tIdbW+TtnBLWg1YBCcU2KWM7nuNwRz9bksDX1bekJJCpu25N1DVWaCwnT39dVQxzqS8g==",
|
||||
"version": "4.24.0",
|
||||
"resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.24.0.tgz",
|
||||
"integrity": "sha512-fbMkAF7fufku0N2dE5TBXcNlg0pt0cJue4xBRE2Qc5Vqikxr4VCgKj/ht6SMdFcOacVA9rqF70APJ8RN/4vMJw==",
|
||||
"cpu": [
|
||||
"x64"
|
||||
],
|
||||
@@ -806,24 +783,19 @@
|
||||
]
|
||||
},
|
||||
"node_modules/@tauri-apps/api": {
|
||||
"version": "1.5.6",
|
||||
"resolved": "https://registry.npmjs.org/@tauri-apps/api/-/api-1.5.6.tgz",
|
||||
"integrity": "sha512-LH5ToovAHnDVe5Qa9f/+jW28I6DeMhos8bNDtBOmmnaDpPmJmYLyHdeDblAWWWYc7KKRDg9/66vMuKyq0WIeFA==",
|
||||
"version": "2.0.1",
|
||||
"resolved": "https://registry.npmjs.org/@tauri-apps/api/-/api-2.0.1.tgz",
|
||||
"integrity": "sha512-eoQWT+Tq1qSwQpHV+nw1eNYe5B/nm1PoRjQCRiEOS12I1b+X4PUcREfXVX8dPcBT6GrzWGDtaecY0+1p0Rfqlw==",
|
||||
"license": "Apache-2.0 OR MIT",
|
||||
"engines": {
|
||||
"node": ">= 14.6.0",
|
||||
"npm": ">= 6.6.0",
|
||||
"yarn": ">= 1.19.1"
|
||||
},
|
||||
"funding": {
|
||||
"type": "opencollective",
|
||||
"url": "https://opencollective.com/tauri"
|
||||
}
|
||||
},
|
||||
"node_modules/@tauri-apps/cli": {
|
||||
"version": "1.5.14",
|
||||
"resolved": "https://registry.npmjs.org/@tauri-apps/cli/-/cli-1.5.14.tgz",
|
||||
"integrity": "sha512-JOSMKymlg116UdEXSj69eg5p1OtZnQkUE0qIGbtNDO1sk3X/KgBN6+oHBW0BzPStp/W0AjBgrMWCqjHPwEpOug==",
|
||||
"version": "2.0.1",
|
||||
"resolved": "https://registry.npmjs.org/@tauri-apps/cli/-/cli-2.0.1.tgz",
|
||||
"integrity": "sha512-fCheW0iWYWUtFV3ui3HlMhk3ZJpAQ5KJr7B7UmfhDzBSy1h5JBdrCtvDwy+3AcPN+Fg5Ey3JciF8zEP8eBx+vQ==",
|
||||
"dev": true,
|
||||
"license": "Apache-2.0 OR MIT",
|
||||
"bin": {
|
||||
@@ -837,27 +809,27 @@
|
||||
"url": "https://opencollective.com/tauri"
|
||||
},
|
||||
"optionalDependencies": {
|
||||
"@tauri-apps/cli-darwin-arm64": "1.5.14",
|
||||
"@tauri-apps/cli-darwin-x64": "1.5.14",
|
||||
"@tauri-apps/cli-linux-arm-gnueabihf": "1.5.14",
|
||||
"@tauri-apps/cli-linux-arm64-gnu": "1.5.14",
|
||||
"@tauri-apps/cli-linux-arm64-musl": "1.5.14",
|
||||
"@tauri-apps/cli-linux-x64-gnu": "1.5.14",
|
||||
"@tauri-apps/cli-linux-x64-musl": "1.5.14",
|
||||
"@tauri-apps/cli-win32-arm64-msvc": "1.5.14",
|
||||
"@tauri-apps/cli-win32-ia32-msvc": "1.5.14",
|
||||
"@tauri-apps/cli-win32-x64-msvc": "1.5.14"
|
||||
"@tauri-apps/cli-darwin-arm64": "2.0.1",
|
||||
"@tauri-apps/cli-darwin-x64": "2.0.1",
|
||||
"@tauri-apps/cli-linux-arm-gnueabihf": "2.0.1",
|
||||
"@tauri-apps/cli-linux-arm64-gnu": "2.0.1",
|
||||
"@tauri-apps/cli-linux-arm64-musl": "2.0.1",
|
||||
"@tauri-apps/cli-linux-x64-gnu": "2.0.1",
|
||||
"@tauri-apps/cli-linux-x64-musl": "2.0.1",
|
||||
"@tauri-apps/cli-win32-arm64-msvc": "2.0.1",
|
||||
"@tauri-apps/cli-win32-ia32-msvc": "2.0.1",
|
||||
"@tauri-apps/cli-win32-x64-msvc": "2.0.1"
|
||||
}
|
||||
},
|
||||
"node_modules/@tauri-apps/cli-darwin-arm64": {
|
||||
"version": "1.5.14",
|
||||
"resolved": "https://registry.npmjs.org/@tauri-apps/cli-darwin-arm64/-/cli-darwin-arm64-1.5.14.tgz",
|
||||
"integrity": "sha512-lxoSOp3KKSqzHJa7iT32dukPGMlfsTuja1xXSgwR8o/fqzpYJY7FY/3ZxesP8HR66FcK+vtqa//HNqeOQ0mHkA==",
|
||||
"version": "2.0.1",
|
||||
"resolved": "https://registry.npmjs.org/@tauri-apps/cli-darwin-arm64/-/cli-darwin-arm64-2.0.1.tgz",
|
||||
"integrity": "sha512-oWjCZoFbm57V0eLEkIbc6aUmB4iW65QF7J8JVh5sNzH4xHGP9rzlQarbkg7LOn89z7mFSZpaLJAWlaaZwoV2Ug==",
|
||||
"cpu": [
|
||||
"arm64"
|
||||
],
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"license": "Apache-2.0 OR MIT",
|
||||
"optional": true,
|
||||
"os": [
|
||||
"darwin"
|
||||
@@ -867,14 +839,14 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@tauri-apps/cli-darwin-x64": {
|
||||
"version": "1.5.14",
|
||||
"resolved": "https://registry.npmjs.org/@tauri-apps/cli-darwin-x64/-/cli-darwin-x64-1.5.14.tgz",
|
||||
"integrity": "sha512-EXSwN1n5spfG8FoXuyc90ACtmDJXzaZ1gxyENaq9xEpQoo7j/Q1vb6qXxmr6azKr8zmqY4h08ZFbv3exh93xJg==",
|
||||
"version": "2.0.1",
|
||||
"resolved": "https://registry.npmjs.org/@tauri-apps/cli-darwin-x64/-/cli-darwin-x64-2.0.1.tgz",
|
||||
"integrity": "sha512-bARd5yAnDGpG/FPhSh87+tzQ6D0TPyP2mZ5bg6cioeoXDmry68nT/FBzp87ySR1/KHvuhEQYWM/4RPrDjvI1Yg==",
|
||||
"cpu": [
|
||||
"x64"
|
||||
],
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"license": "Apache-2.0 OR MIT",
|
||||
"optional": true,
|
||||
"os": [
|
||||
"darwin"
|
||||
@@ -884,14 +856,14 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@tauri-apps/cli-linux-arm-gnueabihf": {
|
||||
"version": "1.5.14",
|
||||
"resolved": "https://registry.npmjs.org/@tauri-apps/cli-linux-arm-gnueabihf/-/cli-linux-arm-gnueabihf-1.5.14.tgz",
|
||||
"integrity": "sha512-Yb8BH/KYR7Tl+de40sZPfrqbhcU3Jlu+UPIrnXt05sjn48xqIps74Xjz8zzVp0TuHxUp8FmIGtCVhQgsbrsvvg==",
|
||||
"version": "2.0.1",
|
||||
"resolved": "https://registry.npmjs.org/@tauri-apps/cli-linux-arm-gnueabihf/-/cli-linux-arm-gnueabihf-2.0.1.tgz",
|
||||
"integrity": "sha512-OK3/RpxujoZAUbV7GHe4IPAUsIO6IuWEHT++jHXP+YW5Y7QezGGjQRc43IlWaQYej/yE8wfcrwrbqisc5wtiCw==",
|
||||
"cpu": [
|
||||
"arm"
|
||||
],
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"license": "Apache-2.0 OR MIT",
|
||||
"optional": true,
|
||||
"os": [
|
||||
"linux"
|
||||
@@ -901,14 +873,14 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@tauri-apps/cli-linux-arm64-gnu": {
|
||||
"version": "1.5.14",
|
||||
"resolved": "https://registry.npmjs.org/@tauri-apps/cli-linux-arm64-gnu/-/cli-linux-arm64-gnu-1.5.14.tgz",
|
||||
"integrity": "sha512-QrKHP4gRaHiup478rPBZ+BmNd88yze9jMmheoNy9mN1K/aECRmTHO+tWhsxv5moFHZzRhO0QDWxxvTtiaPXaGg==",
|
||||
"version": "2.0.1",
|
||||
"resolved": "https://registry.npmjs.org/@tauri-apps/cli-linux-arm64-gnu/-/cli-linux-arm64-gnu-2.0.1.tgz",
|
||||
"integrity": "sha512-MGSQJduiMEApspMK97mFt4kr6ig0OtxO5SUFpPDfYPw/XmY9utaRa9CEG6LcH8e0GN9xxYMhCv+FeU48spYPhA==",
|
||||
"cpu": [
|
||||
"arm64"
|
||||
],
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"license": "Apache-2.0 OR MIT",
|
||||
"optional": true,
|
||||
"os": [
|
||||
"linux"
|
||||
@@ -918,14 +890,14 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@tauri-apps/cli-linux-arm64-musl": {
|
||||
"version": "1.5.14",
|
||||
"resolved": "https://registry.npmjs.org/@tauri-apps/cli-linux-arm64-musl/-/cli-linux-arm64-musl-1.5.14.tgz",
|
||||
"integrity": "sha512-Hb1C1VMxmUcyGjW/K/INKF87zzzgLEVRmWZZnQd7M1P4uue4xPyIwUELSdX12Z2jREPgmLW4AXPD0m6wsNu7iw==",
|
||||
"version": "2.0.1",
|
||||
"resolved": "https://registry.npmjs.org/@tauri-apps/cli-linux-arm64-musl/-/cli-linux-arm64-musl-2.0.1.tgz",
|
||||
"integrity": "sha512-R6+vgxaPpxgGi4suMkQgGuhjMbZzMJfVyWfv2DOE/xxOzSK1BAOc54/HOjfOLxlnkA6uD6V69MwCwXgxW00A2g==",
|
||||
"cpu": [
|
||||
"arm64"
|
||||
],
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"license": "Apache-2.0 OR MIT",
|
||||
"optional": true,
|
||||
"os": [
|
||||
"linux"
|
||||
@@ -935,14 +907,14 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@tauri-apps/cli-linux-x64-gnu": {
|
||||
"version": "1.5.14",
|
||||
"resolved": "https://registry.npmjs.org/@tauri-apps/cli-linux-x64-gnu/-/cli-linux-x64-gnu-1.5.14.tgz",
|
||||
"integrity": "sha512-kD9v/UwPDuhIgq2TJj/s2/7rqk+vmExVV6xHPKI8vVbIvlNAOZqmx3fpxjej1241vhJ/piGd/m6q6YMWGsL0oQ==",
|
||||
"version": "2.0.1",
|
||||
"resolved": "https://registry.npmjs.org/@tauri-apps/cli-linux-x64-gnu/-/cli-linux-x64-gnu-2.0.1.tgz",
|
||||
"integrity": "sha512-xrasYQnUZVhKJhBxHAeu4KxZbofaQlsG9KfZ9p1Bx+hmjs5BuujzwMnXsVD2a4l6GPW6gwblf2a6d600rySmWQ==",
|
||||
"cpu": [
|
||||
"x64"
|
||||
],
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"license": "Apache-2.0 OR MIT",
|
||||
"optional": true,
|
||||
"os": [
|
||||
"linux"
|
||||
@@ -952,14 +924,14 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@tauri-apps/cli-linux-x64-musl": {
|
||||
"version": "1.5.14",
|
||||
"resolved": "https://registry.npmjs.org/@tauri-apps/cli-linux-x64-musl/-/cli-linux-x64-musl-1.5.14.tgz",
|
||||
"integrity": "sha512-204Drgg9Zx0+THKndqASz4+iPCwqA3gQVF9C0CDIArNXrjPyJjVvW8VP5CHiZYaTNWxlz/ltyxluM6UFWbXNFw==",
|
||||
"version": "2.0.1",
|
||||
"resolved": "https://registry.npmjs.org/@tauri-apps/cli-linux-x64-musl/-/cli-linux-x64-musl-2.0.1.tgz",
|
||||
"integrity": "sha512-SPk+EzRTlbvk46p5aURc7O4GihzxbqG80m74vstm0rolnmQ0FX3qqIh3as3cQpDiZWLod4j6EEmX0mTU3QpvXA==",
|
||||
"cpu": [
|
||||
"x64"
|
||||
],
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"license": "Apache-2.0 OR MIT",
|
||||
"optional": true,
|
||||
"os": [
|
||||
"linux"
|
||||
@@ -969,14 +941,14 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@tauri-apps/cli-win32-arm64-msvc": {
|
||||
"version": "1.5.14",
|
||||
"resolved": "https://registry.npmjs.org/@tauri-apps/cli-win32-arm64-msvc/-/cli-win32-arm64-msvc-1.5.14.tgz",
|
||||
"integrity": "sha512-sqPSni2MnWNCm+8YZnLdWCclxfSHaYqKuPFSz8q7Tn1G1m/cA9gyPoC1G0esHftY7bu/ZM5lB4kM3I4U0KlLiA==",
|
||||
"version": "2.0.1",
|
||||
"resolved": "https://registry.npmjs.org/@tauri-apps/cli-win32-arm64-msvc/-/cli-win32-arm64-msvc-2.0.1.tgz",
|
||||
"integrity": "sha512-LAELK01eOMyEt+JZLmx4EUOdRuPYr1a+mHjlxAxCnCaS3dpeg/c5/NMZfbRAJbAH4id+STRHIfPXTdCT2zUNAw==",
|
||||
"cpu": [
|
||||
"arm64"
|
||||
],
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"license": "Apache-2.0 OR MIT",
|
||||
"optional": true,
|
||||
"os": [
|
||||
"win32"
|
||||
@@ -986,14 +958,14 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@tauri-apps/cli-win32-ia32-msvc": {
|
||||
"version": "1.5.14",
|
||||
"resolved": "https://registry.npmjs.org/@tauri-apps/cli-win32-ia32-msvc/-/cli-win32-ia32-msvc-1.5.14.tgz",
|
||||
"integrity": "sha512-8xN8W0zTs8oFsQmvYLxHFeqhzVI7oTaPK1xQMc5gbpFP45jN41c21aCXfjnvzT+h90EfCHUF9EWj2HTEJSb7Iw==",
|
||||
"version": "2.0.1",
|
||||
"resolved": "https://registry.npmjs.org/@tauri-apps/cli-win32-ia32-msvc/-/cli-win32-ia32-msvc-2.0.1.tgz",
|
||||
"integrity": "sha512-eMUgOS4mAusk5njU2TBxBjCUO1P4cV4uzY5CHihysoXSL2TVQdWrXT42VGeoahJh+yeQWkYFka2s4Bu0iWDMXg==",
|
||||
"cpu": [
|
||||
"ia32"
|
||||
],
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"license": "Apache-2.0 OR MIT",
|
||||
"optional": true,
|
||||
"os": [
|
||||
"win32"
|
||||
@@ -1003,14 +975,14 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@tauri-apps/cli-win32-x64-msvc": {
|
||||
"version": "1.5.14",
|
||||
"resolved": "https://registry.npmjs.org/@tauri-apps/cli-win32-x64-msvc/-/cli-win32-x64-msvc-1.5.14.tgz",
|
||||
"integrity": "sha512-U0slee5tNM2PYECBpPHavLSwkT3szGMZ+qhcikQQbDan84bQdLn/kHWjyXOgLJs4KSve4+KxcrN+AVqj0VyHnw==",
|
||||
"version": "2.0.1",
|
||||
"resolved": "https://registry.npmjs.org/@tauri-apps/cli-win32-x64-msvc/-/cli-win32-x64-msvc-2.0.1.tgz",
|
||||
"integrity": "sha512-U9esAOcFIv80/slzlpwjkG31Wx1OqbfDgC5KjGT1Dd9iUOSuJZCwbiY7m3rYG2I6RWLfd9zhNu86CVohsKjBfA==",
|
||||
"cpu": [
|
||||
"x64"
|
||||
],
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"license": "Apache-2.0 OR MIT",
|
||||
"optional": true,
|
||||
"os": [
|
||||
"win32"
|
||||
@@ -1019,10 +991,19 @@
|
||||
"node": ">= 10"
|
||||
}
|
||||
},
|
||||
"node_modules/@tauri-apps/plugin-shell": {
|
||||
"version": "2.0.0",
|
||||
"resolved": "https://registry.npmjs.org/@tauri-apps/plugin-shell/-/plugin-shell-2.0.0.tgz",
|
||||
"integrity": "sha512-OpW2+ycgJLrEoZityWeWYk+6ZWP9VyiAfbO+N/O8VfLkqyOym8kXh7odKDfINx9RAotkSGBtQM4abyKfJDkcUg==",
|
||||
"license": "MIT OR Apache-2.0",
|
||||
"dependencies": {
|
||||
"@tauri-apps/api": "^2.0.0"
|
||||
}
|
||||
},
|
||||
"node_modules/@types/estree": {
|
||||
"version": "1.0.5",
|
||||
"resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz",
|
||||
"integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==",
|
||||
"version": "1.0.6",
|
||||
"resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz",
|
||||
"integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==",
|
||||
"dev": true,
|
||||
"license": "MIT"
|
||||
},
|
||||
@@ -1588,9 +1569,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/esbuild": {
|
||||
"version": "0.20.2",
|
||||
"resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.20.2.tgz",
|
||||
"integrity": "sha512-WdOOppmUNU+IbZ0PaDiTst80zjnrOkyJNHoKupIcVyU8Lvla3Ugx94VzkQ32Ijqd7UhHJy75gNWDMUekcrSJ6g==",
|
||||
"version": "0.21.5",
|
||||
"resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz",
|
||||
"integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==",
|
||||
"dev": true,
|
||||
"hasInstallScript": true,
|
||||
"license": "MIT",
|
||||
@@ -1601,29 +1582,29 @@
|
||||
"node": ">=12"
|
||||
},
|
||||
"optionalDependencies": {
|
||||
"@esbuild/aix-ppc64": "0.20.2",
|
||||
"@esbuild/android-arm": "0.20.2",
|
||||
"@esbuild/android-arm64": "0.20.2",
|
||||
"@esbuild/android-x64": "0.20.2",
|
||||
"@esbuild/darwin-arm64": "0.20.2",
|
||||
"@esbuild/darwin-x64": "0.20.2",
|
||||
"@esbuild/freebsd-arm64": "0.20.2",
|
||||
"@esbuild/freebsd-x64": "0.20.2",
|
||||
"@esbuild/linux-arm": "0.20.2",
|
||||
"@esbuild/linux-arm64": "0.20.2",
|
||||
"@esbuild/linux-ia32": "0.20.2",
|
||||
"@esbuild/linux-loong64": "0.20.2",
|
||||
"@esbuild/linux-mips64el": "0.20.2",
|
||||
"@esbuild/linux-ppc64": "0.20.2",
|
||||
"@esbuild/linux-riscv64": "0.20.2",
|
||||
"@esbuild/linux-s390x": "0.20.2",
|
||||
"@esbuild/linux-x64": "0.20.2",
|
||||
"@esbuild/netbsd-x64": "0.20.2",
|
||||
"@esbuild/openbsd-x64": "0.20.2",
|
||||
"@esbuild/sunos-x64": "0.20.2",
|
||||
"@esbuild/win32-arm64": "0.20.2",
|
||||
"@esbuild/win32-ia32": "0.20.2",
|
||||
"@esbuild/win32-x64": "0.20.2"
|
||||
"@esbuild/aix-ppc64": "0.21.5",
|
||||
"@esbuild/android-arm": "0.21.5",
|
||||
"@esbuild/android-arm64": "0.21.5",
|
||||
"@esbuild/android-x64": "0.21.5",
|
||||
"@esbuild/darwin-arm64": "0.21.5",
|
||||
"@esbuild/darwin-x64": "0.21.5",
|
||||
"@esbuild/freebsd-arm64": "0.21.5",
|
||||
"@esbuild/freebsd-x64": "0.21.5",
|
||||
"@esbuild/linux-arm": "0.21.5",
|
||||
"@esbuild/linux-arm64": "0.21.5",
|
||||
"@esbuild/linux-ia32": "0.21.5",
|
||||
"@esbuild/linux-loong64": "0.21.5",
|
||||
"@esbuild/linux-mips64el": "0.21.5",
|
||||
"@esbuild/linux-ppc64": "0.21.5",
|
||||
"@esbuild/linux-riscv64": "0.21.5",
|
||||
"@esbuild/linux-s390x": "0.21.5",
|
||||
"@esbuild/linux-x64": "0.21.5",
|
||||
"@esbuild/netbsd-x64": "0.21.5",
|
||||
"@esbuild/openbsd-x64": "0.21.5",
|
||||
"@esbuild/sunos-x64": "0.21.5",
|
||||
"@esbuild/win32-arm64": "0.21.5",
|
||||
"@esbuild/win32-ia32": "0.21.5",
|
||||
"@esbuild/win32-x64": "0.21.5"
|
||||
}
|
||||
},
|
||||
"node_modules/escalade": {
|
||||
@@ -1952,9 +1933,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/micromatch": {
|
||||
"version": "4.0.7",
|
||||
"resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.7.tgz",
|
||||
"integrity": "sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q==",
|
||||
"version": "4.0.8",
|
||||
"resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz",
|
||||
"integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
@@ -2103,9 +2084,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/picocolors": {
|
||||
"version": "1.0.1",
|
||||
"resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz",
|
||||
"integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==",
|
||||
"version": "1.1.0",
|
||||
"resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.0.tgz",
|
||||
"integrity": "sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw==",
|
||||
"license": "ISC"
|
||||
},
|
||||
"node_modules/picomatch": {
|
||||
@@ -2142,9 +2123,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/postcss": {
|
||||
"version": "8.4.38",
|
||||
"resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.38.tgz",
|
||||
"integrity": "sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==",
|
||||
"version": "8.4.47",
|
||||
"resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.47.tgz",
|
||||
"integrity": "sha512-56rxCq7G/XfB4EkXq9Egn5GCqugWvDFjafDOThIdMBsI15iqPqR5r15TfSr1YPYeEI19YeaXMCbY6u88Y76GLQ==",
|
||||
"funding": [
|
||||
{
|
||||
"type": "opencollective",
|
||||
@@ -2162,8 +2143,8 @@
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"nanoid": "^3.3.7",
|
||||
"picocolors": "^1.0.0",
|
||||
"source-map-js": "^1.2.0"
|
||||
"picocolors": "^1.1.0",
|
||||
"source-map-js": "^1.2.1"
|
||||
},
|
||||
"engines": {
|
||||
"node": "^10 || ^12 || >=14"
|
||||
@@ -2371,13 +2352,13 @@
|
||||
}
|
||||
},
|
||||
"node_modules/rollup": {
|
||||
"version": "4.18.0",
|
||||
"resolved": "https://registry.npmjs.org/rollup/-/rollup-4.18.0.tgz",
|
||||
"integrity": "sha512-QmJz14PX3rzbJCN1SG4Xe/bAAX2a6NpCP8ab2vfu2GiUr8AQcr2nCV/oEO3yneFarB67zk8ShlIyWb2LGTb3Sg==",
|
||||
"version": "4.24.0",
|
||||
"resolved": "https://registry.npmjs.org/rollup/-/rollup-4.24.0.tgz",
|
||||
"integrity": "sha512-DOmrlGSXNk1DM0ljiQA+i+o0rSLhtii1je5wgk60j49d1jHT5YYttBv1iWOnYSTG+fZZESUOSNiAl89SIet+Cg==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@types/estree": "1.0.5"
|
||||
"@types/estree": "1.0.6"
|
||||
},
|
||||
"bin": {
|
||||
"rollup": "dist/bin/rollup"
|
||||
@@ -2387,22 +2368,22 @@
|
||||
"npm": ">=8.0.0"
|
||||
},
|
||||
"optionalDependencies": {
|
||||
"@rollup/rollup-android-arm-eabi": "4.18.0",
|
||||
"@rollup/rollup-android-arm64": "4.18.0",
|
||||
"@rollup/rollup-darwin-arm64": "4.18.0",
|
||||
"@rollup/rollup-darwin-x64": "4.18.0",
|
||||
"@rollup/rollup-linux-arm-gnueabihf": "4.18.0",
|
||||
"@rollup/rollup-linux-arm-musleabihf": "4.18.0",
|
||||
"@rollup/rollup-linux-arm64-gnu": "4.18.0",
|
||||
"@rollup/rollup-linux-arm64-musl": "4.18.0",
|
||||
"@rollup/rollup-linux-powerpc64le-gnu": "4.18.0",
|
||||
"@rollup/rollup-linux-riscv64-gnu": "4.18.0",
|
||||
"@rollup/rollup-linux-s390x-gnu": "4.18.0",
|
||||
"@rollup/rollup-linux-x64-gnu": "4.18.0",
|
||||
"@rollup/rollup-linux-x64-musl": "4.18.0",
|
||||
"@rollup/rollup-win32-arm64-msvc": "4.18.0",
|
||||
"@rollup/rollup-win32-ia32-msvc": "4.18.0",
|
||||
"@rollup/rollup-win32-x64-msvc": "4.18.0",
|
||||
"@rollup/rollup-android-arm-eabi": "4.24.0",
|
||||
"@rollup/rollup-android-arm64": "4.24.0",
|
||||
"@rollup/rollup-darwin-arm64": "4.24.0",
|
||||
"@rollup/rollup-darwin-x64": "4.24.0",
|
||||
"@rollup/rollup-linux-arm-gnueabihf": "4.24.0",
|
||||
"@rollup/rollup-linux-arm-musleabihf": "4.24.0",
|
||||
"@rollup/rollup-linux-arm64-gnu": "4.24.0",
|
||||
"@rollup/rollup-linux-arm64-musl": "4.24.0",
|
||||
"@rollup/rollup-linux-powerpc64le-gnu": "4.24.0",
|
||||
"@rollup/rollup-linux-riscv64-gnu": "4.24.0",
|
||||
"@rollup/rollup-linux-s390x-gnu": "4.24.0",
|
||||
"@rollup/rollup-linux-x64-gnu": "4.24.0",
|
||||
"@rollup/rollup-linux-x64-musl": "4.24.0",
|
||||
"@rollup/rollup-win32-arm64-msvc": "4.24.0",
|
||||
"@rollup/rollup-win32-ia32-msvc": "4.24.0",
|
||||
"@rollup/rollup-win32-x64-msvc": "4.24.0",
|
||||
"fsevents": "~2.3.2"
|
||||
}
|
||||
},
|
||||
@@ -2467,9 +2448,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/source-map-js": {
|
||||
"version": "1.2.0",
|
||||
"resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz",
|
||||
"integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==",
|
||||
"version": "1.2.1",
|
||||
"resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz",
|
||||
"integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==",
|
||||
"license": "BSD-3-Clause",
|
||||
"engines": {
|
||||
"node": ">=0.10.0"
|
||||
@@ -2735,15 +2716,15 @@
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/vite": {
|
||||
"version": "5.2.13",
|
||||
"resolved": "https://registry.npmjs.org/vite/-/vite-5.2.13.tgz",
|
||||
"integrity": "sha512-SSq1noJfY9pR3I1TUENL3rQYDQCFqgD+lM6fTRAM8Nv6Lsg5hDLaXkjETVeBt+7vZBCMoibD+6IWnT2mJ+Zb/A==",
|
||||
"version": "5.4.8",
|
||||
"resolved": "https://registry.npmjs.org/vite/-/vite-5.4.8.tgz",
|
||||
"integrity": "sha512-FqrItQ4DT1NC4zCUqMB4c4AZORMKIa0m8/URVCZ77OZ/QSNeJ54bU1vrFADbDsuwfIPcgknRkmqakQcgnL4GiQ==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"esbuild": "^0.20.1",
|
||||
"postcss": "^8.4.38",
|
||||
"rollup": "^4.13.0"
|
||||
"esbuild": "^0.21.3",
|
||||
"postcss": "^8.4.43",
|
||||
"rollup": "^4.20.0"
|
||||
},
|
||||
"bin": {
|
||||
"vite": "bin/vite.js"
|
||||
@@ -2762,6 +2743,7 @@
|
||||
"less": "*",
|
||||
"lightningcss": "^1.21.0",
|
||||
"sass": "*",
|
||||
"sass-embedded": "*",
|
||||
"stylus": "*",
|
||||
"sugarss": "*",
|
||||
"terser": "^5.4.0"
|
||||
@@ -2779,6 +2761,9 @@
|
||||
"sass": {
|
||||
"optional": true
|
||||
},
|
||||
"sass-embedded": {
|
||||
"optional": true
|
||||
},
|
||||
"stylus": {
|
||||
"optional": true
|
||||
},
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"name": "to-do-app",
|
||||
"private": true,
|
||||
"version": "1.4.0",
|
||||
"version": "2.0.0-beta",
|
||||
"type": "module",
|
||||
"scripts": {
|
||||
"dev": "vite",
|
||||
@@ -12,14 +12,14 @@
|
||||
"tauri build": "tauri build"
|
||||
},
|
||||
"dependencies": {
|
||||
"@tauri-apps/api": "^1",
|
||||
"@tauri-apps/api": "^2.0.1",
|
||||
"@tauri-apps/plugin-shell": "^2.0.0",
|
||||
"@vueuse/core": "^10.10.0",
|
||||
"vue": "^3.3.4",
|
||||
"vue-router": "^4.3.3"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@iconify/vue": "^4.1.2",
|
||||
"@tauri-apps/cli": "^1",
|
||||
"@tauri-apps/cli": "^2.0.1",
|
||||
"@vitejs/plugin-vue": "^5.0.4",
|
||||
"autoprefixer": "^10.4.19",
|
||||
"postcss": "^8.4.38",
|
||||
|
||||
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" viewBox="0 0 1024 1024"><path fill="currentColor" d="m917.7 148.8l-42.4-42.4c-1.6-1.6-3.6-2.3-5.7-2.3s-4.1.8-5.7 2.3l-76.1 76.1a199.27 199.27 0 0 0-112.1-34.3c-51.2 0-102.4 19.5-141.5 58.6L432.3 308.7a8.03 8.03 0 0 0 0 11.3L704 591.7c1.6 1.6 3.6 2.3 5.7 2.3c2 0 4.1-.8 5.7-2.3l101.9-101.9c68.9-69 77-175.7 24.3-253.5l76.1-76.1c3.1-3.2 3.1-8.3 0-11.4M769.1 441.7l-59.4 59.4l-186.8-186.8l59.4-59.4c24.9-24.9 58.1-38.7 93.4-38.7s68.4 13.7 93.4 38.7c24.9 24.9 38.7 58.1 38.7 93.4s-13.8 68.4-38.7 93.4m-190.2 105a8.03 8.03 0 0 0-11.3 0L501 613.3L410.7 523l66.7-66.7c3.1-3.1 3.1-8.2 0-11.3L441 408.6a8.03 8.03 0 0 0-11.3 0L363 475.3l-43-43a7.85 7.85 0 0 0-5.7-2.3c-2 0-4.1.8-5.7 2.3L206.8 534.2c-68.9 69-77 175.7-24.3 253.5l-76.1 76.1a8.03 8.03 0 0 0 0 11.3l42.4 42.4c1.6 1.6 3.6 2.3 5.7 2.3s4.1-.8 5.7-2.3l76.1-76.1c33.7 22.9 72.9 34.3 112.1 34.3c51.2 0 102.4-19.5 141.5-58.6l101.9-101.9c3.1-3.1 3.1-8.2 0-11.3l-43-43l66.7-66.7c3.1-3.1 3.1-8.2 0-11.3zM441.7 769.1a131.32 131.32 0 0 1-93.4 38.7c-35.3 0-68.4-13.7-93.4-38.7a131.32 131.32 0 0 1-38.7-93.4c0-35.3 13.7-68.4 38.7-93.4l59.4-59.4l186.8 186.8z"/></svg>
|
||||
|
After Width: | Height: | Size: 1.1 KiB |
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" viewBox="0 0 48 48"><g fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="4"><path d="M24 44c11.046 0 20-8.954 20-20S35.046 4 24 4S4 12.954 4 24s8.954 20 20 20" clip-rule="evenodd"/><path d="M4 24h40"/><path d="M24 44c4.418 0 8-8.954 8-20S28.418 4 24 4s-8 8.954-8 20s3.582 20 8 20" clip-rule="evenodd"/><path d="M9.858 10.142A19.94 19.94 0 0 0 24 16a19.94 19.94 0 0 0 14.142-5.858m0 27.716A19.94 19.94 0 0 0 24 32a19.94 19.94 0 0 0-14.142 5.858"/></g></svg>
|
||||
|
After Width: | Height: | Size: 566 B |
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" viewBox="0 0 16 16"><circle cx="8" cy="8" r="4" fill="currentColor"/></svg>
|
||||
|
After Width: | Height: | Size: 140 B |
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" viewBox="0 0 24 24"><path fill="#DEC427" d="M4.47 21h15.06c1.54 0 2.5-1.67 1.73-3L13.73 4.99c-.77-1.33-2.69-1.33-3.46 0L2.74 18c-.77 1.33.19 3 1.73 3M12 14c-.55 0-1-.45-1-1v-2c0-.55.45-1 1-1s1 .45 1 1v2c0 .55-.45 1-1 1m1 4h-2v-2h2z"/></svg>
|
||||
|
After Width: | Height: | Size: 305 B |
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" viewBox="0 0 24 24"><path fill="currentColor" fill-rule="evenodd" d="M6 3a3 3 0 0 0-3 3v12a3 3 0 0 0 3 3h12a3 3 0 0 0 3-3V6a3 3 0 0 0-3-3zm4 5a1 1 0 0 1 1-1h6a1 1 0 1 1 0 2h-6a1 1 0 0 1-1-1m0 4a1 1 0 0 1 1-1h6a1 1 0 1 1 0 2h-6a1 1 0 0 1-1-1m0 4a1 1 0 0 1 1-1h6a1 1 0 1 1 0 2h-6a1 1 0 0 1-1-1M7 7a1 1 0 0 0 0 2h.001a1 1 0 0 0 0-2zm-1 5a1 1 0 0 1 1-1h.001a1 1 0 1 1 0 2H7a1 1 0 0 1-1-1m1 3a1 1 0 1 0 0 2h.001a1 1 0 1 0 0-2z" clip-rule="evenodd"/></svg>
|
||||
|
After Width: | Height: | Size: 515 B |
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" viewBox="0 0 24 24"><path fill="currentColor" d="m8 18l-6-6l6-6l1.425 1.425l-4.6 4.6L9.4 16.6zm8 0l-1.425-1.425l4.6-4.6L14.6 7.4L16 6l6 6z"/></svg>
|
||||
|
After Width: | Height: | Size: 212 B |
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" viewBox="0 0 24 24"><path fill="currentColor" d="M4 21V9l8-6l8 6v12h-6v-7h-4v7z"/></svg>
|
||||
|
After Width: | Height: | Size: 153 B |
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" viewBox="0 0 24 24"><path fill="currentColor" d="M5 2a3 3 0 0 0-3 3v14a3 3 0 0 0 3 3h14a3 3 0 0 0 3-3V5a3 3 0 0 0-3-3zM4 5a1 1 0 0 1 1-1h14a1 1 0 0 1 1 1v14a1 1 0 0 1-1 1H5a1 1 0 0 1-1-1zm5.723 13L16.58 6h-2.303L7.42 18z"/></svg>
|
||||
|
After Width: | Height: | Size: 294 B |
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" viewBox="0 0 24 24"><circle cx="18" cy="12" r="0" fill="currentColor"><animate attributeName="r" begin=".67" calcMode="spline" dur="1.5s" keySplines="0.2 0.2 0.4 0.8;0.2 0.2 0.4 0.8;0.2 0.2 0.4 0.8" repeatCount="indefinite" values="0;2;0;0"/></circle><circle cx="12" cy="12" r="0" fill="currentColor"><animate attributeName="r" begin=".33" calcMode="spline" dur="1.5s" keySplines="0.2 0.2 0.4 0.8;0.2 0.2 0.4 0.8;0.2 0.2 0.4 0.8" repeatCount="indefinite" values="0;2;0;0"/></circle><circle cx="6" cy="12" r="0" fill="currentColor"><animate attributeName="r" begin="0" calcMode="spline" dur="1.5s" keySplines="0.2 0.2 0.4 0.8;0.2 0.2 0.4 0.8;0.2 0.2 0.4 0.8" repeatCount="indefinite" values="0;2;0;0"/></circle></svg>
|
||||
|
After Width: | Height: | Size: 781 B |
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" viewBox="0 0 24 24"><path fill="currentColor" d="m7.825 13l5.6 5.6L12 20l-8-8l8-8l1.425 1.4l-5.6 5.6H20v2z"/></svg>
|
||||
|
After Width: | Height: | Size: 180 B |
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" viewBox="0 0 24 24"><path fill="currentColor" d="m9.25 22l-.4-3.2q-.325-.125-.612-.3t-.563-.375L4.7 19.375l-2.75-4.75l2.575-1.95Q4.5 12.5 4.5 12.338v-.675q0-.163.025-.338L1.95 9.375l2.75-4.75l2.975 1.25q.275-.2.575-.375t.6-.3l.4-3.2h5.5l.4 3.2q.325.125.613.3t.562.375l2.975-1.25l2.75 4.75l-2.575 1.95q.025.175.025.338v.674q0 .163-.05.338l2.575 1.95l-2.75 4.75l-2.95-1.25q-.275.2-.575.375t-.6.3l-.4 3.2zM11 20h1.975l.35-2.65q.775-.2 1.438-.587t1.212-.938l2.475 1.025l.975-1.7l-2.15-1.625q.125-.35.175-.737T17.5 12t-.05-.787t-.175-.738l2.15-1.625l-.975-1.7l-2.475 1.05q-.55-.575-1.212-.962t-1.438-.588L13 4h-1.975l-.35 2.65q-.775.2-1.437.588t-1.213.937L5.55 7.15l-.975 1.7l2.15 1.6q-.125.375-.175.75t-.05.8q0 .4.05.775t.175.75l-2.15 1.625l.975 1.7l2.475-1.05q.55.575 1.213.963t1.437.587zm1.05-4.5q1.45 0 2.475-1.025T15.55 12t-1.025-2.475T12.05 8.5q-1.475 0-2.488 1.025T8.55 12t1.013 2.475T12.05 15.5M12 12"/></svg>
|
||||
|
After Width: | Height: | Size: 977 B |
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" viewBox="0 0 24 24"><path fill="currentColor" d="m7 21l-5-5l5-5l1.425 1.4l-2.6 2.6H21v2H5.825l2.6 2.6zm10-8l-1.425-1.4l2.6-2.6H3V7h15.175l-2.6-2.6L17 3l5 5z"/></svg>
|
||||
|
After Width: | Height: | Size: 230 B |
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" viewBox="0 0 24 24"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"/><path fill="currentColor" d="M20 17.5a1.5 1.5 0 0 1 .144 2.993L20 20.5H4a1.5 1.5 0 0 1-.144-2.993L4 17.5zm0-7a1.5 1.5 0 0 1 0 3H4a1.5 1.5 0 0 1 0-3zm0-7a1.5 1.5 0 0 1 0 3H4a1.5 1.5 0 1 1 0-3z"/></g></svg>
|
||||
|
After Width: | Height: | Size: 806 B |
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" viewBox="0 0 24 24"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"/><path fill="currentColor" d="M12 2c5.523 0 10 4.477 10 10s-4.477 10-10 10S2 17.523 2 12S6.477 2 12 2m0 2a8 8 0 1 0 0 16a8 8 0 0 0 0-16m0 12a1 1 0 1 1 0 2a1 1 0 0 1 0-2m0-9.5a3.625 3.625 0 0 1 1.348 6.99a.8.8 0 0 0-.305.201c-.044.05-.051.114-.05.18L13 14a1 1 0 0 1-1.993.117L11 14v-.25c0-1.153.93-1.845 1.604-2.116a1.626 1.626 0 1 0-2.229-1.509a1 1 0 1 1-2 0A3.625 3.625 0 0 1 12 6.5"/></g></svg>
|
||||
|
After Width: | Height: | Size: 997 B |
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" viewBox="0 0 16 16"><path fill="#EF4444" fill-rule="evenodd" d="M6.701 2.25c.577-1 2.02-1 2.598 0l5.196 9a1.5 1.5 0 0 1-1.299 2.25H2.804a1.5 1.5 0 0 1-1.3-2.25zM8 4a.75.75 0 0 1 .75.75v3a.75.75 0 1 1-1.5 0v-3A.75.75 0 0 1 8 4m0 8a1 1 0 1 0 0-2a1 1 0 0 0 0 2" clip-rule="evenodd"/></svg>
|
||||
|
After Width: | Height: | Size: 351 B |
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" viewBox="0 0 24 24"><path fill="currentColor" d="M6 19c0 1.1.9 2 2 2h8c1.1 0 2-.9 2-2V7H6zM19 4h-3.5l-1-1h-5l-1 1H5v2h14z"/></svg>
|
||||
|
After Width: | Height: | Size: 195 B |
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" viewBox="0 0 24 24"><path fill="currentColor" d="M19 12.998h-6v6h-2v-6H5v-2h6v-6h2v6h6z"/></svg>
|
||||
|
After Width: | Height: | Size: 161 B |
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" viewBox="0 0 24 24"><path fill="#22C55E" d="m9.55 18l-5.7-5.7l1.425-1.425L9.55 15.15l9.175-9.175L20.15 7.4z"/></svg>
|
||||
|
After Width: | Height: | Size: 181 B |
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" viewBox="0 0 24 24"><path fill="currentColor" d="M20.71 7.04c.39-.39.39-1.04 0-1.41l-2.34-2.34c-.37-.39-1.02-.39-1.41 0l-1.84 1.83l3.75 3.75M3 17.25V21h3.75L17.81 9.93l-3.75-3.75z"/></svg>
|
||||
|
After Width: | Height: | Size: 253 B |
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" viewBox="0 0 14 14"><path fill="#EA580C" fill-rule="evenodd" d="M13 1h-2.662a.5.5 0 0 0-.5.5v12a.5.5 0 0 0 .5.5h2.663a.5.5 0 0 0 .5-.5v-12A.5.5 0 0 0 13 1M3.163 8H.5a.5.5 0 0 0-.5.5v5a.5.5 0 0 0 .5.5h2.662a.5.5 0 0 0 .5-.5v-5a.5.5 0 0 0-.5-.5ZM5.42 5h2.663a.5.5 0 0 1 .5.5v8a.5.5 0 0 1-.5.5H5.419a.5.5 0 0 1-.5-.5v-8a.5.5 0 0 1 .5-.5Z" clip-rule="evenodd"/></svg>
|
||||
|
After Width: | Height: | Size: 428 B |
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" viewBox="0 0 14 14"><path fill="#FDBA74" fill-rule="evenodd" d="M3.162 8H.5a.5.5 0 0 0-.5.5v5a.5.5 0 0 0 .5.5h2.662a.5.5 0 0 0 .5-.5v-5a.5.5 0 0 0-.5-.5m6.954 5.25a.75.75 0 0 1 .75-.75h2.375a.75.75 0 0 1 0 1.5h-2.375a.75.75 0 0 1-.75-.75m-4.303-.75a.75.75 0 0 0 0 1.5h2.374a.75.75 0 0 0 0-1.5z" clip-rule="evenodd"/></svg>
|
||||
|
After Width: | Height: | Size: 387 B |
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" viewBox="0 0 14 14"><path fill="#F59E0B" fill-rule="evenodd" d="M8.331 5H5.67a.5.5 0 0 0-.5.5v8a.5.5 0 0 0 .5.5h2.66a.5.5 0 0 0 .5-.5v-8a.5.5 0 0 0-.5-.5ZM3.162 8H.5a.5.5 0 0 0-.5.5v5a.5.5 0 0 0 .5.5h2.662a.5.5 0 0 0 .5-.5v-5a.5.5 0 0 0-.5-.5m7.704 4.5a.75.75 0 0 0 0 1.5h2.375a.75.75 0 0 0 0-1.5z" clip-rule="evenodd"/></svg>
|
||||
|
After Width: | Height: | Size: 391 B |
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" viewBox="0 0 14 14"><path fill="#6B7280" fill-rule="evenodd" d="M0 13.25a.75.75 0 0 1 .75-.75h2.375a.75.75 0 0 1 0 1.5H.75a.75.75 0 0 1-.75-.75m10.116 0a.75.75 0 0 1 .75-.75h2.375a.75.75 0 0 1 0 1.5h-2.375a.75.75 0 0 1-.75-.75m-4.303-.75a.75.75 0 0 0 0 1.5h2.374a.75.75 0 0 0 0-1.5z" clip-rule="evenodd"/></svg>
|
||||
|
After Width: | Height: | Size: 376 B |
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" viewBox="0 0 24 24"><path fill="#FACC15" fill-rule="evenodd" d="M13 3a1 1 0 1 0-2 0v2a1 1 0 1 0 2 0zM6.343 4.929A1 1 0 0 0 4.93 6.343l1.414 1.414a1 1 0 0 0 1.414-1.414zm12.728 1.414a1 1 0 0 0-1.414-1.414l-1.414 1.414a1 1 0 0 0 1.414 1.414zM12 7a5 5 0 1 0 0 10a5 5 0 0 0 0-10m-9 4a1 1 0 1 0 0 2h2a1 1 0 1 0 0-2zm16 0a1 1 0 1 0 0 2h2a1 1 0 1 0 0-2zM7.757 17.657a1 1 0 1 0-1.414-1.414l-1.414 1.414a1 1 0 1 0 1.414 1.414zm9.9-1.414a1 1 0 0 0-1.414 1.414l1.414 1.414a1 1 0 0 0 1.414-1.414zM13 19a1 1 0 1 0-2 0v2a1 1 0 1 0 2 0z" clip-rule="evenodd"/></svg>
|
||||
|
After Width: | Height: | Size: 615 B |
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" viewBox="0 0 24 24"><path fill="currentColor" d="M13.46 12L19 17.54V19h-1.46L12 13.46L6.46 19H5v-1.46L10.54 12L5 6.46V5h1.46L12 10.54L17.54 5H19v1.46z"/></svg>
|
||||
|
After Width: | Height: | Size: 224 B |
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" viewBox="0 0 24 24"><path fill="currentColor" d="M4 4h16v16H4zm2 4v10h12V8z"/></svg>
|
||||
|
After Width: | Height: | Size: 149 B |
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" viewBox="0 0 24 24"><path fill="currentColor" d="M20 14H4v-4h16"/></svg>
|
||||
|
After Width: | Height: | Size: 137 B |
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" viewBox="0 0 24 24"><path fill="currentColor" d="M4 8h4V4h12v12h-4v4H4zm12 0v6h2V6h-8v2zM6 12v6h8v-6z"/></svg>
|
||||
|
After Width: | Height: | Size: 175 B |
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" viewBox="0 0 24 24"><path fill="#60A5FA" d="M11.38 2.019a7.5 7.5 0 1 0 10.6 10.6C21.662 17.854 17.316 22 12.001 22C6.477 22 2 17.523 2 12c0-5.315 4.146-9.661 9.38-9.981"/></svg>
|
||||
|
After Width: | Height: | Size: 242 B |
@@ -1,17 +1,17 @@
|
||||
[package]
|
||||
name = "to-do-app"
|
||||
version = "0.0.0"
|
||||
description = "A Tauri App"
|
||||
version = "1.8.0"
|
||||
description = "A ToDo App"
|
||||
authors = ["you"]
|
||||
edition = "2021"
|
||||
|
||||
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
||||
|
||||
[build-dependencies]
|
||||
tauri-build = { version = "1", features = [] }
|
||||
tauri-build = { version = "2.0.1", features = [] }
|
||||
|
||||
[dependencies]
|
||||
tauri = { version = "1", features = [ "window-show", "window-unminimize", "window-minimize", "window-maximize", "window-start-dragging", "window-hide", "window-close", "window-unmaximize", "shell-open"] }
|
||||
tauri = { version = "2.0.1", features = [] }
|
||||
serde = { version = "1", features = ["derive"] }
|
||||
serde_json = "1"
|
||||
magic-crypt = "3.1.13"
|
||||
@@ -23,13 +23,19 @@ aes = "0.7.5"
|
||||
block-modes = "0.8.1"
|
||||
block-padding = "0.3.3"
|
||||
chrono = "0.4.38"
|
||||
tauri-plugin-shell = "2.0.1"
|
||||
|
||||
[features]
|
||||
# This feature is used for production builds or when a dev server is not specified, DO NOT REMOVE!!
|
||||
custom-protocol = ["tauri/custom-protocol"]
|
||||
|
||||
[profile.release]
|
||||
lto = true # Enables link to optimizations
|
||||
opt-level = "s" # Optimize for binary size
|
||||
strip = true # Remove debug symbols
|
||||
[lib]
|
||||
name = "app_lib"
|
||||
crate-type = ["staticlib", "cdylib", "rlib"]
|
||||
|
||||
[profile.release]
|
||||
codegen-units = 1 # Allows LLVM to perform better optimization.
|
||||
lto = true # Enables link-time-optimizations.
|
||||
opt-level = "s" # Prioritizes small binary size. Use `3` if you prefer speed.
|
||||
panic = "abort" # Higher performance by disabling panic handlers.
|
||||
strip = true # Ensures debug symbols are removed.
|
||||
|
||||
@@ -0,0 +1,23 @@
|
||||
{
|
||||
"identifier": "migrated",
|
||||
"description": "permissions that were migrated from v1",
|
||||
"local": true,
|
||||
"windows": [
|
||||
"main"
|
||||
],
|
||||
"permissions": [
|
||||
"core:app:default",
|
||||
"core:window:allow-maximize",
|
||||
"core:window:allow-unmaximize",
|
||||
"core:window:allow-minimize",
|
||||
"core:window:allow-unminimize",
|
||||
"core:window:allow-toggle-maximize",
|
||||
"core:window:allow-show",
|
||||
"core:window:allow-hide",
|
||||
"core:window:allow-close",
|
||||
"core:window:allow-start-dragging",
|
||||
"core:event:allow-listen",
|
||||
"shell:allow-open",
|
||||
"shell:default"
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1 @@
|
||||
{"migrated":{"identifier":"migrated","description":"permissions that were migrated from v1","local":true,"windows":["main"],"permissions":["core:app:default","core:window:allow-maximize","core:window:allow-unmaximize","core:window:allow-minimize","core:window:allow-unminimize","core:window:allow-toggle-maximize","core:window:allow-show","core:window:allow-hide","core:window:allow-close","core:window:allow-start-dragging","core:event:allow-listen","shell:allow-open","shell:default"]}}
|
||||
@@ -1,6 +1,6 @@
|
||||
use aes::Aes256;
|
||||
use block_modes::{BlockMode, Cbc};
|
||||
use block_modes::block_padding::Pkcs7;
|
||||
use block_modes::{BlockMode, Cbc};
|
||||
use rand::Rng;
|
||||
|
||||
type Aes256Cbc = Cbc<Aes256, Pkcs7>;
|
||||
|
||||
@@ -1,97 +1,103 @@
|
||||
use std::fs::{File, read_to_string};
|
||||
use std::path::Path;
|
||||
use crate::enc_dec_file::{decrypt_file, encrypt_n_save_file};
|
||||
use serde_json::{json, Value};
|
||||
use crate::enc_dec_file::{encrypt_n_save_file, decrypt_file};
|
||||
use std::fs::{read_to_string, File};
|
||||
use std::path::Path;
|
||||
use tauri::path::BaseDirectory;
|
||||
|
||||
use rand::distributions::Uniform;
|
||||
use rand::Rng;
|
||||
use rand::distributions::Uniform; // 0.8
|
||||
use tauri::Manager;
|
||||
|
||||
#[tauri::command]
|
||||
pub fn check_or_create_config_file(app_handle: tauri::AppHandle) {
|
||||
let mut path = app_handle.path_resolver().app_local_data_dir().unwrap();
|
||||
path.push("ToDo");
|
||||
path.push("config_api");
|
||||
|
||||
path.set_extension("enc");
|
||||
let path = app_handle.path().resolve("ToDo/config_api.enc", BaseDirectory::AppLocalData).unwrap();
|
||||
|
||||
let exist: bool = Path::new(&path).exists();
|
||||
if exist{
|
||||
if exist {
|
||||
let content = read_to_string(path);
|
||||
return match content {
|
||||
Ok(_) => {},
|
||||
Ok(_) => {}
|
||||
Err(_) => {
|
||||
println!("Не удалось открыть конфигурационный файл!");
|
||||
}
|
||||
}
|
||||
} else{
|
||||
};
|
||||
} else {
|
||||
let path = Path::new(&path);
|
||||
let prefix = path.parent().unwrap();
|
||||
let file = std::fs::create_dir_all(prefix);
|
||||
match file{
|
||||
Ok(_) => {},
|
||||
Err(err) => println!("Не удалось создать директории! \n{}", err)
|
||||
match file {
|
||||
Ok(_) => {}
|
||||
Err(err) => println!("Не удалось создать директории! \n{}", err),
|
||||
}
|
||||
let file = File::create(path);
|
||||
match file{
|
||||
match file {
|
||||
Ok(_) => {
|
||||
let rand_s: String = rand::thread_rng()
|
||||
.sample_iter(Uniform::new(char::from(32), char::from(126)))
|
||||
.take(64)
|
||||
.map(char::from)
|
||||
.collect();
|
||||
let token: String = rand_s.replace("'", "").replace('"', "")
|
||||
.replace("{", "").replace("}", "").replace("[", "")
|
||||
.replace("}", "").replace("\\", "").replace("'", "");
|
||||
let token: String = rand_s
|
||||
.replace("'", "")
|
||||
.replace('"', "")
|
||||
.replace("{", "")
|
||||
.replace("}", "")
|
||||
.replace("[", "")
|
||||
.replace("}", "")
|
||||
.replace("\\", "")
|
||||
.replace("'", "");
|
||||
|
||||
|
||||
let data = String::from(format!("{}\
|
||||
let data = String::from(format!(
|
||||
"{}\
|
||||
\"port\": 49494,\
|
||||
\"autostart\": false,\
|
||||
\"token\": \"{}\"\
|
||||
{}", "{", token, "}"));
|
||||
println!("{}", data);
|
||||
{}",
|
||||
"{", token, "}"
|
||||
));
|
||||
encrypt_n_save_file(path.into(), data);
|
||||
},
|
||||
Err(err) => println!("Не удалось создать файл! \n{}", err)
|
||||
}
|
||||
Err(err) => println!("Не удалось создать файл! \n{}", err),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#[tauri::command]
|
||||
pub fn get_port(app_handle: tauri::AppHandle) -> i64 {
|
||||
let mut path = app_handle.path_resolver().app_local_data_dir().unwrap();
|
||||
path.push("ToDo");
|
||||
path.push("config_api");
|
||||
let path = app_handle.path().resolve("ToDo/config_api.enc", BaseDirectory::AppLocalData).unwrap();
|
||||
|
||||
path.set_extension("enc");
|
||||
|
||||
let content = decrypt_file(path);
|
||||
let data: Value = serde_json::from_str(content.as_str()).unwrap();
|
||||
|
||||
return data["port"].as_i64().unwrap();
|
||||
let content = decrypt_file(path.clone());
|
||||
let data = serde_json::from_str::<Value>(content.as_str());
|
||||
match data {
|
||||
Ok(data) => {
|
||||
return data["port"].as_i64().unwrap();
|
||||
}
|
||||
Err(_) => {
|
||||
std::fs::remove_file(path).unwrap();
|
||||
check_or_create_config_file(app_handle.clone());
|
||||
return get_port(app_handle.clone());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#[tauri::command]
|
||||
pub fn get_autostart(app_handle: tauri::AppHandle) -> bool {
|
||||
let mut path = app_handle.path_resolver().app_local_data_dir().unwrap();
|
||||
path.push("ToDo");
|
||||
path.push("config_api");
|
||||
|
||||
path.set_extension("enc");
|
||||
let path = app_handle.path().resolve("ToDo/config_api.enc", BaseDirectory::AppLocalData).unwrap();
|
||||
|
||||
let content = decrypt_file(path);
|
||||
let data: Value = serde_json::from_str(content.as_str()).unwrap();
|
||||
|
||||
return data["autostart"].as_bool().unwrap();
|
||||
let data = serde_json::from_str::<Value>(content.as_str());
|
||||
match data {
|
||||
Ok(d) => return d["autostart"].as_bool().unwrap(),
|
||||
Err(err) => {
|
||||
println!("{}", err);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#[tauri::command]
|
||||
pub fn edit_settings(app_handle: tauri::AppHandle, port: i32, autostart: bool) {
|
||||
let mut path = app_handle.path_resolver().app_local_data_dir().unwrap();
|
||||
path.push("ToDo");
|
||||
path.push("config_api");
|
||||
|
||||
path.set_extension("enc");
|
||||
let path = app_handle.path().resolve("ToDo/config_api.enc", BaseDirectory::AppLocalData).unwrap();
|
||||
|
||||
let content = decrypt_file(path.clone());
|
||||
let mut data: Value = serde_json::from_str(content.as_str()).unwrap();
|
||||
@@ -103,11 +109,7 @@ pub fn edit_settings(app_handle: tauri::AppHandle, port: i32, autostart: bool) {
|
||||
|
||||
#[tauri::command]
|
||||
pub fn reset_token(app_handle: tauri::AppHandle) -> String {
|
||||
let mut path = app_handle.path_resolver().app_local_data_dir().unwrap();
|
||||
path.push("ToDo");
|
||||
path.push("config_api");
|
||||
|
||||
path.set_extension("enc");
|
||||
let path = app_handle.path().resolve("ToDo/config_api.enc", BaseDirectory::AppLocalData).unwrap();
|
||||
|
||||
let key = rand::thread_rng().gen::<[u8; 32]>(); // 256-битный ключ
|
||||
|
||||
|
||||
@@ -1,74 +1,91 @@
|
||||
use serde_json::Value;
|
||||
use chrono::{DateTime, Local};
|
||||
use serde_json::Value;
|
||||
|
||||
use crate::aes_enc_dec::encrypt;
|
||||
use crate::tasks;
|
||||
|
||||
pub fn get_tasks_tcp(token: String) -> Vec<u8>{
|
||||
encrypt(&hex::decode(token).unwrap(), tasks::get_tasks().to_string().as_str())
|
||||
pub fn get_tasks_tcp(token: String) -> Vec<u8> {
|
||||
encrypt(
|
||||
&hex::decode(token).unwrap(),
|
||||
tasks::get_tasks().to_string().as_str(),
|
||||
)
|
||||
}
|
||||
|
||||
pub fn get_task_by_id_tcp(token: String, json: Value) -> Vec<u8> {
|
||||
let tasks: Value = tasks::get_tasks();
|
||||
let res;
|
||||
if !json.get("id").is_none(){
|
||||
res = encrypt(&hex::decode(token).unwrap(), tasks[json["id"].as_str().unwrap_or("")].to_string().as_str());
|
||||
} else{
|
||||
if !json.get("id").is_none() {
|
||||
res = encrypt(
|
||||
&hex::decode(token).unwrap(),
|
||||
tasks[json["id"].as_str().unwrap_or("")]
|
||||
.to_string()
|
||||
.as_str(),
|
||||
);
|
||||
} else {
|
||||
res = encrypt(&hex::decode(token).unwrap(), "400");
|
||||
}
|
||||
res
|
||||
}
|
||||
|
||||
pub fn create_task_tcp(token: String, json: Value) -> Vec<u8> {
|
||||
if json["task"].is_object(){
|
||||
if json["task"]["name"].is_string(){
|
||||
if json["task"].is_object() {
|
||||
if json["task"]["name"].is_string() {
|
||||
let current_datetime: DateTime<Local> = Local::now();
|
||||
let date: String = current_datetime.format("%Y.%m.%d").to_string();
|
||||
let time: String = current_datetime.format("%H:%M").to_string();
|
||||
|
||||
let name = json["task"]["name"].as_str().unwrap().to_string();
|
||||
let description = json["task"]["description"].as_str().unwrap_or("").to_string();
|
||||
let description = json["task"]["description"]
|
||||
.as_str()
|
||||
.unwrap_or("")
|
||||
.to_string();
|
||||
let priority = json["task"]["priority"].as_str().unwrap_or("0").to_string();
|
||||
|
||||
encrypt(&hex::decode(token).unwrap(), tasks::add_task(date, time, name, description, priority).as_str())
|
||||
} else{
|
||||
encrypt(
|
||||
&hex::decode(token).unwrap(),
|
||||
tasks::add_task(date, time, name, description, priority).as_str(),
|
||||
)
|
||||
} else {
|
||||
encrypt(&hex::decode(token).unwrap(), "400")
|
||||
}
|
||||
} else{
|
||||
} else {
|
||||
encrypt(&hex::decode(token).unwrap(), "400")
|
||||
}
|
||||
}
|
||||
|
||||
pub fn edit_task_tcp(token: String, json: Value) -> Vec<u8> {
|
||||
if json["task"].is_object(){
|
||||
if json["task"]["id"].is_number(){
|
||||
if json["task"].is_object() {
|
||||
if json["task"]["id"].is_number() {
|
||||
let id_task = json["task"]["id"].as_number().unwrap().to_string();
|
||||
let name = json["task"]["name"].as_str().unwrap().to_string();
|
||||
let description = json["task"]["description"].as_str().unwrap_or("").to_string();
|
||||
let description = json["task"]["description"]
|
||||
.as_str()
|
||||
.unwrap_or("")
|
||||
.to_string();
|
||||
let priority = json["task"]["priority"].as_str().unwrap_or("0").to_string();
|
||||
|
||||
if tasks::edit_task(id_task, name, description, priority) {
|
||||
encrypt(&hex::decode(token).unwrap(), "200")
|
||||
} else{
|
||||
} else {
|
||||
encrypt(&hex::decode(token).unwrap(), "400")
|
||||
}
|
||||
} else{
|
||||
} else {
|
||||
encrypt(&hex::decode(token).unwrap(), "400")
|
||||
}
|
||||
} else{
|
||||
} else {
|
||||
encrypt(&hex::decode(token).unwrap(), "400")
|
||||
}
|
||||
}
|
||||
|
||||
pub fn delete_task_tcp(token: String, json: Value) -> Vec<u8> {
|
||||
let res;
|
||||
if !json.get("id").is_none(){
|
||||
if tasks::delete_task(json["id"].to_string()){
|
||||
if !json.get("id").is_none() {
|
||||
if tasks::delete_task(json["id"].to_string()) {
|
||||
res = encrypt(&hex::decode(token).unwrap(), "200");
|
||||
} else{
|
||||
} else {
|
||||
res = encrypt(&hex::decode(token).unwrap(), "400");
|
||||
}
|
||||
} else{
|
||||
} else {
|
||||
res = encrypt(&hex::decode(token).unwrap(), "400");
|
||||
}
|
||||
res
|
||||
|
||||
@@ -1,19 +1,20 @@
|
||||
use serde_json::Value;
|
||||
use std::io::{BufRead, BufReader, Write};
|
||||
use std::net::{TcpListener, TcpStream};
|
||||
use std::path::PathBuf;
|
||||
use std::thread;
|
||||
use std::string::String;
|
||||
use serde_json::Value;
|
||||
use tauri::{AppHandle, Manager};
|
||||
use std::thread;
|
||||
use tauri::{AppHandle, Emitter, Manager};
|
||||
use tauri::path::BaseDirectory;
|
||||
|
||||
use crate::{config_tcp, handler_commands};
|
||||
use crate::aes_enc_dec::{decrypt, encrypt};
|
||||
use crate::enc_dec_file::decrypt_file;
|
||||
use crate::aes_enc_dec::{encrypt, decrypt};
|
||||
use crate::{config_tcp, handler_commands};
|
||||
|
||||
static mut TCP_COMMAND: &str = "";
|
||||
static mut PATH_CONFIG: Option<&'static str> = None;
|
||||
|
||||
fn get_token() -> String{
|
||||
fn get_token() -> String {
|
||||
unsafe {
|
||||
let content = decrypt_file(PathBuf::from(PATH_CONFIG.unwrap()));
|
||||
let data: Value = serde_json::from_str(content.as_str()).unwrap();
|
||||
@@ -22,21 +23,25 @@ fn get_token() -> String{
|
||||
}
|
||||
} // Получение токена доступа
|
||||
|
||||
fn data_to_enc_hex(data: &str) -> String{
|
||||
fn data_to_enc_hex(data: &str) -> String {
|
||||
hex::encode(encrypt(&hex::decode(get_token()).unwrap(), data))
|
||||
} // Шифрование строки до данных обёрнутых в HEX
|
||||
|
||||
fn enc_hex_to_data(data: &str) -> String{
|
||||
decrypt(&hex::decode(get_token()).unwrap(), &hex::decode(data).unwrap())
|
||||
fn enc_hex_to_data(data: &str) -> String {
|
||||
decrypt(
|
||||
&hex::decode(get_token()).unwrap(),
|
||||
&hex::decode(data).unwrap(),
|
||||
)
|
||||
} // Расшифровка обёрнутых в HEX данных до строки
|
||||
|
||||
|
||||
fn create_tcp_listener(app_handle: AppHandle) -> TcpListener{
|
||||
fn create_tcp_listener(app_handle: AppHandle) -> TcpListener {
|
||||
let path: PathBuf = [
|
||||
app_handle.path_resolver().app_local_data_dir().unwrap(),
|
||||
app_handle.path().resolve("ToDo/config_api.enc", BaseDirectory::AppLocalData).unwrap(),
|
||||
"ToDo".into(),
|
||||
"config_api.enc".into(),
|
||||
].iter().collect(); // Путь к конфиг файлу
|
||||
]
|
||||
.iter()
|
||||
.collect(); // Путь к конфиг файлу
|
||||
|
||||
let path_str = Box::leak(Box::new(path.to_string_lossy().into_owned()));
|
||||
|
||||
@@ -44,7 +49,11 @@ fn create_tcp_listener(app_handle: AppHandle) -> TcpListener{
|
||||
PATH_CONFIG = Some(path_str);
|
||||
}
|
||||
|
||||
return match TcpListener::bind(format!("127.0.0.1:{}", config_tcp::get_port(app_handle.clone()))){ // Создание TCP слушателя на локальном порту
|
||||
return match TcpListener::bind(format!(
|
||||
"127.0.0.1:{}",
|
||||
config_tcp::get_port(app_handle.clone())
|
||||
)) {
|
||||
// Создание TCP слушателя на локальном порту
|
||||
Ok(tcp) => {
|
||||
for stream in tcp.incoming() {
|
||||
unsafe {
|
||||
@@ -53,25 +62,27 @@ fn create_tcp_listener(app_handle: AppHandle) -> TcpListener{
|
||||
|
||||
let stream = stream.unwrap(); // Получение запроса
|
||||
|
||||
let thread = thread::spawn(move || { // Создание отдельного потока
|
||||
let thread = thread::spawn(move || {
|
||||
// Создание отдельного потока
|
||||
handle_connection(stream); // Обработка запроса
|
||||
});
|
||||
|
||||
thread.join().unwrap(); // Ожидание пока завершится поток
|
||||
|
||||
unsafe {
|
||||
match TCP_COMMAND { // Сравнивание команд
|
||||
match TCP_COMMAND {
|
||||
// Сравнивание команд
|
||||
"stop" => {
|
||||
app_handle.emit_all("update_api", "").unwrap();
|
||||
app_handle.emit("update_api", "").unwrap();
|
||||
break;
|
||||
}
|
||||
_ => {}
|
||||
}
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
tcp
|
||||
},
|
||||
}
|
||||
Err(err) => {
|
||||
println!("{}", err);
|
||||
TcpListener::bind("").unwrap()
|
||||
@@ -86,49 +97,56 @@ fn handle_connection(mut stream: TcpStream) {
|
||||
Ok(_) => {
|
||||
if req.len() > 0 {
|
||||
let res = enc_hex_to_data(req.trim()); // Дешифрование
|
||||
let json: Value = serde_json::from_str(res.as_str()).unwrap_or(serde_json::json!("")); // Попытка преобразования запроса в JSON
|
||||
if json != serde_json::json!(""){
|
||||
let json: Value =
|
||||
serde_json::from_str(res.as_str()).unwrap_or(serde_json::json!("")); // Попытка преобразования запроса в JSON
|
||||
if json != serde_json::json!("") {
|
||||
println!("JSON: {:?}", json);
|
||||
println!("JSON command: {:?}", json["command"]);
|
||||
match json["command"].as_str().unwrap() { // Сравнивание команд
|
||||
match json["command"].as_str().unwrap() {
|
||||
// Сравнивание команд
|
||||
"stop" => {
|
||||
unsafe {
|
||||
TCP_COMMAND = "stop";
|
||||
}
|
||||
let res = encrypt(&hex::decode(get_token()).unwrap(), "200");
|
||||
stream.write(hex::encode(res).as_bytes()).unwrap();
|
||||
},
|
||||
}
|
||||
"status" => {
|
||||
let res = encrypt(&hex::decode(get_token()).unwrap(), "200");
|
||||
stream.write(hex::encode(res).as_bytes()).unwrap();
|
||||
},
|
||||
}
|
||||
"get_tasks" => {
|
||||
let res = handler_commands::get_tasks_tcp(get_token());
|
||||
stream.write(hex::encode(res).as_bytes()).unwrap();
|
||||
},
|
||||
}
|
||||
"get_task_by_id" => {
|
||||
let res = handler_commands::get_task_by_id_tcp(get_token(), json);
|
||||
stream.write(hex::encode(res).as_bytes()).unwrap();
|
||||
},
|
||||
}
|
||||
"create_task" => {
|
||||
let res = handler_commands::create_task_tcp(get_token(), json);
|
||||
stream.write(hex::encode(res).as_bytes()).unwrap();
|
||||
},
|
||||
}
|
||||
"edit_task" => {
|
||||
let res = handler_commands::edit_task_tcp(get_token(), json);
|
||||
stream.write(hex::encode(res).as_bytes()).unwrap();
|
||||
},
|
||||
}
|
||||
"delete_task" => {
|
||||
let res = handler_commands::delete_task_tcp(get_token(), json);
|
||||
stream.write(hex::encode(res).as_bytes()).unwrap();
|
||||
},
|
||||
}
|
||||
_ => {}
|
||||
}
|
||||
} else{
|
||||
stream.write(hex::encode(encrypt(&hex::decode(get_token()).unwrap(), "400")).as_bytes()).unwrap();
|
||||
} else {
|
||||
stream
|
||||
.write(
|
||||
hex::encode(encrypt(&hex::decode(get_token()).unwrap(), "400"))
|
||||
.as_bytes(),
|
||||
)
|
||||
.unwrap();
|
||||
}
|
||||
}
|
||||
},
|
||||
}
|
||||
what => {
|
||||
println!("{:?}", what);
|
||||
}
|
||||
@@ -136,20 +154,22 @@ fn handle_connection(mut stream: TcpStream) {
|
||||
}
|
||||
|
||||
#[tauri::command]
|
||||
pub fn start_tcp_server(app_handle: AppHandle){
|
||||
pub fn start_tcp_server(app_handle: AppHandle) {
|
||||
let handle = app_handle.clone();
|
||||
thread::spawn(move || { // Создание потока
|
||||
thread::spawn(move || {
|
||||
// Создание потока
|
||||
create_tcp_listener(handle); // Создание слушателя
|
||||
});
|
||||
app_handle.emit_all("update_api", "").unwrap(); // Глобальное сообщение для фронтенда для обновления API страницы
|
||||
app_handle.emit("update_api", "").unwrap(); // Глобальное сообщение для фронтенда для обновления API страницы
|
||||
}
|
||||
|
||||
#[tauri::command]
|
||||
pub fn get_status(app_handle: AppHandle) -> bool{
|
||||
match TcpListener::bind(format!("127.0.0.1:{}", config_tcp::get_port(app_handle))) { // Получения статуса слушателя, с помощью нового слушателя
|
||||
pub fn get_status(app_handle: AppHandle) -> bool {
|
||||
match TcpListener::bind(format!("127.0.0.1:{}", config_tcp::get_port(app_handle))) {
|
||||
// Получения статуса слушателя, с помощью нового слушателя
|
||||
Ok(_) => {
|
||||
false // Если удалось создать возвращаем false, т.к. слушателя не было
|
||||
},
|
||||
}
|
||||
Err(_) => {
|
||||
true // Иначе true
|
||||
}
|
||||
@@ -157,12 +177,17 @@ pub fn get_status(app_handle: AppHandle) -> bool{
|
||||
}
|
||||
|
||||
#[tauri::command]
|
||||
pub fn send_command_to_server(app_handle: AppHandle, command: String) -> bool{
|
||||
match TcpStream::connect(format!("127.0.0.1:{}", config_tcp::get_port(app_handle))) { // Подключение к слушателю
|
||||
pub fn send_command_to_server(app_handle: AppHandle, command: String) -> bool {
|
||||
match TcpStream::connect(format!("127.0.0.1:{}", config_tcp::get_port(app_handle))) {
|
||||
// Подключение к слушателю
|
||||
Ok(mut tcp) => {
|
||||
tcp.write_all(data_to_enc_hex(format!("{}: \"{}\" {}", "{\"command\"", command, "}\n").as_str()).as_bytes()).unwrap(); // Отправление команды
|
||||
tcp.write_all(
|
||||
data_to_enc_hex(format!("{}: \"{}\" {}", "{\"command\"", command, "}\n").as_str())
|
||||
.as_bytes(),
|
||||
)
|
||||
.unwrap(); // Отправление команды
|
||||
true
|
||||
},
|
||||
}
|
||||
Err(err) => {
|
||||
println!("{}", err);
|
||||
false
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
use magic_crypt::{new_magic_crypt, MagicCryptTrait};
|
||||
use std::fs::{read_to_string, write};
|
||||
use std::path::PathBuf;
|
||||
use magic_crypt::{MagicCryptTrait, new_magic_crypt};
|
||||
|
||||
use crate::config;
|
||||
|
||||
pub fn encrypt_n_save_file(path: PathBuf, content: String){
|
||||
pub fn encrypt_n_save_file(path: PathBuf, content: String) {
|
||||
let key = config::ENC_KEY;
|
||||
let mc = new_magic_crypt!(key, 256);
|
||||
let mut encrypted: String = String::new();
|
||||
@@ -14,8 +14,8 @@ pub fn encrypt_n_save_file(path: PathBuf, content: String){
|
||||
}
|
||||
let res = write(path, encrypted);
|
||||
match res {
|
||||
Ok(_) => {},
|
||||
Err(_) => println!("File save error!")
|
||||
Ok(_) => {}
|
||||
Err(_) => println!("File save error!"),
|
||||
}
|
||||
}
|
||||
|
||||
@@ -33,14 +33,14 @@ pub fn decrypt_file(path: PathBuf) -> String {
|
||||
Ok(line) => {
|
||||
decrypted = decrypted.to_owned() + line.as_str() + "\n";
|
||||
return decrypted;
|
||||
},
|
||||
}
|
||||
Err(_) => {
|
||||
println!("Что-то пошло не так!");
|
||||
}
|
||||
}
|
||||
}
|
||||
return String::new();
|
||||
},
|
||||
}
|
||||
Err(_) => {
|
||||
println!("Что-то не так...");
|
||||
return String::new();
|
||||
|
||||
@@ -0,0 +1,54 @@
|
||||
// Learn more about Tauri commands at https://tauri.app/v1/guides/features/command
|
||||
#[path = "api/aes_enc_dec.rs"] mod aes_enc_dec;
|
||||
#[path = "api/config_tcp.rs"] mod config_tcp;
|
||||
#[path = "api/handler_commands.rs"] mod handler_commands;
|
||||
#[path = "api/multithread_tcp_listener.rs"] mod multi_tcp_listener;
|
||||
|
||||
#[path = "config.rs"] mod config;
|
||||
#[path = "enc_dec_file.rs"] mod enc_dec_file;
|
||||
#[path = "subtasks_functions.rs"] mod subtasks;
|
||||
#[path = "tasks_functions.rs"] mod tasks;
|
||||
|
||||
pub fn run() {
|
||||
unsafe {
|
||||
std::env::set_var("WEBKIT_DISABLE_DMABUF_RENDERER", "1");
|
||||
}
|
||||
tauri::Builder::default()
|
||||
.plugin(tauri_plugin_shell::init())
|
||||
.setup(|app| {
|
||||
let app_handle = app.handle();
|
||||
|
||||
config_tcp::check_or_create_config_file(app_handle.clone());
|
||||
if config_tcp::get_autostart(app_handle.clone()) {
|
||||
multi_tcp_listener::start_tcp_server(app_handle.clone());
|
||||
}
|
||||
|
||||
Ok(())
|
||||
})
|
||||
.invoke_handler(tauri::generate_handler![
|
||||
tasks::check_or_create_tasks_file,
|
||||
// Tasks
|
||||
tasks::get_tasks,
|
||||
tasks::search_tasks,
|
||||
tasks::add_task,
|
||||
tasks::edit_task,
|
||||
tasks::delete_task,
|
||||
tasks::set_task_field,
|
||||
// Subtasks
|
||||
subtasks::get_subtasks,
|
||||
subtasks::add_subtask,
|
||||
subtasks::edit_subtask,
|
||||
subtasks::delete_subtask,
|
||||
subtasks::set_subtask_field,
|
||||
multi_tcp_listener::start_tcp_server,
|
||||
multi_tcp_listener::get_status,
|
||||
multi_tcp_listener::send_command_to_server,
|
||||
config_tcp::check_or_create_config_file,
|
||||
config_tcp::get_port,
|
||||
config_tcp::get_autostart,
|
||||
config_tcp::edit_settings,
|
||||
config_tcp::reset_token
|
||||
])
|
||||
.run(tauri::generate_context!())
|
||||
.expect("error while running tauri application");
|
||||
}
|
||||
@@ -1,67 +1,5 @@
|
||||
// Prevents additional console window on Windows in release, DO NOT REMOVE!!
|
||||
#![cfg_attr(not(debug_assertions), windows_subsystem = "windows")]
|
||||
|
||||
use std::thread;
|
||||
|
||||
// Learn more about Tauri commands at https://tauri.app/v1/guides/features/command
|
||||
#[path="api/multithread_tcp_listener.rs"] mod multi_tcp_listener;
|
||||
#[path= "api/handler_commands.rs"] mod handler_commands;
|
||||
#[path= "api/config_tcp.rs"] mod config_tcp;
|
||||
#[path= "api/aes_enc_dec.rs"] mod aes_enc_dec;
|
||||
|
||||
#[path="tasks_functions.rs"] mod tasks;
|
||||
#[path="config.rs"] mod config;
|
||||
#[path="enc_dec_file.rs"] mod enc_dec_file;
|
||||
|
||||
#[tauri::command]
|
||||
fn open_api_window(app_handle: tauri::AppHandle){
|
||||
thread::spawn(move || {
|
||||
match tauri::WindowBuilder::new(
|
||||
&app_handle,
|
||||
"api",
|
||||
tauri::WindowUrl::App("api.html".into())
|
||||
).title("Api")
|
||||
//.skip_taskbar(true)
|
||||
.decorations(false)
|
||||
.build() {
|
||||
Ok(_) => {}
|
||||
Err(_) => {
|
||||
//println!("{err}");
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
fn main() {
|
||||
std::env::set_var("WEBKIT_DISABLE_DMABUF_RENDERER", "1");
|
||||
tauri::Builder::default()
|
||||
.setup(|app| {
|
||||
let app_handle = app.handle();
|
||||
|
||||
if config_tcp::get_autostart(app_handle.clone()) {
|
||||
multi_tcp_listener::start_tcp_server(app_handle);
|
||||
}
|
||||
|
||||
Ok(())
|
||||
})
|
||||
.invoke_handler(tauri::generate_handler![
|
||||
tasks::check_or_create_tasks_file,
|
||||
tasks::get_tasks,
|
||||
tasks::search_tasks,
|
||||
tasks::add_task,
|
||||
tasks::edit_task,
|
||||
tasks::delete_task,
|
||||
tasks::set_task_field,
|
||||
open_api_window,
|
||||
multi_tcp_listener::start_tcp_server,
|
||||
multi_tcp_listener::get_status,
|
||||
multi_tcp_listener::send_command_to_server,
|
||||
config_tcp::check_or_create_config_file,
|
||||
config_tcp::get_port,
|
||||
config_tcp::get_autostart,
|
||||
config_tcp::edit_settings,
|
||||
config_tcp::reset_token
|
||||
])
|
||||
.run(tauri::generate_context!())
|
||||
.expect("error while running tauri application");
|
||||
app_lib::run();
|
||||
}
|
||||
|
||||
@@ -0,0 +1,134 @@
|
||||
use crate::enc_dec_file::{decrypt_file, encrypt_n_save_file};
|
||||
use serde_json::{json, Value};
|
||||
use std::path::PathBuf;
|
||||
|
||||
#[tauri::command]
|
||||
pub fn get_subtasks(id_task: String) -> Value {
|
||||
unsafe {
|
||||
let content = decrypt_file(PathBuf::from(crate::tasks::PATH_CONFIG.unwrap()));
|
||||
let data = serde_json::from_str::<Value>(content.as_str());
|
||||
return match data {
|
||||
Ok(data) => {
|
||||
let res: &Value = &data["tasks"][id_task.clone()]["subtasks"];
|
||||
res.clone()
|
||||
}
|
||||
Err(_) => {
|
||||
std::fs::remove_file(PathBuf::from(crate::tasks::PATH_CONFIG.unwrap())).unwrap();
|
||||
let data = String::from(
|
||||
"{\
|
||||
\"id\": 0,\
|
||||
\"tasks\": {}\
|
||||
}",
|
||||
);
|
||||
encrypt_n_save_file(PathBuf::from(crate::tasks::PATH_CONFIG.unwrap()), data);
|
||||
|
||||
return get_subtasks(id_task);
|
||||
}
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
#[tauri::command]
|
||||
pub fn add_subtask(
|
||||
id_task: String,
|
||||
date: String,
|
||||
time: String,
|
||||
name: String,
|
||||
description: String,
|
||||
) -> String {
|
||||
unsafe {
|
||||
let content = decrypt_file(PathBuf::from(crate::tasks::PATH_CONFIG.unwrap()));
|
||||
let mut data: Value = serde_json::from_str(content.as_str()).unwrap();
|
||||
|
||||
let pending = data.clone();
|
||||
let id = &pending["id"];
|
||||
|
||||
let subtask = json!({
|
||||
"id": id.to_string(),
|
||||
"date": date,
|
||||
"time": time,
|
||||
"name": name,
|
||||
"description": description,
|
||||
"completed": false
|
||||
});
|
||||
|
||||
data["id"] = (id.as_i64().unwrap() + 1).into();
|
||||
|
||||
data["tasks"][id_task]["subtasks"][id.to_string()] = subtask;
|
||||
encrypt_n_save_file(
|
||||
PathBuf::from(crate::tasks::PATH_CONFIG.unwrap()),
|
||||
data.to_string(),
|
||||
);
|
||||
|
||||
return id.to_string();
|
||||
}
|
||||
}
|
||||
|
||||
#[tauri::command]
|
||||
pub fn edit_subtask(
|
||||
id_task: String,
|
||||
id_subtask: String,
|
||||
name: String,
|
||||
description: String,
|
||||
) -> bool {
|
||||
unsafe {
|
||||
let content = decrypt_file(PathBuf::from(crate::tasks::PATH_CONFIG.unwrap()));
|
||||
let mut data: Value = serde_json::from_str(content.as_str()).unwrap();
|
||||
|
||||
return if !data["tasks"][id_task.clone()]["subtasks"][id_subtask.clone()]
|
||||
.get("id")
|
||||
.is_none()
|
||||
{
|
||||
data["tasks"][id_task.clone()]["subtasks"][id_subtask.clone()]["name"] = json!(name);
|
||||
data["tasks"][id_task.clone()]["subtasks"][id_subtask.clone()]["description"] =
|
||||
json!(description);
|
||||
|
||||
encrypt_n_save_file(
|
||||
PathBuf::from(crate::tasks::PATH_CONFIG.unwrap()),
|
||||
data.to_string(),
|
||||
);
|
||||
true
|
||||
} else {
|
||||
false
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
#[tauri::command]
|
||||
pub fn delete_subtask(id_task: String, id_subtask: String) -> bool {
|
||||
unsafe {
|
||||
let content = decrypt_file(PathBuf::from(crate::tasks::PATH_CONFIG.unwrap()));
|
||||
let mut data: Value = serde_json::from_str(content.as_str()).unwrap();
|
||||
|
||||
let subtasks = data["tasks"][id_task.clone()]["subtasks"]
|
||||
.as_object_mut()
|
||||
.unwrap();
|
||||
let binding = subtasks.clone();
|
||||
for (key, value) in binding {
|
||||
if id_subtask == value["id"] {
|
||||
subtasks.remove(&key);
|
||||
data["tasks"][id_task]["subtasks"] = json!(subtasks);
|
||||
encrypt_n_save_file(
|
||||
PathBuf::from(crate::tasks::PATH_CONFIG.unwrap()),
|
||||
data.to_string(),
|
||||
);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
false
|
||||
}
|
||||
}
|
||||
|
||||
#[tauri::command]
|
||||
pub fn set_subtask_field(id_task: String, id_subtask: String, field: String, value: String) {
|
||||
unsafe {
|
||||
let content = decrypt_file(PathBuf::from(crate::tasks::PATH_CONFIG.unwrap()));
|
||||
let mut data: Value = serde_json::from_str(content.as_str()).unwrap();
|
||||
data["tasks"][id_task]["subtasks"][id_subtask][field] = json!(value);
|
||||
|
||||
encrypt_n_save_file(
|
||||
PathBuf::from(crate::tasks::PATH_CONFIG.unwrap()),
|
||||
data.to_string(),
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -1,20 +1,18 @@
|
||||
use std::fs::{read_to_string};
|
||||
use std::path::{Path, PathBuf};
|
||||
use std::fs::File;
|
||||
use serde_json::{Value, json};
|
||||
use rust_fuzzy_search::fuzzy_search_best_n;
|
||||
use serde_json::{json, Value};
|
||||
use std::fs::read_to_string;
|
||||
use std::fs::File;
|
||||
use std::path::{Path, PathBuf};
|
||||
use tauri::Manager;
|
||||
use tauri::path::BaseDirectory;
|
||||
|
||||
use crate::enc_dec_file::{encrypt_n_save_file, decrypt_file};
|
||||
use crate::enc_dec_file::{decrypt_file, encrypt_n_save_file};
|
||||
|
||||
static mut PATH_CONFIG: Option<&'static str> = None;
|
||||
pub static mut PATH_CONFIG: Option<&'static str> = None;
|
||||
|
||||
#[tauri::command]
|
||||
pub fn check_or_create_tasks_file(app_handle: tauri::AppHandle) {
|
||||
let path: PathBuf = [
|
||||
app_handle.path_resolver().app_local_data_dir().unwrap(),
|
||||
"ToDo".into(),
|
||||
"tasks.enc".into(),
|
||||
].iter().collect(); // Путь к конфиг файлу
|
||||
let path = app_handle.path().resolve("ToDo/tasks.enc", BaseDirectory::AppLocalData).unwrap();
|
||||
|
||||
let path_str = Box::leak(Box::new(path.to_string_lossy().into_owned()));
|
||||
|
||||
@@ -24,32 +22,34 @@ pub fn check_or_create_tasks_file(app_handle: tauri::AppHandle) {
|
||||
|
||||
unsafe {
|
||||
let exist: bool = Path::new(PATH_CONFIG.unwrap()).exists();
|
||||
if exist{
|
||||
if exist {
|
||||
let content = read_to_string(path);
|
||||
return match content {
|
||||
Ok(_) => {},
|
||||
Ok(_) => {}
|
||||
Err(_) => {
|
||||
println!("Не удалось открыть конфигурационный файл!");
|
||||
}
|
||||
}
|
||||
} else{
|
||||
};
|
||||
} else {
|
||||
let path = Path::new(&path);
|
||||
let prefix = path.parent().unwrap();
|
||||
let file = std::fs::create_dir_all(prefix);
|
||||
match file{
|
||||
Ok(_) => {},
|
||||
Err(err) => println!("Не удалось создать директории! \n{}", err)
|
||||
match file {
|
||||
Ok(_) => {}
|
||||
Err(err) => println!("Не удалось создать директории! \n{}", err),
|
||||
}
|
||||
let file = File::create(path);
|
||||
match file{
|
||||
match file {
|
||||
Ok(_) => {
|
||||
let data = String::from("{\
|
||||
let data = String::from(
|
||||
"{\
|
||||
\"id\": 0,\
|
||||
\"tasks\": {}\
|
||||
}");
|
||||
}",
|
||||
);
|
||||
encrypt_n_save_file(path.into(), data);
|
||||
},
|
||||
Err(err) => println!("Не удалось создать файл! \n{}", err)
|
||||
}
|
||||
Err(err) => println!("Не удалось создать файл! \n{}", err),
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -59,11 +59,26 @@ pub fn check_or_create_tasks_file(app_handle: tauri::AppHandle) {
|
||||
pub fn get_tasks() -> Value {
|
||||
unsafe {
|
||||
let content = decrypt_file(PathBuf::from(PATH_CONFIG.unwrap()));
|
||||
let data: Value = serde_json::from_str(content.as_str()).unwrap();
|
||||
let data = serde_json::from_str::<Value>(content.as_str());
|
||||
return match data {
|
||||
Ok(data) => {
|
||||
let res: &Value = &data["tasks"];
|
||||
|
||||
let res = &data["tasks"];
|
||||
res.clone()
|
||||
}
|
||||
Err(_) => {
|
||||
std::fs::remove_file(PathBuf::from(PATH_CONFIG.unwrap())).unwrap();
|
||||
let data = String::from(
|
||||
"{\
|
||||
\"id\": 0,\
|
||||
\"tasks\": {}\
|
||||
}",
|
||||
);
|
||||
encrypt_n_save_file(PathBuf::from(PATH_CONFIG.unwrap()), data);
|
||||
|
||||
return res.clone();
|
||||
return get_tasks();
|
||||
}
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
@@ -93,7 +108,15 @@ pub fn search_tasks(value: String) -> Value {
|
||||
for (name, score) in res1 {
|
||||
if score > 0.6 {
|
||||
for (key, value) in binding1["tasks"].as_object().unwrap() {
|
||||
if value.get("name").unwrap().as_str().unwrap().to_lowercase().as_str() == name {
|
||||
if value
|
||||
.get("name")
|
||||
.unwrap()
|
||||
.as_str()
|
||||
.unwrap()
|
||||
.to_lowercase()
|
||||
.as_str()
|
||||
== name
|
||||
{
|
||||
result[key] = binding1["tasks"].get(key).unwrap().clone();
|
||||
break;
|
||||
}
|
||||
@@ -106,7 +129,13 @@ pub fn search_tasks(value: String) -> Value {
|
||||
}
|
||||
|
||||
#[tauri::command]
|
||||
pub fn add_task(date: String, time: String, name: String, description: String, priority: String) -> String {
|
||||
pub fn add_task(
|
||||
date: String,
|
||||
time: String,
|
||||
name: String,
|
||||
description: String,
|
||||
priority: String,
|
||||
) -> String {
|
||||
unsafe {
|
||||
let content = decrypt_file(PathBuf::from(PATH_CONFIG.unwrap()));
|
||||
let mut data: Value = serde_json::from_str(content.as_str()).unwrap();
|
||||
@@ -121,6 +150,7 @@ pub fn add_task(date: String, time: String, name: String, description: String, p
|
||||
"name": name,
|
||||
"description": description,
|
||||
"priority": priority,
|
||||
"subtasks": {},
|
||||
"completed": false
|
||||
});
|
||||
|
||||
@@ -134,26 +164,26 @@ pub fn add_task(date: String, time: String, name: String, description: String, p
|
||||
}
|
||||
|
||||
#[tauri::command]
|
||||
pub fn edit_task(id_task: String, name: String, description: String, priority: String) -> bool{
|
||||
pub fn edit_task(id_task: String, name: String, description: String, priority: String) -> bool {
|
||||
unsafe {
|
||||
let content = decrypt_file(PathBuf::from(PATH_CONFIG.unwrap()));
|
||||
let mut data: Value = serde_json::from_str(content.as_str()).unwrap();
|
||||
|
||||
return if !data["tasks"][id_task.clone()].get("id").is_none(){
|
||||
return if !data["tasks"][id_task.clone()].get("id").is_none() {
|
||||
data["tasks"][id_task.clone()]["name"] = json!(name);
|
||||
data["tasks"][id_task.clone()]["description"] = json!(description);
|
||||
data["tasks"][id_task]["priority"] = json!(priority);
|
||||
|
||||
encrypt_n_save_file(PathBuf::from(PATH_CONFIG.unwrap()), data.to_string());
|
||||
true
|
||||
} else{
|
||||
} else {
|
||||
false
|
||||
}
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
#[tauri::command]
|
||||
pub fn delete_task(id_task: String) -> bool{
|
||||
pub fn delete_task(id_task: String) -> bool {
|
||||
unsafe {
|
||||
let content = decrypt_file(PathBuf::from(PATH_CONFIG.unwrap()));
|
||||
let mut data: Value = serde_json::from_str(content.as_str()).unwrap();
|
||||
@@ -165,7 +195,7 @@ pub fn delete_task(id_task: String) -> bool{
|
||||
tasks.remove(&key);
|
||||
data["tasks"] = json!(tasks);
|
||||
encrypt_n_save_file(PathBuf::from(PATH_CONFIG.unwrap()), data.to_string());
|
||||
return true
|
||||
return true;
|
||||
}
|
||||
}
|
||||
false
|
||||
|
||||
@@ -2,54 +2,36 @@
|
||||
"build": {
|
||||
"beforeDevCommand": "npm run dev",
|
||||
"beforeBuildCommand": "npm run build",
|
||||
"devPath": "http://localhost:1420",
|
||||
"distDir": "../dist"
|
||||
"frontendDist": "../dist",
|
||||
"devUrl": "http://localhost:1420"
|
||||
},
|
||||
"package": {
|
||||
"productName": "to-do-app",
|
||||
"version": "1.5.0"
|
||||
"bundle": {
|
||||
"active": true,
|
||||
"targets": "all",
|
||||
"icon": [
|
||||
"icons/32x32.png",
|
||||
"icons/128x128.png",
|
||||
"icons/128x128@2x.png",
|
||||
"icons/icon.icns",
|
||||
"icons/icon.ico"
|
||||
]
|
||||
},
|
||||
"tauri": {
|
||||
"allowlist": {
|
||||
"all": false,
|
||||
"shell": {
|
||||
"all": false,
|
||||
"open": true
|
||||
},
|
||||
"window": {
|
||||
"all": false,
|
||||
"close": true,
|
||||
"hide": true,
|
||||
"show": true,
|
||||
"maximize": true,
|
||||
"minimize": true,
|
||||
"unmaximize": true,
|
||||
"unminimize": true,
|
||||
"startDragging": true
|
||||
}
|
||||
},
|
||||
"windows": [
|
||||
{
|
||||
"title": "To Do List",
|
||||
"width": 800,
|
||||
"height": 600,
|
||||
"decorations": false
|
||||
}
|
||||
],
|
||||
"productName": "to-do-app",
|
||||
"mainBinaryName": "to-do-app",
|
||||
"version": "1.7.0",
|
||||
"identifier": "com.a-dot.dev",
|
||||
"plugins": {},
|
||||
"app": {
|
||||
"security": {
|
||||
"csp": null
|
||||
},
|
||||
"bundle": {
|
||||
"active": true,
|
||||
"targets": "all",
|
||||
"identifier": "com.a-dot.dev",
|
||||
"icon": [
|
||||
"icons/32x32.png",
|
||||
"icons/128x128.png",
|
||||
"icons/128x128@2x.png",
|
||||
"icons/icon.icns",
|
||||
"icons/icon.ico"
|
||||
]
|
||||
}
|
||||
"windows": [
|
||||
{
|
||||
"width": 800,
|
||||
"height": 600,
|
||||
"decorations": false,
|
||||
"title": "To Do List"
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
@@ -1,17 +1,16 @@
|
||||
<script setup>
|
||||
import {Icon} from "@iconify/vue";
|
||||
import {onBeforeMount, ref} from "vue";
|
||||
import {appWindow} from "@tauri-apps/api/window";
|
||||
import {getCurrentWebviewWindow} from "@tauri-apps/api/webviewWindow";
|
||||
|
||||
import {useDark, useToggle} from "@vueuse/core";
|
||||
import {invoke} from "@tauri-apps/api";
|
||||
import {useDark} from "@vueuse/core";
|
||||
useDark();
|
||||
import {invoke} from "@tauri-apps/api/core";
|
||||
import ConfirmModal from "./api_components/ConfirmModal.vue";
|
||||
import {listen} from "@tauri-apps/api/event";
|
||||
import SettingsModal from "./api_components/SettingsModal.vue";
|
||||
import PageHandler from "./api_wiki/PageHandler.vue";
|
||||
const appWindow = getCurrentWebviewWindow()
|
||||
|
||||
const isDark = useDark();
|
||||
const toggleDark = useToggle(isDark);
|
||||
|
||||
let wiki_open = ref(false);
|
||||
|
||||
@@ -109,44 +108,28 @@ function select_input(event){
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<div data-tauri-drag-region class="z-50 titlebar h-[30px] select-none fixed flex justify-end top-0 right-0 left-0 bg-gray-100 dark:bg-zinc-800">
|
||||
<p class="fixed left-2 top-0.5 text-lg dark:text-white">
|
||||
<span v-if="!wiki_open">API</span>
|
||||
<span v-else>API Wiki</span>
|
||||
</p>
|
||||
<div @click="appWindow.minimize()" class="titlebar-button hover:bg-gray-200 dark:hover:bg-gray-700 justify-center inline-flex w-[30px] h-[30px] items-center dark:text-white" id="titlebar-minimize">
|
||||
<Icon class="" icon="mdi:window-minimize" width="20" height="20"/>
|
||||
</div>
|
||||
<div @click="appWindow.toggleMaximize()" class="titlebar-button hover:bg-gray-200 dark:hover:bg-gray-700 justify-center inline-flex w-[30px] h-[30px] items-center dark:text-white" id="titlebar-maximize">
|
||||
<Icon class="" icon="mdi:window-maximize" width="20" height="20"/>
|
||||
</div>
|
||||
<div @click="appWindow.close()" class="titlebar-button hover:bg-gray-200 dark:hover:bg-gray-700 justify-center inline-flex w-[30px] h-[30px] items-center dark:text-white" id="titlebar-close">
|
||||
<Icon class="" icon="mdi:close" width="26" height="26"/>
|
||||
</div>
|
||||
</div>
|
||||
<div v-if="pending">
|
||||
<Icon icon="line-md:loading-twotone-loop" width="96" height="96" class="text-green-500 absolute top-[50%] left-[50%] translate-x-[-50%] translate-y-[-50%]"/>
|
||||
<img src="/icon/eos-icons--three-dots-loading.svg" alt="Loading" style="width: 96px; height: 96px" class="dark:invert absolute top-[50%] left-[50%] translate-x-[-50%] translate-y-[-50%]">
|
||||
</div>
|
||||
<div v-else>
|
||||
<button class="absolute top-10 right-2" @click="toggleDark()">
|
||||
<Icon v-if="!isDark" class="group-hover:invert text-yellow-400" icon="flowbite:sun-solid" width="38" height="38"/>
|
||||
<Icon v-else class="group-hover:invert text-blue-400" icon="ri:moon-fill" width="38" height="38"/>
|
||||
</button>
|
||||
<slot/>
|
||||
<div v-if="!wiki_open">
|
||||
<button class="absolute top-10 left-2" @click="open_settings">
|
||||
<Icon icon="material-symbols:settings-outline" width="38" height="38" class="text-zinc-600 dark:text-zinc-200"/>
|
||||
<button class="absolute top-10 right-2" @click="open_settings">
|
||||
<img src="/icon/material-symbols--settings-outline.svg" alt="API settings" style="width: 38px; height: 38px" class="dark:invert">
|
||||
</button>
|
||||
<div class="mt-8">
|
||||
<div class="mt-[28vh] grid grid-cols-1 grid-rows-3 sm:grid-cols-2 sm:grid-rows-2 gap-2.5 dark:text-white md:mx-16 lg:mx-24">
|
||||
<div class="text-center shadow dark:shadow-white mx-4 sm:mx-0 sm:ml-4 rounded-lg p-1 row-span-1">
|
||||
<p class="mb-4">Статус</p>
|
||||
<div v-if="!api_status" class="flex text-center align-middle items-center">
|
||||
<Icon class="text-red-500" icon="oui:dot" width="36" height="36"/>
|
||||
<img src="/icon/api/oui--dot.svg" alt="Api status"
|
||||
style="width: 36px; height: 36px; filter: invert(58%) sepia(88%) saturate(5276%) hue-rotate(336deg) brightness(95%) contrast(98%);">
|
||||
<span>Не подключено</span>
|
||||
<button @click="run_api" class="bg-green-500 text-white rounded-lg py-1 px-2 ml-2 hover:bg-green-600 transition-colors">Запустить</button>
|
||||
</div>
|
||||
<div v-else class="flex text-center align-middle items-center">
|
||||
<Icon class="text-green-500" icon="oui:dot" width="36" height="36"/>
|
||||
<img src="/icon/api/oui--dot.svg" alt="Api status"
|
||||
style="width: 36px; height: 36px; filter: invert(69%) sepia(18%) saturate(2201%) hue-rotate(86deg) brightness(91%) contrast(77%);">
|
||||
<span>Работает</span>
|
||||
<button @click="stop_api" class="bg-green-500 text-white rounded-lg py-1 px-2 ml-2 hover:bg-green-600 transition-colors">Остановить</button>
|
||||
</div>
|
||||
@@ -166,7 +149,7 @@ function select_input(event){
|
||||
<p v-else class="underline decoration-red-500 decoration-2 underline-offset-2">Нет подключения</p>
|
||||
</div>
|
||||
<div @click="wiki_open = true" class="cursor-pointer group mt-2 text-center shadow dark:shadow-white hover:shadow-md dark:hover:shadow-white ml-4 mr-6 sm:mr-4 rounded-lg p-1 col-start-1 col-end-3 row-start-3 sm:row-span-2">
|
||||
<Icon class="mt-1 text-zinc-800 dark:text-zinc-100 mx-auto" icon="mingcute:question-line" width="48" height="48"/>
|
||||
<img src="/icon/mingcute--question-line.svg" alt="How it works" style="width: 48px; height: 48px" class="mt-1 mx-auto dark:invert">
|
||||
<p class="text-xl mt-1 mb-2.5 group-hover:underline">Как этим пользоваться?</p>
|
||||
</div>
|
||||
</div>
|
||||
@@ -176,8 +159,8 @@ function select_input(event){
|
||||
<SettingsModal v-if="settings_modal" @close="settings_modal = false" :autostart="settings_autostart" :port="settings_port"/>
|
||||
</div>
|
||||
<div v-else>
|
||||
<button class="absolute top-10 left-2" @click="wiki_open = false">
|
||||
<Icon icon="material-symbols:arrow-back" width="38" height="38" class="text-zinc-600 dark:text-zinc-200"/>
|
||||
<button class="absolute top-10 left-12" @click="wiki_open = false">
|
||||
<img src="/icon/material-symbols--arrow-back.svg" alt="Back" style="width: 34px; height: 34px" class="dark:invert">
|
||||
</button>
|
||||
<PageHandler/>
|
||||
</div>
|
||||
|
||||
@@ -1,26 +1,30 @@
|
||||
<script setup>
|
||||
import {onBeforeMount, ref} from "vue";
|
||||
import {invoke} from "@tauri-apps/api";
|
||||
import {Icon} from "@iconify/vue";
|
||||
import {useDark} from "@vueuse/core";
|
||||
useDark();
|
||||
import {invoke} from "@tauri-apps/api/core";
|
||||
import EditModal from "./components/modals/EditModal.vue";
|
||||
import CreateModal from "./components/modals/CreateModal.vue";
|
||||
|
||||
import { appWindow } from '@tauri-apps/api/window';
|
||||
import { getCurrentWebviewWindow } from '@tauri-apps/api/webviewWindow';
|
||||
|
||||
import {useDark, useToggle} from "@vueuse/core";
|
||||
import PriorityModal from "./components/modals/PriorityModal.vue";
|
||||
import {listen} from "@tauri-apps/api/event";
|
||||
import ApiApp from "./ApiApp.vue";
|
||||
import SubtaskViewModal from "./components/modals/subtasks/ViewModal.vue";
|
||||
import Menu from "./components/Menu.vue";
|
||||
const appWindow = getCurrentWebviewWindow()
|
||||
|
||||
const isDark = useDark();
|
||||
const toggleDark = useToggle(isDark);
|
||||
|
||||
let page = ref('home');
|
||||
|
||||
let tasks = ref({});
|
||||
let pending = ref(true);
|
||||
let api_status = ref(false);
|
||||
let menu_opened = ref(false);
|
||||
|
||||
let create_modal = ref(false);
|
||||
let edit_modal = ref(false);
|
||||
let priority_modal = ref(false);
|
||||
let subtask_modal = ref(false);
|
||||
|
||||
let search_text = ref("");
|
||||
|
||||
@@ -33,63 +37,65 @@ let to_change_id = ref("");
|
||||
let to_change_name = ref("");
|
||||
let to_change_priority = ref("");
|
||||
|
||||
async function get_status() {
|
||||
await invoke('get_status')
|
||||
.then((res) => {
|
||||
api_status.value = res;
|
||||
});
|
||||
}
|
||||
let id_task_for_subtasks = ref("");
|
||||
|
||||
|
||||
onBeforeMount(async () => {
|
||||
await invoke('check_or_create_tasks_file')
|
||||
.then(async () => {
|
||||
await get_tasks();
|
||||
await get_status();
|
||||
pending.value = false;
|
||||
});
|
||||
|
||||
await listen('update_api', async () => {
|
||||
await get_status();
|
||||
})
|
||||
});
|
||||
|
||||
// Tasks
|
||||
function reorder_tasks(){
|
||||
tasks.value = tasks.value.sort(function (a, b) {
|
||||
if ( parseInt(a.priority) < parseInt(b.priority) ){
|
||||
return 1;
|
||||
}
|
||||
if ( parseInt(a.priority) > parseInt(b.priority) ){
|
||||
return -1;
|
||||
}
|
||||
return 0;
|
||||
});
|
||||
|
||||
function compare_priority(a, b) {
|
||||
if ( parseInt(a.priority) < parseInt(b.priority) ){
|
||||
return -1;
|
||||
}
|
||||
if ( parseInt(a.priority) > parseInt(b.priority) ){
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
tasks.value = tasks.value.sort(function (a, b) {
|
||||
if ( a.completed === 'true' && b.completed === 'false' ){
|
||||
return 1;
|
||||
}
|
||||
if ( a.completed === 'false' && b.completed === 'true' ){
|
||||
return -1;
|
||||
}
|
||||
return 0;
|
||||
});
|
||||
}
|
||||
|
||||
async function get_tasks(){
|
||||
let tmp_tasks = [];
|
||||
await invoke('get_tasks').then((res) => {
|
||||
for (let value in res){
|
||||
tmp_tasks.push(res[value]);
|
||||
}
|
||||
tasks.value = tmp_tasks.sort(compare_priority).reverse();
|
||||
tasks.value = tmp_tasks;
|
||||
reorder_tasks();
|
||||
});
|
||||
}
|
||||
|
||||
async function search_tasks(event){
|
||||
let tmp_tasks = [];
|
||||
if (event.target.value) {
|
||||
if (event.target.value.length > 1) {
|
||||
await invoke('search_tasks', {
|
||||
value: event.target.value
|
||||
}).then((res) => {
|
||||
for (let value in res){
|
||||
tmp_tasks.push(res[value]);
|
||||
}
|
||||
tasks.value = tmp_tasks.sort(compare_priority).reverse();
|
||||
tasks.value = tmp_tasks;
|
||||
reorder_tasks();
|
||||
});
|
||||
} else{
|
||||
await get_tasks();
|
||||
}
|
||||
}
|
||||
|
||||
async function set_task_field(id_task, completed){
|
||||
let field = "completed"
|
||||
id_task = id_task.toString();
|
||||
@@ -110,6 +116,7 @@ async function set_task_field(id_task, completed){
|
||||
break;
|
||||
}
|
||||
}
|
||||
reorder_tasks();
|
||||
});
|
||||
}
|
||||
|
||||
@@ -121,7 +128,6 @@ async function delete_task(id_task){
|
||||
await get_tasks();
|
||||
});
|
||||
}
|
||||
|
||||
function edit_task(id_task, name, description, priority){
|
||||
window.scrollTo({top:0});
|
||||
to_edit_id.value = id_task;
|
||||
@@ -139,102 +145,164 @@ function change_priority(id_task, name, priority){
|
||||
priority_modal.value = true;
|
||||
}
|
||||
|
||||
// Subtasks
|
||||
function count_subtasks(subtasks){
|
||||
let completed = 0;
|
||||
Object.entries(subtasks).forEach((key) => {
|
||||
if(subtasks[key[0]].completed === "true"){
|
||||
completed++;
|
||||
}
|
||||
});
|
||||
return completed;
|
||||
}
|
||||
|
||||
async function open_api(){
|
||||
await invoke('open_api_window');
|
||||
function change_api(){
|
||||
if (page.value !== 'api')
|
||||
page.value = 'api';
|
||||
else
|
||||
page.value = 'home';
|
||||
}
|
||||
function change_sync(){
|
||||
if (page.value !== 'sync')
|
||||
page.value = 'sync';
|
||||
else
|
||||
page.value = 'home';
|
||||
}
|
||||
function reload_page(){
|
||||
location.reload();
|
||||
}
|
||||
</script>
|
||||
|
||||
|
||||
<template>
|
||||
<!--Title bar-->
|
||||
<div data-tauri-drag-region class="z-50 titlebar h-[30px] select-none fixed flex justify-end top-0 right-0 left-0 bg-gray-100 dark:bg-zinc-800">
|
||||
<p class="fixed left-2 top-0.5 text-lg dark:text-white">To Do</p>
|
||||
<p class="fixed left-2 top-1 dark:text-white">To Do</p>
|
||||
<div @click="appWindow.minimize()" class="titlebar-button hover:bg-gray-200 dark:hover:bg-gray-700 justify-center inline-flex w-[30px] h-[30px] items-center dark:text-white" id="titlebar-minimize">
|
||||
<Icon class="" icon="mdi:window-minimize" width="20" height="20"/>
|
||||
<img src="/icon/window/mdi--window-minimize.svg" alt="Window minimize" style="width: 20px; height: 20px" class="dark:invert">
|
||||
</div>
|
||||
<div @click="appWindow.toggleMaximize()" class="titlebar-button hover:bg-gray-200 dark:hover:bg-gray-700 justify-center inline-flex w-[30px] h-[30px] items-center dark:text-white" id="titlebar-maximize">
|
||||
<Icon class="" icon="mdi:window-maximize" width="20" height="20"/>
|
||||
<img src="/icon/window/mdi--window-maximize.svg" alt="Window maximize" style="width: 20px; height: 20px" class="dark:invert">
|
||||
</div>
|
||||
<div @click="appWindow.close()" class="titlebar-button hover:bg-gray-200 dark:hover:bg-gray-700 justify-center inline-flex w-[30px] h-[30px] items-center dark:text-white" id="titlebar-close">
|
||||
<Icon class="" icon="mdi:close" width="26" height="26"/>
|
||||
<img src="/icon/window/mdi--window-close.svg" alt="Window close" style="width: 24px; height: 24px" class="dark:invert">
|
||||
</div>
|
||||
</div>
|
||||
<div v-if="pending">
|
||||
<Icon icon="line-md:loading-twotone-loop" width="96" height="96" class="text-green-500 absolute top-[50%] left-[50%] translate-x-[-50%] translate-y-[-50%]"/>
|
||||
<!--Home-->
|
||||
<div v-if="page==='home'">
|
||||
<!--Pending logo-->
|
||||
<div v-if="pending">
|
||||
<img src="/icon/eos-icons--three-dots-loading.svg" alt="Loading" style="width: 96px; height: 96px" class="dark:invert absolute top-[50%] left-[50%] translate-x-[-50%] translate-y-[-50%]">
|
||||
</div>
|
||||
<div v-else>
|
||||
<!--Menu button-->
|
||||
<button class="absolute top-9 left-2" @click="menu_opened = true">
|
||||
<img src="/icon/mingcute--menu-fill.svg" alt="Menu" style="width: 38px; height: 38px" class="dark:invert">
|
||||
</button>
|
||||
<!--Menu-->
|
||||
<Menu v-if="menu_opened" @close="menu_opened = !menu_opened" @home="reload_page"
|
||||
@api="change_api(); menu_opened = !menu_opened" @sync="change_sync(); menu_opened = !menu_opened"/>
|
||||
<!--Search-->
|
||||
<div id="search" class="relative flex h-10 mx-[15vw] lg:mx-[25vw] mt-12">
|
||||
<div class="!absolute right-1 top-1 z-10">
|
||||
<button
|
||||
v-if="search_text !== ''"
|
||||
@click="search_text = ''; get_tasks()"
|
||||
class="p-[1px] pt-[1px] pb-[2px] mr-0.5 rounded-lg group text-gray-400 hover:text-gray-500 transition-colors"
|
||||
type="button"
|
||||
data-ripple-light="true"
|
||||
>
|
||||
<img src="/icon/window/mdi--window-close.svg" alt="Clear search" style="width: 26px; height: 26px" class="dark:invert mt-0.5">
|
||||
</button>
|
||||
</div>
|
||||
<input
|
||||
v-model="search_text"
|
||||
type="text"
|
||||
class="peer h-full w-full rounded-lg border border-blue-gray-200 bg-transparent px-3 py-2.5 pr-20 font-sans text-sm font-normal text-blue-gray-700 dark:text-white dark:border-white outline outline-0 transition-all placeholder-shown:border placeholder-shown:border-blue-gray-200 placeholder-shown:border-t-blue-gray-200 focus:border-2 focus:border-green-400 focus:border-t-transparent focus:outline-0 disabled:border-0 disabled:bg-blue-gray-50"
|
||||
:class="{'dark:border-t-[rgb(30,30,30)]': search_text.length}"
|
||||
placeholder=" "
|
||||
@input="search_tasks"
|
||||
/>
|
||||
<label class="text-gray-400 dark:text-gray-300 focus:text-black before:content[' '] after:content[' '] pointer-events-none absolute left-0 -top-1.5 flex h-full w-full select-none text-[11px] font-normal leading-tight text-blue-gray-400 transition-all before:pointer-events-none before:mt-[6.5px] before:mr-1 before:box-border before:block before:h-1.5 before:w-2.5 before:rounded-tl-md before:border-t before:border-l before:border-blue-gray-200 before:transition-all after:pointer-events-none after:mt-[6.5px] after:ml-1 after:box-border after:block after:h-1.5 after:w-2.5 after:flex-grow after:rounded-tr-lg after:border-t after:border-r after:border-blue-gray-200 after:transition-all peer-placeholder-shown:text-sm peer-placeholder-shown:leading-[3.75] peer-placeholder-shown:text-blue-gray-500 peer-placeholder-shown:before:border-transparent peer-placeholder-shown:after:border-transparent peer-focus:text-[11px] peer-focus:leading-tight peer-focus:text-green-400 peer-focus:before:border-t-2 peer-focus:before:border-l-2 peer-focus:before:!border-green-400 peer-focus:after:border-t-2 peer-focus:after:border-r-2 peer-focus:after:!border-green-400 peer-disabled:text-transparent peer-disabled:before:border-transparent peer-disabled:after:border-transparent peer-disabled:peer-placeholder-shown:text-blue-gray-500">
|
||||
Поиск...
|
||||
</label>
|
||||
</div>
|
||||
<!--Create task-->
|
||||
<button @click="create_modal = !create_modal" type="button" data-ripple-light="true"
|
||||
class="p-[1px] pt-[1px] pb-[2px] fixed top-12 right-6 border-green-500 border-2 rounded-lg group bg-green-500 hover:bg-transparent transition-colors"
|
||||
><img src="/icon/tasks/ic--baseline-plus.svg" alt="Create task" style="width: 32px; height: 32px" class="invert group-hover:invert-0 dark:group-hover:invert">
|
||||
</button>
|
||||
<!--Tasks list-->
|
||||
<div id="list" class="relative mx-[14vw] lg:mx-[22vw] mt-5">
|
||||
<ul role="list" class="divide-y divide-gray-200 dark:divide-gray-500">
|
||||
<li v-for="task in tasks" :id="task.id" class="flex justify-between gap-x-6 py-5 group/task" :class="[id_task_for_subtasks === task.id ? 'border-2 border-white' : '']">
|
||||
<div @click="set_task_field(task.id, task.completed)" class="inline-flex items-center space-x-2 min-w-0 gap-x-2 group-hover/task:cursor-pointer py-2">
|
||||
<p class="text-sm flex-none border rounded-full" :class="[ task.completed === 'true' ? 'border-green-500 group-hover:border-green-400' : 'border-gray-300 group-hover:border-gray-500' ]">
|
||||
<img src="/icon/tasks/material-symbols--check.svg" alt="Check task" style="width: 20px; height: 20px" class="m-0.5"
|
||||
:class="[ task.completed === 'true' ? 'opacity-100' : 'opacity-0' ]">
|
||||
</p>
|
||||
<div class="min-w-0 flex-auto">
|
||||
<p class="truncate sm:text-[2vw] lg:text-[1.5vw] xl:text-[1vw] font-semibold leading-6 decoration-2" :class="[ task.completed === 'true' ? 'line-through text-gray-400' : 'text-gray-900 dark:text-gray-300' ]" >{{task.name}}</p>
|
||||
<p class="truncate text-xs leading-5 text-gray-500 dark:text-gray-400">{{task.description}}</p>
|
||||
</div>
|
||||
</div>
|
||||
<div class="shrink-0 group-hover/task:opacity-100 transition-all">
|
||||
<div class="inline-flex items-center gap-x-1">
|
||||
<div class="mr-4 text-zinc-400 cursor-pointer" @click="subtask_modal = !subtask_modal; id_task_for_subtasks=task.id">
|
||||
<p v-if="Object.keys(task.subtasks).length === 0"
|
||||
class="hidden group-hover/task:flex font-bold text-xl line-through">0/0</p>
|
||||
<p v-else>
|
||||
<span class="hidden group-hover/task:flex font-bold text-xl"
|
||||
:class="[Object.keys(task.subtasks).length === count_subtasks(task.subtasks) ? 'line-through' : '']">
|
||||
{{Object.keys(task.subtasks).length}}/{{count_subtasks(task.subtasks)}}
|
||||
</span>
|
||||
</p>
|
||||
</div>
|
||||
<div class="hidden group-hover/task:flex gap-1">
|
||||
<button @click="edit_task(task.id, task.name, task.description, task.priority)" class="group/button border-2 rounded-lg p-1.5 border-green-400/70 hover:bg-green-400 hover:border-green-400 transition-colors">
|
||||
<img src="/icon/tasks/mdi--pencil.svg" alt="Edit task" style="width: 24px; height: 24px" class="dark:invert">
|
||||
</button>
|
||||
<button @click="delete_task(task.id)" class="group/button border-2 rounded-lg p-1.5 border-red-400/70 hover:bg-red-500 hover:border-red-500 transition-colors">
|
||||
<img src="/icon/tasks/ic--baseline-delete.svg" alt="Delete task" style="width: 24px; height: 24px" class="dark:invert">
|
||||
</button>
|
||||
<p class="mt-0.5 text-xs text-gray-400 mx-2 text-center">{{task.date}}<br>{{task.time}}</p>
|
||||
</div>
|
||||
<div title="Приоритет" class="mr-3 cursor-pointer drop-shadow-sm dark:drop-shadow-[0_1px_1px_rgba(255,255,255,0.35)]" @click="change_priority(task.id, task.name, task.priority)">
|
||||
<img v-if="parseInt(task.priority) === 0" src="/icon/tasks/streamline--signal-none-solid.svg" alt="Task priority" style="width: 26px; height: 26px" class="opacity-60 mr-1">
|
||||
<img v-if="parseInt(task.priority) > 0 && parseInt(task.priority) < 4" src="/icon/tasks/streamline--signal-low-solid.svg" alt="Task priority" style="width: 26px; height: 26px" class="opacity-80 mr-1">
|
||||
<img v-if="parseInt(task.priority) >= 4 && parseInt(task.priority) < 7" src="/icon/tasks/streamline--signal-medium-solid.svg" alt="Task priority" style="width: 26px; height: 26px" class="opacity-85 mr-1">
|
||||
<img v-if="parseInt(task.priority) >= 7 && parseInt(task.priority) < 9" src="/icon/tasks/streamline--signal-full-solid.svg" alt="Task priority" style="width: 26px; height: 26px" class="opacity-900 mr-1">
|
||||
<img v-if="parseInt(task.priority) >= 9" src="/icon/tasks/heroicons--exclamation-triangle-16-solid.svg" alt="Task priority" style="width: 32px; height: 32px" class="opacity-100">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
<!--Modals-->
|
||||
<div v-if="create_modal || edit_modal || priority_modal || subtask_modal" class="bg-black w-[100vw] h-full fixed top-0 opacity-70 z-40"/>
|
||||
<CreateModal v-if="create_modal" @close="create_modal = !create_modal; get_tasks()"/>
|
||||
<EditModal v-if="edit_modal" :task_id="to_edit_id" :task_name="to_edit_name" :task_description="to_edit_description" :task_priority="to_edit_priority" @close="edit_modal = !edit_modal"/>
|
||||
<PriorityModal v-if="priority_modal" :task_id="to_change_id" :task_name="to_change_name" :task_priority="to_change_priority" @close="priority_modal = !priority_modal"/>
|
||||
<SubtaskViewModal v-if="subtask_modal" :task_id="id_task_for_subtasks" @close="subtask_modal = !subtask_modal; id_task_for_subtasks = ''; get_tasks()"/>
|
||||
</div>
|
||||
</div>
|
||||
<!--Api-->
|
||||
<div v-else-if="page==='api'">
|
||||
<ApiApp @close="change_api()">
|
||||
<!--Menu button-->
|
||||
<button class="absolute top-9 left-2" @click="menu_opened = true">
|
||||
<img src="/icon/mingcute--menu-fill.svg" alt="Menu" style="width: 38px; height: 38px" class="dark:invert">
|
||||
</button>
|
||||
<!--Menu-->
|
||||
<Menu v-if="menu_opened" @close="menu_opened = !menu_opened"
|
||||
@home="reload_page" @api="change_api" @sync="change_sync"/>
|
||||
</ApiApp>
|
||||
</div>
|
||||
<div v-else-if="page==='sync'">
|
||||
In progress...
|
||||
</div>
|
||||
<div v-else>
|
||||
<button class="absolute bottom-2 left-2 opacity-50 hover:opacity-100" @click="open_api()">
|
||||
<Icon icon="icon-park-outline:earth" width="40" height="40" class="relative text-zinc-400 dark:text-zinc-300"/>
|
||||
<Icon v-if="api_status" class="absolute bottom-4 left-4 text-green-500" icon="oui:dot" width="36" height="36"/>
|
||||
<Icon v-else class="absolute bottom-4 left-4 text-red-500" icon="oui:dot" width="36" height="36"/>
|
||||
</button>
|
||||
<button class="absolute top-10 right-2" @click="toggleDark()">
|
||||
<Icon v-if="!isDark" class="group-hover:invert text-yellow-400" icon="flowbite:sun-solid" width="38" height="38"/>
|
||||
<Icon v-else class="group-hover:invert text-blue-400" icon="ri:moon-fill" width="38" height="38"/>
|
||||
</button>
|
||||
<div id="search" class="relative flex h-10 mx-[15vw] lg:mx-[25vw] mt-12">
|
||||
<div class="!absolute right-1 top-1 z-10">
|
||||
<button
|
||||
v-if="search_text !== ''"
|
||||
@click="search_text = ''; get_tasks()"
|
||||
class="p-[1px] pt-[1px] pb-[2px] mr-0.5 rounded-lg group text-gray-400 hover:text-gray-500 transition-colors"
|
||||
type="button"
|
||||
data-ripple-light="true"
|
||||
>
|
||||
<Icon icon="ic:baseline-close" width="26" height="26"/>
|
||||
</button>
|
||||
<button
|
||||
@click="create_modal = !create_modal"
|
||||
class="p-[1px] pt-[1px] pb-[2px] border-green-400 border-2 rounded-lg group hover:bg-green-400 transition-colors"
|
||||
type="button"
|
||||
data-ripple-light="true"
|
||||
>
|
||||
<Icon class="group-hover:invert dark:invert" icon="ic:baseline-plus" width="26" height="26"/>
|
||||
</button>
|
||||
</div>
|
||||
<input
|
||||
v-model="search_text"
|
||||
type="text"
|
||||
class="peer h-full w-full rounded-lg border border-blue-gray-200 bg-transparent px-3 py-2.5 pr-20 font-sans text-sm font-normal text-blue-gray-700 dark:text-white dark:border-white outline outline-0 transition-all placeholder-shown:border placeholder-shown:border-blue-gray-200 placeholder-shown:border-t-blue-gray-200 focus:border-2 focus:border-green-400 focus:border-t-transparent focus:outline-0 disabled:border-0 disabled:bg-blue-gray-50"
|
||||
:class="{'dark:border-t-[rgb(30,30,30)]': search_text.length}"
|
||||
placeholder=" "
|
||||
@input="search_tasks"
|
||||
/>
|
||||
<label class="text-gray-400 dark:text-gray-300 focus:text-black before:content[' '] after:content[' '] pointer-events-none absolute left-0 -top-1.5 flex h-full w-full select-none text-[11px] font-normal leading-tight text-blue-gray-400 transition-all before:pointer-events-none before:mt-[6.5px] before:mr-1 before:box-border before:block before:h-1.5 before:w-2.5 before:rounded-tl-md before:border-t before:border-l before:border-blue-gray-200 before:transition-all after:pointer-events-none after:mt-[6.5px] after:ml-1 after:box-border after:block after:h-1.5 after:w-2.5 after:flex-grow after:rounded-tr-lg after:border-t after:border-r after:border-blue-gray-200 after:transition-all peer-placeholder-shown:text-sm peer-placeholder-shown:leading-[3.75] peer-placeholder-shown:text-blue-gray-500 peer-placeholder-shown:before:border-transparent peer-placeholder-shown:after:border-transparent peer-focus:text-[11px] peer-focus:leading-tight peer-focus:text-green-400 peer-focus:before:border-t-2 peer-focus:before:border-l-2 peer-focus:before:!border-green-400 peer-focus:after:border-t-2 peer-focus:after:border-r-2 peer-focus:after:!border-green-400 peer-disabled:text-transparent peer-disabled:before:border-transparent peer-disabled:after:border-transparent peer-disabled:peer-placeholder-shown:text-blue-gray-500">
|
||||
Поиск...
|
||||
</label>
|
||||
</div>
|
||||
<div id="list" class="relative mx-[14vw] lg:mx-[22vw] mt-5">
|
||||
<ul role="list" class="divide-y divide-gray-200 dark:divide-gray-500">
|
||||
<li v-for="task in tasks" :id="task.id" class="flex justify-between gap-x-6 py-5 group/task">
|
||||
<div @click="set_task_field(task.id, task.completed)" class="inline-flex items-center space-x-2 min-w-0 gap-x-2 group-hover/task:cursor-pointer">
|
||||
<p class="text-sm flex-none border rounded-full" :class="[ task.completed === 'true' ? 'border-green-500 group-hover:border-green-400' : 'border-gray-300 group-hover:border-gray-500' ]"><Icon class="m-0.5" :class="[ task.completed === 'true' ? 'text-green-500 group-hover:text-green-400' : 'text-gray-50 group-hover:text-gray-500 dark:text-[rgb(30,30,30)]' ]" icon="material-symbols:check" width="20" height="20"/></p>
|
||||
<div class="min-w-0 flex-auto">
|
||||
<p class="truncate sm:text-[2vw] lg:text-[1.5vw] xl:text-[1vw] font-semibold leading-6 decoration-2" :class="[ task.completed === 'true' ? 'line-through text-gray-400' : 'text-gray-900 dark:text-gray-300' ]" >{{task.name}}</p>
|
||||
<p class="truncate text-xs leading-5 text-gray-500 dark:text-gray-400">{{task.description}}</p>
|
||||
</div>
|
||||
</div>
|
||||
<div class="shrink-0 group-hover/task:opacity-100 transition-all">
|
||||
<div class="inline-flex items-center gap-x-1">
|
||||
<div title="Приоритет" class="mr-4 cursor-pointer drop-shadow-sm dark:drop-shadow-[0_1px_1px_rgba(255,255,255,0.35)]" @click="change_priority(task.id, task.name, task.priority)">
|
||||
<Icon v-if="parseInt(task.priority) === 0" class="opacity-60 dark:text-white text-gray-500" icon="streamline:signal-none-solid" width="26" height="26"/>
|
||||
<Icon v-if="parseInt(task.priority) > 0 && parseInt(task.priority) < 4" class="opacity-80 text-orange-300" icon="streamline:signal-low-solid" width="26" height="26"/>
|
||||
<Icon v-if="parseInt(task.priority) >= 4 && parseInt(task.priority) < 7" class="opacity-85 text-amber-500" icon="streamline:signal-medium-solid" width="26" height="26"/>
|
||||
<Icon v-if="parseInt(task.priority) >= 7 && parseInt(task.priority) < 9" class="opacity-90 text-orange-600" icon="streamline:signal-full-solid" width="26" height="26"/>
|
||||
<Icon v-if="parseInt(task.priority) >= 9" class="opacity-100 text-red-500" icon="heroicons-solid:exclamation" width="32" height="32"/>
|
||||
</div>
|
||||
<p class="mt-0.5 text-xs text-gray-400 mr-2 text-center">{{task.date}}<br>{{task.time}}</p>
|
||||
<button @click="edit_task(task.id, task.name, task.description, task.priority)" class="group/button border-2 rounded-lg p-1.5 border-green-400/70 hover:bg-green-400 hover:border-green-400 transition-colors"><Icon class="group-hover/button:invert dark:invert" icon="mdi:pencil" width="24" height="24" style="color: black"/></button>
|
||||
<button @click="delete_task(task.id)" class="group/button border-2 rounded-lg p-1.5 border-red-400/70 hover:bg-red-500 hover:border-red-500 transition-colors"><Icon class="group-hover/button:invert dark:invert" icon="ic:baseline-delete" width="24" height="24" style="color: black"/></button>
|
||||
</div>
|
||||
</div>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
<div v-if="create_modal || edit_modal || priority_modal" class="bg-black w-[100vw] h-full fixed top-0 opacity-70 z-40"/>
|
||||
<CreateModal v-if="create_modal" @close="create_modal = !create_modal"/>
|
||||
<EditModal v-if="edit_modal" :task_id="to_edit_id" :task_name="to_edit_name" :task_description="to_edit_description" :task_priority="to_edit_priority" @close="edit_modal = !edit_modal"/>
|
||||
<PriorityModal v-if="priority_modal" :task_id="to_change_id" :task_name="to_change_name" :task_priority="to_change_priority" @close="priority_modal = !priority_modal"/>
|
||||
What?
|
||||
</div>
|
||||
</template>
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
<script setup>
|
||||
import {ref} from "vue";
|
||||
import {invoke} from "@tauri-apps/api";
|
||||
import {invoke} from "@tauri-apps/api/core";
|
||||
|
||||
const props = defineProps({
|
||||
port: Number,
|
||||
|
||||
@@ -1,11 +1,7 @@
|
||||
<script setup>
|
||||
import {Icon} from "@iconify/vue";
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<div class="border-zinc-400 dark:border-zinc-200 border bg-zinc-300 dark:bg-zinc-700 rounded-2xl p-2 mx-1 my-2 dark:text-gray-100">
|
||||
<div class="flex">
|
||||
<Icon icon="material-symbols:code" width="26" height="26"/>
|
||||
<img src="/icon/api/wiki/material-symbols--code.svg" alt="Code" style="width: 26px; height: 26px" class="dark:invert">
|
||||
<p class="text-md ml-1 mt-0.5"><slot name="title"/></p>
|
||||
</div>
|
||||
<p class="text-lg m-1 dark:text-gray-100 whitespace-pre-wrap"><slot name="body"/></p>
|
||||
|
||||
@@ -1,11 +1,7 @@
|
||||
<script setup>
|
||||
import {Icon} from "@iconify/vue";
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<div class="border-yellow-500 dark:border-yellow-600 border bg-yellow-50 dark:bg-gray-700 rounded-2xl p-2 m-2 text-yellow-600 dark:text-yellow-300">
|
||||
<div class="flex">
|
||||
<Icon icon="ic:round-warning" width="32" height="32"/>
|
||||
<img src="/icon/api/wiki/ic--round-warning.svg" alt="Warning" style="width: 32px; height: 32px">
|
||||
<p class="text-xl ml-1 mt-0.5"><slot name="title"/></p>
|
||||
</div>
|
||||
<p class="text-lg m-1"><slot name="body"/></p>
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
<script setup>
|
||||
import {ref} from "vue";
|
||||
import {Icon} from "@iconify/vue";
|
||||
import Warning from "../api_components/notes/Warning.vue";
|
||||
import AccordionElement from "../api_components/AccordionElement.vue";
|
||||
import Code from "../api_components/notes/Code.vue";
|
||||
@@ -11,13 +10,13 @@ let page = ref('main');
|
||||
<template>
|
||||
<div class="absolute top-11 left-[50%] translate-x-[-50%] flex text-lg dark:text-white gap-6">
|
||||
<div @click="page = 'main'" title="Основы" class="cursor-pointer border-b-2" :class="[page === 'main' ? 'border-b-black dark:border-b-white': 'border-b-transparent']">
|
||||
<Icon icon="material-symbols:home" width="40" height="40"/>
|
||||
<img src="/icon/api/wiki/material-symbols--home.svg" alt="Home page" style="width: 40px; height: 40px" class="dark:invert">
|
||||
</div>
|
||||
<div @click="page = 'commands'" title="Команды" class="cursor-pointer border-b-2" :class="[page === 'commands' ? 'border-b-black dark:border-b-white': 'border-b-transparent']">
|
||||
<Icon icon="ri:slash-commands-2" width="38" height="38"/>
|
||||
<img src="/icon/api/wiki/ri--slash-commands-2.svg" alt="Commands page" style="width: 38px; height: 38px" class="dark:invert">
|
||||
</div>
|
||||
<div @click="page = 'examples'" title="Примеры" class="cursor-pointer border-b-2" :class="[page === 'examples' ? 'border-b-black dark:border-b-white': 'border-b-transparent']">
|
||||
<Icon icon="majesticons:list-box" width="40" height="40"/>
|
||||
<img src="/icon/api/wiki/majesticons--list-box.svg" alt="Code page" style="width: 40px; height: 40px" class="dark:invert">
|
||||
</div>
|
||||
</div>
|
||||
<div class="mt-24 mx-8 dark:text-white">
|
||||
@@ -37,8 +36,10 @@ let page = ref('main');
|
||||
</Warning>
|
||||
<hr>
|
||||
<p class="text-lg ml-2 mt-2 leading-10">
|
||||
<span class="flex">Доступные команды описаны на вкладке "Команды" - <Icon class="ml-2" icon="ri:slash-commands-2" width="38" height="38"/></span>
|
||||
<span class="flex">Примеры описаны на вкладке "Примеры" - <Icon class="ml-2" icon="majesticons:list-box" width="40" height="40"/></span>
|
||||
<span class="flex">Доступные команды описаны на вкладке "Команды" -
|
||||
<img src="/icon/api/wiki/ri--slash-commands-2.svg" alt="Commands page" style="width: 38px; height: 38px" class="dark:invert"></span>
|
||||
<span class="flex">Примеры описаны на вкладке "Примеры" -
|
||||
<img src="/icon/api/wiki/majesticons--list-box.svg" alt="Code page" style="width: 40px; height: 40px" class="dark:invert"></span>
|
||||
</p>
|
||||
</div>
|
||||
<div v-if="page === 'commands'" class="lg:mx-12 lg:mt-32 xl:mx-24 xl:mt-48">
|
||||
|
||||
@@ -1,4 +0,0 @@
|
||||
import { createApp } from "vue";
|
||||
import ApiApp from "./ApiApp.vue";
|
||||
|
||||
createApp(ApiApp).mount("#app_api");
|
||||
@@ -0,0 +1,40 @@
|
||||
<script setup>
|
||||
import {useDark, useToggle} from "@vueuse/core";
|
||||
|
||||
let emit = defineEmits(['close', 'home', 'api', 'sync']);
|
||||
|
||||
const isDark = useDark();
|
||||
const toggleDark = useToggle(isDark);
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<div class="fixed h-full w-full top-0 bottom-0 left-0 right-0 bg-zinc-900/60 z-10"/>
|
||||
<div class="fixed top-0 bottom-0 w-56 pt-9 h-full bg-zinc-200 dark:bg-zinc-700 z-20 dark:text-white">
|
||||
<button class="ml-2" @click="emit('close')">
|
||||
<img src="/icon/mingcute--menu-fill.svg" alt="Menu" style="width: 38px; height: 38px" class="dark:invert">
|
||||
</button>
|
||||
<ul class="divide-y divide-gray-300 dark:divide-gray-500">
|
||||
<li class="py-2 px-4"><button class="flex" @click="emit('home')">
|
||||
<img src="/icon/tasks/mdi--pencil.svg" alt="tasks" style="width: 32px; height: 32px" class="dark:invert">
|
||||
<p class="pl-2 pt-0.5 text-lg">Задачи</p>
|
||||
</button></li>
|
||||
<li class="py-2 px-4"><button class="flex" @click="emit('api')">
|
||||
<img src="/icon/ant-design--api-outlined.svg" alt="tasks" style="width: 32px; height: 32px" class="dark:invert">
|
||||
<p class="pl-2 pt-0.5 text-lg">API</p>
|
||||
</button></li>
|
||||
<li class="py-2 px-4"><button class="flex" @click="emit('sync')">
|
||||
<img src="/icon/material-symbols--sync-alt.svg" alt="tasks" style="width: 32px; height: 32px" class="dark:invert">
|
||||
<p class="pl-2 pt-0.5 text-lg">Синхронизация</p>
|
||||
</button></li>
|
||||
</ul>
|
||||
<!--Theme button-->
|
||||
<button class="fixed bottom-3 left-3" @click="toggleDark()">
|
||||
<img v-if="!isDark" src="/icon/window/flowbite--sun-solid.svg" alt="Light theme" style="width: 38px; height: 38px">
|
||||
<img v-else src="/icon/window/ri--moon-fill.svg" alt="Dark theme" style="width: 38px; height: 38px">
|
||||
</button>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<style scoped>
|
||||
|
||||
</style>
|
||||
@@ -1,7 +1,8 @@
|
||||
<script setup>
|
||||
import {invoke} from "@tauri-apps/api";
|
||||
import {invoke} from "@tauri-apps/api/core";
|
||||
import {ref} from "vue";
|
||||
import {Icon} from "@iconify/vue";
|
||||
|
||||
let emit = defineEmits(['close']);
|
||||
|
||||
let name = "";
|
||||
let description = "";
|
||||
@@ -26,7 +27,7 @@ async function create_task(){
|
||||
priority: priority.value.toString()
|
||||
});
|
||||
|
||||
location.reload();
|
||||
emit('close');
|
||||
}
|
||||
}
|
||||
</script>
|
||||
@@ -70,11 +71,11 @@ async function create_task(){
|
||||
<label for="priority" class="block text-sm font-medium leading-6 text-gray-900 dark:text-gray-200">Приоритет</label>
|
||||
</div>
|
||||
<div class="mt-2 flex gap-3 ml-2">
|
||||
<Icon @click="priority = 0" :class="[priority === 0 ? 'opacity-100' : 'opacity-50']" class="dark:text-white text-gray-500 cursor-pointer" icon="streamline:signal-none-solid" width="26" height="26"/>
|
||||
<Icon @click="priority = 1" :class="[priority > 0 && priority < 4 ? 'opacity-100' : 'opacity-50']" class="text-orange-300 cursor-pointer" icon="streamline:signal-low-solid" width="26" height="26"/>
|
||||
<Icon @click="priority = 5" :class="[priority >= 4 && priority < 7 ? 'opacity-100' : 'opacity-50']" class="text-amber-500 cursor-pointer" icon="streamline:signal-medium-solid" width="26" height="26"/>
|
||||
<Icon @click="priority = 8" :class="[priority >= 7 && priority < 9 ? 'opacity-100' : 'opacity-50']" class="text-orange-600 cursor-pointer" icon="streamline:signal-full-solid" width="26" height="26"/>
|
||||
<Icon @click="priority = 10" :class="[priority >= 9 ? 'opacity-100' : 'opacity-50']" class="text-red-500 cursor-pointer" icon="heroicons-solid:exclamation" width="32" height="32"/>
|
||||
<img @click="priority = 0" :class="[priority === 0 ? 'opacity-100' : 'opacity-50']" class="cursor-pointer" src="/icon/tasks/streamline--signal-none-solid.svg" alt="Task priority" style="width: 26px; height: 26px">
|
||||
<img @click="priority = 1" :class="[priority > 0 && priority < 4 ? 'opacity-100' : 'opacity-50']" class="cursor-pointer" src="/icon/tasks/streamline--signal-low-solid.svg" alt="Task priority" style="width: 26px; height: 26px">
|
||||
<img @click="priority = 5" :class="[priority >= 4 && priority < 7 ? 'opacity-100' : 'opacity-50']" class="cursor-pointer" src="/icon/tasks/streamline--signal-medium-solid.svg" alt="Task priority" style="width: 26px; height: 26px">
|
||||
<img @click="priority = 8" :class="[priority >= 7 && priority < 9 ? 'opacity-100' : 'opacity-50']" class="cursor-pointer" src="/icon/tasks/streamline--signal-full-solid.svg" alt="Task priority" style="width: 26px; height: 26px">
|
||||
<img @click="priority = 10" :class="[priority >= 9 ? 'opacity-100' : 'opacity-50']" class="cursor-pointer" src="/icon/tasks/heroicons--exclamation-triangle-16-solid.svg" alt="Task priority" style="width: 32px; height: 32px">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
<script setup>
|
||||
import {invoke} from "@tauri-apps/api";
|
||||
import {Icon} from "@iconify/vue";
|
||||
import {invoke} from "@tauri-apps/api/core";
|
||||
import {ref} from "vue";
|
||||
|
||||
const props = defineProps({
|
||||
@@ -25,7 +24,7 @@ async function send_edited_task(){
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<div id="create-task-modal" tabindex="-1" aria-hidden="true" class="px-[5vw] md:px-[10vw] lg:px-[15vw] absolute overflow-y-auto overflow-x-hidden w-full top-20 lg:top-24 z-50">
|
||||
<div id="edit-task-modal" tabindex="-1" aria-hidden="true" class="px-[5vw] md:px-[10vw] lg:px-[15vw] absolute overflow-y-auto overflow-x-hidden w-full top-20 lg:top-24 z-50">
|
||||
<div class="relative p-4 max-h-full">
|
||||
<!-- Modal content -->
|
||||
<form class="relative bg-white rounded-lg shadow dark:bg-[rgb(50,50,50)]" @submit.prevent="send_edited_task">
|
||||
@@ -63,11 +62,11 @@ async function send_edited_task(){
|
||||
<label for="priority" class="block text-sm font-medium leading-6 text-gray-900 dark:text-gray-200">Приоритет</label>
|
||||
</div>
|
||||
<div class="mt-2 flex gap-3 ml-2">
|
||||
<Icon @click="priority = 0" :class="[priority === 0 ? 'opacity-100' : 'opacity-50']" class="dark:text-white text-gray-500 cursor-pointer" icon="streamline:signal-none-solid" width="26" height="26"/>
|
||||
<Icon @click="priority = 1" :class="[priority > 0 && priority < 4 ? 'opacity-100' : 'opacity-50']" class="text-orange-300 cursor-pointer" icon="streamline:signal-low-solid" width="26" height="26"/>
|
||||
<Icon @click="priority = 5" :class="[priority >= 4 && priority < 7 ? 'opacity-100' : 'opacity-50']" class="text-amber-500 cursor-pointer" icon="streamline:signal-medium-solid" width="26" height="26"/>
|
||||
<Icon @click="priority = 8" :class="[priority >= 7 && priority < 9 ? 'opacity-100' : 'opacity-50']" class="text-orange-600 cursor-pointer" icon="streamline:signal-full-solid" width="26" height="26"/>
|
||||
<Icon @click="priority = 10" :class="[priority >= 9 ? 'opacity-100' : 'opacity-50']" class="text-red-500 cursor-pointer" icon="heroicons-solid:exclamation" width="32" height="32"/>
|
||||
<img @click="priority = 0" :class="[priority === 0 ? 'opacity-100' : 'opacity-50']" class="cursor-pointer" src="/icon/tasks/streamline--signal-none-solid.svg" alt="Task priority" style="width: 26px; height: 26px">
|
||||
<img @click="priority = 1" :class="[priority > 0 && priority < 4 ? 'opacity-100' : 'opacity-50']" class="cursor-pointer" src="/icon/tasks/streamline--signal-low-solid.svg" alt="Task priority" style="width: 26px; height: 26px">
|
||||
<img @click="priority = 5" :class="[priority >= 4 && priority < 7 ? 'opacity-100' : 'opacity-50']" class="cursor-pointer" src="/icon/tasks/streamline--signal-medium-solid.svg" alt="Task priority" style="width: 26px; height: 26px">
|
||||
<img @click="priority = 8" :class="[priority >= 7 && priority < 9 ? 'opacity-100' : 'opacity-50']" class="cursor-pointer" src="/icon/tasks/streamline--signal-full-solid.svg" alt="Task priority" style="width: 26px; height: 26px">
|
||||
<img @click="priority = 10" :class="[priority >= 9 ? 'opacity-100' : 'opacity-50']" class="cursor-pointer" src="/icon/tasks/heroicons--exclamation-triangle-16-solid.svg" alt="Task priority" style="width: 32px; height: 32px">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
<script setup>
|
||||
import {invoke} from "@tauri-apps/api";
|
||||
import {Icon} from "@iconify/vue";
|
||||
import {invoke} from "@tauri-apps/api/core";
|
||||
import {ref} from "vue";
|
||||
|
||||
const props = defineProps({
|
||||
@@ -21,7 +20,7 @@ async function send_edited_task(){
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<div id="create-task-modal" tabindex="-1" aria-hidden="true" class="absolute left-[50%] translate-x-[-50%] overflow-y-auto overflow-x-hidden w-50 top-20 lg:top-32 z-50">
|
||||
<div id="priority-modal" tabindex="-1" aria-hidden="true" class="absolute left-[50%] translate-x-[-50%] overflow-y-auto overflow-x-hidden w-50 top-20 lg:top-32 z-50">
|
||||
<div class="relative p-4 max-h-full">
|
||||
<!-- Modal content -->
|
||||
<form class="relative bg-white rounded-lg shadow dark:bg-[rgb(50,50,50)]" @submit.prevent="send_edited_task">
|
||||
@@ -50,11 +49,11 @@ async function send_edited_task(){
|
||||
<label for="priority" class="block text-sm font-medium leading-6 text-gray-900 dark:text-gray-200">Приоритет</label>
|
||||
</div>
|
||||
<div class="mt-2 flex gap-3 ml-2" id="priority">
|
||||
<Icon @click="priority = 0" :class="[priority === 0 ? 'opacity-100' : 'opacity-50']" class="dark:text-white text-gray-500 cursor-pointer" icon="streamline:signal-none-solid" width="26" height="26"/>
|
||||
<Icon @click="priority = 1" :class="[priority > 0 && priority < 4 ? 'opacity-100' : 'opacity-50']" class="text-orange-300 cursor-pointer" icon="streamline:signal-low-solid" width="26" height="26"/>
|
||||
<Icon @click="priority = 5" :class="[priority >= 4 && priority < 7 ? 'opacity-100' : 'opacity-50']" class="text-amber-500 cursor-pointer" icon="streamline:signal-medium-solid" width="26" height="26"/>
|
||||
<Icon @click="priority = 8" :class="[priority >= 7 && priority < 9 ? 'opacity-100' : 'opacity-50']" class="text-orange-600 cursor-pointer" icon="streamline:signal-full-solid" width="26" height="26"/>
|
||||
<Icon @click="priority = 10" :class="[priority >= 9 ? 'opacity-100' : 'opacity-50']" class="text-red-500 cursor-pointer" icon="heroicons-solid:exclamation" width="32" height="32"/>
|
||||
<img @click="priority = 0" :class="[priority === 0 ? 'opacity-100' : 'opacity-50']" class="cursor-pointer" src="/icon/tasks/streamline--signal-none-solid.svg" alt="Task priority" style="width: 26px; height: 26px">
|
||||
<img @click="priority = 1" :class="[priority > 0 && priority < 4 ? 'opacity-100' : 'opacity-50']" class="cursor-pointer" src="/icon/tasks/streamline--signal-low-solid.svg" alt="Task priority" style="width: 26px; height: 26px">
|
||||
<img @click="priority = 5" :class="[priority >= 4 && priority < 7 ? 'opacity-100' : 'opacity-50']" class="cursor-pointer" src="/icon/tasks/streamline--signal-medium-solid.svg" alt="Task priority" style="width: 26px; height: 26px">
|
||||
<img @click="priority = 8" :class="[priority >= 7 && priority < 9 ? 'opacity-100' : 'opacity-50']" class="cursor-pointer" src="/icon/tasks/streamline--signal-full-solid.svg" alt="Task priority" style="width: 26px; height: 26px">
|
||||
<img @click="priority = 10" :class="[priority >= 9 ? 'opacity-100' : 'opacity-50']" class="cursor-pointer" src="/icon/tasks/heroicons--exclamation-triangle-16-solid.svg" alt="Task priority" style="width: 32px; height: 32px">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -0,0 +1,85 @@
|
||||
<script setup>
|
||||
import {ref} from "vue";
|
||||
import {invoke} from "@tauri-apps/api/core";
|
||||
|
||||
const props = defineProps({task_id: String})
|
||||
const emit = defineEmits(['close'])
|
||||
|
||||
let task_id = ref(props.task_id);
|
||||
|
||||
let name = "";
|
||||
let description = "";
|
||||
let error = ref(" ");
|
||||
|
||||
async function create_subtask(){
|
||||
if (name.replace(/ /g,'') === ""){
|
||||
error.value = "Название подзадачи не может быть пустым!";
|
||||
} else{
|
||||
let nowDateTime = new Date();
|
||||
let date = nowDateTime.getFullYear() + "." + ('0' + (nowDateTime.getMonth()+1)).slice(-2) + '.'
|
||||
+ ('0' + nowDateTime.getDate()).slice(-2);
|
||||
let time = ('0' + nowDateTime.getHours()).slice(-2) + ":" + ('0' + nowDateTime.getMinutes()).slice(-2);
|
||||
|
||||
console.log(props.task_id)
|
||||
await invoke('add_subtask', {
|
||||
idTask: props.task_id,
|
||||
date: date,
|
||||
time: time,
|
||||
name: name,
|
||||
description: description
|
||||
});
|
||||
|
||||
emit('close');
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<div id="create-task-modal" tabindex="-1" aria-hidden="true" class="px-[5vw] md:px-[10vw] lg:px-[15vw] absolute overflow-y-auto overflow-x-hidden w-full top-20 lg:top-24 z-50">
|
||||
<div class="relative p-4 max-h-full">
|
||||
<!-- Modal content -->
|
||||
<form class="relative bg-white rounded-lg shadow dark:bg-[rgb(50,50,50)]" @submit.prevent="create_subtask">
|
||||
<!-- Modal header -->
|
||||
<div class="flex items-center justify-between px-5 py-2 md:py-3 border-b rounded-t">
|
||||
<h3 class="text-xl font-semibold text-gray-700 dark:text-gray-100">
|
||||
Новая подзадача
|
||||
</h3>
|
||||
<button type="button" @click="$emit('close')" class="transition-colors text-gray-400 dark:text-gray-300 bg-transparent hover:bg-gray-200 hover:text-gray-900 rounded-lg text-sm w-8 h-8 ms-auto inline-flex justify-center items-center" data-modal-hide="default-modal">
|
||||
<svg class="w-3 h-3" aria-hidden="true" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 14 14">
|
||||
<path stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="m1 1 6 6m0 0 6 6M7 7l6-6M7 7l-6 6"/>
|
||||
</svg>
|
||||
</button>
|
||||
</div>
|
||||
<!-- Modal body -->
|
||||
<div class="p-4 md:p-5 space-y-4">
|
||||
<div class="space-y-6">
|
||||
<div>
|
||||
<label for="name" class="block text-sm font-medium leading-6 text-gray-900 dark:text-gray-200">Задача</label>
|
||||
<div class="mt-2">
|
||||
<input @input="error=' '" maxlength="80" v-model="name" id="name" name="name" type="text" class="px-2 block w-full rounded-md border-0 py-1.5 text-gray-900 shadow-sm ring-1 ring-inset ring-gray-300 placeholder:text-gray-400 focus:ring-inset sm:text-sm sm:leading-6" />
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div>
|
||||
<div class="flex items-center justify-between">
|
||||
<label for="description" class="block text-sm font-medium leading-6 text-gray-900 dark:text-gray-200">Описание</label>
|
||||
</div>
|
||||
<div class="mt-2">
|
||||
<textarea v-model="description" id="description" name="description" class="px-2 py-1.5 block w-full rounded-md border-0 text-gray-900 shadow-sm ring-1 ring-inset ring-gray-300 placeholder:text-gray-400 focus:ring-inset sm:text-sm sm:leading-6" />
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<!-- Modal footer -->
|
||||
<div class="flex items-center py-3 px-5 md:p-3 border-t border-gray-200 rounded-b">
|
||||
<input type="submit" class="text-white bg-green-500 hover:bg-green-600 transition-colors font-medium rounded-lg text-sm px-5 py-2.5 text-center" value="Создать">
|
||||
<p class="ml-3 text-red-500">{{error}}</p>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<style scoped>
|
||||
|
||||
</style>
|
||||
@@ -0,0 +1,71 @@
|
||||
<script setup>
|
||||
import {invoke} from "@tauri-apps/api/core";
|
||||
|
||||
const props = defineProps({
|
||||
task_id: String,
|
||||
subtask_id: String,
|
||||
subtask_name: String,
|
||||
subtask_description: String,
|
||||
})
|
||||
|
||||
let name = props.subtask_name;
|
||||
let description = props.subtask_description;
|
||||
|
||||
async function send_edited_subtask(){
|
||||
await invoke('edit_subtask', {
|
||||
idTask: props.task_id,
|
||||
idSubtask: props.subtask_id,
|
||||
name: name,
|
||||
description: description
|
||||
}).then(() => location.reload());
|
||||
}
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<div id="edit-task-modal" tabindex="-1" aria-hidden="true" class="px-[5vw] md:px-[10vw] lg:px-[15vw] absolute overflow-y-auto overflow-x-hidden w-full top-20 lg:top-24 z-50">
|
||||
<div class="relative p-4 max-h-full">
|
||||
<!-- Modal content -->
|
||||
<form class="relative bg-white rounded-lg shadow dark:bg-[rgb(50,50,50)]" @submit.prevent="send_edited_subtask">
|
||||
<!-- Modal header -->
|
||||
<div class="flex items-center justify-between px-5 py-2 md:py-3 border-b rounded-t">
|
||||
<h3 class="text-xl font-semibold text-gray-700 dark:text-gray-100">
|
||||
Изменить подзадачу
|
||||
</h3>
|
||||
<button type="button" @click="$emit('close')" class="transition-colors text-gray-400 dark:text-gray-300 bg-transparent hover:bg-gray-200 hover:text-gray-900 rounded-lg text-sm w-8 h-8 ms-auto inline-flex justify-center items-center" data-modal-hide="default-modal">
|
||||
<svg class="w-3 h-3" aria-hidden="true" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 14 14">
|
||||
<path stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="m1 1 6 6m0 0 6 6M7 7l6-6M7 7l-6 6"/>
|
||||
</svg>
|
||||
</button>
|
||||
</div>
|
||||
<!-- Modal body -->
|
||||
<div class="p-4 md:p-5 space-y-4">
|
||||
<div class="space-y-6">
|
||||
<div>
|
||||
<label for="name" class="block text-sm font-medium leading-6 text-gray-900 dark:text-gray-200">Задача</label>
|
||||
<div class="mt-2">
|
||||
<input v-model="name" id="name" name="name" type="text" required class="px-2 block w-full rounded-md border-0 py-1.5 text-gray-900 shadow-sm ring-1 ring-inset ring-gray-300 placeholder:text-gray-400 focus:ring-inset sm:text-sm sm:leading-6" />
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div>
|
||||
<div class="flex items-center justify-between">
|
||||
<label for="description" class="block text-sm font-medium leading-6 text-gray-900 dark:text-gray-200">Описание</label>
|
||||
</div>
|
||||
<div class="mt-2">
|
||||
<textarea v-model="description" id="description" name="description" class="px-2 py-1.5 block w-full rounded-md border-0 text-gray-900 shadow-sm ring-1 ring-inset ring-gray-300 placeholder:text-gray-400 focus:ring-inset sm:text-sm sm:leading-6" />
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<!-- Modal footer -->
|
||||
<div class="flex items-center py-3 px-5 md:p-3 border-t border-gray-200 rounded-b">
|
||||
<input type="submit" class="text-white bg-green-500 hover:bg-green-600 transition-colors font-medium rounded-lg text-sm px-5 py-2.5 text-center" value="Изменить">
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<style scoped>
|
||||
|
||||
</style>
|
||||
@@ -0,0 +1,73 @@
|
||||
<script setup>
|
||||
import {onBeforeMount, ref} from "vue";
|
||||
import {invoke} from "@tauri-apps/api/core";
|
||||
import CreateSubModal from "./CreateSubModal.vue";
|
||||
|
||||
const props = defineProps({
|
||||
task_id: String,
|
||||
})
|
||||
|
||||
let task_id = ref(props.task_id);
|
||||
|
||||
let subtasks = ref({});
|
||||
|
||||
let create_modal = ref(false);
|
||||
|
||||
onBeforeMount(async () => {
|
||||
await init();
|
||||
});
|
||||
|
||||
async function init(){
|
||||
create_modal.value = false;
|
||||
await invoke('get_subtasks', {
|
||||
idTask: task_id.value
|
||||
}).then((res) => {
|
||||
subtasks.value = res;
|
||||
})
|
||||
}
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<div id="subtasks-modal" tabindex="-1" aria-hidden="true" class="absolute left-[50%] translate-x-[-50%] overflow-y-auto overflow-x-hidden w-50 top-20 lg:top-32 z-50">
|
||||
<div class="relative p-4 max-h-full">
|
||||
<!-- Modal content -->
|
||||
<div class="relative bg-white rounded-lg shadow dark:bg-[rgb(50,50,50)]">
|
||||
<!-- Modal header -->
|
||||
<div class="flex items-center justify-between px-5 py-2 md:py-3 border-b rounded-t">
|
||||
<h3 class="text-xl font-semibold text-gray-700 dark:text-gray-100 mr-2">
|
||||
Подзадачи
|
||||
</h3>
|
||||
<button type="button" @click="$emit('close')" class="transition-colors text-gray-400 dark:text-gray-300 bg-transparent hover:bg-gray-200 hover:text-gray-900 rounded-lg text-sm w-8 h-8 ms-auto inline-flex justify-center items-center" data-modal-hide="default-modal">
|
||||
<svg class="w-3 h-3" aria-hidden="true" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 14 14">
|
||||
<path stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="m1 1 6 6m0 0 6 6M7 7l6-6M7 7l-6 6"/>
|
||||
</svg>
|
||||
</button>
|
||||
</div>
|
||||
<!-- Modal body -->
|
||||
<div class="p-4 md:p-5 space-y-4 text-white">
|
||||
<div class="space-y-6">
|
||||
<div v-if="Object.keys(subtasks).length === 0" class="py-10 px-24">
|
||||
<p>Пусто</p>
|
||||
</div>
|
||||
<div v-else>
|
||||
<div v-for="subtask in subtasks">
|
||||
<p>{{subtask.id}}</p>
|
||||
<p>{{subtask.name}}</p>
|
||||
<p>{{subtask.description}}</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<!-- Modal footer -->
|
||||
<div class="flex items-center py-3 px-5 md:p-3 border-t border-gray-200 rounded-b">
|
||||
<button @click="create_modal = !create_modal" class="text-white bg-green-500 hover:bg-green-600 transition-colors font-medium rounded-lg text-sm px-5 py-2.5 text-center">Создать</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<CreateSubModal v-if="create_modal" :task_id="task_id" @close="init"/>
|
||||
</template>
|
||||
|
||||
<style scoped>
|
||||
|
||||
</style>
|
||||
@@ -2,7 +2,7 @@ import { defineConfig } from "vite";
|
||||
import vue from "@vitejs/plugin-vue";
|
||||
|
||||
// https://vitejs.dev/config/
|
||||
export default defineConfig(async () => ({
|
||||
export default defineConfig(() => ({
|
||||
plugins: [vue()],
|
||||
|
||||
// Vite options tailored for Tauri development and only applied in `tauri dev` or `tauri build`
|
||||
@@ -17,5 +17,5 @@ export default defineConfig(async () => ({
|
||||
// 3. tell vite to ignore watching `src-tauri`
|
||||
ignored: ["**/src-tauri/**"],
|
||||
},
|
||||
},
|
||||
}
|
||||
}));
|
||||
|
||||