@nvent-addon/app 0.4.5

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 (99) hide show
  1. package/dist/module.d.mts +6 -0
  2. package/dist/module.json +9 -0
  3. package/dist/module.mjs +42 -0
  4. package/dist/runtime/app/assets/vueflow.css +1 -0
  5. package/dist/runtime/app/components/ConfirmDialog.d.vue.ts +33 -0
  6. package/dist/runtime/app/components/ConfirmDialog.vue +121 -0
  7. package/dist/runtime/app/components/ConfirmDialog.vue.d.ts +33 -0
  8. package/dist/runtime/app/components/FlowDiagram.d.vue.ts +65 -0
  9. package/dist/runtime/app/components/FlowDiagram.vue +341 -0
  10. package/dist/runtime/app/components/FlowDiagram.vue.d.ts +65 -0
  11. package/dist/runtime/app/components/FlowNodeCard.d.vue.ts +29 -0
  12. package/dist/runtime/app/components/FlowNodeCard.vue +158 -0
  13. package/dist/runtime/app/components/FlowNodeCard.vue.d.ts +29 -0
  14. package/dist/runtime/app/components/FlowRunOverview.d.vue.ts +17 -0
  15. package/dist/runtime/app/components/FlowRunOverview.vue +188 -0
  16. package/dist/runtime/app/components/FlowRunOverview.vue.d.ts +17 -0
  17. package/dist/runtime/app/components/FlowRunStatusBadge.d.vue.ts +18 -0
  18. package/dist/runtime/app/components/FlowRunStatusBadge.vue +74 -0
  19. package/dist/runtime/app/components/FlowRunStatusBadge.vue.d.ts +18 -0
  20. package/dist/runtime/app/components/FlowRunTimeline.d.vue.ts +12 -0
  21. package/dist/runtime/app/components/FlowRunTimeline.vue +127 -0
  22. package/dist/runtime/app/components/FlowRunTimeline.vue.d.ts +12 -0
  23. package/dist/runtime/app/components/FlowScheduleDialog.d.vue.ts +16 -0
  24. package/dist/runtime/app/components/FlowScheduleDialog.vue +226 -0
  25. package/dist/runtime/app/components/FlowScheduleDialog.vue.d.ts +16 -0
  26. package/dist/runtime/app/components/FlowSchedulesList.d.vue.ts +12 -0
  27. package/dist/runtime/app/components/FlowSchedulesList.vue +99 -0
  28. package/dist/runtime/app/components/FlowSchedulesList.vue.d.ts +12 -0
  29. package/dist/runtime/app/components/FlowStepSelector.d.vue.ts +22 -0
  30. package/dist/runtime/app/components/FlowStepSelector.vue +238 -0
  31. package/dist/runtime/app/components/FlowStepSelector.vue.d.ts +22 -0
  32. package/dist/runtime/app/components/JobScheduling.d.vue.ts +6 -0
  33. package/dist/runtime/app/components/JobScheduling.vue +203 -0
  34. package/dist/runtime/app/components/JobScheduling.vue.d.ts +6 -0
  35. package/dist/runtime/app/components/ListItem.d.vue.ts +23 -0
  36. package/dist/runtime/app/components/ListItem.vue +70 -0
  37. package/dist/runtime/app/components/ListItem.vue.d.ts +23 -0
  38. package/dist/runtime/app/components/QueueConfigDetails.d.vue.ts +45 -0
  39. package/dist/runtime/app/components/QueueConfigDetails.vue +412 -0
  40. package/dist/runtime/app/components/QueueConfigDetails.vue.d.ts +45 -0
  41. package/dist/runtime/app/components/StatCounter.d.vue.ts +9 -0
  42. package/dist/runtime/app/components/StatCounter.vue +25 -0
  43. package/dist/runtime/app/components/StatCounter.vue.d.ts +9 -0
  44. package/dist/runtime/app/components/TimelineList.d.vue.ts +7 -0
  45. package/dist/runtime/app/components/TimelineList.vue +211 -0
  46. package/dist/runtime/app/components/TimelineList.vue.d.ts +7 -0
  47. package/dist/runtime/app/components/nhealth/component-router.d.vue.ts +46 -0
  48. package/dist/runtime/app/components/nhealth/component-router.vue +26 -0
  49. package/dist/runtime/app/components/nhealth/component-router.vue.d.ts +46 -0
  50. package/dist/runtime/app/components/nhealth/component-shell.d.vue.ts +24 -0
  51. package/dist/runtime/app/components/nhealth/component-shell.vue +89 -0
  52. package/dist/runtime/app/components/nhealth/component-shell.vue.d.ts +24 -0
  53. package/dist/runtime/app/composables/useAnalyzedFlows.d.ts +14 -0
  54. package/dist/runtime/app/composables/useAnalyzedFlows.js +8 -0
  55. package/dist/runtime/app/composables/useComponentRouter.d.ts +38 -0
  56. package/dist/runtime/app/composables/useComponentRouter.js +240 -0
  57. package/dist/runtime/app/composables/useFlowRunTimeline.d.ts +82 -0
  58. package/dist/runtime/app/composables/useFlowRunTimeline.js +67 -0
  59. package/dist/runtime/app/composables/useFlowRuns.d.ts +18 -0
  60. package/dist/runtime/app/composables/useFlowRuns.js +32 -0
  61. package/dist/runtime/app/composables/useFlowRunsInfinite.d.ts +24 -0
  62. package/dist/runtime/app/composables/useFlowRunsInfinite.js +123 -0
  63. package/dist/runtime/app/composables/useFlowRunsPolling.d.ts +9 -0
  64. package/dist/runtime/app/composables/useFlowRunsPolling.js +33 -0
  65. package/dist/runtime/app/composables/useFlowState.d.ts +127 -0
  66. package/dist/runtime/app/composables/useFlowState.js +225 -0
  67. package/dist/runtime/app/composables/useFlowWebSocket.d.ts +27 -0
  68. package/dist/runtime/app/composables/useFlowWebSocket.js +222 -0
  69. package/dist/runtime/app/composables/useFlowsNavigation.d.ts +10 -0
  70. package/dist/runtime/app/composables/useFlowsNavigation.js +58 -0
  71. package/dist/runtime/app/composables/useQueueJobs.d.ts +26 -0
  72. package/dist/runtime/app/composables/useQueueJobs.js +20 -0
  73. package/dist/runtime/app/composables/useQueueUpdates.d.ts +24 -0
  74. package/dist/runtime/app/composables/useQueueUpdates.js +54 -0
  75. package/dist/runtime/app/composables/useQueues.d.ts +45 -0
  76. package/dist/runtime/app/composables/useQueues.js +26 -0
  77. package/dist/runtime/app/composables/useQueuesLive.d.ts +16 -0
  78. package/dist/runtime/app/composables/useQueuesLive.js +62 -0
  79. package/dist/runtime/app/composables/useQueuesWebSocket.d.ts +17 -0
  80. package/dist/runtime/app/composables/useQueuesWebSocket.js +159 -0
  81. package/dist/runtime/app/pages/flows/index.d.vue.ts +3 -0
  82. package/dist/runtime/app/pages/flows/index.vue +683 -0
  83. package/dist/runtime/app/pages/flows/index.vue.d.ts +3 -0
  84. package/dist/runtime/app/pages/index.d.vue.ts +3 -0
  85. package/dist/runtime/app/pages/index.vue +34 -0
  86. package/dist/runtime/app/pages/index.vue.d.ts +3 -0
  87. package/dist/runtime/app/pages/queues/index.d.vue.ts +3 -0
  88. package/dist/runtime/app/pages/queues/index.vue +229 -0
  89. package/dist/runtime/app/pages/queues/index.vue.d.ts +3 -0
  90. package/dist/runtime/app/pages/queues/job.d.vue.ts +3 -0
  91. package/dist/runtime/app/pages/queues/job.vue +262 -0
  92. package/dist/runtime/app/pages/queues/job.vue.d.ts +3 -0
  93. package/dist/runtime/app/pages/queues/jobs.d.vue.ts +3 -0
  94. package/dist/runtime/app/pages/queues/jobs.vue +291 -0
  95. package/dist/runtime/app/pages/queues/jobs.vue.d.ts +3 -0
  96. package/dist/runtime/app/plugins/vueflow.client.d.ts +2 -0
  97. package/dist/runtime/app/plugins/vueflow.client.js +11 -0
  98. package/dist/types.d.mts +7 -0
  99. package/package.json +47 -0
