diff --git a/README.md b/README.md index 76f82ba16..16063cf7e 100644 --- a/README.md +++ b/README.md @@ -147,7 +147,7 @@ Adding a new dependency should have vital value on the product with minimum poss │ │ │ │ ├── _create.svelte // Component to Create collections │ │ │ │ └── index.svelte // Entrypoint for "/console/[PROJECT_ID]/database" │ │ │ ├── storage // Storage Service "/console/[PROJECT]/storage" -│ │ │ └── authentication // Users Service "/console/[PROJECT]/authentication" +│ │ │ └── auth // Users Service "/console/[PROJECT]/auth" │ │ └──... │ ├── login.svelte // Component for Login "/console/login" │ └── register.svelte // Component for Register "/console/register" diff --git a/package-lock.json b/package-lock.json index c0272c726..d7a077f1e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8,11 +8,12 @@ "name": "@appwrite/console", "version": "0.0.1", "dependencies": { - "@aw-labs/appwrite-console": "^6.0.0", - "@aw-labs/icons": "0.0.0-66", - "@aw-labs/ui": "0.0.0-66", + "@aw-labs/appwrite-console": "^10.0.0", + "@aw-labs/icons": "0.0.0-72", + "@aw-labs/ui": "0.0.0-72", "@popperjs/core": "^2.11.6", "echarts": "^5.4.0", + "pretty-bytes": "^6.0.0", "prismjs": "^1.29.0", "tippy.js": "^6.3.7", "web-vitals": "^3.0.3" @@ -71,23 +72,23 @@ } }, "node_modules/@aw-labs/appwrite-console": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/@aw-labs/appwrite-console/-/appwrite-console-6.0.0.tgz", - "integrity": "sha512-g4sCMGiIptDUyKhJSfiKsG/gzqMIt3MQCdqod6bNWMunbXUqN7DeA0BT4MuTeVGdQuoOKuSmgHeExatlu0Dh9Q==", + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/@aw-labs/appwrite-console/-/appwrite-console-10.0.0.tgz", + "integrity": "sha512-YyEQ5SIhkvI/Axt/EOkAqKcMTkfEpQt7W1q91lWKQ+Hm9woMzYUcf8KThBnMvEFbphWQRaJKLtfpr8EJjCjm4w==", "dependencies": { "cross-fetch": "3.1.5", "isomorphic-form-data": "2.0.0" } }, "node_modules/@aw-labs/icons": { - "version": "0.0.0-66", - "resolved": "https://registry.npmjs.org/@aw-labs/icons/-/icons-0.0.0-66.tgz", - "integrity": "sha512-3r6pxixYZ6Bn9QTUbFk8XYwds+CHz1baRkOVsQ5HoFz6XgvzTWn3/+pvZZ56Ht2Ek//wr4wwI30pdCXaX4QIsA==" + "version": "0.0.0-72", + "resolved": "https://registry.npmjs.org/@aw-labs/icons/-/icons-0.0.0-72.tgz", + "integrity": "sha512-z3k9ex4oKdE/VUPeqc6lpo2HuhC39Dov2NEXv/1v6YBw2l20LavNA6m7NU/DFkq+m286un/dp6w7ORbgpZlIvw==" }, "node_modules/@aw-labs/ui": { - "version": "0.0.0-66", - "resolved": "https://registry.npmjs.org/@aw-labs/ui/-/ui-0.0.0-66.tgz", - "integrity": "sha512-5qFISwKzOyZq7Ix5FG/BhVKEcIMXd2/Y8Ioba+ejTQ8B9hzj6FlwxUw7hLT49ZDhU+kxpjJQV51hRpbHGvmEag==", + "version": "0.0.0-72", + "resolved": "https://registry.npmjs.org/@aw-labs/ui/-/ui-0.0.0-72.tgz", + "integrity": "sha512-+NR8p3fRMVj/RMPmyVJPcdaRwYkWNw7jJ/wxT4zjYxa7QeeMJwILYfYIFYnnu0GG9SN9nOc2z+yISqL0p0HgfA==", "dependencies": { "@aw-labs/icons": "*", "normalize.css": "^8.0.1", @@ -721,38 +722,6 @@ "dev": true, "peer": true }, - "node_modules/@esbuild/android-arm": { - "version": "0.15.10", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.15.10.tgz", - "integrity": "sha512-FNONeQPy/ox+5NBkcSbYJxoXj9GWu8gVGJTVmUyoOCKQFDTrHVKgNSzChdNt0I8Aj/iKcsDf2r9BFwv+FSNUXg==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-loong64": { - "version": "0.15.10", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.15.10.tgz", - "integrity": "sha512-w0Ou3Z83LOYEkwaui2M8VwIp+nLi/NA60lBLMvaJ+vXVMcsARYdEzLNE7RSm4+lSg4zq4d7fAVuzk7PNQ5JFgg==", - "cpu": [ - "loong64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, "node_modules/@eslint/eslintrc": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.3.3.tgz", @@ -2899,54 +2868,6 @@ "esbuild-windows-arm64": "0.15.10" } }, - "node_modules/esbuild-android-64": { - "version": "0.15.10", - "resolved": "https://registry.npmjs.org/esbuild-android-64/-/esbuild-android-64-0.15.10.tgz", - "integrity": "sha512-UI7krF8OYO1N7JYTgLT9ML5j4+45ra3amLZKx7LO3lmLt1Ibn8t3aZbX5Pu4BjWiqDuJ3m/hsvhPhK/5Y/YpnA==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-android-arm64": { - "version": "0.15.10", - "resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.15.10.tgz", - "integrity": "sha512-EOt55D6xBk5O05AK8brXUbZmoFj4chM8u3riGflLa6ziEoVvNjRdD7Cnp82NHQGfSHgYR06XsPI8/sMuA/cUwg==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-darwin-64": { - "version": "0.15.10", - "resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.15.10.tgz", - "integrity": "sha512-hbDJugTicqIm+WKZgp208d7FcXcaK8j2c0l+fqSJ3d2AzQAfjEYDRM3Z2oMeqSJ9uFxyj/muSACLdix7oTstRA==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, "node_modules/esbuild-darwin-arm64": { "version": "0.15.10", "resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.15.10.tgz", @@ -2963,262 +2884,6 @@ "node": ">=12" } }, - "node_modules/esbuild-freebsd-64": { - "version": "0.15.10", - "resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.15.10.tgz", - "integrity": "sha512-KMBFMa7C8oc97nqDdoZwtDBX7gfpolkk6Bcmj6YFMrtCMVgoU/x2DI1p74DmYl7CSS6Ppa3xgemrLrr5IjIn0w==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-freebsd-arm64": { - "version": "0.15.10", - "resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.15.10.tgz", - "integrity": "sha512-m2KNbuCX13yQqLlbSojFMHpewbn8wW5uDS6DxRpmaZKzyq8Dbsku6hHvh2U+BcLwWY4mpgXzFUoENEf7IcioGg==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-linux-32": { - "version": "0.15.10", - "resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.15.10.tgz", - "integrity": "sha512-guXrwSYFAvNkuQ39FNeV4sNkNms1bLlA5vF1H0cazZBOLdLFIny6BhT+TUbK/hdByMQhtWQ5jI9VAmPKbVPu1w==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-linux-64": { - "version": "0.15.10", - "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.15.10.tgz", - "integrity": "sha512-jd8XfaSJeucMpD63YNMO1JCrdJhckHWcMv6O233bL4l6ogQKQOxBYSRP/XLWP+6kVTu0obXovuckJDcA0DKtQA==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-linux-arm": { - "version": "0.15.10", - "resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.15.10.tgz", - "integrity": "sha512-6N8vThLL/Lysy9y4Ex8XoLQAlbZKUyExCWyayGi2KgTBelKpPgj6RZnUaKri0dHNPGgReJriKVU6+KDGQwn10A==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-linux-arm64": { - "version": "0.15.10", - "resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.15.10.tgz", - "integrity": "sha512-GByBi4fgkvZFTHFDYNftu1DQ1GzR23jws0oWyCfhnI7eMOe+wgwWrc78dbNk709Ivdr/evefm2PJiUBMiusS1A==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-linux-mips64le": { - "version": "0.15.10", - "resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.15.10.tgz", - "integrity": "sha512-BxP+LbaGVGIdQNJUNF7qpYjEGWb0YyHVSKqYKrn+pTwH/SiHUxFyJYSP3pqkku61olQiSBnSmWZ+YUpj78Tw7Q==", - "cpu": [ - "mips64el" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-linux-ppc64le": { - "version": "0.15.10", - "resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.15.10.tgz", - "integrity": "sha512-LoSQCd6498PmninNgqd/BR7z3Bsk/mabImBWuQ4wQgmQEeanzWd5BQU2aNi9mBURCLgyheuZS6Xhrw5luw3OkQ==", - "cpu": [ - "ppc64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-linux-riscv64": { - "version": "0.15.10", - "resolved": "https://registry.npmjs.org/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.15.10.tgz", - "integrity": "sha512-Lrl9Cr2YROvPV4wmZ1/g48httE8z/5SCiXIyebiB5N8VT7pX3t6meI7TQVHw/wQpqP/AF4SksDuFImPTM7Z32Q==", - "cpu": [ - "riscv64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-linux-s390x": { - "version": "0.15.10", - "resolved": "https://registry.npmjs.org/esbuild-linux-s390x/-/esbuild-linux-s390x-0.15.10.tgz", - "integrity": "sha512-ReP+6q3eLVVP2lpRrvl5EodKX7EZ1bS1/z5j6hsluAlZP5aHhk6ghT6Cq3IANvvDdscMMCB4QEbI+AjtvoOFpA==", - "cpu": [ - "s390x" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-netbsd-64": { - "version": "0.15.10", - "resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.15.10.tgz", - "integrity": "sha512-iGDYtJCMCqldMskQ4eIV+QSS/CuT7xyy9i2/FjpKvxAuCzrESZXiA1L64YNj6/afuzfBe9i8m/uDkFHy257hTw==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-openbsd-64": { - "version": "0.15.10", - "resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.15.10.tgz", - "integrity": "sha512-ftMMIwHWrnrYnvuJQRJs/Smlcb28F9ICGde/P3FUTCgDDM0N7WA0o9uOR38f5Xe2/OhNCgkjNeb7QeaE3cyWkQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-sunos-64": { - "version": "0.15.10", - "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.15.10.tgz", - "integrity": "sha512-mf7hBL9Uo2gcy2r3rUFMjVpTaGpFJJE5QTDDqUFf1632FxteYANffDZmKbqX0PfeQ2XjUDE604IcE7OJeoHiyg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-windows-32": { - "version": "0.15.10", - "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.15.10.tgz", - "integrity": "sha512-ttFVo+Cg8b5+qHmZHbEc8Vl17kCleHhLzgT8X04y8zudEApo0PxPg9Mz8Z2cKH1bCYlve1XL8LkyXGFjtUYeGg==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-windows-64": { - "version": "0.15.10", - "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.15.10.tgz", - "integrity": "sha512-2H0gdsyHi5x+8lbng3hLbxDWR7mKHWh5BXZGKVG830KUmXOOWFE2YKJ4tHRkejRduOGDrBvHBriYsGtmTv3ntA==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-windows-arm64": { - "version": "0.15.10", - "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.15.10.tgz", - "integrity": "sha512-S+th4F+F8VLsHLR0zrUcG+Et4hx0RKgK1eyHc08kztmLOES8BWwMiaGdoW9hiXuzznXQ0I/Fg904MNbr11Nktw==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, "node_modules/escalade": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", @@ -6278,6 +5943,17 @@ "svelte": "^3.2.0" } }, + "node_modules/pretty-bytes": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-6.0.0.tgz", + "integrity": "sha512-6UqkYefdogmzqAZWzJ7laYeJnaXDy2/J+ZqiiMtS7t7OfpXWTlaeGMwX8U6EFvPV/YWWEKRkS8hKS4k60WHTOg==", + "engines": { + "node": "^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/pretty-format": { "version": "27.5.1", "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz", @@ -7782,23 +7458,23 @@ } }, "@aw-labs/appwrite-console": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/@aw-labs/appwrite-console/-/appwrite-console-6.0.0.tgz", - "integrity": "sha512-g4sCMGiIptDUyKhJSfiKsG/gzqMIt3MQCdqod6bNWMunbXUqN7DeA0BT4MuTeVGdQuoOKuSmgHeExatlu0Dh9Q==", + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/@aw-labs/appwrite-console/-/appwrite-console-10.0.0.tgz", + "integrity": "sha512-YyEQ5SIhkvI/Axt/EOkAqKcMTkfEpQt7W1q91lWKQ+Hm9woMzYUcf8KThBnMvEFbphWQRaJKLtfpr8EJjCjm4w==", "requires": { "cross-fetch": "3.1.5", "isomorphic-form-data": "2.0.0" } }, "@aw-labs/icons": { - "version": "0.0.0-66", - "resolved": "https://registry.npmjs.org/@aw-labs/icons/-/icons-0.0.0-66.tgz", - "integrity": "sha512-3r6pxixYZ6Bn9QTUbFk8XYwds+CHz1baRkOVsQ5HoFz6XgvzTWn3/+pvZZ56Ht2Ek//wr4wwI30pdCXaX4QIsA==" + "version": "0.0.0-72", + "resolved": "https://registry.npmjs.org/@aw-labs/icons/-/icons-0.0.0-72.tgz", + "integrity": "sha512-z3k9ex4oKdE/VUPeqc6lpo2HuhC39Dov2NEXv/1v6YBw2l20LavNA6m7NU/DFkq+m286un/dp6w7ORbgpZlIvw==" }, "@aw-labs/ui": { - "version": "0.0.0-66", - "resolved": "https://registry.npmjs.org/@aw-labs/ui/-/ui-0.0.0-66.tgz", - "integrity": "sha512-5qFISwKzOyZq7Ix5FG/BhVKEcIMXd2/Y8Ioba+ejTQ8B9hzj6FlwxUw7hLT49ZDhU+kxpjJQV51hRpbHGvmEag==", + "version": "0.0.0-72", + "resolved": "https://registry.npmjs.org/@aw-labs/ui/-/ui-0.0.0-72.tgz", + "integrity": "sha512-+NR8p3fRMVj/RMPmyVJPcdaRwYkWNw7jJ/wxT4zjYxa7QeeMJwILYfYIFYnnu0GG9SN9nOc2z+yISqL0p0HgfA==", "requires": { "@aw-labs/icons": "*", "normalize.css": "^8.0.1", @@ -8291,20 +7967,6 @@ "dev": true, "peer": true }, - "@esbuild/android-arm": { - "version": "0.15.10", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.15.10.tgz", - "integrity": "sha512-FNONeQPy/ox+5NBkcSbYJxoXj9GWu8gVGJTVmUyoOCKQFDTrHVKgNSzChdNt0I8Aj/iKcsDf2r9BFwv+FSNUXg==", - "dev": true, - "optional": true - }, - "@esbuild/linux-loong64": { - "version": "0.15.10", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.15.10.tgz", - "integrity": "sha512-w0Ou3Z83LOYEkwaui2M8VwIp+nLi/NA60lBLMvaJ+vXVMcsARYdEzLNE7RSm4+lSg4zq4d7fAVuzk7PNQ5JFgg==", - "dev": true, - "optional": true - }, "@eslint/eslintrc": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.3.3.tgz", @@ -9991,27 +9653,6 @@ "esbuild-windows-arm64": "0.15.10" } }, - "esbuild-android-64": { - "version": "0.15.10", - "resolved": "https://registry.npmjs.org/esbuild-android-64/-/esbuild-android-64-0.15.10.tgz", - "integrity": "sha512-UI7krF8OYO1N7JYTgLT9ML5j4+45ra3amLZKx7LO3lmLt1Ibn8t3aZbX5Pu4BjWiqDuJ3m/hsvhPhK/5Y/YpnA==", - "dev": true, - "optional": true - }, - "esbuild-android-arm64": { - "version": "0.15.10", - "resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.15.10.tgz", - "integrity": "sha512-EOt55D6xBk5O05AK8brXUbZmoFj4chM8u3riGflLa6ziEoVvNjRdD7Cnp82NHQGfSHgYR06XsPI8/sMuA/cUwg==", - "dev": true, - "optional": true - }, - "esbuild-darwin-64": { - "version": "0.15.10", - "resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.15.10.tgz", - "integrity": "sha512-hbDJugTicqIm+WKZgp208d7FcXcaK8j2c0l+fqSJ3d2AzQAfjEYDRM3Z2oMeqSJ9uFxyj/muSACLdix7oTstRA==", - "dev": true, - "optional": true - }, "esbuild-darwin-arm64": { "version": "0.15.10", "resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.15.10.tgz", @@ -10019,118 +9660,6 @@ "dev": true, "optional": true }, - "esbuild-freebsd-64": { - "version": "0.15.10", - "resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.15.10.tgz", - "integrity": "sha512-KMBFMa7C8oc97nqDdoZwtDBX7gfpolkk6Bcmj6YFMrtCMVgoU/x2DI1p74DmYl7CSS6Ppa3xgemrLrr5IjIn0w==", - "dev": true, - "optional": true - }, - "esbuild-freebsd-arm64": { - "version": "0.15.10", - "resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.15.10.tgz", - "integrity": "sha512-m2KNbuCX13yQqLlbSojFMHpewbn8wW5uDS6DxRpmaZKzyq8Dbsku6hHvh2U+BcLwWY4mpgXzFUoENEf7IcioGg==", - "dev": true, - "optional": true - }, - "esbuild-linux-32": { - "version": "0.15.10", - "resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.15.10.tgz", - "integrity": "sha512-guXrwSYFAvNkuQ39FNeV4sNkNms1bLlA5vF1H0cazZBOLdLFIny6BhT+TUbK/hdByMQhtWQ5jI9VAmPKbVPu1w==", - "dev": true, - "optional": true - }, - "esbuild-linux-64": { - "version": "0.15.10", - "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.15.10.tgz", - "integrity": "sha512-jd8XfaSJeucMpD63YNMO1JCrdJhckHWcMv6O233bL4l6ogQKQOxBYSRP/XLWP+6kVTu0obXovuckJDcA0DKtQA==", - "dev": true, - "optional": true - }, - "esbuild-linux-arm": { - "version": "0.15.10", - "resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.15.10.tgz", - "integrity": "sha512-6N8vThLL/Lysy9y4Ex8XoLQAlbZKUyExCWyayGi2KgTBelKpPgj6RZnUaKri0dHNPGgReJriKVU6+KDGQwn10A==", - "dev": true, - "optional": true - }, - "esbuild-linux-arm64": { - "version": "0.15.10", - "resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.15.10.tgz", - "integrity": "sha512-GByBi4fgkvZFTHFDYNftu1DQ1GzR23jws0oWyCfhnI7eMOe+wgwWrc78dbNk709Ivdr/evefm2PJiUBMiusS1A==", - "dev": true, - "optional": true - }, - "esbuild-linux-mips64le": { - "version": "0.15.10", - "resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.15.10.tgz", - "integrity": "sha512-BxP+LbaGVGIdQNJUNF7qpYjEGWb0YyHVSKqYKrn+pTwH/SiHUxFyJYSP3pqkku61olQiSBnSmWZ+YUpj78Tw7Q==", - "dev": true, - "optional": true - }, - "esbuild-linux-ppc64le": { - "version": "0.15.10", - "resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.15.10.tgz", - "integrity": "sha512-LoSQCd6498PmninNgqd/BR7z3Bsk/mabImBWuQ4wQgmQEeanzWd5BQU2aNi9mBURCLgyheuZS6Xhrw5luw3OkQ==", - "dev": true, - "optional": true - }, - "esbuild-linux-riscv64": { - "version": "0.15.10", - "resolved": "https://registry.npmjs.org/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.15.10.tgz", - "integrity": "sha512-Lrl9Cr2YROvPV4wmZ1/g48httE8z/5SCiXIyebiB5N8VT7pX3t6meI7TQVHw/wQpqP/AF4SksDuFImPTM7Z32Q==", - "dev": true, - "optional": true - }, - "esbuild-linux-s390x": { - "version": "0.15.10", - "resolved": "https://registry.npmjs.org/esbuild-linux-s390x/-/esbuild-linux-s390x-0.15.10.tgz", - "integrity": "sha512-ReP+6q3eLVVP2lpRrvl5EodKX7EZ1bS1/z5j6hsluAlZP5aHhk6ghT6Cq3IANvvDdscMMCB4QEbI+AjtvoOFpA==", - "dev": true, - "optional": true - }, - "esbuild-netbsd-64": { - "version": "0.15.10", - "resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.15.10.tgz", - "integrity": "sha512-iGDYtJCMCqldMskQ4eIV+QSS/CuT7xyy9i2/FjpKvxAuCzrESZXiA1L64YNj6/afuzfBe9i8m/uDkFHy257hTw==", - "dev": true, - "optional": true - }, - "esbuild-openbsd-64": { - "version": "0.15.10", - "resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.15.10.tgz", - "integrity": "sha512-ftMMIwHWrnrYnvuJQRJs/Smlcb28F9ICGde/P3FUTCgDDM0N7WA0o9uOR38f5Xe2/OhNCgkjNeb7QeaE3cyWkQ==", - "dev": true, - "optional": true - }, - "esbuild-sunos-64": { - "version": "0.15.10", - "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.15.10.tgz", - "integrity": "sha512-mf7hBL9Uo2gcy2r3rUFMjVpTaGpFJJE5QTDDqUFf1632FxteYANffDZmKbqX0PfeQ2XjUDE604IcE7OJeoHiyg==", - "dev": true, - "optional": true - }, - "esbuild-windows-32": { - "version": "0.15.10", - "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.15.10.tgz", - "integrity": "sha512-ttFVo+Cg8b5+qHmZHbEc8Vl17kCleHhLzgT8X04y8zudEApo0PxPg9Mz8Z2cKH1bCYlve1XL8LkyXGFjtUYeGg==", - "dev": true, - "optional": true - }, - "esbuild-windows-64": { - "version": "0.15.10", - "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.15.10.tgz", - "integrity": "sha512-2H0gdsyHi5x+8lbng3hLbxDWR7mKHWh5BXZGKVG830KUmXOOWFE2YKJ4tHRkejRduOGDrBvHBriYsGtmTv3ntA==", - "dev": true, - "optional": true - }, - "esbuild-windows-arm64": { - "version": "0.15.10", - "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.15.10.tgz", - "integrity": "sha512-S+th4F+F8VLsHLR0zrUcG+Et4hx0RKgK1eyHc08kztmLOES8BWwMiaGdoW9hiXuzznXQ0I/Fg904MNbr11Nktw==", - "dev": true, - "optional": true - }, "escalade": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", @@ -12460,6 +11989,11 @@ "dev": true, "requires": {} }, + "pretty-bytes": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-6.0.0.tgz", + "integrity": "sha512-6UqkYefdogmzqAZWzJ7laYeJnaXDy2/J+ZqiiMtS7t7OfpXWTlaeGMwX8U6EFvPV/YWWEKRkS8hKS4k60WHTOg==" + }, "pretty-format": { "version": "27.5.1", "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz", diff --git a/package.json b/package.json index ec0f46155..93c13d4a4 100644 --- a/package.json +++ b/package.json @@ -19,11 +19,12 @@ "e2e": "playwright test tests/e2e" }, "dependencies": { - "@aw-labs/appwrite-console": "^6.0.0", - "@aw-labs/icons": "0.0.0-66", - "@aw-labs/ui": "0.0.0-66", + "@aw-labs/appwrite-console": "^10.0.0", + "@aw-labs/icons": "0.0.0-72", + "@aw-labs/ui": "0.0.0-72", "@popperjs/core": "^2.11.6", "echarts": "^5.4.0", + "pretty-bytes": "^6.0.0", "prismjs": "^1.29.0", "tippy.js": "^6.3.7", "web-vitals": "^3.0.3" diff --git a/src/lib/charts/bar.svelte b/src/lib/charts/bar.svelte index 71377d401..d7658dfa6 100644 --- a/src/lib/charts/bar.svelte +++ b/src/lib/charts/bar.svelte @@ -1,11 +1,14 @@ { s.type = 'bar'; s.stack = 'total'; diff --git a/src/lib/charts/base.json b/src/lib/charts/base.json index 29d166045..0cbfc0897 100644 --- a/src/lib/charts/base.json +++ b/src/lib/charts/base.json @@ -6,7 +6,7 @@ "borderWidth": 1 }, "lineStyle": { - "width": 2 + "width": 1 }, "symbolSize": 4, "symbol": "emptyCircle", diff --git a/src/lib/charts/base.svelte b/src/lib/charts/base.svelte index 54d8e2907..09f5b5ee2 100644 --- a/src/lib/charts/base.svelte +++ b/src/lib/charts/base.svelte @@ -8,10 +8,12 @@ import dark from './dark.json'; import type { ECharts } from 'echarts/core'; import type { BarSeriesOption, LineSeriesOption } from 'echarts/charts'; + import type { EChartsOption } from 'echarts'; registerTheme('light', { ...base, ...light }); registerTheme('dark', { ...base, ...dark }); + export let options: EChartsOption; export let series: (BarSeriesOption | LineSeriesOption)[]; let chart: ECharts; @@ -19,6 +21,7 @@ $: option = { ...defaultConfig, + ...options, series }; @@ -39,7 +42,7 @@ (await import('echarts/components')).TransformComponent, (await import('echarts/components')).LegendComponent, (await import('echarts/features')).LabelLayout, - (await import('echarts/renderers')).CanvasRenderer + (await import('echarts/renderers')).SVGRenderer ]); makeChart(); }); @@ -85,6 +88,7 @@ diff --git a/src/lib/charts/config.ts b/src/lib/charts/config.ts index 541b51e30..c43f04c63 100644 --- a/src/lib/charts/config.ts +++ b/src/lib/charts/config.ts @@ -17,8 +17,8 @@ export const defaultConfig: EChartsOption = { containLabel: true, left: 0, right: 0, - bottom: 15, - top: 15 + bottom: 0, + top: 45 }, xAxis: { type: 'time', @@ -27,6 +27,11 @@ export const defaultConfig: EChartsOption = { yAxis: { type: 'value', splitNumber: 3, - minInterval: 1 + minInterval: 1, + splitLine: { + lineStyle: { + width: 1 + } + } } }; diff --git a/src/lib/charts/dark.json b/src/lib/charts/dark.json index 0bc23c3cf..94a660131 100644 --- a/src/lib/charts/dark.json +++ b/src/lib/charts/dark.json @@ -45,11 +45,11 @@ } }, "axisLabel": { - "color": "#666666" + "color": "#868EA3" }, "splitLine": { "lineStyle": { - "color": ["#333333"] + "color": ["#4F5769"] } }, "splitArea": { diff --git a/src/lib/charts/light.json b/src/lib/charts/light.json index d94378d63..e6ddb057a 100644 --- a/src/lib/charts/light.json +++ b/src/lib/charts/light.json @@ -34,7 +34,7 @@ }, "splitLine": { "lineStyle": { - "color": ["#E0E6F1"] + "color": ["#E8E9F0"] } } }, diff --git a/src/lib/charts/line.svelte b/src/lib/charts/line.svelte index 4cebee6f9..3879c07dc 100644 --- a/src/lib/charts/line.svelte +++ b/src/lib/charts/line.svelte @@ -1,14 +1,24 @@ { s.type = 'line'; s.stack = 'total'; + s.lineStyle = { + shadowBlur: 38, + shadowColor: Colors.Primary, + shadowOffsetY: 15, + shadowOffsetX: 0 + }; s.showSymbol = false; return s; diff --git a/src/lib/components/card.svelte b/src/lib/components/card.svelte index a9d12f9bc..cac926f54 100644 --- a/src/lib/components/card.svelte +++ b/src/lib/components/card.svelte @@ -1,7 +1,8 @@ -
+
diff --git a/src/lib/components/cardContainer.svelte b/src/lib/components/cardContainer.svelte index 5ba3ee68b..126e61c97 100644 --- a/src/lib/components/cardContainer.svelte +++ b/src/lib/components/cardContainer.svelte @@ -12,8 +12,8 @@ style={`--grid-gap:1.5rem; --grid-item-size:${total > 3 ? '22rem' : '25rem'};`}> - {#if limit + offset > total && (total % 2 !== 0 || total % 4 === 0)} - + {#if total > 3 ? total < limit + offset : total % 2 !== 0} + {/if} diff --git a/src/lib/components/code.svelte b/src/lib/components/code.svelte index f8ac3d894..24debe415 100644 --- a/src/lib/components/code.svelte +++ b/src/lib/components/code.svelte @@ -10,7 +10,6 @@ import 'prismjs/plugins/autoloader/prism-autoloader'; import 'prismjs/plugins/custom-class/prism-custom-class'; import 'prismjs/plugins/line-numbers/prism-line-numbers'; - import 'prismjs/plugins/line-numbers/prism-line-numbers.css'; import { afterUpdate } from 'svelte'; import { Copy } from '.'; @@ -49,16 +48,16 @@ {/if} -
-        {code}
-    
+
{code}
diff --git a/src/lib/layout/unauthenticated.svelte b/src/lib/layout/unauthenticated.svelte index be86d9b83..62d9e923b 100644 --- a/src/lib/layout/unauthenticated.svelte +++ b/src/lib/layout/unauthenticated.svelte @@ -82,7 +82,7 @@

- version 0.15.2.402 +

diff --git a/src/lib/layout/usage.svelte b/src/lib/layout/usage.svelte index 9ce00d5e0..f90dd5cb6 100644 --- a/src/lib/layout/usage.svelte +++ b/src/lib/layout/usage.svelte @@ -42,12 +42,17 @@
{title} - 24h - 30d - 90d + + 24h + + + 30d + + + 90d +
@@ -70,14 +75,16 @@ {total(created)}

{createdMetadata.title}

- [e.date, e.value])], - color: Colors.Secondary - } - ]} /> +
+ [e.date, e.value])], + color: Colors.Secondary + } + ]} /> +
{/if} @@ -85,14 +92,16 @@ {total(read)}

