@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.
Files changed (133) hide show
  1. package/.prettierrc +1 -27
  2. package/.vscode/extensions.json +1 -1
  3. package/README.md +79 -43
  4. package/backend/api.js +48 -40
  5. package/backend/auth.js +3 -3
  6. package/backend/batching.js +1 -1
  7. package/backend/endpoints.js +77 -13
  8. package/backend/index.js +2 -2
  9. package/backend/mock-data.js +38 -29
  10. package/backend/mock-src/classes/logger.js +8 -8
  11. package/backend/mock-src/classes/utils.js +3 -7
  12. package/backend/mock-src/database.js +0 -0
  13. package/backend/mock-src/ticketmaster.js +79 -79
  14. package/backend/validator.js +2 -2
  15. package/config/configs.json +3 -2
  16. package/config/filter.json +3 -2
  17. package/index.html +10 -81
  18. package/index.js +1 -1
  19. package/package.json +25 -40
  20. package/postcss.config.js +1 -1
  21. package/postinstall.js +17 -98
  22. package/public/android-chrome-192x192.png +0 -0
  23. package/public/android-chrome-512x512.png +0 -0
  24. package/public/apple-touch-icon.png +0 -0
  25. package/public/favicon-16x16.png +0 -0
  26. package/public/favicon-32x32.png +0 -0
  27. package/public/favicon.ico +0 -0
  28. package/public/manifest.json +7 -12
  29. package/public/sw.js +2 -0
  30. package/public/workbox-49fdaf31.js +2 -0
  31. package/public/workbox-49fdaf31.js.map +1 -0
  32. package/public/workbox-88575b92.js +2 -0
  33. package/public/workbox-88575b92.js.map +1 -0
  34. package/public/workbox-a67a7b11.js +2 -0
  35. package/public/workbox-a67a7b11.js.map +1 -0
  36. package/public/workbox-d4314735.js +2 -0
  37. package/public/workbox-d4314735.js.map +1 -0
  38. package/public/workbox-e0f89ef3.js +2 -0
  39. package/public/workbox-e0f89ef3.js.map +1 -0
  40. package/run +9 -176
  41. package/src/App.vue +85 -498
  42. package/src/assets/css/_input.scss +99 -144
  43. package/src/assets/css/main.scss +99 -450
  44. package/src/assets/img/background.svg +2 -2
  45. package/src/assets/img/logo_icon.png +0 -0
  46. package/src/components/Auth/LoginForm.vue +11 -62
  47. package/src/components/Editors/Account/Account.vue +40 -116
  48. package/src/components/Editors/Account/AccountCreator.vue +39 -88
  49. package/src/components/Editors/Account/AccountView.vue +34 -102
  50. package/src/components/Editors/Account/CreateAccount.vue +32 -80
  51. package/src/components/Editors/Profile/CreateProfile.vue +83 -269
  52. package/src/components/Editors/Profile/Profile.vue +47 -132
  53. package/src/components/Editors/Profile/ProfileCountryChooser.vue +20 -82
  54. package/src/components/Editors/Profile/ProfileView.vue +34 -91
  55. package/src/components/Editors/TagLabel.vue +6 -67
  56. package/src/components/Filter/Filter.vue +72 -289
  57. package/src/components/Filter/FilterPreview.vue +30 -171
  58. package/src/components/Filter/PriceSortToggle.vue +4 -74
  59. package/src/components/Table/Header.vue +1 -1
  60. package/src/components/Table/Row.vue +1 -1
  61. package/src/components/Table/Table.vue +2 -19
  62. package/src/components/Tasks/CheckStock.vue +13 -28
  63. package/src/components/Tasks/Controls/DesktopControls.vue +17 -17
  64. package/src/components/Tasks/Controls/MobileControls.vue +45 -8
  65. package/src/components/Tasks/CreateTaskAXS.vue +73 -79
  66. package/src/components/Tasks/CreateTaskTM.vue +142 -94
  67. package/src/components/Tasks/MassEdit.vue +7 -9
  68. package/src/components/Tasks/QuickSettings.vue +55 -169
  69. package/src/components/Tasks/ScrapeVenue.vue +4 -7
  70. package/src/components/Tasks/Stats.vue +23 -52
  71. package/src/components/Tasks/Task.vue +136 -378
  72. package/src/components/Tasks/TaskView.vue +47 -107
  73. package/src/components/Tasks/Utilities.vue +6 -5
  74. package/src/components/icons/Bag.vue +1 -1
  75. package/src/components/icons/Loyalty.vue +1 -1
  76. package/src/components/icons/Mail.vue +2 -2
  77. package/src/components/icons/Play.vue +2 -2
  78. package/src/components/icons/Reload.vue +5 -4
  79. package/src/components/icons/Sandclock.vue +2 -2
  80. package/src/components/icons/Stadium.vue +1 -1
  81. package/src/components/icons/index.js +1 -24
  82. package/src/components/ui/Modal.vue +13 -105
  83. package/src/components/ui/Navbar.vue +38 -171
  84. package/src/components/ui/ReconnectIndicator.vue +55 -351
  85. package/src/components/ui/Splash.vue +35 -5
  86. package/src/components/ui/controls/CountryChooser.vue +62 -200
  87. package/src/components/ui/controls/atomic/Checkbox.vue +10 -119
  88. package/src/components/ui/controls/atomic/Dropdown.vue +39 -208
  89. package/src/components/ui/controls/atomic/MultiDropdown.vue +37 -300
  90. package/src/libs/Filter.js +170 -200
  91. package/src/registerServiceWorker.js +1 -1
  92. package/src/stores/connection.js +53 -51
  93. package/src/stores/logger.js +3 -11
  94. package/src/stores/sampleData.js +235 -207
  95. package/src/stores/ui.js +44 -112
  96. package/src/stores/utils.js +6 -90
  97. package/src/views/Accounts.vue +35 -44
  98. package/src/views/Console.vue +90 -341
  99. package/src/views/Editor.vue +123 -1176
  100. package/src/views/FilterBuilder.vue +251 -607
  101. package/src/views/Login.vue +14 -76
  102. package/src/views/Profiles.vue +25 -44
  103. package/src/views/Tasks.vue +100 -187
  104. package/static/offline.html +50 -192
  105. package/tailwind.config.js +26 -104
  106. package/vite.config.js +16 -73
  107. package/vue.config.js +32 -0
  108. package/workbox-config.js +11 -0
  109. package/artwork/image.png +0 -0
  110. package/dev-server.js +0 -136
  111. package/exit +0 -209
  112. package/jsconfig.json +0 -16
  113. package/src/assets/css/_utilities.scss +0 -388
  114. package/src/assets/img/background.svg.backup +0 -11
  115. package/src/components/icons/Check.vue +0 -5
  116. package/src/components/icons/Close.vue +0 -21
  117. package/src/components/icons/CloseX.vue +0 -5
  118. package/src/components/icons/Key.vue +0 -21
  119. package/src/components/icons/Pencil.vue +0 -21
  120. package/src/components/icons/Profile.vue +0 -18
  121. package/src/components/icons/Sell.vue +0 -21
  122. package/src/components/icons/Spinner.vue +0 -42
  123. package/src/components/icons/SquareCheck.vue +0 -18
  124. package/src/components/icons/SquareUncheck.vue +0 -18
  125. package/src/components/icons/Wildcard.vue +0 -18
  126. package/src/components/ui/controls/atomic/LoadingButton.vue +0 -45
  127. package/src/composables/useClickOutside.js +0 -21
  128. package/src/composables/useDropdownPosition.js +0 -174
  129. package/src/types/index.js +0 -41
  130. package/src/utils/debug.js +0 -1
  131. package/switch-branch.sh +0 -41
  132. package/workbox-config.cjs +0 -63
  133. /package/src/assets/img/{logo_icon-old.png → logo_icon_2.png} +0 -0