@@ -0,0 +1,291 @@
1
+ <template>
2
+ <div class="h-full flex flex-col overflow-hidden">
3
+ <!-- Header -->
4
+ <div class="border-b border-gray-200 dark:border-gray-800 px-6 py-3 shrink-0">
5
+ <div class="flex items-center justify-between">
6
+ <div class="flex items-center gap-4">
7
+ <UButton
8
+ icon="i-lucide-arrow-left"
9
+ size="xs"
10
+ color="neutral"
11
+ variant="ghost"
12
+ @click="back"
13
+ />
14
+ <div>
15
+ <h1 class="text-lg font-semibold">
16
+ {{ queueName }}
17
+ </h1>
18
+ <p class="text-xs text-gray-500">
19
+ Queue Jobs
20
+ </p>
21
+ </div>
22
+ </div>
23
+ <div class="flex items-center gap-3">
24
+ <div
25
+ v-if="isConnected"
26
+ class="flex items-center gap-1.5 text-xs text-emerald-600 dark:text-emerald-400"
27
+ >
28
+ <div class="w-2 h-2 rounded-full bg-emerald-500 animate-pulse" />
29
+ <span>Live</span>
30
+ <span
31
+ v-if="isAutoRefreshing"
32
+ class="text-[10px] text-gray-400"
33
+ >
34
+ (updating...)
35
+ </span>
36
+ </div>
37
+ <div
38
+ v-else-if="isReconnecting"
39
+ class="flex items-center gap-1.5 text-xs text-amber-600 dark:text-amber-400"
40
+ >
41
+ <div class="w-2 h-2 rounded-full bg-amber-500 animate-pulse" />
42
+ <span>Reconnecting...</span>
43
+ </div>
44
+ <UBadge
45
+ :label="counts?.active.toString() || '0'"
46
+ color="warning"
47
+ variant="subtle"
48
+ >
49
+ <template #leading>
50
+ Active
51
+ </template>
52
+ </UBadge>
53
+ <UBadge
54
+ :label="counts?.waiting.toString() || '0'"
55
+ color="info"
56
+ variant="subtle"
57
+ >
58
+ <template #leading>
59
+ Waiting
60
+ </template>
61
+ </UBadge>
62
+ <UBadge
63
+ :label="counts?.completed.toString() || '0'"
64
+ color="success"
65
+ variant="subtle"
66
+ >
67
+ <template #leading>
68
+ Completed
69
+ </template>
70
+ </UBadge>
71
+ <UBadge
72
+ :label="counts?.failed.toString() || '0'"
73
+ color="error"
74
+ variant="subtle"
75
+ >
76
+ <template #leading>
77
+ Failed
78
+ </template>
79
+ </UBadge>
80
+ <USelectMenu
81
+ v-model="selectedStateOption"
82
+ :items="stateOptions"
83
+ placeholder="All States"
84
+ size="xs"
85
+ class="w-32"
86
+ />
87
+ <UButton
88
+ icon="i-lucide-refresh-cw"
89
+ size="xs"
90
+ color="neutral"
91
+ variant="ghost"
92
+ :loading="status === 'pending'"
93
+ @click.prevent="onRefresh"
94
+ >
95
+ Refresh
96
+ </UButton>
97
+ </div>
98
+ </div>
99
+ </div>
100
+
101
+ <!-- Main Content -->
102
+ <div class="flex-1 min-h-0 overflow-hidden flex flex-col">
103
+ <div
104
+ v-if="!data || !data.jobs || data.jobs.length === 0"
105
+ class="flex-1 flex items-center justify-center text-sm text-gray-400"
106
+ >
107
+ No jobs found
108
+ </div>
109
+ <template v-else>
110
+ <div class="flex-1 min-h-0 p-4 overflow-auto">
111
+ <UTable
112
+ ref="table"
113
+ v-model:pagination="pagination"
114
+ :data="data.jobs"
115
+ :columns="columns"
116
+ :loading="status === 'pending'"
117
+ :pagination-options="{
118
+ getPaginationRowModel: getPaginationRowModel()
119
+ }"
120
+ :ui="{
121
+ base: 'table-fixed border-separate border-spacing-0',
122
+ thead: '[&>tr]:bg-elevated/50 [&>tr]:after:content-none',
123
+ tbody: '[&>tr]:last:[&>td]:border-b-0',
124
+ th: 'py-2 first:rounded-l-lg last:rounded-r-lg border-y border-default first:border-l last:border-r',
125
+ td: 'border-b border-default',
126
+ separator: 'h-0'
127
+ }"
128
+ />
129
+ </div>
130
+
131
+ <div class="flex items-center justify-between gap-3 border-t border-default p-4 shrink-0">
132
+ <div class="text-sm text-muted">
133
+ Showing {{ Math.min(pagination.pageIndex * pagination.pageSize + pagination.pageSize, data.jobs.length) }} of {{ data.jobs.length }} job(s)
134
+ <span
135
+ v-if="selectedState"
136
+ class="text-gray-400"
137
+ >
138
+ (filtered by {{ selectedStateOption?.label }})
139
+ </span>
140
+ </div>
141
+ <div class="flex items-center gap-1.5">
142
+ <UPagination
143
+ :default-page="(table?.tableApi?.getState().pagination.pageIndex || 0) + 1"
144
+ :items-per-page="table?.tableApi?.getState().pagination.pageSize || 20"
145
+ :total="data.jobs.length"
146
+ @update:page="(p) => table?.tableApi?.setPageIndex(p - 1)"
147
+ />
148
+ </div>
149
+ </div>
150
+ </template>
151
+ </div>
152
+ </div>
153
+ </template>
154
+
155
+ <script setup>
156
+ import { ref, computed, watch, resolveComponent, useTemplateRef, h } from "#imports";
157
+ import { getPaginationRowModel } from "@tanstack/table-core";
158
+ import { UTable, UButton, UBadge, UPagination, USelectMenu } from "#components";
159
+ import { useQueueJobs } from "../../composables/useQueueJobs";
160
+ import { useQueueUpdates } from "../../composables/useQueueUpdates";
161
+ import { useComponentRouter } from "../../composables/useComponentRouter";
162
+ const UBadgeComponent = resolveComponent("UBadge");
163
+ const UButtonComponent = resolveComponent("UButton");
164
+ const router = useComponentRouter();
165
+ const queueName = computed(() => router.route.value?.params?.name || "");
166
+ const stateOptions = [
167
+ { label: "All States", value: null },
168
+ { label: "Waiting", value: "waiting" },
169
+ { label: "Active", value: "active" },
170
+ { label: "Completed", value: "completed" },
171
+ { label: "Failed", value: "failed" },
172
+ { label: "Delayed", value: "delayed" },
173
+ { label: "Paused", value: "paused" }
174
+ ];
175
+ const selectedStateOption = ref(stateOptions[0]);
176
+ const selectedState = computed(() => selectedStateOption.value?.value ?? null);
177
+ const { data, refresh, status } = useQueueJobs(queueName, selectedState);
178
+ const { counts, isConnected, isReconnecting, shouldRefreshJobs, resetRefreshFlag } = useQueueUpdates(queueName);
179
+ const isAutoRefreshing = ref(false);
180
+ watch(selectedState, () => {
181
+ if (table.value?.tableApi) {
182
+ table.value.tableApi.setPageIndex(0);
183
+ }
184
+ });
185
+ watch(shouldRefreshJobs, async (shouldRefresh) => {
186
+ if (shouldRefresh) {
187
+ isAutoRefreshing.value = true;
188
+ await refresh();
189
+ resetRefreshFlag();
190
+ setTimeout(() => {
191
+ isAutoRefreshing.value = false;
192
+ }, 500);
193
+ }
194
+ });
195
+ const table = useTemplateRef("table");
196
+ const pagination = ref({
197
+ pageIndex: 0,
198
+ pageSize: 20
199
+ });
200
+ const onRefresh = async () => {
201
+ await refresh();
202
+ };
203
+ const back = () => {
204
+ router.push("/queues");
205
+ };
206
+ const selectJob = (jobId) => {
207
+ router.push(`/queues/${queueName.value}/jobs/${jobId}`);
208
+ };
209
+ const columns = [
210
+ {
211
+ accessorKey: "id",
212
+ header: "Job ID",
213
+ cell: ({ row }) => {
214
+ const id = row.original.id;
215
+ return h("div", {
216
+ class: "font-mono text-xs cursor-pointer hover:underline",
217
+ onClick: () => selectJob(row.original.id)
218
+ }, id.length > 16 ? `${id.substring(0, 8)}...${id.substring(id.length - 8)}` : id);
219
+ }
220
+ },
221
+ {
222
+ accessorKey: "name",
223
+ header: "Name",
224
+ cell: ({ row }) => {
225
+ return h("div", {
226
+ class: "font-medium cursor-pointer hover:underline",
227
+ onClick: () => selectJob(row.original.id)
228
+ }, row.original.name);
229
+ }
230
+ },
231
+ {
232
+ accessorKey: "state",
233
+ header: "State",
234
+ cell: ({ row }) => {
235
+ const state = row.original.state;
236
+ const colorMap = {
237
+ waiting: "info",
238
+ active: "warning",
239
+ completed: "success",
240
+ failed: "error",
241
+ delayed: "secondary",
242
+ paused: "warning"
243
+ };
244
+ return h(UBadgeComponent, {
245
+ label: state || "unknown",
246
+ color: colorMap[state || ""] || "neutral",
247
+ variant: "subtle",
248
+ class: "capitalize"
249
+ });
250
+ }
251
+ },
252
+ {
253
+ accessorKey: "timestamp",
254
+ header: "Created",
255
+ cell: ({ row }) => {
256
+ const timestamp = row.original.timestamp;
257
+ if (!timestamp) return h("div", { class: "text-gray-400 text-xs" }, "-");
258
+ const date = new Date(timestamp);
259
+ return h(
260
+ "div",
261
+ { class: "text-xs" },
262
+ date.toLocaleString("de-DE", {
263
+ timeZone: "Europe/Berlin",
264
+ day: "2-digit",
265
+ month: "2-digit",
266
+ year: "numeric",
267
+ hour: "2-digit",
268
+ minute: "2-digit",
269
+ second: "2-digit"
270
+ })
271
+ );
272
+ }
273
+ },
274
+ {
275
+ id: "actions",
276
+ header: "",
277
+ cell: ({ row }) => {
278
+ return h(UButtonComponent, {
279
+ icon: "i-lucide-arrow-right",
280
+ size: "xs",
281
+ color: "neutral",
282
+ variant: "ghost",
283
+ square: true,
284
+ onClick: () => {
285
+ selectJob(row.original.id);
286
+ }
287
+ });
288
+ }
289
+ }
290
+ ];
291
+ </script>
@@ -0,0 +1,3 @@
1
+ declare const __VLS_export: import("vue").DefineComponent<{}, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<{}> & Readonly<{}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>;
2
+ declare const _default: typeof __VLS_export;
3
+ export default _default;
@@ -0,0 +1,2 @@
1
+ declare const _default: import("#app").Plugin<Record<string, unknown>> & import("#app").ObjectPlugin<Record<string, unknown>>;
2
+ export default _default;
@@ -0,0 +1,11 @@
1
+ import { defineNuxtPlugin } from "#imports";
2
+ import { VueFlow } from "@vue-flow/core";
3
+ import { Controls } from "@vue-flow/controls";
4
+ import { MiniMap } from "@vue-flow/minimap";
5
+ import { Background } from "@vue-flow/background";
6
+ export default defineNuxtPlugin((nuxtApp) => {
7
+ nuxtApp.vueApp.component("VueFlow", VueFlow);
8
+ nuxtApp.vueApp.component("Controls", Controls);
9
+ nuxtApp.vueApp.component("MiniMap", MiniMap);
10
+ nuxtApp.vueApp.component("Background", Background);
11
+ });
@@ -0,0 +1,7 @@
1
+ import type { NuxtModule } from '@nuxt/schema'
2
+
3
+ import type { default as Module } from './module.mjs'
4
+
5
+ export type ModuleOptions = typeof Module extends NuxtModule<infer O> ? Partial<O> : Record<string, any>
6
+
7
+ export { default } from './module.mjs'
package/package.json ADDED
@@ -0,0 +1,47 @@
1
+ {
2
+ "name": "@nvent-addon/app",
3
+ "version": "0.4.5",
4
+ "description": "nvent app module for Nuxt.js",
5
+ "repository": "DevJoghurt/nvent",
6
+ "license": "MIT",
7
+ "type": "module",
8
+ "exports": {
9
+ ".": {
10
+ "types": "./dist/types.d.mts",
11
+ "import": "./dist/module.mjs"
12
+ }
13
+ },
14
+ "main": "./dist/module.mjs",
15
+ "types": "./dist/types.d.mts",
16
+ "files": [
17
+ "dist"
18
+ ],
19
+ "scripts": {
20
+ "build": "nuxt-module-build build",
21
+ "dev": "nuxt-module-build build --stub",
22
+ "prepack": "pnpm build",
23
+ "test": "vitest"
24
+ },
25
+ "dependencies": {
26
+ "@iconify-json/devicon": "^1.2.49",
27
+ "@iconify-json/heroicons": "1.2.3",
28
+ "@iconify-json/lucide": "^1.2.73",
29
+ "@nuxt/kit": "4.2.1",
30
+ "@vue-flow/background": "^1.3.2",
31
+ "@vue-flow/controls": "^1.1.3",
32
+ "@vue-flow/core": "^1.47.0",
33
+ "@vue-flow/minimap": "^1.5.4",
34
+ "defu": "^6.1.4",
35
+ "json-editor-vue": "^0.18.1",
36
+ "nuxt": "4.2.1",
37
+ "pathe": "^2.0.3",
38
+ "zod": "^4.1.12"
39
+ },
40
+ "devDependencies": {
41
+ "@nuxt/module-builder": "^1.0.2",
42
+ "@nuxt/schema": "4.2.1",
43
+ "@types/node": "^24.10.1",
44
+ "typescript": "latest",
45
+ "vitest": "^4.0.10"
46
+ }
47
+ }