From c6e1f0452a52d6763c9851f3fce7bebe80bf4efe Mon Sep 17 00:00:00 2001 From: Alex Rock Ancelet Date: Thu, 18 Jan 2024 22:56:02 +0100 Subject: [PATCH 01/19] Start rewriting with SvelteAdmin instead of custom stuff --- .eslintrc.cjs | 2 +- .gitignore | 2 - .prettierrc | 17 +- README.md | 117 +- old/src-tauri/tauri.conf.json | 65 + package.json | 97 +- src-tauri/Cargo.lock | 2112 ++++--------- src-tauri/Cargo.toml | 28 +- src-tauri/src/main.rs | 2 +- src-tauri/tauri.conf.json | 63 +- src/app.d.ts | 22 +- src/app.html | 2 - src/lib/admin/graph.svg | 4 + src/lib/crud/Dashboard.ts | 27 + src/lib/db/bank_accounts.ts | 7 +- src/lib/utils/date.ts | 2 +- src/routes/(main)/+layout.svelte | 26 + src/routes/(main)/+layout.ts | 3 + src/routes/(main)/+page.server.ts | 1 + src/routes/(main)/+page.svelte | 17 + .../{ => (main)}/analytics/+page.svelte | 2 +- src/routes/(main)/import/+page.svelte | 15 + .../{ => (main)}/import/csv/+page.svelte | 401 ++- .../{ => (main)}/import/ofx/+page.svelte | 0 src/routes/(svelteadmin)/+layout.svelte | 1 + .../[crud]/[operation]/+page.server.ts | 19 + .../[crud]/[operation]/+page.svelte | 21 + src/routes/import/+page.svelte | 20 - src/routes/{ => old}/+error.svelte | 0 src/routes/{ => old}/+layout.svelte | 1 - src/routes/{ => old}/+layout.ts | 0 src/routes/{ => old}/+page.svelte | 0 .../{ => old}/bank-accounts/+page.svelte | 0 .../bank-accounts/edit/[id]/+layout.ts | 0 .../bank-accounts/edit/[id]/+page.svelte | 0 .../{ => old}/bank-accounts/new/+page.svelte | 0 src/routes/{ => old}/operations/+page.svelte | 0 .../{ => old}/operations/edit/[id]/+layout.ts | 0 .../operations/edit/[id]/+page.svelte | 0 .../operations/edit/triage-[id]/+layout.ts | 0 .../operations/edit/triage-[id]/+page.svelte | 0 src/routes/{ => old}/tag-rules/+page.svelte | 0 .../{ => old}/tag-rules/edit/[id]/+layout.ts | 0 .../tag-rules/edit/[id]/+page.svelte | 0 .../{ => old}/tag-rules/new/+page.svelte | 0 src/routes/{ => old}/tags/+page.svelte | 0 .../{ => old}/tags/edit/[id]/+layout.ts | 0 .../{ => old}/tags/edit/[id]/+page.svelte | 0 src/routes/{ => old}/tags/new/+page.svelte | 0 src/routes/{ => old}/triage/+page.svelte | 0 src/style/_app.scss | 47 - src/style/bootstrap.scss | 68 - svelte.config.js | 9 +- tests/test.ts | 6 + tests/webdriverio/helpers/test_helpers.ts | 8 - tests/webdriverio/package.json | 21 - tests/webdriverio/specs/home.ts | 12 - tests/webdriverio/specs/operations.ts | 15 - tests/webdriverio/specs/tag_rules.ts | 26 - tests/webdriverio/tsconfig.json | 15 - tests/webdriverio/wdio.conf.ts | 70 - tests/webdriverio/yarn.lock | 2759 ----------------- tsconfig.json | 3 +- vite.config.ts | 27 +- yarn.lock | 1659 +++++----- 65 files changed, 2053 insertions(+), 5788 deletions(-) create mode 100644 old/src-tauri/tauri.conf.json create mode 100644 src/lib/admin/graph.svg create mode 100644 src/lib/crud/Dashboard.ts create mode 100644 src/routes/(main)/+layout.svelte create mode 100644 src/routes/(main)/+layout.ts create mode 100644 src/routes/(main)/+page.server.ts create mode 100644 src/routes/(main)/+page.svelte rename src/routes/{ => (main)}/analytics/+page.svelte (100%) create mode 100644 src/routes/(main)/import/+page.svelte rename src/routes/{ => (main)}/import/csv/+page.svelte (54%) rename src/routes/{ => (main)}/import/ofx/+page.svelte (100%) create mode 100644 src/routes/(svelteadmin)/+layout.svelte create mode 100644 src/routes/(svelteadmin)/[crud]/[operation]/+page.server.ts create mode 100644 src/routes/(svelteadmin)/[crud]/[operation]/+page.svelte delete mode 100644 src/routes/import/+page.svelte rename src/routes/{ => old}/+error.svelte (100%) rename src/routes/{ => old}/+layout.svelte (97%) rename src/routes/{ => old}/+layout.ts (100%) rename src/routes/{ => old}/+page.svelte (100%) rename src/routes/{ => old}/bank-accounts/+page.svelte (100%) rename src/routes/{ => old}/bank-accounts/edit/[id]/+layout.ts (100%) rename src/routes/{ => old}/bank-accounts/edit/[id]/+page.svelte (100%) rename src/routes/{ => old}/bank-accounts/new/+page.svelte (100%) rename src/routes/{ => old}/operations/+page.svelte (100%) rename src/routes/{ => old}/operations/edit/[id]/+layout.ts (100%) rename src/routes/{ => old}/operations/edit/[id]/+page.svelte (100%) rename src/routes/{ => old}/operations/edit/triage-[id]/+layout.ts (100%) rename src/routes/{ => old}/operations/edit/triage-[id]/+page.svelte (100%) rename src/routes/{ => old}/tag-rules/+page.svelte (100%) rename src/routes/{ => old}/tag-rules/edit/[id]/+layout.ts (100%) rename src/routes/{ => old}/tag-rules/edit/[id]/+page.svelte (100%) rename src/routes/{ => old}/tag-rules/new/+page.svelte (100%) rename src/routes/{ => old}/tags/+page.svelte (100%) rename src/routes/{ => old}/tags/edit/[id]/+layout.ts (100%) rename src/routes/{ => old}/tags/edit/[id]/+page.svelte (100%) rename src/routes/{ => old}/tags/new/+page.svelte (100%) rename src/routes/{ => old}/triage/+page.svelte (100%) delete mode 100644 src/style/_app.scss delete mode 100644 src/style/bootstrap.scss create mode 100644 tests/test.ts delete mode 100644 tests/webdriverio/helpers/test_helpers.ts delete mode 100644 tests/webdriverio/package.json delete mode 100644 tests/webdriverio/specs/home.ts delete mode 100644 tests/webdriverio/specs/operations.ts delete mode 100644 tests/webdriverio/specs/tag_rules.ts delete mode 100644 tests/webdriverio/tsconfig.json delete mode 100644 tests/webdriverio/wdio.conf.ts delete mode 100644 tests/webdriverio/yarn.lock diff --git a/.eslintrc.cjs b/.eslintrc.cjs index 11b2844e..0b757582 100644 --- a/.eslintrc.cjs +++ b/.eslintrc.cjs @@ -1,3 +1,4 @@ +/** @type { import("eslint").Linter.Config } */ module.exports = { root: true, extends: [ @@ -8,7 +9,6 @@ module.exports = { ], parser: '@typescript-eslint/parser', plugins: ['@typescript-eslint'], - ignorePatterns: ['*.cjs'], parserOptions: { sourceType: 'module', ecmaVersion: 2020, diff --git a/.gitignore b/.gitignore index 3fa099f4..6635cf55 100644 --- a/.gitignore +++ b/.gitignore @@ -8,5 +8,3 @@ node_modules !.env.example vite.config.js.timestamp-* vite.config.ts.timestamp-* - -static/bootstrap* diff --git a/.prettierrc b/.prettierrc index 3a2218a2..95730232 100644 --- a/.prettierrc +++ b/.prettierrc @@ -1,9 +1,8 @@ -{ - "useTabs": true, - "singleQuote": true, - "trailingComma": "none", - "printWidth": 100, - "plugins": ["prettier-plugin-svelte"], - "pluginSearchDirs": ["."], - "overrides": [{ "files": "*.svelte", "options": { "parser": "svelte" } }] -} +{ + "useTabs": true, + "singleQuote": true, + "trailingComma": "none", + "printWidth": 100, + "plugins": ["prettier-plugin-svelte"], + "overrides": [{ "files": "*.svelte", "options": { "parser": "svelte" } }] +} diff --git a/README.md b/README.md index 6fb1bfa8..5ce67661 100644 --- a/README.md +++ b/README.md @@ -1,111 +1,38 @@ -# 🍎 Compotes 🍏 +# create-svelte -A small application to visualise bank operations in graphs and plots. +Everything you need to build a Svelte project, powered by [`create-svelte`](https://github.com/sveltejs/kit/tree/main/packages/create-svelte). -# 🧮 +## Creating a project -> This is the second version of the main app that was previously built with PHP and Symfony. -> -> The new app is built in [Rust](https://www.rust-lang.org/) with [Tauri](https://tauri.studio/) for the backend, and uses [Typescript](https://www.typescriptlang.org/) and [Svelte](https://svelte.dev/) for the frontend part. +If you're seeing this, you've probably already done this step. Congrats! -![App screenshot](docs/capture1.png) - -## Install - -The project is not even in beta for now. - -You can still find latest nightly builds on the [Actions](https://github.com/Orbitale/Compotes/actions) page, if you check out the latest successful action marked by a "☑️" mark (if there is one at least). - -The latest builds can also be found on [nightly.link](https://nightly.link/Orbitale/Compotes/workflows/main.yaml/rewrite) - -## Project setup - -If you want to use the in-development project, you can compile it by doing what is explained in the following steps. - -### Requirements - -- [Rust](https://www.rust-lang.org/tools/install) -- [Node.js](https://nodejs.org/en/download/) -- [Yarn](https://yarnpkg.com/getting-started/install) (preferred by the Tauri team, so expect better compatibility) -- For Linux users: - - Follow [this guide](https://tauri.studio/docs/getting-started/setting-up-linux#1-system-dependencies) to install the **system dependencies** that are mandatory. -- For Windows users: - - [Webview2](https://developer.microsoft.com/en-us/microsoft-edge/webview2/#download-section) -- For MacOS users: - - XCode - - The GNU C Compiler, installable via `brew install gcc` - -### Install +```bash +# create a new project in the current directory +npm create svelte@latest +# create a new project in my-app +npm create svelte@latest my-app ``` -yarn install -``` - -> You do not need to install Rust dependencies, since running `cargo` commands like `cargo run` will automatically download and compile dependencies. -### Run the app in dev mode +## Developing -``` -yarn tauri dev -``` +Once you've created a project and installed dependencies with `npm install` (or `pnpm install` or `yarn`), start a development server: -### Compile for production +```bash +npm run dev +# or start the server and open the app in a new browser tab +npm run dev -- --open ``` -yarn tauri build -``` - -> This command builds the app in the `src-tauri/target/release/` directory. -## Import a database from v1 +## Building -- Run `make dump` in the v1 app -- Get the `var/dump_***.sql` file that was just generated -- Install `mysql2sqlite` via this script: - ```bash - wget https://raw.githubusercontent.com/dumblob/mysql2sqlite/master/mysql2sqlite - ``` -- Run it on the sql file you got and create your database: - ```bash - ./mysql2sqlite dump_***.sql | sqlite3 data.db3 - ``` -- Pray it works 🙏 +To create a production version of your app: -### Roadmap - -Since the entire app is being rewritten, lots of stuff have to be re-implemented. +```bash +npm run build +``` -> The "☑️" mark means the feature is implemented, while the "⬜️" mark means the feature is waiting for implementation. +You can preview the production build with `npm run preview`. -- Core features: - - ☑️ Create the Tauri app - - ☑️ Create the Svelte frontend with it - - ☑️ List operations - - ☑️ Allow sorting operations by some fields - - ☑️ Allow filtering operations - - ☑️ Allow saving current filter to be reused in graphs - - ☑️ Allow filtering operations that have no tags - - ☑️ Allow ignoring an operation in graphs calculations - - ☑️ Tags CRUD - - ☑️ Tag rules CRUD - - ☑️ Bank accounts CRUD - - ☑️ Edit bank account details - - ☑️ Import operations from CSV file - - ☑️ Add tags to operations directly from the list - - ☑️ Sync operations for triage - - ☑️ Sync operations tags with tag rules - - ⬜️ Add the graphs that are at the core of this app 😅 - - ☑️ Allow using saved filters for graphs - - ⬜️ Allow creating and saving custom graphs -- Additional features that might be cool: - - ⬜️ Allow customizing graphs - - ⬜️ Config panel - - ⬜️ Allow customizing database, for multiple database usage - - ⬜️ Allow exporting/importing whole database - - ⬜️ User account system for multi-user usage - - ⬜️ Encrypt entire database with a password/passphrase for safety - - ⬜️ Store filters to the database instead of `localStorage` -- Some things are quite buggy and the app needs improvements too: - - ☑️ Check why we have to use `location.reload()` because svelte stores don't update the paginated tables => I actually used SvelteKit's `goto()` from `$app/navigation` and it works great 👌 - - ⬜️ Use a `select2` or similar for tags selection - - ⬜️ Add the ability to create a Tag Rule based on an Operation in the operations list +> To deploy your app, you may need to install an [adapter](https://kit.svelte.dev/docs/adapters) for your target environment. diff --git a/old/src-tauri/tauri.conf.json b/old/src-tauri/tauri.conf.json new file mode 100644 index 00000000..d653e628 --- /dev/null +++ b/old/src-tauri/tauri.conf.json @@ -0,0 +1,65 @@ +{ + "build": { + "beforeBuildCommand": "yarn run build", + "beforeDevCommand": "yarn run dev", + "devPath": "http://127.0.0.1:5173", + "distDir": "./target/frontend-build" + }, + "package": { + "productName": "compotes", + "version": "0.1.0" + }, + "tauri": { + "allowlist": { + "all": true + }, + "bundle": { + "active": true, + "category": "DeveloperTool", + "copyright": "", + "deb": { + "depends": [] + }, + "externalBin": [], + "icon": [ + "icons/32x32.png", + "icons/128x128.png", + "icons/128x128@2x.png", + "icons/icon.icns", + "icons/icon.ico" + ], + "identifier": "io.orbitale.compotes", + "longDescription": "", + "macOS": { + "entitlements": null, + "exceptionDomain": "", + "frameworks": [], + "minimumSystemVersion": "", + "signingIdentity": null + }, + "resources": [], + "shortDescription": "", + "targets": ["msi", "deb"], + "windows": { + "certificateThumbprint": null, + "digestAlgorithm": "sha256", + "timestampUrl": "" + } + }, + "security": { + "csp": "default-src 'self'; style-src 'self' 'unsafe-inline'; img-src 'self' data:; object-src 'none'; require-trusted-types-for 'script';" + }, + "updater": { + "active": false + }, + "windows": [ + { + "fullscreen": false, + "height": 800, + "resizable": true, + "title": "Compotes", + "width": 1024 + } + ] + } +} diff --git a/package.json b/package.json index c0c33f90..b2a0ab39 100644 --- a/package.json +++ b/package.json @@ -4,76 +4,43 @@ "private": true, "license": "LGPL-3.0-or-later", "scripts": { - "app": "concurrently --names \"front,back\" --raw \"vite dev\" \"tauri dev\"", "dev": "vite dev", "build": "vite build", - "package": "vite package", "preview": "vite preview", - "check": "svelte-check --tsconfig ./tsconfig.json", - "check:watch": "svelte-check --tsconfig ./tsconfig.json --watch", - "lint": "prettier --ignore-path .gitignore --check --plugin-search-dir=. src && eslint --ignore-path .gitignore src", - "format": "prettier --ignore-path .gitignore --write --plugin-search-dir=. src", - "test": "yarn --cwd tests/webdriverio run test", - "tauri": "tauri", - "postinstall": "yarn --cwd tests/webdriverio/" + "check": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json", + "check:watch": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json --watch", + "lint": "prettier --check . && eslint .", + "format": "prettier --write .", + "tauri": "tauri" }, "devDependencies": { - "@popperjs/core": "^2.11.7", - "@sveltejs/adapter-static": "2.0.3", - "@sveltejs/kit": "^1.15.9", - "@tauri-apps/api": "^1.2.0", - "@tauri-apps/cli": "^1.2.3", - "@typescript-eslint/eslint-plugin": "^6.3.0", - "@typescript-eslint/parser": "^6.3.0", - "@zerodevx/svelte-toast": "^0.9.3", - "bootstrap": "^5.2.3", - "chart.js": "^4.3.0", - "concurrently": "^8.0.1", - "date-fns": "^2.30.0", - "date-picker-svelte": "^2.4.2", - "eslint": "^8.39.0", - "eslint-config-prettier": "^9.0.0", - "eslint-plugin-svelte3": "^4.0.0", - "luxon": "^3.3.0", - "prettier": "^3.0.1", - "prettier-plugin-svelte": "^3.0.3", - "sass": "^1.62.1", - "svelte": "^4.1.2", + "@orbitale/svelte-admin": "^0.11.1", + "@sveltejs/adapter-static": "^3.0.1", + "@sveltejs/kit": "^2.3.5", + "@sveltejs/vite-plugin-svelte": "^3.0.0", + "@tauri-apps/api": "^1.5.3", + "@tauri-apps/cli": "^1.5.9", + "@types/eslint": "8.56.0", + "@typescript-eslint/eslint-plugin": "^6.0.0", + "@typescript-eslint/parser": "^6.0.0", + "@zerodevx/svelte-toast": "^0.9.5", + "carbon-components-svelte": "^0.82.8", + "carbon-icons-svelte": "^12.4.2", + "chart.js": "^4.4.1", + "eslint": "^8.56.0", + "eslint-config-prettier": "^9.1.0", + "eslint-plugin-svelte": "^2.35.1", + "luxon": "^3.4.4", + "prettier": "^3.2.4", + "prettier-plugin-svelte": "^3.1.2", + "sass": "^1.70.0", + "svelte": "^4.2.7", "svelte-chartjs": "^3.1.2", - "svelte-check": "^3.2.0", - "svelte-dragdroplist": "^1.1.1", - "svelte-preprocess": "^5.0.3", - "ts-results-es": "^4.0.0", - "tslib": "^2.5.0", - "typescript": "^5.0.4", - "vite": "^4.4.9" + "svelte-check": "^3.6.0", + "ts-results-es": "^4.1.0-alpha.1", + "tslib": "^2.4.1", + "typescript": "^5.0.0", + "vite": "^5.0.3" }, - "flat": true, - "type": "module", - "resolutions": { - "tslib": "2.6.1", - "magic-string": "0.30.2", - "@jridgewell/sourcemap-codec": "1.4.15", - "glob-parent": "6.0.2", - "eslint-scope": "7.2.2", - "estraverse": "5.3.0", - "supports-color": "8.1.1", - "rimraf": "3.0.2", - "ansi-styles": "6.2.1", - "string-width": "5.1.2", - "strip-ansi": "7.1.0", - "wrap-ansi": "8.1.0", - "ansi-regex": "6.0.1", - "emoji-regex": "8.0.0", - "minimatch": "9.0.3", - "glob": "10.3.3", - "brace-expansion": "2.0.1", - "lru-cache": "10.0.0" - }, - "dependencies": { - "emoji-regex": "^8.0.0", - "rimraf": "^3.0.2", - "string-width": "^5.1.2", - "supports-color": "^8.1.1" - } + "type": "module" } diff --git a/src-tauri/Cargo.lock b/src-tauri/Cargo.lock index d57c82a6..8236e75e 100644 --- a/src-tauri/Cargo.lock +++ b/src-tauri/Cargo.lock @@ -4,9 +4,9 @@ version = 3 [[package]] name = "addr2line" -version = "0.20.0" +version = "0.21.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f4fa78e18c64fce05e902adecd7a5eed15a5e0a3439f7b0e169f0252214865e3" +checksum = "8a30b2e23b9e17a9f90641c7ab1549cd9b44f296d3ccbf309d2863cfe398a0cb" dependencies = [ "gimli", ] @@ -19,20 +19,21 @@ checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" [[package]] name = "ahash" -version = "0.8.3" +version = "0.8.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c99f64d1e06488f620f932677e24bc6e2897582980441ae90a671415bd7ec2f" +checksum = "77c3a9648d43b9cd48db467b3f87fdd6e146bcc88ab0180006cef2179fe11d01" dependencies = [ "cfg-if", "once_cell", "version_check", + "zerocopy", ] [[package]] name = "aho-corasick" -version = "1.0.2" +version = "1.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43f6cb1bf222025340178f382c426f13757b2960e89779dfcb319c32542a5a41" +checksum = "b2969dcb958b36655471fc61f7e416fa76033bdd4bfed0678d8fee1e2d07a1f0" dependencies = [ "memchr", ] @@ -75,151 +76,9 @@ dependencies = [ [[package]] name = "anyhow" -version = "1.0.72" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b13c32d80ecc7ab747b80c3784bce54ee8a7a0cc4fbda9bf4cda2cf6fe90854" - -[[package]] -name = "app" -version = "0.1.0" -dependencies = [ - "anyhow", - "chrono", - "dirs", - "regex", - "rusqlite", - "rusqlite_migration", - "serde", - "serde_json", - "serde_rusqlite", - "sha2", - "slugify", - "tauri", - "tauri-build", - "tauri-codegen", -] - -[[package]] -name = "async-broadcast" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c48ccdbf6ca6b121e0f586cbc0e73ae440e56c67c30fa0873b4e110d9c26d2b" -dependencies = [ - "event-listener", - "futures-core", -] - -[[package]] -name = "async-channel" -version = "1.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81953c529336010edd6d8e358f886d9581267795c61b19475b71314bffa46d35" -dependencies = [ - "concurrent-queue", - "event-listener", - "futures-core", -] - -[[package]] -name = "async-executor" -version = "1.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6fa3dc5f2a8564f07759c008b9109dc0d39de92a88d5588b8a5036d286383afb" -dependencies = [ - "async-lock", - "async-task", - "concurrent-queue", - "fastrand 1.9.0", - "futures-lite", - "slab", -] - -[[package]] -name = "async-fs" -version = "1.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "279cf904654eeebfa37ac9bb1598880884924aab82e290aa65c9e77a0e142e06" -dependencies = [ - "async-lock", - "autocfg", - "blocking", - "futures-lite", -] - -[[package]] -name = "async-io" -version = "1.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fc5b45d93ef0529756f812ca52e44c221b35341892d3dcc34132ac02f3dd2af" -dependencies = [ - "async-lock", - "autocfg", - "cfg-if", - "concurrent-queue", - "futures-lite", - "log", - "parking", - "polling", - "rustix 0.37.23", - "slab", - "socket2", - "waker-fn", -] - -[[package]] -name = "async-lock" -version = "2.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa24f727524730b077666307f2734b4a1a1c57acb79193127dcc8914d5242dd7" -dependencies = [ - "event-listener", -] - -[[package]] -name = "async-process" -version = "1.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a9d28b1d97e08915212e2e45310d47854eafa69600756fc735fb788f75199c9" -dependencies = [ - "async-io", - "async-lock", - "autocfg", - "blocking", - "cfg-if", - "event-listener", - "futures-lite", - "rustix 0.37.23", - "signal-hook", - "windows-sys 0.48.0", -] - -[[package]] -name = "async-recursion" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e97ce7de6cf12de5d7226c73f5ba9811622f4db3a5b91b55c53e987e5f91cba" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.28", -] - -[[package]] -name = "async-task" -version = "4.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ecc7ab41815b3c653ccd2978ec3255c81349336702dfdf62ee6f7069b12a3aae" - -[[package]] -name = "async-trait" -version = "0.1.72" +version = "1.0.79" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc6dde6e4ed435a4c1ee4e73592f5ba9da2151af10076cc04858746af9352d09" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.28", -] +checksum = "080e9890a082662b09c1ad45f567faeeb47f22b5fb23895fbe1e651e718e25ca" [[package]] name = "atk" @@ -242,15 +101,9 @@ dependencies = [ "glib-sys", "gobject-sys", "libc", - "system-deps 6.1.1", + "system-deps 6.2.0", ] -[[package]] -name = "atomic-waker" -version = "1.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1181e1e0d1fce796a03db1ae795d67167da795f9cf4a39c37589e85ef57f26d3" - [[package]] name = "autocfg" version = "1.1.0" @@ -259,9 +112,9 @@ checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" [[package]] name = "backtrace" -version = "0.3.68" +version = "0.3.69" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4319208da049c43661739c5fade2ba182f09d1dc2299b32298d3a31692b17e12" +checksum = "2089b7e3f35b9dd2d0ed921ead4f6d318c27680d4a5bd167b3ee120edb105837" dependencies = [ "addr2line", "cc", @@ -280,9 +133,9 @@ checksum = "9e1b586273c5702936fe7b7d6896644d8be71e6314cfe09d3167c95f712589e8" [[package]] name = "base64" -version = "0.21.2" +version = "0.21.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "604178f6c5c21f02dc555784810edfb88d34ac2c73b2eae109655649ee73ce3d" +checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" [[package]] name = "bitflags" @@ -292,9 +145,9 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] name = "bitflags" -version = "2.3.3" +version = "2.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "630be753d4e58660abd17930c71b647fe46c27ea6b63cc59e1e3851406972e42" +checksum = "ed570934406eb16438a4e976b1b4500774099c13b8cb96eec99f620f05090ddf" [[package]] name = "block" @@ -311,26 +164,11 @@ dependencies = [ "generic-array", ] -[[package]] -name = "blocking" -version = "1.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77231a1c8f801696fc0123ec6150ce92cffb8e164a02afb9c8ddee0e9b65ad65" -dependencies = [ - "async-channel", - "async-lock", - "async-task", - "atomic-waker", - "fastrand 1.9.0", - "futures-lite", - "log", -] - [[package]] name = "brotli" -version = "3.3.4" +version = "3.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1a0b1dbcc8ae29329621f8d4f0d835787c1c38bb1401979b49d13b0b305ff68" +checksum = "516074a47ef4bce09577a3b379392300159ce5b1ba2e501ff1c819950066100f" dependencies = [ "alloc-no-stdlib", "alloc-stdlib", @@ -339,9 +177,9 @@ dependencies = [ [[package]] name = "brotli-decompressor" -version = "2.3.4" +version = "2.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4b6561fd3f895a11e8f72af2cb7d22e08366bebc2b6b57f7744c4bda27034744" +checksum = "4e2e4afe60d7dd600fdd3de8d0f08c2b7ec039712e3b6137ff98b7004e82de4f" dependencies = [ "alloc-no-stdlib", "alloc-stdlib", @@ -349,9 +187,9 @@ dependencies = [ [[package]] name = "bstr" -version = "1.6.0" +version = "1.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6798148dccfbff0fae41c7574d2fa8f1ef3492fba0face179de5d8d447d67b05" +checksum = "c48f0051a4b4c5e0b6d365cd04af53aeaa209e3cc15ec2cdb69e73cc87fbd0dc" dependencies = [ "memchr", "serde", @@ -359,30 +197,27 @@ dependencies = [ [[package]] name = "bumpalo" -version = "3.13.0" +version = "3.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a3e2c3daef883ecc1b5d58c15adae93470a91d425f3532ba1695849656af3fc1" +checksum = "7f30e7476521f6f8af1a1c4c0b8cc94f0bee37d91763d0ca2665f299b6cd8aec" [[package]] name = "bytemuck" -version = "1.13.1" +version = "1.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17febce684fd15d89027105661fec94afb475cb995fbc59d2865198446ba2eea" +checksum = "374d28ec25809ee0e23827c2ab573d729e293f281dfe393500e7ad618baa61c6" [[package]] name = "byteorder" -version = "1.4.3" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610" +checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" [[package]] name = "bytes" -version = "1.4.0" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89b2fd2a0dcf38d7971e2194b6b6eebab45ae01067456a7fd93d5547a61b70be" -dependencies = [ - "serde", -] +checksum = "a2bd12c1caf447e69cd4528f47f94d203fd2582878ecb9e9465484c4148a8223" [[package]] name = "cairo-rs" @@ -405,7 +240,7 @@ checksum = "3c55d429bef56ac9172d25fecb85dc8068307d17acd74b377866b7a1ef25d3c8" dependencies = [ "glib-sys", "libc", - "system-deps 6.1.1", + "system-deps 6.2.0", ] [[package]] @@ -415,14 +250,14 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "599aa35200ffff8f04c1925aa1acc92fa2e08874379ef42e210a80e527e60838" dependencies = [ "serde", - "toml 0.7.6", + "toml 0.7.8", ] [[package]] name = "cc" -version = "1.0.81" +version = "1.0.83" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c6b2562119bf28c3439f7f02db99faf0aa1a8cdfe5772a2ee155d32227239f0" +checksum = "f1174fb0b6ec23863f8b971027804a42614e347eafb0a95bf0b12cdae21fc4d0" dependencies = [ "libc", ] @@ -455,9 +290,9 @@ dependencies = [ [[package]] name = "cfg-expr" -version = "0.15.4" +version = "0.15.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b40ccee03b5175c18cde8f37e7d2a33bcef6f8ec8f7cc0d81090d1bb380949c9" +checksum = "6100bc57b6209840798d95cb2775684849d332f7bd788db2a8c8caf7ef82a41a" dependencies = [ "smallvec", "target-lexicon", @@ -471,18 +306,17 @@ checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" [[package]] name = "chrono" -version = "0.4.26" +version = "0.4.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec837a71355b28f6556dbd569b37b3f363091c0bd4b2e735674521b4c5fd9bc5" +checksum = "7f2c685bad3eb3d45a01354cedb7d5faa66194d1d58ba6e267a8de788f79db38" dependencies = [ "android-tzdata", "iana-time-zone", "js-sys", "num-traits", "serde", - "time 0.1.45", "wasm-bindgen", - "winapi", + "windows-targets 0.48.5", ] [[package]] @@ -503,15 +337,14 @@ dependencies = [ [[package]] name = "cocoa-foundation" -version = "0.1.1" +version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "931d3837c286f56e3c58423ce4eba12d08db2374461a785c86f672b08b5650d6" +checksum = "8c6234cbb2e4c785b456c0644748b1ac416dd045799740356f8363dfe00c93f7" dependencies = [ "bitflags 1.3.2", "block", "core-foundation", "core-graphics-types", - "foreign-types", "libc", "objc", ] @@ -533,12 +366,22 @@ dependencies = [ ] [[package]] -name = "concurrent-queue" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62ec6771ecfa0762d24683ee5a32ad78487a3d3afdc0fb8cae19d2c5deb50b7c" +name = "compotes" +version = "0.1.0" dependencies = [ - "crossbeam-utils", + "anyhow", + "chrono", + "dirs", + "regex", + "rusqlite", + "rusqlite_migration", + "serde", + "serde_json", + "serde_rusqlite", + "sha2", + "slugify", + "tauri", + "tauri-build", ] [[package]] @@ -549,9 +392,9 @@ checksum = "6245d59a3e82a7fc217c5828a6692dbc6dfb63a0c8c90495621f7b9d79704a0e" [[package]] name = "core-foundation" -version = "0.9.3" +version = "0.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "194a7a9e6de53fa55116934067c844d9d749312f75c6f6d0980e8c252f8c2146" +checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f" dependencies = [ "core-foundation-sys", "libc", @@ -559,9 +402,9 @@ dependencies = [ [[package]] name = "core-foundation-sys" -version = "0.8.4" +version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e496a50fda8aacccc86d7529e2c1e0892dbd0f898a6b5645b5561b89c3210efa" +checksum = "06ea2b9bc92be3c2baa9334a323ebca2d6f074ff852cd1d7b11064035cd3868f" [[package]] name = "core-graphics" @@ -578,9 +421,9 @@ dependencies = [ [[package]] name = "core-graphics-types" -version = "0.1.2" +version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2bb142d41022986c1d8ff29103a1411c8a3dfad3552f87a4f8dc50d61d4f4e33" +checksum = "45390e6114f68f718cc7a830514a96f903cccd70d02a8f6d9f643ac4ba45afaf" dependencies = [ "bitflags 1.3.2", "core-foundation", @@ -589,9 +432,9 @@ dependencies = [ [[package]] name = "cpufeatures" -version = "0.2.9" +version = "0.2.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a17b76ff3a4162b0b27f354a0c87015ddad39d35f9c0c36607a3bdd175dde1f1" +checksum = "53fe5e26ff1b7aef8bca9c6080520cfb8d9333c7568e1829cef191a9723e5504" dependencies = [ "libc", ] @@ -607,23 +450,38 @@ dependencies = [ [[package]] name = "crossbeam-channel" -version = "0.5.8" +version = "0.5.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a33c2bf77f2df06183c3aa30d1e96c0695a313d4f9c453cc3762a6db39f99200" +checksum = "176dc175b78f56c0f321911d9c8eb2b77a78a4860b9c19db83835fea1a46649b" dependencies = [ - "cfg-if", "crossbeam-utils", ] [[package]] -name = "crossbeam-utils" -version = "0.8.16" +name = "crossbeam-deque" +version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a22b2d63d4d1dc0b7f1b6b2747dd0088008a9be28b6ddf0b1e7d335e3037294" +checksum = "613f8cc01fe9cf1a3eb3d7f488fd2fa8388403e97039e2f73692932e291a770d" dependencies = [ - "cfg-if", + "crossbeam-epoch", + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-epoch" +version = "0.9.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e" +dependencies = [ + "crossbeam-utils", ] +[[package]] +name = "crossbeam-utils" +version = "0.8.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "248e3bacc7dc6baa3b21e405ee045c3047101a49145e7e9eca583ab4c2ca5345" + [[package]] name = "crypto-common" version = "0.1.6" @@ -658,38 +516,38 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "13b588ba4ac1a99f7f2964d24b3d896ddc6bf847ee3855dbd4366f058cfcd331" dependencies = [ "quote", - "syn 2.0.28", + "syn 2.0.48", ] [[package]] name = "csv" -version = "1.2.2" +version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "626ae34994d3d8d668f4269922248239db4ae42d538b14c398b74a52208e8086" +checksum = "ac574ff4d437a7b5ad237ef331c17ccca63c46479e5b5453eb8e10bb99a759fe" dependencies = [ "csv-core", - "itoa 1.0.9", + "itoa 1.0.10", "ryu", "serde", ] [[package]] name = "csv-core" -version = "0.1.10" +version = "0.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b2466559f260f48ad25fe6317b3c8dac77b5bdb5763ac7d9d6103530663bc90" +checksum = "5efa2b3d7902f4b634a20cae3c9c4e6209dc4779feb6863329607560143efa70" dependencies = [ "memchr", ] [[package]] name = "ctor" -version = "0.1.26" +version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d2301688392eb071b0bf1a37be05c469d3cc4dbbd95df672fe28ab021e6a096" +checksum = "30d2b3721e861707777e3195b0158f950ae6dc4a27e4d02ff9f67e3eb3de199e" dependencies = [ "quote", - "syn 1.0.109", + "syn 2.0.48", ] [[package]] @@ -713,7 +571,7 @@ dependencies = [ "proc-macro2", "quote", "strsim", - "syn 2.0.28", + "syn 2.0.48", ] [[package]] @@ -724,29 +582,19 @@ checksum = "836a9bbc7ad63342d6d6e7b815ccab164bc77a2d95d84bc3117a8c0d5c98e2d5" dependencies = [ "darling_core", "quote", - "syn 2.0.28", + "syn 2.0.48", ] [[package]] name = "deranged" -version = "0.3.7" +version = "0.3.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7684a49fb1af197853ef7b2ee694bc1f5b4179556f1e5710e1760c5db6f5e929" +checksum = "b42b6fa04a440b495c8b04d0e71b707c585f83cb9cb28cf8cd0d976c315e31b4" dependencies = [ + "powerfmt", "serde", ] -[[package]] -name = "derivative" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fcc3dd5e9e9c0b295d6e1e4d811fb6f157d5ffd784b8d202fc62eac8035a770b" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] - [[package]] name = "derive_more" version = "0.99.17" @@ -841,15 +689,16 @@ checksum = "56ce8c6da7551ec6c462cbaf3bfbc75131ebbfa1c944aeaa9dab51ca1c5f0c3b" [[package]] name = "embed-resource" -version = "2.2.0" +version = "2.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f7f1e82a60222fc67bfd50d752a9c89da5cce4c39ed39decc84a443b07bbd69a" +checksum = "3bde55e389bea6a966bd467ad1ad7da0ae14546a5bc794d16d1e55e7fca44881" dependencies = [ "cc", + "memchr", "rustc_version", - "toml 0.7.6", + "toml 0.8.8", "vswhom", - "winreg 0.11.0", + "winreg", ] [[package]] @@ -860,34 +709,13 @@ checksum = "4ef6b89e5b37196644d8796de5268852ff179b44e96276cf4290264843743bb7" [[package]] name = "encoding_rs" -version = "0.8.32" +version = "0.8.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "071a31f4ee85403370b58aca746f01041ede6f0da2730960ad001edc2b71b394" +checksum = "7268b386296a025e474d5140678f75d6de9493ae55a5d709eeb9dd08149945e1" dependencies = [ "cfg-if", ] -[[package]] -name = "enumflags2" -version = "0.7.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c041f5090df68b32bcd905365fd51769c8b9d553fe87fde0b683534f10c01bd2" -dependencies = [ - "enumflags2_derive", - "serde", -] - -[[package]] -name = "enumflags2_derive" -version = "0.7.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e9a1f9f7d83e59740248a6e14ecf93929ade55027844dfcea78beafccc15745" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.28", -] - [[package]] name = "equivalent" version = "1.0.1" @@ -896,31 +724,14 @@ checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" [[package]] name = "errno" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6b30f669a7961ef1631673d2766cc92f52d64f7ef354d4fe0ddfd30ed52f0f4f" -dependencies = [ - "errno-dragonfly", - "libc", - "windows-sys 0.48.0", -] - -[[package]] -name = "errno-dragonfly" -version = "0.1.2" +version = "0.3.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa68f1b12764fab894d2755d2518754e71b4fd80ecfb822714a1206c2aab39bf" +checksum = "a258e46cdc063eb8519c00b9fc845fc47bcfca4130e2f08e88665ceda8474245" dependencies = [ - "cc", "libc", + "windows-sys 0.52.0", ] -[[package]] -name = "event-listener" -version = "2.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0206175f82b8d6bf6652ff7d71a1e27fd2e4efde587fd368662814d6ec1d9ce0" - [[package]] name = "fallible-iterator" version = "0.2.0" @@ -935,24 +746,15 @@ checksum = "7360491ce676a36bf9bb3c56c1aa791658183a54d2744120f27285738d90465a" [[package]] name = "fastrand" -version = "1.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e51093e27b0797c359783294ca4f0a911c270184cb10f85783b118614a1501be" -dependencies = [ - "instant", -] - -[[package]] -name = "fastrand" -version = "2.0.0" +version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6999dc1837253364c2ebb0704ba97994bd874e8f195d665c50b7548f6ea92764" +checksum = "25cbce373ec4653f1a01a31e8a5e5ec0c622dc27ff9c4e6606eefef5cbbed4a5" [[package]] name = "fdeflate" -version = "0.3.0" +version = "0.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d329bdeac514ee06249dabc27877490f17f5d371ec693360768b838e19f3ae10" +checksum = "4f9bfee30e4dedf0ab8b422f03af778d9612b63f502710fc500a334ebe2de645" dependencies = [ "simd-adler32", ] @@ -963,27 +765,27 @@ version = "0.3.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "38e2275cc4e4fc009b0669731a1e5ab7ebf11f469eaede2bab9309a5b4d6057f" dependencies = [ - "memoffset 0.9.0", + "memoffset", "rustc_version", ] [[package]] name = "filetime" -version = "0.2.22" +version = "0.2.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d4029edd3e734da6fe05b6cd7bd2960760a616bd2ddd0d59a0124746d6272af0" +checksum = "1ee447700ac8aa0b2f2bd7bc4462ad686ba06baa6727ac149a2d6277f0d240fd" dependencies = [ "cfg-if", "libc", - "redox_syscall 0.3.5", - "windows-sys 0.48.0", + "redox_syscall", + "windows-sys 0.52.0", ] [[package]] name = "flate2" -version = "1.0.26" +version = "1.0.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b9429470923de8e8cbd4d2dc513535400b4b3fef0319fb5c4e1f520a7bef743" +checksum = "46303f565772937ffe1d394a4fac6f411c6013172fadde9dcdb1e147a086940e" dependencies = [ "crc32fast", "miniz_oxide", @@ -1012,9 +814,9 @@ checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" [[package]] name = "form_urlencoded" -version = "1.2.0" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a62bc1cf6f830c2ec14a513a9fb124d0a213a629668a4186f329db21fe045652" +checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" dependencies = [ "percent-encoding", ] @@ -1031,24 +833,24 @@ dependencies = [ [[package]] name = "futures-channel" -version = "0.3.28" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "955518d47e09b25bbebc7a18df10b81f0c766eaf4c4f1cccef2fca5f2a4fb5f2" +checksum = "eac8f7d7865dcb88bd4373ab671c8cf4508703796caa2b1985a9ca867b3fcb78" dependencies = [ "futures-core", ] [[package]] name = "futures-core" -version = "0.3.28" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4bca583b7e26f571124fe5b7561d49cb2868d79116cfa0eefce955557c6fee8c" +checksum = "dfc6580bb841c5a68e9ef15c77ccc837b40a7504914d52e47b8b0e9bbda25a1d" [[package]] name = "futures-executor" -version = "0.3.28" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ccecee823288125bd88b4d7f565c9e58e41858e47ab72e8ea2d64e93624386e0" +checksum = "a576fc72ae164fca6b9db127eaa9a9dda0d61316034f33a0a0d4eda41f02b01d" dependencies = [ "futures-core", "futures-task", @@ -1057,60 +859,36 @@ dependencies = [ [[package]] name = "futures-io" -version = "0.3.28" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fff74096e71ed47f8e023204cfd0aa1289cd54ae5430a9523be060cdb849964" - -[[package]] -name = "futures-lite" -version = "1.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49a9d51ce47660b1e808d3c990b4709f2f415d928835a17dfd16991515c46bce" -dependencies = [ - "fastrand 1.9.0", - "futures-core", - "futures-io", - "memchr", - "parking", - "pin-project-lite", - "waker-fn", -] +checksum = "a44623e20b9681a318efdd71c299b6b222ed6f231972bfe2f224ebad6311f0c1" [[package]] name = "futures-macro" -version = "0.3.28" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89ca545a94061b6365f2c7355b4b32bd20df3ff95f02da9329b34ccc3bd6ee72" +checksum = "87750cf4b7a4c0625b1529e4c543c2182106e4dedc60a2a6455e00d212c489ac" dependencies = [ "proc-macro2", "quote", - "syn 2.0.28", + "syn 2.0.48", ] -[[package]] -name = "futures-sink" -version = "0.3.28" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f43be4fe21a13b9781a69afa4985b0f6ee0e1afab2c6f454a8cf30e2b2237b6e" - [[package]] name = "futures-task" -version = "0.3.28" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76d3d132be6c0e6aa1534069c705a74a5997a356c0dc2f86a47765e5617c5b65" +checksum = "38d84fa142264698cdce1a9f9172cf383a0c82de1bddcf3092901442c4097004" [[package]] name = "futures-util" -version = "0.3.28" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26b01e40b772d54cf6c6d721c1d1abd0647a0106a12ecaa1c186273392a69533" +checksum = "3d6401deb83407ab3da39eba7e33987a73c3df0c82b4bb5813ee871c19c41d48" dependencies = [ "futures-core", - "futures-io", "futures-macro", - "futures-sink", "futures-task", - "memchr", "pin-project-lite", "pin-utils", "slab", @@ -1164,7 +942,7 @@ dependencies = [ "glib-sys", "gobject-sys", "libc", - "system-deps 6.1.1", + "system-deps 6.2.0", ] [[package]] @@ -1181,7 +959,7 @@ dependencies = [ "libc", "pango-sys", "pkg-config", - "system-deps 6.1.1", + "system-deps 6.2.0", ] [[package]] @@ -1195,7 +973,7 @@ dependencies = [ "gobject-sys", "libc", "pkg-config", - "system-deps 6.1.1", + "system-deps 6.2.0", ] [[package]] @@ -1207,7 +985,7 @@ dependencies = [ "gdk-sys", "glib-sys", "libc", - "system-deps 6.1.1", + "system-deps 6.2.0", "x11", ] @@ -1247,9 +1025,9 @@ dependencies = [ [[package]] name = "getrandom" -version = "0.2.10" +version = "0.2.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be4136b2a15dd319360be1c07d9933517ccf0be8f16bf62a3bee4f0d618df427" +checksum = "190092ea657667030ac6a35e305e62fc4dd69fd98ac98631e5d3a2b1575a12b5" dependencies = [ "cfg-if", "libc", @@ -1258,9 +1036,9 @@ dependencies = [ [[package]] name = "gimli" -version = "0.27.3" +version = "0.28.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6c80984affa11d98d1b88b66ac8853f143217b399d3c74116778ff8fdb4ed2e" +checksum = "4271d37baee1b8c7e4b708028c57d816cf9d2434acb33a549475f78c181f6253" [[package]] name = "gio" @@ -1288,7 +1066,7 @@ dependencies = [ "glib-sys", "gobject-sys", "libc", - "system-deps 6.1.1", + "system-deps 6.2.0", "winapi", ] @@ -1334,7 +1112,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ef4b192f8e65e9cf76cbf4ea71fa8e3be4a0e18ffe3d68b8da6836974cc5bad4" dependencies = [ "libc", - "system-deps 6.1.1", + "system-deps 6.2.0", ] [[package]] @@ -1345,15 +1123,15 @@ checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b" [[package]] name = "globset" -version = "0.4.13" +version = "0.4.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "759c97c1e17c55525b57192c06a267cda0ac5210b222d6b82189a2338fa1c13d" +checksum = "57da3b9b5b85bd66f31093f8c408b90a74431672542466497dcbdfdc02034be1" dependencies = [ "aho-corasick", "bstr", - "fnv", "log", - "regex", + "regex-automata 0.4.3", + "regex-syntax 0.8.2", ] [[package]] @@ -1364,7 +1142,7 @@ checksum = "0d57ce44246becd17153bd035ab4d32cfee096a657fc01f2231c9278378d1e0a" dependencies = [ "glib-sys", "libc", - "system-deps 6.1.1", + "system-deps 6.2.0", ] [[package]] @@ -1405,7 +1183,7 @@ dependencies = [ "gobject-sys", "libc", "pango-sys", - "system-deps 6.1.1", + "system-deps 6.2.0", ] [[package]] @@ -1422,25 +1200,6 @@ dependencies = [ "syn 1.0.109", ] -[[package]] -name = "h2" -version = "0.3.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97ec8491ebaf99c8eaa73058b045fe58073cd6be7f596ac993ced0b0a0c01049" -dependencies = [ - "bytes", - "fnv", - "futures-core", - "futures-sink", - "futures-util", - "http", - "indexmap 1.9.3", - "slab", - "tokio", - "tokio-util", - "tracing", -] - [[package]] name = "hashbrown" version = "0.12.3" @@ -1449,9 +1208,9 @@ checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" [[package]] name = "hashbrown" -version = "0.14.0" +version = "0.14.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c6201b9ff9fd90a5a3bac2e56a830d0caa509576f0e503818ee82c181b3437a" +checksum = "290f1a1d9242c78d09ce40a5e87e7554ee637af1351968159f4952f028f75604" dependencies = [ "ahash", "allocator-api2", @@ -1459,11 +1218,11 @@ dependencies = [ [[package]] name = "hashlink" -version = "0.8.3" +version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "312f66718a2d7789ffef4f4b7b213138ed9f1eb3aa1d0d82fc99f88fb3ffd26f" +checksum = "e8094feaf31ff591f651a2664fb9cfd92bba7a60ce3197265e9482ebe753c8f7" dependencies = [ - "hashbrown 0.14.0", + "hashbrown 0.14.3", ] [[package]] @@ -1483,9 +1242,9 @@ checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" [[package]] name = "hermit-abi" -version = "0.3.2" +version = "0.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "443144c8cdadd93ebf52ddb4056d257f5b52c04d3c804e657d19eb73fc33668b" +checksum = "5d3d0e0f38255e7fa3cf31335b3a56f05febd18025f4db5ef7a0cfb4f8da651f" [[package]] name = "hex" @@ -1495,9 +1254,9 @@ checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" [[package]] name = "html5ever" -version = "0.25.2" +version = "0.26.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5c13fb08e5d4dfc151ee5e88bae63f7773d61852f3bdc73c9f4b9e1bde03148" +checksum = "bea68cab48b8459f17cf1c944c67ddc572d272d9f2b274140f223ecb1da4a3b7" dependencies = [ "log", "mac", @@ -1509,24 +1268,13 @@ dependencies = [ [[package]] name = "http" -version = "0.2.9" +version = "0.2.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd6effc99afb63425aff9b05836f029929e345a6148a14b7ecd5ab67af944482" +checksum = "8947b1a6fad4393052c7ba1f4cd97bed3e953a95c79c92ad9b051a04611d9fbb" dependencies = [ "bytes", "fnv", - "itoa 1.0.9", -] - -[[package]] -name = "http-body" -version = "0.4.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d5f38f16d184e36f2408a55281cd658ecbd3ca05cce6d6510a176eca393e26d1" -dependencies = [ - "bytes", - "http", - "pin-project-lite", + "itoa 1.0.10", ] [[package]] @@ -1536,67 +1284,18 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "21dec9db110f5f872ed9699c3ecf50cf16f423502706ba5c72462e28d3157573" [[package]] -name = "httparse" -version = "1.8.0" +name = "iana-time-zone" +version = "0.1.59" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d897f394bad6a705d5f4104762e116a75639e470d80901eed05a860a95cb1904" - -[[package]] -name = "httpdate" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4a1e36c821dbe04574f602848a19f742f4fb3c98d40449f11bcad18d6b17421" - -[[package]] -name = "hyper" -version = "0.14.27" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ffb1cfd654a8219eaef89881fdb3bb3b1cdc5fa75ded05d6933b2b382e395468" -dependencies = [ - "bytes", - "futures-channel", - "futures-core", - "futures-util", - "h2", - "http", - "http-body", - "httparse", - "httpdate", - "itoa 1.0.9", - "pin-project-lite", - "socket2", - "tokio", - "tower-service", - "tracing", - "want", -] - -[[package]] -name = "hyper-tls" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d6183ddfa99b85da61a140bea0efc93fdf56ceaa041b37d553518030827f9905" -dependencies = [ - "bytes", - "hyper", - "native-tls", - "tokio", - "tokio-native-tls", -] - -[[package]] -name = "iana-time-zone" -version = "0.1.57" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2fad5b825842d2b38bd206f3e81d6957625fd7f0a361e345c30e01a0ae2dd613" -dependencies = [ - "android_system_properties", - "core-foundation-sys", - "iana-time-zone-haiku", - "js-sys", - "wasm-bindgen", - "windows 0.48.0", -] +checksum = "b6a67363e2aa4443928ce15e57ebae94fd8949958fd1223c4cfc0cd473ad7539" +dependencies = [ + "android_system_properties", + "core-foundation-sys", + "iana-time-zone-haiku", + "js-sys", + "wasm-bindgen", + "windows-core", +] [[package]] name = "iana-time-zone-haiku" @@ -1625,9 +1324,9 @@ checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" [[package]] name = "idna" -version = "0.4.0" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d20d6b07bfbc108882d88ed8e37d39636dcc260e15e30c45e6ba089610b917c" +checksum = "634d9b1461af396cad843f47fdba5597a4f9e6ddd4bfb6ff5d85028c25cb12f6" dependencies = [ "unicode-bidi", "unicode-normalization", @@ -1635,31 +1334,29 @@ dependencies = [ [[package]] name = "ignore" -version = "0.4.20" +version = "0.4.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dbe7873dab538a9a44ad79ede1faf5f30d49f9a5c883ddbab48bce81b64b7492" +checksum = "b46810df39e66e925525d6e38ce1e7f6e1d208f72dc39757880fcb66e2c58af1" dependencies = [ + "crossbeam-deque", "globset", - "lazy_static", "log", "memchr", - "regex", + "regex-automata 0.4.3", "same-file", - "thread_local", "walkdir", "winapi-util", ] [[package]] name = "image" -version = "0.24.6" +version = "0.24.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "527909aa81e20ac3a44803521443a765550f09b5130c2c2fa1ea59c2f8f50a3a" +checksum = "034bbe799d1909622a74d1193aa50147769440040ff36cb2baa947609b0a4e23" dependencies = [ "bytemuck", "byteorder", "color_quant", - "num-rational", "num-traits", ] @@ -1676,20 +1373,20 @@ dependencies = [ [[package]] name = "indexmap" -version = "2.0.0" +version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d5477fe2230a79769d8dc68e0eabf5437907c0457a5614a9e8dddb67f65eb65d" +checksum = "d530e1a18b1cb4c484e6e34556a0d948706958449fca0cab753d649f2bce3d1f" dependencies = [ "equivalent", - "hashbrown 0.14.0", + "hashbrown 0.14.3", "serde", ] [[package]] name = "infer" -version = "0.12.0" +version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a898e4b7951673fce96614ce5751d13c40fc5674bc2d759288e46c3ab62598b3" +checksum = "f551f8c3a39f68f986517db0d1759de85881894fdc7db798bd2a9df9cb04b7fc" dependencies = [ "cfb", ] @@ -1703,23 +1400,6 @@ dependencies = [ "cfg-if", ] -[[package]] -name = "io-lifetimes" -version = "1.0.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eae7b9aee968036d54dce06cebaefd919e4472e753296daccd6d344e3e2df0c2" -dependencies = [ - "hermit-abi", - "libc", - "windows-sys 0.48.0", -] - -[[package]] -name = "ipnet" -version = "2.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28b29a3cd74f0f4598934efe3aeba42bae0eb4680554128851ebbecb02af14e6" - [[package]] name = "itoa" version = "0.4.8" @@ -1728,9 +1408,9 @@ checksum = "b71991ff56294aa922b450139ee08b3bfc70982c6b2c7562771375cf73542dd4" [[package]] name = "itoa" -version = "1.0.9" +version = "1.0.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af150ab688ff2122fcef229be89cb50dd66af9e01a4ff320cc137eecc9bacc38" +checksum = "b1a46d1a171d865aa5f83f92695765caa047a9b4cbae2cbf37dbd613a793fd4c" [[package]] name = "javascriptcore-rs" @@ -1777,18 +1457,18 @@ checksum = "8eaf4bc02d17cbdd7ff4c7438cafcdf7fb9a4613313ad11b4f8fefe7d3fa0130" [[package]] name = "js-sys" -version = "0.3.64" +version = "0.3.67" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c5f195fe497f702db0f318b07fdd68edb16955aed830df8363d837542f8f935a" +checksum = "9a1d36f1235bc969acba30b7f5990b864423a6068a10f7c90ae8f0112e3a59d1" dependencies = [ "wasm-bindgen", ] [[package]] name = "json-patch" -version = "1.0.0" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f54898088ccb91df1b492cc80029a6fdf1c48ca0db7c6822a8babad69c94658" +checksum = "55ff1e1486799e3f64129f8ccad108b38290df9cd7015cd31bed17239f0789d6" dependencies = [ "serde", "serde_json", @@ -1797,13 +1477,14 @@ dependencies = [ ] [[package]] -name = "kuchiki" -version = "0.8.1" +name = "kuchikiki" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ea8e9c6e031377cff82ee3001dc8026cdf431ed4e2e6b51f98ab8c73484a358" +checksum = "f29e4755b7b995046f510a7520c42b2fed58b77bd94d5a87a8eb43d2fd126da8" dependencies = [ "cssparser", "html5ever", + "indexmap 1.9.3", "matches", "selectors", ] @@ -1816,9 +1497,20 @@ checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" [[package]] name = "libc" -version = "0.2.147" +version = "0.2.152" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13e3bf6590cbc649f4d1a3eefc9d5d6eb746f5200ffb04e5e142700b8faa56e7" + +[[package]] +name = "libredox" +version = "0.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4668fb0ea861c1df094127ac5f1da3409a82116a4ba74fca2e58ef927159bb3" +checksum = "85c833ca1e66078851dba29046874e38f08b2c883700aa29a03ddd3b23814ee8" +dependencies = [ + "bitflags 2.4.2", + "libc", + "redox_syscall", +] [[package]] name = "libsqlite3-sys" @@ -1842,21 +1534,15 @@ dependencies = [ [[package]] name = "linux-raw-sys" -version = "0.3.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef53942eb7bf7ff43a617b3e2c1c4a5ecf5944a7c1bc12d7ee39bbb15e5c1519" - -[[package]] -name = "linux-raw-sys" -version = "0.4.5" +version = "0.4.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57bcfdad1b858c2db7c38303a6d2ad4dfaf5eb53dfeb0910128b2c26d6158503" +checksum = "01cda141df6706de531b6c46c3a33ecca755538219bd484262fa09410c13539c" [[package]] name = "lock_api" -version = "0.4.10" +version = "0.4.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1cc9717a20b1bb222f333e6a92fd32f7d8a18ddc5a3191a11af45dcbf4dcd16" +checksum = "3c168f8615b12bc01f9c17e2eb0cc07dcae1940121185446edc3744920e8ef45" dependencies = [ "autocfg", "scopeguard", @@ -1864,9 +1550,9 @@ dependencies = [ [[package]] name = "log" -version = "0.4.19" +version = "0.4.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b06a4cde4c0f271a446782e3eff8de789548ce57dbc8eca9292c27f4a42004b4" +checksum = "b5e6163cb8c49088c2c36f57875e58ccd8c87c7427f7fbd50ea6710b2f3f2e8f" [[package]] name = "loom" @@ -1889,19 +1575,6 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c41e0c4fef86961ac6d6f8a82609f55f31b05e4fce149ac5710e439df7619ba4" -[[package]] -name = "mac-notification-sys" -version = "0.5.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "abc434554ad0e640d772f7f262aa28e61d485212533d3673abe5f3d1729bd42a" -dependencies = [ - "cc", - "dirs-next", - "objc-foundation", - "objc_id", - "time 0.3.25", -] - [[package]] name = "malloc_buf" version = "0.0.6" @@ -1913,13 +1586,13 @@ dependencies = [ [[package]] name = "markup5ever" -version = "0.10.1" +version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a24f40fb03852d1cdd84330cddcaf98e9ec08a7b7768e952fad3b4cf048ec8fd" +checksum = "7a2629bb1404f3d34c2e921f21fd34ba00b206124c81f65c50b43b6aaefeb016" dependencies = [ "log", - "phf 0.8.0", - "phf_codegen", + "phf 0.10.1", + "phf_codegen 0.10.0", "string_cache", "string_cache_codegen", "tendril", @@ -1942,18 +1615,9 @@ checksum = "2532096657941c2fea9c289d370a250971c689d4f143798ff67113ec042024a5" [[package]] name = "memchr" -version = "2.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d" - -[[package]] -name = "memoffset" -version = "0.7.1" +version = "2.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5de893c32cde5f383baa4c04c5d6dbdd735cfd4a794b0debdb2bb1b421da5ff4" -dependencies = [ - "autocfg", -] +checksum = "523dc4f511e55ab87b694dc30d0f820d60906ef06413f93d4d7a1385599cc149" [[package]] name = "memoffset" @@ -1964,12 +1628,6 @@ dependencies = [ "autocfg", ] -[[package]] -name = "mime" -version = "0.3.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" - [[package]] name = "miniz_oxide" version = "0.7.1" @@ -1980,35 +1638,6 @@ dependencies = [ "simd-adler32", ] -[[package]] -name = "mio" -version = "0.8.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "927a765cd3fc26206e66b296465fa9d3e5ab003e651c1b3c060e7956d96b19d2" -dependencies = [ - "libc", - "wasi 0.11.0+wasi-snapshot-preview1", - "windows-sys 0.48.0", -] - -[[package]] -name = "native-tls" -version = "0.2.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07226173c32f2926027b63cce4bcd8076c3552846cbe7925f3aaffeac0a3b92e" -dependencies = [ - "lazy_static", - "libc", - "log", - "openssl", - "openssl-probe", - "openssl-sys", - "schannel", - "security-framework", - "security-framework-sys", - "tempfile", -] - [[package]] name = "ndk" version = "0.6.0" @@ -2043,38 +1672,12 @@ version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e4a24736216ec316047a1fc4252e27dabb04218aa4a3f37c6e7ddbf1f9782b54" -[[package]] -name = "nix" -version = "0.26.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bfdda3d196821d6af13126e40375cdf7da646a96114af134d5f417a9a1dc8e1a" -dependencies = [ - "bitflags 1.3.2", - "cfg-if", - "libc", - "memoffset 0.7.1", - "static_assertions", -] - [[package]] name = "nodrop" version = "0.1.14" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "72ef4a56884ca558e5ddb05a1d1e7e1bfd9a68d9ed024c21704cc98872dae1bb" -[[package]] -name = "notify-rust" -version = "4.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2bfa211d18e360f08e36c364308f394b5eb23a6629150690e109a916dc6f610e" -dependencies = [ - "log", - "mac-notification-sys", - "serde", - "tauri-winrt-notification", - "zbus", -] - [[package]] name = "nu-ansi-term" version = "0.46.0" @@ -2085,32 +1688,11 @@ dependencies = [ "winapi", ] -[[package]] -name = "num-integer" -version = "0.1.45" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "225d3389fb3509a24c93f5c29eb6bde2586b98d9f016636dff58d7c6f7569cd9" -dependencies = [ - "autocfg", - "num-traits", -] - -[[package]] -name = "num-rational" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0638a1c9d0a3c0914158145bc76cff373a75a627e6ecbfb71cbe6f453a5a19b0" -dependencies = [ - "autocfg", - "num-integer", - "num-traits", -] - [[package]] name = "num-traits" -version = "0.2.16" +version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f30b0abd723be7e2ffca1272140fac1a2f084c77ec3e123c192b66af1ee9e6c2" +checksum = "39e3200413f237f41ab11ad6d161bc7239c84dcb631773ccd7de3dfe4b5c267c" dependencies = [ "autocfg", ] @@ -2156,17 +1738,6 @@ dependencies = [ "objc_exception", ] -[[package]] -name = "objc-foundation" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1add1b659e36c9607c7aab864a76c7a4c2760cd0cd2e120f3fb8b952c7e22bf9" -dependencies = [ - "block", - "objc", - "objc_id", -] - [[package]] name = "objc_exception" version = "0.1.2" @@ -2187,72 +1758,18 @@ dependencies = [ [[package]] name = "object" -version = "0.31.1" +version = "0.32.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8bda667d9f2b5051b8833f59f3bf748b28ef54f850f4fcb389a252aa383866d1" +checksum = "a6a622008b6e321afc04970976f62ee297fdbaa6f95318ca343e3eebb9648441" dependencies = [ "memchr", ] [[package]] name = "once_cell" -version = "1.18.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd8b5dd2ae5ed71462c540258bedcb51965123ad7e7ccf4b9a8cafaa4a63576d" - -[[package]] -name = "open" -version = "3.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2078c0039e6a54a0c42c28faa984e115fb4c2d5bf2208f77d1961002df8576f8" -dependencies = [ - "pathdiff", - "windows-sys 0.42.0", -] - -[[package]] -name = "openssl" -version = "0.10.60" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "79a4c6c3a2b158f7f8f2a2fc5a969fa3a068df6fc9dbb4a43845436e3af7c800" -dependencies = [ - "bitflags 2.3.3", - "cfg-if", - "foreign-types", - "libc", - "once_cell", - "openssl-macros", - "openssl-sys", -] - -[[package]] -name = "openssl-macros" -version = "0.1.1" +version = "1.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.28", -] - -[[package]] -name = "openssl-probe" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" - -[[package]] -name = "openssl-sys" -version = "0.9.96" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3812c071ba60da8b5677cc12bcb1d42989a65553772897a7e0355545a819838f" -dependencies = [ - "cc", - "libc", - "pkg-config", - "vcpkg", -] +checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" [[package]] name = "option-ext" @@ -2260,37 +1777,6 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d" -[[package]] -name = "ordered-stream" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9aa2b01e1d916879f73a53d01d1d6cee68adbb31d6d9177a8cfce093cced1d50" -dependencies = [ - "futures-core", - "pin-project-lite", -] - -[[package]] -name = "os_info" -version = "3.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "006e42d5b888366f1880eda20371fedde764ed2213dc8496f49622fa0c99cd5e" -dependencies = [ - "log", - "serde", - "winapi", -] - -[[package]] -name = "os_pipe" -version = "1.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ae859aa07428ca9a929b936690f8b12dc5f11dd8c6992a18ca93919f28bc177" -dependencies = [ - "libc", - "windows-sys 0.48.0", -] - [[package]] name = "overload" version = "0.1.1" @@ -2319,15 +1805,9 @@ dependencies = [ "glib-sys", "gobject-sys", "libc", - "system-deps 6.1.1", + "system-deps 6.2.0", ] -[[package]] -name = "parking" -version = "2.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "14f2252c834a40ed9bb5422029649578e63aa341ac401f74e719dd1afda8394e" - [[package]] name = "parking_lot" version = "0.12.1" @@ -2340,28 +1820,22 @@ dependencies = [ [[package]] name = "parking_lot_core" -version = "0.9.8" +version = "0.9.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93f00c865fe7cabf650081affecd3871070f26767e7b2070a3ffae14c654b447" +checksum = "4c42a9226546d68acdd9c0a280d17ce19bfe27a46bf68784e4066115788d008e" dependencies = [ "cfg-if", "libc", - "redox_syscall 0.3.5", + "redox_syscall", "smallvec", - "windows-targets 0.48.1", + "windows-targets 0.48.5", ] -[[package]] -name = "pathdiff" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8835116a5c179084a830efb3adc117ab007512b535bc1a21c991d3b32a6b44dd" - [[package]] name = "percent-encoding" -version = "2.3.0" +version = "2.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b2a4787296e9989611394c33f193f676704af1686e70b8f8033ab5ba9a35a94" +checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" [[package]] name = "phf" @@ -2380,9 +1854,17 @@ version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fabbf1ead8a5bcbc20f5f8b939ee3f5b0f6f281b6ad3468b84656b658b455259" dependencies = [ - "phf_macros 0.10.0", "phf_shared 0.10.0", - "proc-macro-hack", +] + +[[package]] +name = "phf" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ade2d8b8f33c7333b51bcf0428d37e217e9f32192ae4772156f65063b8ce03dc" +dependencies = [ + "phf_macros 0.11.2", + "phf_shared 0.11.2", ] [[package]] @@ -2395,6 +1877,16 @@ dependencies = [ "phf_shared 0.8.0", ] +[[package]] +name = "phf_codegen" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4fb1c3a8bc4dd4e5cfce29b44ffc14bedd2ee294559a294e2a4d4c9e9a6a13cd" +dependencies = [ + "phf_generator 0.10.0", + "phf_shared 0.10.0", +] + [[package]] name = "phf_generator" version = "0.8.0" @@ -2415,6 +1907,16 @@ dependencies = [ "rand 0.8.5", ] +[[package]] +name = "phf_generator" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "48e4cc64c2ad9ebe670cb8fd69dd50ae301650392e81c05f9bfcb2d5bdbc24b0" +dependencies = [ + "phf_shared 0.11.2", + "rand 0.8.5", +] + [[package]] name = "phf_macros" version = "0.8.0" @@ -2431,16 +1933,15 @@ dependencies = [ [[package]] name = "phf_macros" -version = "0.10.0" +version = "0.11.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "58fdf3184dd560f160dd73922bea2d5cd6e8f064bf4b13110abd81b03697b4e0" +checksum = "3444646e286606587e49f3bcf1679b8cef1dc2c5ecc29ddacaffc305180d464b" dependencies = [ - "phf_generator 0.10.0", - "phf_shared 0.10.0", - "proc-macro-hack", + "phf_generator 0.11.2", + "phf_shared 0.11.2", "proc-macro2", "quote", - "syn 1.0.109", + "syn 2.0.48", ] [[package]] @@ -2461,11 +1962,20 @@ dependencies = [ "siphasher", ] +[[package]] +name = "phf_shared" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90fcb95eef784c2ac79119d1dd819e162b5da872ce6f3c3abe1e8ca1c082f72b" +dependencies = [ + "siphasher", +] + [[package]] name = "pin-project-lite" -version = "0.2.11" +version = "0.2.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c516611246607d0c04186886dbb3a754368ef82c79e9827a802c6d836dd111c" +checksum = "8afb450f006bf6385ca15ef45d71d2288452bc3683ce2e2cacc0d18e4be60b58" [[package]] name = "pin-utils" @@ -2475,29 +1985,29 @@ checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" [[package]] name = "pkg-config" -version = "0.3.27" +version = "0.3.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26072860ba924cbfa98ea39c8c19b4dd6a4a25423dbdf219c1eca91aa0cf6964" +checksum = "2900ede94e305130c13ddd391e0ab7cbaeb783945ae07a279c268cb05109c6cb" [[package]] name = "plist" -version = "1.5.0" +version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bdc0001cfea3db57a2e24bc0d818e9e20e554b5f97fabb9bc231dc240269ae06" +checksum = "e5699cc8a63d1aa2b1ee8e12b9ad70ac790d65788cd36101fa37f87ea46c4cef" dependencies = [ - "base64 0.21.2", - "indexmap 1.9.3", + "base64 0.21.7", + "indexmap 2.1.0", "line-wrap", - "quick-xml 0.29.0", + "quick-xml", "serde", - "time 0.3.25", + "time", ] [[package]] name = "png" -version = "0.17.9" +version = "0.17.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "59871cc5b6cce7eaccca5a802b4173377a1c2ba90654246789a8fa2334426d11" +checksum = "1f6c3c3e617595665b8ea2ff95a86066be38fb121ff920a9c0eb282abcd1da5a" dependencies = [ "bitflags 1.3.2", "crc32fast", @@ -2507,20 +2017,10 @@ dependencies = [ ] [[package]] -name = "polling" -version = "2.8.0" +name = "powerfmt" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4b2d323e8ca7996b3e23126511a523f7e62924d93ecd5ae73b333815b0eb3dce" -dependencies = [ - "autocfg", - "bitflags 1.3.2", - "cfg-if", - "concurrent-queue", - "libc", - "log", - "pin-project-lite", - "windows-sys 0.48.0", -] +checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" [[package]] name = "ppv-lite86" @@ -2541,7 +2041,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7f4c021e1093a56626774e81216a4ce732a735e5bad4868a03f3ed65ca0c3919" dependencies = [ "once_cell", - "toml_edit", + "toml_edit 0.19.15", ] [[package]] @@ -2576,36 +2076,27 @@ checksum = "dc375e1527247fe1a97d8b7156678dfe7c1af2fc075c9a4db3690ecd2a148068" [[package]] name = "proc-macro2" -version = "1.0.66" +version = "1.0.76" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "18fb31db3f9bddb2ea821cde30a9f70117e3f119938b5ee630b7403aa6e2ead9" +checksum = "95fc56cda0b5c3325f5fbbd7ff9fda9e02bb00bb3dac51252d2f1bfa1cb8cc8c" dependencies = [ "unicode-ident", ] [[package]] name = "quick-xml" -version = "0.23.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "11bafc859c6815fbaffbbbf4229ecb767ac913fecb27f9ad4343662e9ef099ea" -dependencies = [ - "memchr", -] - -[[package]] -name = "quick-xml" -version = "0.29.0" +version = "0.31.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81b9228215d82c7b61490fec1de287136b5de6f5700f6e58ea9ad61a7964ca51" +checksum = "1004a344b30a54e2ee58d66a71b32d2db2feb0a31f9a2d302bf0536f15de2a33" dependencies = [ "memchr", ] [[package]] name = "quote" -version = "1.0.32" +version = "1.0.35" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50f3b39ccfb720540debaa0164757101c08ecb8d326b15358ce76a62c7e85965" +checksum = "291ec9ab5efd934aaf503a6466c5d5251535d108ee747472c3977cc5acc868ef" dependencies = [ "proc-macro2", ] @@ -2670,7 +2161,7 @@ version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" dependencies = [ - "getrandom 0.2.10", + "getrandom 0.2.12", ] [[package]] @@ -2699,43 +2190,34 @@ checksum = "f2ff9a1f06a88b01621b7ae906ef0211290d1c8a168a15542486a8f61c0833b9" [[package]] name = "redox_syscall" -version = "0.2.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fb5a58c1855b4b6819d59012155603f0b22ad30cad752600aadfcb695265519a" -dependencies = [ - "bitflags 1.3.2", -] - -[[package]] -name = "redox_syscall" -version = "0.3.5" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "567664f262709473930a4bf9e51bf2ebf3348f2e748ccc50dea20646858f8f29" +checksum = "4722d768eff46b75989dd134e5c353f0d6296e5aaa3132e776cbdb56be7731aa" dependencies = [ "bitflags 1.3.2", ] [[package]] name = "redox_users" -version = "0.4.3" +version = "0.4.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b033d837a7cf162d7993aded9304e30a83213c648b6e389db233191f891e5c2b" +checksum = "a18479200779601e498ada4e8c1e1f50e3ee19deb0259c25825a98b5603b2cb4" dependencies = [ - "getrandom 0.2.10", - "redox_syscall 0.2.16", + "getrandom 0.2.12", + "libredox", "thiserror", ] [[package]] name = "regex" -version = "1.9.3" +version = "1.10.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81bc1d4caf89fac26a70747fe603c130093b53c773888797a6329091246d651a" +checksum = "380b951a9c5e80ddfd6136919eef32310721aa4aacd4889a8d39124b026ab343" dependencies = [ "aho-corasick", "memchr", - "regex-automata 0.3.6", - "regex-syntax 0.7.4", + "regex-automata 0.4.3", + "regex-syntax 0.8.2", ] [[package]] @@ -2749,13 +2231,13 @@ dependencies = [ [[package]] name = "regex-automata" -version = "0.3.6" +version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fed1ceff11a1dddaee50c9dc8e4938bd106e9d89ae372f192311e7da498e3b69" +checksum = "5f804c7828047e88b2d32e2d7fe5a105da8ee3264f01902f796c8e067dc2483f" dependencies = [ "aho-corasick", "memchr", - "regex-syntax 0.7.4", + "regex-syntax 0.8.2", ] [[package]] @@ -2766,72 +2248,9 @@ checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1" [[package]] name = "regex-syntax" -version = "0.7.4" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5ea92a5b6195c6ef2a0295ea818b312502c6fc94dde986c5553242e18fd4ce2" - -[[package]] -name = "reqwest" -version = "0.11.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cde824a14b7c14f85caff81225f411faacc04a2013f41670f41443742b1c1c55" -dependencies = [ - "base64 0.21.2", - "bytes", - "encoding_rs", - "futures-core", - "futures-util", - "h2", - "http", - "http-body", - "hyper", - "hyper-tls", - "ipnet", - "js-sys", - "log", - "mime", - "native-tls", - "once_cell", - "percent-encoding", - "pin-project-lite", - "serde", - "serde_json", - "serde_urlencoded", - "tokio", - "tokio-native-tls", - "tokio-util", - "tower-service", - "url", - "wasm-bindgen", - "wasm-bindgen-futures", - "wasm-streams", - "web-sys", - "winreg 0.10.1", -] - -[[package]] -name = "rfd" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0149778bd99b6959285b0933288206090c50e2327f47a9c463bfdbf45c8823ea" -dependencies = [ - "block", - "dispatch", - "glib-sys", - "gobject-sys", - "gtk-sys", - "js-sys", - "lazy_static", - "log", - "objc", - "objc-foundation", - "objc_id", - "raw-window-handle", - "wasm-bindgen", - "wasm-bindgen-futures", - "web-sys", - "windows 0.37.0", -] +checksum = "c08c74e62047bb2de4ff487b251e4a92e24f48745648451635cec7d591162d9f" [[package]] name = "rusqlite" @@ -2848,7 +2267,7 @@ dependencies = [ "libsqlite3-sys", "serde_json", "smallvec", - "time 0.3.25", + "time", "url", "uuid", ] @@ -2880,29 +2299,15 @@ dependencies = [ [[package]] name = "rustix" -version = "0.37.23" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4d69718bf81c6127a49dc64e44a742e8bb9213c0ff8869a22c308f84c1d4ab06" -dependencies = [ - "bitflags 1.3.2", - "errno", - "io-lifetimes", - "libc", - "linux-raw-sys 0.3.8", - "windows-sys 0.48.0", -] - -[[package]] -name = "rustix" -version = "0.38.7" +version = "0.38.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "172891ebdceb05aa0005f533a6cbfca599ddd7d966f6f5d4d9b2e70478e70399" +checksum = "322394588aaf33c24007e8bb3238ee3e4c5c09c084ab32bc73890b99ff326bca" dependencies = [ - "bitflags 2.3.3", + "bitflags 2.4.2", "errno", "libc", - "linux-raw-sys 0.4.5", - "windows-sys 0.48.0", + "linux-raw-sys", + "windows-sys 0.52.0", ] [[package]] @@ -2913,9 +2318,9 @@ checksum = "7ffc183a10b4478d04cbbbfc96d0873219d962dd5accaff2ffbd4ceb7df837f4" [[package]] name = "ryu" -version = "1.0.15" +version = "1.0.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ad4cc8da4ef723ed60bced201181d83791ad433213d8c24efffda1eec85d741" +checksum = "f98d2aa92eebf49b69786be48e4477826b256916e84a57ff2a4f21923b48eb4c" [[package]] name = "safemem" @@ -2932,15 +2337,6 @@ dependencies = [ "winapi-util", ] -[[package]] -name = "schannel" -version = "0.1.22" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c3733bf4cf7ea0880754e19cb5a462007c4a8c1914bff372ccc95b464f1df88" -dependencies = [ - "windows-sys 0.48.0", -] - [[package]] name = "scoped-tls" version = "1.0.1" @@ -2953,29 +2349,6 @@ version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" -[[package]] -name = "security-framework" -version = "2.9.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05b64fb303737d99b81884b2c63433e9ae28abebe5eb5045dcdd175dc2ecf4de" -dependencies = [ - "bitflags 1.3.2", - "core-foundation", - "core-foundation-sys", - "libc", - "security-framework-sys", -] - -[[package]] -name = "security-framework-sys" -version = "2.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e932934257d3b408ed8f30db49d85ea163bfe74961f017f405b025af298f0c7a" -dependencies = [ - "core-foundation-sys", - "libc", -] - [[package]] name = "selectors" version = "0.22.0" @@ -2989,7 +2362,7 @@ dependencies = [ "log", "matches", "phf 0.8.0", - "phf_codegen", + "phf_codegen 0.8.0", "precomputed-hash", "servo_arc", "smallvec", @@ -2998,53 +2371,53 @@ dependencies = [ [[package]] name = "semver" -version = "1.0.18" +version = "1.0.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b0293b4b29daaf487284529cc2f5675b8e57c61f70167ba415a463651fd6a918" +checksum = "b97ed7a9823b74f99c7742f5336af7be5ecd3eeafcb1507d1fa93347b1d589b0" dependencies = [ "serde", ] [[package]] name = "serde" -version = "1.0.182" +version = "1.0.195" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bdb30a74471f5b7a1fa299f40b4bf1be93af61116df95465b2b5fc419331e430" +checksum = "63261df402c67811e9ac6def069e4786148c4563f4b50fd4bf30aa370d626b02" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.182" +version = "1.0.195" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6f4c2c6ea4bc09b5c419012eafcdb0fcef1d9119d626c8f3a0708a5b92d38a70" +checksum = "46fe8f8603d81ba86327b23a2e9cdf49e1255fb94a4c5f297f6ee0547178ea2c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.28", + "syn 2.0.48", ] [[package]] name = "serde_json" -version = "1.0.104" +version = "1.0.111" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "076066c5f1078eac5b722a31827a8832fe108bed65dfa75e233c89f8206e976c" +checksum = "176e46fa42316f18edd598015a5166857fc835ec732f5215eac6b7bdbf0a84f4" dependencies = [ - "itoa 1.0.9", + "itoa 1.0.10", "ryu", "serde", ] [[package]] name = "serde_repr" -version = "0.1.16" +version = "0.1.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8725e1dfadb3a50f7e5ce0b1a540466f6ed3fe7a0fca2ac2b8b831d31316bd00" +checksum = "0b2e6b945e9d3df726b65d6ee24060aff8e3533d431f677a9695db04eff9dfdb" dependencies = [ "proc-macro2", "quote", - "syn 2.0.28", + "syn 2.0.48", ] [[package]] @@ -3059,52 +2432,40 @@ dependencies = [ [[package]] name = "serde_spanned" -version = "0.6.3" +version = "0.6.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96426c9936fd7a0124915f9185ea1d20aa9445cc9821142f0a73bc9207a2e186" +checksum = "eb3622f419d1296904700073ea6cc23ad690adbd66f13ea683df73298736f0c1" dependencies = [ "serde", ] -[[package]] -name = "serde_urlencoded" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" -dependencies = [ - "form_urlencoded", - "itoa 1.0.9", - "ryu", - "serde", -] - [[package]] name = "serde_with" -version = "3.2.0" +version = "3.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1402f54f9a3b9e2efe71c1cea24e648acce55887983553eeb858cf3115acfd49" +checksum = "64cd236ccc1b7a29e7e2739f27c0b2dd199804abc4290e32f59f3b68d6405c23" dependencies = [ - "base64 0.21.2", + "base64 0.21.7", "chrono", "hex", "indexmap 1.9.3", - "indexmap 2.0.0", + "indexmap 2.1.0", "serde", "serde_json", "serde_with_macros", - "time 0.3.25", + "time", ] [[package]] name = "serde_with_macros" -version = "3.2.0" +version = "3.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9197f1ad0e3c173a0222d3c4404fb04c3afe87e962bcb327af73e8301fa203c7" +checksum = "93634eb5f75a2323b16de4748022ac4297f9e76b6dced2be287a099f41b5e788" dependencies = [ "darling", "proc-macro2", "quote", - "syn 2.0.28", + "syn 2.0.48", ] [[package]] @@ -3139,22 +2500,11 @@ dependencies = [ "stable_deref_trait", ] -[[package]] -name = "sha1" -version = "0.10.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f04293dc80c3993519f2d7f6f511707ee7094fe0c6d3406feb330cdb3540eba3" -dependencies = [ - "cfg-if", - "cpufeatures", - "digest", -] - [[package]] name = "sha2" -version = "0.10.7" +version = "0.10.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "479fb9d862239e610720565ca91403019f2f00410f1864c5aa7479b950a76ed8" +checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8" dependencies = [ "cfg-if", "cpufeatures", @@ -3163,42 +2513,13 @@ dependencies = [ [[package]] name = "sharded-slab" -version = "0.1.4" +version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "900fba806f70c630b0a382d0d825e17a0f19fcd059a2ade1ff237bcddf446b31" +checksum = "f40ca3c46823713e0d4209592e8d6e826aa57e928f09752619fc696c499637f6" dependencies = [ "lazy_static", ] -[[package]] -name = "shared_child" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b0d94659ad3c2137fef23ae75b03d5241d633f8acded53d672decfa0e6e0caef" -dependencies = [ - "libc", - "winapi", -] - -[[package]] -name = "signal-hook" -version = "0.3.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8621587d4798caf8eb44879d42e56b9a93ea5dcd315a6487c357130095b62801" -dependencies = [ - "libc", - "signal-hook-registry", -] - -[[package]] -name = "signal-hook-registry" -version = "1.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d8229b473baa5980ac72ef434c4415e70c4b5e71b423043adb4ba059f89c99a1" -dependencies = [ - "libc", -] - [[package]] name = "simd-adler32" version = "0.3.7" @@ -3207,15 +2528,15 @@ checksum = "d66dc143e6b11c1eddc06d5c423cfc97062865baf299914ab64caa38182078fe" [[package]] name = "siphasher" -version = "0.3.10" +version = "0.3.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7bd3e3206899af3f8b12af284fafc038cc1dc2b41d1b89dd17297221c5d225de" +checksum = "38b58827f4464d87d377d175e90bf58eb00fd8716ff0a62f80356b5e61555d0d" [[package]] name = "slab" -version = "0.4.8" +version = "0.4.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6528351c9bc8ab22353f9d776db39a20288e8d6c37ef8cfe3317cf875eecfc2d" +checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" dependencies = [ "autocfg", ] @@ -3231,19 +2552,9 @@ dependencies = [ [[package]] name = "smallvec" -version = "1.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62bb4feee49fdd9f707ef802e22365a35de4b7b299de4763d44bfea899442ff9" - -[[package]] -name = "socket2" -version = "0.4.9" +version = "1.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64a4a911eed85daf18834cfaa86a79b7d266ff93ff5ba14005426219480ed662" -dependencies = [ - "libc", - "winapi", -] +checksum = "2593d31f82ead8df961d8bd23a64c2ccf2eb5dd34b0a34bfb4dd54011c72009e" [[package]] name = "soup2" @@ -3288,12 +2599,6 @@ dependencies = [ "loom", ] -[[package]] -name = "static_assertions" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" - [[package]] name = "string_cache" version = "0.8.7" @@ -3339,28 +2644,15 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.28" +version = "2.0.48" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04361975b3f5e348b2189d8dc55bc942f278b2d482a6a0365de5bdd62d351567" +checksum = "0f3531638e407dfc0814761abb7c00a5b54992b849452a0646b7f65c9f770f3f" dependencies = [ "proc-macro2", "quote", "unicode-ident", ] -[[package]] -name = "sys-locale" -version = "0.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8a11bd9c338fdba09f7881ab41551932ad42e405f61d01e8406baea71c07aee" -dependencies = [ - "js-sys", - "libc", - "wasm-bindgen", - "web-sys", - "windows-sys 0.45.0", -] - [[package]] name = "system-deps" version = "5.0.0" @@ -3376,22 +2668,22 @@ dependencies = [ [[package]] name = "system-deps" -version = "6.1.1" +version = "6.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30c2de8a4d8f4b823d634affc9cd2a74ec98c53a756f317e529a48046cbf71f3" +checksum = "2a2d580ff6a20c55dfb86be5f9c238f67835d0e81cbdea8bf5680e0897320331" dependencies = [ - "cfg-expr 0.15.4", + "cfg-expr 0.15.6", "heck 0.4.1", "pkg-config", - "toml 0.7.6", + "toml 0.8.8", "version-compare 0.1.1", ] [[package]] name = "tao" -version = "0.16.2" +version = "0.16.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a6d198e01085564cea63e976ad1566c1ba2c2e4cc79578e35d9f05521505e31" +checksum = "a4a63d2bc29b65703b33181526d6f67784a490970dae0a49525d4646b82782db" dependencies = [ "bitflags 1.3.2", "cairo-rs", @@ -3436,9 +2728,9 @@ dependencies = [ [[package]] name = "tao-macros" -version = "0.1.1" +version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b27a4bcc5eb524658234589bdffc7e7bfb996dbae6ce9393bfd39cb4159b445" +checksum = "ec114582505d158b669b136e6851f85840c109819d77c42bb7c0709f727d18c2" dependencies = [ "proc-macro2", "quote", @@ -3447,9 +2739,9 @@ dependencies = [ [[package]] name = "tar" -version = "0.4.39" +version = "0.4.40" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec96d2ffad078296368d46ff1cb309be1c23c513b4ab0e22a45de0185275ac96" +checksum = "b16afcea1f22891c49a00c751c7b63b2233284064f11a200fc624137c51e2ddb" dependencies = [ "filetime", "libc", @@ -3458,18 +2750,17 @@ dependencies = [ [[package]] name = "target-lexicon" -version = "0.12.11" +version = "0.12.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d0e916b1148c8e263850e1ebcbd046f333e0683c724876bb0da63ea4373dc8a" +checksum = "69758bda2e78f098e4ccb393021a0963bb3442eac05f135c30f61b7370bbafae" [[package]] name = "tauri" -version = "1.4.1" +version = "1.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7fbe522898e35407a8e60dc3870f7579fea2fc262a6a6072eccdd37ae1e1d91e" +checksum = "fd27c04b9543776a972c86ccf70660b517ecabbeced9fb58d8b961a13ad129af" dependencies = [ "anyhow", - "bytes", "cocoa", "dirs-next", "embed_plist", @@ -3482,26 +2773,17 @@ dependencies = [ "heck 0.4.1", "http", "ignore", - "notify-rust", "objc", "once_cell", - "open", - "os_info", - "os_pipe", "percent-encoding", "rand 0.8.5", "raw-window-handle", - "regex", - "reqwest", - "rfd", "semver", "serde", "serde_json", "serde_repr", "serialize-to-javascript", - "shared_child", "state", - "sys-locale", "tar", "tauri-macros", "tauri-runtime", @@ -3519,12 +2801,13 @@ dependencies = [ [[package]] name = "tauri-build" -version = "1.4.0" +version = "1.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d2edd6a259b5591c8efdeb9d5702cb53515b82a6affebd55c7fd6d3a27b7d1b" +checksum = "e9914a4715e0b75d9f387a285c7e26b5bbfeb1249ad9f842675a82481565c532" dependencies = [ "anyhow", "cargo_toml", + "dirs-next", "heck 0.4.1", "json-patch", "semver", @@ -3532,15 +2815,16 @@ dependencies = [ "serde_json", "tauri-utils", "tauri-winres", + "walkdir", ] [[package]] name = "tauri-codegen" -version = "1.4.0" +version = "1.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "54ad2d49fdeab4a08717f5b49a163bdc72efc3b1950b6758245fcde79b645e1a" +checksum = "a1554c5857f65dbc377cefb6b97c8ac77b1cb2a90d30d3448114d5d6b48a77fc" dependencies = [ - "base64 0.21.2", + "base64 0.21.7", "brotli", "ico", "json-patch", @@ -3548,23 +2832,22 @@ dependencies = [ "png", "proc-macro2", "quote", - "regex", "semver", "serde", "serde_json", "sha2", "tauri-utils", "thiserror", - "time 0.3.25", + "time", "uuid", "walkdir", ] [[package]] name = "tauri-macros" -version = "1.4.0" +version = "1.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8eb12a2454e747896929338d93b0642144bb51e0dddbb36e579035731f0d76b7" +checksum = "277abf361a3a6993ec16bcbb179de0d6518009b851090a01adfea12ac89fa875" dependencies = [ "heck 0.4.1", "proc-macro2", @@ -3576,9 +2859,9 @@ dependencies = [ [[package]] name = "tauri-runtime" -version = "0.14.0" +version = "0.14.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "108683199cb18f96d2d4134187bb789964143c845d2d154848dda209191fd769" +checksum = "cf2d0652aa2891ff3e9caa2401405257ea29ab8372cce01f186a5825f1bd0e76" dependencies = [ "gtk", "http", @@ -3597,9 +2880,9 @@ dependencies = [ [[package]] name = "tauri-runtime-wry" -version = "0.14.0" +version = "0.14.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b7aa256a1407a3a091b5d843eccc1a5042289baf0a43d1179d9f0fcfea37c1b" +checksum = "6cae61fbc731f690a4899681c9052dde6d05b159b44563ace8186fc1bfb7d158" dependencies = [ "cocoa", "gtk", @@ -3617,9 +2900,9 @@ dependencies = [ [[package]] name = "tauri-utils" -version = "1.4.0" +version = "1.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03fc02bb6072bb397e1d473c6f76c953cda48b4a2d0cce605df284aa74a12e84" +checksum = "ece74810b1d3d44f29f732a7ae09a63183d63949bbdd59c61f8ed2a1b70150db" dependencies = [ "brotli", "ctor", @@ -3629,9 +2912,10 @@ dependencies = [ "html5ever", "infer", "json-patch", - "kuchiki", + "kuchikiki", + "log", "memchr", - "phf 0.10.1", + "phf 0.11.2", "proc-macro2", "quote", "semver", @@ -3641,7 +2925,7 @@ dependencies = [ "thiserror", "url", "walkdir", - "windows 0.39.0", + "windows-version", ] [[package]] @@ -3651,30 +2935,20 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5993dc129e544393574288923d1ec447c857f3f644187f4fbf7d9a875fbfc4fb" dependencies = [ "embed-resource", - "toml 0.7.6", -] - -[[package]] -name = "tauri-winrt-notification" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4f5bff1d532fead7c43324a0fa33643b8621a47ce2944a633be4cb6c0240898f" -dependencies = [ - "quick-xml 0.23.1", - "windows 0.39.0", + "toml 0.7.8", ] [[package]] name = "tempfile" -version = "3.7.0" +version = "3.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5486094ee78b2e5038a6382ed7645bc084dc2ec433426ca4c3cb61e2007b8998" +checksum = "01ce4141aa927a6d1bd34a041795abd0db1cccba5d5f24b009f694bdf3a1f3fa" dependencies = [ "cfg-if", - "fastrand 2.0.0", - "redox_syscall 0.3.5", - "rustix 0.38.7", - "windows-sys 0.48.0", + "fastrand", + "redox_syscall", + "rustix", + "windows-sys 0.52.0", ] [[package]] @@ -3696,22 +2970,22 @@ checksum = "8eaa81235c7058867fa8c0e7314f33dcce9c215f535d1913822a2b3f5e289f3c" [[package]] name = "thiserror" -version = "1.0.44" +version = "1.0.56" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "611040a08a0439f8248d1990b111c95baa9c704c805fa1f62104b39655fd7f90" +checksum = "d54378c645627613241d077a3a79db965db602882668f9136ac42af9ecb730ad" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.44" +version = "1.0.56" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "090198534930841fab3a5d1bb637cde49e339654e606195f8d9c76eeb081dc96" +checksum = "fa0faa943b50f3db30a20aa7e265dbc66076993efed8463e8de414e5d06d3471" dependencies = [ "proc-macro2", "quote", - "syn 2.0.28", + "syn 2.0.48", ] [[package]] @@ -3726,23 +3000,13 @@ dependencies = [ [[package]] name = "time" -version = "0.1.45" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b797afad3f312d1c66a56d11d0316f916356d11bd158fbc6ca6389ff6bf805a" -dependencies = [ - "libc", - "wasi 0.10.0+wasi-snapshot-preview1", - "winapi", -] - -[[package]] -name = "time" -version = "0.3.25" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b0fdd63d58b18d663fbdf70e049f00a22c8e42be082203be7f26589213cd75ea" +checksum = "f657ba42c3f86e7680e53c8cd3af8abbe56b5491790b46e22e19c0d57463583e" dependencies = [ "deranged", - "itoa 1.0.9", + "itoa 1.0.10", + "powerfmt", "serde", "time-core", "time-macros", @@ -3750,15 +3014,15 @@ dependencies = [ [[package]] name = "time-core" -version = "0.1.1" +version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7300fbefb4dadc1af235a9cef3737cea692a9d97e1b9cbcd4ebdae6f8868e6fb" +checksum = "ef927ca75afb808a4d64dd374f00a2adf8d0fcff8e7b184af886c3c87ec4a3f3" [[package]] name = "time-macros" -version = "0.2.11" +version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eb71511c991639bb078fd5bf97757e03914361c48100d52878b8e52b46fb92cd" +checksum = "26197e33420244aeb70c3e8c78376ca46571bc4e701e4791c2cd9f57dcb3a43f" dependencies = [ "time-core", ] @@ -3780,82 +3044,65 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.29.1" +version = "1.35.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "532826ff75199d5833b9d2c5fe410f29235e25704ee5f0ef599fb51c21f4a4da" +checksum = "c89b4efa943be685f629b149f53829423f8f5531ea21249408e8e2f8671ec104" dependencies = [ - "autocfg", "backtrace", "bytes", - "libc", - "mio", "num_cpus", "pin-project-lite", - "socket2", - "windows-sys 0.48.0", -] - -[[package]] -name = "tokio-native-tls" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbae76ab933c85776efabc971569dd6119c580d8f5d448769dec1764bf796ef2" -dependencies = [ - "native-tls", - "tokio", ] [[package]] -name = "tokio-util" -version = "0.7.8" +name = "toml" +version = "0.5.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "806fe8c2c87eccc8b3267cbae29ed3ab2d0bd37fca70ab622e46aaa9375ddb7d" +checksum = "f4f7f0dd8d50a853a531c426359045b1998f04219d88799810762cd4ad314234" dependencies = [ - "bytes", - "futures-core", - "futures-sink", - "pin-project-lite", - "tokio", - "tracing", + "serde", ] [[package]] name = "toml" -version = "0.5.11" +version = "0.7.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f4f7f0dd8d50a853a531c426359045b1998f04219d88799810762cd4ad314234" +checksum = "dd79e69d3b627db300ff956027cc6c3798cef26d22526befdfcd12feeb6d2257" dependencies = [ "serde", + "serde_spanned", + "toml_datetime", + "toml_edit 0.19.15", ] [[package]] name = "toml" -version = "0.7.6" +version = "0.8.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c17e963a819c331dcacd7ab957d80bc2b9a9c1e71c804826d2f283dd65306542" +checksum = "a1a195ec8c9da26928f773888e0742ca3ca1040c6cd859c919c9f59c1954ab35" dependencies = [ "serde", "serde_spanned", "toml_datetime", - "toml_edit", + "toml_edit 0.21.0", ] [[package]] name = "toml_datetime" -version = "0.6.3" +version = "0.6.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7cda73e2f1397b1262d6dfdcef8aafae14d1de7748d66822d3bfeeb6d03e5e4b" +checksum = "3550f4e9685620ac18a50ed434eb3aec30db8ba93b0287467bca5826ea25baf1" dependencies = [ "serde", ] [[package]] name = "toml_edit" -version = "0.19.14" +version = "0.19.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8123f27e969974a3dfba720fdb560be359f57b44302d280ba72e76a74480e8a" +checksum = "1b5bb770da30e5cbfde35a2d7b9b8a2c4b8ef89548a7a6aeab5c9a576e3e7421" dependencies = [ - "indexmap 2.0.0", + "indexmap 2.1.0", "serde", "serde_spanned", "toml_datetime", @@ -3863,18 +3110,24 @@ dependencies = [ ] [[package]] -name = "tower-service" -version = "0.3.2" +name = "toml_edit" +version = "0.21.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6bc1c9ce2b5135ac7f93c72918fc37feb872bdc6a5533a8b85eb4b86bfdae52" +checksum = "d34d383cd00a163b4a5b85053df514d45bc330f6de7737edfe0a93311d1eaa03" +dependencies = [ + "indexmap 2.1.0", + "serde", + "serde_spanned", + "toml_datetime", + "winnow", +] [[package]] name = "tracing" -version = "0.1.37" +version = "0.1.40" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ce8c33a8d48bd45d624a6e523445fd21ec13d3653cd51f681abf67418f54eb8" +checksum = "c3523ab5a71916ccf420eebdf5521fcef02141234bbc0b8a49f2fdc4544364ef" dependencies = [ - "cfg-if", "pin-project-lite", "tracing-attributes", "tracing-core", @@ -3882,20 +3135,20 @@ dependencies = [ [[package]] name = "tracing-attributes" -version = "0.1.26" +version = "0.1.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f4f31f56159e98206da9efd823404b79b6ef3143b4a7ab76e67b1751b25a4ab" +checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.28", + "syn 2.0.48", ] [[package]] name = "tracing-core" -version = "0.1.31" +version = "0.1.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0955b8137a1df6f1a2e9a37d8a6656291ff0297c1a97c24e0d8425fe2312f79a" +checksum = "c06d3da6113f116aaee68e4d601191614c9053067f9ab7f6edbcb161237daa54" dependencies = [ "once_cell", "valuable", @@ -3903,20 +3156,20 @@ dependencies = [ [[package]] name = "tracing-log" -version = "0.1.3" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78ddad33d2d10b1ed7eb9d1f518a5674713876e97e5bb9b7345a7984fbb4f922" +checksum = "ee855f1f400bd0e5c02d150ae5de3840039a3f54b025156404e34c23c03f47c3" dependencies = [ - "lazy_static", "log", + "once_cell", "tracing-core", ] [[package]] name = "tracing-subscriber" -version = "0.3.17" +version = "0.3.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30a651bc37f915e81f087d86e62a18eec5f79550c7faff886f7090b4ea757c77" +checksum = "ad0f048c97dbd9faa9b7df56362b8ebcaa52adb06b498c050d2f4e32f90a7a8b" dependencies = [ "matchers", "nu-ansi-term", @@ -3939,39 +3192,23 @@ dependencies = [ "serde_json", ] -[[package]] -name = "try-lock" -version = "0.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3528ecfd12c466c6f163363caf2d02a71161dd5e1cc6ae7b34207ea2d42d81ed" - [[package]] name = "typenum" -version = "1.16.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "497961ef93d974e23eb6f433eb5fe1b7930b659f06d12dec6fc44a8f554c0bba" - -[[package]] -name = "uds_windows" -version = "1.0.2" +version = "1.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce65604324d3cce9b966701489fbd0cf318cb1f7bd9dd07ac9a4ee6fb791930d" -dependencies = [ - "tempfile", - "winapi", -] +checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" [[package]] name = "unicode-bidi" -version = "0.3.13" +version = "0.3.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92888ba5573ff080736b3648696b70cafad7d250551175acbaa4e0385b3e1460" +checksum = "08f95100a766bf4f8f28f90d77e0a5461bbdb219042e7679bebe79004fed8d75" [[package]] name = "unicode-ident" -version = "1.0.11" +version = "1.0.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "301abaae475aa91687eb82514b328ab47a211a533026cb25fc3e519b86adfc3c" +checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" [[package]] name = "unicode-normalization" @@ -3996,9 +3233,9 @@ checksum = "402bb19d8e03f1d1a7450e2bd613980869438e0666331be3e073089124aa1adc" [[package]] name = "url" -version = "2.4.0" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50bff7831e19200a85b17131d085c25d7811bc4e186efdaf54bbd132994a88cb" +checksum = "31e6302e3bb753d46e83516cae55ae196fc0c309407cf11ab35cc51a4c2a4633" dependencies = [ "form_urlencoded", "idna", @@ -4014,11 +3251,11 @@ checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9" [[package]] name = "uuid" -version = "1.4.1" +version = "1.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "79daa5ed5740825c40b389c5e50312b9c86df53fccd33f281df655642b43869d" +checksum = "5e395fcf16a7a3d8127ec99782007af141946b4795001f876d54fb0d55978560" dependencies = [ - "getrandom 0.2.10", + "getrandom 0.2.12", ] [[package]] @@ -4071,43 +3308,22 @@ dependencies = [ "libc", ] -[[package]] -name = "waker-fn" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d5b2c62b4012a3e1eca5a7e077d13b3bf498c4073e33ccd58626607748ceeca" - [[package]] name = "walkdir" -version = "2.3.3" +version = "2.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "36df944cda56c7d8d8b7496af378e6b16de9284591917d307c9b4d313c44e698" +checksum = "d71d857dc86794ca4c280d616f7da00d2dbfd8cd788846559a6813e6aa4b54ee" dependencies = [ "same-file", "winapi-util", ] -[[package]] -name = "want" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e" -dependencies = [ - "try-lock", -] - [[package]] name = "wasi" version = "0.9.0+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519" -[[package]] -name = "wasi" -version = "0.10.0+wasi-snapshot-preview1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a143597ca7c7793eff794def352d41792a93c481eb1042423ff7ff72ba2c31f" - [[package]] name = "wasi" version = "0.11.0+wasi-snapshot-preview1" @@ -4116,9 +3332,9 @@ checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" [[package]] name = "wasm-bindgen" -version = "0.2.87" +version = "0.2.90" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7706a72ab36d8cb1f80ffbf0e071533974a60d0a308d01a5d0375bf60499a342" +checksum = "b1223296a201415c7fad14792dbefaace9bd52b62d33453ade1c5b5f07555406" dependencies = [ "cfg-if", "wasm-bindgen-macro", @@ -4126,36 +3342,24 @@ dependencies = [ [[package]] name = "wasm-bindgen-backend" -version = "0.2.87" +version = "0.2.90" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ef2b6d3c510e9625e5fe6f509ab07d66a760f0885d858736483c32ed7809abd" +checksum = "fcdc935b63408d58a32f8cc9738a0bffd8f05cc7c002086c6ef20b7312ad9dcd" dependencies = [ "bumpalo", "log", "once_cell", "proc-macro2", "quote", - "syn 2.0.28", + "syn 2.0.48", "wasm-bindgen-shared", ] -[[package]] -name = "wasm-bindgen-futures" -version = "0.4.37" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c02dbc21516f9f1f04f187958890d7e6026df8d16540b7ad9492bc34a67cea03" -dependencies = [ - "cfg-if", - "js-sys", - "wasm-bindgen", - "web-sys", -] - [[package]] name = "wasm-bindgen-macro" -version = "0.2.87" +version = "0.2.90" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dee495e55982a3bd48105a7b947fd2a9b4a8ae3010041b9e0faab3f9cd028f1d" +checksum = "3e4c238561b2d428924c49815533a8b9121c664599558a5d9ec51f8a1740a999" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -4163,45 +3367,22 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.87" +version = "0.2.90" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "54681b18a46765f095758388f2d0cf16eb8d4169b639ab575a8f5693af210c7b" +checksum = "bae1abb6806dc1ad9e560ed242107c0f6c84335f1749dd4e8ddb012ebd5e25a7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.28", + "syn 2.0.48", "wasm-bindgen-backend", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.87" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca6ad05a4870b2bf5fe995117d3728437bd27d7cd5f06f13c17443ef369775a1" - -[[package]] -name = "wasm-streams" -version = "0.2.3" +version = "0.2.90" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6bbae3363c08332cadccd13b67db371814cd214c2524020932f0804b8cf7c078" -dependencies = [ - "futures-util", - "js-sys", - "wasm-bindgen", - "wasm-bindgen-futures", - "web-sys", -] - -[[package]] -name = "web-sys" -version = "0.3.64" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b85cbef8c220a6abc02aefd892dfc0fc23afb1c6a426316ec33253a3877249b" -dependencies = [ - "js-sys", - "wasm-bindgen", -] +checksum = "4d91413b1c31d7539ba5ef2451af3f0b833a005eb27a631cec32bc0635a8602b" [[package]] name = "webkit2gtk" @@ -4247,7 +3428,7 @@ dependencies = [ "pango-sys", "pkg-config", "soup2-sys", - "system-deps 6.1.1", + "system-deps 6.2.0", ] [[package]] @@ -4306,9 +3487,9 @@ checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" [[package]] name = "winapi-util" -version = "0.1.5" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70ec6ce85bb158151cae5e5c87f95a8e97d2c0c4b001223f33a334e3ce5de178" +checksum = "f29e6f9198ba0d26b4c9f07dbe6f9ed633e1f3d5b8b414090084349e46a52596" dependencies = [ "winapi", ] @@ -4319,19 +3500,6 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" -[[package]] -name = "windows" -version = "0.37.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57b543186b344cc61c85b5aab0d2e3adf4e0f99bc076eff9aa5927bcc0b8a647" -dependencies = [ - "windows_aarch64_msvc 0.37.0", - "windows_i686_gnu 0.37.0", - "windows_i686_msvc 0.37.0", - "windows_x86_64_gnu 0.37.0", - "windows_x86_64_msvc 0.37.0", -] - [[package]] name = "windows" version = "0.39.0" @@ -4352,7 +3520,7 @@ version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e686886bc078bc1b0b600cac0147aadb815089b6e4da64016cbd754b6342700f" dependencies = [ - "windows-targets 0.48.1", + "windows-targets 0.48.5", ] [[package]] @@ -4365,6 +3533,15 @@ dependencies = [ "windows-tokens", ] +[[package]] +name = "windows-core" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9" +dependencies = [ + "windows-targets 0.52.0", +] + [[package]] name = "windows-implement" version = "0.39.0" @@ -4383,65 +3560,50 @@ checksum = "9ee5e275231f07c6e240d14f34e1b635bf1faa1c76c57cfd59a5cdb9848e4278" [[package]] name = "windows-sys" -version = "0.42.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a3e1820f08b8513f676f7ab6c1f99ff312fb97b553d30ff4dd86f9f15728aa7" -dependencies = [ - "windows_aarch64_gnullvm 0.42.2", - "windows_aarch64_msvc 0.42.2", - "windows_i686_gnu 0.42.2", - "windows_i686_msvc 0.42.2", - "windows_x86_64_gnu 0.42.2", - "windows_x86_64_gnullvm 0.42.2", - "windows_x86_64_msvc 0.42.2", -] - -[[package]] -name = "windows-sys" -version = "0.45.0" +version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0" +checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" dependencies = [ - "windows-targets 0.42.2", + "windows-targets 0.48.5", ] [[package]] name = "windows-sys" -version = "0.48.0" +version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" +checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" dependencies = [ - "windows-targets 0.48.1", + "windows-targets 0.52.0", ] [[package]] name = "windows-targets" -version = "0.42.2" +version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e5180c00cd44c9b1c88adb3693291f1cd93605ded80c250a75d472756b4d071" +checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" dependencies = [ - "windows_aarch64_gnullvm 0.42.2", - "windows_aarch64_msvc 0.42.2", - "windows_i686_gnu 0.42.2", - "windows_i686_msvc 0.42.2", - "windows_x86_64_gnu 0.42.2", - "windows_x86_64_gnullvm 0.42.2", - "windows_x86_64_msvc 0.42.2", + "windows_aarch64_gnullvm 0.48.5", + "windows_aarch64_msvc 0.48.5", + "windows_i686_gnu 0.48.5", + "windows_i686_msvc 0.48.5", + "windows_x86_64_gnu 0.48.5", + "windows_x86_64_gnullvm 0.48.5", + "windows_x86_64_msvc 0.48.5", ] [[package]] name = "windows-targets" -version = "0.48.1" +version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05d4b17490f70499f20b9e791dcf6a299785ce8af4d709018206dc5b4953e95f" +checksum = "8a18201040b24831fbb9e4eb208f8892e1f50a37feb53cc7ff887feb8f50e7cd" dependencies = [ - "windows_aarch64_gnullvm 0.48.0", - "windows_aarch64_msvc 0.48.0", - "windows_i686_gnu 0.48.0", - "windows_i686_msvc 0.48.0", - "windows_x86_64_gnu 0.48.0", - "windows_x86_64_gnullvm 0.48.0", - "windows_x86_64_msvc 0.48.0", + "windows_aarch64_gnullvm 0.52.0", + "windows_aarch64_msvc 0.52.0", + "windows_i686_gnu 0.52.0", + "windows_i686_msvc 0.52.0", + "windows_x86_64_gnu 0.52.0", + "windows_x86_64_gnullvm 0.52.0", + "windows_x86_64_msvc 0.52.0", ] [[package]] @@ -4451,22 +3613,25 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f838de2fe15fe6bac988e74b798f26499a8b21a9d97edec321e79b28d1d7f597" [[package]] -name = "windows_aarch64_gnullvm" -version = "0.42.2" +name = "windows-version" +version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8" +checksum = "75aa004c988e080ad34aff5739c39d0312f4684699d6d71fc8a198d057b8b9b4" +dependencies = [ + "windows-targets 0.52.0", +] [[package]] name = "windows_aarch64_gnullvm" -version = "0.48.0" +version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91ae572e1b79dba883e0d315474df7305d12f569b400fcf90581b06062f7e1bc" +checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" [[package]] -name = "windows_aarch64_msvc" -version = "0.37.0" +name = "windows_aarch64_gnullvm" +version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2623277cb2d1c216ba3b578c0f3cf9cdebeddb6e66b1b218bb33596ea7769c3a" +checksum = "cb7764e35d4db8a7921e09562a0304bf2f93e0a51bfccee0bd0bb0b666b015ea" [[package]] name = "windows_aarch64_msvc" @@ -4476,21 +3641,15 @@ checksum = "ec7711666096bd4096ffa835238905bb33fb87267910e154b18b44eaabb340f2" [[package]] name = "windows_aarch64_msvc" -version = "0.42.2" +version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43" +checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" [[package]] name = "windows_aarch64_msvc" -version = "0.48.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2ef27e0d7bdfcfc7b868b317c1d32c641a6fe4629c171b8928c7b08d98d7cf3" - -[[package]] -name = "windows_i686_gnu" -version = "0.37.0" +version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3925fd0b0b804730d44d4b6278c50f9699703ec49bcd628020f46f4ba07d9e1" +checksum = "bbaa0368d4f1d2aaefc55b6fcfee13f41544ddf36801e793edbbfd7d7df075ef" [[package]] name = "windows_i686_gnu" @@ -4500,21 +3659,15 @@ checksum = "763fc57100a5f7042e3057e7e8d9bdd7860d330070251a73d003563a3bb49e1b" [[package]] name = "windows_i686_gnu" -version = "0.42.2" +version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f" +checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" [[package]] name = "windows_i686_gnu" -version = "0.48.0" +version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "622a1962a7db830d6fd0a69683c80a18fda201879f0f447f065a3b7467daa241" - -[[package]] -name = "windows_i686_msvc" -version = "0.37.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce907ac74fe331b524c1298683efbf598bb031bc84d5e274db2083696d07c57c" +checksum = "a28637cb1fa3560a16915793afb20081aba2c92ee8af57b4d5f28e4b3e7df313" [[package]] name = "windows_i686_msvc" @@ -4524,21 +3677,15 @@ checksum = "7bc7cbfe58828921e10a9f446fcaaf649204dcfe6c1ddd712c5eebae6bda1106" [[package]] name = "windows_i686_msvc" -version = "0.42.2" +version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060" +checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" [[package]] name = "windows_i686_msvc" -version = "0.48.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4542c6e364ce21bf45d69fdd2a8e455fa38d316158cfd43b3ac1c5b1b19f8e00" - -[[package]] -name = "windows_x86_64_gnu" -version = "0.37.0" +version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2babfba0828f2e6b32457d5341427dcbb577ceef556273229959ac23a10af33d" +checksum = "ffe5e8e31046ce6230cc7215707b816e339ff4d4d67c65dffa206fd0f7aa7b9a" [[package]] name = "windows_x86_64_gnu" @@ -4548,33 +3695,27 @@ checksum = "6868c165637d653ae1e8dc4d82c25d4f97dd6605eaa8d784b5c6e0ab2a252b65" [[package]] name = "windows_x86_64_gnu" -version = "0.42.2" +version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36" +checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" [[package]] name = "windows_x86_64_gnu" -version = "0.48.0" +version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca2b8a661f7628cbd23440e50b05d705db3686f894fc9580820623656af974b1" +checksum = "3d6fa32db2bc4a2f5abeacf2b69f7992cd09dca97498da74a151a3132c26befd" [[package]] name = "windows_x86_64_gnullvm" -version = "0.42.2" +version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3" +checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" [[package]] name = "windows_x86_64_gnullvm" -version = "0.48.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7896dbc1f41e08872e9d5e8f8baa8fdd2677f29468c4e156210174edc7f7b953" - -[[package]] -name = "windows_x86_64_msvc" -version = "0.37.0" +version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f4dd6dc7df2d84cf7b33822ed5b86318fb1781948e9663bacd047fc9dd52259d" +checksum = "1a657e1e9d3f514745a572a6846d3c7aa7dbe1658c056ed9c3344c4109a6949e" [[package]] name = "windows_x86_64_msvc" @@ -4584,49 +3725,40 @@ checksum = "5e4d40883ae9cae962787ca76ba76390ffa29214667a111db9e0a1ad8377e809" [[package]] name = "windows_x86_64_msvc" -version = "0.42.2" +version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0" +checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" [[package]] name = "windows_x86_64_msvc" -version = "0.48.0" +version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a515f5799fe4961cb532f983ce2b23082366b898e52ffbce459c86f67c8378a" +checksum = "dff9641d1cd4be8d1a070daf9e3773c5f67e78b4d9d42263020c057706765c04" [[package]] name = "winnow" -version = "0.5.4" +version = "0.5.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "acaaa1190073b2b101e15083c38ee8ec891b5e05cbee516521e94ec008f61e64" +checksum = "b7cf47b659b318dccbd69cc4797a39ae128f533dce7902a1096044d1967b9c16" dependencies = [ "memchr", ] [[package]] name = "winreg" -version = "0.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "80d0f4e272c85def139476380b12f9ac60926689dd2e01d4923222f40580869d" -dependencies = [ - "winapi", -] - -[[package]] -name = "winreg" -version = "0.11.0" +version = "0.51.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76a1a57ff50e9b408431e8f97d5456f2807f8eb2a2cd79b06068fc87f8ecf189" +checksum = "937f3df7948156640f46aacef17a70db0de5917bda9c92b0f751f3a955b588fc" dependencies = [ "cfg-if", - "winapi", + "windows-sys 0.48.0", ] [[package]] name = "wry" -version = "0.24.3" +version = "0.24.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33748f35413c8a98d45f7a08832d848c0c5915501803d1faade5a4ebcd258cea" +checksum = "6ad85d0e067359e409fcb88903c3eac817c392e5d638258abfb3da5ad8ba6fc4" dependencies = [ "base64 0.13.1", "block", @@ -4640,7 +3772,7 @@ dependencies = [ "gtk", "html5ever", "http", - "kuchiki", + "kuchikiki", "libc", "log", "objc", @@ -4683,123 +3815,31 @@ dependencies = [ [[package]] name = "xattr" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d1526bbe5aaeb5eb06885f4d987bcdfa5e23187055de9b83fe00156a821fabc" -dependencies = [ - "libc", -] - -[[package]] -name = "xdg-home" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2769203cd13a0c6015d515be729c526d041e9cf2c0cc478d57faee85f40c6dcd" -dependencies = [ - "nix", - "winapi", -] - -[[package]] -name = "zbus" -version = "3.14.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "31de390a2d872e4cd04edd71b425e29853f786dc99317ed72d73d6fcf5ebb948" -dependencies = [ - "async-broadcast", - "async-executor", - "async-fs", - "async-io", - "async-lock", - "async-process", - "async-recursion", - "async-task", - "async-trait", - "blocking", - "byteorder", - "derivative", - "enumflags2", - "event-listener", - "futures-core", - "futures-sink", - "futures-util", - "hex", - "nix", - "once_cell", - "ordered-stream", - "rand 0.8.5", - "serde", - "serde_repr", - "sha1", - "static_assertions", - "tracing", - "uds_windows", - "winapi", - "xdg-home", - "zbus_macros", - "zbus_names", - "zvariant", -] - -[[package]] -name = "zbus_macros" -version = "3.14.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41d1794a946878c0e807f55a397187c11fc7a038ba5d868e7db4f3bd7760bc9d" -dependencies = [ - "proc-macro-crate", - "proc-macro2", - "quote", - "regex", - "syn 1.0.109", - "zvariant_utils", -] - -[[package]] -name = "zbus_names" -version = "2.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fb80bb776dbda6e23d705cf0123c3b95df99c4ebeaec6c2599d4a5419902b4a9" -dependencies = [ - "serde", - "static_assertions", - "zvariant", -] - -[[package]] -name = "zvariant" -version = "3.15.0" +version = "1.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44b291bee0d960c53170780af148dca5fa260a63cdd24f1962fa82e03e53338c" +checksum = "8da84f1a25939b27f6820d92aed108f83ff920fdf11a7b19366c27c4cda81d4f" dependencies = [ - "byteorder", - "enumflags2", "libc", - "serde", - "static_assertions", - "zvariant_derive", + "linux-raw-sys", + "rustix", ] [[package]] -name = "zvariant_derive" -version = "3.15.0" +name = "zerocopy" +version = "0.7.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "934d7a7dfc310d6ee06c87ffe88ef4eca7d3e37bb251dece2ef93da8f17d8ecd" +checksum = "74d4d3961e53fa4c9a25a8637fc2bfaf2595b3d3ae34875568a5cf64787716be" dependencies = [ - "proc-macro-crate", - "proc-macro2", - "quote", - "syn 1.0.109", - "zvariant_utils", + "zerocopy-derive", ] [[package]] -name = "zvariant_utils" -version = "1.0.1" +name = "zerocopy-derive" +version = "0.7.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7234f0d811589db492d16893e3f21e8e2fd282e6d01b0cddee310322062cc200" +checksum = "9ce1b18ccd8e73a9321186f97e46f9f04b778851177567b1975109d26a08d2a6" dependencies = [ "proc-macro2", "quote", - "syn 1.0.109", + "syn 2.0.48", ] diff --git a/src-tauri/Cargo.toml b/src-tauri/Cargo.toml index c96c8942..1a8d796e 100644 --- a/src-tauri/Cargo.toml +++ b/src-tauri/Cargo.toml @@ -1,30 +1,38 @@ [package] -name = "app" +name = "compotes" version = "0.1.0" -description = "A Tauri App" -authors = [ "you" ] +description = "A bank operations dashboard" +authors = ["Alex \"Pierstoval\" Rock"] license = "" repository = "" -default-run = "app" -edition = "2018" +default-run = "compotes" +edition = "2021" +rust-version = "1.60" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [build-dependencies] -tauri-build = { version = "1.4", features = [] } +tauri-build = { version = "1.5.1", features = [] } [dependencies] +serde_json = "1.0" +serde = { version = "1.0", features = ["derive"] } +tauri = { version = "1.5.4", features = [] } + +#Custom deps: anyhow = "1.0" dirs = "5.0" regex = "1.9" -serde_json = "1.0" serde_rusqlite = { version = "0.31", features = [ ] } -serde = { version = "1.0", features = [ "derive" ] } sha2 = { version = "0.10", features = [ ] } chrono = { version = "0.4", features = [ "serde" ] } rusqlite_migration = { version = "1.0", features = [ ] } rusqlite = { version = "0.28", features = [ "bundled-full", "functions", "serde_json" ] } slugify = "0.1" -tauri = { version = "1.4", features = ["api-all"] } -tauri-codegen = { version = "1.4", features = [ ] } +#/Custom deps [features] +# this feature is used for production builds or when `devPath` points to the filesystem and the built-in dev server is disabled. +# If you use cargo directly instead of tauri's cli you can use this feature flag to switch between tauri's `dev` and `build` modes. +# DO NOT REMOVE!! custom-protocol = [ "tauri/custom-protocol" ] diff --git a/src-tauri/src/main.rs b/src-tauri/src/main.rs index 57a97e8e..69ed9700 100644 --- a/src-tauri/src/main.rs +++ b/src-tauri/src/main.rs @@ -81,5 +81,5 @@ fn main() { crate::commands::sync::sync, ]) .run(tauri::generate_context!()) - .expect("Error while running tauri application"); + .expect("Error while running Tauri application"); } diff --git a/src-tauri/tauri.conf.json b/src-tauri/tauri.conf.json index e6c65884..12a5fd1e 100644 --- a/src-tauri/tauri.conf.json +++ b/src-tauri/tauri.conf.json @@ -1,19 +1,27 @@ { + "$schema": "../node_modules/@tauri-apps/cli/schema.json", + "build": { + "beforeBuildCommand": "yarn run build", + "beforeDevCommand": "yarn run dev", + "devPath": "http://localhost:5173", + "distDir": "./target/frontend-build" + }, "package": { "productName": "compotes", "version": "0.1.0" }, - "build": { - "distDir": "./target/frontend-build", - "devPath": "http://127.0.0.1:5173", - "beforeDevCommand": "", - "beforeBuildCommand": "" - }, "tauri": { + "allowlist": { + "all": false + }, "bundle": { "active": true, - "targets": ["msi", "deb"], - "identifier": "io.orbitale.compotes", + "category": "DeveloperTool", + "copyright": "", + "deb": { + "depends": [] + }, + "externalBin": [], "icon": [ "icons/32x32.png", "icons/128x128.png", @@ -21,45 +29,38 @@ "icons/icon.icns", "icons/icon.ico" ], - "resources": [], - "externalBin": [], - "copyright": "", - "category": "DeveloperTool", - "shortDescription": "", + "identifier": "io.orbitale.compotes", "longDescription": "", - "deb": { - "depends": [] - }, "macOS": { - "frameworks": [], - "minimumSystemVersion": "", + "entitlements": null, "exceptionDomain": "", - "signingIdentity": null, - "entitlements": null + "frameworks": [], + "providerShortName": null, + "signingIdentity": null }, + "resources": [], + "shortDescription": "", + "targets": "all", "windows": { "certificateThumbprint": null, "digestAlgorithm": "sha256", "timestampUrl": "" } }, + "security": { + "csp": null + }, "updater": { "active": false }, - "allowlist": { - "all": true - }, "windows": [ { - "title": "Compotes", - "width": 1024, - "height": 800, + "fullscreen": false, + "height": 920, "resizable": true, - "fullscreen": false + "title": "Compotes", + "width": 1280 } - ], - "security": { - "csp": "default-src 'self'; style-src 'self' 'unsafe-inline'; img-src 'self' data:; object-src 'none'; require-trusted-types-for 'script';" - } + ] } } diff --git a/src/app.d.ts b/src/app.d.ts index 7090ee71..743f07b2 100644 --- a/src/app.d.ts +++ b/src/app.d.ts @@ -1,13 +1,13 @@ -/// - -// See https://kit.svelte.dev/docs/typescript +// See https://kit.svelte.dev/docs/types#app // for information about these interfaces -declare namespace App { - interface Locals {} - - interface Platform {} - - interface Session {} - - interface Stuff {} +declare global { + namespace App { + // interface Error {} + // interface Locals {} + // interface PageData {} + // interface PageState {} + // interface Platform {} + } } + +export {}; diff --git a/src/app.html b/src/app.html index 2fe5bfaf..9dd3c3bd 100644 --- a/src/app.html +++ b/src/app.html @@ -9,8 +9,6 @@ %sveltekit.head% - -
diff --git a/src/lib/admin/graph.svg b/src/lib/admin/graph.svg new file mode 100644 index 00000000..7832b11d --- /dev/null +++ b/src/lib/admin/graph.svg @@ -0,0 +1,4 @@ + + + +
CrudController
CrudController
List / Search
List / Search
Edit
Edit
New
New
Source
Source
User-based
User-based
Framework-based
Framework-based
Filters
Filters
Form
Form
Fields
Fields
Text is not SVG - cannot display
\ No newline at end of file diff --git a/src/lib/crud/Dashboard.ts b/src/lib/crud/Dashboard.ts new file mode 100644 index 00000000..c49386b4 --- /dev/null +++ b/src/lib/crud/Dashboard.ts @@ -0,0 +1,27 @@ +import Home from 'carbon-icons-svelte/lib/Home.svelte'; + +import { DashboardDefinition, UrlAction } from '@orbitale/svelte-admin'; + +export const dashboard = new DashboardDefinition({ + adminConfig: { + defaultLocale: 'en', + rootUrl: '/', + head: { + brandName: 'Compotes', + appName: '' + } + }, + + sideMenu: [ + new UrlAction('Homepage', '/', Home), + new UrlAction('Analytics', '/analytics'), + new UrlAction('Operations', '/operations'), + new UrlAction('Tag rules', '/tag-rules'), + new UrlAction('Tags', '/tags'), + new UrlAction('Triage', '/triage'), + new UrlAction('Bank accounts', '/bank-accounts'), + new UrlAction('Import', '/import'), + ], + + cruds: [] +}); diff --git a/src/lib/db/bank_accounts.ts b/src/lib/db/bank_accounts.ts index ba034819..8bc2ef61 100644 --- a/src/lib/db/bank_accounts.ts +++ b/src/lib/db/bank_accounts.ts @@ -21,10 +21,9 @@ export async function getBankAccounts(): Promise> { return await bank_accounts_promise; } - let res: string = await api_call('bank_account_find_all'); + const res: string = await api_call('bank_account_find_all'); - const bank_accounts = JSON.parse(res).map((data: object) => { - // @ts-ignore + const bank_accounts = JSON.parse(res).map((data: BankAccount) => { return new BankAccount(data.id, data.name, data.slug, data.currency); }); @@ -39,7 +38,7 @@ export async function getBankAccountsAsChoices(): Promise { return { name: bankAccount.name, - value: bankAccount.id + value: bankAccount.id.toString() }; }); } diff --git a/src/lib/utils/date.ts b/src/lib/utils/date.ts index 7c39573b..946dfa30 100644 --- a/src/lib/utils/date.ts +++ b/src/lib/utils/date.ts @@ -3,9 +3,9 @@ import { DateTime } from 'luxon'; export { DateTime }; export enum DateFormat { + DMY_SLASH = 'D/M/Y', YMD_SLASH = 'Y/M/D', YDM_SLASH = 'Y/D/M', - DMY_SLASH = 'D/M/Y', MDY_SLASH = 'M/D/Y', YMD_DASH = 'Y-M-D', YDM_DASH = 'Y-D-M', diff --git a/src/routes/(main)/+layout.svelte b/src/routes/(main)/+layout.svelte new file mode 100644 index 00000000..c02956f0 --- /dev/null +++ b/src/routes/(main)/+layout.svelte @@ -0,0 +1,26 @@ + + + + + diff --git a/src/routes/(main)/+layout.ts b/src/routes/(main)/+layout.ts new file mode 100644 index 00000000..c9ef340d --- /dev/null +++ b/src/routes/(main)/+layout.ts @@ -0,0 +1,3 @@ +export const trailingSlash = 'always'; + +export const prerender = true; diff --git a/src/routes/(main)/+page.server.ts b/src/routes/(main)/+page.server.ts new file mode 100644 index 00000000..189f71e2 --- /dev/null +++ b/src/routes/(main)/+page.server.ts @@ -0,0 +1 @@ +export const prerender = true; diff --git a/src/routes/(main)/+page.svelte b/src/routes/(main)/+page.svelte new file mode 100644 index 00000000..6835b425 --- /dev/null +++ b/src/routes/(main)/+page.svelte @@ -0,0 +1,17 @@ + + + +

{dashboard.adminConfig.head.brandName}

+ + +
diff --git a/src/routes/analytics/+page.svelte b/src/routes/(main)/analytics/+page.svelte similarity index 100% rename from src/routes/analytics/+page.svelte rename to src/routes/(main)/analytics/+page.svelte index e8cd9db6..b84f075f 100644 --- a/src/routes/analytics/+page.svelte +++ b/src/routes/(main)/analytics/+page.svelte @@ -1,7 +1,7 @@ + +

Import

+ +

Choose a format:

+ + + + diff --git a/src/routes/import/csv/+page.svelte b/src/routes/(main)/import/csv/+page.svelte similarity index 54% rename from src/routes/import/csv/+page.svelte rename to src/routes/(main)/import/csv/+page.svelte index b4fb38c6..6a6ad9ea 100644 --- a/src/routes/import/csv/+page.svelte +++ b/src/routes/(main)/import/csv/+page.svelte @@ -1,19 +1,38 @@ - -← Back to import -
+ onMount(async () => { + bankAccounts = await getBankAccounts(); + }); + -
-
- -
-
-
-
-
- -
- (Remember to refresh on any change) -
- -
- -
-
- -{#if loading} -
Loading…
-{/if} +
-

CSV parameters

- -
-
- -
- + + + + + +
+ (Remember to refresh on any change) +
+ + + +
+ {#if loading} + + + Loading… + + + {/if} +

CSV parameters

+ + + + -
-
- -
- -
- + + + + -
-
- -
- -
- + + + + -
-
-
-
-
- -
- -
-
- -
- - -
- -
- -
- + + + + + +
+ +
+
+ + + + + + + -
-
-
-
-
- -
- -

- Remember to sort these fields - manually in order to make sure CSV fields are parsed properly by the application. -

-
-
-
+ {#each bankAccounts as account} + + {/each} + + + + +
+
+ + + +

+ Remember to sort these fields + manually in order to make sure CSV fields are parsed properly by the application. +

+ +

{#if previewOperations.length}

Preview:

- - - - - {#each csvFields as field} - - {/each} - - - - {#each previewOperations as line, key} - - - {#each line as value} - + +
#{field}
{key}{value}
+ + + # + {#each csvFields as field} + {field} {/each} - - {/each} - -
+ + + + {#each previewOperations as line, key} + + + {key} + {#if key < numberOfLinesToRemove} + () + {/if} + + {#each line as value} + + {value} + {#if key < numberOfLinesToRemove} + () + {/if} + + {/each} + + {/each} + + + {/if} - diff --git a/src/routes/import/ofx/+page.svelte b/src/routes/(main)/import/ofx/+page.svelte similarity index 100% rename from src/routes/import/ofx/+page.svelte rename to src/routes/(main)/import/ofx/+page.svelte diff --git a/src/routes/(svelteadmin)/+layout.svelte b/src/routes/(svelteadmin)/+layout.svelte new file mode 100644 index 00000000..13e0e91e --- /dev/null +++ b/src/routes/(svelteadmin)/+layout.svelte @@ -0,0 +1 @@ + diff --git a/src/routes/(svelteadmin)/[crud]/[operation]/+page.server.ts b/src/routes/(svelteadmin)/[crud]/[operation]/+page.server.ts new file mode 100644 index 00000000..01edfaff --- /dev/null +++ b/src/routes/(svelteadmin)/[crud]/[operation]/+page.server.ts @@ -0,0 +1,19 @@ +import { dashboard } from '$lib/crud/Dashboard'; + +export const prerender = true; + +/** @type {import('../../../../../../.svelte-kit/types/src/routes').EntryGenerator} */ +export function entries() { + const routes = []; + + for (const crud of dashboard.cruds) { + for (const operation of crud.options.operations) { + routes.push({ + crud: crud.name, + operation: operation.name + }); + } + } + + return routes; +} diff --git a/src/routes/(svelteadmin)/[crud]/[operation]/+page.svelte b/src/routes/(svelteadmin)/[crud]/[operation]/+page.svelte new file mode 100644 index 00000000..4b953a08 --- /dev/null +++ b/src/routes/(svelteadmin)/[crud]/[operation]/+page.svelte @@ -0,0 +1,21 @@ + + +{#key $page} + +{/key} diff --git a/src/routes/import/+page.svelte b/src/routes/import/+page.svelte deleted file mode 100644 index cdcd0dd8..00000000 --- a/src/routes/import/+page.svelte +++ /dev/null @@ -1,20 +0,0 @@ -

Import

- -

Choose a format:

- -CSV -OFX - -

(OFX not implemented yet)

- - diff --git a/src/routes/+error.svelte b/src/routes/old/+error.svelte similarity index 100% rename from src/routes/+error.svelte rename to src/routes/old/+error.svelte diff --git a/src/routes/+layout.svelte b/src/routes/old/+layout.svelte similarity index 97% rename from src/routes/+layout.svelte rename to src/routes/old/+layout.svelte index 2cbef200..2debe55e 100644 --- a/src/routes/+layout.svelte +++ b/src/routes/old/+layout.svelte @@ -1,5 +1,4 @@ +
%sveltekit.body%
diff --git a/src/lib/admin/src/FilterWithValue.ts b/src/lib/admin/src/FilterWithValue.ts index 836a9c96..159309e1 100644 --- a/src/lib/admin/src/FilterWithValue.ts +++ b/src/lib/admin/src/FilterWithValue.ts @@ -16,7 +16,7 @@ export default class FilterWithValue { return new FilterWithValue(filter.name, filter.type, value); } - public static fromSerialized(filter: object): FilterWithValue { + public static fromSerialized(filter: Partial): FilterWithValue { if (!filter.name || !filter.type || !filter.value) { console.error('Serialized filter is incomplete', filter); diff --git a/src/lib/crud/Dashboard.ts b/src/lib/crud/Dashboard.ts index c49386b4..0c3179be 100644 --- a/src/lib/crud/Dashboard.ts +++ b/src/lib/crud/Dashboard.ts @@ -1,11 +1,12 @@ +import { DashboardDefinition, UrlAction } from '@orbitale/svelte-admin'; import Home from 'carbon-icons-svelte/lib/Home.svelte'; -import { DashboardDefinition, UrlAction } from '@orbitale/svelte-admin'; +import OperationCrud from '$lib/crud/cruds/OperationCrud'; export const dashboard = new DashboardDefinition({ adminConfig: { defaultLocale: 'en', - rootUrl: '/', + rootUrl: '/crud/', head: { brandName: 'Compotes', appName: '' @@ -15,13 +16,15 @@ export const dashboard = new DashboardDefinition({ sideMenu: [ new UrlAction('Homepage', '/', Home), new UrlAction('Analytics', '/analytics'), - new UrlAction('Operations', '/operations'), - new UrlAction('Tag rules', '/tag-rules'), - new UrlAction('Tags', '/tags'), - new UrlAction('Triage', '/triage'), - new UrlAction('Bank accounts', '/bank-accounts'), + new UrlAction('Operations', '/crud/operations/list'), + new UrlAction('Tag rules', '/crud/tag-rules/list'), + new UrlAction('Tags', '/crud/tags/list'), + new UrlAction('Triage', '/crud/triage/list'), + new UrlAction('Bank accounts', '/crud/bank-accounts/list'), new UrlAction('Import', '/import'), ], - cruds: [] + cruds: [ + OperationCrud, + ] }); diff --git a/src/lib/crud/cruds/OperationCrud.ts b/src/lib/crud/cruds/OperationCrud.ts new file mode 100644 index 00000000..2d72ff13 --- /dev/null +++ b/src/lib/crud/cruds/OperationCrud.ts @@ -0,0 +1,76 @@ +import { + CallbackStateProcessor, + CallbackStateProvider, CheckboxField, + CrudDefinition, DateField, + List, + NumberField, + PaginatedResults, + TextField, + UrlAction, + View +} from "@orbitale/svelte-admin"; +import type {CrudOperation} from "@orbitale/svelte-admin/dist/Crud/Operations"; +import type {RequestParameters} from "@orbitale/svelte-admin/dist/request"; +import {getOperationById, getOperations, getOperationsCount} from "$lib/db/operations"; +import type Operation from "$lib/entities/Operation"; + +export default new CrudDefinition('operations', { + defaultOperationName: "list", + label: {plural: "Operations", singular: "Operation"}, + // minStateLoadingTimeMs: 0, + + operations: [ + new List( + [ + new DateField('operation_date', 'Date'), + new TextField('op_type', 'Type 1'), + new TextField('type_display', 'Type 2'), + new TextField('details', 'Details'), + new TextField('tags', 'Tags'), + new NumberField('amount', 'Montant'), + ], + [ + new UrlAction('View', '/crud/operations/view'), + ], + { + pagination: { + enabled: true, + itemsPerPage: 20, + } + }), + new View([ + new TextField('id', 'ID'), + new DateField('operation_date', 'Date'), + new TextField('op_type', 'Type 1'), + new TextField('type_display', 'Type 2'), + new TextField('details', 'Details'), + new NumberField('amount_in_cents', 'Montant (in cents)'), + new NumberField('amount', 'Montant'), + new NumberField('hash', 'Hash'), + new TextField('state', 'State'), + new TextField('bank_account', 'Bank account'), + new TextField('tags', 'Tags'), + new CheckboxField('ignored_from_charts', 'Is ignored from charts'), + ]), + ], + + stateProvider: new CallbackStateProvider(async (operation: CrudOperation, requestParameters: RequestParameters) => { + if (typeof window === 'undefined') { + // SSR, can't call Tauri API then. + return Promise.resolve([]); + } + + if (operation.name === 'list') { + const results = await getOperations(requestParameters.page||1); + const numberOfItems = await getOperationsCount(null); + return Promise.resolve(new PaginatedResults(requestParameters.page, numberOfItems / operation.options.pagination.itemsPerPage, numberOfItems, results)); + } + + if (operation.name === 'view' || operation.name === 'edit') { + return getOperationById(requestParameters.id); + } + + return Promise.resolve(null); + }), + stateProcessor: new CallbackStateProcessor(() => {}) +}); diff --git a/src/lib/db/operations.ts b/src/lib/db/operations.ts index ffa35537..bf75fcc3 100644 --- a/src/lib/db/operations.ts +++ b/src/lib/db/operations.ts @@ -36,7 +36,7 @@ export async function getOperations( sortableField: SortableField | null = null, filters: Array | null = null ): Promise> { - const params = { page }; + const params: {[key: string]: number|string|Array} = { page }; if (sortableField) { params['orderField'] = sortableField.property_name; @@ -160,6 +160,11 @@ async function normalizeOperationFromDeserialized( deserialized_operation: DeserializedOperation ): Promise { const bank_account = await getBankAccountById(deserialized_operation.bank_account_id); + + if (!bank_account) { + throw new Error(`Backend could not find bank account with id "${deserialized_operation.bank_account_id}".`); + } + const tags = await getTagsByIds(deserialized_operation.tags_ids); return new Operation( diff --git a/src/lib/utils/configure_app.ts b/src/lib/utils/configure_app.ts deleted file mode 100644 index bb85128b..00000000 --- a/src/lib/utils/configure_app.ts +++ /dev/null @@ -1,116 +0,0 @@ -import OperationsSynchronizer from '$lib/struct/OperationsSynchronizer'; -import { getOperations, getTriageOperations } from '$lib/db/operations'; -import { updateConfig as updateAdminConfig } from '$lib/admin/src/config'; -import { getBankAccounts } from '$lib/db/bank_accounts'; -import SavedFilter from '$lib/admin/src/SavedFilter'; -import FilterWithValue from '$lib/admin/src/FilterWithValue'; -import FilterType from '$lib/admin/src/FilterType'; -import { DateTime } from 'luxon'; -import { getTags } from '$lib/db/tags'; -import { getTagRules } from '$lib/db/tag_rules'; - -const DATE_FORMAT = 'yyyy-MM-dd'; -const now = DateTime.now(); -const first_day_of_this_year = now.set({ months: 1, days: 1 }); -const last_day_of_this_year = now.set({ months: 12, days: 31 }); -const first_day_of_last_year = first_day_of_this_year.minus({ years: 1 }); -const last_day_of_last_year = last_day_of_this_year.minus({ years: 1 }); - -function splash_message(message): HTMLElement { - console.info(`Configuration log: "${message}".`); - let container = document.getElementById('splash_messages'); - if (!container) { - console.warn('Cannot add splash message when container is not present in the DOM.'); - return; - } - let textElement = document.createElement('div'); - textElement.style.opacity = '1'; - textElement.style.transition = 'opacity 2s linear 1s'; - textElement.innerText = message; - - let loaderElement = document.createElement('span'); - loaderElement.innerText = ' 🌘'; - loaderElement.style.marginLeft = '3px'; - loaderElement.style.display = 'inline-block'; - loaderElement.style.position = 'relative'; - loaderElement.classList.add('animate-rotation'); - loaderElement.addEventListener('message_end', () => { - loaderElement.classList.remove('animate-rotation'); - loaderElement.innerText = ' 🌝'; - textElement.style.opacity = '0'; - }); - textElement.appendChild(loaderElement); - - container.appendChild(textElement); - - return loaderElement; -} - -function disable_message(element: HTMLElement) { - if (!element) { - console.warn('Cannot disable message for inexistent element.'); - return; - } - element.dispatchEvent(new Event('message_end')); -} - -export default async function configure() { - let e; - - console.info('Configuring...'); - - e = splash_message('Configuring administration panel'); - updateAdminConfig({ - spinLoaderSrc: '/logo.svg', - builtinFilters: { - operations: [ - new SavedFilter('', []), - new SavedFilter('', [ - new FilterWithValue( - 'operation_date', - FilterType.date, - first_day_of_this_year.toFormat(DATE_FORMAT) + - ';' + - last_day_of_this_year.toFormat(DATE_FORMAT) - ) - ]), - new SavedFilter('', [ - new FilterWithValue( - 'operation_date', - FilterType.date, - first_day_of_last_year.toFormat(DATE_FORMAT) + - ';' + - last_day_of_last_year.toFormat(DATE_FORMAT) - ) - ]) - ] - } - }); - disable_message(e); - - // Preload everything - e = splash_message('Configuring synchronization'); - OperationsSynchronizer.clearSyncCallbacks(); - OperationsSynchronizer.addAfterSyncCallback(getOperations); - OperationsSynchronizer.addAfterSyncCallback(getTriageOperations); - OperationsSynchronizer.addAfterSyncCallback(getBankAccounts); - OperationsSynchronizer.addAfterSyncCallback(getTags); - OperationsSynchronizer.addAfterSyncCallback(getTagRules); - disable_message(e); - - let splash_enabled = document.getElementById('splash_enabled'); - if (splash_enabled) splash_enabled.classList.remove('splash_enabled'); - - document.getElementById('app').style.display = ''; - - let splash_screen = document.getElementById('splash_screen'); - if (splash_screen) { - splash_screen.style.opacity = '0'; - - setTimeout(function () { - splash_screen.style.display = 'none'; - splash_screen.style.visibility = 'hidden'; - }, 500); - } - console.info('Finished configuring ✔'); -} diff --git a/src/routes/(main)/+layout.svelte b/src/routes/(main)/+layout.svelte index c02956f0..8d97993f 100644 --- a/src/routes/(main)/+layout.svelte +++ b/src/routes/(main)/+layout.svelte @@ -1,24 +1,5 @@ diff --git a/src/routes/(main)/+page.svelte b/src/routes/(main)/+page.svelte index 6835b425..90f7c264 100644 --- a/src/routes/(main)/+page.svelte +++ b/src/routes/(main)/+page.svelte @@ -8,7 +8,7 @@
    {#each dashboard.cruds as crud}
  • - + {crud.options.label.plural}
  • diff --git a/src/routes/(svelteadmin)/[crud]/[operation]/+page.server.ts b/src/routes/(svelteadmin)/crud/[crud]/[operation]/+page.server.ts similarity index 100% rename from src/routes/(svelteadmin)/[crud]/[operation]/+page.server.ts rename to src/routes/(svelteadmin)/crud/[crud]/[operation]/+page.server.ts diff --git a/src/routes/(svelteadmin)/[crud]/[operation]/+page.svelte b/src/routes/(svelteadmin)/crud/[crud]/[operation]/+page.svelte similarity index 84% rename from src/routes/(svelteadmin)/[crud]/[operation]/+page.svelte rename to src/routes/(svelteadmin)/crud/[crud]/[operation]/+page.svelte index 4b953a08..6472f498 100644 --- a/src/routes/(svelteadmin)/[crud]/[operation]/+page.svelte +++ b/src/routes/(svelteadmin)/crud/[crud]/[operation]/+page.svelte @@ -10,6 +10,8 @@ $: requestParameters = getRequestParams($page, browser); +
    URL: {$page.url}
    + {#key $page} Date: Sat, 20 Jan 2024 18:25:16 +0100 Subject: [PATCH 03/19] Add bank accounts, prepare its crud --- src-tauri/Cargo.lock | 8 +-- .../src/commands/bank_account_get_by_id.rs | 19 +++++++ src-tauri/src/entities/bank_accounts.rs | 29 +++++++++++ src-tauri/src/main.rs | 2 + src/lib/crud/Dashboard.ts | 2 + src/lib/crud/cruds/BankAccountsCrud.ts | 51 +++++++++++++++++++ src/lib/crud/cruds/TagRulesCrud.ts | 0 src/lib/crud/cruds/TagsCrud.ts | 0 src/lib/crud/cruds/TriageCrud.ts | 0 src/lib/db/bank_accounts.ts | 37 +++++--------- 10 files changed, 119 insertions(+), 29 deletions(-) create mode 100644 src-tauri/src/commands/bank_account_get_by_id.rs create mode 100644 src/lib/crud/cruds/BankAccountsCrud.ts create mode 100644 src/lib/crud/cruds/TagRulesCrud.ts create mode 100644 src/lib/crud/cruds/TagsCrud.ts create mode 100644 src/lib/crud/cruds/TriageCrud.ts diff --git a/src-tauri/Cargo.lock b/src-tauri/Cargo.lock index 8236e75e..a48e8387 100644 --- a/src-tauri/Cargo.lock +++ b/src-tauri/Cargo.lock @@ -2552,9 +2552,9 @@ dependencies = [ [[package]] name = "smallvec" -version = "1.12.0" +version = "1.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2593d31f82ead8df961d8bd23a64c2ccf2eb5dd34b0a34bfb4dd54011c72009e" +checksum = "e6ecd384b10a64542d77071bd64bd7b231f4ed5940fba55e98c3de13824cf3d7" [[package]] name = "soup2" @@ -3251,9 +3251,9 @@ checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9" [[package]] name = "uuid" -version = "1.6.1" +version = "1.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e395fcf16a7a3d8127ec99782007af141946b4795001f876d54fb0d55978560" +checksum = "f00cc9702ca12d3c81455259621e676d0f7251cec66a21e98fe2e9a37db93b2a" dependencies = [ "getrandom 0.2.12", ] diff --git a/src-tauri/src/commands/bank_account_get_by_id.rs b/src-tauri/src/commands/bank_account_get_by_id.rs new file mode 100644 index 00000000..6188ffea --- /dev/null +++ b/src-tauri/src/commands/bank_account_get_by_id.rs @@ -0,0 +1,19 @@ +use crate::entities::bank_accounts; +use rusqlite::Connection; +use std::ops::Deref; +use std::sync::Mutex; +use tauri::State; + +#[tauri::command] +pub(crate) fn bank_account_get_by_id(conn_state: State<'_, Mutex>, id: String) -> String { + let conn = conn_state + .inner() + .lock() + .expect("Could not retrieve database connection"); + let conn = conn.deref(); + + let id_as_u32: u32 = id.parse().unwrap(); + + serde_json::to_string(&bank_accounts::get_by_id(conn, id_as_u32)) + .expect("Could not serialize BankAccount properly") +} diff --git a/src-tauri/src/entities/bank_accounts.rs b/src-tauri/src/entities/bank_accounts.rs index cb7bb1c2..868fdf12 100644 --- a/src-tauri/src/entities/bank_accounts.rs +++ b/src-tauri/src/entities/bank_accounts.rs @@ -50,6 +50,35 @@ pub(crate) fn find_all(conn: &Connection) -> Vec { bank_accounts } +pub(crate) fn get_by_id(conn: &Connection, id: u32) -> BankAccount { + let mut stmt = conn + .prepare( + " + SELECT + id, + name, + slug, + currency + FROM bank_accounts + WHERE id = :id + ", + ) + .expect("Could not fetch bank account"); + + let mut rows = stmt + .query(named_params! { + ":id": &id, + }) + .expect("Could not execute query to fetch an bank account by id."); + + let row = rows + .next() + .expect("Could not retrieve query rows.") + .expect("No bank account found with this ID."); + + serde_rusqlite::from_row::(row).unwrap() +} + pub(crate) fn create(conn: &Connection, bank_account: BankAccount) -> i64 { if bank_account.id != 0 { panic!("Cannot create a bank account that already has an ID"); diff --git a/src-tauri/src/main.rs b/src-tauri/src/main.rs index 69ed9700..78b09393 100644 --- a/src-tauri/src/main.rs +++ b/src-tauri/src/main.rs @@ -11,6 +11,7 @@ mod migrations; mod commands { pub(crate) mod bank_account_create; pub(crate) mod bank_account_find_all; + pub(crate) mod bank_account_get_by_id; pub(crate) mod bank_account_update; pub(crate) mod import_operations; pub(crate) mod operation_delete; @@ -69,6 +70,7 @@ fn main() { crate::commands::operations_get_triage::operations_get_triage, crate::commands::operations_get_triage_count::operations_get_triage_count, crate::commands::bank_account_find_all::bank_account_find_all, + crate::commands::bank_account_get_by_id::bank_account_get_by_id, crate::commands::bank_account_create::bank_account_create, crate::commands::bank_account_update::bank_account_update, crate::commands::tags_get::tags_get, diff --git a/src/lib/crud/Dashboard.ts b/src/lib/crud/Dashboard.ts index 0c3179be..11d2679a 100644 --- a/src/lib/crud/Dashboard.ts +++ b/src/lib/crud/Dashboard.ts @@ -2,6 +2,7 @@ import { DashboardDefinition, UrlAction } from '@orbitale/svelte-admin'; import Home from 'carbon-icons-svelte/lib/Home.svelte'; import OperationCrud from '$lib/crud/cruds/OperationCrud'; +import BankAccountsCrud from "$lib/crud/cruds/BankAccountsCrud"; export const dashboard = new DashboardDefinition({ adminConfig: { @@ -26,5 +27,6 @@ export const dashboard = new DashboardDefinition({ cruds: [ OperationCrud, + BankAccountsCrud, ] }); diff --git a/src/lib/crud/cruds/BankAccountsCrud.ts b/src/lib/crud/cruds/BankAccountsCrud.ts new file mode 100644 index 00000000..6bc424b3 --- /dev/null +++ b/src/lib/crud/cruds/BankAccountsCrud.ts @@ -0,0 +1,51 @@ +import { + CallbackStateProcessor, + CallbackStateProvider, + CrudDefinition, Edit, + List, + TextField, + UrlAction, +} from "@orbitale/svelte-admin"; +import type {CrudBankAccount} from "@orbitale/svelte-admin/dist/Crud/BankAccounts"; +import type {RequestParameters} from "@orbitale/svelte-admin/dist/request"; +import {getBankAccountById, getBankAccounts} from "$lib/db/bank_accounts"; +import type BankAccount from "$lib/entities/BankAccount"; + +const baseFields = [ + new TextField('name', 'Name'), + new TextField('slug', 'Identifier'), + new TextField('currency', 'Currency'), +]; + +export default new CrudDefinition('bank-accounts', { + defaultOperationName: "list", + label: {plural: "BankAccounts", singular: "BankAccount"}, + // minStateLoadingTimeMs: 0, + + operations: [ + new List([...baseFields], + [ + new UrlAction('Edit', '/crud/bank-accounts/edit'), + ]), + new Edit(baseFields), + ], + + stateProvider: new CallbackStateProvider(async (bankAccount: CrudBankAccount, requestParameters: RequestParameters) => { + if (typeof window === 'undefined') { + // SSR, can't call Tauri API then. + return Promise.resolve([]); + } + + if (bankAccount.name === 'list') { + const results = await getBankAccounts(requestParameters.page||1); + return Promise.resolve(results); + } + + if (bankAccount.name === 'view' || bankAccount.name === 'edit') { + return getBankAccountById(requestParameters.id); + } + + return Promise.resolve(null); + }), + stateProcessor: new CallbackStateProcessor(() => {}) +}); diff --git a/src/lib/crud/cruds/TagRulesCrud.ts b/src/lib/crud/cruds/TagRulesCrud.ts new file mode 100644 index 00000000..e69de29b diff --git a/src/lib/crud/cruds/TagsCrud.ts b/src/lib/crud/cruds/TagsCrud.ts new file mode 100644 index 00000000..e69de29b diff --git a/src/lib/crud/cruds/TriageCrud.ts b/src/lib/crud/cruds/TriageCrud.ts new file mode 100644 index 00000000..e69de29b diff --git a/src/lib/db/bank_accounts.ts b/src/lib/db/bank_accounts.ts index 8bc2ef61..abc7412a 100644 --- a/src/lib/db/bank_accounts.ts +++ b/src/lib/db/bank_accounts.ts @@ -1,26 +1,13 @@ -// @ts-ignore import BankAccount from '$lib/entities/BankAccount'; import api_call from '$lib/utils/api_call'; import { writable } from 'svelte/store'; import type { Writable } from 'svelte/store'; +import DeserializedOperation from "$lib/db/operations"; +import BankAccountsCrud from "$lib/crud/cruds/BankAccountsCrud"; export const bankAccountsStore: Writable = writable(); -let bank_accounts_promise: Promise | null = null; - -async function getBankAccountPromise(): Promise> { - if (!bank_accounts_promise) { - bank_accounts_promise = getBankAccounts(); - } - - return bank_accounts_promise; -} - export async function getBankAccounts(): Promise> { - if (bank_accounts_promise) { - return await bank_accounts_promise; - } - const res: string = await api_call('bank_account_find_all'); const bank_accounts = JSON.parse(res).map((data: BankAccount) => { @@ -44,15 +31,19 @@ export async function getBankAccountsAsChoices(): Promise { - const bank_accounts = await getBankAccountPromise(); + const res: string = await api_call('bank_account_get_by_id', { id: id.toString() }); + + if (!res) { + throw 'No results from the API'; + } - for (const bank_account of bank_accounts) { - if (bank_account.id === id) { - return bank_account; - } + const bank_account: BankAccount = JSON.parse(res); + + if (!bank_account) { + throw new Error('Could not deserialize bank account.'); } - return null; + return bank_account; } export async function createBankAccount(bank_account: BankAccount): Promise { @@ -61,8 +52,6 @@ export async function createBankAccount(bank_account: BankAccount): Promise Date: Mon, 22 Jan 2024 16:52:01 +0100 Subject: [PATCH 04/19] Allow updating bank accounts --- src/lib/crud/cruds/BankAccountsCrud.ts | 31 +++++++++++++++++++------- 1 file changed, 23 insertions(+), 8 deletions(-) diff --git a/src/lib/crud/cruds/BankAccountsCrud.ts b/src/lib/crud/cruds/BankAccountsCrud.ts index 6bc424b3..4f5d3cba 100644 --- a/src/lib/crud/cruds/BankAccountsCrud.ts +++ b/src/lib/crud/cruds/BankAccountsCrud.ts @@ -8,12 +8,16 @@ import { } from "@orbitale/svelte-admin"; import type {CrudBankAccount} from "@orbitale/svelte-admin/dist/Crud/BankAccounts"; import type {RequestParameters} from "@orbitale/svelte-admin/dist/request"; -import {getBankAccountById, getBankAccounts} from "$lib/db/bank_accounts"; +import {createBankAccount, getBankAccountById, getBankAccounts, updateBankAccount} from "$lib/db/bank_accounts"; import type BankAccount from "$lib/entities/BankAccount"; +import type {CrudOperation} from "@orbitale/svelte-admin/dist/Crud/Operations"; +import type {StateProcessorInput} from "@orbitale/svelte-admin/dist/State/Processor"; +import {goto} from "$app/navigation"; +import {success} from "$lib/utils/message"; const baseFields = [ new TextField('name', 'Name'), - new TextField('slug', 'Identifier'), + new TextField('slug', 'Identifier', {disabled: true}), new TextField('currency', 'Currency'), ]; @@ -30,22 +34,33 @@ export default new CrudDefinition('bank-accounts', { new Edit(baseFields), ], - stateProvider: new CallbackStateProvider(async (bankAccount: CrudBankAccount, requestParameters: RequestParameters) => { + stateProvider: new CallbackStateProvider(async (operation: CrudBankAccount, requestParameters: RequestParameters) => { if (typeof window === 'undefined') { // SSR, can't call Tauri API then. return Promise.resolve([]); } - if (bankAccount.name === 'list') { - const results = await getBankAccounts(requestParameters.page||1); - return Promise.resolve(results); + if (operation.name === 'list') { + return getBankAccounts(); } - if (bankAccount.name === 'view' || bankAccount.name === 'edit') { + if (operation.name === 'view' || operation.name === 'edit') { return getBankAccountById(requestParameters.id); } return Promise.resolve(null); }), - stateProcessor: new CallbackStateProcessor(() => {}) + stateProcessor: new CallbackStateProcessor(async (data: StateProcessorInput, operation: CrudOperation, requestParameters: RequestParameters) => { + if (operation.name === 'new') { + return createBankAccount(data); + } + + if (operation.name === 'edit') { + data.id = parseInt(requestParameters.id, 10); + await updateBankAccount(data); + success('Success!'); + await goto('/crud/bank-accounts/list'); + return; + } + }) }); From 72a91759728766ee8d78caf85c170b908d44cf4a Mon Sep 17 00:00:00 2001 From: Alex Rock Ancelet Date: Mon, 22 Jan 2024 16:52:21 +0100 Subject: [PATCH 05/19] Disable some yet-to-be-activated routes --- src/lib/crud/Dashboard.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/lib/crud/Dashboard.ts b/src/lib/crud/Dashboard.ts index 11d2679a..3b3d32be 100644 --- a/src/lib/crud/Dashboard.ts +++ b/src/lib/crud/Dashboard.ts @@ -16,11 +16,11 @@ export const dashboard = new DashboardDefinition({ sideMenu: [ new UrlAction('Homepage', '/', Home), - new UrlAction('Analytics', '/analytics'), + // new UrlAction('Analytics', '/analytics'), new UrlAction('Operations', '/crud/operations/list'), - new UrlAction('Tag rules', '/crud/tag-rules/list'), - new UrlAction('Tags', '/crud/tags/list'), - new UrlAction('Triage', '/crud/triage/list'), + // new UrlAction('Tag rules', '/crud/tag-rules/list'), + // new UrlAction('Tags', '/crud/tags/list'), + // new UrlAction('Triage', '/crud/triage/list'), new UrlAction('Bank accounts', '/crud/bank-accounts/list'), new UrlAction('Import', '/import'), ], From 281db1d2895c6e1f71fe62b4987c1be9bf508407 Mon Sep 17 00:00:00 2001 From: Alex Rock Ancelet Date: Mon, 22 Jan 2024 16:52:39 +0100 Subject: [PATCH 06/19] Move old routes to a non-routed dir to avoid Svelte from trying to render them --- src/{routes/old => old_routes}/+error.svelte | 0 src/{routes/old => old_routes}/+layout.svelte | 0 src/{routes/old => old_routes}/+layout.ts | 0 src/{routes/old => old_routes}/+page.svelte | 0 src/{routes/(main) => old_routes}/analytics/+page.svelte | 0 src/{routes/old => old_routes}/bank-accounts/+page.svelte | 0 src/{routes/old => old_routes}/bank-accounts/edit/[id]/+layout.ts | 0 .../old => old_routes}/bank-accounts/edit/[id]/+page.svelte | 0 src/{routes/old => old_routes}/bank-accounts/new/+page.svelte | 0 src/{routes/old => old_routes}/operations/+page.svelte | 0 src/{routes/old => old_routes}/operations/edit/[id]/+layout.ts | 0 src/{routes/old => old_routes}/operations/edit/[id]/+page.svelte | 0 .../old => old_routes}/operations/edit/triage-[id]/+layout.ts | 0 .../old => old_routes}/operations/edit/triage-[id]/+page.svelte | 0 src/{routes/old => old_routes}/tag-rules/+page.svelte | 0 src/{routes/old => old_routes}/tag-rules/edit/[id]/+layout.ts | 0 src/{routes/old => old_routes}/tag-rules/edit/[id]/+page.svelte | 0 src/{routes/old => old_routes}/tag-rules/new/+page.svelte | 0 src/{routes/old => old_routes}/tags/+page.svelte | 0 src/{routes/old => old_routes}/tags/edit/[id]/+layout.ts | 0 src/{routes/old => old_routes}/tags/edit/[id]/+page.svelte | 0 src/{routes/old => old_routes}/tags/new/+page.svelte | 0 src/{routes/old => old_routes}/triage/+page.svelte | 0 23 files changed, 0 insertions(+), 0 deletions(-) rename src/{routes/old => old_routes}/+error.svelte (100%) rename src/{routes/old => old_routes}/+layout.svelte (100%) rename src/{routes/old => old_routes}/+layout.ts (100%) rename src/{routes/old => old_routes}/+page.svelte (100%) rename src/{routes/(main) => old_routes}/analytics/+page.svelte (100%) rename src/{routes/old => old_routes}/bank-accounts/+page.svelte (100%) rename src/{routes/old => old_routes}/bank-accounts/edit/[id]/+layout.ts (100%) rename src/{routes/old => old_routes}/bank-accounts/edit/[id]/+page.svelte (100%) rename src/{routes/old => old_routes}/bank-accounts/new/+page.svelte (100%) rename src/{routes/old => old_routes}/operations/+page.svelte (100%) rename src/{routes/old => old_routes}/operations/edit/[id]/+layout.ts (100%) rename src/{routes/old => old_routes}/operations/edit/[id]/+page.svelte (100%) rename src/{routes/old => old_routes}/operations/edit/triage-[id]/+layout.ts (100%) rename src/{routes/old => old_routes}/operations/edit/triage-[id]/+page.svelte (100%) rename src/{routes/old => old_routes}/tag-rules/+page.svelte (100%) rename src/{routes/old => old_routes}/tag-rules/edit/[id]/+layout.ts (100%) rename src/{routes/old => old_routes}/tag-rules/edit/[id]/+page.svelte (100%) rename src/{routes/old => old_routes}/tag-rules/new/+page.svelte (100%) rename src/{routes/old => old_routes}/tags/+page.svelte (100%) rename src/{routes/old => old_routes}/tags/edit/[id]/+layout.ts (100%) rename src/{routes/old => old_routes}/tags/edit/[id]/+page.svelte (100%) rename src/{routes/old => old_routes}/tags/new/+page.svelte (100%) rename src/{routes/old => old_routes}/triage/+page.svelte (100%) diff --git a/src/routes/old/+error.svelte b/src/old_routes/+error.svelte similarity index 100% rename from src/routes/old/+error.svelte rename to src/old_routes/+error.svelte diff --git a/src/routes/old/+layout.svelte b/src/old_routes/+layout.svelte similarity index 100% rename from src/routes/old/+layout.svelte rename to src/old_routes/+layout.svelte diff --git a/src/routes/old/+layout.ts b/src/old_routes/+layout.ts similarity index 100% rename from src/routes/old/+layout.ts rename to src/old_routes/+layout.ts diff --git a/src/routes/old/+page.svelte b/src/old_routes/+page.svelte similarity index 100% rename from src/routes/old/+page.svelte rename to src/old_routes/+page.svelte diff --git a/src/routes/(main)/analytics/+page.svelte b/src/old_routes/analytics/+page.svelte similarity index 100% rename from src/routes/(main)/analytics/+page.svelte rename to src/old_routes/analytics/+page.svelte diff --git a/src/routes/old/bank-accounts/+page.svelte b/src/old_routes/bank-accounts/+page.svelte similarity index 100% rename from src/routes/old/bank-accounts/+page.svelte rename to src/old_routes/bank-accounts/+page.svelte diff --git a/src/routes/old/bank-accounts/edit/[id]/+layout.ts b/src/old_routes/bank-accounts/edit/[id]/+layout.ts similarity index 100% rename from src/routes/old/bank-accounts/edit/[id]/+layout.ts rename to src/old_routes/bank-accounts/edit/[id]/+layout.ts diff --git a/src/routes/old/bank-accounts/edit/[id]/+page.svelte b/src/old_routes/bank-accounts/edit/[id]/+page.svelte similarity index 100% rename from src/routes/old/bank-accounts/edit/[id]/+page.svelte rename to src/old_routes/bank-accounts/edit/[id]/+page.svelte diff --git a/src/routes/old/bank-accounts/new/+page.svelte b/src/old_routes/bank-accounts/new/+page.svelte similarity index 100% rename from src/routes/old/bank-accounts/new/+page.svelte rename to src/old_routes/bank-accounts/new/+page.svelte diff --git a/src/routes/old/operations/+page.svelte b/src/old_routes/operations/+page.svelte similarity index 100% rename from src/routes/old/operations/+page.svelte rename to src/old_routes/operations/+page.svelte diff --git a/src/routes/old/operations/edit/[id]/+layout.ts b/src/old_routes/operations/edit/[id]/+layout.ts similarity index 100% rename from src/routes/old/operations/edit/[id]/+layout.ts rename to src/old_routes/operations/edit/[id]/+layout.ts diff --git a/src/routes/old/operations/edit/[id]/+page.svelte b/src/old_routes/operations/edit/[id]/+page.svelte similarity index 100% rename from src/routes/old/operations/edit/[id]/+page.svelte rename to src/old_routes/operations/edit/[id]/+page.svelte diff --git a/src/routes/old/operations/edit/triage-[id]/+layout.ts b/src/old_routes/operations/edit/triage-[id]/+layout.ts similarity index 100% rename from src/routes/old/operations/edit/triage-[id]/+layout.ts rename to src/old_routes/operations/edit/triage-[id]/+layout.ts diff --git a/src/routes/old/operations/edit/triage-[id]/+page.svelte b/src/old_routes/operations/edit/triage-[id]/+page.svelte similarity index 100% rename from src/routes/old/operations/edit/triage-[id]/+page.svelte rename to src/old_routes/operations/edit/triage-[id]/+page.svelte diff --git a/src/routes/old/tag-rules/+page.svelte b/src/old_routes/tag-rules/+page.svelte similarity index 100% rename from src/routes/old/tag-rules/+page.svelte rename to src/old_routes/tag-rules/+page.svelte diff --git a/src/routes/old/tag-rules/edit/[id]/+layout.ts b/src/old_routes/tag-rules/edit/[id]/+layout.ts similarity index 100% rename from src/routes/old/tag-rules/edit/[id]/+layout.ts rename to src/old_routes/tag-rules/edit/[id]/+layout.ts diff --git a/src/routes/old/tag-rules/edit/[id]/+page.svelte b/src/old_routes/tag-rules/edit/[id]/+page.svelte similarity index 100% rename from src/routes/old/tag-rules/edit/[id]/+page.svelte rename to src/old_routes/tag-rules/edit/[id]/+page.svelte diff --git a/src/routes/old/tag-rules/new/+page.svelte b/src/old_routes/tag-rules/new/+page.svelte similarity index 100% rename from src/routes/old/tag-rules/new/+page.svelte rename to src/old_routes/tag-rules/new/+page.svelte diff --git a/src/routes/old/tags/+page.svelte b/src/old_routes/tags/+page.svelte similarity index 100% rename from src/routes/old/tags/+page.svelte rename to src/old_routes/tags/+page.svelte diff --git a/src/routes/old/tags/edit/[id]/+layout.ts b/src/old_routes/tags/edit/[id]/+layout.ts similarity index 100% rename from src/routes/old/tags/edit/[id]/+layout.ts rename to src/old_routes/tags/edit/[id]/+layout.ts diff --git a/src/routes/old/tags/edit/[id]/+page.svelte b/src/old_routes/tags/edit/[id]/+page.svelte similarity index 100% rename from src/routes/old/tags/edit/[id]/+page.svelte rename to src/old_routes/tags/edit/[id]/+page.svelte diff --git a/src/routes/old/tags/new/+page.svelte b/src/old_routes/tags/new/+page.svelte similarity index 100% rename from src/routes/old/tags/new/+page.svelte rename to src/old_routes/tags/new/+page.svelte diff --git a/src/routes/old/triage/+page.svelte b/src/old_routes/triage/+page.svelte similarity index 100% rename from src/routes/old/triage/+page.svelte rename to src/old_routes/triage/+page.svelte From fe51e90cfef9877c85ffcb1309c6bd080ed41bfe Mon Sep 17 00:00:00 2001 From: Alex Rock Ancelet Date: Mon, 22 Jan 2024 17:13:39 +0100 Subject: [PATCH 07/19] Add TagRule crud --- src/lib/crud/Dashboard.ts | 4 +- src/lib/crud/cruds/BankAccountsCrud.ts | 1 + src/lib/crud/cruds/TagRulesCrud.ts | 79 ++++++++++++++++++++++++++ src/lib/db/tag_rules.ts | 20 +------ src/lib/entities/TagRule.ts | 11 ++++ 5 files changed, 95 insertions(+), 20 deletions(-) diff --git a/src/lib/crud/Dashboard.ts b/src/lib/crud/Dashboard.ts index 3b3d32be..e28b89ec 100644 --- a/src/lib/crud/Dashboard.ts +++ b/src/lib/crud/Dashboard.ts @@ -3,6 +3,7 @@ import Home from 'carbon-icons-svelte/lib/Home.svelte'; import OperationCrud from '$lib/crud/cruds/OperationCrud'; import BankAccountsCrud from "$lib/crud/cruds/BankAccountsCrud"; +import TagRulesCrud from "$lib/crud/cruds/TagRulesCrud"; export const dashboard = new DashboardDefinition({ adminConfig: { @@ -18,7 +19,7 @@ export const dashboard = new DashboardDefinition({ new UrlAction('Homepage', '/', Home), // new UrlAction('Analytics', '/analytics'), new UrlAction('Operations', '/crud/operations/list'), - // new UrlAction('Tag rules', '/crud/tag-rules/list'), + new UrlAction('Tag rules', '/crud/tag-rules/list'), // new UrlAction('Tags', '/crud/tags/list'), // new UrlAction('Triage', '/crud/triage/list'), new UrlAction('Bank accounts', '/crud/bank-accounts/list'), @@ -28,5 +29,6 @@ export const dashboard = new DashboardDefinition({ cruds: [ OperationCrud, BankAccountsCrud, + TagRulesCrud, ] }); diff --git a/src/lib/crud/cruds/BankAccountsCrud.ts b/src/lib/crud/cruds/BankAccountsCrud.ts index 4f5d3cba..ceb0259f 100644 --- a/src/lib/crud/cruds/BankAccountsCrud.ts +++ b/src/lib/crud/cruds/BankAccountsCrud.ts @@ -50,6 +50,7 @@ export default new CrudDefinition('bank-accounts', { return Promise.resolve(null); }), + stateProcessor: new CallbackStateProcessor(async (data: StateProcessorInput, operation: CrudOperation, requestParameters: RequestParameters) => { if (operation.name === 'new') { return createBankAccount(data); diff --git a/src/lib/crud/cruds/TagRulesCrud.ts b/src/lib/crud/cruds/TagRulesCrud.ts index e69de29b..cabf5010 100644 --- a/src/lib/crud/cruds/TagRulesCrud.ts +++ b/src/lib/crud/cruds/TagRulesCrud.ts @@ -0,0 +1,79 @@ +import { + CallbackStateProcessor, + CallbackStateProvider, + CrudDefinition, Edit, + List, New, + TextField, ToggleField, + UrlAction, +} from "@orbitale/svelte-admin"; +import type {CrudTagRule} from "@orbitale/svelte-admin/dist/Crud/TagRules"; +import type {RequestParameters} from "@orbitale/svelte-admin/dist/request"; +import type {CrudOperation} from "@orbitale/svelte-admin/dist/Crud/Operations"; +import type {StateProcessorInput} from "@orbitale/svelte-admin/dist/State/Processor"; +import {createTagRule, getTagRuleById, getTagRules, updateTagRule} from "$lib/db/tag_rules"; +import TagRule from "$lib/entities/TagRule"; +import {goto} from "$app/navigation"; +import {success} from "$lib/utils/message"; + +const baseFields = [ + new TextField('tags', 'Tags'), + new TextField('matching_pattern', 'Matching pattern'), + new ToggleField('is_regex', 'Regex'), +]; + +export default new CrudDefinition('tag-rules', { + defaultOperationName: "list", + label: {plural: "TagRules", singular: "TagRule"}, + // minStateLoadingTimeMs: 0, + + operations: [ + new List([new TextField('id', 'ID'), ...baseFields], + [ + new UrlAction('Edit', '/crud/tag-rules/edit'), + ], { + globalActions: [ + new UrlAction('New', '/crud/tag-rules/new'), + ], + }), + new New(baseFields), + new Edit(baseFields), + ], + + stateProvider: new CallbackStateProvider(async (operation: CrudTagRule, requestParameters: RequestParameters) => { + if (typeof window === 'undefined') { + // SSR, can't call Tauri API then. + return Promise.resolve([]); + } + + if (operation.name === 'list') { + return getTagRules(); + } + + if (operation.name === 'view' || operation.name === 'edit') { + return getTagRuleById(requestParameters.id); + } + + return Promise.resolve(null); + }), + + stateProcessor: new CallbackStateProcessor(async (data: StateProcessorInput, operation: CrudOperation, requestParameters: RequestParameters) => { + if (operation.name === 'new' || operation.name === 'edit') { + data.id = parseInt(requestParameters.id || 0, 10); + // TODO FIXME : remove this and use proper entity injection! + data.is_regex = !!data.is_regex; + data.tags = data.tags.replace(/[^0-9,]/, '').split(',').map(i => parseInt(i, 10)); + const tag_rule = TagRule.fromJson(data); + + if (operation.name === 'new') { + await createTagRule(tag_rule); + } + if (operation.name === 'edit') { + await updateTagRule(tag_rule); + } + + success('Success!'); + await goto('/crud/tag-rules/list'); + return; + } + }) +}); diff --git a/src/lib/db/tag_rules.ts b/src/lib/db/tag_rules.ts index 74dc524c..5c10eb18 100644 --- a/src/lib/db/tag_rules.ts +++ b/src/lib/db/tag_rules.ts @@ -8,16 +8,6 @@ import type Tag from '$lib/entities/Tag'; export const tagRulesStore: Writable = writable(); -let tag_rules_promise: Promise | null = null; - -async function getTagRulesPromise(): Promise { - if (!tag_rules_promise) { - tag_rules_promise = getTagRules(); - } - - return tag_rules_promise; -} - export default class DeserializedTagRule { public readonly id!: number; public readonly tags_ids!: Array; @@ -26,10 +16,6 @@ export default class DeserializedTagRule { } export async function getTagRules(): Promise> { - if (tag_rules_promise) { - return await tag_rules_promise; - } - let res: string = await api_call('tag_rules_get'); const deserialized_tag_rules: Array = JSON.parse(res); @@ -68,7 +54,7 @@ export async function getTagRules(): Promise> { } export async function getTagRuleById(id: string): Promise { - const tag_rules = await getTagRulesPromise(); + const tag_rules = await getTagRules(); for (const tag_rule of tag_rules) { if (tag_rule.id.toString() === id.toString()) { @@ -81,8 +67,6 @@ export async function getTagRuleById(id: string): Promise { export async function updateTagRule(tag_rule: TagRule): Promise { await api_call('tag_rule_update', { tagRule: tag_rule.serialize() }); - - tag_rules_promise = null; } export async function createTagRule(tag_rule: TagRule): Promise { @@ -93,6 +77,4 @@ export async function createTagRule(tag_rule: TagRule): Promise { } tag_rule.setId(+id); - - tag_rules_promise = null; } diff --git a/src/lib/entities/TagRule.ts b/src/lib/entities/TagRule.ts index 72608aca..a223f754 100644 --- a/src/lib/entities/TagRule.ts +++ b/src/lib/entities/TagRule.ts @@ -1,6 +1,10 @@ import type Tag from './Tag'; import type Entity from '$lib/struct/Entity'; +export type PartialTagRule = { + [key: keyof TagRule]: unknown +}; + export default class TagRule implements Entity { public id!: number; public tags!: Tag[]; @@ -32,6 +36,13 @@ export default class TagRule implements Entity { this.id = id; } + public static fromJson(json: PartialTagRule): TagRule { + if (!Array.isArray(json.tags) || json.matching_pattern === '' || json.matching_pattern === undefined || json.is_regex === '' || json.is_regex === undefined) { + throw new Error('Invaild JSON to create a TagRule object: '+JSON.stringify(json)); + } + return new TagRule(json.id||0, json.tags, json.matching_pattern, !!json.is_regex); + } + public serialize(): string { return JSON.stringify( { From a4e2f954727791265678e6fbf38b2930b5fd6ef2 Mon Sep 17 00:00:00 2001 From: Alex Rock Ancelet Date: Mon, 22 Jan 2024 17:17:16 +0100 Subject: [PATCH 08/19] Add icons to menu links --- src/lib/crud/Dashboard.ts | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/src/lib/crud/Dashboard.ts b/src/lib/crud/Dashboard.ts index e28b89ec..51bcd5f7 100644 --- a/src/lib/crud/Dashboard.ts +++ b/src/lib/crud/Dashboard.ts @@ -1,5 +1,11 @@ import { DashboardDefinition, UrlAction } from '@orbitale/svelte-admin'; import Home from 'carbon-icons-svelte/lib/Home.svelte'; +import PiggyBank from "carbon-icons-svelte/lib/PiggyBank.svelte"; +import ChartLogisticRegression from "carbon-icons-svelte/lib/ChartLogisticRegression.svelte"; +import ListBoxes from "carbon-icons-svelte/lib/ListBoxes.svelte"; +import Tag from "carbon-icons-svelte/lib/Tag.svelte"; +import TagGroup from "carbon-icons-svelte/lib/TagGroup.svelte"; +import FetchUpload from "carbon-icons-svelte/lib/FetchUpload.svelte"; import OperationCrud from '$lib/crud/cruds/OperationCrud'; import BankAccountsCrud from "$lib/crud/cruds/BankAccountsCrud"; @@ -17,13 +23,13 @@ export const dashboard = new DashboardDefinition({ sideMenu: [ new UrlAction('Homepage', '/', Home), - // new UrlAction('Analytics', '/analytics'), - new UrlAction('Operations', '/crud/operations/list'), - new UrlAction('Tag rules', '/crud/tag-rules/list'), - // new UrlAction('Tags', '/crud/tags/list'), + // new UrlAction('Analytics', '/analytics', ChartLogisticRegression), + new UrlAction('Operations', '/crud/operations/list', ListBoxes), + new UrlAction('Tag rules', '/crud/tag-rules/list', TagGroup), + // new UrlAction('Tags', '/crud/tags/list', Tag), // new UrlAction('Triage', '/crud/triage/list'), - new UrlAction('Bank accounts', '/crud/bank-accounts/list'), - new UrlAction('Import', '/import'), + new UrlAction('Bank accounts', '/crud/bank-accounts/list', PiggyBank), + new UrlAction('Import', '/import', FetchUpload), ], cruds: [ From c24a52fddd012a0aa5e8633cfffae4a21af16e42 Mon Sep 17 00:00:00 2001 From: Alex Rock Ancelet Date: Mon, 22 Jan 2024 17:25:02 +0100 Subject: [PATCH 09/19] Add TagsCrud & clean other cruds --- src/lib/crud/Dashboard.ts | 4 +- src/lib/crud/cruds/BankAccountsCrud.ts | 6 +-- src/lib/crud/cruds/OperationCrud.ts | 1 + src/lib/crud/cruds/TagRulesCrud.ts | 2 +- src/lib/crud/cruds/TagsCrud.ts | 75 ++++++++++++++++++++++++++ src/lib/db/operations.ts | 21 ++------ src/lib/db/tag_rules.ts | 6 --- src/lib/db/tags.ts | 33 ++---------- src/lib/entities/Tag.ts | 8 +++ src/lib/entities/TagRule.ts | 6 ++- 10 files changed, 103 insertions(+), 59 deletions(-) diff --git a/src/lib/crud/Dashboard.ts b/src/lib/crud/Dashboard.ts index 51bcd5f7..d74e41b8 100644 --- a/src/lib/crud/Dashboard.ts +++ b/src/lib/crud/Dashboard.ts @@ -10,6 +10,7 @@ import FetchUpload from "carbon-icons-svelte/lib/FetchUpload.svelte"; import OperationCrud from '$lib/crud/cruds/OperationCrud'; import BankAccountsCrud from "$lib/crud/cruds/BankAccountsCrud"; import TagRulesCrud from "$lib/crud/cruds/TagRulesCrud"; +import TagsCrud from "$lib/crud/cruds/TagsCrud"; export const dashboard = new DashboardDefinition({ adminConfig: { @@ -25,8 +26,8 @@ export const dashboard = new DashboardDefinition({ new UrlAction('Homepage', '/', Home), // new UrlAction('Analytics', '/analytics', ChartLogisticRegression), new UrlAction('Operations', '/crud/operations/list', ListBoxes), + new UrlAction('Tags', '/crud/tags/list', Tag), new UrlAction('Tag rules', '/crud/tag-rules/list', TagGroup), - // new UrlAction('Tags', '/crud/tags/list', Tag), // new UrlAction('Triage', '/crud/triage/list'), new UrlAction('Bank accounts', '/crud/bank-accounts/list', PiggyBank), new UrlAction('Import', '/import', FetchUpload), @@ -36,5 +37,6 @@ export const dashboard = new DashboardDefinition({ OperationCrud, BankAccountsCrud, TagRulesCrud, + TagsCrud, ] }); diff --git a/src/lib/crud/cruds/BankAccountsCrud.ts b/src/lib/crud/cruds/BankAccountsCrud.ts index ceb0259f..5c9ba101 100644 --- a/src/lib/crud/cruds/BankAccountsCrud.ts +++ b/src/lib/crud/cruds/BankAccountsCrud.ts @@ -6,12 +6,12 @@ import { TextField, UrlAction, } from "@orbitale/svelte-admin"; -import type {CrudBankAccount} from "@orbitale/svelte-admin/dist/Crud/BankAccounts"; import type {RequestParameters} from "@orbitale/svelte-admin/dist/request"; -import {createBankAccount, getBankAccountById, getBankAccounts, updateBankAccount} from "$lib/db/bank_accounts"; -import type BankAccount from "$lib/entities/BankAccount"; import type {CrudOperation} from "@orbitale/svelte-admin/dist/Crud/Operations"; import type {StateProcessorInput} from "@orbitale/svelte-admin/dist/State/Processor"; + +import {createBankAccount, getBankAccountById, getBankAccounts, updateBankAccount} from "$lib/db/bank_accounts"; +import type BankAccount from "$lib/entities/BankAccount"; import {goto} from "$app/navigation"; import {success} from "$lib/utils/message"; diff --git a/src/lib/crud/cruds/OperationCrud.ts b/src/lib/crud/cruds/OperationCrud.ts index 2d72ff13..17b75d92 100644 --- a/src/lib/crud/cruds/OperationCrud.ts +++ b/src/lib/crud/cruds/OperationCrud.ts @@ -11,6 +11,7 @@ import { } from "@orbitale/svelte-admin"; import type {CrudOperation} from "@orbitale/svelte-admin/dist/Crud/Operations"; import type {RequestParameters} from "@orbitale/svelte-admin/dist/request"; + import {getOperationById, getOperations, getOperationsCount} from "$lib/db/operations"; import type Operation from "$lib/entities/Operation"; diff --git a/src/lib/crud/cruds/TagRulesCrud.ts b/src/lib/crud/cruds/TagRulesCrud.ts index cabf5010..2ce88abe 100644 --- a/src/lib/crud/cruds/TagRulesCrud.ts +++ b/src/lib/crud/cruds/TagRulesCrud.ts @@ -6,10 +6,10 @@ import { TextField, ToggleField, UrlAction, } from "@orbitale/svelte-admin"; -import type {CrudTagRule} from "@orbitale/svelte-admin/dist/Crud/TagRules"; import type {RequestParameters} from "@orbitale/svelte-admin/dist/request"; import type {CrudOperation} from "@orbitale/svelte-admin/dist/Crud/Operations"; import type {StateProcessorInput} from "@orbitale/svelte-admin/dist/State/Processor"; + import {createTagRule, getTagRuleById, getTagRules, updateTagRule} from "$lib/db/tag_rules"; import TagRule from "$lib/entities/TagRule"; import {goto} from "$app/navigation"; diff --git a/src/lib/crud/cruds/TagsCrud.ts b/src/lib/crud/cruds/TagsCrud.ts index e69de29b..2976c32b 100644 --- a/src/lib/crud/cruds/TagsCrud.ts +++ b/src/lib/crud/cruds/TagsCrud.ts @@ -0,0 +1,75 @@ +import { + CallbackStateProcessor, + CallbackStateProvider, + CrudDefinition, Edit, + List, New, + TextField, ToggleField, + UrlAction, +} from "@orbitale/svelte-admin"; +import type {RequestParameters} from "@orbitale/svelte-admin/dist/request"; +import type {CrudOperation} from "@orbitale/svelte-admin/dist/Crud/Operations"; +import type {StateProcessorInput} from "@orbitale/svelte-admin/dist/State/Processor"; + +import {createTag, getTagById, getTags, updateTag} from "$lib/db/tags"; +import Tag from "$lib/entities/Tag"; +import {goto} from "$app/navigation"; +import {success} from "$lib/utils/message"; + +const baseFields = [ + new TextField('name', 'Name'), +]; + +export default new CrudDefinition('tags', { + defaultOperationName: "list", + label: {plural: "Tags", singular: "Tag"}, + // minStateLoadingTimeMs: 0, + + operations: [ + new List([new TextField('id', 'ID'), ...baseFields], + [ + new UrlAction('Edit', '/crud/tags/edit'), + ], { + globalActions: [ + new UrlAction('New', '/crud/tags/new'), + ], + }), + new New(baseFields), + new Edit(baseFields), + ], + + stateProvider: new CallbackStateProvider(async (operation: CrudTag, requestParameters: RequestParameters) => { + if (typeof window === 'undefined') { + // SSR, can't call Tauri API then. + return Promise.resolve([]); + } + + if (operation.name === 'list') { + return getTags(); + } + + if (operation.name === 'view' || operation.name === 'edit') { + return getTagById(requestParameters.id); + } + + return Promise.resolve(null); + }), + + stateProcessor: new CallbackStateProcessor(async (data: StateProcessorInput, operation: CrudOperation, requestParameters: RequestParameters) => { + if (operation.name === 'new' || operation.name === 'edit') { + data.id = parseInt(requestParameters.id || 0, 10); + // TODO FIXME : remove this and use proper entity injection! + const tag_rule = Tag.fromJson(data); + + if (operation.name === 'new') { + await createTag(tag_rule); + } + if (operation.name === 'edit') { + await updateTag(tag_rule); + } + + success('Success!'); + await goto('/crud/tags/list'); + return; + } + }) +}); diff --git a/src/lib/db/operations.ts b/src/lib/db/operations.ts index bf75fcc3..4a2fffa0 100644 --- a/src/lib/db/operations.ts +++ b/src/lib/db/operations.ts @@ -1,18 +1,13 @@ -import Operation, { OperationState } from '$lib/entities/Operation'; +import Operation, {OperationState} from '$lib/entities/Operation'; import api_call from '$lib/utils/api_call'; -import { getTagsByIds } from './tags'; -import { getBankAccountById } from './bank_accounts'; -import type { Writable } from 'svelte/store'; -import { writable } from 'svelte/store'; +import {getTagsByIds} from './tags'; +import {getBankAccountById} from './bank_accounts'; import type Tag from '$lib/entities/Tag'; import type SortableField from '$lib/admin/src/SortableField'; -import { OrderBy, orderByToString } from '$lib/admin/src/OrderBy'; +import {OrderBy, orderByToString} from '$lib/admin/src/OrderBy'; import type FilterWithValue from '$lib/admin/src/FilterWithValue'; import type SavedFilter from '$lib/admin/src/SavedFilter'; -export const operationsStore: Writable = writable(); -export const triageStore: Writable = writable(); - const lastTriageCall = { page: 1 }; @@ -53,11 +48,7 @@ export async function getOperations( throw 'No results from the API'; } - const new_items = await deserializeAndNormalizeDatabaseResult(res); - - operationsStore.set(new_items); - - return new_items; + return await deserializeAndNormalizeDatabaseResult(res); } export async function getOperationsForAnalytics( @@ -91,8 +82,6 @@ export async function getTriageOperations(page: number = 1): Promise = writable(); - export default class DeserializedTagRule { public readonly id!: number; public readonly tags_ids!: Array; @@ -48,8 +44,6 @@ export async function getTagRules(): Promise> { ); } - tagRulesStore.set(tag_rules); - return tag_rules; } diff --git a/src/lib/db/tags.ts b/src/lib/db/tags.ts index ee014fff..9833e88f 100644 --- a/src/lib/db/tags.ts +++ b/src/lib/db/tags.ts @@ -1,40 +1,17 @@ -// @ts-ignore import Tag from '$lib/entities/Tag'; import api_call from '$lib/utils/api_call'; -import { writable } from 'svelte/store'; -import type { Writable } from 'svelte/store'; - -export const tagsStore: Writable = writable(); - -let tags_promise: Promise | null = null; - -async function getTagsPromise(): Promise> { - if (!tags_promise) { - tags_promise = getTags(); - } - - return tags_promise; -} export async function getTags(): Promise> { - if (tags_promise) { - return await tags_promise; - } - let res: string = await api_call('tags_get'); - const tags = JSON.parse(res).map((data: object) => { + return JSON.parse(res).map((data: object) => { // @ts-ignore return new Tag(data.id, data.name); }); - - tagsStore.set(tags); - - return tags; } export async function getTagById(id: number): Promise { - const tags = await getTagsPromise(); + const tags = await getTags(); for (const tag of tags) { if (tag.id === id) { @@ -46,7 +23,7 @@ export async function getTagById(id: number): Promise { } export async function getTagsByIds(ids: Array): Promise> { - const tags = await getTagsPromise(); + const tags = await getTags(); let tags_found: Array = []; @@ -76,8 +53,6 @@ export async function updateTag(tag: Tag): Promise { if (!tag_entity) throw new Error('Data corruption detected in tags.'); tag_entity.mergeWith(tag); - - tags_promise = null; } export async function createTag(tag: Tag): Promise { @@ -88,6 +63,4 @@ export async function createTag(tag: Tag): Promise { } tag.setId(+id); - - tags_promise = null; } diff --git a/src/lib/entities/Tag.ts b/src/lib/entities/Tag.ts index 9263d197..fe413489 100644 --- a/src/lib/entities/Tag.ts +++ b/src/lib/entities/Tag.ts @@ -34,4 +34,12 @@ export default class Tag implements Entity { } this.name = tag.name; } + + public static fromJson(json: { name?: string }): Tag { + if (json.name === undefined) { + throw new Error('Invaild JSON to create a Tag object: '+JSON.stringify(json)); + } + + return new Tag(0, json.name); + } } diff --git a/src/lib/entities/TagRule.ts b/src/lib/entities/TagRule.ts index a223f754..511732af 100644 --- a/src/lib/entities/TagRule.ts +++ b/src/lib/entities/TagRule.ts @@ -2,7 +2,9 @@ import type Tag from './Tag'; import type Entity from '$lib/struct/Entity'; export type PartialTagRule = { - [key: keyof TagRule]: unknown + tags?: Array + matching_pattern?: string, + is_regex?: string|boolean }; export default class TagRule implements Entity { @@ -40,7 +42,7 @@ export default class TagRule implements Entity { if (!Array.isArray(json.tags) || json.matching_pattern === '' || json.matching_pattern === undefined || json.is_regex === '' || json.is_regex === undefined) { throw new Error('Invaild JSON to create a TagRule object: '+JSON.stringify(json)); } - return new TagRule(json.id||0, json.tags, json.matching_pattern, !!json.is_regex); + return new TagRule(0, json.tags, json.matching_pattern, !!json.is_regex); } public serialize(): string { From 71be3f0799317180b88a27915ff9cfeeb6a6bd86 Mon Sep 17 00:00:00 2001 From: Alex Rock Ancelet Date: Mon, 22 Jan 2024 18:07:12 +0100 Subject: [PATCH 10/19] Add triage --- src/lib/crud/Dashboard.ts | 5 +- src/lib/crud/cruds/OperationCrud.ts | 2 +- src/lib/crud/cruds/TriageCrud.ts | 108 ++++++++++++++++++++++++++++ src/lib/db/operations.ts | 12 +--- 4 files changed, 114 insertions(+), 13 deletions(-) diff --git a/src/lib/crud/Dashboard.ts b/src/lib/crud/Dashboard.ts index d74e41b8..2e3bb3c0 100644 --- a/src/lib/crud/Dashboard.ts +++ b/src/lib/crud/Dashboard.ts @@ -6,11 +6,13 @@ import ListBoxes from "carbon-icons-svelte/lib/ListBoxes.svelte"; import Tag from "carbon-icons-svelte/lib/Tag.svelte"; import TagGroup from "carbon-icons-svelte/lib/TagGroup.svelte"; import FetchUpload from "carbon-icons-svelte/lib/FetchUpload.svelte"; +import ListCheckedMirror from "carbon-icons-svelte/lib/ListCheckedMirror.svelte"; import OperationCrud from '$lib/crud/cruds/OperationCrud'; import BankAccountsCrud from "$lib/crud/cruds/BankAccountsCrud"; import TagRulesCrud from "$lib/crud/cruds/TagRulesCrud"; import TagsCrud from "$lib/crud/cruds/TagsCrud"; +import TriageCrud from "$lib/crud/cruds/TriageCrud"; export const dashboard = new DashboardDefinition({ adminConfig: { @@ -28,7 +30,7 @@ export const dashboard = new DashboardDefinition({ new UrlAction('Operations', '/crud/operations/list', ListBoxes), new UrlAction('Tags', '/crud/tags/list', Tag), new UrlAction('Tag rules', '/crud/tag-rules/list', TagGroup), - // new UrlAction('Triage', '/crud/triage/list'), + new UrlAction('Triage', '/crud/triage/list', ListCheckedMirror), new UrlAction('Bank accounts', '/crud/bank-accounts/list', PiggyBank), new UrlAction('Import', '/import', FetchUpload), ], @@ -38,5 +40,6 @@ export const dashboard = new DashboardDefinition({ BankAccountsCrud, TagRulesCrud, TagsCrud, + TriageCrud, ] }); diff --git a/src/lib/crud/cruds/OperationCrud.ts b/src/lib/crud/cruds/OperationCrud.ts index 17b75d92..58395d93 100644 --- a/src/lib/crud/cruds/OperationCrud.ts +++ b/src/lib/crud/cruds/OperationCrud.ts @@ -28,7 +28,7 @@ export default new CrudDefinition('operations', { new TextField('type_display', 'Type 2'), new TextField('details', 'Details'), new TextField('tags', 'Tags'), - new NumberField('amount', 'Montant'), + new NumberField('amount_display', 'Montant'), ], [ new UrlAction('View', '/crud/operations/view'), diff --git a/src/lib/crud/cruds/TriageCrud.ts b/src/lib/crud/cruds/TriageCrud.ts index e69de29b..c216f8a1 100644 --- a/src/lib/crud/cruds/TriageCrud.ts +++ b/src/lib/crud/cruds/TriageCrud.ts @@ -0,0 +1,108 @@ +import { + CallbackStateProcessor, + CallbackStateProvider, + CrudDefinition, DateField, Delete, Edit, + List, + NumberField, + PaginatedResults, + TextField, + UrlAction, + View +} from "@orbitale/svelte-admin"; +import type {CrudOperation} from "@orbitale/svelte-admin/dist/Crud/Operations"; +import type {RequestParameters} from "@orbitale/svelte-admin/dist/request"; +import type {StateProcessorInput} from "@orbitale/svelte-admin/dist/State/Processor"; + +import { + deleteOperation, + getOperationById, + getTriageOperations, + getTriageOperationsCount, updateOperationDetails +} from "$lib/db/operations"; +import type Operation from "$lib/entities/Operation"; +import {success} from "$lib/utils/message"; +import {goto} from "$app/navigation"; + +export default new CrudDefinition('triage', { + defaultOperationName: "list", + label: {plural: "Triaged operations", singular: "Triaged operation"}, + // minStateLoadingTimeMs: 0, + + operations: [ + new List( + [ + new DateField('operation_date', 'Date'), + new TextField('op_type', 'Type 1'), + new TextField('type_display', 'Type 2'), + new TextField('details', 'Details'), + new NumberField('amount_display', 'Montant'), + ], + [ + new UrlAction('View', '/crud/triage/view'), + new UrlAction('Edit', '/crud/triage/edit'), + new UrlAction('Delete', '/crud/triage/delete') + ], + { + pagination: { + enabled: true, + itemsPerPage: 20, + } + }), + new Delete([], new UrlAction('', '/crud/triage/list')), + new Edit([ + new TextField('details', 'Details'), + ]), + new View([ + new TextField('id', 'ID'), + new DateField('operation_date', 'Date'), + new TextField('op_type', 'Type 1'), + new TextField('type_display', 'Type 2'), + new TextField('details', 'Details'), + new NumberField('amount_in_cents', 'Montant (in cents)'), + new NumberField('amount', 'Montant'), + new NumberField('hash', 'Hash'), + new TextField('bank_account', 'Bank account'), + ]), + ], + + stateProvider: new CallbackStateProvider(async (operation: CrudOperation, requestParameters: RequestParameters) => { + if (typeof window === 'undefined') { + // SSR, can't call Tauri API then. + return Promise.resolve([]); + } + + if (operation.name === 'list') { + const results = await getTriageOperations(requestParameters.page||1); + const numberOfItems = await getTriageOperationsCount(); + return Promise.resolve(new PaginatedResults(requestParameters.page, numberOfItems / operation.options.pagination.itemsPerPage, numberOfItems, results)); + } + + if (operation.name === 'view' || operation.name === 'edit') { + return getOperationById(requestParameters.id); + } + + return Promise.resolve(null); + }), + stateProcessor: new CallbackStateProcessor(async (data: StateProcessorInput, operation: CrudOperation, requestParameters: RequestParameters) => { + + if (operation.name === 'edit' || operation.name === 'delete') { + const operationObject = await getOperationById(requestParameters.id); + if (!operationObject) { + throw new Error(`Could not find operation with id "${requestParameters.id}".`); + } + + if (operation.name === 'edit') { + operationObject.details = data.details; + await updateOperationDetails(operationObject); + } + + if (operation.name === 'delete') { + await deleteOperation(operationObject); + } + + success('Success!'); + await goto('/crud/triage/list'); + return; + } + }) +}); diff --git a/src/lib/db/operations.ts b/src/lib/db/operations.ts index 4a2fffa0..3ec28155 100644 --- a/src/lib/db/operations.ts +++ b/src/lib/db/operations.ts @@ -8,10 +8,6 @@ import {OrderBy, orderByToString} from '$lib/admin/src/OrderBy'; import type FilterWithValue from '$lib/admin/src/FilterWithValue'; import type SavedFilter from '$lib/admin/src/SavedFilter'; -const lastTriageCall = { - page: 1 -}; - export default class DeserializedOperation { public readonly id!: number; public readonly operation_date!: string; @@ -80,11 +76,7 @@ export async function getTriageOperations(page: number = 1): Promise { @@ -118,8 +110,6 @@ export async function deleteOperation(operation: Operation) { const id = operation.id.toString(10); await api_call('operation_delete', { id: id }); - - await getTriageOperations(lastTriageCall.page); } export async function getOperationById(id: number): Promise { From a62ee292e5e28b7f583f51b3df873adf31cd5d48 Mon Sep 17 00:00:00 2001 From: Alex Rock Ancelet Date: Thu, 14 Mar 2024 17:15:38 +0100 Subject: [PATCH 11/19] Remove old admin package refs --- src/lib/admin/LICENSE | 165 ----------- src/lib/admin/README.md | 61 ---- .../components/PaginatedTable/Filter.svelte | 272 ------------------ .../PaginatedTable/FiltersSelector.svelte | 204 ------------- .../PaginatedTable/ItemFieldValue.svelte | 30 -- .../PaginatedTable/ItemHeadCell.svelte | 57 ---- .../components/PaginatedTable/ItemLine.svelte | 45 --- .../PaginatedTable/PaginatedTable.svelte | 224 --------------- src/lib/admin/components/SpinLoader.svelte | 76 ----- src/lib/admin/docs/example1.png | Bin 7738 -> 0 bytes src/lib/admin/graph.svg | 4 - src/lib/admin/package.json | 17 -- src/lib/admin/src/ActionParams.ts | 27 -- src/lib/admin/src/AssociatedField.ts | 12 - src/lib/admin/src/AssociatedItem.ts | 11 - src/lib/admin/src/CallbackAction.ts | 14 - src/lib/admin/src/Collection.ts | 10 - src/lib/admin/src/CollectionField.ts | 23 -- src/lib/admin/src/ConfigFilter.ts | 34 --- src/lib/admin/src/DefaultAction.ts | 13 - src/lib/admin/src/Field.ts | 45 --- src/lib/admin/src/FieldHtmlProperties.ts | 11 - src/lib/admin/src/FieldOptions.ts | 34 --- src/lib/admin/src/FilterType.ts | 9 - src/lib/admin/src/FilterWithValue.ts | 28 -- src/lib/admin/src/ItemAction.ts | 3 - src/lib/admin/src/OrderBy.ts | 15 - src/lib/admin/src/PageHooks.ts | 39 --- src/lib/admin/src/SavedFilter.ts | 28 -- src/lib/admin/src/SortableField.ts | 21 -- src/lib/admin/src/UrlAction.ts | 24 -- src/lib/admin/src/config.ts | 23 -- src/lib/admin/src/filters.ts | 59 ---- src/lib/admin/yarn.lock | 8 - 34 files changed, 1646 deletions(-) delete mode 100644 src/lib/admin/LICENSE delete mode 100644 src/lib/admin/README.md delete mode 100644 src/lib/admin/components/PaginatedTable/Filter.svelte delete mode 100644 src/lib/admin/components/PaginatedTable/FiltersSelector.svelte delete mode 100644 src/lib/admin/components/PaginatedTable/ItemFieldValue.svelte delete mode 100644 src/lib/admin/components/PaginatedTable/ItemHeadCell.svelte delete mode 100644 src/lib/admin/components/PaginatedTable/ItemLine.svelte delete mode 100644 src/lib/admin/components/PaginatedTable/PaginatedTable.svelte delete mode 100644 src/lib/admin/components/SpinLoader.svelte delete mode 100644 src/lib/admin/docs/example1.png delete mode 100644 src/lib/admin/graph.svg delete mode 100644 src/lib/admin/package.json delete mode 100644 src/lib/admin/src/ActionParams.ts delete mode 100644 src/lib/admin/src/AssociatedField.ts delete mode 100644 src/lib/admin/src/AssociatedItem.ts delete mode 100644 src/lib/admin/src/CallbackAction.ts delete mode 100644 src/lib/admin/src/Collection.ts delete mode 100644 src/lib/admin/src/CollectionField.ts delete mode 100644 src/lib/admin/src/ConfigFilter.ts delete mode 100644 src/lib/admin/src/DefaultAction.ts delete mode 100644 src/lib/admin/src/Field.ts delete mode 100644 src/lib/admin/src/FieldHtmlProperties.ts delete mode 100644 src/lib/admin/src/FieldOptions.ts delete mode 100644 src/lib/admin/src/FilterType.ts delete mode 100644 src/lib/admin/src/FilterWithValue.ts delete mode 100644 src/lib/admin/src/ItemAction.ts delete mode 100644 src/lib/admin/src/OrderBy.ts delete mode 100644 src/lib/admin/src/PageHooks.ts delete mode 100644 src/lib/admin/src/SavedFilter.ts delete mode 100644 src/lib/admin/src/SortableField.ts delete mode 100644 src/lib/admin/src/UrlAction.ts delete mode 100644 src/lib/admin/src/config.ts delete mode 100644 src/lib/admin/src/filters.ts delete mode 100644 src/lib/admin/yarn.lock diff --git a/src/lib/admin/LICENSE b/src/lib/admin/LICENSE deleted file mode 100644 index 0a041280..00000000 --- a/src/lib/admin/LICENSE +++ /dev/null @@ -1,165 +0,0 @@ - GNU LESSER GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - - This version of the GNU Lesser General Public License incorporates -the terms and conditions of version 3 of the GNU General Public -License, supplemented by the additional permissions listed below. - - 0. Additional Definitions. - - As used herein, "this License" refers to version 3 of the GNU Lesser -General Public License, and the "GNU GPL" refers to version 3 of the GNU -General Public License. - - "The Library" refers to a covered work governed by this License, -other than an Application or a Combined Work as defined below. - - An "Application" is any work that makes use of an interface provided -by the Library, but which is not otherwise based on the Library. -Defining a subclass of a class defined by the Library is deemed a mode -of using an interface provided by the Library. - - A "Combined Work" is a work produced by combining or linking an -Application with the Library. The particular version of the Library -with which the Combined Work was made is also called the "Linked -Version". - - The "Minimal Corresponding Source" for a Combined Work means the -Corresponding Source for the Combined Work, excluding any source code -for portions of the Combined Work that, considered in isolation, are -based on the Application, and not on the Linked Version. - - The "Corresponding Application Code" for a Combined Work means the -object code and/or source code for the Application, including any data -and utility programs needed for reproducing the Combined Work from the -Application, but excluding the System Libraries of the Combined Work. - - 1. Exception to Section 3 of the GNU GPL. - - You may convey a covered work under sections 3 and 4 of this License -without being bound by section 3 of the GNU GPL. - - 2. Conveying Modified Versions. - - If you modify a copy of the Library, and, in your modifications, a -facility refers to a function or data to be supplied by an Application -that uses the facility (other than as an argument passed when the -facility is invoked), then you may convey a copy of the modified -version: - - a) under this License, provided that you make a good faith effort to - ensure that, in the event an Application does not supply the - function or data, the facility still operates, and performs - whatever part of its purpose remains meaningful, or - - b) under the GNU GPL, with none of the additional permissions of - this License applicable to that copy. - - 3. Object Code Incorporating Material from Library Header Files. - - The object code form of an Application may incorporate material from -a header file that is part of the Library. You may convey such object -code under terms of your choice, provided that, if the incorporated -material is not limited to numerical parameters, data structure -layouts and accessors, or small macros, inline functions and templates -(ten or fewer lines in length), you do both of the following: - - a) Give prominent notice with each copy of the object code that the - Library is used in it and that the Library and its use are - covered by this License. - - b) Accompany the object code with a copy of the GNU GPL and this license - document. - - 4. Combined Works. - - You may convey a Combined Work under terms of your choice that, -taken together, effectively do not restrict modification of the -portions of the Library contained in the Combined Work and reverse -engineering for debugging such modifications, if you also do each of -the following: - - a) Give prominent notice with each copy of the Combined Work that - the Library is used in it and that the Library and its use are - covered by this License. - - b) Accompany the Combined Work with a copy of the GNU GPL and this license - document. - - c) For a Combined Work that displays copyright notices during - execution, include the copyright notice for the Library among - these notices, as well as a reference directing the user to the - copies of the GNU GPL and this license document. - - d) Do one of the following: - - 0) Convey the Minimal Corresponding Source under the terms of this - License, and the Corresponding Application Code in a form - suitable for, and under terms that permit, the user to - recombine or relink the Application with a modified version of - the Linked Version to produce a modified Combined Work, in the - manner specified by section 6 of the GNU GPL for conveying - Corresponding Source. - - 1) Use a suitable shared library mechanism for linking with the - Library. A suitable mechanism is one that (a) uses at run time - a copy of the Library already present on the user's computer - system, and (b) will operate properly with a modified version - of the Library that is interface-compatible with the Linked - Version. - - e) Provide Installation Information, but only if you would otherwise - be required to provide such information under section 6 of the - GNU GPL, and only to the extent that such information is - necessary to install and execute a modified version of the - Combined Work produced by recombining or relinking the - Application with a modified version of the Linked Version. (If - you use option 4d0, the Installation Information must accompany - the Minimal Corresponding Source and Corresponding Application - Code. If you use option 4d1, you must provide the Installation - Information in the manner specified by section 6 of the GNU GPL - for conveying Corresponding Source.) - - 5. Combined Libraries. - - You may place library facilities that are a work based on the -Library side by side in a single library together with other library -facilities that are not Applications and are not covered by this -License, and convey such a combined library under terms of your -choice, if you do both of the following: - - a) Accompany the combined library with a copy of the same work based - on the Library, uncombined with any other library facilities, - conveyed under the terms of this License. - - b) Give prominent notice with the combined library that part of it - is a work based on the Library, and explaining where to find the - accompanying uncombined form of the same work. - - 6. Revised Versions of the GNU Lesser General Public License. - - The Free Software Foundation may publish revised and/or new versions -of the GNU Lesser General Public License from time to time. Such new -versions will be similar in spirit to the present version, but may -differ in detail to address new problems or concerns. - - Each version is given a distinguishing version number. If the -Library as you received it specifies that a certain numbered version -of the GNU Lesser General Public License "or any later version" -applies to it, you have the option of following the terms and -conditions either of that published version or of any later version -published by the Free Software Foundation. If the Library as you -received it does not specify a version number of the GNU Lesser -General Public License, you may choose any version of the GNU Lesser -General Public License ever published by the Free Software Foundation. - - If the Library as you received it specifies that a proxy can decide -whether future versions of the GNU Lesser General Public License shall -apply, that proxy's public statement of acceptance of any version is -permanent authorization for you to choose that version for the -Library. diff --git a/src/lib/admin/README.md b/src/lib/admin/README.md deleted file mode 100644 index d68ddf6d..00000000 --- a/src/lib/admin/README.md +++ /dev/null @@ -1,61 +0,0 @@ -# Svelte admin, prototype - -⚠ This package is totally a **prototype**. It's used in one single personal project and not meant for production (yet)! - -## Install - -Install `@orbitale/svelte-admin` via `yarn` or `npm`: - -```bash -yarn add -D "@orbitale/svelte-admin@git://github.com/Orbitale/SvelteAdmin.git" -npm install -D "@orbitale/svelte-admin@git://github.com/Orbitale/SvelteAdmin.git" -``` - -## Usage - -In a Svelte route file or component, use the `PaginatedTable` component to initialize an admin list: - -```sveltehtml - - -

    Pages

    - - -``` diff --git a/src/lib/admin/components/PaginatedTable/Filter.svelte b/src/lib/admin/components/PaginatedTable/Filter.svelte deleted file mode 100644 index 328fd918..00000000 --- a/src/lib/admin/components/PaginatedTable/Filter.svelte +++ /dev/null @@ -1,272 +0,0 @@ - - -
    - -
    - {#if filter.type === FilterType.text} - - {:else if filter.type === FilterType.date} -
    -
    - -
    -
    - -
    -
    - {:else if filter.type === FilterType.number} -
    -
    - -
    -
    - -
    -
    - {:else if filter.type === FilterType.boolean} -
    - -
    - {:else if filter.type === FilterType.entity} - - {:else} -
    - Unknown input type "{filter.type}" -
    - {/if} -
    -
    - - diff --git a/src/lib/admin/components/PaginatedTable/FiltersSelector.svelte b/src/lib/admin/components/PaginatedTable/FiltersSelector.svelte deleted file mode 100644 index c1657a89..00000000 --- a/src/lib/admin/components/PaginatedTable/FiltersSelector.svelte +++ /dev/null @@ -1,204 +0,0 @@ - - -
    - - - -
    -
    - {#each config_filters as filter} - - {/each} -
    -
    - - -
    -
    - - diff --git a/src/lib/admin/components/PaginatedTable/ItemFieldValue.svelte b/src/lib/admin/components/PaginatedTable/ItemFieldValue.svelte deleted file mode 100644 index 7cedaf39..00000000 --- a/src/lib/admin/components/PaginatedTable/ItemFieldValue.svelte +++ /dev/null @@ -1,30 +0,0 @@ - - -{#if field_value === null} - Empty -{:else if field_value === ''} - Empty string -{:else if field_value === undefined} - Undefined -{:else if field_value === true || field_value === false} - {#if field_value === true} - - {:else} - × - {/if} -{:else if field_value instanceof Array} - {#each field_value as array_value} - {array_value} - {/each} -{:else if typeof field_value === 'object'} -
    {JSON.stringify(field_value)}
    -{:else} - {field_value} -{/if} diff --git a/src/lib/admin/components/PaginatedTable/ItemHeadCell.svelte b/src/lib/admin/components/PaginatedTable/ItemHeadCell.svelte deleted file mode 100644 index 4bee15a7..00000000 --- a/src/lib/admin/components/PaginatedTable/ItemHeadCell.svelte +++ /dev/null @@ -1,57 +0,0 @@ - - - sortField(field)} -> - {field.text} - - - diff --git a/src/lib/admin/components/PaginatedTable/ItemLine.svelte b/src/lib/admin/components/PaginatedTable/ItemLine.svelte deleted file mode 100644 index b0a832f0..00000000 --- a/src/lib/admin/components/PaginatedTable/ItemLine.svelte +++ /dev/null @@ -1,45 +0,0 @@ - - - - {#each fields as field} - - - - {/each} - {#if actions.length} - - {#each actions as action} - {#if action instanceof UrlAction} - - {action.name} - - {:else if action instanceof CallbackAction} - - {:else} - Unsupported action - {/if} - {/each} - - {/if} - - - diff --git a/src/lib/admin/components/PaginatedTable/PaginatedTable.svelte b/src/lib/admin/components/PaginatedTable/PaginatedTable.svelte deleted file mode 100644 index aabef26f..00000000 --- a/src/lib/admin/components/PaginatedTable/PaginatedTable.svelte +++ /dev/null @@ -1,224 +0,0 @@ - - - - - - - - - {#if filters.length} - - - - {/if} - - - {#each fields as field} - - {/each} - {#if actions.length} - - {/if} - - - - - {#if $items_store === undefined || $items_store === null} - - - - {/if} - {#key $items_store} - {#each $items_store || [] as item, i} - - {:else} - - - - {/each} - {/key} - -
    - - -
    - Page: {page} / {number_of_pages} -
    -
    - -
    Actions
    - -
    -
    No elements found.
    -
    - - diff --git a/src/lib/admin/components/SpinLoader.svelte b/src/lib/admin/components/SpinLoader.svelte deleted file mode 100644 index 9aa36c2e..00000000 --- a/src/lib/admin/components/SpinLoader.svelte +++ /dev/null @@ -1,76 +0,0 @@ - - - - - - - diff --git a/src/lib/admin/docs/example1.png b/src/lib/admin/docs/example1.png deleted file mode 100644 index 876234d8aaad1975a0c3a3a5413804cb2aa488e5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7738 zcmdT}XIPWlmfi_bh#Wydsx%KJN=KS>P-)TyK|q>-AkqXPRS0;HCPry`DLDo@bsrXa3FnNV2~#+3Q<1e?oz#}pyy$_{QV_PZ#uPQ{fOk~yofo*NX(ROztJR&7Oh%jw&Od> z(95C5GbYjni6k?;K8|`^&;&H}eLPl*pP4V6Y1sKIFEjiB-+1F=$b$u33?k#jG6PdE zCCNRv%@|fSRsh~&DX1F=1cB9y!6-ue2C)oZAW$sN0Vd)v7n#{_z3tv~th=pr)&%PB6`S;ayi(_41GObcTzp za&xr%Ywqa-dP*Xm#AckgXjV$vxBd_gOUd`g{5jv6(W_9FUMs2c+B}1Ja~YL7}=`);=8j- zgEU{7qV|(H$n4|oc=F@$HT&=d!77{Sc=X55WyKyaAg>}>OXcjbm*Rn7zFVeMWfeDX zMkvU>Vf@^WIO;xrXL(MGwZgP{KH$;m7NzHf-PNmhg|U?NTLrdp<7w9p`-tL{Z;$5v zBy2R-*<{3uO1q6oQAKM-p)f4**OUqjY<+d+sCHPNnv73dxRJ|wS{FOwj_Arij zbZr2NEkP#zWc`&PKilzP(_b-pMV`AvwX`dQ!UoFp3LVN#Gvbfx-fZT*PP)mX`At^o zjgT$TJd?v@(x1wBTqYB1756O~U0l_w`A);fp~M!)5YhwxY&kXATmowWI=aH*(TB&u zMMAP&WI)~;eoe}5#ik(2dszjQH9HicxNd=&cb68Bi7J|S5&7%W+rTq}W(8Y4M|C7yz$YxiGzAt{>bf(EEXymH`unu2PR6 zx0`8ZR4oDds~1M+oD;x4D4M`LDb*Dxu zG-5|QmHFxJ+!|g>PS$O({P-xRK%kam@18t2OhkEl!@p(<57;SvRppGUA27KPoReim zGiZ+l>U@t2v$BR`C?MeTCxhGdCL6h zp1|EK!nFct->0Mvh^R0 z_|CX&M(f-K6VmQ)vA8NpoFGg@fTCi%g_^0V#n*3R8mktK!q*?b39GLQe!@IDp9W>4PX9eL((o``$33 zdq4DbCXVWMbLZjcNbE}n{F3Rm`>9#3=9kifDBmNfZlva+B}=5`SWEQ7Q@ z4gO?i_Pr+i-FJHYo0sC2_70i<Uwe3X2_h#N={!-)Xu(FJKf!jiYl(6N}L#eVFu^LLu`e%4+!Vv@5k?3IrxgiF68TkHM!V7cAc z4-v7~)b)HHodX~N!Ow{?8xudb zTDiU%L+YSI;57e3x=z0dwnjMs z^oMFG%$I5n$|(6NS3=eJHGOqG25jWqn?%)u(!921D2_;gdAO7T98ys4|51Kq(Hr9R zSv|HQjN!CKVN{qupb|g#8x^D(mwrDP{{D|4w+0Z15Lp@TC(MYACmCHSwJVMWKqOFX zjfMlWE6ZY_d%R{o`RQQtY<=^sQc1h)zWh8Iy#ge_P|Y+LM1sDX-ln@g0*2TOBaKQD zKxUjkVkQQwxkeSpRyiqJnv`;aZ>cqFYRnlj)L8teuWmuB1(fgiCqMIXHEzV~vRU`p z<;TWK0gU!3Dd@4Fk_JG&u?_jZgxHmg5h))DIjwLBMs{-dG6ztA;ztA`*q{_(G9m#2 z2}N^(3d06P6>uGXjsr5UtpWm0CZGAgG1>fU5!ygAQH;HxcKKDyy&|YD;2EsD16w&(K*W2-NidvNlSZCxL zyR>_zY4KV(0zgXu#sB_FJdpezv?9T9fL@e_-OTdd>*lwtcjN%q0uXFWdpByls*0wy zyW;;qVCr~OfLDTj8u?JsTTv_8W#eSae6O@a;N!DA-HLedzMD8LwWtFRW({|AO99c9 zp^9O20ylgm{OgJYX{9TwA8(0kzPP4|!niB77#vl+rkzYTTiA<^1l{h|NO>h?(Tp;F z^57QxO@x9^NrtF@T{5HLq)(*!xzz!2R)=^%Wx|0WNJv#h_#;5jU3&7Zin0aNS<&Y0 z_{w4mPE5~n`0Z#T(C_G%`FM?w3LHWa{(M|T;FY%%>^ueM6m4#4q3ore@*X(}^!%H~ zck*z|4c-^0ydxARlUOF|%FACjSNjSX41^%og5)BchQ{x1;d;`QhzET<;c{s)L0_k=P~DoO){Err>GX--L1 zkeYTy1@a^EDB@JmSg6ts8D2-CVpsg9d&9CEnACd5RDu~E??ehNkn@o1J@Wo71MOfU z(x!ykFivD!c^ICxurh7H*aA3iyeaI2YI?Ir^-#oomKCmkVpKNblpR8EGK1w@y!69^ z8_q-t^0gM%$!cXI3G;p}#+I(FA94+yZEzZHYI#?(L5;Ihd+f&@ciE^fym9+T z=kyxHIlemv(DSJPQ*V5ce7Kk0(${Ahj0gP*w#Sgg8Y;mU68)p09aUH|5BX5!OR`$= zs8xD!@4hFmHoJ+-zF9aiPL9I7&|Z!jljDln=b4jh*|1>@^75mMLTq4h+KD^tF zVu;`habLzPROXZ`5zW4pUkwUT;L!;Inv=?&(4y`CeOkOOGe9<}^;$pXgqWX9eBr_z zxQlAm2$U0Z^mVcCzQMpB+(Z5X$-tE9;o+M3xyei;jnZNlQgANcoV3m!uB|6Ov{^Ol zM_w8L?ZSYq1%=NkfIropD&MR=DmP%QH19m>YWz?xf2Bd53l?Ho25`-cBI{=R=w-VL}dh0UO)y;xAd|;-45{J zB=(DWA)J_)WSjw!XQyd15}50J(BJ5bJEc@9##8oaK7XZiubtdhR0Uvnjgo)V*uEf> zgmLhsBjBj#?a@h(gx@Y^Kvepab5+ze*XlTn`WEp z{vKiRL?6<&E`{6TlN0X_@Z0S!#mkyUTk$+GD-q&GW++|ZqMl2ozf*oSYb^`?c?=*)MCe2Q0ehP&^v5=R#V3KsOkxGTSU`iD5nz)DUZwP(cn;!9M4Nv%*! zus}xvLc7ZnL>1#fUdQ8tdl=QP7Vt>lD{_;}xnFLNy{vMZu6?MFe$44ECLkyjfda&w zZYlKMXrji`WTDJS@f`JZ#uq8VMR@Q)YkZ3XmJp7>sK#Q4qVZscmK!ZjqprK!5r8l+ zo;Tay5uzZBD?mX08urUBs=_Z{;~-a$uy1NB ze5QlWEqgcQ!)+2;ydKJ3R)C1iv!ViCt@DV;nx5Ny`Nto{)od(pDm$rb$XV?0%|F+q zlF!K=z`pE6!EW;HQwp=R-9e7tR4?>tY7=X+U1xdDuZCyfG?EQf){rr}+sfQ|5e-aS zC16uQo+g{v@4IiBzP^e$Z&D{Dyt*i&bC?HrF%2P&g zx#VgbQ`q(GdCs=>hHYK6R65;US|gpf zeM(Q`nJhB@Ug7_JG|_N^6Fm0VzAn8CJFH7vsGcID{$By@4xin@`ZF83r>p7w^wRDh zipR=7xGt3T@w7dv{u9e9gJp~__`-<~E=tdOkU?$a2|{BJN|~35HqUK%G-?ZZ{bPQi zdD_=u_Xof@KAW{drri7|*b5jrFzpTYMXglVLVnQ$2PTwDZGz($FGKmXZ2!YVo3zUw1;T zqrKBxq!_kKLwgKzPcIH+p8a$fWE$_S*~aHt(yp6?{Ss)fX}bIDd?m@&b)BZ$=rw;* zEP zjqA~ki{aCrL{f4$IpafTbOMN`iZ%+LI#ZF6dApRc-wJ;-EMf;G@Le@ya;Nz3g}LQ7&X58;`!k2~2OMyLNuD4gZ_HbUtsV{|-! zfpfpvI?I)$T4LBoV-^l@L!_agQ-ihSzJiE?BB-twY7tsE@;692@;uxPWL?GU`Yb6iU=1GSIUAIV;T< z=jin5gRH)!y?Mv#zmRiZ6kWb7g!yCG@QGBE+XI$6?j2;A7c>pOCsv+4-b)1SmH;a+ z4|i^~;=s(g)YF*} zu`Z`p&8>>!A6fd!wHh_|e2j};biDs0hg=xjH%@5Beas?Ya%Dlve~)E<+bY?7u{0XH zaATcQGrx4_APZ};$#4d@XK+ztQ_&b_D~+*|cpnlVj| z)b;RyGX}(sL+mo9Zb0D9rnP|8*z;p)6~M(n$WnuS%2`&lf&F}y;XyD2yM~4vn?sR` ztXJEav=zHkd~iZ~mQ;N*u&t7RAWqxi<7f-PTz)4Q9-sur;8XyOMqGm`2gdHZ1FLb1 z(;Z8KG9wby{SMO;fe`Vh-XpY6D()Bdd8p(SV>q3uekuH)CjQwk-IVpx{xG`)1LslkaKzlVJ#DFGSwDQ*gcA144VU_|tlH!DHT&$m!Pvj@^9{Ew%LKX|A`#se z?X`3Sp#JC%1P6u$KC!=25&HKt{I`~7;&9naXn9{*tCcxJy*kvvSS7~z;ll8PcS9(5 z%%;vR;{8&Bdd~9qwA6`!?eKCr+jd>?GVwk{^1v+DWv6|K?|P9y)3MICt%TvRu?+81 ze(txGy2iAhqq`DZx_sxCAWoG0c^9s7_pqe7*`zgI55!)Sy#7}K#@fL861cK^C#b+tVD@9%T>__L2895E$6yOYL+ zX*Nyt_F47kfW7T(F1DVXVU7%X6@Wjj6cdu7mk9d2tCd>7))Q3uk1(-UUVJZt&oPfh zj^;k!RUFmJYDwT6852zx9_ekBchqD`7ip#JYJM>v@4dw`zchs;r(+R~^~1#y>ywG| zcJ@*VJwvQIl-8OHoLvK6BPAb=L`|>1B<^R2-{12f`@HfVh1sS z$|lp?WiiL@ir+i*EJu+W8Dz<^-5xS`QAL~AMy<-(Z3}6%;nL2iIH^XGV(|L zJ|Ur_S1pU}p@(XDL<04zYs&HPV2#nRPWY!Q3hP^V;OOez+Hv-Nd`kUkYHHo_T}Ex} z3Nj=2pOnp#=nM~buNk_t0d461Vr;KB)rfA%%r8;5{i49cza{H`MAu;lL9o+Zd4p(%UsP?UGioOo5rG(Lg+1#T ztDkJFzy9|(iaPL&U&puyuQ*PQZmFOh|9?5f{g(sX|3AaD_4Q-Yas^5pg`nxlf5Jdj MQS)Zub@PD#0HGdifdBvi diff --git a/src/lib/admin/graph.svg b/src/lib/admin/graph.svg deleted file mode 100644 index 7832b11d..00000000 --- a/src/lib/admin/graph.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - -
    CrudController
    CrudController
    List / Search
    List / Search
    Edit
    Edit
    New
    New
    Source
    Source
    User-based
    User-based
    Framework-based
    Framework-based
    Filters
    Filters
    Form
    Form
    Fields
    Fields
    Text is not SVG - cannot display
    \ No newline at end of file diff --git a/src/lib/admin/package.json b/src/lib/admin/package.json deleted file mode 100644 index 85deb09a..00000000 --- a/src/lib/admin/package.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "name": "@orbitale/svelte-admin", - "version": "0.1.0", - "description": "(prototype) Crud base for Svelte projects", - "main": "index.js", - "repository": "https://github.com/Orbitale/SvelteAdmin", - "author": "Alex \"Pierstoval\" Rock ", - "license": "LGPL-3.0-or-later", - "dependencies": { - "bootstrap": "^5.2.3", - "date-fns": "^2.29.3", - "date-picker-svelte": "^2.3.0", - "luxon": "^3.3.0", - "sass": "^1.60.0", - "svelte": "^3.58.0" - } -} diff --git a/src/lib/admin/src/ActionParams.ts b/src/lib/admin/src/ActionParams.ts deleted file mode 100644 index 29d10dc3..00000000 --- a/src/lib/admin/src/ActionParams.ts +++ /dev/null @@ -1,27 +0,0 @@ -import Field from './Field'; - -export default class ActionParams { - private _params: Array = []; - - get params(): Array { - return this._params; - } - - public static id(): ActionParams { - return new ActionParams().and('id'); - } - - public static with(field: string | Field): ActionParams { - return new ActionParams().and(field); - } - - public and(field: string | Field): ActionParams { - if (field instanceof Field) { - this._params.push(field); - } else { - this._params.push(new Field(field)); - } - - return this; - } -} diff --git a/src/lib/admin/src/AssociatedField.ts b/src/lib/admin/src/AssociatedField.ts deleted file mode 100644 index aa9f6dc6..00000000 --- a/src/lib/admin/src/AssociatedField.ts +++ /dev/null @@ -1,12 +0,0 @@ -import Field from './Field'; -import FieldHtmlProperties from './FieldHtmlProperties'; - -export default class AssociatedField extends Field { - constructor( - name: string, - associated_field: Field, - field_html_properties: FieldHtmlProperties = FieldHtmlProperties.defaults() - ) { - super(name, '', associated_field, field_html_properties); - } -} diff --git a/src/lib/admin/src/AssociatedItem.ts b/src/lib/admin/src/AssociatedItem.ts deleted file mode 100644 index 999b0364..00000000 --- a/src/lib/admin/src/AssociatedItem.ts +++ /dev/null @@ -1,11 +0,0 @@ -import type Field from './Field'; - -export default class AssociatedItem { - public readonly item: T; - public readonly fields: Field[]; - - constructor(item: T, fields: Field[]) { - this.item = item; - this.fields = fields; - } -} diff --git a/src/lib/admin/src/CallbackAction.ts b/src/lib/admin/src/CallbackAction.ts deleted file mode 100644 index f84687fd..00000000 --- a/src/lib/admin/src/CallbackAction.ts +++ /dev/null @@ -1,14 +0,0 @@ -import DefaultAction from './DefaultAction'; - -export default class CallbackAction extends DefaultAction { - private readonly _callback: Function; - - constructor(name: string, callback: Function) { - super(name); - this._callback = callback; - } - - public call(item: object): string { - return this._callback.call(null, item); - } -} diff --git a/src/lib/admin/src/Collection.ts b/src/lib/admin/src/Collection.ts deleted file mode 100644 index cd925819..00000000 --- a/src/lib/admin/src/Collection.ts +++ /dev/null @@ -1,10 +0,0 @@ -export default class Collection extends Array { - constructor(items: T[] = []) { - super(); - this.addItems(items); - } - - private addItems(items: T[] = []) { - items.forEach((item) => this.push(item)); - } -} diff --git a/src/lib/admin/src/CollectionField.ts b/src/lib/admin/src/CollectionField.ts deleted file mode 100644 index 12ddb6ef..00000000 --- a/src/lib/admin/src/CollectionField.ts +++ /dev/null @@ -1,23 +0,0 @@ -import type AssociatedField from './AssociatedField'; -import Field from './Field'; -import FieldOptions from './FieldOptions'; - -export default class CollectionField extends Field { - constructor(name: string, text: string, item_field: Field) { - super(name, text, new FieldOptions(item_field)); - } - - public displayFromItem(item: object | any): any { - let field: Field | AssociatedField; - - const items = item[this.name]; - - if (items.length === 0 || !(items instanceof Array)) { - return null; - } - - field = this._associated_field; - - return items.map((singleItem) => field.displayFromItem(singleItem)); - } -} diff --git a/src/lib/admin/src/ConfigFilter.ts b/src/lib/admin/src/ConfigFilter.ts deleted file mode 100644 index 774c5285..00000000 --- a/src/lib/admin/src/ConfigFilter.ts +++ /dev/null @@ -1,34 +0,0 @@ -import FilterType from './FilterType'; -import type FilterWithValue from './FilterWithValue'; -import type Filter from '../components/PaginatedTable/Filter.svelte'; - -export default class ConfigFilter { - public readonly name: string; - public readonly title: string; - public readonly type: FilterType; - public readonly options: { [key: string]: any }; - public element: Filter | null; - public value: FilterWithValue | null; - - constructor(name: string, title: string, type: FilterType, options?: { [key: string]: any }) { - this.name = name; - this.title = title; - this.type = type; - this.options = options || {}; - this.validateOptions(); - } - - private validateOptions() { - switch (this.type) { - case FilterType.entity: - if (!this.options.entities) { - throw new Error( - 'To define a filter of type "entity", you must also specify the "entities" option. This must contain an array that contains elements of type "{name: string, value: string}", or a callable that returns such array, or a promise that resolves to such array.' - ); - } - break; - default: - break; - } - } -} diff --git a/src/lib/admin/src/DefaultAction.ts b/src/lib/admin/src/DefaultAction.ts deleted file mode 100644 index bad02248..00000000 --- a/src/lib/admin/src/DefaultAction.ts +++ /dev/null @@ -1,13 +0,0 @@ -import type ItemAction from './ItemAction'; - -export default abstract class DefaultAction implements ItemAction { - protected readonly _name: string; - - protected constructor(name: string) { - this._name = name; - } - - get name(): string { - return this._name; - } -} diff --git a/src/lib/admin/src/Field.ts b/src/lib/admin/src/Field.ts deleted file mode 100644 index caa309f2..00000000 --- a/src/lib/admin/src/Field.ts +++ /dev/null @@ -1,45 +0,0 @@ -import type AssociatedField from './AssociatedField'; -import type FieldHtmlProperties from './FieldHtmlProperties'; -import FieldOptions from './FieldOptions'; -import SortableField from './SortableField'; - -export const Sortable = true; - -export default class Field { - public readonly name: string; - public readonly text: string; - public readonly field_html_properties: FieldHtmlProperties; - public readonly sortable_field: SortableField | null; - protected readonly _associated_field: null | AssociatedField; - - constructor( - name: string, - text: string = '', - options: FieldOptions | null = null, - sortable: boolean = false - ) { - if (!options) { - options = FieldOptions.defaults(); - } - this.name = name; - this.text = text === '' ? name : text; - this.field_html_properties = options.field_html_properties; - this._associated_field = options.associated_field; - this.sortable_field = sortable - ? new SortableField(name, null, options.sortable_property_name || name) - : null; - } - - public displayFromItem(item: object | any): any { - let field: Field | AssociatedField; - - if (this._associated_field) { - item = item[this.name]; - field = this._associated_field; - } else { - field = this; - } - - return item[field.name]; - } -} diff --git a/src/lib/admin/src/FieldHtmlProperties.ts b/src/lib/admin/src/FieldHtmlProperties.ts deleted file mode 100644 index aa3e3256..00000000 --- a/src/lib/admin/src/FieldHtmlProperties.ts +++ /dev/null @@ -1,11 +0,0 @@ -export default class FieldHtmlProperties { - public readonly html_class: string; - - constructor(html_class: string = '') { - this.html_class = html_class; - } - - static defaults() { - return new FieldHtmlProperties(); - } -} diff --git a/src/lib/admin/src/FieldOptions.ts b/src/lib/admin/src/FieldOptions.ts deleted file mode 100644 index 4829b5c7..00000000 --- a/src/lib/admin/src/FieldOptions.ts +++ /dev/null @@ -1,34 +0,0 @@ -import type AssociatedField from './AssociatedField'; -import FieldHtmlProperties from './FieldHtmlProperties'; - -export default class FieldOptions { - public readonly associated_field: null | AssociatedField; - public readonly field_html_properties: FieldHtmlProperties; - public readonly sortable_property_name: string | null; - - constructor( - associated_field: AssociatedField | null = null, - field_html_properties: FieldHtmlProperties | null = null, - sortable_property_name: string | null = null - ) { - this.associated_field = associated_field; - this.field_html_properties = field_html_properties || FieldHtmlProperties.defaults(); - this.sortable_property_name = sortable_property_name; - } - - static defaults(): FieldOptions { - return new FieldOptions(); - } - - static newWithAssociatedField(field: AssociatedField): FieldOptions { - return new FieldOptions(field); - } - - static newWithHtmlProperties(htmlProperties: FieldHtmlProperties): FieldOptions { - return new FieldOptions(null, htmlProperties); - } - - static newWithSortName(sortable_property_name: string): FieldOptions { - return new FieldOptions(null, null, sortable_property_name); - } -} diff --git a/src/lib/admin/src/FilterType.ts b/src/lib/admin/src/FilterType.ts deleted file mode 100644 index 3bc38c6c..00000000 --- a/src/lib/admin/src/FilterType.ts +++ /dev/null @@ -1,9 +0,0 @@ -enum FilterType { - text = 'text', - date = 'date', - number = 'number', - entity = 'entity', - boolean = 'boolean' -} - -export default FilterType; diff --git a/src/lib/admin/src/FilterWithValue.ts b/src/lib/admin/src/FilterWithValue.ts deleted file mode 100644 index 159309e1..00000000 --- a/src/lib/admin/src/FilterWithValue.ts +++ /dev/null @@ -1,28 +0,0 @@ -import type ConfigFilter from './ConfigFilter'; -import type FilterType from './FilterType'; - -export default class FilterWithValue { - public readonly name: string; - public readonly type: FilterType; - public readonly value: string; - - constructor(name: string, type: FilterType, value: string) { - this.name = name; - this.type = type; - this.value = value; - } - - public static fromFilter(filter: ConfigFilter, value: string): FilterWithValue { - return new FilterWithValue(filter.name, filter.type, value); - } - - public static fromSerialized(filter: Partial): FilterWithValue { - if (!filter.name || !filter.type || !filter.value) { - console.error('Serialized filter is incomplete', filter); - - throw new Error('Serialized filter is incomplete'); - } - - return new FilterWithValue(filter.name, filter.type, filter.value); - } -} diff --git a/src/lib/admin/src/ItemAction.ts b/src/lib/admin/src/ItemAction.ts deleted file mode 100644 index d8021455..00000000 --- a/src/lib/admin/src/ItemAction.ts +++ /dev/null @@ -1,3 +0,0 @@ -export default interface ItemAction { - get name(): string; -} diff --git a/src/lib/admin/src/OrderBy.ts b/src/lib/admin/src/OrderBy.ts deleted file mode 100644 index bf0965f9..00000000 --- a/src/lib/admin/src/OrderBy.ts +++ /dev/null @@ -1,15 +0,0 @@ -export enum OrderBy { - ASC = 'ASC', - DESC = 'DESC' -} - -export function orderByToString(order_by: OrderBy): string { - switch (order_by) { - case OrderBy.ASC: - return 'ASC'; - case OrderBy.DESC: - return 'DESC'; - default: - throw new Error(`Unsupported order_by type: ${order_by}`); - } -} diff --git a/src/lib/admin/src/PageHooks.ts b/src/lib/admin/src/PageHooks.ts deleted file mode 100644 index c7145bee..00000000 --- a/src/lib/admin/src/PageHooks.ts +++ /dev/null @@ -1,39 +0,0 @@ -import type SortableField from './SortableField'; -import type FilterWithValue from './FilterWithValue'; - -export default class PageHooks { - private readonly _items_callback: Function; - private readonly _count_callback: Function; - - private lastPage: number = 1; - private lastField: SortableField | null; - private lastFilters: Array | null; - - constructor(items_callback: Function, count_callback: Function = null) { - this._items_callback = items_callback; - this._count_callback = count_callback || null; - } - - get hasCountCallback(): boolean { - return this._count_callback !== null; - } - - public refresh() { - this.callForItems(this.lastPage, this.lastField, this.lastFilters); - } - - public callForItems( - page: number, - field: SortableField | null, - filters: Array | null - ): void { - this.lastPage = page; - this.lastField = field; - this.lastFilters = filters; - this._items_callback(page, field, filters); - } - - public getCountCallback(): Function { - return this._count_callback; - } -} diff --git a/src/lib/admin/src/SavedFilter.ts b/src/lib/admin/src/SavedFilter.ts deleted file mode 100644 index 7b939729..00000000 --- a/src/lib/admin/src/SavedFilter.ts +++ /dev/null @@ -1,28 +0,0 @@ -import FilterWithValue from './FilterWithValue'; - -export default class SavedFilter { - public readonly name: string; - public readonly deserialized_filters: Array; - private readonly filters: string; - - constructor(name: string, filters_with_values: Array) { - this.name = name; - this.deserialized_filters = filters_with_values; - this.filters = JSON.stringify(filters_with_values); - } - - public static fromSerialized(name: string, filters: string): SavedFilter { - let deserialized_filters: Array = JSON.parse(filters); - - if (!Array.isArray(deserialized_filters)) { - console.error('Stored filters are not stored as an array. Resetting them.'); - deserialized_filters = []; - } - - deserialized_filters = deserialized_filters.map((f: filter) => - FilterWithValue.fromSerialized(f) - ); - - return new SavedFilter(name, deserialized_filters); - } -} diff --git a/src/lib/admin/src/SortableField.ts b/src/lib/admin/src/SortableField.ts deleted file mode 100644 index d0fd03d6..00000000 --- a/src/lib/admin/src/SortableField.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { OrderBy } from './OrderBy'; - -export default class SortableField { - public readonly name: string; - public readonly property_name: string; - public order_by: OrderBy; - - constructor(name: string, order: OrderBy = OrderBy.ASC, property_name: string) { - this.name = name; - this.order_by = order; - this.property_name = property_name; - } - - get is_asc(): boolean { - return this.order_by === OrderBy.ASC; - } - - swapOrder() { - this.order_by = this.order_by === OrderBy.ASC ? OrderBy.DESC : OrderBy.ASC; - } -} diff --git a/src/lib/admin/src/UrlAction.ts b/src/lib/admin/src/UrlAction.ts deleted file mode 100644 index e521bd32..00000000 --- a/src/lib/admin/src/UrlAction.ts +++ /dev/null @@ -1,24 +0,0 @@ -import DefaultAction from './DefaultAction'; -import type ActionParams from './ActionParams'; -import type Field from './Field'; - -export default class UrlAction extends DefaultAction { - private readonly params: ActionParams; - private readonly _url: string; - - constructor(name: string, url: string, params: ActionParams) { - super(name); - this.params = params; - this._url = url; - } - - public url(item: object): string { - let url = this._url; - - this.params.params.forEach((field: Field) => { - url = url.replace(`:${field.name}`, field.displayFromItem(item).toString()); - }); - - return `${url}`; - } -} diff --git a/src/lib/admin/src/config.ts b/src/lib/admin/src/config.ts deleted file mode 100644 index 183c6834..00000000 --- a/src/lib/admin/src/config.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { writable } from 'svelte/store'; -import type SavedFilter from '$lib/admin/src/SavedFilter'; - -class Config { - public spinLoaderSrc: string = ''; - public builtinFilters: { [key: string]: Array } = {}; -} - -let config = new Config(); - -export const configStore = writable(config); - -export function updateConfig(userConfig) { - for (const configKey in userConfig) { - config[configKey] = userConfig[configKey]; - } - - configStore.set(config); -} - -export function getConfig(): Config { - return config; -} diff --git a/src/lib/admin/src/filters.ts b/src/lib/admin/src/filters.ts deleted file mode 100644 index 3e511486..00000000 --- a/src/lib/admin/src/filters.ts +++ /dev/null @@ -1,59 +0,0 @@ -import SavedFilter from './SavedFilter'; -import { getConfig } from './config'; - -export function getByName(save_key: string, name: string): SavedFilter { - const filters = getSavedFilters(save_key); - - const filtered_by_name = filters.filter((filter: SavedFilter) => filter.name === name); - - if (!filtered_by_name.length) { - throw new Error(`Filter with name "${name}" was not found.`); - } else if (filtered_by_name.length > 1) { - throw new Error(`Found multiple filters with name "${name}"`); - } - - return filtered_by_name[0]; -} - -export function getSavedFilters( - save_key: string, - with_builtin: boolean = true -): Array { - let stored_filters = localStorage.getItem('compotes_filters_' + save_key); - - if (!stored_filters) { - stored_filters = '[]'; - } - - let deserialized_filters: Array = JSON.parse(stored_filters); - - if (!Array.isArray(deserialized_filters)) { - console.error('Stored filters are not stored as an array. Resetting them.'); - deserialized_filters = []; - } - - const builtin = with_builtin ? getConfig().builtinFilters[save_key] || [] : []; - - return [ - ...builtin, - ...deserialized_filters.map((f: SavedFilter) => { - return SavedFilter.fromSerialized(f.name, f.filters); - }) - ]; -} - -export function saveFilter(save_key: string, new_filter: SavedFilter) { - let deserialized_filters = getSavedFilters(save_key, false); - - let existing_filter_index = deserialized_filters.findIndex((filter: SavedFilter) => { - return filter.name === new_filter.name; - }); - - if (existing_filter_index >= 0) { - deserialized_filters[existing_filter_index] = new_filter; - } else { - deserialized_filters.push(new_filter); - } - - localStorage.setItem('compotes_filters_' + save_key, JSON.stringify(deserialized_filters)); -} diff --git a/src/lib/admin/yarn.lock b/src/lib/admin/yarn.lock deleted file mode 100644 index 9c2c1533..00000000 --- a/src/lib/admin/yarn.lock +++ /dev/null @@ -1,8 +0,0 @@ -# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. -# yarn lockfile v1 - - -svelte@^3.58.0: - version "3.58.0" - resolved "https://registry.yarnpkg.com/svelte/-/svelte-3.58.0.tgz#d3e6f103efd6129e51c7d709225ad3b4c052b64e" - integrity sha512-brIBNNB76mXFmU/Kerm4wFnkskBbluBDCjx/8TcpYRb298Yh2dztS2kQ6bhtjMcvUhd5ynClfwpz5h2gnzdQ1A== From 78a89fe04ff049f092125286ec3ffc3a9cd4f840 Mon Sep 17 00:00:00 2001 From: Alex Rock Ancelet Date: Thu, 14 Mar 2024 17:18:11 +0100 Subject: [PATCH 12/19] Re-enable HMR for now. --- vite.config.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vite.config.ts b/vite.config.ts index c6764b55..29ca761b 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -4,6 +4,6 @@ import { defineConfig } from 'vite'; export default defineConfig({ plugins: [sveltekit()], server: { - hmr: false, + //hmr: false, }, }); From 69e7c310991252833c399c613070dd5f8cd8b89e Mon Sep 17 00:00:00 2001 From: Alex Rock Ancelet Date: Thu, 14 Mar 2024 17:18:27 +0100 Subject: [PATCH 13/19] Update SvelteAdmin & other deps --- package.json | 2 +- yarn.lock | 380 +++++++++++++++++++++++++++++++++++++++++---------- 2 files changed, 308 insertions(+), 74 deletions(-) diff --git a/package.json b/package.json index b2a0ab39..1abb930d 100644 --- a/package.json +++ b/package.json @@ -14,7 +14,7 @@ "tauri": "tauri" }, "devDependencies": { - "@orbitale/svelte-admin": "^0.11.1", + "@orbitale/svelte-admin": "^0.16.0", "@sveltejs/adapter-static": "^3.0.1", "@sveltejs/kit": "^2.3.5", "@sveltejs/vite-plugin-svelte": "^3.0.0", diff --git a/yarn.lock b/yarn.lock index bd02cf4b..85804184 100644 --- a/yarn.lock +++ b/yarn.lock @@ -8,128 +8,243 @@ integrity sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA== "@ampproject/remapping@^2.2.1": - version "2.2.1" - resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.2.1.tgz#99e8e11851128b8702cd57c33684f1d0f260b630" - integrity sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg== + version "2.3.0" + resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.3.0.tgz#ed441b6fa600072520ce18b43d2c8cc8caecc7f4" + integrity sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw== dependencies: - "@jridgewell/gen-mapping" "^0.3.0" - "@jridgewell/trace-mapping" "^0.3.9" + "@jridgewell/gen-mapping" "^0.3.5" + "@jridgewell/trace-mapping" "^0.3.24" "@esbuild/aix-ppc64@0.19.11": version "0.19.11" resolved "https://registry.yarnpkg.com/@esbuild/aix-ppc64/-/aix-ppc64-0.19.11.tgz#2acd20be6d4f0458bc8c784103495ff24f13b1d3" integrity sha512-FnzU0LyE3ySQk7UntJO4+qIiQgI7KoODnZg5xzXIrFJlKd2P2gwHsHY4927xj9y5PJmJSzULiUCWmv7iWnNa7g== +"@esbuild/aix-ppc64@0.19.12": + version "0.19.12" + resolved "https://registry.yarnpkg.com/@esbuild/aix-ppc64/-/aix-ppc64-0.19.12.tgz#d1bc06aedb6936b3b6d313bf809a5a40387d2b7f" + integrity sha512-bmoCYyWdEL3wDQIVbcyzRyeKLgk2WtWLTWz1ZIAZF/EGbNOwSA6ew3PftJ1PqMiOOGu0OyFMzG53L0zqIpPeNA== + "@esbuild/android-arm64@0.19.11": version "0.19.11" resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.19.11.tgz#b45d000017385c9051a4f03e17078abb935be220" integrity sha512-aiu7K/5JnLj//KOnOfEZ0D90obUkRzDMyqd/wNAUQ34m4YUPVhRZpnqKV9uqDGxT7cToSDnIHsGooyIczu9T+Q== +"@esbuild/android-arm64@0.19.12": + version "0.19.12" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.19.12.tgz#7ad65a36cfdb7e0d429c353e00f680d737c2aed4" + integrity sha512-P0UVNGIienjZv3f5zq0DP3Nt2IE/3plFzuaS96vihvD0Hd6H/q4WXUGpCxD/E8YrSXfNyRPbpTq+T8ZQioSuPA== + "@esbuild/android-arm@0.19.11": version "0.19.11" resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.19.11.tgz#f46f55414e1c3614ac682b29977792131238164c" integrity sha512-5OVapq0ClabvKvQ58Bws8+wkLCV+Rxg7tUVbo9xu034Nm536QTII4YzhaFriQ7rMrorfnFKUsArD2lqKbFY4vw== +"@esbuild/android-arm@0.19.12": + version "0.19.12" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.19.12.tgz#b0c26536f37776162ca8bde25e42040c203f2824" + integrity sha512-qg/Lj1mu3CdQlDEEiWrlC4eaPZ1KztwGJ9B6J+/6G+/4ewxJg7gqj8eVYWvao1bXrqGiW2rsBZFSX3q2lcW05w== + "@esbuild/android-x64@0.19.11": version "0.19.11" resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.19.11.tgz#bfc01e91740b82011ef503c48f548950824922b2" integrity sha512-eccxjlfGw43WYoY9QgB82SgGgDbibcqyDTlk3l3C0jOVHKxrjdc9CTwDUQd0vkvYg5um0OH+GpxYvp39r+IPOg== +"@esbuild/android-x64@0.19.12": + version "0.19.12" + resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.19.12.tgz#cb13e2211282012194d89bf3bfe7721273473b3d" + integrity sha512-3k7ZoUW6Q6YqhdhIaq/WZ7HwBpnFBlW905Fa4s4qWJyiNOgT1dOqDiVAQFwBH7gBRZr17gLrlFCRzF6jFh7Kew== + "@esbuild/darwin-arm64@0.19.11": version "0.19.11" resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.19.11.tgz#533fb7f5a08c37121d82c66198263dcc1bed29bf" integrity sha512-ETp87DRWuSt9KdDVkqSoKoLFHYTrkyz2+65fj9nfXsaV3bMhTCjtQfw3y+um88vGRKRiF7erPrh/ZuIdLUIVxQ== +"@esbuild/darwin-arm64@0.19.12": + version "0.19.12" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.19.12.tgz#cbee41e988020d4b516e9d9e44dd29200996275e" + integrity sha512-B6IeSgZgtEzGC42jsI+YYu9Z3HKRxp8ZT3cqhvliEHovq8HSX2YX8lNocDn79gCKJXOSaEot9MVYky7AKjCs8g== + "@esbuild/darwin-x64@0.19.11": version "0.19.11" resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.19.11.tgz#62f3819eff7e4ddc656b7c6815a31cf9a1e7d98e" integrity sha512-fkFUiS6IUK9WYUO/+22omwetaSNl5/A8giXvQlcinLIjVkxwTLSktbF5f/kJMftM2MJp9+fXqZ5ezS7+SALp4g== +"@esbuild/darwin-x64@0.19.12": + version "0.19.12" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.19.12.tgz#e37d9633246d52aecf491ee916ece709f9d5f4cd" + integrity sha512-hKoVkKzFiToTgn+41qGhsUJXFlIjxI/jSYeZf3ugemDYZldIXIxhvwN6erJGlX4t5h417iFuheZ7l+YVn05N3A== + "@esbuild/freebsd-arm64@0.19.11": version "0.19.11" resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.11.tgz#d478b4195aa3ca44160272dab85ef8baf4175b4a" integrity sha512-lhoSp5K6bxKRNdXUtHoNc5HhbXVCS8V0iZmDvyWvYq9S5WSfTIHU2UGjcGt7UeS6iEYp9eeymIl5mJBn0yiuxA== +"@esbuild/freebsd-arm64@0.19.12": + version "0.19.12" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.12.tgz#1ee4d8b682ed363b08af74d1ea2b2b4dbba76487" + integrity sha512-4aRvFIXmwAcDBw9AueDQ2YnGmz5L6obe5kmPT8Vd+/+x/JMVKCgdcRwH6APrbpNXsPz+K653Qg8HB/oXvXVukA== + "@esbuild/freebsd-x64@0.19.11": version "0.19.11" resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.19.11.tgz#7bdcc1917409178257ca6a1a27fe06e797ec18a2" integrity sha512-JkUqn44AffGXitVI6/AbQdoYAq0TEullFdqcMY/PCUZ36xJ9ZJRtQabzMA+Vi7r78+25ZIBosLTOKnUXBSi1Kw== +"@esbuild/freebsd-x64@0.19.12": + version "0.19.12" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.19.12.tgz#37a693553d42ff77cd7126764b535fb6cc28a11c" + integrity sha512-EYoXZ4d8xtBoVN7CEwWY2IN4ho76xjYXqSXMNccFSx2lgqOG/1TBPW0yPx1bJZk94qu3tX0fycJeeQsKovA8gg== + "@esbuild/linux-arm64@0.19.11": version "0.19.11" resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.19.11.tgz#58ad4ff11685fcc735d7ff4ca759ab18fcfe4545" integrity sha512-LneLg3ypEeveBSMuoa0kwMpCGmpu8XQUh+mL8XXwoYZ6Be2qBnVtcDI5azSvh7vioMDhoJFZzp9GWp9IWpYoUg== +"@esbuild/linux-arm64@0.19.12": + version "0.19.12" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.19.12.tgz#be9b145985ec6c57470e0e051d887b09dddb2d4b" + integrity sha512-EoTjyYyLuVPfdPLsGVVVC8a0p1BFFvtpQDB/YLEhaXyf/5bczaGeN15QkR+O4S5LeJ92Tqotve7i1jn35qwvdA== + "@esbuild/linux-arm@0.19.11": version "0.19.11" resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.19.11.tgz#ce82246d873b5534d34de1e5c1b33026f35e60e3" integrity sha512-3CRkr9+vCV2XJbjwgzjPtO8T0SZUmRZla+UL1jw+XqHZPkPgZiyWvbDvl9rqAN8Zl7qJF0O/9ycMtjU67HN9/Q== +"@esbuild/linux-arm@0.19.12": + version "0.19.12" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.19.12.tgz#207ecd982a8db95f7b5279207d0ff2331acf5eef" + integrity sha512-J5jPms//KhSNv+LO1S1TX1UWp1ucM6N6XuL6ITdKWElCu8wXP72l9MM0zDTzzeikVyqFE6U8YAV9/tFyj0ti+w== + "@esbuild/linux-ia32@0.19.11": version "0.19.11" resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.19.11.tgz#cbae1f313209affc74b80f4390c4c35c6ab83fa4" integrity sha512-caHy++CsD8Bgq2V5CodbJjFPEiDPq8JJmBdeyZ8GWVQMjRD0sU548nNdwPNvKjVpamYYVL40AORekgfIubwHoA== +"@esbuild/linux-ia32@0.19.12": + version "0.19.12" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.19.12.tgz#d0d86b5ca1562523dc284a6723293a52d5860601" + integrity sha512-Thsa42rrP1+UIGaWz47uydHSBOgTUnwBwNq59khgIwktK6x60Hivfbux9iNR0eHCHzOLjLMLfUMLCypBkZXMHA== + "@esbuild/linux-loong64@0.19.11": version "0.19.11" resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.19.11.tgz#5f32aead1c3ec8f4cccdb7ed08b166224d4e9121" integrity sha512-ppZSSLVpPrwHccvC6nQVZaSHlFsvCQyjnvirnVjbKSHuE5N24Yl8F3UwYUUR1UEPaFObGD2tSvVKbvR+uT1Nrg== +"@esbuild/linux-loong64@0.19.12": + version "0.19.12" + resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.19.12.tgz#9a37f87fec4b8408e682b528391fa22afd952299" + integrity sha512-LiXdXA0s3IqRRjm6rV6XaWATScKAXjI4R4LoDlvO7+yQqFdlr1Bax62sRwkVvRIrwXxvtYEHHI4dm50jAXkuAA== + "@esbuild/linux-mips64el@0.19.11": version "0.19.11" resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.19.11.tgz#38eecf1cbb8c36a616261de858b3c10d03419af9" integrity sha512-B5x9j0OgjG+v1dF2DkH34lr+7Gmv0kzX6/V0afF41FkPMMqaQ77pH7CrhWeR22aEeHKaeZVtZ6yFwlxOKPVFyg== +"@esbuild/linux-mips64el@0.19.12": + version "0.19.12" + resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.19.12.tgz#4ddebd4e6eeba20b509d8e74c8e30d8ace0b89ec" + integrity sha512-fEnAuj5VGTanfJ07ff0gOA6IPsvrVHLVb6Lyd1g2/ed67oU1eFzL0r9WL7ZzscD+/N6i3dWumGE1Un4f7Amf+w== + "@esbuild/linux-ppc64@0.19.11": version "0.19.11" resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.19.11.tgz#9c5725a94e6ec15b93195e5a6afb821628afd912" integrity sha512-MHrZYLeCG8vXblMetWyttkdVRjQlQUb/oMgBNurVEnhj4YWOr4G5lmBfZjHYQHHN0g6yDmCAQRR8MUHldvvRDA== +"@esbuild/linux-ppc64@0.19.12": + version "0.19.12" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.19.12.tgz#adb67dadb73656849f63cd522f5ecb351dd8dee8" + integrity sha512-nYJA2/QPimDQOh1rKWedNOe3Gfc8PabU7HT3iXWtNUbRzXS9+vgB0Fjaqr//XNbd82mCxHzik2qotuI89cfixg== + "@esbuild/linux-riscv64@0.19.11": version "0.19.11" resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.19.11.tgz#2dc4486d474a2a62bbe5870522a9a600e2acb916" integrity sha512-f3DY++t94uVg141dozDu4CCUkYW+09rWtaWfnb3bqe4w5NqmZd6nPVBm+qbz7WaHZCoqXqHz5p6CM6qv3qnSSQ== +"@esbuild/linux-riscv64@0.19.12": + version "0.19.12" + resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.19.12.tgz#11bc0698bf0a2abf8727f1c7ace2112612c15adf" + integrity sha512-2MueBrlPQCw5dVJJpQdUYgeqIzDQgw3QtiAHUC4RBz9FXPrskyyU3VI1hw7C0BSKB9OduwSJ79FTCqtGMWqJHg== + "@esbuild/linux-s390x@0.19.11": version "0.19.11" resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.19.11.tgz#4ad8567df48f7dd4c71ec5b1753b6f37561a65a8" integrity sha512-A5xdUoyWJHMMlcSMcPGVLzYzpcY8QP1RtYzX5/bS4dvjBGVxdhuiYyFwp7z74ocV7WDc0n1harxmpq2ePOjI0Q== +"@esbuild/linux-s390x@0.19.12": + version "0.19.12" + resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.19.12.tgz#e86fb8ffba7c5c92ba91fc3b27ed5a70196c3cc8" + integrity sha512-+Pil1Nv3Umes4m3AZKqA2anfhJiVmNCYkPchwFJNEJN5QxmTs1uzyy4TvmDrCRNT2ApwSari7ZIgrPeUx4UZDg== + "@esbuild/linux-x64@0.19.11": version "0.19.11" resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.19.11.tgz#b7390c4d5184f203ebe7ddaedf073df82a658766" integrity sha512-grbyMlVCvJSfxFQUndw5mCtWs5LO1gUlwP4CDi4iJBbVpZcqLVT29FxgGuBJGSzyOxotFG4LoO5X+M1350zmPA== +"@esbuild/linux-x64@0.19.12": + version "0.19.12" + resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.19.12.tgz#5f37cfdc705aea687dfe5dfbec086a05acfe9c78" + integrity sha512-B71g1QpxfwBvNrfyJdVDexenDIt1CiDN1TIXLbhOw0KhJzE78KIFGX6OJ9MrtC0oOqMWf+0xop4qEU8JrJTwCg== + "@esbuild/netbsd-x64@0.19.11": version "0.19.11" resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.19.11.tgz#d633c09492a1721377f3bccedb2d821b911e813d" integrity sha512-13jvrQZJc3P230OhU8xgwUnDeuC/9egsjTkXN49b3GcS5BKvJqZn86aGM8W9pd14Kd+u7HuFBMVtrNGhh6fHEQ== +"@esbuild/netbsd-x64@0.19.12": + version "0.19.12" + resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.19.12.tgz#29da566a75324e0d0dd7e47519ba2f7ef168657b" + integrity sha512-3ltjQ7n1owJgFbuC61Oj++XhtzmymoCihNFgT84UAmJnxJfm4sYCiSLTXZtE00VWYpPMYc+ZQmB6xbSdVh0JWA== + "@esbuild/openbsd-x64@0.19.11": version "0.19.11" resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.19.11.tgz#17388c76e2f01125bf831a68c03a7ffccb65d1a2" integrity sha512-ysyOGZuTp6SNKPE11INDUeFVVQFrhcNDVUgSQVDzqsqX38DjhPEPATpid04LCoUr2WXhQTEZ8ct/EgJCUDpyNw== +"@esbuild/openbsd-x64@0.19.12": + version "0.19.12" + resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.19.12.tgz#306c0acbdb5a99c95be98bdd1d47c916e7dc3ff0" + integrity sha512-RbrfTB9SWsr0kWmb9srfF+L933uMDdu9BIzdA7os2t0TXhCRjrQyCeOt6wVxr79CKD4c+p+YhCj31HBkYcXebw== + "@esbuild/sunos-x64@0.19.11": version "0.19.11" resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.19.11.tgz#e320636f00bb9f4fdf3a80e548cb743370d41767" integrity sha512-Hf+Sad9nVwvtxy4DXCZQqLpgmRTQqyFyhT3bZ4F2XlJCjxGmRFF0Shwn9rzhOYRB61w9VMXUkxlBy56dk9JJiQ== +"@esbuild/sunos-x64@0.19.12": + version "0.19.12" + resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.19.12.tgz#0933eaab9af8b9b2c930236f62aae3fc593faf30" + integrity sha512-HKjJwRrW8uWtCQnQOz9qcU3mUZhTUQvi56Q8DPTLLB+DawoiQdjsYq+j+D3s9I8VFtDr+F9CjgXKKC4ss89IeA== + "@esbuild/win32-arm64@0.19.11": version "0.19.11" resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.19.11.tgz#c778b45a496e90b6fc373e2a2bb072f1441fe0ee" integrity sha512-0P58Sbi0LctOMOQbpEOvOL44Ne0sqbS0XWHMvvrg6NE5jQ1xguCSSw9jQeUk2lfrXYsKDdOe6K+oZiwKPilYPQ== +"@esbuild/win32-arm64@0.19.12": + version "0.19.12" + resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.19.12.tgz#773bdbaa1971b36db2f6560088639ccd1e6773ae" + integrity sha512-URgtR1dJnmGvX864pn1B2YUYNzjmXkuJOIqG2HdU62MVS4EHpU2946OZoTMnRUHklGtJdJZ33QfzdjGACXhn1A== + "@esbuild/win32-ia32@0.19.11": version "0.19.11" resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.19.11.tgz#481a65fee2e5cce74ec44823e6b09ecedcc5194c" integrity sha512-6YOrWS+sDJDmshdBIQU+Uoyh7pQKrdykdefC1avn76ss5c+RN6gut3LZA4E2cH5xUEp5/cA0+YxRaVtRAb0xBg== +"@esbuild/win32-ia32@0.19.12": + version "0.19.12" + resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.19.12.tgz#000516cad06354cc84a73f0943a4aa690ef6fd67" + integrity sha512-+ZOE6pUkMOJfmxmBZElNOx72NKpIa/HFOMGzu8fqzQJ5kgf6aTGrcJaFsNiVMH4JKpMipyK+7k0n2UXN7a8YKQ== + "@esbuild/win32-x64@0.19.11": version "0.19.11" resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.19.11.tgz#a5d300008960bb39677c46bf16f53ec70d8dee04" integrity sha512-vfkhltrjCAb603XaFhqhAF4LGDi2M4OrCRrFusyQ+iTLQ/o60QQXxc9cZC/FFpihBI9N1Grn6SMKVJ4KP7Fuiw== +"@esbuild/win32-x64@0.19.12": + version "0.19.12" + resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.19.12.tgz#c57c8afbb4054a3ab8317591a0b7320360b444ae" + integrity sha512-T1QyPSDCyMXaO3pzBkF96E8xMkiRYbUEZADd29SyPGabqxMViNoii+NcK7eWJAEoU6RZyEm5lVSIjTmcdoB9HA== + "@eslint-community/eslint-utils@^4.2.0", "@eslint-community/eslint-utils@^4.4.0": version "4.4.0" resolved "https://registry.yarnpkg.com/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz#a23514e8fb9af1269d5f7788aa556798d61c6b59" @@ -177,19 +292,19 @@ dependencies: tslib "^2.4.0" -"@formatjs/icu-messageformat-parser@2.7.5": - version "2.7.5" - resolved "https://registry.yarnpkg.com/@formatjs/icu-messageformat-parser/-/icu-messageformat-parser-2.7.5.tgz#6c12c08544eafef874df13b30729daf7b4dbd089" - integrity sha512-zCB53HdGDibh6/2ISEN3TGsFQruQ6gGKMFV94qHNyVrs0tNO6ncKhV0vq0n3Ydz8ipIQ2GaYAvfCoimNOVvKqA== +"@formatjs/icu-messageformat-parser@2.7.6": + version "2.7.6" + resolved "https://registry.yarnpkg.com/@formatjs/icu-messageformat-parser/-/icu-messageformat-parser-2.7.6.tgz#3d69806de056d2919d53dad895a5ff4851e4e9ff" + integrity sha512-etVau26po9+eewJKYoiBKP6743I1br0/Ie00Pb/S/PtmYfmjTcOn2YCh2yNkSZI12h6Rg+BOgQYborXk46BvkA== dependencies: "@formatjs/ecma402-abstract" "1.18.2" - "@formatjs/icu-skeleton-parser" "1.7.2" + "@formatjs/icu-skeleton-parser" "1.8.0" tslib "^2.4.0" -"@formatjs/icu-skeleton-parser@1.7.2": - version "1.7.2" - resolved "https://registry.yarnpkg.com/@formatjs/icu-skeleton-parser/-/icu-skeleton-parser-1.7.2.tgz#ffbdd535c33249635ad0e54a34813194287a1567" - integrity sha512-nlIXVv280bjGW3ail5Np1+xgGKBnMhwQQIivgbk9xX0af8ESQO+y2VW9TOY7mCrs3WH786uVpZlLimXAlXH7SA== +"@formatjs/icu-skeleton-parser@1.8.0": + version "1.8.0" + resolved "https://registry.yarnpkg.com/@formatjs/icu-skeleton-parser/-/icu-skeleton-parser-1.8.0.tgz#5f3d3a620c687d6f8c180d80d1241e8f213acf79" + integrity sha512-QWLAYvM0n8hv7Nq5BEs4LKIjevpVpbGLAJgOaYzg9wABEoX1j0JO1q2/jVkO6CVlq0dbsxZCngS5aXbysYueqA== dependencies: "@formatjs/ecma402-abstract" "1.18.2" tslib "^2.4.0" @@ -220,31 +335,31 @@ resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-2.0.2.tgz#d9fae00a2d5cb40f92cfe64b47ad749fbc38f917" integrity sha512-6EwiSjwWYP7pTckG6I5eyFANjPhmPjUX9JRLUSfNPC7FX7zK9gyZAfUEaECL6ALTpGX5AjnBq3C9XmVWPitNpw== -"@jridgewell/gen-mapping@^0.3.0": - version "0.3.3" - resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz#7e02e6eb5df901aaedb08514203b096614024098" - integrity sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ== +"@jridgewell/gen-mapping@^0.3.5": + version "0.3.5" + resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz#dcce6aff74bdf6dad1a95802b69b04a2fcb1fb36" + integrity sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg== dependencies: - "@jridgewell/set-array" "^1.0.1" + "@jridgewell/set-array" "^1.2.1" "@jridgewell/sourcemap-codec" "^1.4.10" - "@jridgewell/trace-mapping" "^0.3.9" + "@jridgewell/trace-mapping" "^0.3.24" "@jridgewell/resolve-uri@^3.1.0": - version "3.1.1" - resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz#c08679063f279615a3326583ba3a90d1d82cc721" - integrity sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA== + version "3.1.2" + resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz#7a0ee601f60f99a20c7c7c5ff0c80388c1189bd6" + integrity sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw== -"@jridgewell/set-array@^1.0.1": - version "1.1.2" - resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.1.2.tgz#7c6cf998d6d20b914c0a55a91ae928ff25965e72" - integrity sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw== +"@jridgewell/set-array@^1.2.1": + version "1.2.1" + resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.2.1.tgz#558fb6472ed16a4c850b889530e6b36438c49280" + integrity sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A== "@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@^1.4.14", "@jridgewell/sourcemap-codec@^1.4.15": version "1.4.15" resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz#d7c6e6755c78567a951e04ab52ef0fd26de59f32" integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg== -"@jridgewell/trace-mapping@^0.3.17", "@jridgewell/trace-mapping@^0.3.18", "@jridgewell/trace-mapping@^0.3.9": +"@jridgewell/trace-mapping@^0.3.17": version "0.3.21" resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.21.tgz#5dc1df7b3dc4a6209e503a924e1ca56097a2bb15" integrity sha512-SRfKmRe1KvYnxjEMtxEr+J4HIeMX5YBg/qhRHpxEIGjhX1rshcHlnFUE9K0GazhVKWM7B+nARSkV8LuvJdJ5/g== @@ -252,6 +367,14 @@ "@jridgewell/resolve-uri" "^3.1.0" "@jridgewell/sourcemap-codec" "^1.4.14" +"@jridgewell/trace-mapping@^0.3.18", "@jridgewell/trace-mapping@^0.3.24": + version "0.3.25" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz#15f190e98895f3fc23276ee14bc76b675c2e50f0" + integrity sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ== + dependencies: + "@jridgewell/resolve-uri" "^3.1.0" + "@jridgewell/sourcemap-codec" "^1.4.14" + "@kurkle/color@^0.3.0": version "0.3.2" resolved "https://registry.yarnpkg.com/@kurkle/color/-/color-0.3.2.tgz#5acd38242e8bde4f9986e7913c8fdf49d3aa199f" @@ -278,10 +401,10 @@ "@nodelib/fs.scandir" "2.1.5" fastq "^1.6.0" -"@orbitale/svelte-admin@^0.11.1": - version "0.11.1" - resolved "https://registry.yarnpkg.com/@orbitale/svelte-admin/-/svelte-admin-0.11.1.tgz#629b0e27db335209d0b8aa39c07784dc0744eec9" - integrity sha512-x5bfeTyBt2/Q6jFzxerK9kMCvGh8Js/ISwYs+dDX8we3E7z9QHTPUmS3f4FRwh9CN8obpwirV59VAMH6QeEDOA== +"@orbitale/svelte-admin@^0.16.0": + version "0.16.0" + resolved "https://registry.yarnpkg.com/@orbitale/svelte-admin/-/svelte-admin-0.16.0.tgz#1eb13fa5e1d41868b75530992473ab8043e3de3a" + integrity sha512-lYP5iGCe37PQGNvFcSMt+VtwIW9CkwgP7oUNItwm0WXcm9OEPXdTidnn613l4A0pSEOCFFKAGhJ68Z1mCuvW7Q== dependencies: "@zerodevx/svelte-toast" "^0.9.5" carbon-components-svelte "^0.80.0" @@ -289,6 +412,7 @@ luxon "^3.4.4" svelte "^4.0.0" svelte-i18n "^4.0.0" + typedoc "^0.25.8" "@polka/url@^1.0.0-next.24": version "1.0.0-next.24" @@ -360,13 +484,6 @@ resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.9.5.tgz#10491ccf4f63c814d4149e0316541476ea603602" integrity sha512-1q+mykKE3Vot1kaFJIDoUFv5TuW+QQVaf2FmTT9krg86pQrGStOSJJ0Zil7CFagyxDuouTepzt5Y5TVzyajOdQ== -"@sveltejs/adapter-auto@^3.0.0": - version "3.1.0" - resolved "https://registry.yarnpkg.com/@sveltejs/adapter-auto/-/adapter-auto-3.1.0.tgz#d0a76030573d3f42376dac2ac1abf1d0ccad7cff" - integrity sha512-igS5hqCwdiXWb8NoWzThKCVQQj9tKgUkbTtzfxBPgSLOyFjkiGNDX0SgCoY2QIUWBqOkfGTOqGlrW5Ynw9oUvw== - dependencies: - import-meta-resolve "^4.0.0" - "@sveltejs/adapter-static@^3.0.1": version "3.0.1" resolved "https://registry.yarnpkg.com/@sveltejs/adapter-static/-/adapter-static-3.0.1.tgz#64c36020435d7b1eacd362b2d027fefda5ec2e44" @@ -635,6 +752,11 @@ ansi-regex@^5.0.1: resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== +ansi-sequence-parser@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/ansi-sequence-parser/-/ansi-sequence-parser-1.1.1.tgz#e0aa1cdcbc8f8bb0b5bca625aac41f5f056973cf" + integrity sha512-vJXt3yiaUL4UU546s3rPXlsry/RnM730G1+HkpKE012AN0sx1eOrxSu95oKDIonskeLTijMgqWZ3uDEe3NFvyg== + ansi-styles@^4.1.0: version "4.3.0" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" @@ -730,7 +852,12 @@ carbon-components-svelte@^0.82.8: dependencies: flatpickr "4.6.9" -carbon-icons-svelte@^12.0.0, carbon-icons-svelte@^12.4.2: +carbon-icons-svelte@^12.0.0: + version "12.6.0" + resolved "https://registry.yarnpkg.com/carbon-icons-svelte/-/carbon-icons-svelte-12.6.0.tgz#fbda37a7f69129c8e82544599bde40c64c288b42" + integrity sha512-tw5jUSASVfdZ30CcynKWwQalkUIn3I2OFKvyormaoNH6bWjtXp21ESqDSuZ0RgZbxzaeBoUJaEJpsSTX5YjElA== + +carbon-icons-svelte@^12.4.2: version "12.4.2" resolved "https://registry.yarnpkg.com/carbon-icons-svelte/-/carbon-icons-svelte-12.4.2.tgz#9e354f1a6a38882178a80f762ec6693adba26a38" integrity sha512-NSGcRkbKkJvkfEatHlNh2Gn0pyBGlKkd828kH5HYMh+cwJQLtaAabCT+TcykL4DnSHUKJiXTw7H1CUN5tlNJKg== @@ -766,12 +893,12 @@ chart.js@^4.4.1: fsevents "~2.3.2" cli-color@^2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/cli-color/-/cli-color-2.0.3.tgz#73769ba969080629670f3f2ef69a4bf4e7cc1879" - integrity sha512-OkoZnxyC4ERN3zLzZaY9Emb7f/MhBOIpePv0Ycok0fJYT+Ouo00UBEIwsVsr0yoow++n5YWlSUgST9GKhNHiRQ== + version "2.0.4" + resolved "https://registry.yarnpkg.com/cli-color/-/cli-color-2.0.4.tgz#d658080290968816b322248b7306fad2346fb2c8" + integrity sha512-zlnpg0jNcibNrO7GG9IeHH7maWFeCz+Ja1wx/7tZNU5ASSSSZ+/qZciM0/LHCYxSdqv5h2sdbQ/PXYdOuetXvA== dependencies: d "^1.0.1" - es5-ext "^0.10.61" + es5-ext "^0.10.64" es6-iterator "^2.0.3" memoizee "^0.4.15" timers-ext "^0.1.7" @@ -831,13 +958,13 @@ cssesc@^3.0.0: resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee" integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg== -d@1, d@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/d/-/d-1.0.1.tgz#8698095372d58dbee346ffd0c7093f99f8f9eb5a" - integrity sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA== +d@1, d@^1.0.1, d@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/d/-/d-1.0.2.tgz#2aefd554b81981e7dccf72d6842ae725cb17e5de" + integrity sha512-MOqHvMWF9/9MX6nza0KgvFH4HpMU0EF5uUDXqX/BtxtU8NfB0QzRtJ8Oe/6SuS4kbhyzVJwjd97EA4PKrzJ8bw== dependencies: - es5-ext "^0.10.50" - type "^1.0.1" + es5-ext "^0.10.64" + type "^2.7.2" debug@^4.3.1, debug@^4.3.2, debug@^4.3.4: version "4.3.4" @@ -885,13 +1012,14 @@ doctrine@^3.0.0: dependencies: esutils "^2.0.2" -es5-ext@^0.10.35, es5-ext@^0.10.46, es5-ext@^0.10.50, es5-ext@^0.10.53, es5-ext@^0.10.61, es5-ext@~0.10.14, es5-ext@~0.10.2, es5-ext@~0.10.46: - version "0.10.62" - resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.62.tgz#5e6adc19a6da524bf3d1e02bbc8960e5eb49a9a5" - integrity sha512-BHLqn0klhEpnOKSrzn/Xsz2UIW8j+cGmo9JLzr8BiUapV8hPL9+FliFqjwr9ngW7jWdnxv6eO+/LqyhJVqgrjA== +es5-ext@^0.10.35, es5-ext@^0.10.46, es5-ext@^0.10.53, es5-ext@^0.10.62, es5-ext@^0.10.64, es5-ext@~0.10.14, es5-ext@~0.10.2, es5-ext@~0.10.46: + version "0.10.64" + resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.64.tgz#12e4ffb48f1ba2ea777f1fcdd1918ef73ea21714" + integrity sha512-p2snDhiLaXe6dahss1LddxqEm+SkuDvV8dnIQG0MWjyHpcMNfXKPE+/Cc0y+PhxJX3A4xGNeFCj5oc0BUh6deg== dependencies: es6-iterator "^2.0.3" es6-symbol "^3.1.3" + esniff "^2.0.1" next-tick "^1.1.0" es6-iterator@^2.0.3: @@ -909,12 +1037,12 @@ es6-promise@^3.1.2: integrity sha512-SOp9Phqvqn7jtEUxPWdWfWoLmyt2VaJ6MpvP9Comy1MceMXqE6bxvaTu4iaxpYYPzhny28Lc+M87/c2cPK6lDg== es6-symbol@^3.1.1, es6-symbol@^3.1.3: - version "3.1.3" - resolved "https://registry.yarnpkg.com/es6-symbol/-/es6-symbol-3.1.3.tgz#bad5d3c1bcdac28269f4cb331e431c78ac705d18" - integrity sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA== + version "3.1.4" + resolved "https://registry.yarnpkg.com/es6-symbol/-/es6-symbol-3.1.4.tgz#f4e7d28013770b4208ecbf3e0bf14d3bcb557b8c" + integrity sha512-U9bFFjX8tFiATgtkJ1zg25+KviIXpgRvRHS8sau3GfhVzThRQrOeksPeT0BWW2MNZs1OEWJ1DPXOQMn0KKRkvg== dependencies: - d "^1.0.1" - ext "^1.1.2" + d "^1.0.2" + ext "^1.7.0" es6-weak-map@^2.0.3: version "2.0.3" @@ -926,7 +1054,36 @@ es6-weak-map@^2.0.3: es6-iterator "^2.0.3" es6-symbol "^3.1.1" -esbuild@^0.19.2, esbuild@^0.19.3: +esbuild@^0.19.2: + version "0.19.12" + resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.19.12.tgz#dc82ee5dc79e82f5a5c3b4323a2a641827db3e04" + integrity sha512-aARqgq8roFBj054KvQr5f1sFu0D65G+miZRCuJyJ0G13Zwx7vRar5Zhn2tkQNzIXcBrNVsv/8stehpj+GAjgbg== + optionalDependencies: + "@esbuild/aix-ppc64" "0.19.12" + "@esbuild/android-arm" "0.19.12" + "@esbuild/android-arm64" "0.19.12" + "@esbuild/android-x64" "0.19.12" + "@esbuild/darwin-arm64" "0.19.12" + "@esbuild/darwin-x64" "0.19.12" + "@esbuild/freebsd-arm64" "0.19.12" + "@esbuild/freebsd-x64" "0.19.12" + "@esbuild/linux-arm" "0.19.12" + "@esbuild/linux-arm64" "0.19.12" + "@esbuild/linux-ia32" "0.19.12" + "@esbuild/linux-loong64" "0.19.12" + "@esbuild/linux-mips64el" "0.19.12" + "@esbuild/linux-ppc64" "0.19.12" + "@esbuild/linux-riscv64" "0.19.12" + "@esbuild/linux-s390x" "0.19.12" + "@esbuild/linux-x64" "0.19.12" + "@esbuild/netbsd-x64" "0.19.12" + "@esbuild/openbsd-x64" "0.19.12" + "@esbuild/sunos-x64" "0.19.12" + "@esbuild/win32-arm64" "0.19.12" + "@esbuild/win32-ia32" "0.19.12" + "@esbuild/win32-x64" "0.19.12" + +esbuild@^0.19.3: version "0.19.11" resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.19.11.tgz#4a02dca031e768b5556606e1b468fe72e3325d96" integrity sha512-HJ96Hev2hX/6i5cDVwcqiJBBtuo9+FeIJOtZ9W1kA5M6AMJRHUZlpYZ1/SbEwtO0ioNAW8rUooVpC/WehY2SfA== @@ -1050,6 +1207,16 @@ esm-env@^1.0.0: resolved "https://registry.yarnpkg.com/esm-env/-/esm-env-1.0.0.tgz#b124b40b180711690a4cb9b00d16573391950413" integrity sha512-Cf6VksWPsTuW01vU9Mk/3vRue91Zevka5SjyNf3nEpokFRuqt/KjUQoGAwq9qMmhpLTHmXzSIrFRw8zxWzmFBA== +esniff@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/esniff/-/esniff-2.0.1.tgz#a4d4b43a5c71c7ec51c51098c1d8a29081f9b308" + integrity sha512-kTUIGKQ/mDPFoJ0oVfcmyJn4iBDRptjNVIzwIFR7tqWXdVI9xfA2RMwY/gbSpJG3lkdWNEjLap/NqVHZiJsdfg== + dependencies: + d "^1.0.1" + es5-ext "^0.10.62" + event-emitter "^0.3.5" + type "^2.7.2" + espree@^9.0.0, espree@^9.6.0, espree@^9.6.1: version "9.6.1" resolved "https://registry.yarnpkg.com/espree/-/espree-9.6.1.tgz#a2a17b8e434690a5432f2f8018ce71d331a48c6f" @@ -1103,7 +1270,7 @@ event-emitter@^0.3.5: d "1" es5-ext "~0.10.14" -ext@^1.1.2: +ext@^1.7.0: version "1.7.0" resolved "https://registry.yarnpkg.com/ext/-/ext-1.7.0.tgz#0ea4383c0103d60e70be99e9a7f11027a33c4f5f" integrity sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw== @@ -1306,13 +1473,13 @@ inherits@2: integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== intl-messageformat@^10.5.3: - version "10.5.10" - resolved "https://registry.yarnpkg.com/intl-messageformat/-/intl-messageformat-10.5.10.tgz#638b7a9a4926a04f784dfe6e77104a0c537deb36" - integrity sha512-3yzwX6t/my9WRtNiqP05r+/UkpWxwstQiwaHAiuHmDRt7ykzWJ+nceOVjNLZYYWGiSltY+C+Likd8OIVkASepw== + version "10.5.11" + resolved "https://registry.yarnpkg.com/intl-messageformat/-/intl-messageformat-10.5.11.tgz#95d6a3b0b303f924d5d8c3f8d3ad057d1dc73c64" + integrity sha512-eYq5fkFBVxc7GIFDzpFQkDOZgNayNTQn4Oufe8jw6YY6OHVw70/4pA3FyCsQ0Gb2DnvEJEMmN2tOaXUGByM+kg== dependencies: "@formatjs/ecma402-abstract" "1.18.2" "@formatjs/fast-memoize" "2.2.0" - "@formatjs/icu-messageformat-parser" "2.7.5" + "@formatjs/icu-messageformat-parser" "2.7.6" tslib "^2.4.0" is-binary-path@~2.1.0: @@ -1383,6 +1550,11 @@ json-stable-stringify-without-jsonify@^1.0.1: resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== +jsonc-parser@^3.2.0: + version "3.2.1" + resolved "https://registry.yarnpkg.com/jsonc-parser/-/jsonc-parser-3.2.1.tgz#031904571ccf929d7670ee8c547545081cb37f1a" + integrity sha512-AilxAyFOAcK5wA1+LeaySVBrHsGQvUFCDWXKpZjzaL0PqW+xfBOttn8GNtWKFWqneyMZj41MWF9Kl6iPWLwgOA== + keyv@^4.5.3: version "4.5.4" resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.5.4.tgz#a879a99e29452f942439f2a405e3af8b31d4de93" @@ -1444,18 +1616,35 @@ lru-queue@^0.1.0: dependencies: es5-ext "~0.10.2" +lunr@^2.3.9: + version "2.3.9" + resolved "https://registry.yarnpkg.com/lunr/-/lunr-2.3.9.tgz#18b123142832337dd6e964df1a5a7707b25d35e1" + integrity sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow== + luxon@^3.4.4: version "3.4.4" resolved "https://registry.yarnpkg.com/luxon/-/luxon-3.4.4.tgz#cf20dc27dc532ba41a169c43fdcc0063601577af" integrity sha512-zobTr7akeGHnv7eBOXcRgMeCP6+uyYsczwmeRCauvpvaAltgNyTbLH/+VaEAPUeWBT+1GuNmz4wC/6jtQzbbVA== -magic-string@^0.30.4, magic-string@^0.30.5: +magic-string@^0.30.4: + version "0.30.8" + resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.30.8.tgz#14e8624246d2bedba70d5462aa99ac9681844613" + integrity sha512-ISQTe55T2ao7XtlAStud6qwYPZjE4GK1S/BeVPus4jrq6JuOnQ00YKQC581RWhR122W7msZV263KzVeLoqidyQ== + dependencies: + "@jridgewell/sourcemap-codec" "^1.4.15" + +magic-string@^0.30.5: version "0.30.5" resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.30.5.tgz#1994d980bd1c8835dc6e78db7cbd4ae4f24746f9" integrity sha512-7xlpfBaQaP/T6Vh8MO/EqXSW5En6INHEvEXQiuff7Gku0PWjU3uf6w/j9o7O+SpB5fOAkrI5HeoNgwjEO0pFsA== dependencies: "@jridgewell/sourcemap-codec" "^1.4.15" +marked@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/marked/-/marked-4.3.0.tgz#796362821b019f734054582038b116481b456cf3" + integrity sha512-PRsaiG84bK+AMvxziE/lCFss8juXjNaWzVbN5tXAm4XjeaS9NAHhop+PjQxz2A9h8Q4M/xGmzP8vqNwy6JeK0A== + mdn-data@2.0.30: version "2.0.30" resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.0.30.tgz#ce4df6f80af6cfbe218ecd5c552ba13c4dfa08cc" @@ -1493,7 +1682,7 @@ min-indent@^1.0.0: resolved "https://registry.yarnpkg.com/min-indent/-/min-indent-1.0.1.tgz#a63f681673b30571fbe8bc25686ae746eefa9869" integrity sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg== -minimatch@9.0.3: +minimatch@9.0.3, minimatch@^9.0.3: version "9.0.3" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.3.tgz#a6e00c3de44c3a542bfaae70abfc22420a6da825" integrity sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg== @@ -1803,6 +1992,16 @@ shebang-regex@^3.0.0: resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== +shiki@^0.14.7: + version "0.14.7" + resolved "https://registry.yarnpkg.com/shiki/-/shiki-0.14.7.tgz#c3c9e1853e9737845f1d2ef81b31bcfb07056d4e" + integrity sha512-dNPAPrxSc87ua2sKJ3H5dQ/6ZaY8RNnaAqK+t0eG7p0Soi2ydiqbGOTaZCqaYvA/uZYfS1LJnemt3Q+mSfcPCg== + dependencies: + ansi-sequence-parser "^1.1.0" + jsonc-parser "^3.2.0" + vscode-oniguruma "^1.7.0" + vscode-textmate "^8.0.0" + sirv@^2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/sirv/-/sirv-2.0.4.tgz#5dd9a725c578e34e449f332703eb2a74e46a29b0" @@ -1917,7 +2116,27 @@ svelte-preprocess@^5.1.0: sorcery "^0.11.0" strip-indent "^3.0.0" -svelte@^4.0.0, svelte@^4.2.7: +svelte@^4.0.0: + version "4.2.12" + resolved "https://registry.yarnpkg.com/svelte/-/svelte-4.2.12.tgz#13d98d2274d24d3ad216c8fdc801511171c70bb1" + integrity sha512-d8+wsh5TfPwqVzbm4/HCXC783/KPHV60NvwitJnyTA5lWn1elhXMNWhXGCJ7PwPa8qFUnyJNIyuIRt2mT0WMug== + dependencies: + "@ampproject/remapping" "^2.2.1" + "@jridgewell/sourcemap-codec" "^1.4.15" + "@jridgewell/trace-mapping" "^0.3.18" + "@types/estree" "^1.0.1" + acorn "^8.9.0" + aria-query "^5.3.0" + axobject-query "^4.0.0" + code-red "^1.0.3" + css-tree "^2.3.1" + estree-walker "^3.0.3" + is-reference "^3.0.1" + locate-character "^3.0.0" + magic-string "^0.30.4" + periscopic "^3.1.0" + +svelte@^4.2.7: version "4.2.9" resolved "https://registry.yarnpkg.com/svelte/-/svelte-4.2.9.tgz#ece982ccc5b700c27e85cdf130c0e343c195fab5" integrity sha512-hsoB/WZGEPFXeRRLPhPrbRz67PhP6sqYgvwcAs+gWdSQSvNDw+/lTeUJSWe5h2xC97Fz/8QxAOqItwBzNJPU8w== @@ -1997,16 +2216,21 @@ type-fest@^0.20.2: resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4" integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== -type@^1.0.1: - version "1.2.0" - resolved "https://registry.yarnpkg.com/type/-/type-1.2.0.tgz#848dd7698dafa3e54a6c479e759c4bc3f18847a0" - integrity sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg== - type@^2.7.2: version "2.7.2" resolved "https://registry.yarnpkg.com/type/-/type-2.7.2.tgz#2376a15a3a28b1efa0f5350dcf72d24df6ef98d0" integrity sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw== +typedoc@^0.25.8: + version "0.25.12" + resolved "https://registry.yarnpkg.com/typedoc/-/typedoc-0.25.12.tgz#f73f0a8d3731d418cc604d4230f95a857799e27a" + integrity sha512-F+qhkK2VoTweDXd1c42GS/By2DvI2uDF4/EpG424dTexSHdtCH52C6IcAvMA6jR3DzAWZjHpUOW+E02kyPNUNw== + dependencies: + lunr "^2.3.9" + marked "^4.3.0" + minimatch "^9.0.3" + shiki "^0.14.7" + typescript@^5.0.0, typescript@^5.0.3: version "5.3.3" resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.3.3.tgz#b3ce6ba258e72e6305ba66f5c9b452aaee3ffe37" @@ -2040,6 +2264,16 @@ vitefu@^0.2.5: resolved "https://registry.yarnpkg.com/vitefu/-/vitefu-0.2.5.tgz#c1b93c377fbdd3e5ddd69840ea3aa70b40d90969" integrity sha512-SgHtMLoqaeeGnd2evZ849ZbACbnwQCIwRH57t18FxcXoZop0uQu0uzlIhJBlF/eWVzuce0sHeqPcDo+evVcg8Q== +vscode-oniguruma@^1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/vscode-oniguruma/-/vscode-oniguruma-1.7.0.tgz#439bfad8fe71abd7798338d1cd3dc53a8beea94b" + integrity sha512-L9WMGRfrjOhgHSdOYgCt/yRMsXzLDJSL7BPrOZt73gU0iWO4mpqzqQzOz5srxqTvMBaR0XZTSrVWo4j55Rc6cA== + +vscode-textmate@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/vscode-textmate/-/vscode-textmate-8.0.0.tgz#2c7a3b1163ef0441097e0b5d6389cd5504b59e5d" + integrity sha512-AFbieoL7a5LMqcnOF04ji+rpXadgOXnZsxQr//r83kLPr7biP7am3g9zbaZIaBGwBRWeSvoMD4mgPdX3e4NWBg== + which@^2.0.1: version "2.0.2" resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" From 1622d10d717d7b655cb0fddda8bf7cb29ed18219 Mon Sep 17 00:00:00 2001 From: Alex Rock Ancelet Date: Thu, 14 Mar 2024 17:20:55 +0100 Subject: [PATCH 14/19] Update cruds after SvelteAdmin update, and start using KeyValueObject field for related entities --- src/lib/crud/cruds/BankAccountsCrud.ts | 17 ++++++++++------- src/lib/crud/cruds/OperationCrud.ts | 26 ++++++++++++++++---------- src/lib/crud/cruds/TagRulesCrud.ts | 7 ++++--- src/lib/crud/cruds/TagsCrud.ts | 7 ++++--- src/lib/crud/cruds/TriageCrud.ts | 8 ++++++-- src/lib/entities/Operation.ts | 6 +++--- 6 files changed, 43 insertions(+), 28 deletions(-) diff --git a/src/lib/crud/cruds/BankAccountsCrud.ts b/src/lib/crud/cruds/BankAccountsCrud.ts index 5c9ba101..f3507185 100644 --- a/src/lib/crud/cruds/BankAccountsCrud.ts +++ b/src/lib/crud/cruds/BankAccountsCrud.ts @@ -5,10 +5,10 @@ import { List, TextField, UrlAction, + type RequestParameters, + type CrudOperation, + type StateProcessorInput, } from "@orbitale/svelte-admin"; -import type {RequestParameters} from "@orbitale/svelte-admin/dist/request"; -import type {CrudOperation} from "@orbitale/svelte-admin/dist/Crud/Operations"; -import type {StateProcessorInput} from "@orbitale/svelte-admin/dist/State/Processor"; import {createBankAccount, getBankAccountById, getBankAccounts, updateBankAccount} from "$lib/db/bank_accounts"; import type BankAccount from "$lib/entities/BankAccount"; @@ -21,7 +21,8 @@ const baseFields = [ new TextField('currency', 'Currency'), ]; -export default new CrudDefinition('bank-accounts', { +export default new CrudDefinition({ + name: 'bank-accounts', defaultOperationName: "list", label: {plural: "BankAccounts", singular: "BankAccount"}, // minStateLoadingTimeMs: 0, @@ -34,7 +35,7 @@ export default new CrudDefinition('bank-accounts', { new Edit(baseFields), ], - stateProvider: new CallbackStateProvider(async (operation: CrudBankAccount, requestParameters: RequestParameters) => { + stateProvider: new CallbackStateProvider(async (operation: CrudOperation, requestParameters: RequestParameters) => { if (typeof window === 'undefined') { // SSR, can't call Tauri API then. return Promise.resolve([]); @@ -45,7 +46,7 @@ export default new CrudDefinition('bank-accounts', { } if (operation.name === 'view' || operation.name === 'edit') { - return getBankAccountById(requestParameters.id); + return getBankAccountById(Number(requestParameters.id)); } return Promise.resolve(null); @@ -57,10 +58,12 @@ export default new CrudDefinition('bank-accounts', { } if (operation.name === 'edit') { - data.id = parseInt(requestParameters.id, 10); + data.id = Number(requestParameters.id); + await updateBankAccount(data); success('Success!'); await goto('/crud/bank-accounts/list'); + return; } }) diff --git a/src/lib/crud/cruds/OperationCrud.ts b/src/lib/crud/cruds/OperationCrud.ts index 58395d93..b2d76840 100644 --- a/src/lib/crud/cruds/OperationCrud.ts +++ b/src/lib/crud/cruds/OperationCrud.ts @@ -1,21 +1,26 @@ import { CallbackStateProcessor, - CallbackStateProvider, CheckboxField, - CrudDefinition, DateField, + CallbackStateProvider, + CheckboxField, + CrudDefinition, + DateField, List, NumberField, PaginatedResults, TextField, UrlAction, - View + View, + type RequestParameters, + type CrudOperation, + type ListOperationOptions, + KeyValueObjectField } from "@orbitale/svelte-admin"; -import type {CrudOperation} from "@orbitale/svelte-admin/dist/Crud/Operations"; -import type {RequestParameters} from "@orbitale/svelte-admin/dist/request"; import {getOperationById, getOperations, getOperationsCount} from "$lib/db/operations"; import type Operation from "$lib/entities/Operation"; -export default new CrudDefinition('operations', { +export default new CrudDefinition({ + name: 'operations', defaultOperationName: "list", label: {plural: "Operations", singular: "Operation"}, // minStateLoadingTimeMs: 0, @@ -49,7 +54,7 @@ export default new CrudDefinition('operations', { new NumberField('amount', 'Montant'), new NumberField('hash', 'Hash'), new TextField('state', 'State'), - new TextField('bank_account', 'Bank account'), + new KeyValueObjectField('bank_account', 'Bank account', 'name'), new TextField('tags', 'Tags'), new CheckboxField('ignored_from_charts', 'Is ignored from charts'), ]), @@ -62,13 +67,14 @@ export default new CrudDefinition('operations', { } if (operation.name === 'list') { - const results = await getOperations(requestParameters.page||1); + const options: ListOperationOptions = operation.options; + const results = await getOperations(Number(requestParameters.page)||1); const numberOfItems = await getOperationsCount(null); - return Promise.resolve(new PaginatedResults(requestParameters.page, numberOfItems / operation.options.pagination.itemsPerPage, numberOfItems, results)); + return Promise.resolve(new PaginatedResults(Number(requestParameters.page), numberOfItems / Number(options.pagination?.itemsPerPage||10), numberOfItems, results)); } if (operation.name === 'view' || operation.name === 'edit') { - return getOperationById(requestParameters.id); + return getOperationById(Number(requestParameters.id)); } return Promise.resolve(null); diff --git a/src/lib/crud/cruds/TagRulesCrud.ts b/src/lib/crud/cruds/TagRulesCrud.ts index 2ce88abe..b4995146 100644 --- a/src/lib/crud/cruds/TagRulesCrud.ts +++ b/src/lib/crud/cruds/TagRulesCrud.ts @@ -21,7 +21,8 @@ const baseFields = [ new ToggleField('is_regex', 'Regex'), ]; -export default new CrudDefinition('tag-rules', { +export default new CrudDefinition({ + name: 'tag-rules', defaultOperationName: "list", label: {plural: "TagRules", singular: "TagRule"}, // minStateLoadingTimeMs: 0, @@ -39,7 +40,7 @@ export default new CrudDefinition('tag-rules', { new Edit(baseFields), ], - stateProvider: new CallbackStateProvider(async (operation: CrudTagRule, requestParameters: RequestParameters) => { + stateProvider: new CallbackStateProvider(async (operation: CrudOperation, requestParameters: RequestParameters) => { if (typeof window === 'undefined') { // SSR, can't call Tauri API then. return Promise.resolve([]); @@ -61,7 +62,7 @@ export default new CrudDefinition('tag-rules', { data.id = parseInt(requestParameters.id || 0, 10); // TODO FIXME : remove this and use proper entity injection! data.is_regex = !!data.is_regex; - data.tags = data.tags.replace(/[^0-9,]/, '').split(',').map(i => parseInt(i, 10)); + data.tags = data.tags.replace(/[^0-9,]/, '').split(',').map((i: string) => parseInt(i, 10)); const tag_rule = TagRule.fromJson(data); if (operation.name === 'new') { diff --git a/src/lib/crud/cruds/TagsCrud.ts b/src/lib/crud/cruds/TagsCrud.ts index 2976c32b..759576fa 100644 --- a/src/lib/crud/cruds/TagsCrud.ts +++ b/src/lib/crud/cruds/TagsCrud.ts @@ -3,7 +3,7 @@ import { CallbackStateProvider, CrudDefinition, Edit, List, New, - TextField, ToggleField, + TextField, UrlAction, } from "@orbitale/svelte-admin"; import type {RequestParameters} from "@orbitale/svelte-admin/dist/request"; @@ -19,7 +19,8 @@ const baseFields = [ new TextField('name', 'Name'), ]; -export default new CrudDefinition('tags', { +export default new CrudDefinition({ + name: 'tags', defaultOperationName: "list", label: {plural: "Tags", singular: "Tag"}, // minStateLoadingTimeMs: 0, @@ -37,7 +38,7 @@ export default new CrudDefinition('tags', { new Edit(baseFields), ], - stateProvider: new CallbackStateProvider(async (operation: CrudTag, requestParameters: RequestParameters) => { + stateProvider: new CallbackStateProvider(async (operation: CrudOperation, requestParameters: RequestParameters) => { if (typeof window === 'undefined') { // SSR, can't call Tauri API then. return Promise.resolve([]); diff --git a/src/lib/crud/cruds/TriageCrud.ts b/src/lib/crud/cruds/TriageCrud.ts index c216f8a1..6ce42556 100644 --- a/src/lib/crud/cruds/TriageCrud.ts +++ b/src/lib/crud/cruds/TriageCrud.ts @@ -1,7 +1,10 @@ import { CallbackStateProcessor, CallbackStateProvider, - CrudDefinition, DateField, Delete, Edit, + CrudDefinition, + DateField, + Delete, + Edit, List, NumberField, PaginatedResults, @@ -23,7 +26,8 @@ import type Operation from "$lib/entities/Operation"; import {success} from "$lib/utils/message"; import {goto} from "$app/navigation"; -export default new CrudDefinition('triage', { +export default new CrudDefinition({ + name: 'triage', defaultOperationName: "list", label: {plural: "Triaged operations", singular: "Triaged operation"}, // minStateLoadingTimeMs: 0, diff --git a/src/lib/entities/Operation.ts b/src/lib/entities/Operation.ts index f2493bd2..c7d7a410 100644 --- a/src/lib/entities/Operation.ts +++ b/src/lib/entities/Operation.ts @@ -12,7 +12,7 @@ export enum OperationState { pending_triage = 'pending_triage' } -export var operations_filters = [ +export const operations_filters = [ new ConfigFilter('details', 'Details', FilterType.text), new ConfigFilter('operation_date', 'Date', FilterType.date), new ConfigFilter('amount_in_cents', 'Amount', FilterType.number), @@ -69,7 +69,7 @@ export default class Operation implements Entity { } get date() { - let date = new Date(this.operation_date.toString()); + const date = new Date(this.operation_date.toString()); return date.toLocaleDateString(); } @@ -103,7 +103,7 @@ export default class Operation implements Entity { } const parsedDate = Date.parse( - matches.groups.year + '-' + matches.groups.month + '-' + matches.groups.day + 'T00:00:00.000Z' + matches.groups?.year + '-' + matches.groups?.month + '-' + matches.groups?.day + 'T00:00:00.000Z' ); if (isNaN(parsedDate)) { throw new Error( From b998472ba1391d8cf91f4e4460559e047e105f8a Mon Sep 17 00:00:00 2001 From: Alex Rock Ancelet Date: Thu, 14 Mar 2024 17:34:03 +0100 Subject: [PATCH 15/19] Reformat all front code --- .prettierignore | 6 + src/lib/crud/Dashboard.ts | 66 +++--- src/lib/crud/cruds/BankAccountsCrud.ts | 131 ++++++----- src/lib/crud/cruds/OperationCrud.ts | 154 +++++++------ src/lib/crud/cruds/TagRulesCrud.ts | 152 ++++++------ src/lib/crud/cruds/TagsCrud.ts | 138 ++++++----- src/lib/crud/cruds/TriageCrud.ts | 217 ++++++++++-------- src/lib/db/bank_accounts.ts | 4 +- src/lib/db/operations.ts | 14 +- src/lib/entities/Operation.ts | 30 +-- src/lib/entities/Tag.ts | 2 +- src/lib/entities/TagRule.ts | 16 +- src/routes/(main)/+layout.svelte | 6 +- src/routes/(main)/+page.svelte | 2 +- src/routes/(main)/import/+page.svelte | 2 +- src/routes/(main)/import/csv/+page.svelte | 62 ++--- src/routes/(svelteadmin)/+layout.svelte | 2 +- .../crud/[crud]/[operation]/+page.svelte | 14 +- svelte.config.js | 8 +- vite.config.ts | 2 +- 20 files changed, 559 insertions(+), 469 deletions(-) diff --git a/.prettierignore b/.prettierignore index 38972655..75980e84 100644 --- a/.prettierignore +++ b/.prettierignore @@ -11,3 +11,9 @@ node_modules pnpm-lock.yaml package-lock.json yarn.lock + +# Custom: +/src-tauri +/src/old_routes +/old/ +/.github/ diff --git a/src/lib/crud/Dashboard.ts b/src/lib/crud/Dashboard.ts index 2e3bb3c0..3af67f57 100644 --- a/src/lib/crud/Dashboard.ts +++ b/src/lib/crud/Dashboard.ts @@ -1,45 +1,39 @@ import { DashboardDefinition, UrlAction } from '@orbitale/svelte-admin'; import Home from 'carbon-icons-svelte/lib/Home.svelte'; -import PiggyBank from "carbon-icons-svelte/lib/PiggyBank.svelte"; -import ChartLogisticRegression from "carbon-icons-svelte/lib/ChartLogisticRegression.svelte"; -import ListBoxes from "carbon-icons-svelte/lib/ListBoxes.svelte"; -import Tag from "carbon-icons-svelte/lib/Tag.svelte"; -import TagGroup from "carbon-icons-svelte/lib/TagGroup.svelte"; -import FetchUpload from "carbon-icons-svelte/lib/FetchUpload.svelte"; -import ListCheckedMirror from "carbon-icons-svelte/lib/ListCheckedMirror.svelte"; +import PiggyBank from 'carbon-icons-svelte/lib/PiggyBank.svelte'; +import ChartLogisticRegression from 'carbon-icons-svelte/lib/ChartLogisticRegression.svelte'; +import ListBoxes from 'carbon-icons-svelte/lib/ListBoxes.svelte'; +import Tag from 'carbon-icons-svelte/lib/Tag.svelte'; +import TagGroup from 'carbon-icons-svelte/lib/TagGroup.svelte'; +import FetchUpload from 'carbon-icons-svelte/lib/FetchUpload.svelte'; +import ListCheckedMirror from 'carbon-icons-svelte/lib/ListCheckedMirror.svelte'; import OperationCrud from '$lib/crud/cruds/OperationCrud'; -import BankAccountsCrud from "$lib/crud/cruds/BankAccountsCrud"; -import TagRulesCrud from "$lib/crud/cruds/TagRulesCrud"; -import TagsCrud from "$lib/crud/cruds/TagsCrud"; -import TriageCrud from "$lib/crud/cruds/TriageCrud"; +import BankAccountsCrud from '$lib/crud/cruds/BankAccountsCrud'; +import TagRulesCrud from '$lib/crud/cruds/TagRulesCrud'; +import TagsCrud from '$lib/crud/cruds/TagsCrud'; +import TriageCrud from '$lib/crud/cruds/TriageCrud'; export const dashboard = new DashboardDefinition({ - adminConfig: { - defaultLocale: 'en', - rootUrl: '/crud/', - head: { - brandName: 'Compotes', - appName: '' - } - }, + adminConfig: { + defaultLocale: 'en', + rootUrl: '/crud/', + head: { + brandName: 'Compotes', + appName: '' + } + }, - sideMenu: [ - new UrlAction('Homepage', '/', Home), - // new UrlAction('Analytics', '/analytics', ChartLogisticRegression), - new UrlAction('Operations', '/crud/operations/list', ListBoxes), - new UrlAction('Tags', '/crud/tags/list', Tag), - new UrlAction('Tag rules', '/crud/tag-rules/list', TagGroup), - new UrlAction('Triage', '/crud/triage/list', ListCheckedMirror), - new UrlAction('Bank accounts', '/crud/bank-accounts/list', PiggyBank), - new UrlAction('Import', '/import', FetchUpload), - ], + sideMenu: [ + new UrlAction('Homepage', '/', Home), + // new UrlAction('Analytics', '/analytics', ChartLogisticRegression), + new UrlAction('Operations', '/crud/operations/list', ListBoxes), + new UrlAction('Tags', '/crud/tags/list', Tag), + new UrlAction('Tag rules', '/crud/tag-rules/list', TagGroup), + new UrlAction('Triage', '/crud/triage/list', ListCheckedMirror), + new UrlAction('Bank accounts', '/crud/bank-accounts/list', PiggyBank), + new UrlAction('Import', '/import', FetchUpload) + ], - cruds: [ - OperationCrud, - BankAccountsCrud, - TagRulesCrud, - TagsCrud, - TriageCrud, - ] + cruds: [OperationCrud, BankAccountsCrud, TagRulesCrud, TagsCrud, TriageCrud] }); diff --git a/src/lib/crud/cruds/BankAccountsCrud.ts b/src/lib/crud/cruds/BankAccountsCrud.ts index f3507185..c7066614 100644 --- a/src/lib/crud/cruds/BankAccountsCrud.ts +++ b/src/lib/crud/cruds/BankAccountsCrud.ts @@ -1,70 +1,95 @@ import { - CallbackStateProcessor, - CallbackStateProvider, - CrudDefinition, Edit, - List, - TextField, - UrlAction, - type RequestParameters, - type CrudOperation, - type StateProcessorInput, -} from "@orbitale/svelte-admin"; + CallbackStateProcessor, + CallbackStateProvider, + CrudDefinition, + Edit, + List, + TextField, + UrlAction, + type RequestParameters, + type CrudOperation, + type StateProcessorInput +} from '@orbitale/svelte-admin'; -import {createBankAccount, getBankAccountById, getBankAccounts, updateBankAccount} from "$lib/db/bank_accounts"; -import type BankAccount from "$lib/entities/BankAccount"; -import {goto} from "$app/navigation"; -import {success} from "$lib/utils/message"; +import { + createBankAccount, + getBankAccountById, + getBankAccounts, + updateBankAccount +} from '$lib/db/bank_accounts'; +import type BankAccount from '$lib/entities/BankAccount'; +import { goto } from '$app/navigation'; +import { success } from '$lib/utils/message'; const baseFields = [ - new TextField('name', 'Name'), - new TextField('slug', 'Identifier', {disabled: true}), - new TextField('currency', 'Currency'), + new TextField('name', 'Name'), + new TextField('slug', 'Identifier', { disabled: true }), + new TextField('currency', 'Currency') ]; export default new CrudDefinition({ - name: 'bank-accounts', - defaultOperationName: "list", - label: {plural: "BankAccounts", singular: "BankAccount"}, - // minStateLoadingTimeMs: 0, + name: 'bank-accounts', + defaultOperationName: 'list', + label: { plural: 'BankAccounts', singular: 'BankAccount' }, + // minStateLoadingTimeMs: 0, + + operations: [ + new List([...baseFields], [new UrlAction('Edit', '/crud/bank-accounts/edit')]), + new Edit(baseFields) + ], + + stateProvider: new CallbackStateProvider( + async (operation: CrudOperation, requestParameters: RequestParameters) => { + if (typeof window === 'undefined') { + // SSR, can't call Tauri API then. + return Promise.resolve([]); + } - operations: [ - new List([...baseFields], - [ - new UrlAction('Edit', '/crud/bank-accounts/edit'), - ]), - new Edit(baseFields), - ], + if (operation.name === 'list') { + return getBankAccounts(); + } - stateProvider: new CallbackStateProvider(async (operation: CrudOperation, requestParameters: RequestParameters) => { - if (typeof window === 'undefined') { - // SSR, can't call Tauri API then. - return Promise.resolve([]); - } + if (operation.name === 'view' || operation.name === 'edit') { + return getBankAccountById(Number(requestParameters.id)); + } - if (operation.name === 'list') { - return getBankAccounts(); - } + return Promise.resolve(null); + } + ), - if (operation.name === 'view' || operation.name === 'edit') { - return getBankAccountById(Number(requestParameters.id)); - } + stateProcessor: new CallbackStateProcessor( + async ( + data: StateProcessorInput, + operation: CrudOperation, + requestParameters: RequestParameters + ) => { + if (operation.name === 'new') { + if (!data) { + throw new Error('Cannot create new object: empty data.'); + } + if (Array.isArray(data)) { + throw new Error('Cannot update data as array for this action.'); + } - return Promise.resolve(null); - }), + return createBankAccount(data); + } - stateProcessor: new CallbackStateProcessor(async (data: StateProcessorInput, operation: CrudOperation, requestParameters: RequestParameters) => { - if (operation.name === 'new') { - return createBankAccount(data); - } + if (operation.name === 'edit') { + if (!data) { + throw new Error('Cannot create new object: empty data.'); + } + if (Array.isArray(data)) { + throw new Error('Cannot update data as array for this action.'); + } - if (operation.name === 'edit') { - data.id = Number(requestParameters.id); + data.id = Number(requestParameters.id); - await updateBankAccount(data); - success('Success!'); - await goto('/crud/bank-accounts/list'); + await updateBankAccount(data); + success('Success!'); + await goto('/crud/bank-accounts/list'); - return; - } - }) + return; + } + } + ) }); diff --git a/src/lib/crud/cruds/OperationCrud.ts b/src/lib/crud/cruds/OperationCrud.ts index b2d76840..71e547e7 100644 --- a/src/lib/crud/cruds/OperationCrud.ts +++ b/src/lib/crud/cruds/OperationCrud.ts @@ -1,83 +1,91 @@ import { - CallbackStateProcessor, - CallbackStateProvider, - CheckboxField, - CrudDefinition, - DateField, - List, - NumberField, - PaginatedResults, - TextField, - UrlAction, - View, - type RequestParameters, - type CrudOperation, - type ListOperationOptions, - KeyValueObjectField -} from "@orbitale/svelte-admin"; + CallbackStateProcessor, + CallbackStateProvider, + CheckboxField, + CrudDefinition, + DateField, + List, + NumberField, + PaginatedResults, + TextField, + UrlAction, + View, + type RequestParameters, + type CrudOperation, + type ListOperationOptions, + KeyValueObjectField +} from '@orbitale/svelte-admin'; -import {getOperationById, getOperations, getOperationsCount} from "$lib/db/operations"; -import type Operation from "$lib/entities/Operation"; +import { getOperationById, getOperations, getOperationsCount } from '$lib/db/operations'; +import type Operation from '$lib/entities/Operation'; export default new CrudDefinition({ - name: 'operations', - defaultOperationName: "list", - label: {plural: "Operations", singular: "Operation"}, - // minStateLoadingTimeMs: 0, + name: 'operations', + defaultOperationName: 'list', + label: { plural: 'Operations', singular: 'Operation' }, + // minStateLoadingTimeMs: 0, - operations: [ - new List( - [ - new DateField('operation_date', 'Date'), - new TextField('op_type', 'Type 1'), - new TextField('type_display', 'Type 2'), - new TextField('details', 'Details'), - new TextField('tags', 'Tags'), - new NumberField('amount_display', 'Montant'), - ], - [ - new UrlAction('View', '/crud/operations/view'), - ], - { - pagination: { - enabled: true, - itemsPerPage: 20, - } - }), - new View([ - new TextField('id', 'ID'), - new DateField('operation_date', 'Date'), - new TextField('op_type', 'Type 1'), - new TextField('type_display', 'Type 2'), - new TextField('details', 'Details'), - new NumberField('amount_in_cents', 'Montant (in cents)'), - new NumberField('amount', 'Montant'), - new NumberField('hash', 'Hash'), - new TextField('state', 'State'), - new KeyValueObjectField('bank_account', 'Bank account', 'name'), - new TextField('tags', 'Tags'), - new CheckboxField('ignored_from_charts', 'Is ignored from charts'), - ]), - ], + operations: [ + new List( + [ + new DateField('operation_date', 'Date'), + new TextField('op_type', 'Type 1'), + new TextField('type_display', 'Type 2'), + new TextField('details', 'Details'), + new TextField('tags', 'Tags'), + new NumberField('amount_display', 'Montant') + ], + [new UrlAction('View', '/crud/operations/view')], + { + pagination: { + enabled: true, + itemsPerPage: 20 + } + } + ), + new View([ + new TextField('id', 'ID'), + new DateField('operation_date', 'Date'), + new TextField('op_type', 'Type 1'), + new TextField('type_display', 'Type 2'), + new TextField('details', 'Details'), + new NumberField('amount_in_cents', 'Montant (in cents)'), + new NumberField('amount', 'Montant'), + new NumberField('hash', 'Hash'), + new TextField('state', 'State'), + new KeyValueObjectField('bank_account', 'Bank account', 'name'), + new TextField('tags', 'Tags'), + new CheckboxField('ignored_from_charts', 'Is ignored from charts') + ]) + ], - stateProvider: new CallbackStateProvider(async (operation: CrudOperation, requestParameters: RequestParameters) => { - if (typeof window === 'undefined') { - // SSR, can't call Tauri API then. - return Promise.resolve([]); - } + stateProvider: new CallbackStateProvider( + async (operation: CrudOperation, requestParameters: RequestParameters) => { + if (typeof window === 'undefined') { + // SSR, can't call Tauri API then. + return Promise.resolve([]); + } - if (operation.name === 'list') { - const options: ListOperationOptions = operation.options; - const results = await getOperations(Number(requestParameters.page)||1); - const numberOfItems = await getOperationsCount(null); - return Promise.resolve(new PaginatedResults(Number(requestParameters.page), numberOfItems / Number(options.pagination?.itemsPerPage||10), numberOfItems, results)); - } + if (operation.name === 'list') { + const options: ListOperationOptions = operation.options; + const results = await getOperations(Number(requestParameters.page) || 1); + const numberOfItems = await getOperationsCount(null); + return Promise.resolve( + new PaginatedResults( + Number(requestParameters.page), + numberOfItems / Number(options.pagination?.itemsPerPage || 10), + numberOfItems, + results + ) + ); + } - if (operation.name === 'view' || operation.name === 'edit') { - return getOperationById(Number(requestParameters.id)); - } + if (operation.name === 'view' || operation.name === 'edit') { + return getOperationById(Number(requestParameters.id)); + } - return Promise.resolve(null); - }), - stateProcessor: new CallbackStateProcessor(() => {}) + return Promise.resolve(null); + } + ), + stateProcessor: new CallbackStateProcessor(() => {}) }); diff --git a/src/lib/crud/cruds/TagRulesCrud.ts b/src/lib/crud/cruds/TagRulesCrud.ts index b4995146..1d8490a5 100644 --- a/src/lib/crud/cruds/TagRulesCrud.ts +++ b/src/lib/crud/cruds/TagRulesCrud.ts @@ -1,80 +1,104 @@ import { - CallbackStateProcessor, - CallbackStateProvider, - CrudDefinition, Edit, - List, New, - TextField, ToggleField, - UrlAction, -} from "@orbitale/svelte-admin"; -import type {RequestParameters} from "@orbitale/svelte-admin/dist/request"; -import type {CrudOperation} from "@orbitale/svelte-admin/dist/Crud/Operations"; -import type {StateProcessorInput} from "@orbitale/svelte-admin/dist/State/Processor"; + CallbackStateProcessor, + CallbackStateProvider, + CrudDefinition, + Edit, + List, + New, + TextField, + ToggleField, + UrlAction, + type RequestParameters, + type CrudOperation, + type StateProcessorInput +} from '@orbitale/svelte-admin'; -import {createTagRule, getTagRuleById, getTagRules, updateTagRule} from "$lib/db/tag_rules"; -import TagRule from "$lib/entities/TagRule"; -import {goto} from "$app/navigation"; -import {success} from "$lib/utils/message"; +import { createTagRule, getTagRuleById, getTagRules, updateTagRule } from '$lib/db/tag_rules'; +import TagRule from '$lib/entities/TagRule'; +import { goto } from '$app/navigation'; +import { success } from '$lib/utils/message'; +import type Tag from '$lib/entities/Tag'; const baseFields = [ - new TextField('tags', 'Tags'), - new TextField('matching_pattern', 'Matching pattern'), - new ToggleField('is_regex', 'Regex'), + new TextField('tags', 'Tags'), + new TextField('matching_pattern', 'Matching pattern'), + new ToggleField('is_regex', 'Regex') ]; export default new CrudDefinition({ - name: 'tag-rules', - defaultOperationName: "list", - label: {plural: "TagRules", singular: "TagRule"}, - // minStateLoadingTimeMs: 0, + name: 'tag-rules', + defaultOperationName: 'list', + label: { plural: 'TagRules', singular: 'TagRule' }, + // minStateLoadingTimeMs: 0, - operations: [ - new List([new TextField('id', 'ID'), ...baseFields], - [ - new UrlAction('Edit', '/crud/tag-rules/edit'), - ], { - globalActions: [ - new UrlAction('New', '/crud/tag-rules/new'), - ], - }), - new New(baseFields), - new Edit(baseFields), - ], + operations: [ + new List( + [new TextField('id', 'ID'), ...baseFields], + [new UrlAction('Edit', '/crud/tag-rules/edit')], + { + globalActions: [new UrlAction('New', '/crud/tag-rules/new')] + } + ), + new New(baseFields), + new Edit(baseFields) + ], - stateProvider: new CallbackStateProvider(async (operation: CrudOperation, requestParameters: RequestParameters) => { - if (typeof window === 'undefined') { - // SSR, can't call Tauri API then. - return Promise.resolve([]); - } + stateProvider: new CallbackStateProvider( + async (operation: CrudOperation, requestParameters: RequestParameters) => { + if (typeof window === 'undefined') { + // SSR, can't call Tauri API then. + return Promise.resolve([]); + } - if (operation.name === 'list') { - return getTagRules(); - } + if (operation.name === 'list') { + return getTagRules(); + } - if (operation.name === 'view' || operation.name === 'edit') { - return getTagRuleById(requestParameters.id); - } + if (operation.name === 'view' || operation.name === 'edit') { + return getTagRuleById(String(requestParameters.id)); + } - return Promise.resolve(null); - }), + return Promise.resolve(null); + } + ), - stateProcessor: new CallbackStateProcessor(async (data: StateProcessorInput, operation: CrudOperation, requestParameters: RequestParameters) => { - if (operation.name === 'new' || operation.name === 'edit') { - data.id = parseInt(requestParameters.id || 0, 10); - // TODO FIXME : remove this and use proper entity injection! - data.is_regex = !!data.is_regex; - data.tags = data.tags.replace(/[^0-9,]/, '').split(',').map((i: string) => parseInt(i, 10)); - const tag_rule = TagRule.fromJson(data); + stateProcessor: new CallbackStateProcessor( + async ( + data: StateProcessorInput, + operation: CrudOperation, + requestParameters: RequestParameters + ) => { + if (operation.name === 'new' || operation.name === 'edit') { + if (!data) { + throw new Error('Cannot create new object: empty data.'); + } + if (Array.isArray(data)) { + throw new Error('Cannot update data as array for this action.'); + } - if (operation.name === 'new') { - await createTagRule(tag_rule); - } - if (operation.name === 'edit') { - await updateTagRule(tag_rule); - } + data.id = Number(requestParameters.id || 0); + // TODO FIXME : remove this and use proper entity injection! + data.is_regex = Boolean(data.is_regex); + if (!Array.isArray(data.tags)) { + // @ts-ignore + data.tags = String(data.tags) + .replace(/[^0-9,]/, '') + .split(',') + .map((i: string) => Number(i)); + } + const tag_rule = TagRule.fromJson(data); - success('Success!'); - await goto('/crud/tag-rules/list'); - return; - } - }) + if (operation.name === 'new') { + await createTagRule(tag_rule); + } + if (operation.name === 'edit') { + await updateTagRule(tag_rule); + } + + success('Success!'); + await goto('/crud/tag-rules/list'); + return; + } + } + ) }); diff --git a/src/lib/crud/cruds/TagsCrud.ts b/src/lib/crud/cruds/TagsCrud.ts index 759576fa..3c371dc3 100644 --- a/src/lib/crud/cruds/TagsCrud.ts +++ b/src/lib/crud/cruds/TagsCrud.ts @@ -1,76 +1,90 @@ import { - CallbackStateProcessor, - CallbackStateProvider, - CrudDefinition, Edit, - List, New, - TextField, - UrlAction, -} from "@orbitale/svelte-admin"; -import type {RequestParameters} from "@orbitale/svelte-admin/dist/request"; -import type {CrudOperation} from "@orbitale/svelte-admin/dist/Crud/Operations"; -import type {StateProcessorInput} from "@orbitale/svelte-admin/dist/State/Processor"; + CallbackStateProcessor, + CallbackStateProvider, + CrudDefinition, + Edit, + List, + New, + TextField, + UrlAction, + type RequestParameters, + type CrudOperation, + type StateProcessorInput +} from '@orbitale/svelte-admin'; -import {createTag, getTagById, getTags, updateTag} from "$lib/db/tags"; -import Tag from "$lib/entities/Tag"; -import {goto} from "$app/navigation"; -import {success} from "$lib/utils/message"; +import { createTag, getTagById, getTags, updateTag } from '$lib/db/tags'; +import Tag from '$lib/entities/Tag'; +import { goto } from '$app/navigation'; +import { success } from '$lib/utils/message'; -const baseFields = [ - new TextField('name', 'Name'), -]; +const baseFields = [new TextField('name', 'Name')]; export default new CrudDefinition({ - name: 'tags', - defaultOperationName: "list", - label: {plural: "Tags", singular: "Tag"}, - // minStateLoadingTimeMs: 0, + name: 'tags', + defaultOperationName: 'list', + label: { plural: 'Tags', singular: 'Tag' }, + // minStateLoadingTimeMs: 0, - operations: [ - new List([new TextField('id', 'ID'), ...baseFields], - [ - new UrlAction('Edit', '/crud/tags/edit'), - ], { - globalActions: [ - new UrlAction('New', '/crud/tags/new'), - ], - }), - new New(baseFields), - new Edit(baseFields), - ], + operations: [ + new List( + [new TextField('id', 'ID'), ...baseFields], + [new UrlAction('Edit', '/crud/tags/edit')], + { + globalActions: [new UrlAction('New', '/crud/tags/new')] + } + ), + new New(baseFields), + new Edit(baseFields) + ], - stateProvider: new CallbackStateProvider(async (operation: CrudOperation, requestParameters: RequestParameters) => { - if (typeof window === 'undefined') { - // SSR, can't call Tauri API then. - return Promise.resolve([]); - } + stateProvider: new CallbackStateProvider( + async (operation: CrudOperation, requestParameters: RequestParameters) => { + if (typeof window === 'undefined') { + // SSR, can't call Tauri API then. + return Promise.resolve([]); + } - if (operation.name === 'list') { - return getTags(); - } + if (operation.name === 'list') { + return getTags(); + } - if (operation.name === 'view' || operation.name === 'edit') { - return getTagById(requestParameters.id); - } + if (operation.name === 'view' || operation.name === 'edit') { + return getTagById(Number(requestParameters.id)); + } - return Promise.resolve(null); - }), + return Promise.resolve(null); + } + ), - stateProcessor: new CallbackStateProcessor(async (data: StateProcessorInput, operation: CrudOperation, requestParameters: RequestParameters) => { - if (operation.name === 'new' || operation.name === 'edit') { - data.id = parseInt(requestParameters.id || 0, 10); - // TODO FIXME : remove this and use proper entity injection! - const tag_rule = Tag.fromJson(data); + stateProcessor: new CallbackStateProcessor( + async ( + data: StateProcessorInput, + operation: CrudOperation, + requestParameters: RequestParameters + ) => { + if (operation.name === 'new' || operation.name === 'edit') { + if (!data) { + throw new Error('Cannot create new object: empty data.'); + } + if (Array.isArray(data)) { + throw new Error('Cannot update data as array for this action.'); + } - if (operation.name === 'new') { - await createTag(tag_rule); - } - if (operation.name === 'edit') { - await updateTag(tag_rule); - } + data.id = Number(requestParameters.id || 0); + // TODO FIXME : remove this and use proper entity injection! + const tag_rule = Tag.fromJson(data); - success('Success!'); - await goto('/crud/tags/list'); - return; - } - }) + if (operation.name === 'new') { + await createTag(tag_rule); + } + if (operation.name === 'edit') { + await updateTag(tag_rule); + } + + success('Success!'); + await goto('/crud/tags/list'); + return; + } + } + ) }); diff --git a/src/lib/crud/cruds/TriageCrud.ts b/src/lib/crud/cruds/TriageCrud.ts index 6ce42556..0186e96f 100644 --- a/src/lib/crud/cruds/TriageCrud.ts +++ b/src/lib/crud/cruds/TriageCrud.ts @@ -1,112 +1,135 @@ import { - CallbackStateProcessor, - CallbackStateProvider, - CrudDefinition, - DateField, - Delete, - Edit, - List, - NumberField, - PaginatedResults, - TextField, - UrlAction, - View -} from "@orbitale/svelte-admin"; -import type {CrudOperation} from "@orbitale/svelte-admin/dist/Crud/Operations"; -import type {RequestParameters} from "@orbitale/svelte-admin/dist/request"; -import type {StateProcessorInput} from "@orbitale/svelte-admin/dist/State/Processor"; + CallbackStateProcessor, + CallbackStateProvider, + CrudDefinition, + DateField, + Delete, + Edit, + List, + NumberField, + PaginatedResults, + TextField, + UrlAction, + View, + type CrudOperation, + type RequestParameters, + type StateProcessorInput, + type ListOperationOptions +} from '@orbitale/svelte-admin'; import { - deleteOperation, - getOperationById, - getTriageOperations, - getTriageOperationsCount, updateOperationDetails -} from "$lib/db/operations"; -import type Operation from "$lib/entities/Operation"; -import {success} from "$lib/utils/message"; -import {goto} from "$app/navigation"; + deleteOperation, + getOperationById, + getTriageOperations, + getTriageOperationsCount, + updateOperationDetails +} from '$lib/db/operations'; +import type Operation from '$lib/entities/Operation'; +import { success } from '$lib/utils/message'; +import { goto } from '$app/navigation'; export default new CrudDefinition({ - name: 'triage', - defaultOperationName: "list", - label: {plural: "Triaged operations", singular: "Triaged operation"}, - // minStateLoadingTimeMs: 0, + name: 'triage', + defaultOperationName: 'list', + label: { plural: 'Triaged operations', singular: 'Triaged operation' }, + // minStateLoadingTimeMs: 0, - operations: [ - new List( - [ - new DateField('operation_date', 'Date'), - new TextField('op_type', 'Type 1'), - new TextField('type_display', 'Type 2'), - new TextField('details', 'Details'), - new NumberField('amount_display', 'Montant'), - ], - [ - new UrlAction('View', '/crud/triage/view'), - new UrlAction('Edit', '/crud/triage/edit'), - new UrlAction('Delete', '/crud/triage/delete') - ], - { - pagination: { - enabled: true, - itemsPerPage: 20, - } - }), - new Delete([], new UrlAction('', '/crud/triage/list')), - new Edit([ - new TextField('details', 'Details'), - ]), - new View([ - new TextField('id', 'ID'), - new DateField('operation_date', 'Date'), - new TextField('op_type', 'Type 1'), - new TextField('type_display', 'Type 2'), - new TextField('details', 'Details'), - new NumberField('amount_in_cents', 'Montant (in cents)'), - new NumberField('amount', 'Montant'), - new NumberField('hash', 'Hash'), - new TextField('bank_account', 'Bank account'), - ]), - ], + operations: [ + new List( + [ + new DateField('operation_date', 'Date'), + new TextField('op_type', 'Type 1'), + new TextField('type_display', 'Type 2'), + new TextField('details', 'Details'), + new NumberField('amount_display', 'Montant') + ], + [ + new UrlAction('View', '/crud/triage/view'), + new UrlAction('Edit', '/crud/triage/edit'), + new UrlAction('Delete', '/crud/triage/delete') + ], + { + pagination: { + enabled: true, + itemsPerPage: 20 + } + } + ), + new Delete([], new UrlAction('', '/crud/triage/list')), + new Edit([new TextField('details', 'Details')]), + new View([ + new TextField('id', 'ID'), + new DateField('operation_date', 'Date'), + new TextField('op_type', 'Type 1'), + new TextField('type_display', 'Type 2'), + new TextField('details', 'Details'), + new NumberField('amount_in_cents', 'Montant (in cents)'), + new NumberField('amount', 'Montant'), + new NumberField('hash', 'Hash'), + new TextField('bank_account', 'Bank account') + ]) + ], - stateProvider: new CallbackStateProvider(async (operation: CrudOperation, requestParameters: RequestParameters) => { - if (typeof window === 'undefined') { - // SSR, can't call Tauri API then. - return Promise.resolve([]); - } + stateProvider: new CallbackStateProvider( + async (operation: CrudOperation, requestParameters: RequestParameters) => { + if (typeof window === 'undefined') { + // SSR, can't call Tauri API then. + return Promise.resolve([]); + } - if (operation.name === 'list') { - const results = await getTriageOperations(requestParameters.page||1); - const numberOfItems = await getTriageOperationsCount(); - return Promise.resolve(new PaginatedResults(requestParameters.page, numberOfItems / operation.options.pagination.itemsPerPage, numberOfItems, results)); - } + if (operation.name === 'list') { + const options: ListOperationOptions = operation.options; + const results = await getTriageOperations(Number(requestParameters.page || 1)); + const numberOfItems = await getTriageOperationsCount(); + return Promise.resolve( + new PaginatedResults( + Number(requestParameters.page), + numberOfItems / Number(options.pagination?.itemsPerPage || 10), + numberOfItems, + results + ) + ); + } - if (operation.name === 'view' || operation.name === 'edit') { - return getOperationById(requestParameters.id); - } + if (operation.name === 'view' || operation.name === 'edit') { + return getOperationById(Number(requestParameters.id)); + } - return Promise.resolve(null); - }), - stateProcessor: new CallbackStateProcessor(async (data: StateProcessorInput, operation: CrudOperation, requestParameters: RequestParameters) => { + return Promise.resolve(null); + } + ), + stateProcessor: new CallbackStateProcessor( + async ( + data: StateProcessorInput, + operation: CrudOperation, + requestParameters: RequestParameters + ) => { + if (operation.name === 'edit' || operation.name === 'delete') { + if (!data) { + throw new Error('Cannot create new object: empty data.'); + } + if (Array.isArray(data)) { + throw new Error('Cannot update data as array for this action.'); + } - if (operation.name === 'edit' || operation.name === 'delete') { - const operationObject = await getOperationById(requestParameters.id); - if (!operationObject) { - throw new Error(`Could not find operation with id "${requestParameters.id}".`); - } + const operationObject = await getOperationById(Number(requestParameters.id)); + if (!operationObject) { + throw new Error(`Could not find operation with id "${requestParameters.id}".`); + } - if (operation.name === 'edit') { - operationObject.details = data.details; - await updateOperationDetails(operationObject); - } + if (operation.name === 'edit') { + operationObject.details = data?.details || ''; + await updateOperationDetails(operationObject); + } - if (operation.name === 'delete') { - await deleteOperation(operationObject); - } + if (operation.name === 'delete') { + await deleteOperation(operationObject); + } - success('Success!'); - await goto('/crud/triage/list'); - return; - } - }) + success('Success!'); + await goto('/crud/triage/list'); + return; + } + } + ) }); diff --git a/src/lib/db/bank_accounts.ts b/src/lib/db/bank_accounts.ts index abc7412a..a1486c75 100644 --- a/src/lib/db/bank_accounts.ts +++ b/src/lib/db/bank_accounts.ts @@ -2,8 +2,8 @@ import BankAccount from '$lib/entities/BankAccount'; import api_call from '$lib/utils/api_call'; import { writable } from 'svelte/store'; import type { Writable } from 'svelte/store'; -import DeserializedOperation from "$lib/db/operations"; -import BankAccountsCrud from "$lib/crud/cruds/BankAccountsCrud"; +import DeserializedOperation from '$lib/db/operations'; +import BankAccountsCrud from '$lib/crud/cruds/BankAccountsCrud'; export const bankAccountsStore: Writable = writable(); diff --git a/src/lib/db/operations.ts b/src/lib/db/operations.ts index 3ec28155..18243156 100644 --- a/src/lib/db/operations.ts +++ b/src/lib/db/operations.ts @@ -1,10 +1,10 @@ -import Operation, {OperationState} from '$lib/entities/Operation'; +import Operation, { OperationState } from '$lib/entities/Operation'; import api_call from '$lib/utils/api_call'; -import {getTagsByIds} from './tags'; -import {getBankAccountById} from './bank_accounts'; +import { getTagsByIds } from './tags'; +import { getBankAccountById } from './bank_accounts'; import type Tag from '$lib/entities/Tag'; import type SortableField from '$lib/admin/src/SortableField'; -import {OrderBy, orderByToString} from '$lib/admin/src/OrderBy'; +import { OrderBy, orderByToString } from '$lib/admin/src/OrderBy'; import type FilterWithValue from '$lib/admin/src/FilterWithValue'; import type SavedFilter from '$lib/admin/src/SavedFilter'; @@ -27,7 +27,7 @@ export async function getOperations( sortableField: SortableField | null = null, filters: Array | null = null ): Promise> { - const params: {[key: string]: number|string|Array} = { page }; + const params: { [key: string]: number | string | Array } = { page }; if (sortableField) { params['orderField'] = sortableField.property_name; @@ -141,7 +141,9 @@ async function normalizeOperationFromDeserialized( const bank_account = await getBankAccountById(deserialized_operation.bank_account_id); if (!bank_account) { - throw new Error(`Backend could not find bank account with id "${deserialized_operation.bank_account_id}".`); + throw new Error( + `Backend could not find bank account with id "${deserialized_operation.bank_account_id}".` + ); } const tags = await getTagsByIds(deserialized_operation.tags_ids); diff --git a/src/lib/entities/Operation.ts b/src/lib/entities/Operation.ts index c7d7a410..91f3c823 100644 --- a/src/lib/entities/Operation.ts +++ b/src/lib/entities/Operation.ts @@ -3,25 +3,22 @@ import sha512 from '$lib/utils/sha512'; import { DateFormat, dateFormatToRegex, DateTime, NormalizedDate } from '$lib/utils/date'; import type Tag from './Tag'; import type Entity from '$lib/struct/Entity'; -import ConfigFilter from '../admin/src/ConfigFilter'; -import FilterType from '../admin/src/FilterType'; -import { getBankAccountsAsChoices } from '../db/bank_accounts'; export enum OperationState { ok = 'ok', pending_triage = 'pending_triage' } -export const operations_filters = [ - new ConfigFilter('details', 'Details', FilterType.text), - new ConfigFilter('operation_date', 'Date', FilterType.date), - new ConfigFilter('amount_in_cents', 'Amount', FilterType.number), - new ConfigFilter('bank_account_id', 'Bank account', FilterType.entity, { - entities: getBankAccountsAsChoices - }), - new ConfigFilter('tags_names', 'Tags', FilterType.text), - new ConfigFilter('without_tags', 'Without tags', FilterType.boolean) -]; +// export const operations_filters = [ +// new ConfigFilter('details', 'Details', FilterType.text), +// new ConfigFilter('operation_date', 'Date', FilterType.date), +// new ConfigFilter('amount_in_cents', 'Amount', FilterType.number), +// new ConfigFilter('bank_account_id', 'Bank account', FilterType.entity, { +// entities: getBankAccountsAsChoices +// }), +// new ConfigFilter('tags_names', 'Tags', FilterType.text), +// new ConfigFilter('without_tags', 'Without tags', FilterType.boolean) +// ]; export default class Operation implements Entity { public readonly id!: number; @@ -103,7 +100,12 @@ export default class Operation implements Entity { } const parsedDate = Date.parse( - matches.groups?.year + '-' + matches.groups?.month + '-' + matches.groups?.day + 'T00:00:00.000Z' + matches.groups?.year + + '-' + + matches.groups?.month + + '-' + + matches.groups?.day + + 'T00:00:00.000Z' ); if (isNaN(parsedDate)) { throw new Error( diff --git a/src/lib/entities/Tag.ts b/src/lib/entities/Tag.ts index fe413489..b0496bbb 100644 --- a/src/lib/entities/Tag.ts +++ b/src/lib/entities/Tag.ts @@ -37,7 +37,7 @@ export default class Tag implements Entity { public static fromJson(json: { name?: string }): Tag { if (json.name === undefined) { - throw new Error('Invaild JSON to create a Tag object: '+JSON.stringify(json)); + throw new Error('Invaild JSON to create a Tag object: ' + JSON.stringify(json)); } return new Tag(0, json.name); diff --git a/src/lib/entities/TagRule.ts b/src/lib/entities/TagRule.ts index 511732af..439ba386 100644 --- a/src/lib/entities/TagRule.ts +++ b/src/lib/entities/TagRule.ts @@ -2,9 +2,9 @@ import type Tag from './Tag'; import type Entity from '$lib/struct/Entity'; export type PartialTagRule = { - tags?: Array - matching_pattern?: string, - is_regex?: string|boolean + tags?: Array; + matching_pattern?: string; + is_regex?: string | boolean; }; export default class TagRule implements Entity { @@ -39,8 +39,14 @@ export default class TagRule implements Entity { } public static fromJson(json: PartialTagRule): TagRule { - if (!Array.isArray(json.tags) || json.matching_pattern === '' || json.matching_pattern === undefined || json.is_regex === '' || json.is_regex === undefined) { - throw new Error('Invaild JSON to create a TagRule object: '+JSON.stringify(json)); + if ( + !Array.isArray(json.tags) || + json.matching_pattern === '' || + json.matching_pattern === undefined || + json.is_regex === '' || + json.is_regex === undefined + ) { + throw new Error('Invaild JSON to create a TagRule object: ' + JSON.stringify(json)); } return new TagRule(0, json.tags, json.matching_pattern, !!json.is_regex); } diff --git a/src/routes/(main)/+layout.svelte b/src/routes/(main)/+layout.svelte index 8d97993f..c7abdadf 100644 --- a/src/routes/(main)/+layout.svelte +++ b/src/routes/(main)/+layout.svelte @@ -1,7 +1,7 @@ - - + + diff --git a/src/routes/(main)/+page.svelte b/src/routes/(main)/+page.svelte index 90f7c264..ece85e0e 100644 --- a/src/routes/(main)/+page.svelte +++ b/src/routes/(main)/+page.svelte @@ -2,7 +2,7 @@ import { dashboard } from '$lib/crud/Dashboard'; - +

    {dashboard.adminConfig.head.brandName}

      diff --git a/src/routes/(main)/import/+page.svelte b/src/routes/(main)/import/+page.svelte index dc564564..5bf16174 100644 --- a/src/routes/(main)/import/+page.svelte +++ b/src/routes/(main)/import/+page.svelte @@ -1,5 +1,5 @@

      Import

      diff --git a/src/routes/(main)/import/csv/+page.svelte b/src/routes/(main)/import/csv/+page.svelte index 6a6ad9ea..3f139cd6 100644 --- a/src/routes/(main)/import/csv/+page.svelte +++ b/src/routes/(main)/import/csv/+page.svelte @@ -7,13 +7,13 @@ import Select from 'carbon-components-svelte/src/Select/Select.svelte'; import SelectItem from 'carbon-components-svelte/src/Select/SelectItem.svelte'; import NumberInput from 'carbon-components-svelte/src/NumberInput/NumberInput.svelte'; - import Table from "carbon-components-svelte/src/DataTable/Table.svelte"; - import TableBody from "carbon-components-svelte/src/DataTable/TableBody.svelte"; - import TableCell from "carbon-components-svelte/src/DataTable/TableCell.svelte"; - import TableContainer from "carbon-components-svelte/src/DataTable/TableContainer.svelte"; - import TableHead from "carbon-components-svelte/src/DataTable/TableHead.svelte"; - import TableHeader from "carbon-components-svelte/src/DataTable/TableHeader.svelte"; - import TableRow from "carbon-components-svelte/src/DataTable/TableRow.svelte"; + import Table from 'carbon-components-svelte/src/DataTable/Table.svelte'; + import TableBody from 'carbon-components-svelte/src/DataTable/TableBody.svelte'; + import TableCell from 'carbon-components-svelte/src/DataTable/TableCell.svelte'; + import TableContainer from 'carbon-components-svelte/src/DataTable/TableContainer.svelte'; + import TableHead from 'carbon-components-svelte/src/DataTable/TableHead.svelte'; + import TableHeader from 'carbon-components-svelte/src/DataTable/TableHeader.svelte'; + import TableRow from 'carbon-components-svelte/src/DataTable/TableRow.svelte'; import TrashCan from 'carbon-icons-svelte/lib/TrashCan.svelte'; @@ -23,9 +23,9 @@ import Operation, { OperationState } from '$lib/entities/Operation'; import { CsvFieldReference, referenceToEntityProperty } from '$lib/utils/csv'; import { DateFormat } from '$lib/utils/date'; - import type BankAccount from "$lib/entities/BankAccount"; - import {onMount} from "svelte"; - import {getBankAccounts} from "$lib/db/bank_accounts"; + import type BankAccount from '$lib/entities/BankAccount'; + import { onMount } from 'svelte'; + import { getBankAccounts } from '$lib/db/bank_accounts'; let file: File | null = null; let fileContent: string | null = null; @@ -49,7 +49,7 @@ let delimiter: string = '"'; let escapeCharacter: string = '\\'; let dateFormat: DateFormat = DateFormat.DMY_SLASH; - let bankAccountId: string|number|undefined; + let bankAccountId: string | number | undefined; let loading = false; @@ -95,7 +95,7 @@ } async function readCsvFile(reader: FileReader) { - fileContent = (reader.result||'').toString().trim(); + fileContent = (reader.result || '').toString().trim(); const firstLine = fileContent.split('\n')[0] || null; if (!firstLine) { @@ -192,7 +192,9 @@ throw new Error('Bank account is not set.\nPlease set the bank account in the proper field.'); } - const bankAccount = bankAccounts.filter((acc: BankAccount) => acc.id.toString() === bankAccountId?.toString())[0] + const bankAccount = bankAccounts.filter( + (acc: BankAccount) => acc.id.toString() === bankAccountId?.toString() + )[0]; if (!bankAccount) { throw new Error(`Invalid bank account id "${bankAccountId}".`); } @@ -328,11 +330,7 @@ (Remember to refresh on any change) - @@ -347,9 +345,7 @@

      CSV parameters

      - + - + - +
      {#each previewOperations as line, key} - + {key} {#if key < numberOfLinesToRemove} diff --git a/src/routes/(svelteadmin)/+layout.svelte b/src/routes/(svelteadmin)/+layout.svelte index 13e0e91e..4fa864ce 100644 --- a/src/routes/(svelteadmin)/+layout.svelte +++ b/src/routes/(svelteadmin)/+layout.svelte @@ -1 +1 @@ - + diff --git a/src/routes/(svelteadmin)/crud/[crud]/[operation]/+page.svelte b/src/routes/(svelteadmin)/crud/[crud]/[operation]/+page.svelte index 6472f498..f9f7a223 100644 --- a/src/routes/(svelteadmin)/crud/[crud]/[operation]/+page.svelte +++ b/src/routes/(svelteadmin)/crud/[crud]/[operation]/+page.svelte @@ -13,11 +13,11 @@
      URL: {$page.url}
      {#key $page} - + {/key} diff --git a/svelte.config.js b/svelte.config.js index be9bd499..944ec489 100644 --- a/svelte.config.js +++ b/svelte.config.js @@ -12,13 +12,13 @@ const config = { // If your environment is not supported or you settled on a specific environment, switch out the adapter. // See https://kit.svelte.dev/docs/adapters for more information about adapters. adapter: adapter({ - pages: "src-tauri/target/frontend-build", - assets: "src-tauri/target/frontend-build", + pages: 'src-tauri/target/frontend-build', + assets: 'src-tauri/target/frontend-build', precompress: true, fallback: 'index.html', prerender: { - crawl: true, - }, + crawl: true + } }) } }; diff --git a/vite.config.ts b/vite.config.ts index 29ca761b..55c51b2a 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -5,5 +5,5 @@ export default defineConfig({ plugins: [sveltekit()], server: { //hmr: false, - }, + } }); From 070a4098d9c9f508879750ea0f193043f97420c9 Mon Sep 17 00:00:00 2001 From: Alex Rock Ancelet Date: Sat, 23 Mar 2024 22:41:22 +0100 Subject: [PATCH 16/19] Update svelteadmin --- yarn.lock | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/yarn.lock b/yarn.lock index 85804184..10d8cbbf 100644 --- a/yarn.lock +++ b/yarn.lock @@ -402,9 +402,9 @@ fastq "^1.6.0" "@orbitale/svelte-admin@^0.16.0": - version "0.16.0" - resolved "https://registry.yarnpkg.com/@orbitale/svelte-admin/-/svelte-admin-0.16.0.tgz#1eb13fa5e1d41868b75530992473ab8043e3de3a" - integrity sha512-lYP5iGCe37PQGNvFcSMt+VtwIW9CkwgP7oUNItwm0WXcm9OEPXdTidnn613l4A0pSEOCFFKAGhJ68Z1mCuvW7Q== + version "0.16.1" + resolved "https://registry.yarnpkg.com/@orbitale/svelte-admin/-/svelte-admin-0.16.1.tgz#1273247f9f4980261a5cb27a5794a4a8d36e4366" + integrity sha512-H5iIjeB5yYfz1iBubgkX6eTbyQhXkyoYgxgrOeA8cfaXIO3m8qQxAtF3bSFl0kOSVVLOvumWSC4sd5SnMRHowA== dependencies: "@zerodevx/svelte-toast" "^0.9.5" carbon-components-svelte "^0.80.0" @@ -2026,11 +2026,16 @@ sorcery@^0.11.0: minimist "^1.2.0" sander "^0.5.0" -"source-map-js@>=0.6.2 <2.0.0", source-map-js@^1.0.1, source-map-js@^1.0.2: +"source-map-js@>=0.6.2 <2.0.0", source-map-js@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.0.2.tgz#adbc361d9c62df380125e7f161f71c826f1e490c" integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw== +source-map-js@^1.0.1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.2.0.tgz#16b809c162517b5b8c3e7dcd315a2a5c2612b2af" + integrity sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg== + strip-ansi@^6.0.1: version "6.0.1" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" From d068283acc610dcde18af5c236b656339cd22ca7 Mon Sep 17 00:00:00 2001 From: Alex Rock Ancelet Date: Mon, 25 Mar 2024 09:38:55 +0100 Subject: [PATCH 17/19] Add back some admin files still needed for now --- src/lib/admin/src/ActionParams.ts | 27 +++++++++++ src/lib/admin/src/AssociatedField.ts | 12 +++++ src/lib/admin/src/AssociatedItem.ts | 11 +++++ src/lib/admin/src/CallbackAction.ts | 14 ++++++ src/lib/admin/src/Collection.ts | 10 ++++ src/lib/admin/src/CollectionField.ts | 23 +++++++++ src/lib/admin/src/ConfigFilter.ts | 34 ++++++++++++++ src/lib/admin/src/DefaultAction.ts | 13 ++++++ src/lib/admin/src/Field.ts | 45 ++++++++++++++++++ src/lib/admin/src/FieldHtmlProperties.ts | 11 +++++ src/lib/admin/src/FieldOptions.ts | 34 ++++++++++++++ src/lib/admin/src/FilterType.ts | 9 ++++ src/lib/admin/src/FilterWithValue.ts | 28 +++++++++++ src/lib/admin/src/ItemAction.ts | 3 ++ src/lib/admin/src/OrderBy.ts | 15 ++++++ src/lib/admin/src/PageHooks.ts | 39 ++++++++++++++++ src/lib/admin/src/SavedFilter.ts | 28 +++++++++++ src/lib/admin/src/SortableField.ts | 21 +++++++++ src/lib/admin/src/UrlAction.ts | 24 ++++++++++ src/lib/admin/src/config.ts | 23 +++++++++ src/lib/admin/src/filters.ts | 59 ++++++++++++++++++++++++ 21 files changed, 483 insertions(+) create mode 100644 src/lib/admin/src/ActionParams.ts create mode 100644 src/lib/admin/src/AssociatedField.ts create mode 100644 src/lib/admin/src/AssociatedItem.ts create mode 100644 src/lib/admin/src/CallbackAction.ts create mode 100644 src/lib/admin/src/Collection.ts create mode 100644 src/lib/admin/src/CollectionField.ts create mode 100644 src/lib/admin/src/ConfigFilter.ts create mode 100644 src/lib/admin/src/DefaultAction.ts create mode 100644 src/lib/admin/src/Field.ts create mode 100644 src/lib/admin/src/FieldHtmlProperties.ts create mode 100644 src/lib/admin/src/FieldOptions.ts create mode 100644 src/lib/admin/src/FilterType.ts create mode 100644 src/lib/admin/src/FilterWithValue.ts create mode 100644 src/lib/admin/src/ItemAction.ts create mode 100644 src/lib/admin/src/OrderBy.ts create mode 100644 src/lib/admin/src/PageHooks.ts create mode 100644 src/lib/admin/src/SavedFilter.ts create mode 100644 src/lib/admin/src/SortableField.ts create mode 100644 src/lib/admin/src/UrlAction.ts create mode 100644 src/lib/admin/src/config.ts create mode 100644 src/lib/admin/src/filters.ts diff --git a/src/lib/admin/src/ActionParams.ts b/src/lib/admin/src/ActionParams.ts new file mode 100644 index 00000000..29d10dc3 --- /dev/null +++ b/src/lib/admin/src/ActionParams.ts @@ -0,0 +1,27 @@ +import Field from './Field'; + +export default class ActionParams { + private _params: Array = []; + + get params(): Array { + return this._params; + } + + public static id(): ActionParams { + return new ActionParams().and('id'); + } + + public static with(field: string | Field): ActionParams { + return new ActionParams().and(field); + } + + public and(field: string | Field): ActionParams { + if (field instanceof Field) { + this._params.push(field); + } else { + this._params.push(new Field(field)); + } + + return this; + } +} diff --git a/src/lib/admin/src/AssociatedField.ts b/src/lib/admin/src/AssociatedField.ts new file mode 100644 index 00000000..aa9f6dc6 --- /dev/null +++ b/src/lib/admin/src/AssociatedField.ts @@ -0,0 +1,12 @@ +import Field from './Field'; +import FieldHtmlProperties from './FieldHtmlProperties'; + +export default class AssociatedField extends Field { + constructor( + name: string, + associated_field: Field, + field_html_properties: FieldHtmlProperties = FieldHtmlProperties.defaults() + ) { + super(name, '', associated_field, field_html_properties); + } +} diff --git a/src/lib/admin/src/AssociatedItem.ts b/src/lib/admin/src/AssociatedItem.ts new file mode 100644 index 00000000..999b0364 --- /dev/null +++ b/src/lib/admin/src/AssociatedItem.ts @@ -0,0 +1,11 @@ +import type Field from './Field'; + +export default class AssociatedItem { + public readonly item: T; + public readonly fields: Field[]; + + constructor(item: T, fields: Field[]) { + this.item = item; + this.fields = fields; + } +} diff --git a/src/lib/admin/src/CallbackAction.ts b/src/lib/admin/src/CallbackAction.ts new file mode 100644 index 00000000..f84687fd --- /dev/null +++ b/src/lib/admin/src/CallbackAction.ts @@ -0,0 +1,14 @@ +import DefaultAction from './DefaultAction'; + +export default class CallbackAction extends DefaultAction { + private readonly _callback: Function; + + constructor(name: string, callback: Function) { + super(name); + this._callback = callback; + } + + public call(item: object): string { + return this._callback.call(null, item); + } +} diff --git a/src/lib/admin/src/Collection.ts b/src/lib/admin/src/Collection.ts new file mode 100644 index 00000000..cd925819 --- /dev/null +++ b/src/lib/admin/src/Collection.ts @@ -0,0 +1,10 @@ +export default class Collection extends Array { + constructor(items: T[] = []) { + super(); + this.addItems(items); + } + + private addItems(items: T[] = []) { + items.forEach((item) => this.push(item)); + } +} diff --git a/src/lib/admin/src/CollectionField.ts b/src/lib/admin/src/CollectionField.ts new file mode 100644 index 00000000..12ddb6ef --- /dev/null +++ b/src/lib/admin/src/CollectionField.ts @@ -0,0 +1,23 @@ +import type AssociatedField from './AssociatedField'; +import Field from './Field'; +import FieldOptions from './FieldOptions'; + +export default class CollectionField extends Field { + constructor(name: string, text: string, item_field: Field) { + super(name, text, new FieldOptions(item_field)); + } + + public displayFromItem(item: object | any): any { + let field: Field | AssociatedField; + + const items = item[this.name]; + + if (items.length === 0 || !(items instanceof Array)) { + return null; + } + + field = this._associated_field; + + return items.map((singleItem) => field.displayFromItem(singleItem)); + } +} diff --git a/src/lib/admin/src/ConfigFilter.ts b/src/lib/admin/src/ConfigFilter.ts new file mode 100644 index 00000000..774c5285 --- /dev/null +++ b/src/lib/admin/src/ConfigFilter.ts @@ -0,0 +1,34 @@ +import FilterType from './FilterType'; +import type FilterWithValue from './FilterWithValue'; +import type Filter from '../components/PaginatedTable/Filter.svelte'; + +export default class ConfigFilter { + public readonly name: string; + public readonly title: string; + public readonly type: FilterType; + public readonly options: { [key: string]: any }; + public element: Filter | null; + public value: FilterWithValue | null; + + constructor(name: string, title: string, type: FilterType, options?: { [key: string]: any }) { + this.name = name; + this.title = title; + this.type = type; + this.options = options || {}; + this.validateOptions(); + } + + private validateOptions() { + switch (this.type) { + case FilterType.entity: + if (!this.options.entities) { + throw new Error( + 'To define a filter of type "entity", you must also specify the "entities" option. This must contain an array that contains elements of type "{name: string, value: string}", or a callable that returns such array, or a promise that resolves to such array.' + ); + } + break; + default: + break; + } + } +} diff --git a/src/lib/admin/src/DefaultAction.ts b/src/lib/admin/src/DefaultAction.ts new file mode 100644 index 00000000..bad02248 --- /dev/null +++ b/src/lib/admin/src/DefaultAction.ts @@ -0,0 +1,13 @@ +import type ItemAction from './ItemAction'; + +export default abstract class DefaultAction implements ItemAction { + protected readonly _name: string; + + protected constructor(name: string) { + this._name = name; + } + + get name(): string { + return this._name; + } +} diff --git a/src/lib/admin/src/Field.ts b/src/lib/admin/src/Field.ts new file mode 100644 index 00000000..caa309f2 --- /dev/null +++ b/src/lib/admin/src/Field.ts @@ -0,0 +1,45 @@ +import type AssociatedField from './AssociatedField'; +import type FieldHtmlProperties from './FieldHtmlProperties'; +import FieldOptions from './FieldOptions'; +import SortableField from './SortableField'; + +export const Sortable = true; + +export default class Field { + public readonly name: string; + public readonly text: string; + public readonly field_html_properties: FieldHtmlProperties; + public readonly sortable_field: SortableField | null; + protected readonly _associated_field: null | AssociatedField; + + constructor( + name: string, + text: string = '', + options: FieldOptions | null = null, + sortable: boolean = false + ) { + if (!options) { + options = FieldOptions.defaults(); + } + this.name = name; + this.text = text === '' ? name : text; + this.field_html_properties = options.field_html_properties; + this._associated_field = options.associated_field; + this.sortable_field = sortable + ? new SortableField(name, null, options.sortable_property_name || name) + : null; + } + + public displayFromItem(item: object | any): any { + let field: Field | AssociatedField; + + if (this._associated_field) { + item = item[this.name]; + field = this._associated_field; + } else { + field = this; + } + + return item[field.name]; + } +} diff --git a/src/lib/admin/src/FieldHtmlProperties.ts b/src/lib/admin/src/FieldHtmlProperties.ts new file mode 100644 index 00000000..aa3e3256 --- /dev/null +++ b/src/lib/admin/src/FieldHtmlProperties.ts @@ -0,0 +1,11 @@ +export default class FieldHtmlProperties { + public readonly html_class: string; + + constructor(html_class: string = '') { + this.html_class = html_class; + } + + static defaults() { + return new FieldHtmlProperties(); + } +} diff --git a/src/lib/admin/src/FieldOptions.ts b/src/lib/admin/src/FieldOptions.ts new file mode 100644 index 00000000..4829b5c7 --- /dev/null +++ b/src/lib/admin/src/FieldOptions.ts @@ -0,0 +1,34 @@ +import type AssociatedField from './AssociatedField'; +import FieldHtmlProperties from './FieldHtmlProperties'; + +export default class FieldOptions { + public readonly associated_field: null | AssociatedField; + public readonly field_html_properties: FieldHtmlProperties; + public readonly sortable_property_name: string | null; + + constructor( + associated_field: AssociatedField | null = null, + field_html_properties: FieldHtmlProperties | null = null, + sortable_property_name: string | null = null + ) { + this.associated_field = associated_field; + this.field_html_properties = field_html_properties || FieldHtmlProperties.defaults(); + this.sortable_property_name = sortable_property_name; + } + + static defaults(): FieldOptions { + return new FieldOptions(); + } + + static newWithAssociatedField(field: AssociatedField): FieldOptions { + return new FieldOptions(field); + } + + static newWithHtmlProperties(htmlProperties: FieldHtmlProperties): FieldOptions { + return new FieldOptions(null, htmlProperties); + } + + static newWithSortName(sortable_property_name: string): FieldOptions { + return new FieldOptions(null, null, sortable_property_name); + } +} diff --git a/src/lib/admin/src/FilterType.ts b/src/lib/admin/src/FilterType.ts new file mode 100644 index 00000000..3bc38c6c --- /dev/null +++ b/src/lib/admin/src/FilterType.ts @@ -0,0 +1,9 @@ +enum FilterType { + text = 'text', + date = 'date', + number = 'number', + entity = 'entity', + boolean = 'boolean' +} + +export default FilterType; diff --git a/src/lib/admin/src/FilterWithValue.ts b/src/lib/admin/src/FilterWithValue.ts new file mode 100644 index 00000000..159309e1 --- /dev/null +++ b/src/lib/admin/src/FilterWithValue.ts @@ -0,0 +1,28 @@ +import type ConfigFilter from './ConfigFilter'; +import type FilterType from './FilterType'; + +export default class FilterWithValue { + public readonly name: string; + public readonly type: FilterType; + public readonly value: string; + + constructor(name: string, type: FilterType, value: string) { + this.name = name; + this.type = type; + this.value = value; + } + + public static fromFilter(filter: ConfigFilter, value: string): FilterWithValue { + return new FilterWithValue(filter.name, filter.type, value); + } + + public static fromSerialized(filter: Partial): FilterWithValue { + if (!filter.name || !filter.type || !filter.value) { + console.error('Serialized filter is incomplete', filter); + + throw new Error('Serialized filter is incomplete'); + } + + return new FilterWithValue(filter.name, filter.type, filter.value); + } +} diff --git a/src/lib/admin/src/ItemAction.ts b/src/lib/admin/src/ItemAction.ts new file mode 100644 index 00000000..d8021455 --- /dev/null +++ b/src/lib/admin/src/ItemAction.ts @@ -0,0 +1,3 @@ +export default interface ItemAction { + get name(): string; +} diff --git a/src/lib/admin/src/OrderBy.ts b/src/lib/admin/src/OrderBy.ts new file mode 100644 index 00000000..bf0965f9 --- /dev/null +++ b/src/lib/admin/src/OrderBy.ts @@ -0,0 +1,15 @@ +export enum OrderBy { + ASC = 'ASC', + DESC = 'DESC' +} + +export function orderByToString(order_by: OrderBy): string { + switch (order_by) { + case OrderBy.ASC: + return 'ASC'; + case OrderBy.DESC: + return 'DESC'; + default: + throw new Error(`Unsupported order_by type: ${order_by}`); + } +} diff --git a/src/lib/admin/src/PageHooks.ts b/src/lib/admin/src/PageHooks.ts new file mode 100644 index 00000000..c7145bee --- /dev/null +++ b/src/lib/admin/src/PageHooks.ts @@ -0,0 +1,39 @@ +import type SortableField from './SortableField'; +import type FilterWithValue from './FilterWithValue'; + +export default class PageHooks { + private readonly _items_callback: Function; + private readonly _count_callback: Function; + + private lastPage: number = 1; + private lastField: SortableField | null; + private lastFilters: Array | null; + + constructor(items_callback: Function, count_callback: Function = null) { + this._items_callback = items_callback; + this._count_callback = count_callback || null; + } + + get hasCountCallback(): boolean { + return this._count_callback !== null; + } + + public refresh() { + this.callForItems(this.lastPage, this.lastField, this.lastFilters); + } + + public callForItems( + page: number, + field: SortableField | null, + filters: Array | null + ): void { + this.lastPage = page; + this.lastField = field; + this.lastFilters = filters; + this._items_callback(page, field, filters); + } + + public getCountCallback(): Function { + return this._count_callback; + } +} diff --git a/src/lib/admin/src/SavedFilter.ts b/src/lib/admin/src/SavedFilter.ts new file mode 100644 index 00000000..7b939729 --- /dev/null +++ b/src/lib/admin/src/SavedFilter.ts @@ -0,0 +1,28 @@ +import FilterWithValue from './FilterWithValue'; + +export default class SavedFilter { + public readonly name: string; + public readonly deserialized_filters: Array; + private readonly filters: string; + + constructor(name: string, filters_with_values: Array) { + this.name = name; + this.deserialized_filters = filters_with_values; + this.filters = JSON.stringify(filters_with_values); + } + + public static fromSerialized(name: string, filters: string): SavedFilter { + let deserialized_filters: Array = JSON.parse(filters); + + if (!Array.isArray(deserialized_filters)) { + console.error('Stored filters are not stored as an array. Resetting them.'); + deserialized_filters = []; + } + + deserialized_filters = deserialized_filters.map((f: filter) => + FilterWithValue.fromSerialized(f) + ); + + return new SavedFilter(name, deserialized_filters); + } +} diff --git a/src/lib/admin/src/SortableField.ts b/src/lib/admin/src/SortableField.ts new file mode 100644 index 00000000..d0fd03d6 --- /dev/null +++ b/src/lib/admin/src/SortableField.ts @@ -0,0 +1,21 @@ +import { OrderBy } from './OrderBy'; + +export default class SortableField { + public readonly name: string; + public readonly property_name: string; + public order_by: OrderBy; + + constructor(name: string, order: OrderBy = OrderBy.ASC, property_name: string) { + this.name = name; + this.order_by = order; + this.property_name = property_name; + } + + get is_asc(): boolean { + return this.order_by === OrderBy.ASC; + } + + swapOrder() { + this.order_by = this.order_by === OrderBy.ASC ? OrderBy.DESC : OrderBy.ASC; + } +} diff --git a/src/lib/admin/src/UrlAction.ts b/src/lib/admin/src/UrlAction.ts new file mode 100644 index 00000000..e521bd32 --- /dev/null +++ b/src/lib/admin/src/UrlAction.ts @@ -0,0 +1,24 @@ +import DefaultAction from './DefaultAction'; +import type ActionParams from './ActionParams'; +import type Field from './Field'; + +export default class UrlAction extends DefaultAction { + private readonly params: ActionParams; + private readonly _url: string; + + constructor(name: string, url: string, params: ActionParams) { + super(name); + this.params = params; + this._url = url; + } + + public url(item: object): string { + let url = this._url; + + this.params.params.forEach((field: Field) => { + url = url.replace(`:${field.name}`, field.displayFromItem(item).toString()); + }); + + return `${url}`; + } +} diff --git a/src/lib/admin/src/config.ts b/src/lib/admin/src/config.ts new file mode 100644 index 00000000..183c6834 --- /dev/null +++ b/src/lib/admin/src/config.ts @@ -0,0 +1,23 @@ +import { writable } from 'svelte/store'; +import type SavedFilter from '$lib/admin/src/SavedFilter'; + +class Config { + public spinLoaderSrc: string = ''; + public builtinFilters: { [key: string]: Array } = {}; +} + +let config = new Config(); + +export const configStore = writable(config); + +export function updateConfig(userConfig) { + for (const configKey in userConfig) { + config[configKey] = userConfig[configKey]; + } + + configStore.set(config); +} + +export function getConfig(): Config { + return config; +} diff --git a/src/lib/admin/src/filters.ts b/src/lib/admin/src/filters.ts new file mode 100644 index 00000000..3e511486 --- /dev/null +++ b/src/lib/admin/src/filters.ts @@ -0,0 +1,59 @@ +import SavedFilter from './SavedFilter'; +import { getConfig } from './config'; + +export function getByName(save_key: string, name: string): SavedFilter { + const filters = getSavedFilters(save_key); + + const filtered_by_name = filters.filter((filter: SavedFilter) => filter.name === name); + + if (!filtered_by_name.length) { + throw new Error(`Filter with name "${name}" was not found.`); + } else if (filtered_by_name.length > 1) { + throw new Error(`Found multiple filters with name "${name}"`); + } + + return filtered_by_name[0]; +} + +export function getSavedFilters( + save_key: string, + with_builtin: boolean = true +): Array { + let stored_filters = localStorage.getItem('compotes_filters_' + save_key); + + if (!stored_filters) { + stored_filters = '[]'; + } + + let deserialized_filters: Array = JSON.parse(stored_filters); + + if (!Array.isArray(deserialized_filters)) { + console.error('Stored filters are not stored as an array. Resetting them.'); + deserialized_filters = []; + } + + const builtin = with_builtin ? getConfig().builtinFilters[save_key] || [] : []; + + return [ + ...builtin, + ...deserialized_filters.map((f: SavedFilter) => { + return SavedFilter.fromSerialized(f.name, f.filters); + }) + ]; +} + +export function saveFilter(save_key: string, new_filter: SavedFilter) { + let deserialized_filters = getSavedFilters(save_key, false); + + let existing_filter_index = deserialized_filters.findIndex((filter: SavedFilter) => { + return filter.name === new_filter.name; + }); + + if (existing_filter_index >= 0) { + deserialized_filters[existing_filter_index] = new_filter; + } else { + deserialized_filters.push(new_filter); + } + + localStorage.setItem('compotes_filters_' + save_key, JSON.stringify(deserialized_filters)); +} From 64336028b74cd38653d7d0be4af0468ddd9ee833 Mon Sep 17 00:00:00 2001 From: Alex Rock Ancelet Date: Thu, 4 Apr 2024 23:02:17 +0200 Subject: [PATCH 18/19] Add "new" action to BankAccount --- src/lib/crud/cruds/BankAccountsCrud.ts | 17 ++++++++++------- src/lib/entities/BankAccount.ts | 8 ++++++++ 2 files changed, 18 insertions(+), 7 deletions(-) diff --git a/src/lib/crud/cruds/BankAccountsCrud.ts b/src/lib/crud/cruds/BankAccountsCrud.ts index c7066614..0d055be1 100644 --- a/src/lib/crud/cruds/BankAccountsCrud.ts +++ b/src/lib/crud/cruds/BankAccountsCrud.ts @@ -4,6 +4,7 @@ import { CrudDefinition, Edit, List, + New, TextField, UrlAction, type RequestParameters, @@ -17,7 +18,7 @@ import { getBankAccounts, updateBankAccount } from '$lib/db/bank_accounts'; -import type BankAccount from '$lib/entities/BankAccount'; +import BankAccount from '$lib/entities/BankAccount'; import { goto } from '$app/navigation'; import { success } from '$lib/utils/message'; @@ -34,8 +35,11 @@ export default new CrudDefinition({ // minStateLoadingTimeMs: 0, operations: [ - new List([...baseFields], [new UrlAction('Edit', '/crud/bank-accounts/edit')]), - new Edit(baseFields) + new List([...baseFields], [new UrlAction('Edit', '/crud/bank-accounts/edit')], { + globalActions: [new UrlAction('New', '/crud/bank-accounts/new')] + }), + new Edit(baseFields), + new New(baseFields), ], stateProvider: new CallbackStateProvider( @@ -67,11 +71,10 @@ export default new CrudDefinition({ if (!data) { throw new Error('Cannot create new object: empty data.'); } - if (Array.isArray(data)) { - throw new Error('Cannot update data as array for this action.'); - } - return createBankAccount(data); + await createBankAccount(BankAccount.fromObject(data)); + success('Success!'); + await goto('/crud/bank-accounts/list'); } if (operation.name === 'edit') { diff --git a/src/lib/entities/BankAccount.ts b/src/lib/entities/BankAccount.ts index f62108bd..1fcd9574 100644 --- a/src/lib/entities/BankAccount.ts +++ b/src/lib/entities/BankAccount.ts @@ -22,6 +22,14 @@ export default class BankAccount implements Entity { }); } + static fromObject(object: {[key: string]: any}): BankAccount { + if ((object.id && isNaN(object.id)) || !object.name || !object.slug || !object.currency) { + throw new Error('Invalid object: cannot create a BankAccount.'); + } + + return new BankAccount(Number(object.id)||0, object.name, object.slug, object.currency); + } + public setId(id: number) { if (!id) { throw new Error('Cannot set an empty ID on an object.'); From 92e82782b5e6dd09f778ede051436244f7b6c948 Mon Sep 17 00:00:00 2001 From: Alex Rock Ancelet Date: Thu, 4 Apr 2024 23:03:18 +0200 Subject: [PATCH 19/19] Update OperationCrud display with tags and sorting --- src/lib/crud/cruds/OperationCrud.ts | 35 +++++++++++++++++------------ src/lib/db/bank_accounts.ts | 21 ++++++++++------- 2 files changed, 34 insertions(+), 22 deletions(-) diff --git a/src/lib/crud/cruds/OperationCrud.ts b/src/lib/crud/cruds/OperationCrud.ts index 71e547e7..7c681f2e 100644 --- a/src/lib/crud/cruds/OperationCrud.ts +++ b/src/lib/crud/cruds/OperationCrud.ts @@ -1,23 +1,26 @@ import { + ArrayField, CallbackStateProcessor, CallbackStateProvider, CheckboxField, CrudDefinition, DateField, + KeyValueObjectField, List, NumberField, PaginatedResults, TextField, UrlAction, View, - type RequestParameters, type CrudOperation, type ListOperationOptions, - KeyValueObjectField + type RequestParameters, } from '@orbitale/svelte-admin'; -import { getOperationById, getOperations, getOperationsCount } from '$lib/db/operations'; +import {getOperationById, getOperations, getOperationsCount} from '$lib/db/operations'; import type Operation from '$lib/entities/Operation'; +import SortableField from "$lib/admin/src/SortableField"; +import type {OrderBy} from "$lib/admin/src/OrderBy"; export default new CrudDefinition({ name: 'operations', @@ -28,11 +31,11 @@ export default new CrudDefinition({ operations: [ new List( [ - new DateField('operation_date', 'Date'), + new DateField('operation_date', 'Date', {sortable: true}), new TextField('op_type', 'Type 1'), new TextField('type_display', 'Type 2'), new TextField('details', 'Details'), - new TextField('tags', 'Tags'), + new ArrayField('tags', 'Tags', new KeyValueObjectField('', '', 'name')), new NumberField('amount_display', 'Montant') ], [new UrlAction('View', '/crud/operations/view')], @@ -54,7 +57,7 @@ export default new CrudDefinition({ new NumberField('hash', 'Hash'), new TextField('state', 'State'), new KeyValueObjectField('bank_account', 'Bank account', 'name'), - new TextField('tags', 'Tags'), + new ArrayField('tags', 'Tags', new KeyValueObjectField('', '', 'name')), new CheckboxField('ignored_from_charts', 'Is ignored from charts') ]) ], @@ -68,15 +71,19 @@ export default new CrudDefinition({ if (operation.name === 'list') { const options: ListOperationOptions = operation.options; - const results = await getOperations(Number(requestParameters.page) || 1); + const page = Number(requestParameters.page || 1); + let sort: SortableField|null = null; + if (requestParameters.sort) { + const firstKey = Object.keys(requestParameters.sort)[0]; + sort = new SortableField(firstKey, requestParameters.sort[firstKey] as OrderBy, firstKey); + } + const results = await getOperations(page, sort); const numberOfItems = await getOperationsCount(null); - return Promise.resolve( - new PaginatedResults( - Number(requestParameters.page), - numberOfItems / Number(options.pagination?.itemsPerPage || 10), - numberOfItems, - results - ) + return new PaginatedResults( + page, + numberOfItems / Number(options.pagination?.itemsPerPage || 10), + numberOfItems, + results ); } diff --git a/src/lib/db/bank_accounts.ts b/src/lib/db/bank_accounts.ts index a1486c75..b5a32d54 100644 --- a/src/lib/db/bank_accounts.ts +++ b/src/lib/db/bank_accounts.ts @@ -1,20 +1,15 @@ import BankAccount from '$lib/entities/BankAccount'; import api_call from '$lib/utils/api_call'; -import { writable } from 'svelte/store'; -import type { Writable } from 'svelte/store'; -import DeserializedOperation from '$lib/db/operations'; -import BankAccountsCrud from '$lib/crud/cruds/BankAccountsCrud'; -export const bankAccountsStore: Writable = writable(); +const cache: Record = {}; export async function getBankAccounts(): Promise> { const res: string = await api_call('bank_account_find_all'); - const bank_accounts = JSON.parse(res).map((data: BankAccount) => { + const bank_accounts: Array = JSON.parse(res).map((data: BankAccount) => { return new BankAccount(data.id, data.name, data.slug, data.currency); }); - - bankAccountsStore.set(bank_accounts); + bank_accounts.forEach(a => cache[a.id] = a); return bank_accounts; } @@ -31,6 +26,10 @@ export async function getBankAccountsAsChoices(): Promise { + if (cache[id]) { + return Promise.resolve(cache[id]); + } + const res: string = await api_call('bank_account_get_by_id', { id: id.toString() }); if (!res) { @@ -43,6 +42,8 @@ export async function getBankAccountById(id: number): Promise