@@ -1,11 +1,11 @@
1
1
  <template>
2
- <div class="login-container" v-once>
3
- <div class="login-card">
4
- <div class="flex justify-center mb-8">
5
- <img src="@/assets/img/logo_trans.png" class="h-16 object-cover" alt="Logo: Necro" />
6
- </div>
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-container {
18
- @apply flex flex-col items-center min-h-screen px-4;
19
- margin-top: 3vh;
20
-
21
- // Mobile devices
22
- @media (max-width: 480px) {
23
- margin-top: 2vh;
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>
@@ -1,14 +1,11 @@
1
1
  <template>
2
2
  <div>
3
- <div class="flex-between pt-5 pb-2">
3
+ <div class="flex items-center justify-between">
4
4
  <!-- Heading -->
5
- <div class="flex-center gap-4">
6
- <GroupIcon class="cursor-pointer smooth-hover text-white" />
7
- <h4 class="text-heading">
8
- Profiles
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 class="w-4 h-4" />
18
+ <PlusIcon />
23
19
  </button>
24
20
  </li>
25
21
  <li>
26
- <button
27
- :disabled="ui.disabledButtons['add-profiles']"
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
- :disabled="ui.disabledButtons['add-profiles']"
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="dropdown-base rounded-r-lg w-32 relative z-50 search-dropdown"
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 border border-dark-650 justify-between px-4 w-36 flex text-white text-xs font-medium items-center rounded-md ml-auto h-10"
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 border-none w-36 flex text-white text-xs font-medium justify-center items-center rounded-md ml-auto h-10"
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 class="w-4 h-4 ml-2" src="/img/controls/disable.svg" />
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 border-none w-36 flex text-white text-xs font-medium justify-center items-center rounded-md ml-auto h-10"
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 class="w-4 h-4 ml-2" src="/img/controls/enable.svg" />
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-xs font-medium justify-center items-center rounded-md border border-dark-650 hover:border-dark-700 ml-auto h-10"
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 :profiles="processedTasks" />
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-dark-650;
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/Editors/Profile/ProfileView.vue";
140
- import CreateProfile from "@/components/Editors/Profile/CreateProfile.vue";
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, GroupIcon, CloseXIcon, CheckIcon } from "@/components/icons";
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/Editors/TagToggle.vue";
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();
@@ -1,186 +1,105 @@
1
1
  <template>
2
- <div class="tasks-page">
3
- <div class="flex-between pb-2" style="padding-top: 1.5rem">
4
- <div class="flex-center gap-4">
5
- <GearIcon
6
- class="w-5 cursor-pointer smooth-hover"
7
- @click="ui.toggleModal('quick-settings')"
8
- />
9
- <h4 class="text-heading">
10
- Tasks
11
- <span class="text-subheading pl-1">{{ taskCount }}</span>
12
- </h4>
13
- </div>
14
- <ul class="mobile-icons mobile-header-controls">
15
- <li>
16
- <button @click="ui.startTasks()"><PlayIcon class="w-4 h-4" /></button>
17
- </li>
18
- <li>
19
- <button @click="ui.stopTasks()"><PauseIcon class="w-4 h-4" /></button>
20
- </li>
21
- <li>
22
- <button
23
- class="text-sm"
24
- :disabled="ui.disabledButtons['add-tasks']"
25
- @click="ui.toggleModal('create-task')"
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
- <TaskView class="lg:mb-6 mb-3" :tasks="ui.tasks" />
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
- <Utilities class="utilities-section" />
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
- top: 2.6rem !important;
96
- left: -13px;
97
- @apply border border-dark-650;
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, onMounted } from "vue";
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, PlusIcon, PlayIcon, PauseIcon } from "@/components/icons";
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
- const ids = [
210
- ...new Set(
211
- Object.values(ui.tasks)
212
- .filter((t) => t.siteId === ui.currentCountry.siteId && !t.eventId?.includes("@"))
213
- .map((v) => `${v.eventName} (${v.eventId})`)
214
- ),
215
- ];
216
- return ids;
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>