@necrolab/dashboard 0.5.17 → 0.5.19
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/package.json +1 -1
- package/postinstall.js +2 -2
- package/src/components/Editors/Account/Account.vue +0 -2
- package/src/components/Editors/AdminFileEditor.vue +256 -13
- package/src/components/Editors/ProxyFileEditor.vue +99 -7
- package/src/composables/useDropdownPosition.js +1 -1
- package/src/composables/useFormValidation.js +0 -8
- package/src/composables/useNotchHandling.js +0 -1
- package/src/stores/connection.js +3 -1
- package/src/stores/logger.js +4 -4
- package/src/views/Console.vue +3 -4
- package/src/views/Editor.vue +0 -2
- package/src/views/FilterBuilder.vue +2 -6
- package/src/views/Profiles.vue +1 -1
package/package.json
CHANGED
package/postinstall.js
CHANGED
|
@@ -17,7 +17,7 @@ try {
|
|
|
17
17
|
|
|
18
18
|
try {
|
|
19
19
|
// Detect if we're running inside the project itself or as a dependency
|
|
20
|
-
const isInsideProject = __dirname.includes(
|
|
20
|
+
const isInsideProject = __dirname.includes("node_modules") === false;
|
|
21
21
|
|
|
22
22
|
let distPath, versionFilePath;
|
|
23
23
|
|
|
@@ -46,7 +46,7 @@ try {
|
|
|
46
46
|
`Version mismatch (Installed: ${installedVersion}, Target: ${currentVersion}). Proceeding with build.`
|
|
47
47
|
);
|
|
48
48
|
}
|
|
49
|
-
} catch
|
|
49
|
+
} catch {
|
|
50
50
|
console.log("Could not read version file. Proceeding with build.");
|
|
51
51
|
}
|
|
52
52
|
} else {
|
|
@@ -61,8 +61,6 @@ import { useUIStore } from "@/stores/ui";
|
|
|
61
61
|
import TagLabel from "@/components/Editors/TagLabel.vue";
|
|
62
62
|
import { useRowSelection } from "@/composables/useRowSelection";
|
|
63
63
|
import { useCopyToClipboard } from "@/composables/useCopyToClipboard";
|
|
64
|
-
import { computed } from "vue";
|
|
65
|
-
import { useEnableDisable } from "@/composables/useEnableDisable";
|
|
66
64
|
|
|
67
65
|
const ui = useUIStore();
|
|
68
66
|
const { copy } = useCopyToClipboard();
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
<template>
|
|
2
|
-
<div class="admin-editor-section" :class="{ 'landscape-hidden': isHidden }">
|
|
2
|
+
<div class="admin-editor-section" :class="{ 'landscape-hidden': isHidden }" v-if="!isHidden">
|
|
3
3
|
<h5 class="text-white text-xl font-bold flex gap-x-3 mb-3">Admin Editor</h5>
|
|
4
|
-
<div class="flex
|
|
5
|
-
<div class="unified-search-group flex
|
|
4
|
+
<div class="flex items-center gap-2 w-full">
|
|
5
|
+
<div class="unified-search-group flex flex-1 dropdown-container z-dropdown-high lg:flex-initial lg:min-w-64">
|
|
6
6
|
<Dropdown
|
|
7
7
|
class="admin-file-dropdown flex-1"
|
|
8
8
|
default="Select a file"
|
|
@@ -12,15 +12,16 @@
|
|
|
12
12
|
:includeAdjacentButtons="true"
|
|
13
13
|
rightAmount="right-1" />
|
|
14
14
|
<button
|
|
15
|
-
class="refresh-button flex items-center justify-center w-9 h-10 flex-shrink-0 text-white bg-dark-400
|
|
15
|
+
class="refresh-button flex items-center justify-center w-9 h-10 flex-shrink-0 text-white bg-dark-400 hover:bg-dark-450"
|
|
16
|
+
style="transition: all 0.2s ease"
|
|
16
17
|
@click="$emit('refresh-files')"
|
|
17
18
|
title="Refresh file list">
|
|
18
19
|
<ReloadIcon class="refresh-icon icon-md" />
|
|
19
20
|
</button>
|
|
20
21
|
</div>
|
|
21
|
-
<div v-if="isEditorVisible" class="flex gap-
|
|
22
|
+
<div v-if="isEditorVisible" class="flex gap-2 flex-shrink-0">
|
|
22
23
|
<button
|
|
23
|
-
class="
|
|
24
|
+
class="editor-action-btn"
|
|
24
25
|
@click="$emit('format')"
|
|
25
26
|
v-if="isJsonFile"
|
|
26
27
|
title="Format JSON">
|
|
@@ -40,7 +41,7 @@
|
|
|
40
41
|
<path d="M21 18H7" />
|
|
41
42
|
</svg>
|
|
42
43
|
</button>
|
|
43
|
-
<button class="
|
|
44
|
+
<button class="editor-action-btn" @click="$emit('save')" title="Save File">
|
|
44
45
|
<svg
|
|
45
46
|
xmlns="http://www.w3.org/2000/svg"
|
|
46
47
|
width="16"
|
|
@@ -56,7 +57,7 @@
|
|
|
56
57
|
<polyline points="7 3 7 8 15 8" />
|
|
57
58
|
</svg>
|
|
58
59
|
</button>
|
|
59
|
-
<button class="
|
|
60
|
+
<button class="editor-action-btn" @click="$emit('close')" title="Close File">
|
|
60
61
|
<svg
|
|
61
62
|
xmlns="http://www.w3.org/2000/svg"
|
|
62
63
|
width="16"
|
|
@@ -75,9 +76,9 @@
|
|
|
75
76
|
</div>
|
|
76
77
|
|
|
77
78
|
<transition name="fade">
|
|
78
|
-
<div v-if="isEditorVisible" class="my-3 relative">
|
|
79
|
-
<div class="
|
|
80
|
-
<div class="editor-container overflow-hidden rounded-lg shadow-card bg-dark-350" :class="{ 'has-error': errorMessage }">
|
|
79
|
+
<div v-if="isEditorVisible" class="my-3 relative editor-wrapper">
|
|
80
|
+
<div :class="{ 'has-error-padding': errorMessage }">
|
|
81
|
+
<div class="editor-container overflow-hidden rounded-lg shadow-card bg-dark-350" :class="{ 'has-error': errorMessage, 'with-error-msg': errorMessage }">
|
|
81
82
|
<div class="relative w-full h-full">
|
|
82
83
|
<pre ref="codeDisplay" class="code-highlight language-json"></pre>
|
|
83
84
|
<textarea
|
|
@@ -91,7 +92,6 @@
|
|
|
91
92
|
</div>
|
|
92
93
|
</div>
|
|
93
94
|
</div>
|
|
94
|
-
|
|
95
95
|
<div v-if="errorMessage" class="error-container">
|
|
96
96
|
<div class="error-icon">
|
|
97
97
|
<svg
|
|
@@ -140,9 +140,10 @@ const isEditorVisible = computed(() => props.currentFile !== '');
|
|
|
140
140
|
const isJsonFile = computed(() => props.currentFile.endsWith('.json'));
|
|
141
141
|
|
|
142
142
|
const errorMessage = computed(() => {
|
|
143
|
-
if (!isJsonFile.value) return;
|
|
143
|
+
if (!isJsonFile.value) return null;
|
|
144
144
|
try {
|
|
145
145
|
JSON.parse(props.content);
|
|
146
|
+
return null;
|
|
146
147
|
} catch (e) {
|
|
147
148
|
return e.message;
|
|
148
149
|
}
|
|
@@ -177,3 +178,245 @@ onMounted(() => {
|
|
|
177
178
|
}
|
|
178
179
|
});
|
|
179
180
|
</script>
|
|
181
|
+
|
|
182
|
+
<style scoped>
|
|
183
|
+
.editor-action-btn {
|
|
184
|
+
@apply flex items-center justify-center w-9 h-9 rounded border-2 border-dark-550 bg-dark-400 text-white;
|
|
185
|
+
transition: all 0.2s ease;
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
.editor-action-btn:hover {
|
|
189
|
+
@apply bg-dark-450 border-dark-625;
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
.editor-action-btn svg {
|
|
193
|
+
@apply w-4 h-4;
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
.editor-wrapper {
|
|
197
|
+
max-height: calc(100vh - 380px);
|
|
198
|
+
overflow: visible;
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
.editor-container {
|
|
202
|
+
position: relative;
|
|
203
|
+
height: calc(100vh - 380px);
|
|
204
|
+
min-height: 300px;
|
|
205
|
+
max-height: calc(100vh - 380px);
|
|
206
|
+
border: 2px solid var(--color-border);
|
|
207
|
+
overflow: hidden;
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
.editor-container.has-error {
|
|
211
|
+
border-color: oklch(0.6 0.19 29);
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
.editor-container.with-error-msg {
|
|
215
|
+
height: calc(100vh - 520px);
|
|
216
|
+
max-height: calc(100vh - 520px);
|
|
217
|
+
min-height: 200px;
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
.code-highlight,
|
|
221
|
+
.code-editor {
|
|
222
|
+
position: absolute;
|
|
223
|
+
top: 0;
|
|
224
|
+
left: 0;
|
|
225
|
+
right: 0;
|
|
226
|
+
bottom: 0;
|
|
227
|
+
width: 100%;
|
|
228
|
+
height: 100%;
|
|
229
|
+
margin: 0;
|
|
230
|
+
padding: 1rem;
|
|
231
|
+
font-family: 'Courier New', Courier, monospace;
|
|
232
|
+
font-size: 14px;
|
|
233
|
+
line-height: 1.6;
|
|
234
|
+
white-space: pre;
|
|
235
|
+
word-wrap: normal;
|
|
236
|
+
overflow-wrap: normal;
|
|
237
|
+
tab-size: 4;
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
.code-highlight {
|
|
241
|
+
overflow: auto;
|
|
242
|
+
pointer-events: none;
|
|
243
|
+
background: transparent;
|
|
244
|
+
caret-color: transparent;
|
|
245
|
+
z-index: 0;
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
/* Enhanced syntax highlighting - SUPER BRIGHT for dark background */
|
|
249
|
+
.code-highlight :deep(.token.property),
|
|
250
|
+
.code-highlight :deep(.token.tag),
|
|
251
|
+
.code-highlight :deep(.token.boolean),
|
|
252
|
+
.code-highlight :deep(.token.number),
|
|
253
|
+
.code-highlight :deep(.token.constant),
|
|
254
|
+
.code-highlight :deep(.token.symbol),
|
|
255
|
+
.code-highlight :deep(.token.deleted) {
|
|
256
|
+
color: #ff6b9d !important;
|
|
257
|
+
font-weight: 500;
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
.code-highlight :deep(.token.selector),
|
|
261
|
+
.code-highlight :deep(.token.attr-name),
|
|
262
|
+
.code-highlight :deep(.token.string),
|
|
263
|
+
.code-highlight :deep(.token.char),
|
|
264
|
+
.code-highlight :deep(.token.builtin),
|
|
265
|
+
.code-highlight :deep(.token.inserted) {
|
|
266
|
+
color: #7ee8fa !important;
|
|
267
|
+
font-weight: 500;
|
|
268
|
+
}
|
|
269
|
+
|
|
270
|
+
.code-highlight :deep(.token.operator),
|
|
271
|
+
.code-highlight :deep(.token.entity),
|
|
272
|
+
.code-highlight :deep(.token.url),
|
|
273
|
+
.code-highlight :deep(.language-css .token.string),
|
|
274
|
+
.code-highlight :deep(.style .token.string) {
|
|
275
|
+
color: #5bc0eb !important;
|
|
276
|
+
}
|
|
277
|
+
|
|
278
|
+
.code-highlight :deep(.token.atrule),
|
|
279
|
+
.code-highlight :deep(.token.attr-value),
|
|
280
|
+
.code-highlight :deep(.token.keyword) {
|
|
281
|
+
color: #ffa657 !important;
|
|
282
|
+
font-weight: 600;
|
|
283
|
+
}
|
|
284
|
+
|
|
285
|
+
.code-highlight :deep(.token.function),
|
|
286
|
+
.code-highlight :deep(.token.class-name) {
|
|
287
|
+
color: #d4a5ff !important;
|
|
288
|
+
font-weight: 600;
|
|
289
|
+
}
|
|
290
|
+
|
|
291
|
+
.code-highlight :deep(.token.regex),
|
|
292
|
+
.code-highlight :deep(.token.important),
|
|
293
|
+
.code-highlight :deep(.token.variable) {
|
|
294
|
+
color: #ffc777 !important;
|
|
295
|
+
}
|
|
296
|
+
|
|
297
|
+
.code-highlight :deep(.token.punctuation) {
|
|
298
|
+
color: #c8d3f5 !important;
|
|
299
|
+
}
|
|
300
|
+
|
|
301
|
+
.code-editor {
|
|
302
|
+
background: transparent;
|
|
303
|
+
color: transparent;
|
|
304
|
+
border: none;
|
|
305
|
+
outline: none;
|
|
306
|
+
resize: none;
|
|
307
|
+
overflow: auto;
|
|
308
|
+
z-index: 1;
|
|
309
|
+
caret-color: #ffc777;
|
|
310
|
+
-webkit-text-fill-color: transparent;
|
|
311
|
+
}
|
|
312
|
+
|
|
313
|
+
.code-editor::selection {
|
|
314
|
+
background: oklch(0.5 0.15 250 / 0.5);
|
|
315
|
+
color: #fff;
|
|
316
|
+
-webkit-text-fill-color: #fff;
|
|
317
|
+
}
|
|
318
|
+
|
|
319
|
+
.error-container {
|
|
320
|
+
@apply mt-2 p-3 rounded-lg border-2 flex gap-3 items-start;
|
|
321
|
+
background: oklch(0.25 0.02 29);
|
|
322
|
+
border-color: oklch(0.5 0.15 29);
|
|
323
|
+
max-width: 100%;
|
|
324
|
+
word-wrap: break-word;
|
|
325
|
+
overflow-wrap: break-word;
|
|
326
|
+
max-height: 120px;
|
|
327
|
+
overflow-y: auto;
|
|
328
|
+
}
|
|
329
|
+
|
|
330
|
+
.error-icon {
|
|
331
|
+
@apply flex-shrink-0 text-error-400;
|
|
332
|
+
}
|
|
333
|
+
|
|
334
|
+
.error-content {
|
|
335
|
+
@apply flex-1;
|
|
336
|
+
}
|
|
337
|
+
|
|
338
|
+
.error-title {
|
|
339
|
+
@apply text-sm font-semibold text-error-300 mb-1;
|
|
340
|
+
}
|
|
341
|
+
|
|
342
|
+
.error-text {
|
|
343
|
+
@apply text-xs text-error-300;
|
|
344
|
+
}
|
|
345
|
+
|
|
346
|
+
/* Tablet adjustments */
|
|
347
|
+
@media (max-width: 1024px) {
|
|
348
|
+
.editor-wrapper {
|
|
349
|
+
max-height: calc(100vh - 350px);
|
|
350
|
+
}
|
|
351
|
+
|
|
352
|
+
.editor-container {
|
|
353
|
+
height: calc(100vh - 350px);
|
|
354
|
+
max-height: calc(100vh - 350px);
|
|
355
|
+
min-height: 280px;
|
|
356
|
+
}
|
|
357
|
+
|
|
358
|
+
.editor-container.with-error-msg {
|
|
359
|
+
height: calc(100vh - 480px);
|
|
360
|
+
max-height: calc(100vh - 480px);
|
|
361
|
+
min-height: 180px;
|
|
362
|
+
}
|
|
363
|
+
}
|
|
364
|
+
|
|
365
|
+
/* Mobile adjustments */
|
|
366
|
+
@media (max-width: 768px) {
|
|
367
|
+
.editor-wrapper {
|
|
368
|
+
max-height: calc(100vh - 320px);
|
|
369
|
+
}
|
|
370
|
+
|
|
371
|
+
.editor-container {
|
|
372
|
+
height: calc(100vh - 320px);
|
|
373
|
+
max-height: calc(100vh - 320px);
|
|
374
|
+
min-height: 250px;
|
|
375
|
+
}
|
|
376
|
+
|
|
377
|
+
.editor-container.with-error-msg {
|
|
378
|
+
height: calc(100vh - 440px);
|
|
379
|
+
max-height: calc(100vh - 440px);
|
|
380
|
+
min-height: 150px;
|
|
381
|
+
}
|
|
382
|
+
|
|
383
|
+
.code-highlight,
|
|
384
|
+
.code-editor {
|
|
385
|
+
font-size: 13px;
|
|
386
|
+
padding: 0.75rem;
|
|
387
|
+
line-height: 1.5;
|
|
388
|
+
}
|
|
389
|
+
|
|
390
|
+
.error-container {
|
|
391
|
+
max-height: 100px;
|
|
392
|
+
}
|
|
393
|
+
}
|
|
394
|
+
|
|
395
|
+
@media (max-width: 480px) {
|
|
396
|
+
.editor-wrapper {
|
|
397
|
+
max-height: calc(100vh - 300px);
|
|
398
|
+
}
|
|
399
|
+
|
|
400
|
+
.editor-container {
|
|
401
|
+
height: calc(100vh - 300px);
|
|
402
|
+
max-height: calc(100vh - 300px);
|
|
403
|
+
min-height: 200px;
|
|
404
|
+
}
|
|
405
|
+
|
|
406
|
+
.editor-container.with-error-msg {
|
|
407
|
+
height: calc(100vh - 400px);
|
|
408
|
+
max-height: calc(100vh - 400px);
|
|
409
|
+
min-height: 120px;
|
|
410
|
+
}
|
|
411
|
+
|
|
412
|
+
.code-highlight,
|
|
413
|
+
.code-editor {
|
|
414
|
+
font-size: 12px;
|
|
415
|
+
padding: 0.5rem;
|
|
416
|
+
}
|
|
417
|
+
|
|
418
|
+
.error-container {
|
|
419
|
+
max-height: 80px;
|
|
420
|
+
}
|
|
421
|
+
}
|
|
422
|
+
</style>
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
<template>
|
|
2
|
-
<div class="proxy-editor-section" :class="{ 'landscape-hidden': isHidden }">
|
|
2
|
+
<div class="proxy-editor-section" :class="{ 'landscape-hidden': isHidden }" v-if="!isHidden">
|
|
3
3
|
<h5 class="text-white text-xl font-bold flex gap-x-3 mb-3">Proxy Editor</h5>
|
|
4
|
-
<div class="flex
|
|
5
|
-
<div class="
|
|
4
|
+
<div class="flex items-center gap-2 w-full mb-1">
|
|
5
|
+
<div class="flex-1 lg:flex-initial lg:w-64 flex dropdown-container z-dropdown">
|
|
6
6
|
<div class="relative flex-grow">
|
|
7
7
|
<Dropdown
|
|
8
8
|
class="bg-dark-500 border-2 border-dark-550 proxy-file-dropdown w-full"
|
|
@@ -14,8 +14,8 @@
|
|
|
14
14
|
rightAmount="right-1" />
|
|
15
15
|
</div>
|
|
16
16
|
</div>
|
|
17
|
-
<div v-if="isProxyEditorVisible" class="flex gap-
|
|
18
|
-
<button class="
|
|
17
|
+
<div v-if="isProxyEditorVisible" class="flex gap-2 flex-shrink-0">
|
|
18
|
+
<button class="editor-action-btn" @click="$emit('save-proxies')" title="Save Proxies">
|
|
19
19
|
<svg
|
|
20
20
|
xmlns="http://www.w3.org/2000/svg"
|
|
21
21
|
width="16"
|
|
@@ -31,7 +31,7 @@
|
|
|
31
31
|
<polyline points="7 3 7 8 15 8" />
|
|
32
32
|
</svg>
|
|
33
33
|
</button>
|
|
34
|
-
<button class="
|
|
34
|
+
<button class="editor-action-btn" @click="$emit('close-proxy')" title="Close File">
|
|
35
35
|
<svg
|
|
36
36
|
xmlns="http://www.w3.org/2000/svg"
|
|
37
37
|
width="16"
|
|
@@ -51,7 +51,7 @@
|
|
|
51
51
|
<transition name="fade">
|
|
52
52
|
<div v-if="isProxyEditorVisible" class="relative my-3">
|
|
53
53
|
<div class="pb-4">
|
|
54
|
-
<div class="proxy-editor-container
|
|
54
|
+
<div class="proxy-editor-container">
|
|
55
55
|
<textarea
|
|
56
56
|
:value="proxyContent"
|
|
57
57
|
@input="$emit('update:proxyContent', $event.target.value)"
|
|
@@ -84,3 +84,95 @@ const loadProxies = (listName) => {
|
|
|
84
84
|
emit('load-proxies', listName);
|
|
85
85
|
};
|
|
86
86
|
</script>
|
|
87
|
+
|
|
88
|
+
<style scoped>
|
|
89
|
+
.editor-action-btn {
|
|
90
|
+
@apply flex items-center justify-center w-9 h-9 rounded border-2 border-dark-550 bg-dark-400 text-white;
|
|
91
|
+
transition: all 0.2s ease;
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
.editor-action-btn:hover {
|
|
95
|
+
@apply bg-dark-450 border-dark-625;
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
.editor-action-btn svg {
|
|
99
|
+
@apply w-4 h-4;
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
.proxy-editor-container {
|
|
103
|
+
position: relative;
|
|
104
|
+
height: calc(100vh - 380px);
|
|
105
|
+
min-height: 300px;
|
|
106
|
+
max-height: calc(100vh - 380px);
|
|
107
|
+
border: 2px solid var(--color-border);
|
|
108
|
+
border-radius: 0.5rem;
|
|
109
|
+
overflow: hidden;
|
|
110
|
+
background: var(--color-bg-dark-350);
|
|
111
|
+
box-shadow: 0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1);
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
.proxy-editor {
|
|
115
|
+
width: 100%;
|
|
116
|
+
height: 100%;
|
|
117
|
+
padding: 1rem;
|
|
118
|
+
font-family: 'Courier New', Courier, monospace;
|
|
119
|
+
font-size: 14px;
|
|
120
|
+
line-height: 1.6;
|
|
121
|
+
color: #c8d3f5;
|
|
122
|
+
background: transparent;
|
|
123
|
+
border: none;
|
|
124
|
+
outline: none;
|
|
125
|
+
resize: none;
|
|
126
|
+
overflow: auto;
|
|
127
|
+
white-space: pre;
|
|
128
|
+
word-wrap: normal;
|
|
129
|
+
overflow-wrap: normal;
|
|
130
|
+
tab-size: 4;
|
|
131
|
+
caret-color: #ffc777;
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
.proxy-editor::selection {
|
|
135
|
+
background: oklch(0.4 0.1 240 / 0.4);
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
.proxy-editor:focus {
|
|
139
|
+
outline: none;
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
/* Tablet adjustments */
|
|
143
|
+
@media (max-width: 1024px) {
|
|
144
|
+
.proxy-editor-container {
|
|
145
|
+
height: calc(100vh - 350px);
|
|
146
|
+
max-height: calc(100vh - 350px);
|
|
147
|
+
min-height: 280px;
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
/* Mobile adjustments */
|
|
152
|
+
@media (max-width: 768px) {
|
|
153
|
+
.proxy-editor-container {
|
|
154
|
+
height: calc(100vh - 320px);
|
|
155
|
+
max-height: calc(100vh - 320px);
|
|
156
|
+
min-height: 250px;
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
.proxy-editor {
|
|
160
|
+
font-size: 13px;
|
|
161
|
+
padding: 0.75rem;
|
|
162
|
+
line-height: 1.5;
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
@media (max-width: 480px) {
|
|
167
|
+
.proxy-editor-container {
|
|
168
|
+
height: calc(100vh - 300px);
|
|
169
|
+
max-height: calc(100vh - 300px);
|
|
170
|
+
min-height: 200px;
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
.proxy-editor {
|
|
174
|
+
font-size: 12px;
|
|
175
|
+
padding: 0.5rem;
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
</style>
|
|
@@ -13,10 +13,6 @@ export function useFormValidation() {
|
|
|
13
13
|
}
|
|
14
14
|
};
|
|
15
15
|
|
|
16
|
-
const hasError = (fieldName) => {
|
|
17
|
-
return errors.value.includes(fieldName);
|
|
18
|
-
};
|
|
19
|
-
|
|
20
16
|
const isValidEmail = (email) => {
|
|
21
17
|
return email && email.includes("@");
|
|
22
18
|
};
|
|
@@ -52,10 +48,6 @@ export function useFormValidation() {
|
|
|
52
48
|
return true; // Not required for other countries
|
|
53
49
|
};
|
|
54
50
|
|
|
55
|
-
const isValidZipCode = (zipCode) => {
|
|
56
|
-
return zipCode && zipCode.trim().length > 0;
|
|
57
|
-
};
|
|
58
|
-
|
|
59
51
|
const validateAccount = (account) => {
|
|
60
52
|
clearErrors();
|
|
61
53
|
|
package/src/stores/connection.js
CHANGED
|
@@ -118,7 +118,9 @@ export class ConnectionHandler {
|
|
|
118
118
|
} else if (msg.update) {
|
|
119
119
|
try {
|
|
120
120
|
Object.entries(msg.update).forEach((change) => (this.ui.tasks[msg.id][change[0]] = change[1]));
|
|
121
|
-
} catch {
|
|
121
|
+
} catch {
|
|
122
|
+
// Ignore update errors if task doesn't exist
|
|
123
|
+
}
|
|
122
124
|
} else {
|
|
123
125
|
if (!this.ui.tasks[msg.id]) this.ui.tasks[msg.id] = msg.task;
|
|
124
126
|
if (!this.ui.taskIdOrder.includes(msg.id)) {
|
package/src/stores/logger.js
CHANGED
|
@@ -46,13 +46,13 @@ class Logger {
|
|
|
46
46
|
|
|
47
47
|
// For styled console output in browser
|
|
48
48
|
if (style) {
|
|
49
|
-
|
|
49
|
+
|
|
50
50
|
console.log(`%c${args.join(" ")}`, style);
|
|
51
|
-
|
|
51
|
+
|
|
52
52
|
} else {
|
|
53
|
-
|
|
53
|
+
|
|
54
54
|
console.log(...args);
|
|
55
|
-
|
|
55
|
+
|
|
56
56
|
}
|
|
57
57
|
}
|
|
58
58
|
|
package/src/views/Console.vue
CHANGED
|
@@ -16,7 +16,7 @@
|
|
|
16
16
|
:taskLogMapping="taskLogMapping"
|
|
17
17
|
:userScrolledUp="userScrolledUp"
|
|
18
18
|
:filteredCount="filteredCount"
|
|
19
|
-
@scroll="
|
|
19
|
+
@scroll="startScrolling"
|
|
20
20
|
@scroll-stop="stopScrolling"
|
|
21
21
|
@autoscroll-toggle="onAutoscrollToggle" />
|
|
22
22
|
|
|
@@ -122,11 +122,10 @@ import { Smoothie } from "vue-smoothie";
|
|
|
122
122
|
import { DEBUG } from "@/utils/debug";
|
|
123
123
|
|
|
124
124
|
import Filter from "@/libs/ansii.js";
|
|
125
|
-
import { ConsoleIcon
|
|
125
|
+
import { ConsoleIcon } from "@/components/icons";
|
|
126
126
|
import Switch from "@/components/ui/controls/atomic/Switch.vue";
|
|
127
127
|
import WebsocketHeartbeatJs from "websocket-heartbeat-js";
|
|
128
128
|
import { onMounted, onUnmounted, ref, nextTick, computed, watch } from "vue";
|
|
129
|
-
import Dropdown from "@/components/ui/controls/atomic/Dropdown.vue";
|
|
130
129
|
import ConsoleToolbar from "@/components/Console/ConsoleToolbar.vue";
|
|
131
130
|
|
|
132
131
|
const $autoscroll = ref(null);
|
|
@@ -216,7 +215,7 @@ const performScroll = (direction, smooth = true) => {
|
|
|
216
215
|
}
|
|
217
216
|
|
|
218
217
|
return true;
|
|
219
|
-
} catch
|
|
218
|
+
} catch {
|
|
220
219
|
if (DEBUG) return false;
|
|
221
220
|
return false;
|
|
222
221
|
}
|
package/src/views/Editor.vue
CHANGED
|
@@ -70,8 +70,6 @@ let previous = {
|
|
|
70
70
|
|
|
71
71
|
const loadAvailableFiles = async () => (availableFiles.value = await loadFromApi("/api/json-files"));
|
|
72
72
|
|
|
73
|
-
const isJsonFile = () => currentFile.value.endsWith(".json");
|
|
74
|
-
|
|
75
73
|
const loadFile = async (f) => {
|
|
76
74
|
currentFile.value = f;
|
|
77
75
|
if (DEBUG) {
|
|
@@ -158,8 +158,7 @@
|
|
|
158
158
|
|
|
159
159
|
<script setup>
|
|
160
160
|
import draggable from "vuedraggable";
|
|
161
|
-
import { ref, computed, defineAsyncComponent, watch,
|
|
162
|
-
import { onBeforeRouteLeave } from "vue-router";
|
|
161
|
+
import { ref, computed, defineAsyncComponent, watch, nextTick } from "vue";
|
|
163
162
|
import { useFilterCSS } from "@/composables/useFilterCSS";
|
|
164
163
|
import Filter from "@/components/Filter/Filter.vue";
|
|
165
164
|
import { FilterIcon } from "@/components/icons";
|
|
@@ -216,7 +215,7 @@ const addWildcardFilter = () => {
|
|
|
216
215
|
|
|
217
216
|
let RendererFactory = import("@necrolab/tm-renderer");
|
|
218
217
|
|
|
219
|
-
|
|
218
|
+
useFilterCSS(filterBuilder, svg);
|
|
220
219
|
|
|
221
220
|
const doesFilterShow = (filter) => {
|
|
222
221
|
if ((filter.event || filter.eventId) !== filterBuilder.value.currentEventId) return;
|
|
@@ -326,9 +325,6 @@ const updateShownVenue = async () => {
|
|
|
326
325
|
await nextTick();
|
|
327
326
|
await loadFilter();
|
|
328
327
|
filterBuilder.value.reload(eventId.value);
|
|
329
|
-
|
|
330
|
-
// Re-setup CSS system after reload
|
|
331
|
-
setupCSSUpdates();
|
|
332
328
|
filterBuilder.value.updateCss();
|
|
333
329
|
};
|
|
334
330
|
|
package/src/views/Profiles.vue
CHANGED