{readMetadata.title}

- [e.date, e.value])], - color: Colors.Tertiary - } - ]} /> +
+ [e.date, e.value])], + color: Colors.Tertiary + } + ]} /> +
{/if} @@ -100,14 +109,16 @@ {total(updated)}

{updatedMetadata.title}

- [e.date, e.value])], - color: Colors.Quaternary - } - ]} /> +
+ [e.date, e.value])], + color: Colors.Quaternary + } + ]} /> +
{/if} @@ -115,14 +126,16 @@ {total(deleted)}

{deletedMetadata.title}

- [e.date, e.value])], - color: Colors.Quinary - } - ]} /> +
+ [e.date, e.value])], + color: Colors.Quinary + } + ]} /> +
{/if} diff --git a/src/lib/layout/wizard.svelte b/src/lib/layout/wizard.svelte index 40b8e2f23..6ca867e00 100644 --- a/src/lib/layout/wizard.svelte +++ b/src/lib/layout/wizard.svelte @@ -28,7 +28,8 @@ let showExitModal = false; function handleKeydown(event: KeyboardEvent) { - if (event.key === 'Escape' && !showExitModal) { + const openDialog = document.querySelectorAll('dialog[open]'); + if (event.key === 'Escape' && !showExitModal && !openDialog?.length) { event.preventDefault(); dispatch('exit'); wizard.hide(); diff --git a/src/lib/stores/oauth-providers.ts b/src/lib/stores/oauth-providers.ts index 7b3f87d5f..997641024 100644 --- a/src/lib/stores/oauth-providers.ts +++ b/src/lib/stores/oauth-providers.ts @@ -1,18 +1,14 @@ import { writable } from 'svelte/store'; import type { Models } from '@aw-labs/appwrite-console'; import type { SvelteComponent } from 'svelte'; -import Apple from '../../routes/console/project-[project]/authentication/_appleOAuth.svelte'; -import Microsoft from '../../routes/console/project-[project]/authentication/_microsoftOAuth.svelte'; -import Okta from '../../routes/console/project-[project]/authentication/_oktaOAuth.svelte'; -import Auth0 from '../../routes/console/project-[project]/authentication/_auth0OAuth.svelte'; -import Main from '../../routes/console/project-[project]/authentication/_mainOAuth.svelte'; +import Apple from '../../routes/console/project-[project]/auth/_appleOAuth.svelte'; +import Microsoft from '../../routes/console/project-[project]/auth/_microsoftOAuth.svelte'; +import Okta from '../../routes/console/project-[project]/auth/_oktaOAuth.svelte'; +import Auth0 from '../../routes/console/project-[project]/auth/_auth0OAuth.svelte'; +import Main from '../../routes/console/project-[project]/auth/_mainOAuth.svelte'; -export type Provider = { - name: string; +export type Provider = Models.Provider & { icon: string; - active: boolean; - id: string | null; - secret: string | null; docs?: string; component?: typeof SvelteComponent; }; @@ -22,279 +18,122 @@ export type Providers = { }; const setProviders = (project: Models.Project): Provider[] => { - return [ - { - name: 'Amazon', - icon: 'amazon', - active: false, - id: project?.providerAmazonAppid, - secret: project?.providerAmazonSecret, - docs: 'https://developer.amazon.com/apps-and-games/services-and-apis', - component: Main - }, - { - name: 'Apple', - icon: 'apple', - active: false, - id: project?.providerAppleAppid, - secret: project?.providerAppleSecret, - docs: 'https://developer.apple.com/', - component: Apple - }, - { - name: 'Auth0', - icon: 'auth0', - active: false, - id: project?.providerAuth0Appid, - secret: project?.providerAuth0Secret, - docs: 'https://auth0.com/developers', - component: Auth0 - }, - { - name: 'Bitbucket', - icon: 'bitBucket', - active: false, - id: project?.providerBitbucketAppid, - secret: project?.providerBitbucketSecret, - docs: 'https://developer.atlassian.com/bitbucket', - component: Main - }, - { - name: 'Bitly', - icon: 'bitly', - active: false, - id: project?.providerBitlyAppid, - secret: project?.providerBitlySecret, - docs: 'https://dev.bitly.com/v4_documentation.html', - component: Main - }, - { - name: 'Box', - icon: 'box', - active: false, - id: project?.providerBoxAppid, - secret: project?.providerBoxSecret, - docs: 'https://developer.box.com/reference/', - component: Main - }, - { - name: 'Discord', - icon: 'discord', - active: false, - id: project?.providerDiscordAppid, - secret: project?.providerDiscordSecret, - docs: 'https://discordapp.com/developers/docs/topics/oauth2', - component: Main - }, - { - name: 'Dropbox', - icon: 'dropbox', - active: false, - id: project?.providerDropboxAppid, - secret: project?.providerDropboxSecret, - docs: 'https://www.dropbox.com/developers/documentation', - component: Main - }, - { - name: 'Facebook', - icon: 'facebook', - active: false, - id: project?.providerFacebookAppid, - secret: project?.providerFacebookSecret, - docs: 'https://developers.facebook.com/', - component: Main - }, - { - name: 'Github', - icon: 'github', - active: false, - id: project?.providerGithubAppid, - secret: project?.providerGithubSecret, - docs: 'https://developer.github.com/', - component: Main - }, - { - name: 'Gitlab', - icon: 'gitlab', - active: false, - id: project?.providerGitlabAppid, - secret: project?.providerGitlabSecret, - docs: 'https://docs.gitlab.com/ee/api/', - component: Main - }, - { - name: 'Google', - icon: 'google', - active: false, - id: project?.providerGoogleAppid, - secret: project?.providerGoogleSecret, - docs: 'https://support.google.com/googleapi/answer/6158849', - component: Main - }, - { - name: 'Linkedin', - icon: 'linkedin', - active: false, - id: project?.providerLinkedinAppid, - secret: project?.providerLinkedinSecret, - docs: 'https://developer.linkedin.com/', - component: Main - }, - { - name: 'Microsoft', - icon: 'microsoft', - active: false, - id: project?.providerMicrosoftAppid, - secret: project?.providerMicrosoftSecret, - docs: 'https://developer.microsoft.com/en-us/', - component: Microsoft - }, - { - name: 'Notion', - icon: 'notion', - active: false, - id: project?.providerNotionAppid, - secret: project?.providerNotionSecret, - docs: 'https://developers.notion.com/docs', - component: Main - }, - { - name: 'Okta', - icon: 'okta', - active: false, - id: project?.providerOktaAppid, - secret: project?.providerOktaSecret, - docs: 'https://developer.okta.com/', - component: Okta - }, - { - name: 'Paypal', - icon: 'paypal', - active: false, - id: project?.providerPaypalAppid, - secret: project?.providerPaypalSecret, - docs: 'https://developer.paypal.com/docs/api/overview/', - component: Main - }, - { - name: 'Paypal (sandbox)', - icon: 'paypal', - active: false, - id: project?.providerPaypalSandboxAppid, - secret: project?.providerPaypalSandboxSecret, - docs: 'https://developer.paypal.com/docs/api/overview/', - component: Main - }, - { - name: 'Salesforce', - icon: 'salesforce', - active: false, - id: project?.providerSalesforceAppid, - secret: project?.providerSalesforceSecret, - docs: 'https://developer.salesforce.com/docs/', - component: Main - }, - { - name: 'Slack', - icon: 'slack', - active: false, - id: project?.providerSlackAppid, - secret: project?.providerSlackSecret, - docs: 'https://api.slack.com/', - component: Main - }, - { - name: 'Spotify', - icon: 'spotify', - active: false, - id: project?.providerSpotifyAppid, - secret: project?.providerSpotifySecret, - docs: 'https://developer.spotify.com/documentation/general/guides/authorization-guide/', - component: Main - }, - { - name: 'Stripe', - icon: 'stripe', - active: false, - id: project?.providerStripeAppid, - secret: project?.providerStripeSecret, - docs: 'https://stripe.com/docs/api', - component: Main - }, - { - name: 'Tradeshift', - icon: 'tradeshift', - active: false, - id: project?.providerTradeshiftAppid, - secret: project?.providerTradeshiftSecret, - docs: 'https://developers.tradeshift.com/docs/api', - component: Main - }, - { - name: 'Tradeshift(sandbox)', - icon: 'tradeshift', - active: false, - id: project?.providerTradeshiftBoxAppid, - secret: project?.providerTradeshiftBoxSecret, - docs: 'https://developers.tradeshift.com/docs/api', - component: Main - }, - { - name: 'Twitch', - icon: 'twitch', - active: false, - id: project?.providerTwitchAppid, - secret: project?.providerTwitchSecret, - docs: 'https://dev.twitch.tv/docs/authentication', - component: Main - }, + return ( + project?.providers.map((n) => { + let docs: Provider['docs']; + let icon: Provider['icon'] = n.name.toLowerCase(); + let component: Provider['component'] = Main; - { - name: 'Wordpress', - icon: 'wordpress', - active: false, - id: project?.providerWordpressAppid, - secret: project?.providerWordpressSecret, - docs: 'https://developer.wordpress.com/docs/oauth2/', - component: Main - }, - { - name: 'Yahoo', - icon: 'yahoo', - active: false, - id: project?.providerYahooAppid, - secret: project?.providerYahooSecret, - docs: 'https://developer.yahoo.com/oauth2/guide/flows_authcode/', - component: Main - }, - { - name: 'Yammer', - icon: 'ms_yammer', - active: false, - id: project?.providerYammerAppid, - secret: project?.providerYammerSecret, - docs: 'https://developer.yammer.com/docs/oauth-2', - component: Main - }, - { - name: 'Yandex', - icon: 'yandex', - active: false, - id: project?.providerYandexAppid, - secret: project?.providerYandexSecret, - docs: 'https://tech.yandex.com/oauth/', - component: Main - }, - { - name: 'Zoom', - icon: 'zoom', - active: false, - id: project?.providerZoomAppid, - secret: project?.providerZoomSecret, - docs: 'https://marketplace.zoom.us/docs/guides/auth/oauth/', - component: Main - } - ]; + switch (n.name.toLowerCase()) { + case 'amazon': + docs = 'https://developer.amazon.com/apps-and-games/services-and-apis'; + break; + case 'apple': + docs = 'https://developer.apple.com/'; + component = Apple; + break; + case 'auth0': + docs = 'https://auth0.com/developers'; + component = Auth0; + break; + case 'bitbucket': + docs = 'https://developer.atlassian.com/bitbucket'; + break; + case 'bitly': + docs = 'https://dev.bitly.com/v4_documentation.html'; + break; + case 'box': + docs = 'https://developer.box.com/reference/'; + break; + case 'discord': + docs = 'https://discordapp.com/developers/docs/topics/oauth2'; + break; + case 'dropbox': + docs = 'https://www.dropbox.com/developers/documentation'; + break; + case 'facebook': + docs = 'https://developers.facebook.com/'; + break; + case 'github': + docs = 'https://developer.github.com'; + break; + case 'gitlab': + docs = 'https://docs.gitlab.com/ee/api/'; + break; + case 'google': + docs = 'https://support.google.com/googleapi/answer/6158849'; + break; + case 'linkedin': + docs = 'https://developer.linkedin.com/'; + break; + case 'microsoft': + docs = 'https://developer.microsoft.com/en-us/'; + component = Microsoft; + break; + case 'notion': + docs = 'https://developers.notion.com/docs'; + break; + case 'okta': + docs = 'https://developer.okta.com'; + component = Okta; + break; + case 'paypal': + docs = 'https://developer.paypal.com/docs/api/overview/'; + break; + case 'paypalsandbox': + icon = 'paypal'; + docs = 'https://developer.paypal.com/docs/api/overview/'; + break; + case 'salesforce': + docs = 'https://developer.salesforce.com/docs/'; + break; + case 'slack': + docs = 'https://api.slack.com/'; + break; + case 'spotify': + docs = + 'https://developer.spotify.com/documentation/general/guides/authorization-guide/'; + break; + case 'stripe': + docs = 'https://stripe.com/docs/api'; + break; + case 'tradeshift': + docs = 'https://developers.tradeshift.com/docs/api'; + break; + case 'tradeshiftbox': + icon = 'tradeshift'; + docs = 'https://developers.tradeshift.com/docs/api'; + break; + case 'twitch': + docs = 'https://dev.twitch.tv/docs/auth'; + break; + case 'wordpress': + docs = 'https://developer.wordpress.com/docs/oauth2/'; + break; + case 'yahoo': + docs = 'https://developer.yahoo.com/oauth2/guide/flows_authcode/'; + break; + case 'yammer': + docs = 'https://developer.yammer.com/docs/oauth-2'; + break; + case 'yandex': + docs = 'https://tech.yandex.com/oauth/'; + break; + case 'zoom': + docs = 'https://marketplace.zoom.us/docs/guides/auth/oauth/'; + break; + default: + break; + } + + return { + ...n, + icon, + docs, + component + }; + }) ?? [] + ); }; function createOAuthProviders() { diff --git a/src/routes/+layout.svelte b/src/routes/+layout.svelte index 95e06dab7..790b7efa1 100644 --- a/src/routes/+layout.svelte +++ b/src/routes/+layout.svelte @@ -8,9 +8,9 @@ import { base } from '$app/paths'; import { browser, dev } from '$app/environment'; import { app } from '$lib/stores/app'; - import Notifications from '$lib/layout/notifications.svelte'; - import Loading from './loading.svelte'; + import { Progress, Notifications } from '$lib/layout'; import { loading } from './store'; + import Loading from './loading.svelte'; if (browser) { window.VERCEL_ANALYTICS_ID = import.meta.env.VERCEL_ANALYTICS_ID?.toString() ?? false; @@ -95,6 +95,8 @@ {/if} + + diff --git a/src/routes/console/project-[project]/overview/bandwith.svelte b/src/routes/console/project-[project]/overview/bandwith.svelte new file mode 100644 index 000000000..7e040eb61 --- /dev/null +++ b/src/routes/console/project-[project]/overview/bandwith.svelte @@ -0,0 +1,77 @@ + + +
+
+
+ {bandwith.value} + {bandwith.unit} +
+
Bandwidth
+
+ + + + dispatch('change', '24h')}>24h + dispatch('change', '30d')}>30d + dispatch('change', '90d')}>90d + + +
+{#if bandwith.value !== '0'} +
+ + value + ? `${humanFileSize(+value).value} ${humanFileSize(+value).unit}` + : '0' + } + } + }} + series={[ + { + name: 'Bandwidth', + data: [...network.map((e) => [e.date, e.value])], + tooltip: { + valueFormatter: (value) => + `${humanFileSize(+value).value} ${humanFileSize(+value).unit}` + } + } + ]} /> +
+{:else} + +
+
+
+{/if} diff --git a/src/routes/console/project-[project]/overview/keys/+page.svelte b/src/routes/console/project-[project]/overview/keys/+page.svelte index 1709372d0..1c08f5b5f 100644 --- a/src/routes/console/project-[project]/overview/keys/+page.svelte +++ b/src/routes/console/project-[project]/overview/keys/+page.svelte @@ -1,5 +1,5 @@
API Keys -
- - - Name - last accessed - expiration date - clients - - - {#each data.keys.keys as key} - - - {key.name} - - - {key.accessedAt ? toLocaleDateTime(key.accessedAt) : 'never'} - - - {toLocaleDateTime(key.$updatedAt)} - - - - {/each} - -
- - +{#if data.keys.total} + + + Name + last accessed + expiration date + scopes + + + {#each data.keys.keys as key} + + + {key.name} + + + {key.accessedAt ? toLocaleDateTime(key.accessedAt) : 'never'} + + + {key.expire ? toLocaleDateTime(key.expire) : 'never'} + + + {key.scopes.length} Scopes + + + {/each} + +
+{:else} + +{/if} diff --git a/src/routes/console/project-[project]/overview/keys/[key]/+page.ts b/src/routes/console/project-[project]/overview/keys/[key]/+page.ts index 11847cc4a..62c8a4fdb 100644 --- a/src/routes/console/project-[project]/overview/keys/[key]/+page.ts +++ b/src/routes/console/project-[project]/overview/keys/[key]/+page.ts @@ -7,9 +7,14 @@ import type { PageLoad } from './$types'; export const load: PageLoad = async ({ params, depends }) => { depends(Dependencies.KEY); + const key = await sdkForConsole.projects.getKey(params.project, params.key); + if (key.expire) { + key.expire = new Date(key.expire).toISOString().slice(0, 23); + } + return { header: Header, breadcrumbs: Breadcrumbs, - key: await sdkForConsole.projects.getKey(params.project, params.key) + key }; }; diff --git a/src/routes/console/project-[project]/overview/keys/[key]/+page@project-[project].svelte b/src/routes/console/project-[project]/overview/keys/[key]/+page@project-[project].svelte index 1163b4902..154c9f288 100644 --- a/src/routes/console/project-[project]/overview/keys/[key]/+page@project-[project].svelte +++ b/src/routes/console/project-[project]/overview/keys/[key]/+page@project-[project].svelte @@ -3,7 +3,7 @@ import { CardGrid, Heading, Secret } from '$lib/components'; import { Dependencies } from '$lib/constants'; import { Button, Form, FormList, InputText, InputDateTime } from '$lib/elements/forms'; - import { difference } from '$lib/helpers/array'; + import { symmetricDifference } from '$lib/helpers/array'; import { toLocaleDateTime } from '$lib/helpers/date'; import { Container } from '$lib/layout'; import { addNotification } from '$lib/stores/notifications'; @@ -18,7 +18,7 @@ let name: string = null; let secret: string = null; let expire: string = null; - let scopes: string[] = []; + let scopes: string[] = null; onMount(() => { name ??= $key.name; @@ -135,16 +135,17 @@ practice to allow only the permissions you need to meet your project goals.

- + {#if scopes !== null} + + {/if} + disabled={scopes && + $key?.scopes && + !symmetricDifference(scopes, $key.scopes).length}>Update diff --git a/src/routes/console/project-[project]/overview/keys/create.svelte b/src/routes/console/project-[project]/overview/keys/create.svelte deleted file mode 100644 index dea215fe2..000000000 --- a/src/routes/console/project-[project]/overview/keys/create.svelte +++ /dev/null @@ -1,42 +0,0 @@ - - - - Create API Key - - - - - - - - - diff --git a/src/routes/console/project-[project]/overview/keys/scopes.svelte b/src/routes/console/project-[project]/overview/keys/scopes.svelte index d60f14730..0d2e7a14f 100644 --- a/src/routes/console/project-[project]/overview/keys/scopes.svelte +++ b/src/routes/console/project-[project]/overview/keys/scopes.svelte @@ -3,10 +3,18 @@ import { Button, FormList, InputChoice } from '$lib/elements/forms'; import { scopes as allScopes } from '$lib/constants'; import { onMount } from 'svelte'; - import { difference } from '$lib/helpers/array'; + import { symmetricDifference } from '$lib/helpers/array'; export let scopes: string[]; + enum Category { + Auth = 'Auth', + Database = 'Database', + Functions = 'Functions', + Storage = 'Storage', + Other = 'Other' + } + let mounted = false; onMount(() => { @@ -28,6 +36,29 @@ } } + function categoryState(category: string, s: string[]): boolean | null { + const scopesByCategory = allScopes.filter((n) => n.category === category); + const filtered = scopesByCategory.filter((n) => s.includes(n.scope)); + if (filtered.length === 0) { + return false; + } else if (filtered.length === scopesByCategory.length) { + return true; + } else { + return null; + } + } + + function onCategoryChange( + event: Event & { currentTarget: EventTarget & HTMLInputElement }, + category: Category + ) { + allScopes.forEach((s) => { + if (s.category === category) { + activeScopes[s.scope] = event.currentTarget.checked; + } + }); + } + const activeScopes = allScopes.reduce((prev, next) => { prev[next.scope] = false; @@ -39,10 +70,7 @@ const newScopes = allScopes .filter((scope) => activeScopes[scope.scope]) .map(({ scope }) => scope); - if ( - difference(scopes, newScopes).length !== 0 || - difference(newScopes, scopes).length !== 0 - ) { + if (symmetricDifference(scopes, newScopes).length) { scopes = newScopes; } } @@ -54,19 +82,35 @@
- {#each ['Authentication', 'Database', 'Functions', 'Storage', 'Other'] as category} - - {category} - - {#each allScopes.filter((s) => s.category === category) as scope} - - {scope.description} - - {/each} - + {#each [Category.Auth, Category.Database, Category.Functions, Category.Storage, Category.Other] as category} + {@const checked = categoryState(category, scopes)} + + + onCategoryChange(e, category)} /> + + + {category} + + + ({allScopes.filter((n) => n.category === category && scopes.includes(n.scope)) + .length} Scopes) + +
+ + {#each allScopes.filter((s) => s.category === category) as scope} + + {scope.description} + + {/each} + +
{/each}
diff --git a/src/routes/console/project-[project]/overview/keys/wizard.svelte b/src/routes/console/project-[project]/overview/keys/wizard.svelte new file mode 100644 index 000000000..e1efc9ebb --- /dev/null +++ b/src/routes/console/project-[project]/overview/keys/wizard.svelte @@ -0,0 +1,50 @@ + + + diff --git a/src/routes/console/project-[project]/overview/keys/wizard/step1.svelte b/src/routes/console/project-[project]/overview/keys/wizard/step1.svelte new file mode 100644 index 000000000..37fb03702 --- /dev/null +++ b/src/routes/console/project-[project]/overview/keys/wizard/step1.svelte @@ -0,0 +1,89 @@ + + + + Create an API Key + Let's create an API Key. + + + + {#if preset === 'custom'} + + {/if} + + diff --git a/src/routes/console/project-[project]/overview/keys/wizard/step2.svelte b/src/routes/console/project-[project]/overview/keys/wizard/step2.svelte new file mode 100644 index 000000000..56638e8a0 --- /dev/null +++ b/src/routes/console/project-[project]/overview/keys/wizard/step2.svelte @@ -0,0 +1,17 @@ + + + + Add Scopes + + Choose which permission scopes to grant your application. It is best practice to allow only + the permissions you need to meet your project goals. + + + + + diff --git a/src/routes/console/project-[project]/overview/keys/wizard/store.ts b/src/routes/console/project-[project]/overview/keys/wizard/store.ts new file mode 100644 index 000000000..148e58193 --- /dev/null +++ b/src/routes/console/project-[project]/overview/keys/wizard/store.ts @@ -0,0 +1,25 @@ +import { writable } from 'svelte/store'; +import type { Models } from '@aw-labs/appwrite-console'; + +function createKeyStore() { + const { subscribe, update, set } = writable>({ + name: null, + expire: null, + scopes: [] + }); + + return { + subscribe, + update, + set, + reset() { + set({ + name: null, + expire: null, + scopes: [] + }); + } + }; +} + +export const key = createKeyStore(); diff --git a/src/routes/console/project-[project]/overview/platforms/+page.svelte b/src/routes/console/project-[project]/overview/platforms/+page.svelte index add972874..11bab105f 100644 --- a/src/routes/console/project-[project]/overview/platforms/+page.svelte +++ b/src/routes/console/project-[project]/overview/platforms/+page.svelte @@ -1,6 +1,6 @@ - Register your Flutter app - - Note: If you are building your Flutter application for multiple devices, you will have to - follow this process for each different device. - + Register your Apple app diff --git a/src/routes/console/project-[project]/overview/platforms/wizard/web/step1.svelte b/src/routes/console/project-[project]/overview/platforms/wizard/web/step1.svelte index b2a807690..69d7f4990 100644 --- a/src/routes/console/project-[project]/overview/platforms/wizard/web/step1.svelte +++ b/src/routes/console/project-[project]/overview/platforms/wizard/web/step1.svelte @@ -65,8 +65,13 @@
- Tip: Avoid using wildcard hostnames in production to keep your project secure. Check out - our documentation for more info. + Using wildcard hostnames in production can become insecure. You can read about + + Cross-Origin Resource Sharing (CORS) for more information. diff --git a/src/routes/console/project-[project]/overview/realtime.svelte b/src/routes/console/project-[project]/overview/realtime.svelte new file mode 100644 index 000000000..8bcd55239 --- /dev/null +++ b/src/routes/console/project-[project]/overview/realtime.svelte @@ -0,0 +1,45 @@ + + +
+ {format(current)} +
+
Realtime Connections
+{#if total} +
+ +
+{:else} + +
+
+
+{/if} diff --git a/src/routes/console/project-[project]/overview/requests.svelte b/src/routes/console/project-[project]/overview/requests.svelte new file mode 100644 index 000000000..9866b89d0 --- /dev/null +++ b/src/routes/console/project-[project]/overview/requests.svelte @@ -0,0 +1,67 @@ + + +
+
+
+ {format(total($usage.requests))} +
+
Requests
+
+ + + + dispatch('change', '24h')}>24h + dispatch('change', '30d')}>30d + dispatch('change', '90d')}>90d + + +
+{#if total($usage.requests) !== 0} +
+ [e.date, e.value])] + } + ]} /> +
+{:else} + +
+
+
+{/if} diff --git a/src/routes/console/project-[project]/settings/+page.svelte b/src/routes/console/project-[project]/settings/+page.svelte index dc201d527..6ae5234c8 100644 --- a/src/routes/console/project-[project]/settings/+page.svelte +++ b/src/routes/console/project-[project]/settings/+page.svelte @@ -11,10 +11,13 @@ import { invalidate } from '$app/navigation'; import { Dependencies } from '$lib/constants'; import Delete from './deleteProject.svelte'; + import { base } from '$app/paths'; + import { page } from '$app/stores'; let name: string = null; let showDelete = false; const endpoint = sdkForConsole.client.config.endpoint; + const projectId = $page.params.project; onMount(async () => { name ??= $project.name; @@ -64,6 +67,21 @@ {#if $project}
+ + API Credentials +

Access Appwrite services using your API Endpoint and Project ID.

+ + + + + + + + + +
Update Name @@ -84,23 +102,6 @@
- - API Credentials -

- Access Appwrite services using your API Endpoint and Project ID. You can connect - Appwrite to your applications and server-side code by integrating a new platform - or - creating an API key. -

- - - - - - -
- Services

Choose services you wish to enable or disable.

diff --git a/src/routes/console/project-[project]/settings/domains/[[page]]/+page.svelte b/src/routes/console/project-[project]/settings/domains/[[page]]/+page.svelte index de3ef195a..2d539b040 100644 --- a/src/routes/console/project-[project]/settings/domains/[[page]]/+page.svelte +++ b/src/routes/console/project-[project]/settings/domains/[[page]]/+page.svelte @@ -139,17 +139,11 @@ {:else} - -
-
-

Create your first Domain to get started

-
-
- - -
-
-
+ {/if}
diff --git a/src/routes/console/project-[project]/settings/domains/create.svelte b/src/routes/console/project-[project]/settings/domains/create.svelte index ddf0eb338..5279752ae 100644 --- a/src/routes/console/project-[project]/settings/domains/create.svelte +++ b/src/routes/console/project-[project]/settings/domains/create.svelte @@ -12,7 +12,7 @@ import { Dependencies } from '$lib/constants'; onDestroy(() => { - domain.set({ id: '', name: '' }); + domain.set({ $id: '', domain: '' }); }); beforeNavigate(() => { diff --git a/src/routes/console/project-[project]/settings/domains/wizard/cnameTable.svelte b/src/routes/console/project-[project]/settings/domains/wizard/cnameTable.svelte index 0c5d31bf0..316fef1b5 100644 --- a/src/routes/console/project-[project]/settings/domains/wizard/cnameTable.svelte +++ b/src/routes/console/project-[project]/settings/domains/wizard/cnameTable.svelte @@ -11,9 +11,9 @@ } from '$lib/elements/table'; import { domain } from './store'; - const parts = $domain.name.split('.'); + const parts = $domain.domain.split('.'); const registerable = [parts[parts.length - 2], parts[parts.length - 1]].join('.'); - const cnameValue = $domain.name.replace('.' + registerable, ''); + const cnameValue = $domain.domain.replace('.' + registerable, ''); @@ -28,8 +28,8 @@ {cnameValue}
- {$domain.name} - + {$domain.domain} +
diff --git a/src/routes/console/project-[project]/settings/domains/wizard/step1.svelte b/src/routes/console/project-[project]/settings/domains/wizard/step1.svelte index 21ee2bbf6..76b46f176 100644 --- a/src/routes/console/project-[project]/settings/domains/wizard/step1.svelte +++ b/src/routes/console/project-[project]/settings/domains/wizard/step1.svelte @@ -5,30 +5,14 @@ import { project } from '../../../store'; import { domain } from './store'; - // Handle if user goes back to this step to update - // the domain name after creating the domain - const originalDomainName = $domain.name; - const originalDomainId = $domain.id; - const unsubscribe = domain.subscribe((newDomain) => { - if ( - originalDomainName !== '' && - newDomain.id !== '' && - newDomain.name !== originalDomainName - ) { - $domain.id = ''; - } - }); - const projectId = $project.$id; const createDomain = async () => { - unsubscribe(); - if ($domain.name !== originalDomainName && originalDomainId) { - await sdkForConsole.projects.deleteDomain(projectId, originalDomainId); + if ($domain.$id) { + await sdkForConsole.projects.deleteDomain(projectId, $domain.$id); } - if ($domain.id == '') { - await sdkForConsole.projects.createDomain(projectId, $domain.name); - } + const { $id } = await sdkForConsole.projects.createDomain(projectId, $domain.domain); + $domain.$id = $id; }; @@ -45,7 +29,7 @@ placeholder="appwrite.example.com" autocomplete={false} required - bind:value={$domain.name} /> + bind:value={$domain.domain} />

diff --git a/src/routes/console/project-[project]/settings/domains/wizard/step4.svelte b/src/routes/console/project-[project]/settings/domains/wizard/step4.svelte index eed0a85ac..0ab0e0b98 100644 --- a/src/routes/console/project-[project]/settings/domains/wizard/step4.svelte +++ b/src/routes/console/project-[project]/settings/domains/wizard/step4.svelte @@ -11,7 +11,7 @@ let certificate = false; const checkCertificate = () => { setTimeout(async () => { - const result = await sdkForConsole.projects.getDomain(projectId, $domain.id); + const result = await sdkForConsole.projects.getDomain(projectId, $domain.$id); if (!result.certificateId) { checkCertificate(); return; diff --git a/src/routes/console/project-[project]/settings/domains/wizard/store.ts b/src/routes/console/project-[project]/settings/domains/wizard/store.ts index 88d0de932..9c2d5d8d4 100644 --- a/src/routes/console/project-[project]/settings/domains/wizard/store.ts +++ b/src/routes/console/project-[project]/settings/domains/wizard/store.ts @@ -1,3 +1,4 @@ +import type { Models } from '@aw-labs/appwrite-console'; import { writable } from 'svelte/store'; -export const domain = writable<{ id: string; name: string }>({ id: '', name: '' }); +export const domain = writable>({ $id: '', domain: '' }); diff --git a/src/routes/console/project-[project]/settings/domains/wizard/verificationBox.svelte b/src/routes/console/project-[project]/settings/domains/wizard/verificationBox.svelte index 0cd32690f..e82bccf69 100644 --- a/src/routes/console/project-[project]/settings/domains/wizard/verificationBox.svelte +++ b/src/routes/console/project-[project]/settings/domains/wizard/verificationBox.svelte @@ -15,7 +15,7 @@ try { const result = await sdkForConsole.projects.updateDomainVerification( projectId, - $domain.id + $domain.$id ); isVerified = result.verification; } catch (error) { diff --git a/src/routes/console/project-[project]/settings/webhooks/+page.svelte b/src/routes/console/project-[project]/settings/webhooks/+page.svelte index 9fb631f50..1349d09ed 100644 --- a/src/routes/console/project-[project]/settings/webhooks/+page.svelte +++ b/src/routes/console/project-[project]/settings/webhooks/+page.svelte @@ -71,17 +71,10 @@

{:else} - -
-

Create your first Webhook to get startedNeed a hand?

-

Check out our documentation.

-
-
- - -
-
+ {/if} diff --git a/src/routes/console/project-[project]/settings/webhooks/[webhook]/+page.svelte b/src/routes/console/project-[project]/settings/webhooks/[webhook]/+page.svelte index a71badf95..d669afca0 100644 --- a/src/routes/console/project-[project]/settings/webhooks/[webhook]/+page.svelte +++ b/src/routes/console/project-[project]/settings/webhooks/[webhook]/+page.svelte @@ -18,14 +18,17 @@ import { toLocaleDateTime } from '$lib/helpers/date'; import Delete from './delete.svelte'; import Regenerate from './regenerate.svelte'; - import { difference } from '$lib/helpers/array'; + import { symmetricDifference } from '$lib/helpers/array'; import { invalidate } from '$app/navigation'; import { Dependencies } from '$lib/constants'; + import { writable, type Writable } from 'svelte/store'; const projectId = $page.params.project; let name: string = null; let url: string = null; - let events = []; + + const eventSet: Writable> = writable(new Set()); + let httpUser: string = null; let httpPass: string = null; let security = false; @@ -37,7 +40,7 @@ onMount(async () => { name ??= $webhook.name; url ??= $webhook.url; - events = $webhook.events; + $eventSet = new Set($webhook.events); httpUser ??= $webhook.httpUser; httpPass ??= $webhook.httpPass; security = $webhook.security; @@ -93,7 +96,7 @@ projectId, $webhook.$id, $webhook.name, - events, + Array.from($eventSet), $webhook.url, $webhook.security ); @@ -110,6 +113,7 @@ }); } } + async function updateSecurity() { try { await sdkForConsole.projects.updateWebhook( @@ -135,15 +139,28 @@ } } - $: if (difference(events, $webhook.events).length > 0) { - areEventsDisabled = false; + function handleEvent(event: CustomEvent) { + eventSet.set($eventSet.add(event.detail)); + } + + $: if ($eventSet) { + if (symmetricDifference(Array.from($eventSet), $webhook.events).length) { + areEventsDisabled = false; + } else areEventsDisabled = true; } Signature Key -

You can use the Signature Key to validate your webhooks.

+

+ Add the Signature Key to the X-Appwrite-Webhook-Signature header to validate your + webhooks. Learn more about webhook validation. +

Key

@@ -200,24 +217,25 @@
- Update Events + Update Events

Set the events that will trigger your webhook. Maximum 100 events allowed.

- {#if events?.length} + {#if $eventSet.size} - {#each events as id} + {#each Array.from($eventSet) as event}
  • - {id} + {event} @@ -225,15 +243,17 @@
  • {/each}
    +
    + +
    {:else} - (showCreateEvent = !showCreateEvent)} - >Add a event to get started + (showCreateEvent = true)}> + Add an event to get started + {/if} - -
    @@ -273,7 +293,11 @@ bind:value={security}> Warning: Untrusted or self-signed certificates may not be secure. - + Learn more @@ -313,9 +337,5 @@ - { - events.push(e.detail[0]); - events = events; - }} /> + + diff --git a/src/routes/console/project-[project]/settings/webhooks/wizard/step2.svelte b/src/routes/console/project-[project]/settings/webhooks/wizard/step2.svelte index d51b874c6..d50dc2027 100644 --- a/src/routes/console/project-[project]/settings/webhooks/wizard/step2.svelte +++ b/src/routes/console/project-[project]/settings/webhooks/wizard/step2.svelte @@ -22,7 +22,6 @@ Set the events that will trigger your function. Maximum 100 events allowed. - EVENT {#if $createWebhook?.events?.length} {#each $createWebhook.events as event} @@ -44,17 +43,15 @@ {/each} +
    + +
    {:else} - (showCreate = !showCreate)}> - Add a event to get started - + (showCreate = !showCreate)}>Add an event to get started {/if} -
    - -
    {#if showCreate} diff --git a/src/routes/console/project-[project]/settings/webhooks/wizard/step3.svelte b/src/routes/console/project-[project]/settings/webhooks/wizard/step3.svelte index 4403ef024..b5651e67e 100644 --- a/src/routes/console/project-[project]/settings/webhooks/wizard/step3.svelte +++ b/src/routes/console/project-[project]/settings/webhooks/wizard/step3.svelte @@ -5,7 +5,7 @@ - Security (optional) + Security Set an optional basic HTTP authentication username and password to protect your endpoint from unauthorized access. @@ -34,7 +34,11 @@ bind:value={$createWebhook.security}> Warning: Untrusted or self-signed certificates may not be secure. - + Learn more diff --git a/src/routes/console/project-[project]/storage/[[page]]/+page.svelte b/src/routes/console/project-[project]/storage/[[page]]/+page.svelte index 9a4563fba..c8ba9b82b 100644 --- a/src/routes/console/project-[project]/storage/[[page]]/+page.svelte +++ b/src/routes/console/project-[project]/storage/[[page]]/+page.svelte @@ -39,7 +39,6 @@ on:click={() => (showCreate = true)}> {#each data.buckets.buckets as bucket} - XX Files {bucket.name} {#if !bucket.enabled} @@ -91,16 +90,11 @@ sum={data.buckets.total} />
    {:else} - (showCreate = true)}> -
    -

    Create your first bucket to get started

    -

    Need a hand? Check out our documentation.

    -
    -
    - - -
    -
    + (showCreate = true)} /> {/if}
    diff --git a/src/routes/console/project-[project]/storage/bucket-[bucket]/[[page]]/+page.svelte b/src/routes/console/project-[project]/storage/bucket-[bucket]/[[page]]/+page.svelte index 8afe06ef2..ad85f26b6 100644 --- a/src/routes/console/project-[project]/storage/bucket-[bucket]/[[page]]/+page.svelte +++ b/src/routes/console/project-[project]/storage/bucket-[bucket]/[[page]]/+page.svelte @@ -76,7 +76,7 @@ {#if data.files.total} @@ -187,20 +187,16 @@
    + href={`/console/project-${$page.params.project}/storage/bucket-${$page.params.bucket}`}> + Clear Search + {:else} - (showCreate = true)}> -
    -

    Upload some files to get started

    -

    Need a hand? Check out our documentation.

    -
    -
    - - -
    -
    + (showCreate = true)} /> {/if} diff --git a/src/routes/console/project-[project]/storage/bucket-[bucket]/_deleteBucket.svelte b/src/routes/console/project-[project]/storage/bucket-[bucket]/_deleteBucket.svelte index 3952d0d5c..3a205bc74 100644 --- a/src/routes/console/project-[project]/storage/bucket-[bucket]/_deleteBucket.svelte +++ b/src/routes/console/project-[project]/storage/bucket-[bucket]/_deleteBucket.svelte @@ -14,6 +14,10 @@ try { await sdkForProject.storage.deleteBucket($bucket.$id); showDelete = false; + addNotification({ + type: 'success', + message: `${$bucket.name} has been deleted` + }); await goto(`${base}/console/project-${$page.params.project}/storage`); } catch (error) { addNotification({ diff --git a/src/routes/console/project-[project]/storage/bucket-[bucket]/_deleteFile.svelte b/src/routes/console/project-[project]/storage/bucket-[bucket]/_deleteFile.svelte index c8f934069..1d5cf7604 100644 --- a/src/routes/console/project-[project]/storage/bucket-[bucket]/_deleteFile.svelte +++ b/src/routes/console/project-[project]/storage/bucket-[bucket]/_deleteFile.svelte @@ -16,6 +16,10 @@ await sdkForProject.storage.deleteFile(file.bucketId, file.$id); showDelete = false; dispatch('deleted', file); + addNotification({ + type: 'success', + message: `${file.name} has been deleted` + }); } catch (error) { addNotification({ type: 'error', diff --git a/src/routes/console/project-[project]/storage/bucket-[bucket]/create.svelte b/src/routes/console/project-[project]/storage/bucket-[bucket]/create.svelte index 3a1fee89b..b881da675 100644 --- a/src/routes/console/project-[project]/storage/bucket-[bucket]/create.svelte +++ b/src/routes/console/project-[project]/storage/bucket-[bucket]/create.svelte @@ -9,6 +9,7 @@ import { bucket } from './store'; import { calculateSize } from '$lib/helpers/sizeConvertion'; import { Permissions } from '$lib/components/permissions'; + import { addNotification } from '$lib/stores/notifications'; export let showCreate = false; @@ -34,6 +35,10 @@ showCustomId = false; uploader.addFile(file); dispatch('created'); + addNotification({ + type: 'success', + message: `${file.name} has been created` + }); } catch ({ message }) { error = message; } @@ -46,7 +51,7 @@ - Upload File + Create File
    @@ -69,6 +74,6 @@ - + diff --git a/src/routes/console/project-[project]/storage/bucket-[bucket]/file-[file]/+page.svelte b/src/routes/console/project-[project]/storage/bucket-[bucket]/file-[file]/+page.svelte index b30a47db2..7b371d592 100644 --- a/src/routes/console/project-[project]/storage/bucket-[bucket]/file-[file]/+page.svelte +++ b/src/routes/console/project-[project]/storage/bucket-[bucket]/file-[file]/+page.svelte @@ -9,7 +9,7 @@ import { addNotification } from '$lib/stores/notifications'; import { calculateSize } from '$lib/helpers/sizeConvertion'; import { onMount } from 'svelte'; - import { difference } from '$lib/helpers/array'; + import { symmetricDifference } from '$lib/helpers/array'; import { Permissions } from '$lib/components/permissions'; import Delete from './deleteFile.svelte'; import { invalidate } from '$app/navigation'; @@ -30,7 +30,7 @@ sdkForProject.storage.getFileView($file.bucketId, fileId).toString() + '&mode=admin'; $: if (filePermissions) { - if (difference(filePermissions, $file.$permissions).length) { + if (symmetricDifference(filePermissions, $file.$permissions).length) { arePermsDisabled = false; } else arePermsDisabled = true; } diff --git a/src/routes/console/project-[project]/storage/bucket-[bucket]/file-[file]/deleteFile.svelte b/src/routes/console/project-[project]/storage/bucket-[bucket]/file-[file]/deleteFile.svelte index 3b8286a38..8ea385fa1 100644 --- a/src/routes/console/project-[project]/storage/bucket-[bucket]/file-[file]/deleteFile.svelte +++ b/src/routes/console/project-[project]/storage/bucket-[bucket]/file-[file]/deleteFile.svelte @@ -17,6 +17,10 @@ await goto( `${base}/console/project-${$page.params.project}/storage/bucket-${$file.bucketId}` ); + addNotification({ + type: 'success', + message: `${$file.name} has been deleted` + }); } catch (error) { addNotification({ type: 'error', diff --git a/src/routes/console/project-[project]/storage/bucket-[bucket]/settings/+page.svelte b/src/routes/console/project-[project]/storage/bucket-[bucket]/settings/+page.svelte index a65a043eb..8db809bd6 100644 --- a/src/routes/console/project-[project]/storage/bucket-[bucket]/settings/+page.svelte +++ b/src/routes/console/project-[project]/storage/bucket-[bucket]/settings/+page.svelte @@ -9,7 +9,8 @@ InputTags, InputNumber, InputSelect, - InputSwitch + InputSwitch, + FormList } from '$lib/elements/forms'; import { bucket } from '../store'; import { toLocaleDateTime } from '$lib/helpers/date'; @@ -17,7 +18,7 @@ import { sdkForProject } from '$lib/stores/sdk'; import { addNotification } from '$lib/stores/notifications'; import { onMount } from 'svelte'; - import { difference } from '$lib/helpers/array'; + import { symmetricDifference } from '$lib/helpers/array'; import { Permissions } from '$lib/components/permissions'; import { invalidate } from '$app/navigation'; import { Dependencies } from '$lib/constants'; @@ -57,7 +58,7 @@ if (bucketFileSecurity !== $bucket.fileSecurity) { arePermsDisabled = false; } else if (bucketPermissions) { - if (difference(bucketPermissions, $bucket.$permissions).length) { + if (symmetricDifference(bucketPermissions, $bucket.$permissions).length) { arePermsDisabled = false; } else arePermsDisabled = true; } @@ -208,14 +209,16 @@ {$bucket.name} -
      - -
    -

    Created: {toLocaleDateTime($bucket.$createdAt)}

    -

    Last Updated: {toLocaleDateTime($bucket.$updatedAt)}

    +
    + + + +

    Created: {toLocaleDateTime($bucket.$createdAt)}

    +

    Last Updated: {toLocaleDateTime($bucket.$updatedAt)}

    +
    @@ -228,14 +231,14 @@ Update Name -
      + -
    +
    @@ -296,7 +299,7 @@ and Antivirus scanning.

    -
      +
    • -
    +
    @@ -398,8 +401,11 @@ selected={extensions.includes(ext)} button on:click={() => { - if (!extensions.includes(ext)) + if (!extensions.includes(ext)) { extensions = [...extensions, ext]; + } else { + extensions = extensions.filter((e) => e !== ext); + } }}>