@fdm-monster/client-next 0.0.1 → 0.0.2

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 (198) hide show
  1. package/.yarn/install-state.gz +0 -0
  2. package/dist/assets/MaterialIcons-Regular-BjXOXp5c.eot +0 -0
  3. package/dist/assets/MaterialIcons-Regular-DEUTIz1o.ttf +0 -0
  4. package/dist/assets/MaterialIcons-Regular-DOtZ65Va.woff2 +0 -0
  5. package/dist/assets/MaterialIcons-Regular-FsbMSDLx.woff +0 -0
  6. package/dist/assets/index-CHzfWKPO.css +5 -0
  7. package/dist/assets/index-CnWtkGvw.js +90 -0
  8. package/dist/assets/index-CnWtkGvw.js.map +1 -0
  9. package/dist/favicon.ico +0 -0
  10. package/dist/img/DavidZwart.jpg +0 -0
  11. package/dist/img/OIG.JYDC2RaWdz7g9.jpg +0 -0
  12. package/dist/img/OIG.jpg +0 -0
  13. package/dist/img/icons/android-chrome-256x256.png +0 -0
  14. package/dist/img/icons/android-chrome-384x384.png +0 -0
  15. package/dist/img/icons/android-chrome-512x512.png +0 -0
  16. package/dist/img/icons/favicon.svg +1 -0
  17. package/dist/img/logo.png +0 -0
  18. package/dist/img/logo.svg +1 -0
  19. package/dist/img/manifest.webmanifest +33 -0
  20. package/dist/img/octoprint-tentacle.svg +144 -0
  21. package/dist/img/thumbail_unknown.jpg +0 -0
  22. package/dist/img/vbanner.jpg +0 -0
  23. package/dist/index.html +24 -0
  24. package/dist/robots.txt +2 -0
  25. package/package.json +1 -1
  26. package/.all-contributorsrc +0 -57
  27. package/.editorconfig +0 -5
  28. package/.eslintrc.js +0 -126
  29. package/.github/FUNDING.yml +0 -3
  30. package/.github/workflows/release-client.yml +0 -94
  31. package/.github/workflows/vue-publish.yml +0 -26
  32. package/.prettierignore +0 -15
  33. package/.whitesource +0 -12
  34. package/renovate.json +0 -30
  35. package/src/App.vue +0 -60
  36. package/src/AppLoader.vue +0 -383
  37. package/src/assets/adjectives.json +0 -1468
  38. package/src/assets/logo.svg +0 -6
  39. package/src/assets/nouns.json +0 -4309
  40. package/src/auto-imports.d.ts +0 -139
  41. package/src/backend/app.service.ts +0 -39
  42. package/src/backend/auth.service.ts +0 -56
  43. package/src/backend/base.service.ts +0 -57
  44. package/src/backend/batch.service.ts +0 -37
  45. package/src/backend/camera-stream.service.ts +0 -33
  46. package/src/backend/custom-gcode.service.ts +0 -11
  47. package/src/backend/dto/octoprint-settings.dto.ts +0 -168
  48. package/src/backend/first-time-setup.service.ts +0 -17
  49. package/src/backend/floor.service.ts +0 -84
  50. package/src/backend/index.ts +0 -4
  51. package/src/backend/print-completions.service.ts +0 -11
  52. package/src/backend/printer-file.service.ts +0 -91
  53. package/src/backend/printer-group.service.ts +0 -62
  54. package/src/backend/printer-job.service.ts +0 -20
  55. package/src/backend/printer-settings.service.ts +0 -28
  56. package/src/backend/printers.service.ts +0 -136
  57. package/src/backend/server-private.service.ts +0 -55
  58. package/src/backend/server.api.ts +0 -132
  59. package/src/backend/settings.service.ts +0 -85
  60. package/src/backend/user.service.ts +0 -51
  61. package/src/components/AboutHelp/AboutView.vue +0 -164
  62. package/src/components/CameraGrid/CameraGridView.vue +0 -111
  63. package/src/components/FirstTimeSetup/FirstTimeSetupView.vue +0 -354
  64. package/src/components/Generic/Actions/PrinterConnectionAction.vue +0 -56
  65. package/src/components/Generic/Actions/PrinterCreateAction.vue +0 -22
  66. package/src/components/Generic/Actions/PrinterDeleteAction.vue +0 -29
  67. package/src/components/Generic/Actions/PrinterQuickStopAction.vue +0 -35
  68. package/src/components/Generic/Actions/PrinterSettingsAction.vue +0 -35
  69. package/src/components/Generic/Actions/PrinterUrlAction.vue +0 -24
  70. package/src/components/Generic/Actions/RefreshFilesAction.vue +0 -50
  71. package/src/components/Generic/Actions/SyncPrinterNameAction.vue +0 -36
  72. package/src/components/Generic/Dialogs/AddOrUpdateCameraStreamDialog.vue +0 -131
  73. package/src/components/Generic/Dialogs/AddOrUpdateFloorDialog.vue +0 -141
  74. package/src/components/Generic/Dialogs/AddOrUpdatePrinterDialog.vue +0 -303
  75. package/src/components/Generic/Dialogs/BaseDialog.vue +0 -81
  76. package/src/components/Generic/Dialogs/BatchJsonCreateDialog.vue +0 -109
  77. package/src/components/Generic/Dialogs/BatchReprintDialog.vue +0 -190
  78. package/src/components/Generic/Dialogs/PrinterChecksPanel.vue +0 -37
  79. package/src/components/Generic/Dialogs/PrinterControlDialog.vue +0 -202
  80. package/src/components/Generic/Dialogs/PrinterMaintenanceDialog.vue +0 -130
  81. package/src/components/Generic/Dialogs/YamlImportExportDialog.vue +0 -186
  82. package/src/components/Generic/Dialogs/dialog.constants.ts +0 -19
  83. package/src/components/Generic/FileExplorerSideNav.vue +0 -734
  84. package/src/components/Generic/Loaders/GridLoader.vue +0 -68
  85. package/src/components/Generic/NavigationDrawer.vue +0 -69
  86. package/src/components/Generic/PrintJobsMenu.vue +0 -148
  87. package/src/components/Generic/Snackbars/AppErrorSnackbar.vue +0 -64
  88. package/src/components/Generic/Snackbars/AppInfoSnackbar.vue +0 -63
  89. package/src/components/Generic/Snackbars/AppProgressSnackbar.vue +0 -158
  90. package/src/components/Generic/Vuetify/TooltipButton.vue +0 -47
  91. package/src/components/HelpOverlay/HelpOverlay.vue +0 -57
  92. package/src/components/Login/LoginForm.vue +0 -206
  93. package/src/components/Login/LoginView.spec.ts +0 -64
  94. package/src/components/Login/LoginView.vue +0 -65
  95. package/src/components/Login/Logo.vue +0 -13
  96. package/src/components/Login/PermissionDenied.vue +0 -109
  97. package/src/components/Login/RegistrationForm.vue +0 -207
  98. package/src/components/Login/RegistrationView.vue +0 -17
  99. package/src/components/Login/__snapshots__/LoginView.spec.ts.snap +0 -1051
  100. package/src/components/NotFound/NotFoundView.vue +0 -39
  101. package/src/components/PrintStatistics/PrintStatistics.vue +0 -168
  102. package/src/components/PrintStatistics/PrintStatisticsView.vue +0 -15
  103. package/src/components/PrinterGrid/HomeToolbar.vue +0 -90
  104. package/src/components/PrinterGrid/PrinterGrid.vue +0 -164
  105. package/src/components/PrinterGrid/PrinterGridTile.vue +0 -438
  106. package/src/components/PrinterGrid/PrinterGridView.vue +0 -210
  107. package/src/components/PrinterList/FileControlList.vue +0 -40
  108. package/src/components/PrinterList/PrinterDetails.vue +0 -91
  109. package/src/components/PrinterList/PrintersView.vue +0 -492
  110. package/src/components/Settings/AccountSettings.vue +0 -163
  111. package/src/components/Settings/DiagnosticsSettings.vue +0 -137
  112. package/src/components/Settings/EmergencyCommands.vue +0 -265
  113. package/src/components/Settings/FloorSettings.vue +0 -276
  114. package/src/components/Settings/GridSettings.vue +0 -127
  115. package/src/components/Settings/OctoPrintSettings.vue +0 -188
  116. package/src/components/Settings/ServerProtectionSettings.vue +0 -370
  117. package/src/components/Settings/SettingsView.vue +0 -73
  118. package/src/components/Settings/SoftwareUpgradeSettings.vue +0 -297
  119. package/src/components/Settings/UserManagementSettings.vue +0 -257
  120. package/src/components/TopBar.vue +0 -147
  121. package/src/components.d.ts +0 -70
  122. package/src/directives/file-upload.directive.ts +0 -117
  123. package/src/directives/printer-drop-position.directive.ts +0 -92
  124. package/src/env.d.ts +0 -6
  125. package/src/main.ts +0 -76
  126. package/src/models/batch/reprint.dto.ts +0 -79
  127. package/src/models/batch.model.ts +0 -11
  128. package/src/models/camera-streams/camera-stream.ts +0 -19
  129. package/src/models/floors/floor.model.ts +0 -30
  130. package/src/models/octoprint/connection-options.model.ts +0 -8
  131. package/src/models/plugins/firmware-updates/prusa-firmware-release.model.ts +0 -57
  132. package/src/models/print-completions/print-completions.model.ts +0 -49
  133. package/src/models/printers/crud/create-printer.model.ts +0 -26
  134. package/src/models/printers/file-upload-commands.model.ts +0 -4
  135. package/src/models/printers/gcode/gcode-analysis.model.ts +0 -30
  136. package/src/models/printers/printer-current-job.model.ts +0 -90
  137. package/src/models/printers/printer-file.model.ts +0 -48
  138. package/src/models/printers/printer.model.ts +0 -18
  139. package/src/models/server/client-releases.model.ts +0 -27
  140. package/src/models/server/export-yaml.model.ts +0 -11
  141. package/src/models/server/features.model.ts +0 -37
  142. package/src/models/server/github-rate-limit.model.ts +0 -21
  143. package/src/models/server/version.model.ts +0 -14
  144. package/src/models/settings/printer-file-clean-settings.model.ts +0 -5
  145. package/src/models/settings/server-settings.dto.ts +0 -19
  146. package/src/models/settings/settings.model.ts +0 -57
  147. package/src/models/socketio-messages/socketio-message.model.ts +0 -53
  148. package/src/models/uploads/queued-upload.model.ts +0 -12
  149. package/src/models/user.model.ts +0 -15
  150. package/src/plugins/README.md +0 -3
  151. package/src/plugins/index.ts +0 -17
  152. package/src/plugins/vuetify.ts +0 -53
  153. package/src/router/index.ts +0 -192
  154. package/src/router/route-names.ts +0 -14
  155. package/src/router/utils.ts +0 -23
  156. package/src/shared/alert.events.ts +0 -14
  157. package/src/shared/app.constants.ts +0 -23
  158. package/src/shared/auth.constants.ts +0 -34
  159. package/src/shared/dialog.composable.ts +0 -41
  160. package/src/shared/drag.constants.ts +0 -19
  161. package/src/shared/experimental.constants.ts +0 -1
  162. package/src/shared/http-client.ts +0 -162
  163. package/src/shared/noun-adjectives.data.ts +0 -24
  164. package/src/shared/printer-grid.constants.ts +0 -5
  165. package/src/shared/printer-state.constants.ts +0 -194
  166. package/src/shared/snackbar.composable.ts +0 -66
  167. package/src/shared/socketio.service.ts +0 -104
  168. package/src/store/auth.store.ts +0 -255
  169. package/src/store/connection.store.ts +0 -66
  170. package/src/store/dialog.store.ts +0 -114
  171. package/src/store/features.store.ts +0 -57
  172. package/src/store/floor.store.ts +0 -173
  173. package/src/store/grid.store.ts +0 -10
  174. package/src/store/index.ts +0 -4
  175. package/src/store/printer-state.store.ts +0 -246
  176. package/src/store/printer.store.ts +0 -236
  177. package/src/store/profile.store.ts +0 -25
  178. package/src/store/settings.store.ts +0 -64
  179. package/src/store/test-printer.store.ts +0 -70
  180. package/src/store/uploads.store.ts +0 -75
  181. package/src/styles/README.md +0 -3
  182. package/src/styles/settings.scss +0 -10
  183. package/src/types/global.d.ts +0 -15
  184. package/src/utils/array.utils.ts +0 -15
  185. package/src/utils/date.utils.ts +0 -5
  186. package/src/utils/download-file.util.ts +0 -25
  187. package/src/utils/error.utils.ts +0 -3
  188. package/src/utils/file-size.util.ts +0 -11
  189. package/src/utils/id.type.ts +0 -1
  190. package/src/utils/sentry.util.ts +0 -8
  191. package/src/utils/test.util.ts +0 -30
  192. package/src/utils/time.utils.ts +0 -2
  193. package/src/utils/uploads-state.utils.ts +0 -58
  194. package/src/utils/validation.utils.ts +0 -14
  195. package/src/vite-env.d.ts +0 -7
  196. package/test/setup-axios-mock.ts +0 -15
  197. /package/{src/assets/logo.png → dist/assets/logo-CJVdjy51.png} +0 -0
  198. /package/{src/assets → dist/img/icons}/android-chrome-192x192.png +0 -0
