@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,39 @@
1
+ <template>
2
+ <v-container>
3
+ <h2 class="text-center mt-lg-12">This page was not found.</h2>
4
+
5
+ <h1 class="text-center">: (</h1>
6
+ <br />
7
+ <h4 class="text-center">
8
+ <v-btn
9
+ class="align-center"
10
+ color="primary"
11
+ to="/"
12
+ variant="elevated"
13
+ >
14
+ <v-icon class="mr-2">home</v-icon>
15
+ Go home
16
+ </v-btn>
17
+
18
+ <span class="pa-5"> or </span>
19
+ <v-btn
20
+ class="align-center"
21
+ variant="elevated"
22
+ @click="goBack()"
23
+ >
24
+ <v-icon class="mr-2">arrow_left</v-icon>
25
+ Go back
26
+ </v-btn>
27
+ </h4>
28
+ </v-container>
29
+ </template>
30
+
31
+ <script lang="ts" setup>
32
+ import { useRouter } from 'vue-router'
33
+
34
+ const router = useRouter()
35
+
36
+ const goBack = () => {
37
+ router.go(-1)
38
+ }
39
+ </script>
@@ -0,0 +1,168 @@
1
+ <template>
2
+ <v-sheet
3
+ height="100%"
4
+ width="100%"
5
+ >
6
+ <v-container>
7
+ <v-row>
8
+ <v-col>
9
+ <v-icon>filter_list</v-icon>
10
+ Filter by printer name (optional)
11
+ </v-col>
12
+ <v-col>
13
+ <v-text-field
14
+ v-model="printerNameSearch"
15
+ class="p-2"
16
+ clearable
17
+ label="Search"
18
+ prepend-icon="search"
19
+ single-line
20
+ />
21
+ </v-col>
22
+ </v-row>
23
+ </v-container>
24
+ <v-alert>
25
+ Please reload here if you want updated results:
26
+ <v-btn
27
+ color="primary"
28
+ size="x-small"
29
+ @click="loadCompletions()"
30
+ >
31
+ Reload
32
+ </v-btn>
33
+ </v-alert>
34
+ <v-table dark>
35
+ <template #default>
36
+ <thead>
37
+ <tr>
38
+ <th class="text-left">Printer name</th>
39
+ <th class="text-left">Floor</th>
40
+ <th class="text-left">Fail/ Success/ Total</th>
41
+ <th class="text-left">Last success</th>
42
+ <th class="text-left">Last failure</th>
43
+ <th class="text-left">Successes (week/48H/24H)</th>
44
+ <th class="text-left">Failures (week/48H/24H)</th>
45
+ </tr>
46
+ </thead>
47
+ <tbody>
48
+ <tr
49
+ v-for="item in shownCompletions"
50
+ :key="item.printerId"
51
+ >
52
+ <td>
53
+ {{ printer(item.printerId)?.name ?? '?' }}
54
+ </td>
55
+ <td>
56
+ {{ floorOfPrinter(item.printerId)?.name ?? '?' }}
57
+ </td>
58
+ <td>
59
+ &#215; {{ item.failureCount }} / &#128504; {{ item.successCount }}
60
+ <strong> ~{{ item.printCount }} </strong>
61
+ </td>
62
+ <td>
63
+ {{ Date.now() - item.lastSuccess?.createdAt || '-' }}
64
+ </td>
65
+ <td>
66
+ <v-tooltip location="bottom">
67
+ <template
68
+ v-if="item.lastFailure?.status"
69
+ #activator="{ props }"
70
+ >
71
+ <v-icon v-bind="props">info</v-icon>
72
+ </template>
73
+ <span>
74
+ {{ item.lastFailure?.status || '-' }} <br />
75
+ {{ item.lastFailure?.createdAt }} <br />
76
+ <small>
77
+ {{ item.lastFailure?.fileName }}
78
+ </small>
79
+ <br />
80
+ <strong>
81
+ {{ item.lastFailure?.completionLog }}
82
+ </strong>
83
+ <br />
84
+ </span>
85
+ </v-tooltip>
86
+ </td>
87
+ <td>
88
+ {{ item.successEventsLastWeek }} {{ item.successEventsLast48H }}
89
+ {{ item.successEventsLast24H }}
90
+ </td>
91
+ <td>
92
+ {{ item.failureEventsLastWeek }} {{ item.failureEventsLast48H }}
93
+ {{ item.failureEventsLast24H }}
94
+ </td>
95
+ </tr>
96
+ </tbody>
97
+ </template>
98
+ </v-table>
99
+ </v-sheet>
100
+ </template>
101
+
102
+ <script lang="ts" setup>
103
+ import { onMounted, ref, watch } from 'vue'
104
+ import { PrintCompletionsService } from '@/backend/print-completions.service'
105
+ import { PrinterCompletions } from '@/models/print-completions/print-completions.model'
106
+ import { usePrinterStore } from '@/store/printer.store'
107
+ import { useFloorStore } from '@/store/floor.store'
108
+ import { IdType } from '@/utils/id.type'
109
+
110
+ const loadedCompletions = ref<PrinterCompletions[]>([])
111
+ const shownCompletions = ref<PrinterCompletions[]>([])
112
+ const printerNameSearch = ref<string>('')
113
+
114
+ const printerStore = usePrinterStore()
115
+ const floorStore = useFloorStore()
116
+
117
+ onMounted(async () => {
118
+ await loadCompletions()
119
+ })
120
+
121
+ watch([() => printerNameSearch.value], () => {
122
+ updatePrinters()
123
+ })
124
+
125
+ const loadCompletions = async () => {
126
+ loadedCompletions.value = []
127
+ shownCompletions.value = []
128
+ loadedCompletions.value = await PrintCompletionsService.getCompletions()
129
+ updatePrinters()
130
+ }
131
+
132
+ const printer = (printerId: IdType) => {
133
+ return printerStore.printer(printerId)
134
+ }
135
+
136
+ const floorOfPrinter = (printerId: IdType) => {
137
+ return floorStore.floorOfPrinter(printerId)
138
+ }
139
+
140
+ const updatePrinters = () => {
141
+ const pIds = printerStore.printers.map((p) => p.id)
142
+
143
+ // Determine printers from store, any unknown ID's filtered out
144
+ const preSearchPrints = pIds.length
145
+ ? loadedCompletions.value.filter((c) => pIds.includes(c.printerId))
146
+ : loadedCompletions.value
147
+
148
+ const preSortPrints = printerNameSearch.value?.length
149
+ ? preSearchPrints.filter((p) => {
150
+ const printer = printerStore.printers.find(
151
+ (spr) => spr.id === p.printerId
152
+ )
153
+ if (!printer) return false
154
+
155
+ return (printer.name + printer.printerURL)
156
+ .toLowerCase()
157
+ .includes(printerNameSearch.value.toLowerCase())
158
+ })
159
+ : preSearchPrints
160
+
161
+ shownCompletions.value = preSortPrints.sort((p1, p2) => {
162
+ if (p1.failureCount === p2.failureCount) {
163
+ return p1.printCount > p2.printCount ? -1 : 1
164
+ }
165
+ return p1.failureCount > p2.failureCount ? -1 : 1
166
+ })
167
+ }
168
+ </script>
@@ -0,0 +1,15 @@
1
+ <template>
2
+ <v-container>
3
+ <PrintStatistics />
4
+ </v-container>
5
+ </template>
6
+
7
+ <script lang="ts">
8
+ import { defineComponent } from 'vue'
9
+ import PrintStatistics from '@/components/PrintStatistics/PrintStatistics.vue'
10
+
11
+ export default defineComponent({
12
+ name: 'PrintStatisticsView',
13
+ components: { PrintStatistics }
14
+ })
15
+ </script>
@@ -0,0 +1,90 @@
1
+ <template>
2
+ <v-toolbar flat>
3
+ <v-toolbar-title> Floors </v-toolbar-title>
4
+ <v-btn-toggle
5
+ :model-value="selectedFloorToggleIndex"
6
+ class="ml-7"
7
+ mandatory
8
+ rounded
9
+ @update:model-value="changeFloorIndex"
10
+ >
11
+ <v-btn
12
+ v-for="f in floors"
13
+ :key="f.id"
14
+ >
15
+ <v-icon>format_align_left</v-icon>
16
+ {{ f.name }}
17
+ </v-btn>
18
+ </v-btn-toggle>
19
+
20
+ <v-btn
21
+ v-if="!printerStore.printers?.length"
22
+ class="mt-0 ml-6"
23
+ color="primary"
24
+ to="/printers"
25
+ >
26
+ You have no printers. Click here to start!
27
+ </v-btn>
28
+ <v-alert
29
+ v-if="floorStore.floorlessPrinters.length"
30
+ class="mt-4 ml-12"
31
+ color="primary"
32
+ >
33
+ <v-icon>warning</v-icon>
34
+ {{ floorStore.floorlessPrinters.length }} unplaced printer(s)!
35
+ </v-alert>
36
+ <div class="ma-4 pt-6">
37
+ <v-switch
38
+ v-model="gridStore.gridEditMode"
39
+ label="Printer Relocate Mode"
40
+ />
41
+ </div>
42
+
43
+ <v-spacer />
44
+ <span class="d-flex flex-wrap gap-2">
45
+ <span class="pr-2">
46
+ <v-icon>print</v-icon>
47
+ {{ printerStateStore.printingCount }}
48
+ </span>
49
+ <span class="pr-2">
50
+ <v-icon>ac_unit</v-icon>
51
+ {{ printerStateStore.operationalNotPrintingCount }}
52
+ </span>
53
+ <span class="pr-2">
54
+ <v-icon>handyman</v-icon>
55
+ {{ printerStore.maintenanceCount }}
56
+ </span>
57
+ <span class="pr-2">
58
+ <v-icon>usb_off</v-icon>
59
+ {{ printerStore.disconnectedCount }}
60
+ </span>
61
+ <span class="pr-2">
62
+ <v-icon>print_disabled</v-icon>
63
+ {{ printerStore.disabledCount }}
64
+ </span>
65
+ </span>
66
+ </v-toolbar>
67
+ </template>
68
+
69
+ <script lang="ts" setup>
70
+ import { computed, ref } from 'vue'
71
+ import { usePrinterStore } from '@/store/printer.store'
72
+ import { useGridStore } from '@/store/grid.store'
73
+ import { useFloorStore } from '@/store/floor.store'
74
+ import { usePrinterStateStore } from '@/store/printer-state.store'
75
+
76
+ const printerStore = usePrinterStore()
77
+ const printerStateStore = usePrinterStateStore()
78
+ const floorStore = useFloorStore()
79
+ const gridStore = useGridStore()
80
+ const selectedFloorToggleIndex = ref<number>(0)
81
+
82
+ const floors = computed(() => {
83
+ return floorStore.floors
84
+ })
85
+
86
+ function changeFloorIndex(index: any) {
87
+ floorStore.changeSelectedFloorByIndex(index)
88
+ selectedFloorToggleIndex.value = index
89
+ }
90
+ </script>
@@ -0,0 +1,164 @@
1
+ <template>
2
+ <div>
3
+ <v-banner v-if="gridStore.gridEditMode">
4
+ <v-row style="margin-bottom: -5px">
5
+ <v-col>
6
+ <span>
7
+ Drag {{ floorStore.floorlessPrinters.length }} unplaced printer(s)
8
+ from here to place it on the grid.
9
+ </span>
10
+ <v-chip-group>
11
+ <v-chip
12
+ v-for="printer of floorStore.floorlessPrinters"
13
+ :key="printer.id"
14
+ draggable
15
+ size="small"
16
+ style="cursor: move"
17
+ @dragstart="onDragStart(printer, $event)"
18
+ >
19
+ {{ printer.name }}
20
+ </v-chip>
21
+ </v-chip-group>
22
+ </v-col>
23
+ <v-col>
24
+ <div>
25
+ Clear printers by clicking on
26
+ <strong>
27
+ <v-icon>disabled_visible</v-icon>
28
+ Click to clear
29
+ </strong>
30
+ </div>
31
+ </v-col>
32
+ </v-row>
33
+ </v-banner>
34
+ <v-row
35
+ v-for="y in rows"
36
+ :key="y"
37
+ class="ma-1"
38
+ no-gutters
39
+ >
40
+ <v-col
41
+ v-for="x in columns"
42
+ :key="x"
43
+ :cols="columnWidth"
44
+ :sm="columnWidth"
45
+ >
46
+ <v-row
47
+ class="test-top"
48
+ no-gutters
49
+ >
50
+ <v-col cols="6">
51
+ <PrinterGridTile
52
+ :printer="getPrinter(2 * (x - 1), 2 * (y - 1))"
53
+ :x="2 * (x - 1)"
54
+ :y="2 * (y - 1)"
55
+ />
56
+ </v-col>
57
+ <v-col cols="6">
58
+ <PrinterGridTile
59
+ :printer="getPrinter(2 * (x - 1) + 1, 2 * (y - 1))"
60
+ :x="2 * (x - 1) + 1"
61
+ :y="2 * (y - 1)"
62
+ />
63
+ </v-col>
64
+ </v-row>
65
+ <v-row
66
+ class="test-bottom"
67
+ no-gutters
68
+ >
69
+ <v-col cols="6">
70
+ <PrinterGridTile
71
+ :printer="getPrinter(2 * (x - 1), 2 * (y - 1) + 1)"
72
+ :x="2 * (x - 1)"
73
+ :y="2 * (y - 1) + 1"
74
+ />
75
+ </v-col>
76
+ <v-col cols="6">
77
+ <PrinterGridTile
78
+ :printer="getPrinter(2 * (x - 1) + 1, 2 * (y - 1) + 1)"
79
+ :x="2 * (x - 1) + 1"
80
+ :y="2 * (y - 1) + 1"
81
+ />
82
+ </v-col>
83
+ </v-row>
84
+ </v-col>
85
+ </v-row>
86
+ <img
87
+ alt="FDM Monster Background"
88
+ class="grid-bg-img align-content-center"
89
+ src="/img/logo.svg"
90
+ style="opacity: 0.08; pointer-events: none"
91
+ />
92
+ </div>
93
+ </template>
94
+
95
+ <script lang="ts" setup>
96
+ import { computed, onMounted } from 'vue'
97
+ import PrinterGridTile from '@/components/PrinterGrid/PrinterGridTile.vue'
98
+ import { totalVuetifyColumnCount } from '@/shared/printer-grid.constants'
99
+ import { usePrinterStore } from '@/store/printer.store'
100
+ import { PrinterDto } from '@/models/printers/printer.model'
101
+ import { useGridStore } from '@/store/grid.store'
102
+ import { dragAppId, INTENT, PrinterPlace } from '@/shared/drag.constants'
103
+ import { useSettingsStore } from '@/store/settings.store'
104
+ import { useFloorStore } from '@/store/floor.store'
105
+
106
+ console.debug('Setup grid')
107
+
108
+ const printerStore = usePrinterStore()
109
+ const floorStore = useFloorStore()
110
+ const settingsStore = useSettingsStore()
111
+ const gridStore = useGridStore()
112
+
113
+ onMounted(async () => {
114
+ await printerStore.loadPrinters()
115
+ await floorStore.loadFloors()
116
+ })
117
+
118
+ const printerMatrix = computed(() => floorStore.gridSortedPrinters)
119
+ const columns = computed(() => settingsStore.gridCols / 2)
120
+ const columnWidth = computed(() => totalVuetifyColumnCount / columns.value)
121
+ const rows = computed(() => settingsStore.gridRows / 2)
122
+
123
+ function onDragStart(printer: PrinterDto, ev: DragEvent) {
124
+ if (!ev.dataTransfer) return
125
+ if (!printer.id) return
126
+
127
+ ev.dataTransfer.setData(
128
+ 'text',
129
+ JSON.stringify({
130
+ appId: dragAppId,
131
+ intent: INTENT.PRINTER_PLACE,
132
+ printerId: printer.id
133
+ } as PrinterPlace)
134
+ )
135
+ }
136
+
137
+ function getPrinter(col: number, row: number) {
138
+ const x = col
139
+ const y = row
140
+ if (!printerMatrix.value?.length || !printerMatrix.value[x]) return undefined
141
+ return printerMatrix.value[x][y]
142
+ }
143
+ </script>
144
+
145
+ <style>
146
+ .grid-bg-img {
147
+ position: fixed;
148
+ height: 100vh;
149
+ top: 50vh;
150
+ width: 600%;
151
+ left: -250%;
152
+ filter: grayscale(100%);
153
+ }
154
+
155
+ .test-bottom {
156
+ border: 1px solid transparent;
157
+ margin: 0 20px 10px 20px !important;
158
+ }
159
+
160
+ .test-top {
161
+ border: 1px solid transparent;
162
+ margin: 0 20px 0 20px !important;
163
+ }
164
+ </style>