@necrolab/dashboard 0.4.221 → 0.5.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/.prettierrc +27 -1
- package/.vscode/extensions.json +1 -1
- package/README.md +64 -2
- package/artwork/image.png +0 -0
- package/backend/api.js +26 -24
- package/backend/auth.js +2 -2
- package/backend/batching.js +1 -1
- package/backend/endpoints.js +8 -11
- package/backend/index.js +2 -2
- package/backend/mock-data.js +27 -36
- package/backend/mock-src/classes/logger.js +5 -7
- package/backend/mock-src/classes/utils.js +3 -2
- package/backend/mock-src/ticketmaster.js +4 -4
- package/backend/validator.js +2 -2
- package/config/configs.json +0 -1
- package/dev-server.js +134 -0
- package/exit +209 -0
- package/index.html +80 -8
- package/index.js +1 -1
- package/jsconfig.json +16 -0
- package/package.json +39 -25
- package/postcss.config.js +1 -1
- package/postinstall.js +124 -20
- package/public/android-chrome-192x192.png +0 -0
- package/public/android-chrome-512x512.png +0 -0
- package/public/apple-touch-icon.png +0 -0
- package/public/favicon-16x16.png +0 -0
- package/public/favicon-32x32.png +0 -0
- package/public/favicon.ico +0 -0
- package/public/img/logo_trans.png +0 -0
- package/public/img/necro_logo.png +0 -0
- package/public/manifest.json +16 -10
- package/public/reconnect-logo.png +0 -0
- package/run +176 -9
- package/src/App.vue +498 -85
- package/src/assets/css/base/reset.scss +43 -0
- package/src/assets/css/base/scroll.scss +114 -0
- package/src/assets/css/base/typography.scss +37 -0
- package/src/assets/css/components/buttons.scss +216 -0
- package/src/assets/css/components/forms.scss +221 -0
- package/src/assets/css/components/modals.scss +13 -0
- package/src/assets/css/components/tables.scss +27 -0
- package/src/assets/css/components/toasts.scss +100 -0
- package/src/assets/css/main.scss +202 -122
- package/src/assets/img/background.svg +2 -2
- package/src/assets/img/background.svg.backup +11 -0
- package/src/assets/img/logo_trans.png +0 -0
- package/src/components/Auth/LoginForm.vue +95 -11
- package/src/components/Editors/Account/Account.vue +116 -40
- package/src/components/Editors/Account/AccountCreator.vue +88 -39
- package/src/components/Editors/Account/AccountView.vue +102 -34
- package/src/components/Editors/Account/CreateAccount.vue +80 -32
- package/src/components/Editors/Profile/CreateProfile.vue +269 -83
- package/src/components/Editors/Profile/Profile.vue +132 -47
- package/src/components/Editors/Profile/ProfileCountryChooser.vue +82 -20
- package/src/components/Editors/Profile/ProfileView.vue +89 -32
- package/src/components/Editors/TagLabel.vue +67 -6
- package/src/components/Editors/TagToggle.vue +7 -2
- package/src/components/Filter/Filter.vue +288 -71
- package/src/components/Filter/FilterPreview.vue +202 -31
- package/src/components/Filter/PriceSortToggle.vue +76 -6
- package/src/components/Table/Header.vue +1 -1
- package/src/components/Table/Row.vue +1 -1
- package/src/components/Table/Table.vue +19 -2
- package/src/components/Tasks/CheckStock.vue +6 -8
- package/src/components/Tasks/Controls/DesktopControls.vue +27 -17
- package/src/components/Tasks/Controls/MobileControls.vue +8 -45
- package/src/components/Tasks/CreateTaskAXS.vue +80 -72
- package/src/components/Tasks/CreateTaskTM.vue +95 -141
- package/src/components/Tasks/MassEdit.vue +4 -6
- package/src/components/Tasks/QuickSettings.vue +199 -30
- package/src/components/Tasks/ScrapeVenue.vue +5 -6
- package/src/components/Tasks/Stats.vue +50 -24
- package/src/components/Tasks/Task.vue +384 -179
- package/src/components/Tasks/TaskLabel.vue +2 -2
- package/src/components/Tasks/TaskView.vue +136 -48
- package/src/components/Tasks/Utilities.vue +25 -10
- package/src/components/Tasks/ViewTask.vue +321 -0
- package/src/components/icons/Bag.vue +1 -1
- package/src/components/icons/Check.vue +5 -0
- package/src/components/icons/Close.vue +21 -0
- package/src/components/icons/CloseX.vue +5 -0
- package/src/components/icons/Eye.vue +6 -0
- package/src/components/icons/Key.vue +21 -0
- package/src/components/icons/Loyalty.vue +1 -1
- package/src/components/icons/Mail.vue +2 -2
- package/src/components/icons/Pencil.vue +21 -0
- package/src/components/icons/Play.vue +2 -2
- package/src/components/icons/Profile.vue +18 -0
- package/src/components/icons/Reload.vue +4 -5
- package/src/components/icons/Sandclock.vue +2 -2
- package/src/components/icons/Sell.vue +21 -0
- package/src/components/icons/Spinner.vue +42 -0
- package/src/components/icons/SquareCheck.vue +18 -0
- package/src/components/icons/SquareUncheck.vue +18 -0
- package/src/components/icons/Stadium.vue +1 -1
- package/src/components/icons/Wildcard.vue +18 -0
- package/src/components/icons/index.js +26 -1
- package/src/components/ui/Modal.vue +107 -13
- package/src/components/ui/Navbar.vue +175 -40
- package/src/components/ui/ReconnectIndicator.vue +351 -55
- package/src/components/ui/Splash.vue +5 -35
- package/src/components/ui/controls/CountryChooser.vue +200 -62
- package/src/components/ui/controls/atomic/Checkbox.vue +119 -10
- package/src/components/ui/controls/atomic/Dropdown.vue +216 -39
- package/src/components/ui/controls/atomic/LoadingButton.vue +45 -0
- package/src/components/ui/controls/atomic/MultiDropdown.vue +300 -37
- package/src/components/ui/controls/atomic/Switch.vue +53 -25
- package/src/composables/useClickOutside.js +21 -0
- package/src/composables/useDropdownPosition.js +174 -0
- package/src/libs/Filter.js +60 -24
- package/src/registerServiceWorker.js +1 -1
- package/src/stores/connection.js +4 -4
- package/src/stores/sampleData.js +172 -199
- package/src/stores/ui.js +55 -20
- package/src/stores/utils.js +30 -4
- package/src/types/index.js +41 -0
- package/src/utils/debug.js +1 -0
- package/src/views/Accounts.vue +116 -50
- package/src/views/Console.vue +394 -77
- package/src/views/Editor.vue +1176 -123
- package/src/views/FilterBuilder.vue +528 -250
- package/src/views/Login.vue +75 -14
- package/src/views/Profiles.vue +119 -34
- package/src/views/Tasks.vue +266 -98
- package/static/offline.html +192 -50
- package/switch-branch.sh +41 -0
- package/tailwind.config.js +119 -27
- package/vite.config.js +73 -16
- package/workbox-config.cjs +63 -0
- package/ICONS.md +0 -21
- package/public/img/background.svg +0 -14
- package/public/img/logo.png +0 -0
- package/public/img/logo_icon.png +0 -0
- package/public/img/logo_icon_2.png +0 -0
- package/src/assets/css/_input.scss +0 -143
- package/src/assets/img/logo.png +0 -0
- package/src/assets/img/logo_icon.png +0 -0
- package/src/assets/img/logo_icon_2.png +0 -0
- package/vue.config.js +0 -32
- package/workbox-config.js +0 -7
|
@@ -1,58 +1,229 @@
|
|
|
1
1
|
<template>
|
|
2
2
|
<Modal class="overflow-y-scroll max-w-screen">
|
|
3
|
-
<template #header>
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
3
|
+
<template #header>
|
|
4
|
+
Filter JSON data
|
|
5
|
+
<FilterIcon class="ml-4" />
|
|
6
|
+
</template>
|
|
7
|
+
|
|
8
|
+
<div class="my-3">
|
|
9
|
+
<div class="editor-container">
|
|
10
|
+
<div class="editor-wrapper">
|
|
11
|
+
<pre ref="codeDisplay" class="language-json code-highlight"></pre>
|
|
12
|
+
<textarea
|
|
13
|
+
ref="codeEditor"
|
|
14
|
+
v-model="text"
|
|
15
|
+
class="code-editor"
|
|
16
|
+
spellcheck="false"
|
|
17
|
+
@scroll="syncScroll"
|
|
18
|
+
@input="highlightCode"
|
|
19
|
+
@keydown.tab.prevent="handleTab"></textarea>
|
|
20
|
+
</div>
|
|
21
|
+
</div>
|
|
22
|
+
<p class="text-red-400 text-bold mt-2">{{ errorMessage }}</p>
|
|
17
23
|
</div>
|
|
18
24
|
|
|
19
|
-
<div class="ml-auto flex">
|
|
20
|
-
<button
|
|
21
|
-
|
|
22
|
-
@click="save()"
|
|
23
|
-
>
|
|
24
|
-
Apply
|
|
25
|
-
</button>
|
|
26
|
-
|
|
27
|
-
<button
|
|
28
|
-
class="button-default hover:opacity-70 active:opacity-50 bg-dark-400 w-48 text-xs flex items-center justify-center gap-x-2 ml-2"
|
|
29
|
-
@click="done()"
|
|
30
|
-
>
|
|
31
|
-
Close
|
|
32
|
-
</button>
|
|
25
|
+
<div class="ml-auto flex gap-3 mt-3">
|
|
26
|
+
<button class="modal-btn save-btn" @click="save()">Apply</button>
|
|
27
|
+
<button class="modal-btn" @click="done()">Close</button>
|
|
33
28
|
</div>
|
|
34
29
|
</Modal>
|
|
35
30
|
</template>
|
|
36
31
|
<style lang="scss" scoped>
|
|
32
|
+
.modal-btn {
|
|
33
|
+
@apply rounded transition-all duration-150 flex items-center justify-center;
|
|
34
|
+
background: oklch(0.2046 0 0);
|
|
35
|
+
border: 2px solid oklch(0.2809 0 0);
|
|
36
|
+
color: oklch(0.90 0 0);
|
|
37
|
+
height: 2.5rem;
|
|
38
|
+
width: 6.5rem;
|
|
39
|
+
font-size: 0.75rem;
|
|
40
|
+
font-weight: 500;
|
|
41
|
+
|
|
42
|
+
&:hover {
|
|
43
|
+
border-color: oklch(0.72 0.15 145);
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
&:active, &:focus {
|
|
47
|
+
border-color: oklch(0.72 0.15 145);
|
|
48
|
+
outline: 1px solid oklch(0.72 0.15 145);
|
|
49
|
+
outline-offset: 0;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
&.save-btn {
|
|
53
|
+
background-color: oklch(0.72 0.15 145 / 0.15);
|
|
54
|
+
border-color: oklch(0.72 0.15 145 / 0.5);
|
|
55
|
+
|
|
56
|
+
&:hover {
|
|
57
|
+
background-color: oklch(0.72 0.15 145 / 0.25);
|
|
58
|
+
border-color: oklch(0.72 0.15 145);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
|
|
37
63
|
.input-wrapper {
|
|
38
64
|
label {
|
|
39
65
|
@apply flex;
|
|
40
66
|
}
|
|
41
67
|
}
|
|
68
|
+
|
|
69
|
+
/* Prism.js syntax highlighting styles */
|
|
70
|
+
.editor-container {
|
|
71
|
+
position: relative;
|
|
72
|
+
min-height: 300px;
|
|
73
|
+
max-height: 500px;
|
|
74
|
+
border-radius: 8px;
|
|
75
|
+
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.2);
|
|
76
|
+
overflow: hidden;
|
|
77
|
+
background-color: oklch(0.19 0 0);
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
.editor-wrapper {
|
|
81
|
+
position: relative;
|
|
82
|
+
width: 100%;
|
|
83
|
+
height: 100%;
|
|
84
|
+
min-height: 300px;
|
|
85
|
+
max-height: 500px;
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
.code-editor {
|
|
89
|
+
width: 100%;
|
|
90
|
+
height: 100%;
|
|
91
|
+
min-height: 300px;
|
|
92
|
+
max-height: 500px;
|
|
93
|
+
background-color: transparent;
|
|
94
|
+
/* Make text completely transparent */
|
|
95
|
+
color: rgba(0, 0, 0, 0);
|
|
96
|
+
caret-color: #e2e8f0;
|
|
97
|
+
font-family: "JetBrains Mono", "Fira Code", "Menlo", "Monaco", "Courier New", monospace;
|
|
98
|
+
padding: 12px;
|
|
99
|
+
border: none;
|
|
100
|
+
resize: none;
|
|
101
|
+
font-size: 14px;
|
|
102
|
+
line-height: 1.6;
|
|
103
|
+
tab-size: 4;
|
|
104
|
+
outline: none;
|
|
105
|
+
border: 1px solid oklch(0.26 0 0);
|
|
106
|
+
border-radius: 8px;
|
|
107
|
+
z-index: 10;
|
|
108
|
+
position: absolute;
|
|
109
|
+
top: 0;
|
|
110
|
+
left: 0;
|
|
111
|
+
right: 0;
|
|
112
|
+
bottom: 0;
|
|
113
|
+
white-space: pre;
|
|
114
|
+
overflow: auto;
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
.code-highlight {
|
|
118
|
+
width: 100%;
|
|
119
|
+
height: 100%;
|
|
120
|
+
min-height: 300px;
|
|
121
|
+
max-height: 500px;
|
|
122
|
+
overflow: auto;
|
|
123
|
+
white-space: pre;
|
|
124
|
+
font-family: "JetBrains Mono", "Fira Code", "Menlo", "Monaco", "Courier New", monospace;
|
|
125
|
+
font-size: 14px;
|
|
126
|
+
line-height: 1.6;
|
|
127
|
+
background-color: transparent !important;
|
|
128
|
+
pointer-events: none;
|
|
129
|
+
z-index: 5;
|
|
130
|
+
position: absolute;
|
|
131
|
+
top: 0;
|
|
132
|
+
left: 0;
|
|
133
|
+
right: 0;
|
|
134
|
+
bottom: 0;
|
|
135
|
+
padding: 12px;
|
|
136
|
+
margin: 0;
|
|
137
|
+
}
|
|
42
138
|
</style>
|
|
43
139
|
<script setup>
|
|
44
140
|
import Modal from "@/components/ui/Modal.vue";
|
|
45
141
|
import { FilterIcon } from "@/components/icons";
|
|
46
142
|
import { useUIStore } from "@/stores/ui";
|
|
47
|
-
import { ref, computed } from "vue";
|
|
48
|
-
import CodeEditor from "simple-code-editor";
|
|
143
|
+
import { ref, computed, onMounted, nextTick } from "vue";
|
|
49
144
|
|
|
50
145
|
const props = defineProps({
|
|
51
146
|
filter: Object
|
|
52
147
|
});
|
|
53
148
|
|
|
54
149
|
const ui = useUIStore();
|
|
55
|
-
const text = ref(JSON.stringify(props.filter.out(), null,
|
|
150
|
+
const text = ref(JSON.stringify(props.filter.out(), null, 4));
|
|
151
|
+
const codeEditor = ref(null);
|
|
152
|
+
const codeDisplay = ref(null);
|
|
153
|
+
|
|
154
|
+
// Function to highlight code using Prism
|
|
155
|
+
const highlightCode = () => {
|
|
156
|
+
if (!codeDisplay.value || !codeEditor.value) return;
|
|
157
|
+
|
|
158
|
+
// Ensure Prism is available
|
|
159
|
+
if (typeof Prism === "undefined") {
|
|
160
|
+
console.error("Prism is not loaded");
|
|
161
|
+
return;
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
// Use requestAnimationFrame for smoother updates
|
|
165
|
+
requestAnimationFrame(() => {
|
|
166
|
+
try {
|
|
167
|
+
// Update the pre element with highlighted HTML
|
|
168
|
+
const highlighted = Prism.highlight(text.value || "", Prism.languages.json, "json");
|
|
169
|
+
codeDisplay.value.innerHTML = highlighted;
|
|
170
|
+
codeDisplay.value.className = "language-json code-highlight";
|
|
171
|
+
} catch (e) {
|
|
172
|
+
console.error("Highlight error:", e);
|
|
173
|
+
// Fallback to plain text if highlighting fails
|
|
174
|
+
codeDisplay.value.textContent = text.value || "";
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
// Ensure scroll positions are synced after highlighting
|
|
178
|
+
syncScroll();
|
|
179
|
+
});
|
|
180
|
+
};
|
|
181
|
+
|
|
182
|
+
// Function to sync scrolling between textarea and highlighted code
|
|
183
|
+
const syncScroll = () => {
|
|
184
|
+
if (!codeDisplay.value || !codeEditor.value) return;
|
|
185
|
+
|
|
186
|
+
// Synchronize scrolling between the textarea and the highlighted code
|
|
187
|
+
requestAnimationFrame(() => {
|
|
188
|
+
codeDisplay.value.scrollTop = codeEditor.value.scrollTop;
|
|
189
|
+
codeDisplay.value.scrollLeft = codeEditor.value.scrollLeft;
|
|
190
|
+
});
|
|
191
|
+
};
|
|
192
|
+
|
|
193
|
+
// Function to handle tab key press in the editor
|
|
194
|
+
const handleTab = (e) => {
|
|
195
|
+
const textarea = codeEditor.value;
|
|
196
|
+
const start = textarea.selectionStart;
|
|
197
|
+
const end = textarea.selectionEnd;
|
|
198
|
+
|
|
199
|
+
// Insert 4 spaces at cursor position
|
|
200
|
+
const spaces = " ";
|
|
201
|
+
text.value = text.value.substring(0, start) + spaces + text.value.substring(end);
|
|
202
|
+
|
|
203
|
+
// Move cursor position after the inserted tab
|
|
204
|
+
nextTick(() => {
|
|
205
|
+
textarea.selectionStart = textarea.selectionEnd = start + spaces.length;
|
|
206
|
+
highlightCode();
|
|
207
|
+
});
|
|
208
|
+
};
|
|
209
|
+
|
|
210
|
+
// Initialize syntax highlighting
|
|
211
|
+
onMounted(() => {
|
|
212
|
+
// Apply highlighting when the component is mounted
|
|
213
|
+
nextTick(() => {
|
|
214
|
+
highlightCode();
|
|
215
|
+
|
|
216
|
+
// Ensure scroll synchronization on initial load
|
|
217
|
+
if (codeEditor.value && codeDisplay.value) {
|
|
218
|
+
syncScroll();
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
// Focus the editor
|
|
222
|
+
if (codeEditor.value) {
|
|
223
|
+
codeEditor.value.focus();
|
|
224
|
+
}
|
|
225
|
+
});
|
|
226
|
+
});
|
|
56
227
|
|
|
57
228
|
function done() {
|
|
58
229
|
ui.toggleModal("");
|
|
@@ -1,16 +1,19 @@
|
|
|
1
1
|
<template>
|
|
2
2
|
<button
|
|
3
3
|
@click="increase"
|
|
4
|
-
:class="
|
|
5
|
-
|
|
6
|
-
|
|
4
|
+
:class="[
|
|
5
|
+
'sort-toggle',
|
|
6
|
+
{ 'darker': props.darker }
|
|
7
|
+
]"
|
|
7
8
|
>
|
|
8
|
-
|
|
9
|
+
<component :is="getCurrentIcon()" class="icon" />
|
|
10
|
+
<span class="text">{{ getCurrentText() }}</span>
|
|
9
11
|
</button>
|
|
10
12
|
</template>
|
|
11
13
|
|
|
12
14
|
<script setup>
|
|
13
15
|
import { ref } from "vue";
|
|
16
|
+
import { UpIcon, DownIcon, FilterIcon, CheckIcon, CloseIcon } from "@/components/icons";
|
|
14
17
|
|
|
15
18
|
let sortOptions = ref(["none", "asc", "desc", "none"]);
|
|
16
19
|
const currentOpt = ref(0);
|
|
@@ -24,14 +27,81 @@ const props = defineProps({
|
|
|
24
27
|
current: String,
|
|
25
28
|
darker: Boolean
|
|
26
29
|
});
|
|
30
|
+
|
|
27
31
|
if (props.options) sortOptions.value = props.options;
|
|
28
32
|
if (props.current) currentOpt.value = sortOptions.value.findIndex((s) => s === props.current);
|
|
29
33
|
|
|
30
34
|
const emit = defineEmits(["change"]);
|
|
31
35
|
|
|
32
36
|
const increase = () => {
|
|
33
|
-
currentOpt.value
|
|
37
|
+
currentOpt.value = (currentOpt.value + 1) % sortOptions.value.length;
|
|
34
38
|
emit("change", sortOptions.value[currentOpt.value]);
|
|
35
|
-
|
|
39
|
+
};
|
|
40
|
+
|
|
41
|
+
const getCurrentIcon = () => {
|
|
42
|
+
const current = sortOptions.value[currentOpt.value];
|
|
43
|
+
|
|
44
|
+
// Handle filter options (All, WL, BL)
|
|
45
|
+
if (props.options && props.options.includes('All')) {
|
|
46
|
+
switch (current) {
|
|
47
|
+
case 'All': return FilterIcon;
|
|
48
|
+
case 'WL': return CheckIcon;
|
|
49
|
+
case 'BL': return CloseIcon;
|
|
50
|
+
default: return FilterIcon;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
// Handle sort options (none, asc, desc)
|
|
55
|
+
switch (current) {
|
|
56
|
+
case 'asc': return UpIcon;
|
|
57
|
+
case 'desc': return DownIcon;
|
|
58
|
+
case 'none':
|
|
59
|
+
default: return FilterIcon;
|
|
60
|
+
}
|
|
61
|
+
};
|
|
62
|
+
|
|
63
|
+
const getCurrentText = () => {
|
|
64
|
+
const current = sortOptions.value[currentOpt.value];
|
|
65
|
+
|
|
66
|
+
// Handle filter options (All, WL, BL)
|
|
67
|
+
if (props.options && props.options.includes('All')) {
|
|
68
|
+
return current;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
// Handle sort options
|
|
72
|
+
switch (current) {
|
|
73
|
+
case 'asc': return 'Low';
|
|
74
|
+
case 'desc': return 'High';
|
|
75
|
+
case 'none': return 'None';
|
|
76
|
+
default: return current;
|
|
77
|
+
}
|
|
36
78
|
};
|
|
37
79
|
</script>
|
|
80
|
+
|
|
81
|
+
<style scoped>
|
|
82
|
+
.sort-toggle {
|
|
83
|
+
@apply flex items-center gap-2 px-3 py-2 rounded text-sm font-medium focus:outline-none;
|
|
84
|
+
background: oklch(0.2603 0 0);
|
|
85
|
+
border: 2px solid oklch(0.2809 0 0);
|
|
86
|
+
color: oklch(0.90 0 0);
|
|
87
|
+
min-width: 80px;
|
|
88
|
+
height: 40px;
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
.sort-toggle.darker {
|
|
92
|
+
background: oklch(0.2046 0 0);
|
|
93
|
+
border: 2px solid oklch(0.2809 0 0);
|
|
94
|
+
color: oklch(0.90 0 0);
|
|
95
|
+
min-width: 100px;
|
|
96
|
+
height: 40px;
|
|
97
|
+
padding: 0 0.75rem;
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
.icon {
|
|
101
|
+
@apply w-4 h-4 flex-shrink-0;
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
.text {
|
|
105
|
+
@apply text-center flex-1;
|
|
106
|
+
}
|
|
107
|
+
</style>
|
|
@@ -5,10 +5,27 @@
|
|
|
5
5
|
</template>
|
|
6
6
|
<style lang="scss">
|
|
7
7
|
.table-component {
|
|
8
|
-
@apply flex-col bg-clip-padding rounded relative box-border border
|
|
8
|
+
@apply flex-col bg-clip-padding rounded relative box-border border border-dark-600 bg-dark-500;
|
|
9
|
+
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
|
|
10
|
+
overflow: auto !important;
|
|
11
|
+
overscroll-behavior: auto !important;
|
|
12
|
+
touch-action: auto !important;
|
|
13
|
+
max-height: calc(100vh - 200px);
|
|
9
14
|
}
|
|
10
15
|
|
|
11
16
|
.table-component > .grid {
|
|
12
|
-
@apply bg-dark-
|
|
17
|
+
@apply bg-dark-400;
|
|
18
|
+
border-bottom: 1px solid oklch(0.26 0 0);
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
/* iPhone landscape mode table optimization */
|
|
22
|
+
@media screen and (max-height: 500px) and (orientation: landscape) {
|
|
23
|
+
.table-component {
|
|
24
|
+
max-height: calc(100vh - 160px) !important; // Leave even more space at bottom
|
|
25
|
+
width: 100% !important;
|
|
26
|
+
overflow-x: auto !important; // Allow horizontal scrolling if needed
|
|
27
|
+
overflow-y: auto !important; // Allow vertical scrolling
|
|
28
|
+
margin-bottom: 2rem !important; // Increase bottom margin for better spacing
|
|
29
|
+
}
|
|
13
30
|
}
|
|
14
31
|
</style>
|
|
@@ -4,16 +4,14 @@
|
|
|
4
4
|
<!-- Event ID -->
|
|
5
5
|
<div class="input-wrapper mt-7 mb-4">
|
|
6
6
|
<label class="label-override mb-2">Event ID or URL <StadiumIcon /></label>
|
|
7
|
-
<div class="input-default
|
|
7
|
+
<div class="input-default required">
|
|
8
8
|
<input
|
|
9
9
|
:placeholder="!isEU(ui.currentCountry.siteId) ? '102PDA9125510GYU' : '529171'"
|
|
10
10
|
v-model="eventId"
|
|
11
|
-
class="flex-grow"
|
|
12
11
|
/>
|
|
13
|
-
<span class="text-red-400 text-lg absolute right-3 top-1/2 transform -translate-y-1/2">*</span>
|
|
14
12
|
</div>
|
|
15
13
|
</div>
|
|
16
|
-
<!--
|
|
14
|
+
<!-- Presale Code -->
|
|
17
15
|
<div class="input-wrapper mb-4">
|
|
18
16
|
<label class="label-override mb-2">Presale code <AwardIcon /></label>
|
|
19
17
|
<div class="input-default">
|
|
@@ -35,10 +33,10 @@
|
|
|
35
33
|
</div>
|
|
36
34
|
</div>
|
|
37
35
|
<button
|
|
38
|
-
class="button-default
|
|
39
|
-
@click="done()"
|
|
40
|
-
|
|
41
|
-
|
|
36
|
+
class="button-default ml-auto mt-4 flex w-48 items-center justify-center gap-x-2 bg-dark-400 text-xs"
|
|
37
|
+
@click="done()">
|
|
38
|
+
Check Stock
|
|
39
|
+
<BoxIcon />
|
|
42
40
|
</button>
|
|
43
41
|
</Modal>
|
|
44
42
|
</template>
|
|
@@ -1,29 +1,21 @@
|
|
|
1
1
|
<template>
|
|
2
|
-
<div class="task-controls flex-row"
|
|
2
|
+
<div class="task-controls flex-row">
|
|
3
3
|
<div class="control-buttons mb-4 xl:mb-0">
|
|
4
|
-
<button @click="$emit('startAll')" class="bg-green-400 smooth-hover
|
|
4
|
+
<button @click="$emit('startAll')" class="bg-green-400 smooth-hover responsive-button border-none">
|
|
5
5
|
Start <PlayIcon />
|
|
6
6
|
</button>
|
|
7
|
-
<button @click="$emit('stopAll')" class="bg-red-400 smooth-hover
|
|
7
|
+
<button @click="$emit('stopAll')" class="bg-red-400 smooth-hover responsive-button border-none">
|
|
8
8
|
Stop <PauseIcon />
|
|
9
9
|
</button>
|
|
10
|
-
<button @click="$emit('deleteAll')" class="bg-dark-400 smooth-hover
|
|
10
|
+
<button @click="$emit('deleteAll')" class="bg-dark-400 smooth-hover responsive-button border border-dark-650 hover:border-dark-700">
|
|
11
11
|
Delete <TrashIcon />
|
|
12
12
|
</button>
|
|
13
|
-
<h4 class="text-light-
|
|
13
|
+
<h4 class="text-light-300 text-sm flex-grow xl:flex-initial"></h4>
|
|
14
14
|
</div>
|
|
15
15
|
<div class="flex gap-x-3">
|
|
16
|
-
<button @click="$emit('expand')" class="bg-dark-400 smooth-hover flex-grow xl:flex-initial">
|
|
17
|
-
Expand
|
|
18
|
-
<ExpandIcon class="ml-2" />
|
|
19
|
-
</button>
|
|
20
|
-
<button @click="$emit('fold')" class="bg-dark-400 smooth-hover flex-grow xl:flex-initial">
|
|
21
|
-
Fold
|
|
22
|
-
<ShrinkIcon class="ml-2" />
|
|
23
|
-
</button>
|
|
24
16
|
<button
|
|
25
17
|
:disabled="ui.disabledButtons['add-tasks']"
|
|
26
|
-
class="bg-dark-400 disabled:opacity-70 smooth-hover flex-grow xl:flex-initial w-36"
|
|
18
|
+
class="bg-dark-400 disabled:opacity-70 smooth-hover flex-grow xl:flex-initial w-36 border border-dark-650 hover:border-dark-700"
|
|
27
19
|
@click="ui.toggleModal('create-task')"
|
|
28
20
|
>
|
|
29
21
|
Create Task
|
|
@@ -31,7 +23,7 @@
|
|
|
31
23
|
</button>
|
|
32
24
|
|
|
33
25
|
<button
|
|
34
|
-
class="bg-dark-400 smooth-hover flex-grow xl:flex-initial w-36"
|
|
26
|
+
class="bg-dark-400 smooth-hover flex-grow xl:flex-initial w-36 border border-dark-650 hover:border-dark-700"
|
|
35
27
|
@click="ui.toggleModal('mass-edit-presale-code')"
|
|
36
28
|
:disabled="ui.disabledButtons['mass-edit']"
|
|
37
29
|
v-if="ui.currentModule == 'TM'"
|
|
@@ -53,7 +45,25 @@ const isExpanded = ref(false);
|
|
|
53
45
|
<style lang="scss" scoped>
|
|
54
46
|
button {
|
|
55
47
|
@apply text-white h-10 rounded-md text-xs flex items-center justify-center font-medium px-4;
|
|
48
|
+
transition: all 0.15s ease;
|
|
49
|
+
|
|
50
|
+
&.bg-dark-400:active, &.bg-dark-400:focus {
|
|
51
|
+
outline: 1px solid oklch(0.72 0.15 145);
|
|
52
|
+
outline-offset: 0;
|
|
53
|
+
border-color: oklch(0.72 0.15 145) !important;
|
|
54
|
+
}
|
|
56
55
|
}
|
|
56
|
+
|
|
57
|
+
.responsive-button {
|
|
58
|
+
min-width: 80px;
|
|
59
|
+
max-width: 120px;
|
|
60
|
+
@apply flex-grow xl:flex-initial;
|
|
61
|
+
|
|
62
|
+
@media (max-width: 768px) {
|
|
63
|
+
@apply h-10 text-xs;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
|
|
57
67
|
.task-controls {
|
|
58
68
|
@apply gap-x-3;
|
|
59
69
|
.control-buttons {
|
|
@@ -65,9 +75,9 @@ button {
|
|
|
65
75
|
}
|
|
66
76
|
}
|
|
67
77
|
.expand-shrink {
|
|
68
|
-
@apply flex
|
|
78
|
+
@apply flex gap-x-2;
|
|
69
79
|
button {
|
|
70
|
-
@apply text-white text-xs px-4 flex items-center justify-center gap-x-4 duration-200;
|
|
80
|
+
@apply text-white text-xs px-4 flex items-center justify-center gap-x-4 duration-200 border border-light-300 hover:border-light-400;
|
|
71
81
|
}
|
|
72
82
|
}
|
|
73
83
|
}
|
|
@@ -1,27 +1,11 @@
|
|
|
1
1
|
<template>
|
|
2
|
-
<div class="mobile-controls
|
|
3
|
-
<div>
|
|
4
|
-
<ul class="mobile-icons">
|
|
5
|
-
<li>
|
|
6
|
-
<button @click="$emit('startAll')"><PlayIcon /></button>
|
|
7
|
-
</li>
|
|
8
|
-
<li>
|
|
9
|
-
<button @click="$emit('stopAll')"><PauseIcon /></button>
|
|
10
|
-
</li>
|
|
11
|
-
|
|
12
|
-
<li>
|
|
13
|
-
<button @click="ui.toggleModal('mass-edit-presale-code')">
|
|
14
|
-
<EditIcon />
|
|
15
|
-
</button>
|
|
16
|
-
</li>
|
|
17
|
-
</ul>
|
|
18
|
-
</div>
|
|
2
|
+
<div class="mobile-controls flex items-center justify-between" v-once>
|
|
19
3
|
<div class="expand-shrink">
|
|
20
|
-
<button class="
|
|
4
|
+
<button class="mobile-btn" @click="$emit('expand')">
|
|
21
5
|
Expand
|
|
22
6
|
<ExpandIcon />
|
|
23
7
|
</button>
|
|
24
|
-
<button class="
|
|
8
|
+
<button class="mobile-btn" @click="$emit('fold')">
|
|
25
9
|
Fold
|
|
26
10
|
<ShrinkIcon />
|
|
27
11
|
</button>
|
|
@@ -36,33 +20,12 @@ const ui = useUIStore();
|
|
|
36
20
|
</script>
|
|
37
21
|
<style lang="scss" scoped>
|
|
38
22
|
.mobile-controls {
|
|
39
|
-
@apply gap-x-4;
|
|
40
23
|
.expand-shrink {
|
|
41
|
-
@apply flex
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
}
|
|
47
|
-
ul {
|
|
48
|
-
@apply items-center gap-x-2;
|
|
49
|
-
li {
|
|
50
|
-
@apply text-white;
|
|
51
|
-
}
|
|
52
|
-
svg {
|
|
53
|
-
width: 15px;
|
|
54
|
-
height: 15px;
|
|
55
|
-
}
|
|
56
|
-
}
|
|
57
|
-
}
|
|
58
|
-
@media (max-width: 1024px) {
|
|
59
|
-
.mobile-controls {
|
|
60
|
-
.expand-shrink {
|
|
61
|
-
button {
|
|
62
|
-
width: 100px;
|
|
63
|
-
font-size: 12px !important;
|
|
64
|
-
@apply gap-x-2 px-0;
|
|
65
|
-
}
|
|
24
|
+
@apply flex gap-x-2;
|
|
25
|
+
.mobile-btn {
|
|
26
|
+
@apply text-white text-xs px-3 flex items-center justify-center gap-x-1 h-10 rounded-md bg-dark-400 border border-dark-650 hover:border-dark-700 transition-all duration-150 font-medium;
|
|
27
|
+
width: 80px;
|
|
28
|
+
font-size: 11px;
|
|
66
29
|
}
|
|
67
30
|
}
|
|
68
31
|
}
|