@fdm-monster/client-next 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (205) hide show
  1. package/.all-contributorsrc +57 -0
  2. package/.browserslistrc +4 -0
  3. package/.editorconfig +5 -0
  4. package/.env +1 -0
  5. package/.eslintrc-auto-import.json +73 -0
  6. package/.eslintrc.js +126 -0
  7. package/.github/FUNDING.yml +3 -0
  8. package/.github/workflows/release-client.yml +94 -0
  9. package/.github/workflows/vue-publish.yml +26 -0
  10. package/.prettierignore +15 -0
  11. package/.prettierrc.cjs +7 -0
  12. package/.whitesource +12 -0
  13. package/.yarn/releases/yarn-4.5.1.cjs +934 -0
  14. package/.yarnrc.yml +3 -0
  15. package/CODE_OF_CONDUCT.md +46 -0
  16. package/README.md +93 -0
  17. package/RELEASE_NOTES.MD +11 -0
  18. package/index.html +16 -0
  19. package/package.default.json +42 -0
  20. package/package.json +26 -0
  21. package/public/favicon.ico +0 -0
  22. package/public/img/DavidZwart.jpg +0 -0
  23. package/public/img/OIG.JYDC2RaWdz7g9.jpg +0 -0
  24. package/public/img/OIG.jpg +0 -0
  25. package/public/img/icons/android-chrome-192x192.png +0 -0
  26. package/public/img/icons/android-chrome-256x256.png +0 -0
  27. package/public/img/icons/android-chrome-384x384.png +0 -0
  28. package/public/img/icons/android-chrome-512x512.png +0 -0
  29. package/public/img/icons/favicon.svg +1 -0
  30. package/public/img/logo.png +0 -0
  31. package/public/img/logo.svg +1 -0
  32. package/public/img/manifest.webmanifest +33 -0
  33. package/public/img/octoprint-tentacle.svg +144 -0
  34. package/public/img/thumbail_unknown.jpg +0 -0
  35. package/public/img/vbanner.jpg +0 -0
  36. package/public/index.html +17 -0
  37. package/public/robots.txt +2 -0
  38. package/renovate.json +30 -0
  39. package/src/App.vue +60 -0
  40. package/src/AppLoader.vue +383 -0
  41. package/src/assets/adjectives.json +1468 -0
  42. package/src/assets/android-chrome-192x192.png +0 -0
  43. package/src/assets/logo.png +0 -0
  44. package/src/assets/logo.svg +6 -0
  45. package/src/assets/nouns.json +4309 -0
  46. package/src/auto-imports.d.ts +139 -0
  47. package/src/backend/app.service.ts +39 -0
  48. package/src/backend/auth.service.ts +56 -0
  49. package/src/backend/base.service.ts +57 -0
  50. package/src/backend/batch.service.ts +37 -0
  51. package/src/backend/camera-stream.service.ts +33 -0
  52. package/src/backend/custom-gcode.service.ts +11 -0
  53. package/src/backend/dto/octoprint-settings.dto.ts +168 -0
  54. package/src/backend/first-time-setup.service.ts +17 -0
  55. package/src/backend/floor.service.ts +84 -0
  56. package/src/backend/index.ts +4 -0
  57. package/src/backend/print-completions.service.ts +11 -0
  58. package/src/backend/printer-file.service.ts +91 -0
  59. package/src/backend/printer-group.service.ts +62 -0
  60. package/src/backend/printer-job.service.ts +20 -0
  61. package/src/backend/printer-settings.service.ts +28 -0
  62. package/src/backend/printers.service.ts +136 -0
  63. package/src/backend/server-private.service.ts +55 -0
  64. package/src/backend/server.api.ts +132 -0
  65. package/src/backend/settings.service.ts +85 -0
  66. package/src/backend/user.service.ts +51 -0
  67. package/src/components/AboutHelp/AboutView.vue +164 -0
  68. package/src/components/CameraGrid/CameraGridView.vue +111 -0
  69. package/src/components/FirstTimeSetup/FirstTimeSetupView.vue +354 -0
  70. package/src/components/Generic/Actions/PrinterConnectionAction.vue +56 -0
  71. package/src/components/Generic/Actions/PrinterCreateAction.vue +22 -0
  72. package/src/components/Generic/Actions/PrinterDeleteAction.vue +29 -0
  73. package/src/components/Generic/Actions/PrinterQuickStopAction.vue +35 -0
  74. package/src/components/Generic/Actions/PrinterSettingsAction.vue +35 -0
  75. package/src/components/Generic/Actions/PrinterUrlAction.vue +24 -0
  76. package/src/components/Generic/Actions/RefreshFilesAction.vue +50 -0
  77. package/src/components/Generic/Actions/SyncPrinterNameAction.vue +36 -0
  78. package/src/components/Generic/Dialogs/AddOrUpdateCameraStreamDialog.vue +131 -0
  79. package/src/components/Generic/Dialogs/AddOrUpdateFloorDialog.vue +141 -0
  80. package/src/components/Generic/Dialogs/AddOrUpdatePrinterDialog.vue +303 -0
  81. package/src/components/Generic/Dialogs/BaseDialog.vue +81 -0
  82. package/src/components/Generic/Dialogs/BatchJsonCreateDialog.vue +109 -0
  83. package/src/components/Generic/Dialogs/BatchReprintDialog.vue +190 -0
  84. package/src/components/Generic/Dialogs/PrinterChecksPanel.vue +37 -0
  85. package/src/components/Generic/Dialogs/PrinterControlDialog.vue +202 -0
  86. package/src/components/Generic/Dialogs/PrinterMaintenanceDialog.vue +130 -0
  87. package/src/components/Generic/Dialogs/YamlImportExportDialog.vue +186 -0
  88. package/src/components/Generic/Dialogs/dialog.constants.ts +19 -0
  89. package/src/components/Generic/FileExplorerSideNav.vue +734 -0
  90. package/src/components/Generic/Loaders/GridLoader.vue +68 -0
  91. package/src/components/Generic/NavigationDrawer.vue +69 -0
  92. package/src/components/Generic/PrintJobsMenu.vue +148 -0
  93. package/src/components/Generic/Snackbars/AppErrorSnackbar.vue +64 -0
  94. package/src/components/Generic/Snackbars/AppInfoSnackbar.vue +63 -0
  95. package/src/components/Generic/Snackbars/AppProgressSnackbar.vue +158 -0
  96. package/src/components/Generic/Vuetify/TooltipButton.vue +47 -0
  97. package/src/components/HelpOverlay/HelpOverlay.vue +57 -0
  98. package/src/components/Login/LoginForm.vue +206 -0
  99. package/src/components/Login/LoginView.spec.ts +64 -0
  100. package/src/components/Login/LoginView.vue +65 -0
  101. package/src/components/Login/Logo.vue +13 -0
  102. package/src/components/Login/PermissionDenied.vue +109 -0
  103. package/src/components/Login/RegistrationForm.vue +207 -0
  104. package/src/components/Login/RegistrationView.vue +17 -0
  105. package/src/components/Login/__snapshots__/LoginView.spec.ts.snap +1051 -0
  106. package/src/components/NotFound/NotFoundView.vue +39 -0
  107. package/src/components/PrintStatistics/PrintStatistics.vue +168 -0
  108. package/src/components/PrintStatistics/PrintStatisticsView.vue +15 -0
  109. package/src/components/PrinterGrid/HomeToolbar.vue +90 -0
  110. package/src/components/PrinterGrid/PrinterGrid.vue +164 -0
  111. package/src/components/PrinterGrid/PrinterGridTile.vue +438 -0
  112. package/src/components/PrinterGrid/PrinterGridView.vue +210 -0
  113. package/src/components/PrinterList/FileControlList.vue +40 -0
  114. package/src/components/PrinterList/PrinterDetails.vue +91 -0
  115. package/src/components/PrinterList/PrintersView.vue +492 -0
  116. package/src/components/Settings/AccountSettings.vue +163 -0
  117. package/src/components/Settings/DiagnosticsSettings.vue +137 -0
  118. package/src/components/Settings/EmergencyCommands.vue +265 -0
  119. package/src/components/Settings/FloorSettings.vue +276 -0
  120. package/src/components/Settings/GridSettings.vue +127 -0
  121. package/src/components/Settings/OctoPrintSettings.vue +188 -0
  122. package/src/components/Settings/ServerProtectionSettings.vue +370 -0
  123. package/src/components/Settings/SettingsView.vue +73 -0
  124. package/src/components/Settings/SoftwareUpgradeSettings.vue +297 -0
  125. package/src/components/Settings/UserManagementSettings.vue +257 -0
  126. package/src/components/TopBar.vue +147 -0
  127. package/src/components.d.ts +70 -0
  128. package/src/directives/file-upload.directive.ts +117 -0
  129. package/src/directives/printer-drop-position.directive.ts +92 -0
  130. package/src/env.d.ts +6 -0
  131. package/src/main.ts +76 -0
  132. package/src/models/batch/reprint.dto.ts +79 -0
  133. package/src/models/batch.model.ts +11 -0
  134. package/src/models/camera-streams/camera-stream.ts +19 -0
  135. package/src/models/floors/floor.model.ts +30 -0
  136. package/src/models/octoprint/connection-options.model.ts +8 -0
  137. package/src/models/plugins/firmware-updates/prusa-firmware-release.model.ts +57 -0
  138. package/src/models/print-completions/print-completions.model.ts +49 -0
  139. package/src/models/printers/crud/create-printer.model.ts +26 -0
  140. package/src/models/printers/file-upload-commands.model.ts +4 -0
  141. package/src/models/printers/gcode/gcode-analysis.model.ts +30 -0
  142. package/src/models/printers/printer-current-job.model.ts +90 -0
  143. package/src/models/printers/printer-file.model.ts +48 -0
  144. package/src/models/printers/printer.model.ts +18 -0
  145. package/src/models/server/client-releases.model.ts +27 -0
  146. package/src/models/server/export-yaml.model.ts +11 -0
  147. package/src/models/server/features.model.ts +37 -0
  148. package/src/models/server/github-rate-limit.model.ts +21 -0
  149. package/src/models/server/version.model.ts +14 -0
  150. package/src/models/settings/printer-file-clean-settings.model.ts +5 -0
  151. package/src/models/settings/server-settings.dto.ts +19 -0
  152. package/src/models/settings/settings.model.ts +57 -0
  153. package/src/models/socketio-messages/socketio-message.model.ts +53 -0
  154. package/src/models/uploads/queued-upload.model.ts +12 -0
  155. package/src/models/user.model.ts +15 -0
  156. package/src/plugins/README.md +3 -0
  157. package/src/plugins/index.ts +17 -0
  158. package/src/plugins/vuetify.ts +53 -0
  159. package/src/router/index.ts +192 -0
  160. package/src/router/route-names.ts +14 -0
  161. package/src/router/utils.ts +23 -0
  162. package/src/shared/alert.events.ts +14 -0
  163. package/src/shared/app.constants.ts +23 -0
  164. package/src/shared/auth.constants.ts +34 -0
  165. package/src/shared/dialog.composable.ts +41 -0
  166. package/src/shared/drag.constants.ts +19 -0
  167. package/src/shared/experimental.constants.ts +1 -0
  168. package/src/shared/http-client.ts +162 -0
  169. package/src/shared/noun-adjectives.data.ts +24 -0
  170. package/src/shared/printer-grid.constants.ts +5 -0
  171. package/src/shared/printer-state.constants.ts +194 -0
  172. package/src/shared/snackbar.composable.ts +66 -0
  173. package/src/shared/socketio.service.ts +104 -0
  174. package/src/store/auth.store.ts +255 -0
  175. package/src/store/connection.store.ts +66 -0
  176. package/src/store/dialog.store.ts +114 -0
  177. package/src/store/features.store.ts +57 -0
  178. package/src/store/floor.store.ts +173 -0
  179. package/src/store/grid.store.ts +10 -0
  180. package/src/store/index.ts +4 -0
  181. package/src/store/printer-state.store.ts +246 -0
  182. package/src/store/printer.store.ts +236 -0
  183. package/src/store/profile.store.ts +25 -0
  184. package/src/store/settings.store.ts +64 -0
  185. package/src/store/test-printer.store.ts +70 -0
  186. package/src/store/uploads.store.ts +75 -0
  187. package/src/styles/README.md +3 -0
  188. package/src/styles/settings.scss +10 -0
  189. package/src/types/global.d.ts +15 -0
  190. package/src/utils/array.utils.ts +15 -0
  191. package/src/utils/date.utils.ts +5 -0
  192. package/src/utils/download-file.util.ts +25 -0
  193. package/src/utils/error.utils.ts +3 -0
  194. package/src/utils/file-size.util.ts +11 -0
  195. package/src/utils/id.type.ts +1 -0
  196. package/src/utils/sentry.util.ts +8 -0
  197. package/src/utils/test.util.ts +30 -0
  198. package/src/utils/time.utils.ts +2 -0
  199. package/src/utils/uploads-state.utils.ts +58 -0
  200. package/src/utils/validation.utils.ts +14 -0
  201. package/src/vite-env.d.ts +7 -0
  202. package/test/setup-axios-mock.ts +15 -0
  203. package/tsconfig.json +47 -0
  204. package/tsconfig.node.json +9 -0
  205. package/vite.config.mts +106 -0
