@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,22 +0,0 @@
1
- <template>
2
- <v-btn
3
- class="ma-2"
4
- color="primary"
5
- fab
6
- size="small"
7
- @click.c.capture.native.stop="openCreatePrinterDialog()"
8
- >
9
- <v-icon>add</v-icon>
10
- </v-btn>
11
- </template>
12
-
13
- <script lang="ts" setup>
14
- import { useDialogsStore } from '@/store/dialog.store'
15
- import { DialogName } from '../Dialogs/dialog.constants'
16
-
17
- const dialogsStore = useDialogsStore()
18
-
19
- function openCreatePrinterDialog() {
20
- dialogsStore.openDialogWithContext(DialogName.AddOrUpdatePrinterDialog)
21
- }
22
- </script>
@@ -1,29 +0,0 @@
1
- <template>
2
- <v-btn
3
- class="ma-2"
4
- color="primary"
5
- fab
6
- size="small"
7
- @click.prevent.stop="deletePrinter"
8
- >
9
- <v-icon>delete</v-icon>
10
- </v-btn>
11
- </template>
12
-
13
- <script lang="ts" setup>
14
- import { defineProps } from 'vue'
15
- import { PrinterDto } from '@/models/printers/printer.model'
16
- import { usePrinterStore } from '@/store/printer.store'
17
-
18
- const props = defineProps<{
19
- printer: PrinterDto
20
- }>()
21
-
22
- const printersStore = usePrinterStore()
23
-
24
- async function deletePrinter() {
25
- if (!confirm('Are you sure to delete this printer?')) return
26
-
27
- await printersStore.deletePrinter(props.printer.id)
28
- }
29
- </script>
@@ -1,35 +0,0 @@
1
- <template>
2
- <v-badge
3
- v-if="printer.enabled"
4
- bordered
5
- class="ma-2"
6
- overlap
7
- >
8
- <template #badge>
9
- <v-icon>bolt</v-icon>
10
- </template>
11
- <v-btn
12
- fab
13
- size="small"
14
- @click.stop="clickQuickStop"
15
- >
16
- <v-icon>stop</v-icon>
17
- </v-btn>
18
- </v-badge>
19
- </template>
20
-
21
- <script lang="ts" setup>
22
- import { defineProps } from 'vue'
23
- import { PrinterDto } from '@/models/printers/printer.model'
24
- import { CustomGcodeService } from '@/backend/custom-gcode.service'
25
-
26
- const props = defineProps<{
27
- printer: PrinterDto
28
- }>()
29
-
30
- async function clickQuickStop() {
31
- if (confirm('Are you sure to abort the print? Please reconnect after.')) {
32
- await CustomGcodeService.postQuickStopM112Command(props.printer.id)
33
- }
34
- }
35
- </script>
@@ -1,35 +0,0 @@
1
- <template>
2
- <v-btn
3
- class="ma-2"
4
- color="primary"
5
- fab
6
- size="small"
7
- @click.c.capture.native.stop="openSettings()"
8
- >
9
- <v-icon>settings</v-icon>
10
- </v-btn>
11
- </template>
12
-
13
- <script lang="ts">
14
- import { defineComponent, PropType } from 'vue'
15
- import { PrinterDto } from '@/models/printers/printer.model'
16
-
17
- export default defineComponent({
18
- name: 'PrinterSettingsAction',
19
- props: {
20
- printer: Object as PropType<PrinterDto>
21
- },
22
-
23
- computed: {
24
- printerId() {
25
- return this.printer!.id
26
- }
27
- },
28
-
29
- methods: {
30
- openSettings() {
31
- this.$emit('update:show', this.printer!.id)
32
- }
33
- }
34
- })
35
- </script>
@@ -1,24 +0,0 @@
1
- <template>
2
- <v-btn
3
- class="ma-2"
4
- color="primary"
5
- fab
6
- size="small"
7
- @click.c.capture.native.stop="openPrinterURL()"
8
- >
9
- <v-icon>directions</v-icon>
10
- </v-btn>
11
- </template>
12
-
13
- <script lang="ts" setup>
14
- import { PrinterDto } from '@/models/printers/printer.model'
15
- import { PrintersService } from '@/backend'
16
-
17
- const props = defineProps<{
18
- printer: PrinterDto
19
- }>()
20
-
21
- async function openPrinterURL() {
22
- PrintersService.openPrinterURL(props.printer.printerURL)
23
- }
24
- </script>
@@ -1,50 +0,0 @@
1
- <template>
2
- <v-btn
3
- color="secondary"
4
- @click="getFiles()"
5
- >
6
- <v-icon>refresh</v-icon>
7
- <span class="d-none d-lg-inline"> Refresh files </span>
8
- </v-btn>
9
- </template>
10
-
11
- <script lang="ts">
12
- import { usePrinterStore } from '@/store/printer.store'
13
- import { defineComponent, PropType } from 'vue'
14
- import { PrinterDto } from '@/models/printers/printer.model'
15
-
16
- interface Data {
17
- property: number
18
- }
19
-
20
- export default defineComponent({
21
- name: 'RefreshFilesAction',
22
- components: {},
23
- props: {
24
- printer: Object as PropType<PrinterDto>
25
- },
26
- setup: () => {
27
- return {
28
- printersStore: usePrinterStore()
29
- }
30
- },
31
-
32
- data: (): Data => ({
33
- property: 0
34
- }),
35
-
36
- computed: {},
37
-
38
- watch: {},
39
-
40
- async created() {},
41
- async mounted() {},
42
- methods: {
43
- async getFiles() {
44
- if (!this.printer) return
45
-
46
- await this.printersStore.loadPrinterFiles(this.printer.id, false)
47
- }
48
- }
49
- })
50
- </script>
@@ -1,36 +0,0 @@
1
- <template>
2
- <v-tooltip location="top">
3
- <template #activator="{ props }">
4
- <v-btn
5
- v-bind="props"
6
- class="ma-2"
7
- color="primary"
8
- fab
9
- size="small"
10
- @click.c.capture.native.stop="syncPrinterName()"
11
- >
12
- <v-icon>badge</v-icon>
13
- </v-btn>
14
- </template>
15
- <template #default> Set OctoPrints name to the FDM Monster Name </template>
16
- </v-tooltip>
17
- </template>
18
-
19
- <script lang="ts" setup>
20
- import { PrinterDto } from '@/models/printers/printer.model'
21
- import { PrinterSettingsService } from '@/backend/printer-settings.service'
22
- import { useSnackbar } from '@/shared/snackbar.composable'
23
-
24
- const props = defineProps<{
25
- printer: PrinterDto
26
- }>()
27
-
28
- const snackbar = useSnackbar()
29
-
30
- async function syncPrinterName() {
31
- await PrinterSettingsService.syncPrinterName(props.printer.id)
32
- snackbar.openInfoMessage({
33
- title: 'Synced printer name to OctoPrint'
34
- })
35
- }
36
- </script>
@@ -1,131 +0,0 @@
1
- <template>
2
- <BaseDialog
3
- :id="dialog.dialogId"
4
- max-width="800px"
5
- @escape="closeDialog()"
6
- >
7
- <v-card>
8
- <v-card-title>
9
- <span class="text-h5">
10
- <v-avatar
11
- class="mr-2"
12
- color="primary"
13
- size="56"
14
- >
15
- {{ avatarInitials }}
16
- </v-avatar>
17
- <span v-if="isUpdating"> Updating Camera </span>
18
- <span v-else> New Camera </span>
19
- </span>
20
- </v-card-title>
21
-
22
- <v-card-text>
23
- <v-container grid-list-md>
24
- <v-layout wrap>
25
- <v-text-field
26
- v-model="cameraStream.name"
27
- label="Name"
28
- required
29
- />
30
- <v-text-field
31
- v-model="cameraStream.streamURL"
32
- label="Url (MJPEG)"
33
- required
34
- />
35
- </v-layout>
36
- </v-container>
37
- </v-card-text>
38
-
39
- <v-card-actions>
40
- <v-spacer />
41
- <v-btn
42
- color="primary-darken-2"
43
- @click="close"
44
- >
45
- Cancel
46
- </v-btn>
47
- <v-btn
48
- color="primary"
49
- @click="isUpdating ? updateCamera() : createCamera()"
50
- >
51
- {{ isUpdating ? 'Update' : 'Create' }}
52
- </v-btn>
53
- </v-card-actions>
54
- </v-card>
55
- </BaseDialog>
56
- </template>
57
-
58
- <script lang="ts" setup>
59
- import { computed, ref, watch } from 'vue'
60
- import { DialogName } from '@/components/Generic/Dialogs/dialog.constants'
61
- import { useDialog } from '@/shared/dialog.composable'
62
- import {
63
- CameraStream,
64
- CameraWithPrinter
65
- } from '@/models/camera-streams/camera-stream'
66
- import { CameraStreamService } from '@/backend/camera-stream.service'
67
- import { useQueryClient } from '@tanstack/vue-query'
68
-
69
- const queryClient = useQueryClient()
70
- const dialog = useDialog(DialogName.AddOrUpdateCameraDialog)
71
-
72
- const avatarInitials = computed(() => {
73
- return 'C'
74
- })
75
-
76
- const cameraStream = ref<CameraStream>({
77
- name: '',
78
- streamURL: ''
79
- })
80
-
81
- const isDialogUpdate = () => dialog.context()?.addOrUpdate === 'update'
82
-
83
- const isUpdating = computed(() => {
84
- return isDialogUpdate()
85
- })
86
-
87
- watch(
88
- () => dialog.context(),
89
- (context) => {
90
- if (!context || context?.addOrUpdate !== 'update') {
91
- cameraStream.value.streamURL = ''
92
- cameraStream.value.name = ''
93
- return
94
- }
95
-
96
- const stream = queryClient
97
- .getQueryData<CameraWithPrinter[]>(['cameraStream'])
98
- ?.find(
99
- (cameraStream) => cameraStream.cameraStream.id === context.cameraId
100
- )
101
- cameraStream.value.name = stream?.cameraStream.name
102
- cameraStream.value.streamURL = stream?.cameraStream.streamURL || ''
103
- }
104
- )
105
-
106
- function closeDialog() {
107
- dialog.closeDialog()
108
- }
109
-
110
- async function createCamera() {
111
- await CameraStreamService.createCameraStream({
112
- streamURL: cameraStream.value.streamURL,
113
- name: cameraStream.value.name
114
- })
115
- await queryClient.refetchQueries({ queryKey: ['cameraStream'] })
116
- dialog.closeDialog()
117
- }
118
-
119
- async function updateCamera() {
120
- await CameraStreamService.updateCameraStream(dialog.context()?.cameraId, {
121
- streamURL: cameraStream.value.streamURL,
122
- name: cameraStream.value.name
123
- })
124
- await queryClient.refetchQueries({ queryKey: ['cameraStream'] })
125
- dialog.closeDialog()
126
- }
127
-
128
- function close() {
129
- dialog.closeDialog()
130
- }
131
- </script>
@@ -1,141 +0,0 @@
1
- <template>
2
- <BaseDialog
3
- :id="dialog.dialogId"
4
- :max-width="'700px'"
5
- @escape="closeDialog"
6
- >
7
- <v-card>
8
- <v-card-title>
9
- <span class="text-h5">
10
- <v-avatar
11
- color="primary"
12
- size="56"
13
- >{{ avatarInitials }}</v-avatar
14
- >
15
- New Floor
16
- </span>
17
- </v-card-title>
18
- <v-card-text>
19
- <v-row>
20
- <v-col :cols="12">
21
- <v-container>
22
- <v-row>
23
- <v-col
24
- v-if="formData"
25
- cols="12"
26
- md="6"
27
- >
28
- <v-text-field
29
- v-model="formData.name"
30
- autofocus
31
- label="Floor name*"
32
- required
33
- />
34
- <v-text-field
35
- v-model="formData.floor"
36
- label="Floor number"
37
- required
38
- type="number"
39
- />
40
- </v-col>
41
- </v-row>
42
- </v-container>
43
- </v-col>
44
- </v-row>
45
- </v-card-text>
46
- <v-card-actions>
47
- <em class="text-red"> * indicates required field </em>
48
- <v-spacer />
49
- <v-btn
50
- variant="text"
51
- @click="closeDialog"
52
- >Close</v-btn
53
- >
54
- <v-btn
55
- color="blue-darken-1"
56
- variant="text"
57
- @click="submit"
58
- >Create</v-btn
59
- >
60
- </v-card-actions>
61
- </v-card>
62
- </BaseDialog>
63
- </template>
64
-
65
- <script lang="ts" setup>
66
- import { inject, ref, computed, watch, onMounted } from 'vue'
67
- import {
68
- generateInitials,
69
- newRandomNamePair
70
- } from '@/shared/noun-adjectives.data'
71
- import { FloorService } from '@/backend/floor.service'
72
- import { DialogName } from '@/components/Generic/Dialogs/dialog.constants'
73
- import { useFloorStore } from '@/store/floor.store'
74
- import { useDialog } from '@/shared/dialog.composable'
75
- import { AppConstants } from '@/shared/app.constants'
76
- import {
77
- getDefaultCreateFloor,
78
- PreCreateFloor
79
- } from '@/models/floors/floor.model'
80
- import { useSnackbar } from '@/shared/snackbar.composable'
81
-
82
- const dialog = useDialog(DialogName.AddOrUpdateFloorDialog)
83
- const floorStore = useFloorStore()
84
- const appConstants = inject('appConstants') as AppConstants
85
- const snackbar = useSnackbar()
86
-
87
- const formData = ref<PreCreateFloor>(getDefaultCreateFloor())
88
-
89
- const printerFloorId = computed(() => dialog.context()?.printerFloorId)
90
-
91
- const avatarInitials = computed(() => {
92
- return formData.value ? generateInitials(formData.value.name) : ''
93
- })
94
-
95
- const validateFormData = () => {
96
- if (
97
- !formData.value.name ||
98
- formData.value.name.length < appConstants.minPrinterFloorNameLength
99
- ) {
100
- snackbar.openErrorMessage({ title: 'Invalid floor name' })
101
- return false
102
- }
103
- if (!Number.isInteger(Number(formData.value.floor))) {
104
- snackbar.openErrorMessage({ title: 'Floor number must be an integer' })
105
- return false
106
- }
107
- return true
108
- }
109
-
110
- const submit = async () => {
111
- if (!validateFormData()) return
112
- const floorData = FloorService.convertCreateFormToFloor(formData.value)
113
- await floorStore.createFloor(floorData)
114
- snackbar.openInfoMessage({ title: `Floor ${floorData.name} created` })
115
- formData.value.name = newRandomNamePair()
116
- const maxIndex = Math.max(...floorStore.floors.map((f) => f.floor)) + 1
117
- formData.value.floor = maxIndex.toString()
118
- closeDialog()
119
- }
120
-
121
- const closeDialog = () => {
122
- dialog.closeDialog()
123
- }
124
-
125
- watch(printerFloorId, (val) => {
126
- if (val) {
127
- const printerFloor = floorStore.floor(val)
128
- formData.value = FloorService.convertPrinterFloorToCreateForm(printerFloor)
129
- }
130
- })
131
-
132
- onMounted(() => {
133
- if (printerFloorId.value) {
134
- const crudeData = floorStore.floor(printerFloorId.value)
135
- formData.value = FloorService.convertPrinterFloorToCreateForm(crudeData)
136
- } else if (floorStore.floors?.length) {
137
- const maxIndex = Math.max(...floorStore.floors.map((pf) => pf.floor)) + 1
138
- formData.value.floor = maxIndex.toString()
139
- }
140
- })
141
- </script>