diff --git a/CHANGELOG.md b/CHANGELOG.md index ca2208e0d..e6175037c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,47 @@ # Changelog All notable changes to Mainsail will be documented in this file. +## [2.10.0](https://github.com/mainsail-crew/mainsail/releases/tag/v2.10.0) - 2024-02-15 +### Features + +- **history**: Add interrupted state to history job ([#1738](https://github.com/mainsail-crew/mainsail/pull/1738)) +- Add ability to re-arrange job queue's items ([#1692](https://github.com/mainsail-crew/mainsail/pull/1692)) +- Add sum + eta in jobqueue panel ([#1770](https://github.com/mainsail-crew/mainsail/pull/1770)) +- Add devices dialog in editor ([#1765](https://github.com/mainsail-crew/mainsail/pull/1765)) +- Add ability to add history items to job queue ([#1778](https://github.com/mainsail-crew/mainsail/pull/1778)) + +### Bug Fixes and Improvements + +- **console**: Fix color of autocomplete and command list ([#1733](https://github.com/mainsail-crew/mainsail/pull/1733)) +- **timelapse**: Fix issue with changing timelapse settings ([#1745](https://github.com/mainsail-crew/mainsail/pull/1745)) +- Incorrect scaling of images in dialogImage ([#1746](https://github.com/mainsail-crew/mainsail/pull/1746)) +- Show extruder extra menu without load/unload macros ([#1747](https://github.com/mainsail-crew/mainsail/pull/1747)) +- Fix ETA calculation from jobqueue during print preheat ([#1773](https://github.com/mainsail-crew/mainsail/pull/1773)) +- File upload rate displays `NaN` instead of an actual value ([#1777](https://github.com/mainsail-crew/mainsail/pull/1777)) + +### Performance + +- Batch gcode file metadata requests ([#1737](https://github.com/mainsail-crew/mainsail/pull/1737)) + +### Refactor + +- Refactor spoolman integration to support v2 response ([#1749](https://github.com/mainsail-crew/mainsail/pull/1749)) +- Refactor heightmap page ([#1759](https://github.com/mainsail-crew/mainsail/pull/1759)) + +### Localization + +- **da**: Update danish translation ([#1757](https://github.com/mainsail-crew/mainsail/pull/1757)) +- **de**: Update german locale ([#1772](https://github.com/mainsail-crew/mainsail/pull/1772)) +- **en**: Fix typo in DescriptionPreviouslyThrottled ([#1776](https://github.com/mainsail-crew/mainsail/pull/1776)) +- **it**: Update italian translation ([#1763](https://github.com/mainsail-crew/mainsail/pull/1763)) +- **zh**: Update chinese locale ([#1767](https://github.com/mainsail-crew/mainsail/pull/1767)) + +### Other + +- **deps**: Update @sindarius/gcodeviewer ([#1755](https://github.com/mainsail-crew/mainsail/pull/1755)) +- Update github issue bot text ([#1743](https://github.com/mainsail-crew/mainsail/pull/1743)) +- Fix typo in bot text ([#1748](https://github.com/mainsail-crew/mainsail/pull/1748)) + ## [2.9.1](https://github.com/mainsail-crew/mainsail/releases/tag/v2.9.1) - 2023-12-31 ### Bug Fixes and Improvements diff --git a/package-lock.json b/package-lock.json index 011e9f425..aa968f738 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "mainsail", - "version": "2.9.1", + "version": "2.10.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "mainsail", - "version": "2.9.1", + "version": "2.10.0", "dependencies": { "@codemirror/commands": "^6.0.1", "@codemirror/lang-css": "^6.0.0", @@ -18,7 +18,7 @@ "@codemirror/view": "^6.0.3", "@jaames/iro": "^5.5.2", "@lezer/highlight": "^1.0.0", - "@sindarius/gcodeviewer": "^3.7.6", + "@sindarius/gcodeviewer": "^3.7.8", "@uiw/codemirror-theme-vscode": "^4.19.11", "axios": "^1.6.0", "codemirror": "^6.0.1", @@ -2136,76 +2136,76 @@ } }, "node_modules/@babylonjs/core": { - "version": "5.57.1", - "resolved": "https://registry.npmjs.org/@babylonjs/core/-/core-5.57.1.tgz", - "integrity": "sha512-k8U+SFPVGvHgeNr651nxZL26iVCmTzjmRrdbQa0BGas+lg8PIV/tfhN4uTeWWQeRFLvjbkcHA5qD8x/Xk3EpMQ==" + "version": "6.43.0", + "resolved": "https://registry.npmjs.org/@babylonjs/core/-/core-6.43.0.tgz", + "integrity": "sha512-pLFvvtC26TeICUcF0YjuuQqvCahJwPlATXnJkvBzMWXXxUE0Y5rI8L28iScu2WKy975605KdccJI5VL2NG7sUQ==" }, "node_modules/@babylonjs/gui": { - "version": "5.57.1", - "resolved": "https://registry.npmjs.org/@babylonjs/gui/-/gui-5.57.1.tgz", - "integrity": "sha512-NUOYKF5iAA0UmFFHUBkb12K9Zvqw8BnOVAbM27CZ7WpnHFQ+4/CJuy9nFoCGkBjv2A5W7M1ML/7cjmce0CbdRA==", + "version": "6.43.0", + "resolved": "https://registry.npmjs.org/@babylonjs/gui/-/gui-6.43.0.tgz", + "integrity": "sha512-iYsB7uyC40w0QkFGcPw8jAzE26jsgTFvWHTVKPSZxjQ5cG2RQEeK3aD8l+GvWauSc2qPB0wMOsvkAtusdy1g7g==", "peer": true, "peerDependencies": { - "@babylonjs/core": "^5.22.0" + "@babylonjs/core": "^6.0.0" } }, "node_modules/@babylonjs/gui-editor": { - "version": "5.57.1", - "resolved": "https://registry.npmjs.org/@babylonjs/gui-editor/-/gui-editor-5.57.1.tgz", - "integrity": "sha512-FY4py7CzLiW0NAd0atBb5oCI/bS6kLsfszliZFvgrWl+eJ6z54aD1m23dZ+zvy8IqxcbSUkFYKqSfRinZttnkA==", + "version": "6.43.0", + "resolved": "https://registry.npmjs.org/@babylonjs/gui-editor/-/gui-editor-6.43.0.tgz", + "integrity": "sha512-OtahbC04Mklj2i2WdGlYXc9oN/ntpp2DuNZhqc1l95ioPIZWtlhSzMQKzh6/VmJQZBwwRi8HZwPPjQ1arIkRHA==", "peer": true, "peerDependencies": { - "@babylonjs/core": "^5.22.0", - "@babylonjs/gui": "^5.22.0", + "@babylonjs/core": "^6.0.0", + "@babylonjs/gui": "^6.0.0", "@types/react": ">=16.7.3", "@types/react-dom": ">=16.0.9" } }, "node_modules/@babylonjs/inspector": { - "version": "5.57.1", - "resolved": "https://registry.npmjs.org/@babylonjs/inspector/-/inspector-5.57.1.tgz", - "integrity": "sha512-F40V91R4h+vhlmBs7FHA4qQkFKjJwWF78cUhUgTVwGdwHDRwZ3Pweu26xEfTtw71am26tgHgBZedBTNCokgqtQ==", + "version": "6.43.0", + "resolved": "https://registry.npmjs.org/@babylonjs/inspector/-/inspector-6.43.0.tgz", + "integrity": "sha512-Cjw/Xk8v5/84IFi6rhLS363XgDkQzPrfQG7nFKHF6k8OWwz8Ze/cb8O8IeXKEc2QFImCdRnZoDv7BkJnZ03Caw==", "dependencies": { "@fortawesome/fontawesome-svg-core": "^6.1.0", "@fortawesome/free-regular-svg-icons": "^6.0.0", "@fortawesome/free-solid-svg-icons": "^6.0.0" }, "peerDependencies": { - "@babylonjs/core": "^5.22.0", - "@babylonjs/gui": "^5.22.0", - "@babylonjs/gui-editor": "^5.22.0", - "@babylonjs/loaders": "^5.22.0", - "@babylonjs/materials": "^5.22.0", - "@babylonjs/serializers": "^5.22.0", + "@babylonjs/core": "^6.0.0", + "@babylonjs/gui": "^6.0.0", + "@babylonjs/gui-editor": "^6.0.0", + "@babylonjs/loaders": "^6.0.0", + "@babylonjs/materials": "^6.0.0", + "@babylonjs/serializers": "^6.0.0", "@types/react": ">=16.7.3", "@types/react-dom": ">=16.0.9" } }, "node_modules/@babylonjs/loaders": { - "version": "5.57.1", - "resolved": "https://registry.npmjs.org/@babylonjs/loaders/-/loaders-5.57.1.tgz", - "integrity": "sha512-DHk0iOwJgnTcj8vI+cQVzpiUvWGJvYqWyZxsf7nzhbeND+ZwNWSG0AelaGbGHpWTaDSd/DjUcoWVZuT4Cg6/Xg==", + "version": "6.43.0", + "resolved": "https://registry.npmjs.org/@babylonjs/loaders/-/loaders-6.43.0.tgz", + "integrity": "sha512-+cgw4NDchjc/5dZYGzOEhJU+9++ygYlA+ChybE5yvF+yUDWZ7fGXnEXMFImXeFELjk5RRK1NS3H3YvPe7A+Rug==", "peerDependencies": { - "@babylonjs/core": "^5.22.0", - "babylonjs-gltf2interface": "^5.22.0" + "@babylonjs/core": "^6.0.0", + "babylonjs-gltf2interface": "^6.0.0" } }, "node_modules/@babylonjs/materials": { - "version": "5.57.1", - "resolved": "https://registry.npmjs.org/@babylonjs/materials/-/materials-5.57.1.tgz", - "integrity": "sha512-NLdR6eGUr+wFqie937HRWsnaWPeECpjOrYDGvjjYDg08VAcIC3YyctAuQxv8rId7BoDttkUd8Ey/IZ5d/9H7GA==", + "version": "6.43.0", + "resolved": "https://registry.npmjs.org/@babylonjs/materials/-/materials-6.43.0.tgz", + "integrity": "sha512-x4pKz2d0IRFZ9pmWIJ4FR/X5mak8Ycl2tAQtOf1ihsanNyDgXnB3Jfgl9z9TaoQSoU2y+HpjvenDF4oaLkXzUw==", "peerDependencies": { - "@babylonjs/core": "^5.22.0" + "@babylonjs/core": "^6.0.0" } }, "node_modules/@babylonjs/serializers": { - "version": "5.57.1", - "resolved": "https://registry.npmjs.org/@babylonjs/serializers/-/serializers-5.57.1.tgz", - "integrity": "sha512-wV7pMhvEP9lf3zjYo2YmQDl2D8V617wONkMuNRj+lpJsD2I2PT7B2wxUqtKVoCY+TyCEM5ns9vn722V7bHZiHg==", + "version": "6.43.0", + "resolved": "https://registry.npmjs.org/@babylonjs/serializers/-/serializers-6.43.0.tgz", + "integrity": "sha512-cVFGO98SapRf/QJRQx7+hZkbFnDhXuHK9obDJKKpv/76vSpLWDoLoZk1v1Nu8pm30n75Ukffcco77Za14ZZhFA==", "peer": true, "peerDependencies": { - "@babylonjs/core": "^5.22.0", - "babylonjs-gltf2interface": "^5.22.0" + "@babylonjs/core": "^6.0.0", + "babylonjs-gltf2interface": "^6.0.0" } }, "node_modules/@codemirror/autocomplete": { @@ -2825,45 +2825,45 @@ } }, "node_modules/@fortawesome/fontawesome-common-types": { - "version": "6.4.2", - "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-6.4.2.tgz", - "integrity": "sha512-1DgP7f+XQIJbLFCTX1V2QnxVmpLdKdzzo2k8EmvDOePfchaIGQ9eCHj2up3/jNEbZuBqel5OxiaOJf37TWauRA==", + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-6.5.1.tgz", + "integrity": "sha512-GkWzv+L6d2bI5f/Vk6ikJ9xtl7dfXtoRu3YGE6nq0p/FFqA1ebMOAWg3XgRyb0I6LYyYkiAo+3/KrwuBp8xG7A==", "hasInstallScript": true, "engines": { "node": ">=6" } }, "node_modules/@fortawesome/fontawesome-svg-core": { - "version": "6.4.2", - "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-svg-core/-/fontawesome-svg-core-6.4.2.tgz", - "integrity": "sha512-gjYDSKv3TrM2sLTOKBc5rH9ckje8Wrwgx1CxAPbN5N3Fm4prfi7NsJVWd1jklp7i5uSCVwhZS5qlhMXqLrpAIg==", + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-svg-core/-/fontawesome-svg-core-6.5.1.tgz", + "integrity": "sha512-MfRCYlQPXoLlpem+egxjfkEuP9UQswTrlCOsknus/NcMoblTH2g0jPrapbcIb04KGA7E2GZxbAccGZfWoYgsrQ==", "hasInstallScript": true, "dependencies": { - "@fortawesome/fontawesome-common-types": "6.4.2" + "@fortawesome/fontawesome-common-types": "6.5.1" }, "engines": { "node": ">=6" } }, "node_modules/@fortawesome/free-regular-svg-icons": { - "version": "6.4.2", - "resolved": "https://registry.npmjs.org/@fortawesome/free-regular-svg-icons/-/free-regular-svg-icons-6.4.2.tgz", - "integrity": "sha512-0+sIUWnkgTVVXVAPQmW4vxb9ZTHv0WstOa3rBx9iPxrrrDH6bNLsDYuwXF9b6fGm+iR7DKQvQshUH/FJm3ed9Q==", + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/@fortawesome/free-regular-svg-icons/-/free-regular-svg-icons-6.5.1.tgz", + "integrity": "sha512-m6ShXn+wvqEU69wSP84coxLbNl7sGVZb+Ca+XZq6k30SzuP3X4TfPqtycgUh9ASwlNh5OfQCd8pDIWxl+O+LlQ==", "hasInstallScript": true, "dependencies": { - "@fortawesome/fontawesome-common-types": "6.4.2" + "@fortawesome/fontawesome-common-types": "6.5.1" }, "engines": { "node": ">=6" } }, "node_modules/@fortawesome/free-solid-svg-icons": { - "version": "6.4.2", - "resolved": "https://registry.npmjs.org/@fortawesome/free-solid-svg-icons/-/free-solid-svg-icons-6.4.2.tgz", - "integrity": "sha512-sYwXurXUEQS32fZz9hVCUUv/xu49PEJEyUOsA51l6PU/qVgfbTb2glsTEaJngVVT8VqBATRIdh7XVgV1JF1LkA==", + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/@fortawesome/free-solid-svg-icons/-/free-solid-svg-icons-6.5.1.tgz", + "integrity": "sha512-S1PPfU3mIJa59biTtXJz1oI0+KAXW6bkAb31XKhxdxtuXDiUIFsih4JR1v5BbxY7hVHsD1RKq+jRkVRaf773NQ==", "hasInstallScript": true, "dependencies": { - "@fortawesome/fontawesome-common-types": "6.4.2" + "@fortawesome/fontawesome-common-types": "6.5.1" }, "engines": { "node": ">=6" @@ -3197,14 +3197,14 @@ "dev": true }, "node_modules/@sindarius/gcodeviewer": { - "version": "3.7.6", - "resolved": "https://registry.npmjs.org/@sindarius/gcodeviewer/-/gcodeviewer-3.7.6.tgz", - "integrity": "sha512-6L8znazyJgAJ8IiDTSF1o4DB+iQxszM3WfsQBFcKaSIwUYJVWQIpuccHrXvsvFQB6xQ7WAwrac5grkGfzIrNpA==", - "dependencies": { - "@babylonjs/core": "^5.53.0", - "@babylonjs/inspector": "^5.53.0", - "@babylonjs/loaders": "^5.53.0", - "@babylonjs/materials": "^5.53.0", + "version": "3.7.8", + "resolved": "https://registry.npmjs.org/@sindarius/gcodeviewer/-/gcodeviewer-3.7.8.tgz", + "integrity": "sha512-/Z9YE/GaVBV4dydju9kJ1uv8/GlffUzjoIGYxlj+kvZnBhP7OZ0ZWviL7zs4d7npSwSw7J+LNYWaIpVW13KQrA==", + "dependencies": { + "@babylonjs/core": "^6.43.0", + "@babylonjs/inspector": "^6.43.0", + "@babylonjs/loaders": "^6.43.0", + "@babylonjs/materials": "^6.43.0", "d3": "^7.4.4" } }, @@ -3293,15 +3293,15 @@ "dev": true }, "node_modules/@types/prop-types": { - "version": "15.7.8", - "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.8.tgz", - "integrity": "sha512-kMpQpfZKSCBqltAJwskgePRaYRFukDkm1oItcAbC3gNELR20XIBcN9VRgg4+m8DKsTfkWeA4m4Imp4DDuWy7FQ==", + "version": "15.7.11", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.11.tgz", + "integrity": "sha512-ga8y9v9uyeiLdpKddhxYQkxNDrfvuPrlFb0N1qnZZByvcElJaXthF1UhvCh9TLWJBEHeNtdnbysW7Y6Uq8CVng==", "peer": true }, "node_modules/@types/react": { - "version": "18.2.24", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.24.tgz", - "integrity": "sha512-Ee0Jt4sbJxMu1iDcetZEIKQr99J1Zfb6D4F3qfUWoR1JpInkY1Wdg4WwCyBjL257D0+jGqSl1twBjV8iCaC0Aw==", + "version": "18.2.56", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.56.tgz", + "integrity": "sha512-NpwHDMkS/EFZF2dONFQHgkPRwhvgq/OAvIaGQzxGSBmaeR++kTg6njr15Vatz0/2VcCEwJQFi6Jf4Q0qBu0rLA==", "peer": true, "dependencies": { "@types/prop-types": "*", @@ -3310,9 +3310,9 @@ } }, "node_modules/@types/react-dom": { - "version": "18.2.8", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.2.8.tgz", - "integrity": "sha512-bAIvO5lN/U8sPGvs1Xm61rlRHHaq5rp5N3kp9C+NJ/Q41P8iqjkXSu0+/qu8POsjH9pNWb0OYabFez7taP7omw==", + "version": "18.2.19", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.2.19.tgz", + "integrity": "sha512-aZvQL6uUbIJpjZk4U8JZGbau9KDeAwMfmhyWorxgBkqDIEf6ROjRozcmPIicqsUwPUjbkDfHKgGee1Lq65APcA==", "peer": true, "dependencies": { "@types/react": "*" @@ -3328,9 +3328,9 @@ } }, "node_modules/@types/scheduler": { - "version": "0.16.4", - "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.4.tgz", - "integrity": "sha512-2L9ifAGl7wmXwP4v3pN4p2FLhD0O1qsJpvKmNin5VA8+UvNVb447UDaAEV6UdrkA+m/Xs58U1RFps44x6TFsVQ==", + "version": "0.16.8", + "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.8.tgz", + "integrity": "sha512-WZLiwShhwLRmeV6zH+GkbOFT6Z6VklCItrDioxUnv+u4Ll+8vKeFySoFyK/0ctcRpOmwAicELfmys1sDc/Rw+A==", "peer": true }, "node_modules/@types/semver": { @@ -4225,9 +4225,9 @@ } }, "node_modules/babylonjs-gltf2interface": { - "version": "5.57.1", - "resolved": "https://registry.npmjs.org/babylonjs-gltf2interface/-/babylonjs-gltf2interface-5.57.1.tgz", - "integrity": "sha512-RZnaKfJ6Q/AYLdIjBYMRxCW/HPEC8jabAL1U8wJ0KVziw6NSbSV6S80S22fUCPTyaZ7nCekn1TYg1IPmJ/eA6w==", + "version": "6.43.0", + "resolved": "https://registry.npmjs.org/babylonjs-gltf2interface/-/babylonjs-gltf2interface-6.43.0.tgz", + "integrity": "sha512-+orCb4giE41Ysl8d2ZOeYCRBsT6FnmDwkW9+sHcEACUEpdtFeTShZ+ckucDAB/Ia2e3ah9F2hADbGA/8TfFngg==", "peer": true }, "node_modules/balanced-match": { diff --git a/package.json b/package.json index c2c31dfc2..74cbd5c73 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "mainsail", - "version": "2.9.1", + "version": "2.10.0", "private": true, "decription": "a klipper web interface", "author": { @@ -33,7 +33,7 @@ "@codemirror/view": "^6.0.3", "@jaames/iro": "^5.5.2", "@lezer/highlight": "^1.0.0", - "@sindarius/gcodeviewer": "^3.7.6", + "@sindarius/gcodeviewer": "^3.7.8", "@uiw/codemirror-theme-vscode": "^4.19.11", "axios": "^1.6.0", "codemirror": "^6.0.1", diff --git a/src/App.vue b/src/App.vue index 065416668..30d03d53e 100644 --- a/src/App.vue +++ b/src/App.vue @@ -4,7 +4,7 @@ - + @@ -44,6 +44,7 @@ import TheBedScrewsDialog from '@/components/dialogs/TheBedScrewsDialog.vue' import TheScrewsTiltAdjustDialog from '@/components/dialogs/TheScrewsTiltAdjustDialog.vue' import { setAndLoadLocale } from './plugins/i18n' import TheMacroPrompt from '@/components/dialogs/TheMacroPrompt.vue' +import { AppRoute } from '@/routes' Component.registerHooks(['metaInfo']) @@ -172,6 +173,20 @@ export default class App extends Mixins(BaseMixin, ThemeMixin) { return Math.floor(this.$store.getters['printer/getPrintPercent'] * 100) } + get containerClasses() { + const currentRouteOptions = this.$router.options.routes?.find( + (route) => route.name === this.$route.name + ) as AppRoute + + return { + 'px-3': true, + 'px-sm-6': true, + 'py-sm-6': true, + 'mx-auto': true, + fullscreen: currentRouteOptions?.fullscreen ?? false, + } + } + @Watch('language') async languageChanged(newVal: string): Promise { await setAndLoadLocale(newVal) diff --git a/src/assets/styles/page.css b/src/assets/styles/page.css index fc3438e48..1a9084aa8 100644 --- a/src/assets/styles/page.css +++ b/src/assets/styles/page.css @@ -11,6 +11,10 @@ body { max-width: 1800px; } +#page-container.fullscreen { + max-width: none; +} + .overflowingContentWidgets { visibility: hidden; } diff --git a/src/components/TheEditor.vue b/src/components/TheEditor.vue index 4d0974c67..df97f93ce 100644 --- a/src/components/TheEditor.vue +++ b/src/components/TheEditor.vue @@ -13,6 +13,10 @@ :icon="isWriteable ? mdiFileDocumentEditOutline : mdiFileDocumentOutline" :title="title"> @@ -135,14 +140,17 @@ import { mdiHelp, mdiHelpCircle, mdiRestart, + mdiUsb, } from '@mdi/js' import type Codemirror from '@/components/inputs/Codemirror.vue' +import DevicesDialog from '@/components/dialogs/DevicesDialog.vue' @Component({ - components: { Panel, CodemirrorAsync }, + components: { DevicesDialog, Panel, CodemirrorAsync }, }) export default class TheEditor extends Mixins(BaseMixin) { - private dialogConfirmChange = false + dialogConfirmChange = false + dialogDevices = false formatFilesize = formatFilesize @@ -157,6 +165,7 @@ export default class TheEditor extends Mixins(BaseMixin) { mdiHelpCircle = mdiHelpCircle mdiFileDocumentEditOutline = mdiFileDocumentEditOutline mdiFileDocumentOutline = mdiFileDocumentOutline + mdiUsb = mdiUsb private scrollbarOptions = { scrollbars: { autoHide: 'never' } } diff --git a/src/components/TheTopbar.vue b/src/components/TheTopbar.vue index ee9225313..c74ab0980 100644 --- a/src/components/TheTopbar.vue +++ b/src/components/TheTopbar.vue @@ -110,7 +110,7 @@ import { Mixins } from 'vue-property-decorator' import BaseMixin from '@/components/mixins/base' import { validGcodeExtensions } from '@/store/variables' import Component from 'vue-class-component' -import axios from 'axios' +import axios, { AxiosProgressEvent } from 'axios' import { formatFilesize } from '@/plugins/helpers' import TheTopCornerMenu from '@/components/TheTopCornerMenu.vue' import TheSettingsMenu from '@/components/TheSettingsMenu.vue' @@ -128,10 +128,6 @@ type uploadSnackbar = { speed: number total: number cancelTokenSource: any - lastProgress: { - time: number - loaded: number - } } @Component({ @@ -162,10 +158,6 @@ export default class TheTopbar extends Mixins(BaseMixin) { speed: 0, total: 0, cancelTokenSource: null, - lastProgress: { - time: 0, - loaded: 0, - }, } formatFilesize = formatFilesize @@ -317,8 +309,6 @@ export default class TheTopbar extends Mixins(BaseMixin) { this.uploadSnackbar.status = true this.uploadSnackbar.percent = 0 this.uploadSnackbar.speed = 0 - this.uploadSnackbar.lastProgress.loaded = 0 - this.uploadSnackbar.lastProgress.time = 0 formData.append('file', file, filename) formData.append('print', 'true') @@ -329,18 +319,10 @@ export default class TheTopbar extends Mixins(BaseMixin) { .post(this.apiUrl + '/server/files/upload', formData, { cancelToken: this.uploadSnackbar.cancelTokenSource.token, headers: { 'Content-Type': 'multipart/form-data' }, - onUploadProgress: (progressEvent: ProgressEvent) => { - this.uploadSnackbar.percent = (progressEvent.loaded * 100) / progressEvent.total - if (this.uploadSnackbar.lastProgress.time) { - const time = progressEvent.timeStamp - this.uploadSnackbar.lastProgress.time - const data = progressEvent.loaded - this.uploadSnackbar.lastProgress.loaded - - if (time) this.uploadSnackbar.speed = data / (time / 1000) - } - - this.uploadSnackbar.lastProgress.time = progressEvent.timeStamp - this.uploadSnackbar.lastProgress.loaded = progressEvent.loaded - this.uploadSnackbar.total = progressEvent.total + onUploadProgress: (progressEvent: AxiosProgressEvent) => { + this.uploadSnackbar.percent = (progressEvent.progress ?? 0) * 100 + this.uploadSnackbar.speed = progressEvent.rate ?? 0 + this.uploadSnackbar.total = progressEvent.total ?? 0 }, }) .then((result) => { diff --git a/src/components/console/ConsoleTableEntry.vue b/src/components/console/ConsoleTableEntry.vue index 871ac909d..9e0cd7897 100644 --- a/src/components/console/ConsoleTableEntry.vue +++ b/src/components/console/ConsoleTableEntry.vue @@ -1,7 +1,7 @@ @@ -17,7 +17,7 @@ export default class ConsoleTableEntry extends Mixins(BaseMixin) { declare readonly event: ServerStateEvent get entryStyle() { - const classes = ['ma-0'] + const classes = ['ma-0', 'flex-nowrap'] classes.push(this.$store.state.gui.console.entryStyle ?? 'default') if (this.event.type === 'action') classes.push('text--disabled') diff --git a/src/components/dialogs/AddBatchToQueueDialog.vue b/src/components/dialogs/AddBatchToQueueDialog.vue new file mode 100644 index 000000000..f98c958c9 --- /dev/null +++ b/src/components/dialogs/AddBatchToQueueDialog.vue @@ -0,0 +1,120 @@ + + + + + diff --git a/src/components/dialogs/DevicesDialog.vue b/src/components/dialogs/DevicesDialog.vue new file mode 100644 index 000000000..10555aaeb --- /dev/null +++ b/src/components/dialogs/DevicesDialog.vue @@ -0,0 +1,111 @@ + + + + + diff --git a/src/components/dialogs/DevicesDialogCan.vue b/src/components/dialogs/DevicesDialogCan.vue new file mode 100644 index 000000000..39a6dc1c4 --- /dev/null +++ b/src/components/dialogs/DevicesDialogCan.vue @@ -0,0 +1,84 @@ + + + + + diff --git a/src/components/dialogs/DevicesDialogCanDevice.vue b/src/components/dialogs/DevicesDialogCanDevice.vue new file mode 100644 index 000000000..163362ce3 --- /dev/null +++ b/src/components/dialogs/DevicesDialogCanDevice.vue @@ -0,0 +1,32 @@ + + + diff --git a/src/components/dialogs/DevicesDialogSerial.vue b/src/components/dialogs/DevicesDialogSerial.vue new file mode 100644 index 000000000..0a0104c86 --- /dev/null +++ b/src/components/dialogs/DevicesDialogSerial.vue @@ -0,0 +1,72 @@ + + + + + diff --git a/src/components/dialogs/DevicesDialogSerialDevice.vue b/src/components/dialogs/DevicesDialogSerialDevice.vue new file mode 100644 index 000000000..b3293ee33 --- /dev/null +++ b/src/components/dialogs/DevicesDialogSerialDevice.vue @@ -0,0 +1,45 @@ + + + diff --git a/src/components/dialogs/DevicesDialogUsb.vue b/src/components/dialogs/DevicesDialogUsb.vue new file mode 100644 index 000000000..229b0e9ff --- /dev/null +++ b/src/components/dialogs/DevicesDialogUsb.vue @@ -0,0 +1,74 @@ + + + + + diff --git a/src/components/dialogs/DevicesDialogUsbDevice.vue b/src/components/dialogs/DevicesDialogUsbDevice.vue new file mode 100644 index 000000000..58458994c --- /dev/null +++ b/src/components/dialogs/DevicesDialogUsbDevice.vue @@ -0,0 +1,55 @@ + + + diff --git a/src/components/dialogs/DevicesDialogVideo.vue b/src/components/dialogs/DevicesDialogVideo.vue new file mode 100644 index 000000000..f6ef97c9e --- /dev/null +++ b/src/components/dialogs/DevicesDialogVideo.vue @@ -0,0 +1,103 @@ + + + + + diff --git a/src/components/dialogs/DevicesDialogVideoDeviceLibcamera.vue b/src/components/dialogs/DevicesDialogVideoDeviceLibcamera.vue new file mode 100644 index 000000000..22091d0dc --- /dev/null +++ b/src/components/dialogs/DevicesDialogVideoDeviceLibcamera.vue @@ -0,0 +1,61 @@ + + + diff --git a/src/components/dialogs/DevicesDialogVideoDeviceV4l2.vue b/src/components/dialogs/DevicesDialogVideoDeviceV4l2.vue new file mode 100644 index 000000000..7909db8fa --- /dev/null +++ b/src/components/dialogs/DevicesDialogVideoDeviceV4l2.vue @@ -0,0 +1,84 @@ + + + diff --git a/src/components/dialogs/HistoryListPanelAddMaintenance.vue b/src/components/dialogs/HistoryListPanelAddMaintenance.vue new file mode 100644 index 000000000..3dfd2b617 --- /dev/null +++ b/src/components/dialogs/HistoryListPanelAddMaintenance.vue @@ -0,0 +1,262 @@ + + + diff --git a/src/components/dialogs/HistoryListPanelDeleteSelectedDialog.vue b/src/components/dialogs/HistoryListPanelDeleteSelectedDialog.vue new file mode 100644 index 000000000..281c6d75d --- /dev/null +++ b/src/components/dialogs/HistoryListPanelDeleteSelectedDialog.vue @@ -0,0 +1,66 @@ + + + diff --git a/src/components/dialogs/HistoryListPanelDetailMaintenance.vue b/src/components/dialogs/HistoryListPanelDetailMaintenance.vue new file mode 100644 index 000000000..1e566be74 --- /dev/null +++ b/src/components/dialogs/HistoryListPanelDetailMaintenance.vue @@ -0,0 +1,188 @@ + + + diff --git a/src/components/dialogs/HistoryListPanelDetailsDialog.vue b/src/components/dialogs/HistoryListPanelDetailsDialog.vue new file mode 100644 index 000000000..16f7f33f8 --- /dev/null +++ b/src/components/dialogs/HistoryListPanelDetailsDialog.vue @@ -0,0 +1,126 @@ + + + + + diff --git a/src/components/dialogs/HistoryListPanelNoteDialog.vue b/src/components/dialogs/HistoryListPanelNoteDialog.vue new file mode 100644 index 000000000..63c2c163d --- /dev/null +++ b/src/components/dialogs/HistoryListPanelNoteDialog.vue @@ -0,0 +1,88 @@ + + + + + diff --git a/src/components/dialogs/SpoolmanChangeSpoolDialog.vue b/src/components/dialogs/SpoolmanChangeSpoolDialog.vue index 14206b70a..b8e12a27d 100644 --- a/src/components/dialogs/SpoolmanChangeSpoolDialog.vue +++ b/src/components/dialogs/SpoolmanChangeSpoolDialog.vue @@ -156,6 +156,11 @@ export default class SpoolmanChangeSpoolDialog extends Mixins(BaseMixin) { } customFilter(value: any, search: string, item: ServerSpoolmanStateSpool): boolean { + if (search.trim().startsWith('web+spoolman:s-')) { + const spoolId = parseInt(search.split('-')[1] ?? -1) + return item.id === spoolId + } + const querySplits = search.toLowerCase().split(' ') const searchArray = [ item.comment, diff --git a/src/components/dialogs/SpoolmanChangeSpoolDialogRow.vue b/src/components/dialogs/SpoolmanChangeSpoolDialogRow.vue index a5d0ba8fd..2ef2741fa 100644 --- a/src/components/dialogs/SpoolmanChangeSpoolDialogRow.vue +++ b/src/components/dialogs/SpoolmanChangeSpoolDialogRow.vue @@ -16,7 +16,7 @@ @@ -131,4 +131,9 @@ export default class SpoolmanChangeSpoolDialogRow extends Mixins(BaseMixin) { .no--padding { padding: 0; } + +.comment { + white-space: pre-wrap; + overflow-wrap: anywhere; +} diff --git a/src/components/gcodeviewer/Viewer.vue b/src/components/gcodeviewer/Viewer.vue index 778415ec5..6e195f752 100644 --- a/src/components/gcodeviewer/Viewer.vue +++ b/src/components/gcodeviewer/Viewer.vue @@ -277,7 +277,7 @@ import { Component, Mixins, Prop, Ref, Watch } from 'vue-property-decorator' import BaseMixin from '../mixins/base' import GCodeViewer from '@sindarius/gcodeviewer' -import axios from 'axios' +import axios, { AxiosProgressEvent } from 'axios' import { formatFilesize } from '@/plugins/helpers' import Panel from '@/components/ui/Panel.vue' import CodeStream from '@/components/gcodeviewer/CodeStream.vue' @@ -304,10 +304,6 @@ interface downloadSnackbar { speed: number total: number cancelTokenSource: any - lastProgress: { - time: number - loaded: number - } } let viewer: any = null @@ -357,10 +353,6 @@ export default class Viewer extends Mixins(BaseMixin) { speed: 0, total: 0, cancelTokenSource: {}, - lastProgress: { - time: 0, - loaded: 0, - }, } private excludeObject = { @@ -634,7 +626,6 @@ export default class Viewer extends Mixins(BaseMixin) { async loadFile(filename: string) { this.downloadSnackbar.status = true this.downloadSnackbar.speed = 0 - this.downloadSnackbar.lastProgress.time = 0 this.downloadSnackbar.filename = filename.startsWith('gcodes/') ? filename.slice(7) : filename const CancelToken = axios.CancelToken this.downloadSnackbar.cancelTokenSource = CancelToken.source() @@ -642,20 +633,10 @@ export default class Viewer extends Mixins(BaseMixin) { .get(this.apiUrl + '/server/files/' + encodeURI(filename), { cancelToken: this.downloadSnackbar.cancelTokenSource.token, responseType: 'blob', - onDownloadProgress: (progressEvent) => { - this.downloadSnackbar.percent = (progressEvent.loaded * 100) / progressEvent.total - if (this.downloadSnackbar.lastProgress.time) { - const time = progressEvent.timeStamp - this.downloadSnackbar.lastProgress.time - const data = progressEvent.loaded - this.downloadSnackbar.lastProgress.loaded - - if (time > 1000 || this.downloadSnackbar.speed === 0) { - this.downloadSnackbar.speed = data / (time / 1000) - this.downloadSnackbar.lastProgress.time = progressEvent.timeStamp - this.downloadSnackbar.lastProgress.loaded = progressEvent.loaded - } - } else this.downloadSnackbar.lastProgress.time = progressEvent.timeStamp - - this.downloadSnackbar.total = progressEvent.total + onDownloadProgress: (progressEvent: AxiosProgressEvent) => { + this.downloadSnackbar.percent = (progressEvent.progress ?? 0) * 100 + this.downloadSnackbar.speed = progressEvent.rate ?? 0 + this.downloadSnackbar.total = progressEvent.total ?? 0 }, }) .then((res) => res.data.text()) diff --git a/src/components/inputs/MiscellaneousSlider.vue b/src/components/inputs/MiscellaneousSlider.vue index 43536deb7..6c7e3d70a 100644 --- a/src/components/inputs/MiscellaneousSlider.vue +++ b/src/components/inputs/MiscellaneousSlider.vue @@ -14,9 +14,9 @@ {{ mdiLightbulbOutline }} - {{ mdiFan }} + {{ mdiFan }} {{ convertName(name) }} - + {{ Math.round(rpm ?? 0) }} RPM {{ Math.round(parseFloat(value) * 100) }} % @@ -199,12 +199,11 @@ export default class MiscellaneousSlider extends Mixins(BaseMixin) { sendCmd(newVal: number): void { if (this.value === newVal) return - let gcode = '' + let gcode = `SET_PIN PIN=${this.name} VALUE=${newVal.toFixed(2)}` if (newVal < this.min) newVal = 0 newVal = newVal * this.multi if (this.type === 'fan') gcode = `M106 S${newVal.toFixed(0)}` if (this.type === 'fan_generic') gcode = `SET_FAN_SPEED FAN=${this.name} SPEED=${newVal}` - if (this.type === 'output_pin') gcode = `SET_PIN PIN=${this.name} VALUE=${newVal.toFixed(2)}` if (this.type === 'led') gcode = `SET_LED LED=${this.name} ${this.ledChannelName}=${newVal.toFixed(2)} SYNC=0 TRANSMIT=1` diff --git a/src/components/inputs/TextfieldWithCopy.vue b/src/components/inputs/TextfieldWithCopy.vue new file mode 100644 index 000000000..81b3fe969 --- /dev/null +++ b/src/components/inputs/TextfieldWithCopy.vue @@ -0,0 +1,52 @@ + + + diff --git a/src/components/notifications/NotificationMenuEntry.vue b/src/components/notifications/NotificationMenuEntry.vue index 07e92fad9..382d6b0da 100644 --- a/src/components/notifications/NotificationMenuEntry.vue +++ b/src/components/notifications/NotificationMenuEntry.vue @@ -1,115 +1,95 @@ - - diff --git a/src/components/panels/HistoryRemindersPanel.vue b/src/components/panels/HistoryRemindersPanel.vue deleted file mode 100644 index a6547f417..000000000 --- a/src/components/panels/HistoryRemindersPanel.vue +++ /dev/null @@ -1,506 +0,0 @@ - - - diff --git a/src/components/panels/HistoryStatisticsPanel.vue b/src/components/panels/HistoryStatisticsPanel.vue index 5ded56f68..4ef4ecdf1 100644 --- a/src/components/panels/HistoryStatisticsPanel.vue +++ b/src/components/panels/HistoryStatisticsPanel.vue @@ -12,15 +12,15 @@