@@ -0,0 +1,276 @@
1
+ <template>
2
+ <v-card>
3
+ <v-toolbar color="primary">
4
+ <v-avatar>
5
+ <v-icon>settings</v-icon>
6
+ </v-avatar>
7
+ <v-toolbar-title> Floor Management </v-toolbar-title>
8
+ </v-toolbar>
9
+
10
+ <v-list
11
+ subheader
12
+ lines="three"
13
+ >
14
+ <v-list-subheader> Floors </v-list-subheader>
15
+
16
+ <v-list-item>
17
+ <v-list-item-title> Create new floor </v-list-item-title>
18
+ <v-list-item-subtitle>
19
+ Creates an empty department/floor to view printer groups
20
+ <br />
21
+ <v-btn
22
+ color="primary"
23
+ @click="createFloor()"
24
+ >
25
+ Create floor
26
+ </v-btn>
27
+ </v-list-item-subtitle>
28
+ </v-list-item>
29
+ </v-list>
30
+
31
+ <v-divider />
32
+
33
+ <v-row no-gutters>
34
+ <v-col>
35
+ <v-list density="compact">
36
+ <v-list-item-group v-model="selectedItem">
37
+ <v-list-item
38
+ v-for="floor of floors"
39
+ :key="floor.id"
40
+ >
41
+ <v-list-item-title>
42
+ {{ floor.name }}
43
+ </v-list-item-title>
44
+ <v-list-item-subtitle>
45
+ {{ floor.printers.length || 0 }} assigned
46
+ </v-list-item-subtitle>
47
+
48
+ <v-list-item-action-text>
49
+ Floor number: {{ floor.floor }}
50
+ </v-list-item-action-text>
51
+ </v-list-item>
52
+ </v-list-item-group>
53
+ </v-list>
54
+ </v-col>
55
+
56
+ <v-col>
57
+ <v-toolbar>
58
+ <v-hover v-slot="{ isHovering, props }">
59
+ <v-toolbar-title v-bind="props">
60
+ <v-edit-dialog
61
+ v-if="selectedFloor"
62
+ @open="setEditedPrinterFloorName"
63
+ @save="updatePrinterFloorName"
64
+ >
65
+ <v-btn color="secondary">
66
+ <v-icon
67
+ v-if="isHovering"
68
+ size="small"
69
+ >
70
+ edit
71
+ </v-icon>
72
+ {{ selectedFloor.name }}
73
+ </v-btn>
74
+
75
+ <template #input>
76
+ <v-text-field
77
+ v-model="editedFloorName"
78
+ v-model:return-value="editedFloorName"
79
+ counter
80
+ label="Edit"
81
+ single-line
82
+ />
83
+ </template>
84
+ </v-edit-dialog>
85
+
86
+ <span v-else> Select a floor on the left </span>
87
+ </v-toolbar-title>
88
+ </v-hover>
89
+
90
+ <v-hover v-slot="{ isHovering, props }">
91
+ <v-toolbar-title v-bind="props">
92
+ <v-edit-dialog
93
+ v-if="selectedFloor"
94
+ @open="setEditedPrinterFloorNumber"
95
+ @save="updatePrinterFloorNumber"
96
+ >
97
+ <v-btn color="secondary">
98
+ <v-icon
99
+ v-if="isHovering"
100
+ size="small"
101
+ >
102
+ edit
103
+ </v-icon>
104
+ {{ selectedFloor.floor }}
105
+ </v-btn>
106
+
107
+ <template #input>
108
+ <v-text-field
109
+ v-model="editedFloorNumber"
110
+ v-model:return-value="editedFloorNumber"
111
+ label="Edit"
112
+ single-line
113
+ type="number"
114
+ />
115
+ </template>
116
+ </v-edit-dialog>
117
+ </v-toolbar-title>
118
+ </v-hover>
119
+
120
+ <v-spacer />
121
+
122
+ <v-btn
123
+ v-if="selectedFloor"
124
+ color="primary"
125
+ @click="clickDeleteFloor()"
126
+ >
127
+ <v-icon>delete</v-icon>
128
+ Delete floor
129
+ </v-btn>
130
+ </v-toolbar>
131
+
132
+ <v-list v-if="selectedFloor">
133
+ <v-list-item
134
+ v-for="x in showAddedPrinters"
135
+ :key="x"
136
+ >
137
+ <v-list-item-content v-if="printerInFloor(selectedFloor, x)">
138
+ <v-list-item-title>
139
+ {{ printerInFloor(selectedFloor, x)?.name }}
140
+ </v-list-item-title>
141
+ </v-list-item-content>
142
+
143
+ <v-list-item-action v-if="printerInFloor(selectedFloor, x)">
144
+ <v-btn @click="deletePrinterFromFloor(selectedFloor, x)">
145
+ <v-icon>close</v-icon>
146
+ Clear
147
+ </v-btn>
148
+ </v-list-item-action>
149
+ </v-list-item>
150
+ </v-list>
151
+ </v-col>
152
+ </v-row>
153
+ </v-card>
154
+ </template>
155
+
156
+ <script lang="ts">
157
+ import { defineComponent } from 'vue'
158
+ import { FloorDto } from '@/models/floors/floor.model'
159
+ import { usePrinterStore } from '@/store/printer.store'
160
+ import { useDialogsStore } from '@/store/dialog.store'
161
+ import { DialogName } from '@/components/Generic/Dialogs/dialog.constants'
162
+ import { PrinterDto } from '@/models/printers/printer.model'
163
+ import { useFloorStore } from '@/store/floor.store'
164
+ import { useSnackbar } from '@/shared/snackbar.composable'
165
+
166
+ interface Data {
167
+ editedFloorName: string
168
+ editedFloorNumber: number
169
+ selectedItem: number
170
+ }
171
+
172
+ export default defineComponent({
173
+ name: 'FloorSettings',
174
+
175
+ props: {},
176
+ setup: () => {
177
+ return {
178
+ printersStore: usePrinterStore(),
179
+ floorStore: useFloorStore(),
180
+ dialogsStore: useDialogsStore(),
181
+ snackbar: useSnackbar()
182
+ }
183
+ },
184
+ data: (): Data => ({
185
+ selectedItem: 0,
186
+ editedFloorName: '',
187
+ editedFloorNumber: 0
188
+ }),
189
+
190
+ computed: {
191
+ floors() {
192
+ return this.floorStore.floors
193
+ },
194
+
195
+ selectedFloor() {
196
+ return this.floorStore.floors[this.selectedItem]
197
+ },
198
+
199
+ showAddedPrinters() {
200
+ return this.selectedFloor.printers?.length + 1
201
+ },
202
+
203
+ unassignedPrinters() {
204
+ return this.floorStore.floorlessPrinters
205
+ }
206
+ },
207
+
208
+ watch: {},
209
+
210
+ created() {},
211
+
212
+ mounted() {},
213
+
214
+ methods: {
215
+ printerInFloor(floor: FloorDto, index: number): PrinterDto | undefined {
216
+ if (!floor?.printers) return
217
+
218
+ const floorPrinter = floor.printers[index - 1]
219
+ if (!floorPrinter) return
220
+ return this.printersStore.printer(floorPrinter.printerId)
221
+ },
222
+
223
+ async createFloor() {
224
+ this.dialogsStore.openDialogWithContext(DialogName.AddOrUpdateFloorDialog)
225
+ },
226
+
227
+ setEditedPrinterFloorName() {
228
+ this.editedFloorName = this.selectedFloor.name
229
+ },
230
+
231
+ setEditedPrinterFloorNumber() {
232
+ this.editedFloorNumber = this.selectedFloor.floor
233
+ },
234
+
235
+ async updatePrinterFloorName() {
236
+ if (!this.selectedFloor?.id) return
237
+ const { id: floorId } = this.selectedFloor
238
+ await this.floorStore.updateFloorName({
239
+ floorId,
240
+ name: this.editedFloorName
241
+ })
242
+ this.snackbar.info('Floor name updated')
243
+ },
244
+
245
+ async updatePrinterFloorNumber() {
246
+ if (!this.selectedFloor?.id) return
247
+ const { id: floorId } = this.selectedFloor
248
+ await this.floorStore.updateFloorNumber({
249
+ floorId,
250
+ floorNumber: this.editedFloorNumber
251
+ })
252
+ this.snackbar.info('Floor level updated')
253
+ // Adapt to potential sort change
254
+ this.selectedItem = -1
255
+ },
256
+
257
+ async clickDeleteFloor() {
258
+ if (!this.selectedFloor?.id) return
259
+
260
+ await this.floorStore.deleteFloor(this.selectedFloor.id)
261
+ this.snackbar.info('Floor deleted')
262
+ },
263
+
264
+ async deletePrinterFromFloor(floor: FloorDto, index: number) {
265
+ const printer = this.printerInFloor(floor, index)
266
+ if (!floor?.id || !printer?.id) return
267
+
268
+ await this.floorStore.deletePrinterFromFloor({
269
+ floorId: floor.id,
270
+ printerId: printer.id
271
+ })
272
+ this.snackbar.info('Printer removed from floor')
273
+ }
274
+ }
275
+ })
276
+ </script>
@@ -0,0 +1,127 @@
1
+ <template>
2
+ <v-card>
3
+ <v-toolbar color="primary">
4
+ <v-avatar>
5
+ <v-icon>settings</v-icon>
6
+ </v-avatar>
7
+ <v-toolbar-title> Grid Settings </v-toolbar-title>
8
+ </v-toolbar>
9
+
10
+ <v-list
11
+ subheader
12
+ lines="three"
13
+ >
14
+ <v-list-subheader> Grid Rows and Columns </v-list-subheader>
15
+ <v-list-item>
16
+ <v-row v-if="settingsStore.settings?.frontend">
17
+ <v-col cols="2">
18
+ <v-select
19
+ v-model="settingsStore.settings.frontend.gridRows"
20
+ :items="rowOptions()"
21
+ label="Set the grid rows"
22
+ />
23
+ </v-col>
24
+ <v-col cols="2">
25
+ <v-select
26
+ v-model="settingsStore.settings.frontend.gridCols"
27
+ :items="colOptions()"
28
+ label="Set the grid columns"
29
+ />
30
+ </v-col>
31
+ <v-col cols="1" />
32
+ <v-col>
33
+ <v-btn
34
+ color="primary"
35
+ @click="updateGridSettings()"
36
+ >
37
+ Save tile settings
38
+ </v-btn>
39
+ </v-col>
40
+ </v-row>
41
+ </v-list-item>
42
+ </v-list>
43
+
44
+ <v-divider />
45
+ <v-list
46
+ subheader
47
+ lines="three"
48
+ >
49
+ <v-list-subheader> Large or Compact Tiles </v-list-subheader>
50
+ <v-list-item>
51
+ <v-row v-if="settingsStore.settings?.frontend">
52
+ <v-col cols="5">
53
+ <v-checkbox
54
+ v-model="settingsStore.settings.frontend.largeTiles"
55
+ label="Large tiles"
56
+ />
57
+ </v-col>
58
+ <v-col cols="1">
59
+ <v-btn
60
+ color="primary"
61
+ @click="updateGridSettings()"
62
+ >
63
+ Save tile settings
64
+ </v-btn>
65
+ </v-col>
66
+ </v-row>
67
+ </v-list-item>
68
+ </v-list>
69
+ </v-card>
70
+ </template>
71
+ <script lang="ts">
72
+ import { defineComponent } from 'vue'
73
+ import { useSettingsStore } from '../../store/settings.store'
74
+ import { colOptions, rowOptions } from '../../shared/printer-grid.constants'
75
+ import { useSnackbar } from '@/shared/snackbar.composable'
76
+
77
+ interface Data {
78
+ property: number
79
+ }
80
+
81
+ export default defineComponent({
82
+ name: 'GridSettings',
83
+ components: {},
84
+
85
+ props: {},
86
+ setup: () => {
87
+ return {
88
+ settingsStore: useSettingsStore(),
89
+ snackbar: useSnackbar()
90
+ }
91
+ },
92
+ data: (): Data => ({
93
+ property: 0
94
+ }),
95
+
96
+ computed: {
97
+ largeTilesSettings() {
98
+ return this.settingsStore.largeTiles
99
+ }
100
+ },
101
+
102
+ watch: {},
103
+
104
+ async created() {},
105
+
106
+ async mounted() {},
107
+
108
+ methods: {
109
+ rowOptions() {
110
+ return rowOptions
111
+ },
112
+
113
+ colOptions() {
114
+ return colOptions
115
+ },
116
+
117
+ async updateGridSettings() {
118
+ await this.settingsStore.updateFrontendSettings({
119
+ gridCols: this.settingsStore.gridCols,
120
+ gridRows: this.settingsStore.gridRows,
121
+ largeTiles: this.largeTilesSettings
122
+ })
123
+ this.snackbar.info('Grid settings updated')
124
+ }
125
+ }
126
+ })
127
+ </script>
@@ -0,0 +1,188 @@
1
+ <template>
2
+ <v-card>
3
+ <v-toolbar color="primary">
4
+ <v-avatar>
5
+ <v-icon>settings</v-icon>
6
+ </v-avatar>
7
+ <v-toolbar-title> OctoPrint Settings </v-toolbar-title>
8
+ </v-toolbar>
9
+ <v-list lines="three">
10
+ <v-list-item>
11
+ <v-list-item-title> Pre-upload file cleanup </v-list-item-title>
12
+ <v-list-item-subtitle>
13
+ Automatically cleanup old files to ensure the SD card has enough
14
+ space.
15
+ <br />
16
+ <v-checkbox
17
+ v-model="fileHandlingSettings.autoRemoveOldFilesBeforeUpload"
18
+ label="Remove old file before upload"
19
+ />
20
+ <v-text-field
21
+ v-model="fileHandlingSettings.autoRemoveOldFilesCriteriumDays"
22
+ :disabled="!fileHandlingSettings.autoRemoveOldFilesBeforeUpload"
23
+ label="Amount of days to keep files"
24
+ min="0"
25
+ variant="outlined"
26
+ type="number"
27
+ />
28
+ <v-checkbox
29
+ v-model="fileHandlingSettings.autoRemoveOldFilesAtBoot"
30
+ label="Remove old files when (re)booting the server"
31
+ />
32
+ <v-btn
33
+ color="primary"
34
+ @click="setFileCleanSettings()"
35
+ >
36
+ save file clean settings
37
+ </v-btn>
38
+ </v-list-item-subtitle>
39
+ </v-list-item>
40
+
41
+ <v-list-item>
42
+ <v-list-item-title> Connection Timeout </v-list-item-title>
43
+ <v-list-item-subtitle v-if="settingsStore.settings?.timeout">
44
+ The connection timeout is the amount of time in milliseconds that the
45
+ server will wait for OctoPrint to respond before giving up
46
+ <v-text-field
47
+ v-model="settingsStore.settings.timeout.apiTimeout"
48
+ label="Connection Timeout"
49
+ min="0"
50
+ variant="outlined"
51
+ type="number"
52
+ />
53
+ <v-btn
54
+ color="primary"
55
+ @click="updateTimeoutSettings()"
56
+ >
57
+ save connection timeout
58
+ </v-btn>
59
+ </v-list-item-subtitle>
60
+ </v-list-item>
61
+
62
+ <v-list-item>
63
+ <v-list-item-title> Clean file references </v-list-item-title>
64
+ <v-list-item-subtitle>
65
+ Clear out the file references for all printers - this does not remove
66
+ them from OctoPrint!
67
+ <br />
68
+ <v-btn
69
+ color="primary"
70
+ @click="purgeFiles()"
71
+ >
72
+ Purge file references
73
+ </v-btn>
74
+ </v-list-item-subtitle>
75
+ </v-list-item>
76
+
77
+ <v-list-item>
78
+ <v-list-item-title>
79
+ Disable inefficient GCode analysis
80
+ </v-list-item-title>
81
+ <v-list-item-subtitle>
82
+ Disable GCode analysis on all printers at once, preventing CPU
83
+ intensive and inaccurate time/size estimates.
84
+ <br />
85
+ <v-btn
86
+ color="primary"
87
+ @click="bulkDisableGCodeAnalysis()"
88
+ >
89
+ Bulk disable GCode Analysis
90
+ </v-btn>
91
+ </v-list-item-subtitle>
92
+ </v-list-item>
93
+ </v-list>
94
+ </v-card>
95
+ </template>
96
+
97
+ <script lang="ts">
98
+ import { defineComponent } from 'vue'
99
+ import { PrinterFileService, SettingsService } from '@/backend'
100
+ import { PrinterSettingsService } from '@/backend/printer-settings.service'
101
+ import { FileCleanSettings } from '@/models/settings/printer-file-clean-settings.model'
102
+ import { usePrinterStore } from '@/store/printer.store'
103
+ import { usePrinterStateStore } from '@/store/printer-state.store'
104
+ import { useSnackbar } from '@/shared/snackbar.composable'
105
+ import { useSettingsStore } from '@/store/settings.store'
106
+
107
+ interface Data {
108
+ fileHandlingSettings: FileCleanSettings
109
+ }
110
+
111
+ export default defineComponent({
112
+ name: 'FdmSettings',
113
+
114
+ props: {},
115
+ setup: () => {
116
+ return {
117
+ settingsStore: useSettingsStore(),
118
+ printersStore: usePrinterStore(),
119
+ snackbar: useSnackbar(),
120
+ printerStateStore: usePrinterStateStore()
121
+ }
122
+ },
123
+ data: (): Data => ({
124
+ fileHandlingSettings: {
125
+ autoRemoveOldFilesBeforeUpload: false,
126
+ autoRemoveOldFilesAtBoot: false,
127
+ autoRemoveOldFilesCriteriumDays: 7
128
+ }
129
+ }),
130
+
131
+ computed: {},
132
+
133
+ watch: {},
134
+
135
+ async created() {
136
+ const settings = await SettingsService.getSettings()
137
+ this.fileHandlingSettings = settings.printerFileClean
138
+ },
139
+
140
+ mounted() {},
141
+ methods: {
142
+ async updateTimeoutSettings() {
143
+ if (!this.settingsStore.settings?.timeout?.apiTimeout) {
144
+ this.snackbar.error('Timeout not set')
145
+ return
146
+ }
147
+ if (this.settingsStore.settings.timeout.apiTimeout < 1000) {
148
+ this.snackbar.error(
149
+ 'Timeout is too low - please set it to at least 1000 milliseconds'
150
+ )
151
+ } else {
152
+ await this.settingsStore.updateTimeoutSettings(
153
+ this.settingsStore.settings?.timeout
154
+ )
155
+ this.snackbar.info('Timeout settings updated')
156
+ }
157
+ },
158
+
159
+ async setFileCleanSettings() {
160
+ const serverSettings = await SettingsService.setFileCleanSettings(
161
+ this.fileHandlingSettings
162
+ )
163
+ this.fileHandlingSettings = serverSettings.printerFileClean
164
+ },
165
+
166
+ async purgeFiles() {
167
+ await PrinterFileService.purgeFiles()
168
+
169
+ this.snackbar.openInfoMessage({
170
+ title: 'Successfully purged all references to printer files!'
171
+ })
172
+ },
173
+
174
+ async bulkDisableGCodeAnalysis() {
175
+ const printers = this.printerStateStore.onlinePrinters
176
+ this.snackbar.openInfoMessage({
177
+ title: `Trying to disable gcode analysis for ${printers.length} online printers.`
178
+ })
179
+ for (const printer of Object.values(printers)) {
180
+ await PrinterSettingsService.setGCodeAnalysis(printer.id, false)
181
+ }
182
+ this.snackbar.openInfoMessage({
183
+ title: `Finished disabling gcode analysis for ${printers.length} online printers.`
184
+ })
185
+ }
186
+ }
187
+ })
188
+ </script>