@@ -1,734 +0,0 @@
1
- <template>
2
- <v-navigation-drawer
3
- v-model="drawerOpened"
4
- loading="true"
5
- absolute
6
- location="right"
7
- scrim="white"
8
- temporary
9
- width="700"
10
- @close="closeDrawer()"
11
- >
12
- <v-list-item
13
- v-if="storedSideNavPrinter"
14
- lines="two"
15
- >
16
- <template #prepend>
17
- <v-tooltip location="left">
18
- <template #activator="{ props }">
19
- <v-btn
20
- :size="iconSize"
21
- v-bind="props"
22
- class="mr-4 mt-1"
23
- color="primary"
24
- @click="openPrinterURL()"
25
- @click.middle="openPrinterURL()"
26
- >
27
- <v-avatar
28
- :size="iconSize"
29
- class="font-weight-bold"
30
- color="primary"
31
- >
32
- {{ avatarInitials }}
33
- </v-avatar>
34
- </v-btn>
35
- </template>
36
- <span> Visit the OctoPrint associated to this printer </span>
37
- </v-tooltip>
38
- </template>
39
-
40
- <v-list-item-title class="font-weight-bold">
41
- {{ storedSideNavPrinter.name }}
42
- </v-list-item-title>
43
-
44
- <!-- Spacer -->
45
- <v-list-item-subtitle />
46
-
47
- <v-list-item-media>
48
- <strong
49
- v-if="!isEnabled || !isOnline"
50
- class="d-flex justify-center static-disabled"
51
- >
52
- {{ isEnabled ? 'Enabled' : 'Disabled' }} -
53
- {{ !isOnline ? 'Offline' : printerState?.text?.toUpperCase() }}
54
- </strong>
55
- <strong
56
- v-if="isEnabled && printerState?.text && isOperational && isOnline"
57
- class="pulsating-red d-flex justify-center"
58
- >
59
- Enabled - {{ printerState?.text }}
60
- </strong>
61
- </v-list-item-media>
62
-
63
- <v-list-item-subtitle v-if="currentJob">
64
- <span
65
- v-if="currentJob?.progress"
66
- class="d-flex justify-center"
67
- >
68
- Progress:
69
- {{ truncateProgress(currentJob?.progress.completion) }}%
70
- </span>
71
- <v-progress-linear
72
- v-if="currentJob?.progress"
73
- :model-value="truncateProgress(currentJob.progress?.completion)"
74
- class="mt-1 mb-1"
75
- height="8px"
76
- />
77
- <v-tooltip location="bottom">
78
- <template #activator="{ props }">
79
- <v-btn
80
- variant="outlined"
81
- size="small"
82
- v-bind="props"
83
- >
84
- {{ currentPrintingFilePath }}
85
- </v-btn>
86
- </template>
87
- <span>
88
- {{ currentPrintingFilePath }}
89
- </span>
90
- </v-tooltip>
91
- </v-list-item-subtitle>
92
- </v-list-item>
93
-
94
- <v-alert
95
- v-if="!isEnabled || !isOnline"
96
- color="primary"
97
- >
98
- <span v-if="!isEnabled">
99
- Disabled OctoPrint, enable it first to get live updates
100
- </span>
101
- <span v-else>
102
- This OctoPrint seems unreachable... Will keep trying for you
103
- <v-icon>hourglass_top</v-icon>
104
- </span>
105
- </v-alert>
106
- <v-alert
107
- v-if="
108
- !storedSideNavPrinter?.enabled && !storedSideNavPrinter?.disabledReason
109
- "
110
- color="secondary"
111
- >
112
- This OctoPrint was disabled without reason.
113
- </v-alert>
114
- <v-alert
115
- v-if="storedSideNavPrinter?.disabledReason"
116
- color="black"
117
- >
118
- This OctoPrint was disabled for maintenance: <br />
119
- <small> &nbsp;&nbsp;{{ storedSideNavPrinter?.disabledReason }} </small>
120
- </v-alert>
121
-
122
- <v-divider />
123
-
124
- <v-list
125
- v-drop-upload="{ printers: [storedSideNavPrinter] }"
126
- density="compact"
127
- >
128
- <v-list-subheader inset> Manage FDM Monster instance </v-list-subheader>
129
-
130
- <v-tooltip location="left">
131
- <template #activator="{ props }">
132
- <v-list-item
133
- class="extra-dense-list-item"
134
- link
135
- v-bind="props"
136
- @click.prevent.stop="openPrinterURL()"
137
- >
138
- <template #prepend>
139
- <v-avatar
140
- class="ml-3 mr-6 ma-5"
141
- :size="iconSize"
142
- >
143
- <v-img src="/img/octoprint-tentacle.svg" />
144
- </v-avatar>
145
- </template>
146
- <span> Open OctoPrint </span>
147
- </v-list-item>
148
- </template>
149
- <span> Visit the OctoPrint associated to this printer </span>
150
- </v-tooltip>
151
-
152
- <v-tooltip location="left">
153
- <template #activator="{ props }">
154
- <v-list-item
155
- class="extra-dense-list-item"
156
- link
157
- v-bind="props"
158
- @click.prevent.stop="toggleEnabled()"
159
- >
160
- <template #prepend>
161
- <v-avatar
162
- :size="iconSize"
163
- color="grey-lighten-1"
164
- >
165
- <v-icon :color="isEnabled ? 'primary' : 'green'"> dns </v-icon>
166
- </v-avatar>
167
- </template>
168
- <span v-if="isEnabled"> Disable Printer Location </span>
169
- <span v-else-if="!isEnabled"> Enable Printer Location </span>
170
- </v-list-item>
171
- </template>
172
- <span> Deactivate connection, without impacting print </span>
173
- </v-tooltip>
174
-
175
- <v-tooltip location="left">
176
- <template #activator="{ props }">
177
- <v-list-item
178
- class="extra-dense-list-item"
179
- link
180
- v-bind="props"
181
- @click.prevent.stop="toggleMaintenance()"
182
- >
183
- <v-avatar
184
- :size="iconSize"
185
- color="grey-lighten-1"
186
- >
187
- <v-icon :color="!isUnderMaintenance ? 'primary' : 'green'">
188
- construction
189
- </v-icon>
190
- </v-avatar>
191
- <span v-if="!isUnderMaintenance"> Enable Maintenance </span>
192
- <span v-else-if="isUnderMaintenance"> Complete Maintenance </span>
193
- </v-list-item>
194
- </template>
195
- <span> Deactivate, set under repair, without impacting print </span>
196
- </v-tooltip>
197
-
198
- <v-tooltip location="left">
199
- <template #activator="{ props }">
200
- <v-list-item
201
- class="extra-dense-list-item"
202
- link
203
- v-bind="props"
204
- @click.prevent.stop="refreshSocketState()"
205
- >
206
- <v-avatar :size="iconSize">
207
- <v-icon
208
- :color="!isUnderMaintenance ? 'primary' : 'green'"
209
- class="grey-lighten-1"
210
- >
211
- autorenew
212
- </v-icon>
213
- </v-avatar>
214
- <span>
215
- Refresh State <small> - this does not affect the print! </small>
216
- </span>
217
- </v-list-item>
218
- </template>
219
- <span>
220
- Let FDM Monster know you are experiencing inconsistencies, reset all
221
- volatile states
222
- </span>
223
- </v-tooltip>
224
-
225
- <v-divider />
226
- <v-list-subheader inset> Commands </v-list-subheader>
227
- <v-tooltip location="left">
228
- <template #activator="{ props }">
229
- <v-list-item
230
- :disabled="!storedSideNavPrinter?.enabled || !isOnline"
231
- class="extra-dense-list-item"
232
- link
233
- v-bind="props"
234
- @click.prevent.stop="togglePrinterConnection()"
235
- >
236
- <v-avatar :size="iconSize">
237
- <v-icon> usb </v-icon>
238
- </v-avatar>
239
- <span v-if="isStoppable"> Disconnect USB & Stop Print </span>
240
- <span v-else-if="isOperational"> Disconnect USB </span>
241
- <span v-else> Connect USB </span>
242
- </v-list-item>
243
- </template>
244
- <span> Disconnect USB, disrupting any print </span>
245
- </v-tooltip>
246
-
247
- <v-tooltip
248
- v-if="featureStore.hasFeature('pauseResumePrinterCommand')"
249
- location="left"
250
- >
251
- <template #activator="{ props }">
252
- <v-list-item
253
- :disabled="!isOnline || !isPrinting"
254
- class="extra-dense-list-item"
255
- link
256
- v-bind="props"
257
- @click.prevent.stop="
258
- isPaused ? clickResumePrint() : clickPausePrint()
259
- "
260
- >
261
- <v-avatar :size="iconSize">
262
- <v-icon v-if="!isPaused"> pause </v-icon>
263
- <v-icon v-if="isPaused"> play_circle_outline </v-icon>
264
- </v-avatar>
265
- {{ isPaused ? 'Resume print' : 'Pause print' }}
266
- </v-list-item>
267
- </template>
268
- <span> Send Pause or Resume command </span>
269
- </v-tooltip>
270
-
271
- <v-tooltip location="left">
272
- <template #activator="{ props }">
273
- <v-list-item
274
- :disabled="!isStoppable"
275
- class="extra-dense-list-item"
276
- link
277
- v-bind="props"
278
- @click.prevent.stop="clickStopPrint()"
279
- >
280
- <v-avatar :size="iconSize">
281
- <v-icon> stop </v-icon>
282
- </v-avatar>
283
- Cancel print
284
- </v-list-item>
285
- </template>
286
- <span> Cancel print gracefully </span>
287
- </v-tooltip>
288
-
289
- <v-tooltip location="left">
290
- <template #activator="{ props }">
291
- <v-list-item
292
- :disabled="!canBeCleared"
293
- class="extra-dense-list-item"
294
- link
295
- v-bind="props"
296
- @click.prevent.stop="clickClearFiles()"
297
- >
298
- <v-avatar :size="iconSize">
299
- <v-icon> delete </v-icon>
300
- </v-avatar>
301
- Delete files
302
- </v-list-item>
303
- </template>
304
- <span> Clear all files present on OctoPrint (local) </span>
305
- </v-tooltip>
306
-
307
- <v-tooltip location="left">
308
- <template #activator="{ props }">
309
- <v-list-item
310
- class="extra-dense-list-item"
311
- link
312
- v-bind="props"
313
- @click.prevent.stop="refreshFiles()"
314
- >
315
- <v-avatar :size="iconSize">
316
- <v-icon> refresh </v-icon>
317
- </v-avatar>
318
- Refresh files
319
- </v-list-item>
320
- </template>
321
- <span> Rebuild the file list on OctoPrint (local) </span>
322
- </v-tooltip>
323
-
324
- <v-tooltip location="left">
325
- <template #activator="{ props }">
326
- <v-list-item
327
- class="extra-dense-list-item"
328
- link
329
- v-bind="props"
330
- @click.prevent.stop="clickSettings()"
331
- >
332
- <v-avatar :size="iconSize">
333
- <v-icon> settings </v-icon>
334
- </v-avatar>
335
- Settings
336
- </v-list-item>
337
- </template>
338
- <span> Edit the printer settings </span>
339
- </v-tooltip>
340
- </v-list>
341
-
342
- <v-divider />
343
-
344
- <v-list
345
- v-drop-upload="{ printers: [storedSideNavPrinter] }"
346
- density="compact"
347
- >
348
- <v-list-subheader inset> Files - drag 'n drop! </v-list-subheader>
349
- <v-text-field
350
- v-model="fileSearch"
351
- class="ml-5 mr-5"
352
- clearable
353
- label="Search files..."
354
- prepend-icon="search"
355
- />
356
- <!-- Empty file list -->
357
- <v-list-item v-if="!filesListed.length">
358
- <v-avatar :size="iconSize">
359
- <v-icon> clear </v-icon>
360
- </v-avatar>
361
- <v-list-item-title> No files to show </v-list-item-title>
362
- </v-list-item>
363
-
364
- <!-- Loading file list-->
365
- <v-progress-linear
366
- v-if="loading"
367
- indeterminate
368
- />
369
- <v-list-item
370
- v-for="(file, index) in filesListed"
371
- :key="index"
372
- density="compact"
373
- link
374
- style="padding-top: 0"
375
- >
376
- <v-avatar :size="iconSize">
377
- <v-tooltip location="left">
378
- <template #activator="{ props }">
379
- <v-btn
380
- v-bind="props"
381
- @click="clickDownloadFile(file)"
382
- >
383
- <v-icon> download </v-icon>
384
- </v-btn>
385
- </template>
386
- <span> Download GCode </span>
387
- </v-tooltip>
388
- </v-avatar>
389
-
390
- <v-list-item-action>
391
- <v-tooltip location="left">
392
- <template #activator="{ props }">
393
- <v-btn
394
- :disabled="isFileBeingPrinted(file)"
395
- icon
396
- v-bind="props"
397
- @click="clickPrintFile(file)"
398
- >
399
- <v-icon> play_arrow </v-icon>
400
- </v-btn>
401
- </template>
402
- <span> Select & Print </span>
403
- </v-tooltip>
404
- </v-list-item-action>
405
-
406
- <v-tooltip location="left">
407
- <template #activator="{ props }">
408
- <span
409
- :class="{ 'current-file-print': isFileBeingPrinted(file) }"
410
- v-bind="props"
411
- >
412
- {{ file.name }}
413
- </span>
414
- </template>
415
- <span>
416
- File: {{ file.name }} <br />
417
- Size: {{ formatBytes(file.size) }} <br />
418
- <strong>
419
- {{ isFileBeingPrinted(file) ? 'Printing' : 'Unused' }}
420
- </strong>
421
- </span>
422
- </v-tooltip>
423
-
424
- <v-list-item-action>
425
- <v-tooltip location="left">
426
- <template #activator="{ props }">
427
- <v-btn
428
- :disabled="isFileBeingPrinted(file)"
429
- v-bind="props"
430
- @click="deleteFile(file)"
431
- >
432
- <v-icon color="grey-lighten-1"> delete </v-icon>
433
- </v-btn>
434
- </template>
435
- <span> Delete file </span>
436
- </v-tooltip>
437
- </v-list-item-action>
438
- </v-list-item>
439
- </v-list>
440
- </v-navigation-drawer>
441
- </template>
442
-
443
- <script lang="ts" setup>
444
- import { computed, ref, watch } from 'vue'
445
- import { generateInitials } from '@/shared/noun-adjectives.data'
446
- import { PrinterFileService, PrintersService } from '@/backend'
447
- import { FileDto } from '@/models/printers/printer-file.model'
448
- import { formatBytes } from '@/utils/file-size.util'
449
- import { usePrinterStore } from '@/store/printer.store'
450
- import { DialogName } from './Dialogs/dialog.constants'
451
- import { useDialogsStore } from '@/store/dialog.store'
452
- import { PrinterJobService } from '@/backend/printer-job.service'
453
- import { usePrinterStateStore } from '@/store/printer-state.store'
454
- import { interpretStates } from '@/shared/printer-state.constants'
455
- import { useSettingsStore } from '@/store/settings.store'
456
- import { useFeatureStore } from '@/store/features.store'
457
-
458
- const printersStore = usePrinterStore()
459
- const printerStateStore = usePrinterStateStore()
460
- const dialogsStore = useDialogsStore()
461
- const featureStore = useFeatureStore()
462
- const iconSize = ref(36)
463
- const fileSearch = ref<string | undefined>(undefined)
464
- const shownFileCache = ref<FileDto[] | undefined>(undefined)
465
- const drawerOpened = ref(false)
466
- const loading = ref(true)
467
- const storedSideNavPrinter = computed(() => printersStore.sideNavPrinter)
468
- const printerId = computed(() => storedSideNavPrinter.value?.id)
469
- const isOnline = computed(() =>
470
- printerId.value ? printerStateStore.isApiResponding(printerId.value) : false
471
- )
472
- const isOperational = computed(() =>
473
- printerId.value
474
- ? printerStateStore.isPrinterOperational(printerId.value)
475
- : false
476
- )
477
- const isEnabled = computed(() => {
478
- return storedSideNavPrinter.value?.enabled
479
- })
480
- const isUnderMaintenance = computed(() => {
481
- return !!storedSideNavPrinter.value?.disabledReason?.length
482
- })
483
- const isPrinting = computed(() => {
484
- return printerId.value
485
- ? printerStateStore.isPrinterPrinting(printerId.value)
486
- : false
487
- })
488
- const filesListed = computed(() => {
489
- if (!shownFileCache.value?.length) return []
490
- return (
491
- shownFileCache.value.filter((f) =>
492
- fileSearch.value?.length
493
- ? `${f.name}${f.path}`.toLowerCase().includes(fileSearch.value)
494
- : true
495
- ) || []
496
- )
497
- })
498
- const isStoppable = computed(() => {
499
- if (!storedSideNavPrinter.value || !printerId.value) return false
500
- return printerStateStore.isPrinterStoppable(printerId.value)
501
- })
502
- const isPaused = computed(() => {
503
- if (!storedSideNavPrinter.value || !printerId.value) return false
504
- return printerStateStore.isPrinterPaused(printerId.value)
505
- })
506
- const canBeCleared = computed(() => {
507
- if (!printerId.value) {
508
- return false
509
- }
510
- return (
511
- shownFileCache.value?.length &&
512
- printerStateStore.isApiResponding(printerId.value)
513
- )
514
- })
515
- const currentJob = computed(() => {
516
- if (!printerId.value) {
517
- throw new Error('Printer ID not set, cannot get current job')
518
- }
519
- return printerStateStore.printerJobsById[printerId.value]
520
- })
521
- const currentPrintingFilePath = computed(() => {
522
- if (!printerId.value) {
523
- throw new Error('Printer ID not set, cannot get current printing file name')
524
- }
525
- return printerStateStore.printingFilePathsByPrinterId[printerId.value]
526
- })
527
- const printerState = computed(() => {
528
- if (!printerId.value || !storedSideNavPrinter.value) return null
529
- const printerEvents = printerStateStore.printerEventsById[printerId.value]
530
- const socketState = printerStateStore.socketStatesById[printerId.value]
531
- const states = interpretStates(
532
- storedSideNavPrinter.value,
533
- socketState,
534
- printerEvents
535
- )
536
- const debugInterpretedState =
537
- useSettingsStore().frontendDebugSettings?.showInterpretedPrinterState
538
- if (debugInterpretedState) {
539
- console.debug(
540
- '[FileExplorerSideNav] rendered for printerId',
541
- printerId.value,
542
- states?.text,
543
- states?.color,
544
- states?.rgb
545
- )
546
- }
547
- return states
548
- })
549
- const refreshFiles = async () => {
550
- loading.value = true
551
- const currentPrinterId = storedSideNavPrinter.value?.id
552
- if (!currentPrinterId) return
553
- if (printerStateStore.isApiResponding(currentPrinterId)) {
554
- shownFileCache.value = await printersStore.loadPrinterFiles(
555
- currentPrinterId,
556
- false
557
- )
558
- } else {
559
- shownFileCache.value = await PrinterFileService.getFileCache(
560
- currentPrinterId
561
- )
562
- }
563
- loading.value = false
564
- }
565
- const deleteFile = async (file: FileDto) => {
566
- if (!printerId.value) return
567
- await printersStore.deletePrinterFile(printerId.value, file.path)
568
- }
569
- // ... (continue with other methods)
570
- watch(storedSideNavPrinter, async (viewedPrinter, oldVal) => {
571
- drawerOpened.value = !!viewedPrinter
572
- const currentPrinterId = viewedPrinter?.id
573
- if (!viewedPrinter || !currentPrinterId) {
574
- return
575
- }
576
- if (!shownFileCache.value || viewedPrinter.id !== oldVal?.id || !oldVal) {
577
- await refreshFiles()
578
- }
579
- })
580
- watch(drawerOpened, (newVal) => {
581
- if (!newVal) {
582
- printersStore.setSideNavPrinter(undefined)
583
- }
584
- })
585
-
586
- function truncateProgress(progress?: number) {
587
- if (!progress) return ''
588
- return progress?.toFixed(1)
589
- }
590
-
591
- function isFileBeingPrinted(file: FileDto) {
592
- if (!printerId.value) {
593
- return false
594
- }
595
- const jobFilePath =
596
- printerStateStore.printingFilePathsByPrinterId[printerId.value]
597
- return jobFilePath === file.name
598
- }
599
-
600
- function avatarInitials() {
601
- const viewedPrinter = storedSideNavPrinter.value
602
- if (viewedPrinter && drawerOpened.value) {
603
- return generateInitials(viewedPrinter.name)
604
- }
605
- }
606
-
607
- function openPrinterURL() {
608
- if (!storedSideNavPrinter.value) return
609
- PrintersService.openPrinterURL(storedSideNavPrinter.value.printerURL)
610
- closeDrawer()
611
- }
612
-
613
- async function togglePrinterConnection() {
614
- if (!printerId.value) return
615
- if (printerStateStore.isPrinterOperational(printerId.value)) {
616
- return await PrintersService.sendPrinterDisconnectCommand(printerId.value)
617
- }
618
- await PrintersService.sendPrinterConnectCommand(printerId.value)
619
- }
620
-
621
- async function toggleEnabled() {
622
- if (!printerId.value) {
623
- throw new Error('Printer ID not set, cant toggle enabled')
624
- }
625
- if (!storedSideNavPrinter.value) {
626
- throw new Error('Cant toggle enabled, sidenav printer unset')
627
- }
628
- const newSetting = !storedSideNavPrinter.value.enabled
629
- await PrintersService.toggleEnabled(printerId.value, newSetting)
630
- }
631
-
632
- async function toggleMaintenance() {
633
- if (!printerId.value) {
634
- throw new Error('Printer ID not set, cant toggle maintenance')
635
- }
636
- if (!storedSideNavPrinter.value) {
637
- throw new Error('Cant toggle enabled, sidenav printer unset')
638
- }
639
- if (isUnderMaintenance.value) {
640
- await PrintersService.updatePrinterMaintenance(printerId.value)
641
- return
642
- }
643
- printersStore.setMaintenanceDialogPrinter(storedSideNavPrinter.value)
644
- dialogsStore.openDialogWithContext(DialogName.PrinterMaintenanceDialog)
645
- closeDrawer()
646
- }
647
-
648
- async function refreshSocketState() {
649
- if (!printerId.value) return
650
-
651
- await PrintersService.refreshSocket(printerId.value)
652
- }
653
-
654
- async function clickStopPrint() {
655
- if (!printerId.value) return
656
- if (confirm('Are you sure to cancel the current print job?')) {
657
- await PrinterJobService.stopPrintJob(printerId.value)
658
- }
659
- }
660
-
661
- async function clickPausePrint() {
662
- if (!printerId.value) return
663
- await PrinterJobService.pausePrintJob(printerId.value)
664
- }
665
-
666
- async function clickResumePrint() {
667
- if (!printerId.value) return
668
- await PrinterJobService.resumePrintJob(printerId.value)
669
- }
670
-
671
- async function clickClearFiles() {
672
- if (!printerId.value) return
673
- loading.value = true
674
- await printersStore.clearPrinterFiles(printerId.value)
675
- loading.value = false
676
- shownFileCache.value = printersStore.printerFiles(printerId.value)
677
- }
678
-
679
- function clickSettings() {
680
- if (!storedSideNavPrinter.value) return
681
- printersStore.setUpdateDialogPrinter(storedSideNavPrinter.value)
682
- dialogsStore.openDialogWithContext(DialogName.AddOrUpdatePrinterDialog)
683
- closeDrawer()
684
- }
685
-
686
- async function clickPrintFile(file: FileDto) {
687
- if (!printerId.value) return
688
- await printerStateStore.selectAndPrintFile({
689
- printerId: printerId.value,
690
- fullPath: file.path
691
- })
692
- }
693
-
694
- function clickDownloadFile(file: FileDto) {
695
- PrinterFileService.downloadFile(file)
696
- }
697
-
698
- function closeDrawer() {
699
- printersStore.setSideNavPrinter(undefined)
700
- }
701
- </script>
702
- <style>
703
- .extra-dense-list-item {
704
- margin-top: -7px;
705
- }
706
-
707
- .current-file-print {
708
- color: red;
709
- }
710
-
711
- .pulsating-red {
712
- background: darkred;
713
- margin: 10px;
714
- border-radius: 15px;
715
- box-shadow: 0 0 0 0 rgba(0, 0, 0, 1);
716
- transform: scale(1);
717
- animation: pulse 2s infinite;
718
- }
719
-
720
- @keyframes pulse {
721
- 0% {
722
- transform: scale(0.95);
723
- box-shadow: 0 0 0 0 rgba(0, 0, 0, 0.7);
724
- }
725
- 70% {
726
- transform: scale(1);
727
- box-shadow: 0 0 0 10px rgba(0, 0, 0, 0);
728
- }
729
- 100% {
730
- transform: scale(0.95);
731
- box-shadow: 0 0 0 0 rgba(0, 0, 0, 0);
732
- }
733
- }
734
- </style>