@necrolab/dashboard 0.4.61 → 0.4.208
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 +1 -27
- package/.vscode/extensions.json +1 -1
- package/README.md +79 -43
- package/backend/api.js +48 -40
- package/backend/auth.js +3 -3
- package/backend/batching.js +1 -1
- package/backend/endpoints.js +77 -13
- package/backend/index.js +2 -2
- package/backend/mock-data.js +38 -29
- package/backend/mock-src/classes/logger.js +8 -8
- package/backend/mock-src/classes/utils.js +3 -7
- package/backend/mock-src/database.js +0 -0
- package/backend/mock-src/ticketmaster.js +79 -79
- package/backend/validator.js +2 -2
- package/config/configs.json +3 -2
- package/config/filter.json +3 -2
- package/index.html +10 -81
- package/index.js +1 -1
- package/package.json +25 -40
- package/postcss.config.js +1 -1
- package/postinstall.js +17 -98
- 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/manifest.json +7 -12
- package/public/sw.js +2 -0
- package/public/workbox-49fdaf31.js +2 -0
- package/public/workbox-49fdaf31.js.map +1 -0
- package/public/workbox-88575b92.js +2 -0
- package/public/workbox-88575b92.js.map +1 -0
- package/public/workbox-a67a7b11.js +2 -0
- package/public/workbox-a67a7b11.js.map +1 -0
- package/public/workbox-d4314735.js +2 -0
- package/public/workbox-d4314735.js.map +1 -0
- package/public/workbox-e0f89ef3.js +2 -0
- package/public/workbox-e0f89ef3.js.map +1 -0
- package/run +9 -176
- package/src/App.vue +85 -498
- package/src/assets/css/_input.scss +99 -144
- package/src/assets/css/main.scss +99 -450
- package/src/assets/img/background.svg +2 -2
- package/src/assets/img/logo_icon.png +0 -0
- package/src/components/Auth/LoginForm.vue +11 -62
- package/src/components/Editors/Account/Account.vue +40 -116
- package/src/components/Editors/Account/AccountCreator.vue +39 -88
- package/src/components/Editors/Account/AccountView.vue +34 -102
- package/src/components/Editors/Account/CreateAccount.vue +32 -80
- package/src/components/Editors/Profile/CreateProfile.vue +83 -269
- package/src/components/Editors/Profile/Profile.vue +47 -132
- package/src/components/Editors/Profile/ProfileCountryChooser.vue +20 -82
- package/src/components/Editors/Profile/ProfileView.vue +34 -91
- package/src/components/Editors/TagLabel.vue +6 -67
- package/src/components/Filter/Filter.vue +72 -289
- package/src/components/Filter/FilterPreview.vue +30 -171
- package/src/components/Filter/PriceSortToggle.vue +4 -74
- package/src/components/Table/Header.vue +1 -1
- package/src/components/Table/Row.vue +1 -1
- package/src/components/Table/Table.vue +2 -19
- package/src/components/Tasks/CheckStock.vue +13 -28
- package/src/components/Tasks/Controls/DesktopControls.vue +17 -17
- package/src/components/Tasks/Controls/MobileControls.vue +45 -8
- package/src/components/Tasks/CreateTaskAXS.vue +73 -79
- package/src/components/Tasks/CreateTaskTM.vue +142 -94
- package/src/components/Tasks/MassEdit.vue +7 -9
- package/src/components/Tasks/QuickSettings.vue +55 -169
- package/src/components/Tasks/ScrapeVenue.vue +4 -7
- package/src/components/Tasks/Stats.vue +23 -52
- package/src/components/Tasks/Task.vue +136 -378
- package/src/components/Tasks/TaskView.vue +47 -107
- package/src/components/Tasks/Utilities.vue +6 -5
- package/src/components/icons/Bag.vue +1 -1
- package/src/components/icons/Loyalty.vue +1 -1
- package/src/components/icons/Mail.vue +2 -2
- package/src/components/icons/Play.vue +2 -2
- package/src/components/icons/Reload.vue +5 -4
- package/src/components/icons/Sandclock.vue +2 -2
- package/src/components/icons/Stadium.vue +1 -1
- package/src/components/icons/index.js +1 -24
- package/src/components/ui/Modal.vue +13 -105
- package/src/components/ui/Navbar.vue +38 -171
- package/src/components/ui/ReconnectIndicator.vue +55 -351
- package/src/components/ui/Splash.vue +35 -5
- package/src/components/ui/controls/CountryChooser.vue +62 -200
- package/src/components/ui/controls/atomic/Checkbox.vue +10 -119
- package/src/components/ui/controls/atomic/Dropdown.vue +39 -208
- package/src/components/ui/controls/atomic/MultiDropdown.vue +37 -300
- package/src/libs/Filter.js +170 -200
- package/src/registerServiceWorker.js +1 -1
- package/src/stores/connection.js +53 -51
- package/src/stores/logger.js +3 -11
- package/src/stores/sampleData.js +235 -207
- package/src/stores/ui.js +44 -112
- package/src/stores/utils.js +6 -90
- package/src/views/Accounts.vue +35 -44
- package/src/views/Console.vue +90 -341
- package/src/views/Editor.vue +123 -1176
- package/src/views/FilterBuilder.vue +251 -607
- package/src/views/Login.vue +14 -76
- package/src/views/Profiles.vue +25 -44
- package/src/views/Tasks.vue +100 -187
- package/static/offline.html +50 -192
- package/tailwind.config.js +26 -104
- package/vite.config.js +16 -73
- package/vue.config.js +32 -0
- package/workbox-config.js +11 -0
- package/artwork/image.png +0 -0
- package/dev-server.js +0 -136
- package/exit +0 -209
- package/jsconfig.json +0 -16
- package/src/assets/css/_utilities.scss +0 -388
- package/src/assets/img/background.svg.backup +0 -11
- package/src/components/icons/Check.vue +0 -5
- package/src/components/icons/Close.vue +0 -21
- package/src/components/icons/CloseX.vue +0 -5
- package/src/components/icons/Key.vue +0 -21
- package/src/components/icons/Pencil.vue +0 -21
- package/src/components/icons/Profile.vue +0 -18
- package/src/components/icons/Sell.vue +0 -21
- package/src/components/icons/Spinner.vue +0 -42
- package/src/components/icons/SquareCheck.vue +0 -18
- package/src/components/icons/SquareUncheck.vue +0 -18
- package/src/components/icons/Wildcard.vue +0 -18
- package/src/components/ui/controls/atomic/LoadingButton.vue +0 -45
- package/src/composables/useClickOutside.js +0 -21
- package/src/composables/useDropdownPosition.js +0 -174
- package/src/types/index.js +0 -41
- package/src/utils/debug.js +0 -1
- package/switch-branch.sh +0 -41
- package/workbox-config.cjs +0 -63
- /package/src/assets/img/{logo_icon-old.png → logo_icon_2.png} +0 -0
package/src/views/Login.vue
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
<template>
|
|
2
|
-
<div class="
|
|
3
|
-
<div class="
|
|
4
|
-
<
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
<h2 class="text-l text-white text-center font-bold mb-6">Please login to proceed</h2>
|
|
2
|
+
<div class="flex flex-col justify-center mt-20" v-once>
|
|
3
|
+
<div class="mx-auto flex w-auto rounded-xl mb-8">
|
|
4
|
+
<img src="@/assets/img/logo_trans.png" class="h-14 mr-4 z-30 object-cover" alt="Logo: Russonoro" />
|
|
5
|
+
</div>
|
|
6
|
+
<h2 class="text-3xl text-white text-center font-bold mb-4">Login</h2>
|
|
8
7
|
|
|
8
|
+
<div class="login">
|
|
9
9
|
<LoginForm />
|
|
10
10
|
</div>
|
|
11
11
|
</div>
|
|
@@ -14,76 +14,14 @@
|
|
|
14
14
|
import LoginForm from "@/components/Auth/LoginForm.vue";
|
|
15
15
|
</script>
|
|
16
16
|
<style lang="scss" scoped>
|
|
17
|
-
.login
|
|
18
|
-
@apply
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
// Landscape mode
|
|
27
|
-
@media (orientation: landscape) {
|
|
28
|
-
margin-top: 1vh;
|
|
29
|
-
justify-content: flex-start;
|
|
30
|
-
min-height: 100vh;
|
|
31
|
-
min-height: 100dvh;
|
|
32
|
-
}
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
.login-card {
|
|
36
|
-
@apply bg-dark-400 border border-dark-650 rounded-lg shadow-xl;
|
|
37
|
-
backdrop-filter: blur(10px);
|
|
38
|
-
box-shadow: 0 25px 50px -12px rgba(0, 0, 0, 0.5);
|
|
39
|
-
width: 100%;
|
|
40
|
-
max-width: 420px;
|
|
41
|
-
padding: 1.75rem;
|
|
42
|
-
|
|
43
|
-
// Mobile devices
|
|
44
|
-
@media (max-width: 480px) {
|
|
45
|
-
max-width: 380px;
|
|
46
|
-
padding: 1.5rem;
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
// Landscape mode
|
|
50
|
-
@media (orientation: landscape) {
|
|
51
|
-
padding: 1.25rem;
|
|
52
|
-
margin: 0.25rem 0;
|
|
53
|
-
|
|
54
|
-
h2 {
|
|
55
|
-
@apply text-lg mb-2;
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
.flex.justify-center {
|
|
59
|
-
@apply mb-2;
|
|
60
|
-
|
|
61
|
-
img {
|
|
62
|
-
@apply h-10;
|
|
63
|
-
}
|
|
64
|
-
}
|
|
65
|
-
}
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
// Logo responsive sizing
|
|
69
|
-
.login-card img {
|
|
70
|
-
@media (max-width: 480px) {
|
|
71
|
-
@apply h-12;
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
@media (orientation: landscape) {
|
|
75
|
-
@apply h-10;
|
|
76
|
-
}
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
// Title responsive sizing
|
|
80
|
-
.login-card h2 {
|
|
81
|
-
@media (max-width: 480px) {
|
|
82
|
-
@apply text-lg mb-3;
|
|
83
|
-
}
|
|
84
|
-
|
|
85
|
-
@media (orientation: landscape) {
|
|
86
|
-
@apply text-base mb-2;
|
|
17
|
+
.login {
|
|
18
|
+
// @apply m-auto;
|
|
19
|
+
@media (min-width: 900px) {
|
|
20
|
+
width: 400px;
|
|
21
|
+
@apply m-auto;
|
|
22
|
+
}
|
|
23
|
+
@media (max-width: 899px) {
|
|
24
|
+
@apply px-6;
|
|
87
25
|
}
|
|
88
26
|
}
|
|
89
27
|
</style>
|
package/src/views/Profiles.vue
CHANGED
|
@@ -1,14 +1,11 @@
|
|
|
1
1
|
<template>
|
|
2
2
|
<div>
|
|
3
|
-
<div class="flex
|
|
3
|
+
<div class="flex items-center justify-between">
|
|
4
4
|
<!-- Heading -->
|
|
5
|
-
<
|
|
6
|
-
|
|
7
|
-
<
|
|
8
|
-
|
|
9
|
-
<span class="text-subheading pl-1">{{ ui.getSelectedProfiles().length }}</span>
|
|
10
|
-
</h4>
|
|
11
|
-
</div>
|
|
5
|
+
<h4 class="text-white text-base font-bold mb-5 pt-5">
|
|
6
|
+
Profiles
|
|
7
|
+
<span class="text-light-300 pl-1">{{ ui.getSelectedProfiles().length }}</span>
|
|
8
|
+
</h4>
|
|
12
9
|
<ul class="mobile-icons">
|
|
13
10
|
<li>
|
|
14
11
|
<EyeToggle v-model="privacy" />
|
|
@@ -17,27 +14,18 @@
|
|
|
17
14
|
<button
|
|
18
15
|
:disabled="ui.disabledButtons['add-profiles']"
|
|
19
16
|
@click="ui.toggleModal('create-profile', true)"
|
|
20
|
-
class="smooth-hover"
|
|
21
17
|
>
|
|
22
|
-
<PlusIcon
|
|
18
|
+
<PlusIcon />
|
|
23
19
|
</button>
|
|
24
20
|
</li>
|
|
25
21
|
<li>
|
|
26
|
-
<button
|
|
27
|
-
|
|
28
|
-
@click="disable"
|
|
29
|
-
class="smooth-hover text-red-400"
|
|
30
|
-
>
|
|
31
|
-
<CloseXIcon />
|
|
22
|
+
<button :disabled="ui.disabledButtons['add-profiles']" @click="disable">
|
|
23
|
+
<img width="15px" src="/img/controls/disable.svg" />
|
|
32
24
|
</button>
|
|
33
25
|
</li>
|
|
34
26
|
<li>
|
|
35
|
-
<button
|
|
36
|
-
|
|
37
|
-
@click="enable"
|
|
38
|
-
class="smooth-hover text-green-400"
|
|
39
|
-
>
|
|
40
|
-
<CheckIcon />
|
|
27
|
+
<button :disabled="ui.disabledButtons['add-profiles']" @click="enable">
|
|
28
|
+
<img width="15px" src="/img/controls/enable.svg" />
|
|
41
29
|
</button>
|
|
42
30
|
</li>
|
|
43
31
|
</ul>
|
|
@@ -68,20 +56,20 @@
|
|
|
68
56
|
@change="(f) => (ui.search.profiles.tag = f)"
|
|
69
57
|
/> -->
|
|
70
58
|
<Dropdown
|
|
71
|
-
class="
|
|
59
|
+
class="rounded-r w-32 bg-dark-500 relative z-50 border-2 border-dark-550"
|
|
60
|
+
style="margin-left: 0 !important; border-width: 2px !important"
|
|
72
61
|
rightAmount="right-1"
|
|
73
62
|
default="Any"
|
|
74
63
|
:value="ui.search.profiles.tag"
|
|
75
64
|
:onClick="(f) => (ui.search.profiles.tag = f)"
|
|
76
65
|
:options="allTags"
|
|
77
|
-
:includeAdjacentButtons="true"
|
|
78
66
|
:capitalize="true"
|
|
79
67
|
/>
|
|
80
68
|
</div>
|
|
81
69
|
|
|
82
70
|
<div class="gap-3 lg:flex hidden">
|
|
83
71
|
<div
|
|
84
|
-
class="bg-dark-400
|
|
72
|
+
class="bg-dark-400 justify-between px-4 w-36 flex text-white text-sm items-center py-1 rounded-lg ml-auto h-10"
|
|
85
73
|
>
|
|
86
74
|
<p>Privacy</p>
|
|
87
75
|
<Switch class="scale-75" v-model="privacy" />
|
|
@@ -89,20 +77,20 @@
|
|
|
89
77
|
<button
|
|
90
78
|
:disabled="ui.disabledButtons['disable-profiles']"
|
|
91
79
|
@click="disable"
|
|
92
|
-
class="bg-red-400 disabled:opacity-70 smooth-hover
|
|
80
|
+
class="bg-red-400 disabled:opacity-70 smooth-hover w-36 flex text-white text-sm justify-center items-center py-1 px-2 rounded-lg ml-auto h-10"
|
|
93
81
|
>
|
|
94
|
-
Disable <img
|
|
82
|
+
Disable <img width="16px" src="/img/controls/disable.svg" class="ml-2" />
|
|
95
83
|
</button>
|
|
96
84
|
<button
|
|
97
85
|
:disabled="ui.disabledButtons['enable-profiles']"
|
|
98
86
|
@click="enable"
|
|
99
|
-
class="bg-green-400 disabled:opacity-70 smooth-hover
|
|
87
|
+
class="bg-green-400 disabled:opacity-70 smooth-hover w-36 flex text-white text-sm justify-center items-center py-1 px-2 rounded-lg ml-auto h-10"
|
|
100
88
|
>
|
|
101
|
-
Enable <img
|
|
89
|
+
Enable <img width="16px" src="/img/controls/enable.svg" class="ml-2" />
|
|
102
90
|
</button>
|
|
103
91
|
<button
|
|
104
92
|
:disabled="ui.disabledButtons['add-profiles']"
|
|
105
|
-
class="bg-dark-400 disabled:opacity-70 smooth-hover w-36 flex text-white text-
|
|
93
|
+
class="bg-dark-400 disabled:opacity-70 smooth-hover w-36 flex text-white text-sm justify-center items-center py-1 px-2 rounded-lg ml-auto h-10"
|
|
106
94
|
@click="ui.toggleModal('create-profile')"
|
|
107
95
|
>
|
|
108
96
|
Add Profile
|
|
@@ -112,10 +100,10 @@
|
|
|
112
100
|
</div>
|
|
113
101
|
|
|
114
102
|
<!-- Tasks (Table) -->
|
|
115
|
-
<ProfileView :
|
|
103
|
+
<ProfileView :tasks="processedTasks" />
|
|
116
104
|
|
|
117
105
|
<!-- Modal -->
|
|
118
|
-
<transition-group name="fade">
|
|
106
|
+
<transition-group name="fade" mode="out-in">
|
|
119
107
|
<CreateProfile v-if="activeModal === 'create-profile'" />
|
|
120
108
|
</transition-group>
|
|
121
109
|
</div>
|
|
@@ -124,25 +112,18 @@
|
|
|
124
112
|
.custom-dropdown-content {
|
|
125
113
|
top: 2.6rem !important;
|
|
126
114
|
left: -13px;
|
|
127
|
-
@apply border border-
|
|
128
|
-
}
|
|
129
|
-
|
|
130
|
-
/* Search dropdown should always be h-10 and have no left corners */
|
|
131
|
-
.search-dropdown {
|
|
132
|
-
height: 2.5rem !important; /* Always 40px regardless of screen size */
|
|
133
|
-
border-top-left-radius: 0 !important;
|
|
134
|
-
border-bottom-left-radius: 0 !important;
|
|
115
|
+
@apply border border-light-300;
|
|
135
116
|
}
|
|
136
117
|
</style>
|
|
137
118
|
<script setup>
|
|
138
119
|
import { computed, ref, watch } from "vue";
|
|
139
|
-
import ProfileView from "@/components/
|
|
140
|
-
import CreateProfile from "@/components/
|
|
120
|
+
import ProfileView from "@/components/editors/Profile/ProfileView.vue";
|
|
121
|
+
import CreateProfile from "@/components/editors/Profile/CreateProfile.vue";
|
|
141
122
|
import { useUIStore } from "@/stores/ui";
|
|
142
|
-
import { PlusIcon
|
|
123
|
+
import { PlusIcon } from "@/components/icons";
|
|
143
124
|
import Dropdown from "@/components/ui/controls/atomic/Dropdown.vue";
|
|
144
125
|
import EyeToggle from "@/components/ui/controls/EyeToggle.vue";
|
|
145
|
-
import TagToggle from "@/components/
|
|
126
|
+
import TagToggle from "@/components/editors/TagToggle.vue";
|
|
146
127
|
import Switch from "@/components/ui/controls/atomic/Switch.vue";
|
|
147
128
|
|
|
148
129
|
const ui = useUIStore();
|
package/src/views/Tasks.vue
CHANGED
|
@@ -1,186 +1,105 @@
|
|
|
1
1
|
<template>
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
>
|
|
27
|
-
<PlusIcon class="w-4 h-4" />
|
|
28
|
-
</button>
|
|
29
|
-
</li>
|
|
30
|
-
<li>
|
|
31
|
-
<button @click="ui.deleteTasks()"><TrashIcon class="h-3.5 w-3.5" /></button>
|
|
32
|
-
</li>
|
|
33
|
-
</ul>
|
|
34
|
-
</div>
|
|
35
|
-
|
|
36
|
-
<div class="controls-wrapper">
|
|
37
|
-
<Stats class="stats-component" />
|
|
38
|
-
|
|
39
|
-
<div class="controls-wrapper lg:mb-3">
|
|
40
|
-
<DesktopControls
|
|
41
|
-
class="desktop-controls-hide"
|
|
42
|
-
@stopAll="ui.stopTasks()"
|
|
43
|
-
@startAll="ui.startTasks()"
|
|
44
|
-
@deleteAll="ui.deleteTasks()"
|
|
45
|
-
/>
|
|
46
|
-
</div>
|
|
47
|
-
|
|
48
|
-
<div class="flex items-center justify-between gap-2 lg:mb-2 mb-1 filter-controls">
|
|
49
|
-
<div
|
|
50
|
-
v-if="uniqEventIds.length > 1"
|
|
51
|
-
class="flex-1 md:min-w-96 md:max-w-96 md:flex-none min-w-0"
|
|
52
|
-
>
|
|
53
|
-
<Dropdown
|
|
54
|
-
:onClick="(f) => ui.setCurrentEvent(f)"
|
|
55
|
-
default="All events"
|
|
56
|
-
:chosen="ui.currentEvent"
|
|
57
|
-
:options="uniqEventIds"
|
|
58
|
-
:allowDefault="true"
|
|
59
|
-
class="input-default w-full hover:bg-dark-400 event-dropdown"
|
|
60
|
-
rightAmount="right-2"
|
|
61
|
-
/>
|
|
2
|
+
<div>
|
|
3
|
+
<div class="flex gap-5 items-center pt-5 pb-2">
|
|
4
|
+
<!-- Heading -->
|
|
5
|
+
<GearIcon class="w-5 cursor-pointer" @click="ui.toggleModal('quick-settings')" />
|
|
6
|
+
<h4 class="text-white text-base font-bold">
|
|
7
|
+
Tasks
|
|
8
|
+
<span class="text-light-300 pl-1">{{ taskCount }}</span>
|
|
9
|
+
</h4>
|
|
10
|
+
<ul class="mobile-icons">
|
|
11
|
+
<li>
|
|
12
|
+
<button
|
|
13
|
+
class="text-sm"
|
|
14
|
+
:disabled="ui.disabledButtons['add-tasks']"
|
|
15
|
+
@click="ui.toggleModal('create-task')"
|
|
16
|
+
>
|
|
17
|
+
<span class="mb-0.5">+</span>
|
|
18
|
+
</button>
|
|
19
|
+
</li>
|
|
20
|
+
<li>
|
|
21
|
+
<button @click="ui.deleteTasks()">
|
|
22
|
+
<TrashIcon class="h-3.5 w-3.5" />
|
|
23
|
+
</button>
|
|
24
|
+
</li>
|
|
25
|
+
</ul>
|
|
62
26
|
</div>
|
|
63
|
-
<PriceSortToggle
|
|
64
|
-
class="min-w-24 max-w-28 flex-shrink-0"
|
|
65
|
-
:options="['All', 'Checkout']"
|
|
66
|
-
:darker="true"
|
|
67
|
-
:current="ui.taskFilter"
|
|
68
|
-
@change="(e) => ui.setTaskFilter(e)"
|
|
69
|
-
/>
|
|
70
|
-
</div>
|
|
71
27
|
|
|
72
|
-
|
|
28
|
+
<Stats />
|
|
29
|
+
|
|
30
|
+
<!-- Controls -->
|
|
31
|
+
<div class="controls-wrapper mb-6 sm:ml-0 md:ml-0.5 lg:ml-0 ml-0">
|
|
32
|
+
<DesktopControls
|
|
33
|
+
class="hidden lg:flex"
|
|
34
|
+
@stopAll="ui.stopTasks()"
|
|
35
|
+
@startAll="ui.startTasks()"
|
|
36
|
+
@expand="ui.expandTasks()"
|
|
37
|
+
@decrease="ui.decreaseTasks()"
|
|
38
|
+
@deleteAll="ui.deleteTasks()"
|
|
39
|
+
/>
|
|
40
|
+
<MobileControls
|
|
41
|
+
class="flex lg:hidden"
|
|
42
|
+
@stopAll="ui.stopTasks()"
|
|
43
|
+
@startAll="ui.startTasks()"
|
|
44
|
+
@deleteAll="ui.deleteTasks()"
|
|
45
|
+
@expand="ui.expandTasks()"
|
|
46
|
+
@decrease="ui.decreaseTasks()"
|
|
47
|
+
/>
|
|
48
|
+
</div>
|
|
49
|
+
<div class="flex items-center gap-2 mb-2">
|
|
50
|
+
<div
|
|
51
|
+
v-if="uniqEventIds.length > 1"
|
|
52
|
+
class="w-full min-w-32 max-w-72 md:max-w-48 flex rounded input-default hover:bg-dark-400"
|
|
53
|
+
style="height: 2.5rem !important"
|
|
54
|
+
>
|
|
55
|
+
<Dropdown
|
|
56
|
+
:onClick="(f) => ui.setCurrentEvent(f)"
|
|
57
|
+
default="All events"
|
|
58
|
+
:chosen="ui.currentEvent"
|
|
59
|
+
:options="uniqEventIds"
|
|
60
|
+
:allowDefault="true"
|
|
61
|
+
class="w-56"
|
|
62
|
+
rightAmount="right-2"
|
|
63
|
+
/>
|
|
64
|
+
</div>
|
|
65
|
+
<div>
|
|
66
|
+
<PriceSortToggle
|
|
67
|
+
class="h-10 hover:bg-dark-400 border-dark-550 border-2 min-w-24"
|
|
68
|
+
:options="['All', 'Checkout']"
|
|
69
|
+
:darker="true"
|
|
70
|
+
:current="ui.taskFilter"
|
|
71
|
+
@change="(e) => ui.setTaskFilter(e)"
|
|
72
|
+
/>
|
|
73
|
+
</div>
|
|
74
|
+
</div>
|
|
73
75
|
|
|
74
|
-
|
|
76
|
+
<!-- Tasks (Table) -->
|
|
77
|
+
<TaskView class="mb-6" :tasks="ui.tasks" />
|
|
78
|
+
<!-- Utilities -->
|
|
79
|
+
<Utilities />
|
|
80
|
+
<!-- Modal -->
|
|
81
|
+
<transition-group name="fade" mode="out-in">
|
|
82
|
+
<CreateTaskTM v-if="ui.currentModule == 'TM' && activeModal === 'create-task'" @new="ui.addNewTask" />
|
|
83
|
+
<CreateTaskAXS v-if="ui.currentModule == 'AXS' && activeModal === 'create-task'" @new="ui.addNewTask" />
|
|
84
|
+
|
|
85
|
+
<!-- TODO: make the same changes as above -->
|
|
86
|
+
<CheckStock v-if="activeModal === 'check-stock'" />
|
|
87
|
+
<ScrapeVenue v-if="activeModal === 'scrape-venue'" />
|
|
88
|
+
<MassEditPresaleCode v-if="activeModal === 'mass-edit-presale-code'" />
|
|
89
|
+
<QuickSettings v-if="activeModal === 'quick-settings'" />
|
|
90
|
+
</transition-group>
|
|
75
91
|
</div>
|
|
76
|
-
|
|
77
|
-
<transition-group name="fade">
|
|
78
|
-
<CreateTaskTM
|
|
79
|
-
v-if="ui.currentModule == 'TM' && activeModal === 'create-task'"
|
|
80
|
-
@new="ui.addNewTask"
|
|
81
|
-
/>
|
|
82
|
-
<CreateTaskAXS
|
|
83
|
-
v-if="ui.currentModule == 'AXS' && activeModal === 'create-task'"
|
|
84
|
-
@new="ui.addNewTask"
|
|
85
|
-
/>
|
|
86
|
-
<CheckStock v-if="activeModal === 'check-stock'" />
|
|
87
|
-
<ScrapeVenue v-if="activeModal === 'scrape-venue'" />
|
|
88
|
-
<MassEditPresaleCode v-if="activeModal === 'mass-edit-presale-code'" />
|
|
89
|
-
<QuickSettings v-if="activeModal === 'quick-settings'" />
|
|
90
|
-
</transition-group>
|
|
91
|
-
</div>
|
|
92
92
|
</template>
|
|
93
93
|
<style lang="scss" scoped>
|
|
94
94
|
.custom-dropdown-content {
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
}
|
|
99
|
-
|
|
100
|
-
/* ==========================================================================
|
|
101
|
-
TASKS PAGE RESPONSIVE LAYOUT - MOBILE FIRST
|
|
102
|
-
========================================================================== */
|
|
103
|
-
|
|
104
|
-
/* Default mobile layout */
|
|
105
|
-
.desktop-controls-hide {
|
|
106
|
-
display: none;
|
|
107
|
-
}
|
|
108
|
-
|
|
109
|
-
.mobile-header-controls {
|
|
110
|
-
display: flex;
|
|
111
|
-
}
|
|
112
|
-
|
|
113
|
-
/* Event dropdown base styling */
|
|
114
|
-
.event-dropdown {
|
|
115
|
-
min-width: 0;
|
|
116
|
-
/* Match PriceSortToggle height instead of input-default */
|
|
117
|
-
height: 40px !important;
|
|
118
|
-
}
|
|
119
|
-
|
|
120
|
-
.event-dropdown .dropdown-value {
|
|
121
|
-
max-width: 100%;
|
|
122
|
-
overflow: hidden;
|
|
123
|
-
text-overflow: ellipsis;
|
|
124
|
-
white-space: nowrap;
|
|
125
|
-
}
|
|
126
|
-
|
|
127
|
-
/* Small mobile screens (portrait) */
|
|
128
|
-
@media (max-width: 480px) and (orientation: portrait) {
|
|
129
|
-
.event-dropdown {
|
|
130
|
-
height: 40px !important; /* Match PriceSortToggle height exactly */
|
|
131
|
-
}
|
|
132
|
-
|
|
133
|
-
.event-dropdown .dropdown-value {
|
|
134
|
-
max-width: calc(100vw - 140px);
|
|
135
|
-
font-size: 0.875rem;
|
|
136
|
-
}
|
|
137
|
-
|
|
138
|
-
.event-dropdown .dropdown-display {
|
|
139
|
-
padding-right: 2rem;
|
|
140
|
-
}
|
|
141
|
-
}
|
|
142
|
-
|
|
143
|
-
/* Extra small screens */
|
|
144
|
-
@media (max-width: 375px) and (orientation: portrait) {
|
|
145
|
-
.event-dropdown {
|
|
146
|
-
height: 40px !important; /* Maintain 40px height to match PriceSortToggle */
|
|
147
|
-
}
|
|
148
|
-
|
|
149
|
-
.event-dropdown .dropdown-value {
|
|
150
|
-
max-width: calc(100vw - 120px);
|
|
151
|
-
font-size: 0.8rem;
|
|
152
|
-
}
|
|
153
|
-
}
|
|
154
|
-
|
|
155
|
-
/* Mobile landscape - hide non-essential elements */
|
|
156
|
-
@media (max-height: 500px) and (orientation: landscape) {
|
|
157
|
-
.stats-component,
|
|
158
|
-
.utilities-section,
|
|
159
|
-
.filter-controls {
|
|
160
|
-
display: none;
|
|
161
|
-
}
|
|
162
|
-
|
|
163
|
-
.flex-between.pb-2 {
|
|
164
|
-
padding-top: 1rem !important;
|
|
165
|
-
padding-bottom: 0.25rem;
|
|
166
|
-
margin-bottom: 0.25rem;
|
|
167
|
-
}
|
|
168
|
-
}
|
|
169
|
-
|
|
170
|
-
/* Tablet and small desktop - show desktop controls */
|
|
171
|
-
@media (min-width: 650px) {
|
|
172
|
-
.desktop-controls-hide {
|
|
173
|
-
display: flex;
|
|
174
|
-
}
|
|
175
|
-
|
|
176
|
-
.mobile-header-controls {
|
|
177
|
-
display: none;
|
|
178
|
-
}
|
|
95
|
+
top: 2.6rem !important;
|
|
96
|
+
left: -13px;
|
|
97
|
+
@apply border border-light-300;
|
|
179
98
|
}
|
|
180
99
|
</style>
|
|
181
100
|
<script setup>
|
|
182
|
-
import { computed
|
|
183
|
-
import { DesktopControls } from "@/components/Tasks/Controls";
|
|
101
|
+
import { computed } from "vue";
|
|
102
|
+
import { MobileControls, DesktopControls } from "@/components/Tasks/Controls";
|
|
184
103
|
import TaskView from "@/components/Tasks/TaskView.vue";
|
|
185
104
|
import Utilities from "@/components/Tasks/Utilities.vue";
|
|
186
105
|
import CreateTaskTM from "@/components/Tasks/CreateTaskTM.vue";
|
|
@@ -191,28 +110,22 @@ import MassEditPresaleCode from "@/components/Tasks/MassEdit.vue";
|
|
|
191
110
|
import Dropdown from "@/components/ui/controls/atomic/Dropdown.vue";
|
|
192
111
|
import Stats from "@/components/Tasks/Stats.vue";
|
|
193
112
|
import { useUIStore } from "@/stores/ui";
|
|
194
|
-
import { TrashIcon, GearIcon
|
|
113
|
+
import { TrashIcon, GearIcon } from "@/components/icons";
|
|
195
114
|
import QuickSettings from "@/components/Tasks/QuickSettings.vue";
|
|
196
115
|
import PriceSortToggle from "@/components/Filter/PriceSortToggle.vue";
|
|
197
|
-
|
|
198
116
|
const ui = useUIStore();
|
|
199
117
|
const activeModal = computed(() => ui.activeModal);
|
|
200
118
|
const taskCount = computed(() => Object.keys(ui.getSelectedTasks()).length);
|
|
201
119
|
ui.refreshQueueStats();
|
|
202
120
|
|
|
203
|
-
// Ensure "All events" is always selected on page load
|
|
204
|
-
onMounted(() => {
|
|
205
|
-
ui.setCurrentEvent("");
|
|
206
|
-
});
|
|
207
|
-
|
|
208
121
|
const uniqEventIds = computed(() => {
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
122
|
+
const ids = [
|
|
123
|
+
...new Set(
|
|
124
|
+
Object.values(ui.tasks)
|
|
125
|
+
.filter((t) => t.siteId === ui.currentCountry.siteId && !t.eventId.includes("@"))
|
|
126
|
+
.map((v) => v.eventId)
|
|
127
|
+
)
|
|
128
|
+
];
|
|
129
|
+
return ids;
|
|
217
130
|
});
|
|
218
131
|
</script>
|