@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.
- package/.yarn/install-state.gz +0 -0
- package/dist/assets/MaterialIcons-Regular-BjXOXp5c.eot +0 -0
- package/dist/assets/MaterialIcons-Regular-DEUTIz1o.ttf +0 -0
- package/dist/assets/MaterialIcons-Regular-DOtZ65Va.woff2 +0 -0
- package/dist/assets/MaterialIcons-Regular-FsbMSDLx.woff +0 -0
- package/dist/assets/index-CHzfWKPO.css +5 -0
- package/dist/assets/index-CnWtkGvw.js +90 -0
- package/dist/assets/index-CnWtkGvw.js.map +1 -0
- package/dist/favicon.ico +0 -0
- package/dist/img/DavidZwart.jpg +0 -0
- package/dist/img/OIG.JYDC2RaWdz7g9.jpg +0 -0
- package/dist/img/OIG.jpg +0 -0
- package/dist/img/icons/android-chrome-256x256.png +0 -0
- package/dist/img/icons/android-chrome-384x384.png +0 -0
- package/dist/img/icons/android-chrome-512x512.png +0 -0
- package/dist/img/icons/favicon.svg +1 -0
- package/dist/img/logo.png +0 -0
- package/dist/img/logo.svg +1 -0
- package/dist/img/manifest.webmanifest +33 -0
- package/dist/img/octoprint-tentacle.svg +144 -0
- package/dist/img/thumbail_unknown.jpg +0 -0
- package/dist/img/vbanner.jpg +0 -0
- package/dist/index.html +24 -0
- package/dist/robots.txt +2 -0
- package/package.json +1 -1
- package/.all-contributorsrc +0 -57
- package/.editorconfig +0 -5
- package/.eslintrc.js +0 -126
- package/.github/FUNDING.yml +0 -3
- package/.github/workflows/release-client.yml +0 -94
- package/.github/workflows/vue-publish.yml +0 -26
- package/.prettierignore +0 -15
- package/.whitesource +0 -12
- package/renovate.json +0 -30
- package/src/App.vue +0 -60
- package/src/AppLoader.vue +0 -383
- package/src/assets/adjectives.json +0 -1468
- package/src/assets/logo.svg +0 -6
- package/src/assets/nouns.json +0 -4309
- package/src/auto-imports.d.ts +0 -139
- package/src/backend/app.service.ts +0 -39
- package/src/backend/auth.service.ts +0 -56
- package/src/backend/base.service.ts +0 -57
- package/src/backend/batch.service.ts +0 -37
- package/src/backend/camera-stream.service.ts +0 -33
- package/src/backend/custom-gcode.service.ts +0 -11
- package/src/backend/dto/octoprint-settings.dto.ts +0 -168
- package/src/backend/first-time-setup.service.ts +0 -17
- package/src/backend/floor.service.ts +0 -84
- package/src/backend/index.ts +0 -4
- package/src/backend/print-completions.service.ts +0 -11
- package/src/backend/printer-file.service.ts +0 -91
- package/src/backend/printer-group.service.ts +0 -62
- package/src/backend/printer-job.service.ts +0 -20
- package/src/backend/printer-settings.service.ts +0 -28
- package/src/backend/printers.service.ts +0 -136
- package/src/backend/server-private.service.ts +0 -55
- package/src/backend/server.api.ts +0 -132
- package/src/backend/settings.service.ts +0 -85
- package/src/backend/user.service.ts +0 -51
- package/src/components/AboutHelp/AboutView.vue +0 -164
- package/src/components/CameraGrid/CameraGridView.vue +0 -111
- package/src/components/FirstTimeSetup/FirstTimeSetupView.vue +0 -354
- package/src/components/Generic/Actions/PrinterConnectionAction.vue +0 -56
- package/src/components/Generic/Actions/PrinterCreateAction.vue +0 -22
- package/src/components/Generic/Actions/PrinterDeleteAction.vue +0 -29
- package/src/components/Generic/Actions/PrinterQuickStopAction.vue +0 -35
- package/src/components/Generic/Actions/PrinterSettingsAction.vue +0 -35
- package/src/components/Generic/Actions/PrinterUrlAction.vue +0 -24
- package/src/components/Generic/Actions/RefreshFilesAction.vue +0 -50
- package/src/components/Generic/Actions/SyncPrinterNameAction.vue +0 -36
- package/src/components/Generic/Dialogs/AddOrUpdateCameraStreamDialog.vue +0 -131
- package/src/components/Generic/Dialogs/AddOrUpdateFloorDialog.vue +0 -141
- package/src/components/Generic/Dialogs/AddOrUpdatePrinterDialog.vue +0 -303
- package/src/components/Generic/Dialogs/BaseDialog.vue +0 -81
- package/src/components/Generic/Dialogs/BatchJsonCreateDialog.vue +0 -109
- package/src/components/Generic/Dialogs/BatchReprintDialog.vue +0 -190
- package/src/components/Generic/Dialogs/PrinterChecksPanel.vue +0 -37
- package/src/components/Generic/Dialogs/PrinterControlDialog.vue +0 -202
- package/src/components/Generic/Dialogs/PrinterMaintenanceDialog.vue +0 -130
- package/src/components/Generic/Dialogs/YamlImportExportDialog.vue +0 -186
- package/src/components/Generic/Dialogs/dialog.constants.ts +0 -19
- package/src/components/Generic/FileExplorerSideNav.vue +0 -734
- package/src/components/Generic/Loaders/GridLoader.vue +0 -68
- package/src/components/Generic/NavigationDrawer.vue +0 -69
- package/src/components/Generic/PrintJobsMenu.vue +0 -148
- package/src/components/Generic/Snackbars/AppErrorSnackbar.vue +0 -64
- package/src/components/Generic/Snackbars/AppInfoSnackbar.vue +0 -63
- package/src/components/Generic/Snackbars/AppProgressSnackbar.vue +0 -158
- package/src/components/Generic/Vuetify/TooltipButton.vue +0 -47
- package/src/components/HelpOverlay/HelpOverlay.vue +0 -57
- package/src/components/Login/LoginForm.vue +0 -206
- package/src/components/Login/LoginView.spec.ts +0 -64
- package/src/components/Login/LoginView.vue +0 -65
- package/src/components/Login/Logo.vue +0 -13
- package/src/components/Login/PermissionDenied.vue +0 -109
- package/src/components/Login/RegistrationForm.vue +0 -207
- package/src/components/Login/RegistrationView.vue +0 -17
- package/src/components/Login/__snapshots__/LoginView.spec.ts.snap +0 -1051
- package/src/components/NotFound/NotFoundView.vue +0 -39
- package/src/components/PrintStatistics/PrintStatistics.vue +0 -168
- package/src/components/PrintStatistics/PrintStatisticsView.vue +0 -15
- package/src/components/PrinterGrid/HomeToolbar.vue +0 -90
- package/src/components/PrinterGrid/PrinterGrid.vue +0 -164
- package/src/components/PrinterGrid/PrinterGridTile.vue +0 -438
- package/src/components/PrinterGrid/PrinterGridView.vue +0 -210
- package/src/components/PrinterList/FileControlList.vue +0 -40
- package/src/components/PrinterList/PrinterDetails.vue +0 -91
- package/src/components/PrinterList/PrintersView.vue +0 -492
- package/src/components/Settings/AccountSettings.vue +0 -163
- package/src/components/Settings/DiagnosticsSettings.vue +0 -137
- package/src/components/Settings/EmergencyCommands.vue +0 -265
- package/src/components/Settings/FloorSettings.vue +0 -276
- package/src/components/Settings/GridSettings.vue +0 -127
- package/src/components/Settings/OctoPrintSettings.vue +0 -188
- package/src/components/Settings/ServerProtectionSettings.vue +0 -370
- package/src/components/Settings/SettingsView.vue +0 -73
- package/src/components/Settings/SoftwareUpgradeSettings.vue +0 -297
- package/src/components/Settings/UserManagementSettings.vue +0 -257
- package/src/components/TopBar.vue +0 -147
- package/src/components.d.ts +0 -70
- package/src/directives/file-upload.directive.ts +0 -117
- package/src/directives/printer-drop-position.directive.ts +0 -92
- package/src/env.d.ts +0 -6
- package/src/main.ts +0 -76
- package/src/models/batch/reprint.dto.ts +0 -79
- package/src/models/batch.model.ts +0 -11
- package/src/models/camera-streams/camera-stream.ts +0 -19
- package/src/models/floors/floor.model.ts +0 -30
- package/src/models/octoprint/connection-options.model.ts +0 -8
- package/src/models/plugins/firmware-updates/prusa-firmware-release.model.ts +0 -57
- package/src/models/print-completions/print-completions.model.ts +0 -49
- package/src/models/printers/crud/create-printer.model.ts +0 -26
- package/src/models/printers/file-upload-commands.model.ts +0 -4
- package/src/models/printers/gcode/gcode-analysis.model.ts +0 -30
- package/src/models/printers/printer-current-job.model.ts +0 -90
- package/src/models/printers/printer-file.model.ts +0 -48
- package/src/models/printers/printer.model.ts +0 -18
- package/src/models/server/client-releases.model.ts +0 -27
- package/src/models/server/export-yaml.model.ts +0 -11
- package/src/models/server/features.model.ts +0 -37
- package/src/models/server/github-rate-limit.model.ts +0 -21
- package/src/models/server/version.model.ts +0 -14
- package/src/models/settings/printer-file-clean-settings.model.ts +0 -5
- package/src/models/settings/server-settings.dto.ts +0 -19
- package/src/models/settings/settings.model.ts +0 -57
- package/src/models/socketio-messages/socketio-message.model.ts +0 -53
- package/src/models/uploads/queued-upload.model.ts +0 -12
- package/src/models/user.model.ts +0 -15
- package/src/plugins/README.md +0 -3
- package/src/plugins/index.ts +0 -17
- package/src/plugins/vuetify.ts +0 -53
- package/src/router/index.ts +0 -192
- package/src/router/route-names.ts +0 -14
- package/src/router/utils.ts +0 -23
- package/src/shared/alert.events.ts +0 -14
- package/src/shared/app.constants.ts +0 -23
- package/src/shared/auth.constants.ts +0 -34
- package/src/shared/dialog.composable.ts +0 -41
- package/src/shared/drag.constants.ts +0 -19
- package/src/shared/experimental.constants.ts +0 -1
- package/src/shared/http-client.ts +0 -162
- package/src/shared/noun-adjectives.data.ts +0 -24
- package/src/shared/printer-grid.constants.ts +0 -5
- package/src/shared/printer-state.constants.ts +0 -194
- package/src/shared/snackbar.composable.ts +0 -66
- package/src/shared/socketio.service.ts +0 -104
- package/src/store/auth.store.ts +0 -255
- package/src/store/connection.store.ts +0 -66
- package/src/store/dialog.store.ts +0 -114
- package/src/store/features.store.ts +0 -57
- package/src/store/floor.store.ts +0 -173
- package/src/store/grid.store.ts +0 -10
- package/src/store/index.ts +0 -4
- package/src/store/printer-state.store.ts +0 -246
- package/src/store/printer.store.ts +0 -236
- package/src/store/profile.store.ts +0 -25
- package/src/store/settings.store.ts +0 -64
- package/src/store/test-printer.store.ts +0 -70
- package/src/store/uploads.store.ts +0 -75
- package/src/styles/README.md +0 -3
- package/src/styles/settings.scss +0 -10
- package/src/types/global.d.ts +0 -15
- package/src/utils/array.utils.ts +0 -15
- package/src/utils/date.utils.ts +0 -5
- package/src/utils/download-file.util.ts +0 -25
- package/src/utils/error.utils.ts +0 -3
- package/src/utils/file-size.util.ts +0 -11
- package/src/utils/id.type.ts +0 -1
- package/src/utils/sentry.util.ts +0 -8
- package/src/utils/test.util.ts +0 -30
- package/src/utils/time.utils.ts +0 -2
- package/src/utils/uploads-state.utils.ts +0 -58
- package/src/utils/validation.utils.ts +0 -14
- package/src/vite-env.d.ts +0 -7
- package/test/setup-axios-mock.ts +0 -15
- /package/{src/assets/logo.png → dist/assets/logo-CJVdjy51.png} +0 -0
- /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> {{ 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>
|