@necrolab/dashboard 0.4.3

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 (240) hide show
  1. package/.claude/settings.local.json +45 -0
  2. package/.eslintrc.js +24 -0
  3. package/.prettierignore +1 -0
  4. package/.prettierrc +10 -0
  5. package/.vscode/extensions.json +3 -0
  6. package/ICONS.md +21 -0
  7. package/README.md +65 -0
  8. package/backend/api.js +430 -0
  9. package/backend/auth.js +62 -0
  10. package/backend/batching.js +43 -0
  11. package/backend/endpoints.js +343 -0
  12. package/backend/index.js +23 -0
  13. package/backend/mock-data.js +66 -0
  14. package/backend/mock-src/classes/logger.js +112 -0
  15. package/backend/mock-src/classes/utils.js +42 -0
  16. package/backend/mock-src/ticketmaster.js +92 -0
  17. package/backend/validator.js +62 -0
  18. package/config/configs.json +20 -0
  19. package/config/filter.json +3 -0
  20. package/config/presale.csv +3 -0
  21. package/config/proxies.txt +6 -0
  22. package/config/used-codes.json +4 -0
  23. package/index.html +114 -0
  24. package/index.js +2 -0
  25. package/jsconfig.json +16 -0
  26. package/package.json +48 -0
  27. package/postcss.config.js +6 -0
  28. package/postinstall.js +9 -0
  29. package/public/android-chrome-192x192.png +0 -0
  30. package/public/android-chrome-512x512.png +0 -0
  31. package/public/apple-touch-icon.png +0 -0
  32. package/public/favicon-16x16.png +0 -0
  33. package/public/favicon-32x32.png +0 -0
  34. package/public/favicon.ico +0 -0
  35. package/public/flags/ae.svg +1 -0
  36. package/public/flags/at.svg +1 -0
  37. package/public/flags/au.svg +1 -0
  38. package/public/flags/be.svg +1 -0
  39. package/public/flags/ch.svg +1 -0
  40. package/public/flags/cz.svg +1 -0
  41. package/public/flags/de.svg +1 -0
  42. package/public/flags/dk.svg +1 -0
  43. package/public/flags/es.svg +1 -0
  44. package/public/flags/nl.svg +1 -0
  45. package/public/flags/no.svg +1 -0
  46. package/public/flags/nz.svg +1 -0
  47. package/public/flags/pl.svg +1 -0
  48. package/public/flags/se.svg +1 -0
  49. package/public/flags/uk.svg +1 -0
  50. package/public/flags/us.svg +1 -0
  51. package/public/img/award.svg +3 -0
  52. package/public/img/background.svg +14 -0
  53. package/public/img/bag_w.svg +12 -0
  54. package/public/img/banks/amex.svg +4 -0
  55. package/public/img/banks/mastercard.svg +4 -0
  56. package/public/img/banks/visa.svg +4 -0
  57. package/public/img/camera.svg +3 -0
  58. package/public/img/close.svg +3 -0
  59. package/public/img/controls/disable.svg +5 -0
  60. package/public/img/controls/enable.svg +5 -0
  61. package/public/img/groups.svg +3 -0
  62. package/public/img/hand.svg +3 -0
  63. package/public/img/key.svg +3 -0
  64. package/public/img/logo.png +0 -0
  65. package/public/img/logo_icon.png +0 -0
  66. package/public/img/logo_icon_2.png +0 -0
  67. package/public/img/logo_trans.png +0 -0
  68. package/public/img/loyalty.svg +3 -0
  69. package/public/img/mail.svg +3 -0
  70. package/public/img/pencil.svg +3 -0
  71. package/public/img/profile.svg +4 -0
  72. package/public/img/reload.svg +3 -0
  73. package/public/img/sandclock.svg +25 -0
  74. package/public/img/save.svg +5 -0
  75. package/public/img/savings.svg +3 -0
  76. package/public/img/scanner.svg +3 -0
  77. package/public/img/sell.svg +3 -0
  78. package/public/img/shield.svg +3 -0
  79. package/public/img/ski.svg +3 -0
  80. package/public/img/stadium.svg +8 -0
  81. package/public/img/stadium_w.svg +8 -0
  82. package/public/img/timer.svg +3 -0
  83. package/public/manifest.json +27 -0
  84. package/public/robots.txt +2 -0
  85. package/run +10 -0
  86. package/src/App.vue +307 -0
  87. package/src/assets/css/_input.scss +197 -0
  88. package/src/assets/css/main.scss +269 -0
  89. package/src/assets/css/tailwind.css +3 -0
  90. package/src/assets/img/award.svg +3 -0
  91. package/src/assets/img/background.svg +11 -0
  92. package/src/assets/img/camera.svg +3 -0
  93. package/src/assets/img/close.svg +3 -0
  94. package/src/assets/img/eyes/closed.svg +13 -0
  95. package/src/assets/img/eyes/open.svg +12 -0
  96. package/src/assets/img/groups.svg +3 -0
  97. package/src/assets/img/hand.svg +3 -0
  98. package/src/assets/img/key.svg +3 -0
  99. package/src/assets/img/logo.png +0 -0
  100. package/src/assets/img/logo_icon.png +0 -0
  101. package/src/assets/img/logo_icon_2.png +0 -0
  102. package/src/assets/img/logo_trans.png +0 -0
  103. package/src/assets/img/loyalty.svg +3 -0
  104. package/src/assets/img/mail.svg +3 -0
  105. package/src/assets/img/pencil.svg +3 -0
  106. package/src/assets/img/reload.svg +3 -0
  107. package/src/assets/img/savings.svg +3 -0
  108. package/src/assets/img/scanner.svg +3 -0
  109. package/src/assets/img/sell.svg +3 -0
  110. package/src/assets/img/shield.svg +3 -0
  111. package/src/assets/img/ski.svg +3 -0
  112. package/src/assets/img/square_check.svg +5 -0
  113. package/src/assets/img/square_uncheck.svg +5 -0
  114. package/src/assets/img/stadium.svg +8 -0
  115. package/src/assets/img/timer.svg +3 -0
  116. package/src/assets/img/wildcard.svg +7 -0
  117. package/src/components/Auth/LoginForm.vue +48 -0
  118. package/src/components/Editors/Account/Account.vue +119 -0
  119. package/src/components/Editors/Account/AccountCreator.vue +147 -0
  120. package/src/components/Editors/Account/AccountView.vue +87 -0
  121. package/src/components/Editors/Account/CreateAccount.vue +106 -0
  122. package/src/components/Editors/Profile/CreateProfile.vue +321 -0
  123. package/src/components/Editors/Profile/Profile.vue +142 -0
  124. package/src/components/Editors/Profile/ProfileCountryChooser.vue +75 -0
  125. package/src/components/Editors/Profile/ProfileView.vue +96 -0
  126. package/src/components/Editors/TagLabel.vue +16 -0
  127. package/src/components/Editors/TagToggle.vue +41 -0
  128. package/src/components/Filter/Filter.vue +409 -0
  129. package/src/components/Filter/FilterPreview.vue +236 -0
  130. package/src/components/Filter/PriceSortToggle.vue +105 -0
  131. package/src/components/Table/Header.vue +5 -0
  132. package/src/components/Table/Row.vue +5 -0
  133. package/src/components/Table/Table.vue +14 -0
  134. package/src/components/Table/index.js +4 -0
  135. package/src/components/Tasks/CheckStock.vue +62 -0
  136. package/src/components/Tasks/Controls/DesktopControls.vue +73 -0
  137. package/src/components/Tasks/Controls/MobileControls.vue +32 -0
  138. package/src/components/Tasks/Controls/index.js +3 -0
  139. package/src/components/Tasks/CreateTaskAXS.vue +339 -0
  140. package/src/components/Tasks/CreateTaskTM.vue +459 -0
  141. package/src/components/Tasks/MassEdit.vue +50 -0
  142. package/src/components/Tasks/QuickSettings.vue +167 -0
  143. package/src/components/Tasks/ScrapeVenue.vue +42 -0
  144. package/src/components/Tasks/Stats.vue +66 -0
  145. package/src/components/Tasks/Task.vue +296 -0
  146. package/src/components/Tasks/TaskLabel.vue +20 -0
  147. package/src/components/Tasks/TaskView.vue +126 -0
  148. package/src/components/Tasks/Utilities.vue +33 -0
  149. package/src/components/icons/Award.vue +8 -0
  150. package/src/components/icons/Bag.vue +8 -0
  151. package/src/components/icons/BagWhite.vue +8 -0
  152. package/src/components/icons/Box.vue +8 -0
  153. package/src/components/icons/Camera.vue +8 -0
  154. package/src/components/icons/Cart.vue +8 -0
  155. package/src/components/icons/Check.vue +5 -0
  156. package/src/components/icons/Checkmark.vue +11 -0
  157. package/src/components/icons/Click.vue +8 -0
  158. package/src/components/icons/Close.vue +21 -0
  159. package/src/components/icons/CloseX.vue +5 -0
  160. package/src/components/icons/Console.vue +13 -0
  161. package/src/components/icons/Down.vue +8 -0
  162. package/src/components/icons/Edit.vue +13 -0
  163. package/src/components/icons/Event.vue +8 -0
  164. package/src/components/icons/Expand.vue +8 -0
  165. package/src/components/icons/Filter.vue +13 -0
  166. package/src/components/icons/Gear.vue +8 -0
  167. package/src/components/icons/Group.vue +8 -0
  168. package/src/components/icons/Hand.vue +8 -0
  169. package/src/components/icons/Key.vue +21 -0
  170. package/src/components/icons/Logout.vue +13 -0
  171. package/src/components/icons/Loyalty.vue +8 -0
  172. package/src/components/icons/Mail.vue +8 -0
  173. package/src/components/icons/Menu.vue +8 -0
  174. package/src/components/icons/Pause.vue +5 -0
  175. package/src/components/icons/Pencil.vue +21 -0
  176. package/src/components/icons/Play.vue +8 -0
  177. package/src/components/icons/Plus.vue +8 -0
  178. package/src/components/icons/Profile.vue +18 -0
  179. package/src/components/icons/Reload.vue +7 -0
  180. package/src/components/icons/Sandclock.vue +33 -0
  181. package/src/components/icons/Savings.vue +8 -0
  182. package/src/components/icons/Scanner.vue +8 -0
  183. package/src/components/icons/Scrape.vue +8 -0
  184. package/src/components/icons/Sell.vue +21 -0
  185. package/src/components/icons/Shield.vue +8 -0
  186. package/src/components/icons/Shrink.vue +8 -0
  187. package/src/components/icons/Ski.vue +8 -0
  188. package/src/components/icons/Spinner.vue +42 -0
  189. package/src/components/icons/SquareCheck.vue +18 -0
  190. package/src/components/icons/SquareUncheck.vue +18 -0
  191. package/src/components/icons/Stadium.vue +13 -0
  192. package/src/components/icons/StadiumWhite.vue +13 -0
  193. package/src/components/icons/Status.vue +8 -0
  194. package/src/components/icons/Tag.vue +8 -0
  195. package/src/components/icons/Tasks.vue +13 -0
  196. package/src/components/icons/Ticket.vue +8 -0
  197. package/src/components/icons/Timer.vue +8 -0
  198. package/src/components/icons/Trash.vue +8 -0
  199. package/src/components/icons/Up.vue +10 -0
  200. package/src/components/icons/Wildcard.vue +18 -0
  201. package/src/components/icons/index.js +111 -0
  202. package/src/components/ui/Modal.vue +61 -0
  203. package/src/components/ui/Navbar.vue +207 -0
  204. package/src/components/ui/ReconnectIndicator.vue +90 -0
  205. package/src/components/ui/Splash.vue +24 -0
  206. package/src/components/ui/controls/CountryChooser.vue +87 -0
  207. package/src/components/ui/controls/EyeToggle.vue +11 -0
  208. package/src/components/ui/controls/atomic/Checkbox.vue +28 -0
  209. package/src/components/ui/controls/atomic/Dropdown.vue +138 -0
  210. package/src/components/ui/controls/atomic/LoadingButton.vue +45 -0
  211. package/src/components/ui/controls/atomic/MultiDropdown.vue +262 -0
  212. package/src/components/ui/controls/atomic/Switch.vue +84 -0
  213. package/src/libs/Filter.js +593 -0
  214. package/src/libs/ansii.js +565 -0
  215. package/src/libs/panzoom.js +1413 -0
  216. package/src/main.js +23 -0
  217. package/src/registerServiceWorker.js +32 -0
  218. package/src/router/index.js +65 -0
  219. package/src/stores/cities.json +1 -0
  220. package/src/stores/connection.js +399 -0
  221. package/src/stores/countries.js +88 -0
  222. package/src/stores/logger.js +103 -0
  223. package/src/stores/requests.js +88 -0
  224. package/src/stores/sampleData.js +1034 -0
  225. package/src/stores/ui.js +584 -0
  226. package/src/stores/utils.js +554 -0
  227. package/src/types/index.js +42 -0
  228. package/src/utils/debug.js +1 -0
  229. package/src/views/Accounts.vue +191 -0
  230. package/src/views/Console.vue +224 -0
  231. package/src/views/Editor.vue +785 -0
  232. package/src/views/FilterBuilder.vue +785 -0
  233. package/src/views/Login.vue +27 -0
  234. package/src/views/Profiles.vue +209 -0
  235. package/src/views/Tasks.vue +157 -0
  236. package/static/offline.html +184 -0
  237. package/tailwind.config.js +57 -0
  238. package/vite.config.js +63 -0
  239. package/vue.config.js +32 -0
  240. package/workbox-config.js +66 -0
@@ -0,0 +1,459 @@
1
+ <template>
2
+ <Modal class="overflow-y-scroll max-w-screen">
3
+ <template #header>
4
+ <div class="flex-center gap-2">
5
+ Create Task
6
+ <PencilIcon />
7
+ </div>
8
+ </template>
9
+
10
+
11
+ <!-- Task Form -->
12
+ <div class="form-grid mt-4 mb-4">
13
+ <!-- Event ID -->
14
+ <div class="input-wrapper">
15
+ <label class="label-override mb-2"
16
+ >Event ID
17
+ <StadiumIcon />
18
+ </label>
19
+ <div class="input-default required">
20
+ <input
21
+ :placeholder="!isEU(ui.currentCountry.siteId) ? '102PDA9125510GYU' : '529171'"
22
+ v-model="task.eventId"
23
+ required
24
+ />
25
+ </div>
26
+ </div>
27
+ <!-- Email -->
28
+ <div class="input-wrapper">
29
+ <label class="label-override mb-2"
30
+ >Email
31
+ <MailIcon />
32
+ </label>
33
+ <div class="input-default">
34
+ <input
35
+ placeholder="Email"
36
+ v-model="task.email"
37
+ autocomplete="off"
38
+ data-form-type="other"
39
+ name="tm_email_disableautocomplete"
40
+ />
41
+ </div>
42
+ </div>
43
+ <!-- Proxy -->
44
+ <div class="input-wrapper">
45
+ <label class="label-override mb-2"
46
+ >Proxy
47
+ <CameraIcon />
48
+ </label>
49
+ <div class="input-default">
50
+ <input placeholder="Proxy" v-model="task.proxy" autocomplete="off" />
51
+ </div>
52
+ </div>
53
+ <!-- Presale Code -->
54
+ <div class="input-wrapper">
55
+ <label class="label-override mb-2"
56
+ >Presale Code
57
+ <AwardIcon />
58
+ </label>
59
+ <div class="input-default">
60
+ <input placeholder="Code" v-model="task.presaleCode" maxlength="15" autocomplete="off" />
61
+ </div>
62
+ </div>
63
+ <!-- Ticket Quantity -->
64
+ <div class="input-wrapper">
65
+ <label class="label-override mb-2"
66
+ >Ticket Quantity
67
+ <BagIcon />
68
+ </label>
69
+ <div class="input-default">
70
+ <input placeholder="20" min="1" type="number" pattern="\d*" v-model="task.quantity" />
71
+ <div class="input-incrementer">
72
+ <button @click="task.quantity++">
73
+ <UpIcon />
74
+ </button>
75
+ <button @click="if (task.quantity > 1) task.quantity--;">
76
+ <DownIcon />
77
+ </button>
78
+ </div>
79
+ </div>
80
+ </div>
81
+ <!-- Ticket Quantity -->
82
+ <div class="input-wrapper">
83
+ <label class="label-override mb-2">Amount <span class="ml-2" style="height: 18px">#</span></label>
84
+ <div class="input-default">
85
+ <input placeholder="20" min="1" type="number" pattern="\d*" v-model="task.taskQuantity" />
86
+ <div class="input-incrementer">
87
+ <button @click="task.taskQuantity++">
88
+ <UpIcon />
89
+ </button>
90
+ <button @click="if (task.taskQuantity > 1) task.taskQuantity--;">
91
+ <DownIcon />
92
+ </button>
93
+ </div>
94
+ </div>
95
+ </div>
96
+
97
+ <!-- Profile Tag(s) -->
98
+ <div class="input-wrapper" style="z-index: 50 !important">
99
+ <label class="label-override mb-2"
100
+ >Profile Tag(s)
101
+ <TagIcon />
102
+ </label>
103
+ <MultiDropdown
104
+ class="w-full will-change-auto input-default"
105
+ :onSelect="(v) => (task.profileTags = v)"
106
+ default="Any"
107
+ :options="
108
+ profileTagsOptions.map((opt) => {
109
+ return { label: opt, value: opt };
110
+ })
111
+ "
112
+ />
113
+ </div>
114
+
115
+ <!-- CL Origin -->
116
+ <div v-if="isEU(ui.currentCountry.siteId)" class="input-wrapper">
117
+ <label class="label-override mb-2">CL Origin<AwardIcon /></label>
118
+ <div class="input-default">
119
+ <input placeholder="ORIGIN2" type="text" v-model="task.clOrigin" maxlength="15" />
120
+ </div>
121
+ </div>
122
+
123
+ <!-- Account Tag -->
124
+ <div class="input-wrapper">
125
+ <label class="label-override mb-2"
126
+ >Account Tag
127
+ <ScannerIcon />
128
+ </label>
129
+
130
+ <Dropdown
131
+ :onClick="(f) => (task.accountTag = f)"
132
+ default="Default tag"
133
+ :chosen="task.accountTag"
134
+ :options="accountTagOptions"
135
+ :allowDefault="false"
136
+ :capitalize="true"
137
+ class="input-default dropdown p-4 w-full"
138
+ />
139
+ </div>
140
+
141
+ <div class="input-wrapper">
142
+ <label class="label-override mb-2">Start Offset (Minutes)<ShieldIcon /></label>
143
+ <div class="input-default">
144
+ <input placeholder="120" type="number" pattern="\d*" v-model="task.startOffset" />
145
+ </div>
146
+ </div>
147
+
148
+ <div v-if="!isEU(ui.currentCountry.siteId)">
149
+ <div class="input-wrapper">
150
+ <label class="label-override mb-2"
151
+ >Presale DID
152
+ <AwardIcon />
153
+ </label>
154
+ <div class="input-default">
155
+ <input placeholder="uklnfan2ps" v-model="task.eventDid" maxlength="15" />
156
+ </div>
157
+ </div>
158
+ </div>
159
+ </div>
160
+ <div class="border border-light-300 mb-3" />
161
+ <!-- Task Switches -->
162
+ <div v-if="!isEU(ui.currentCountry.siteId)" class="grid grid-cols-3 task-switches gap-y-1 justify-between">
163
+ <div class="switch-wrapper flex flex-col mb-2">
164
+ <h4>
165
+ Aged <span class="hidden xs:block">Account</span>
166
+ <SandclockIcon />
167
+ </h4>
168
+ <Switch class="mx-auto" v-model="task.agedAccount" />
169
+ </div>
170
+ <div class="switch-wrapper flex flex-col">
171
+ <h4>
172
+ Manual
173
+ <HandIcon />
174
+ </h4>
175
+ <Switch class="mx-auto" v-model="task.manual" />
176
+ </div>
177
+ <div class="switch-wrapper flex flex-col">
178
+ <h4>
179
+ <span class="hidden xs:block">Do Not Pay</span>
180
+ <span class="block xs:hidden">DNP</span>
181
+ <SavingsIcon />
182
+ </h4>
183
+ <Switch class="mx-auto" v-model="task.doNotPay" />
184
+ </div>
185
+ <div class="flex flex-col switch-wrapper">
186
+ <h4>
187
+ <span class="hidden xs:block">Quick Queue</span>
188
+ <span class="block xs:hidden">Quick Q.</span>
189
+ <SkiIcon />
190
+ </h4>
191
+ <Switch class="mx-auto" v-model="task.quickQueue" />
192
+ </div>
193
+ <div class="flex flex-col switch-wrapper">
194
+ <h4>
195
+ <span class="hidden xs:block">Login Later</span>
196
+ <span class="block xs:hidden">Login Lat.</span>
197
+
198
+ <GroupIcon />
199
+ </h4>
200
+ <Switch class="mx-auto" v-model="task.loginAfterCart" />
201
+ </div>
202
+ <div class="flex flex-col switch-wrapper">
203
+ <h4>
204
+ <span class="hidden xs:block">Smart Timer</span>
205
+ <span class="block xs:hidden">Timer</span>
206
+ <TimerIcon />
207
+ </h4>
208
+ <Switch class="mx-auto" v-model="task.smartTimer" />
209
+ </div>
210
+ <div class="switch-wrapper flex flex-col">
211
+ <h4>
212
+ <span class="hidden xs:block">Supports </span> OTP
213
+ <MailIcon class="scale-90" style="height: 17px" />
214
+ </h4>
215
+ <Switch class="mx-auto" v-model="task.otpAccount" />
216
+ </div>
217
+ <div class="switch-wrapper flex flex-col">
218
+ <h4>
219
+ Presale <span class="hidden xs:block"> Queue</span>
220
+ <AwardIcon class="scale-90" />
221
+ </h4>
222
+ <Switch class="mx-auto" v-model="task.presaleMode" />
223
+ </div>
224
+ <div class="switch-wrapper flex flex-col">
225
+ <h4>
226
+ Strict <span class="hidden xs:block"> Presale</span>
227
+ <AwardIcon class="scale-90" />
228
+ </h4>
229
+ <Switch class="mx-auto" v-model="task.presaleStrict" />
230
+ </div>
231
+ </div>
232
+ <div v-if="isEU(ui.currentCountry.siteId)">
233
+ <div class="grid grid-cols-4 gap-y-4 mb-4 justify-between task-switches">
234
+ <div class="switch-wrapper flex flex-col">
235
+ <h4 class="text-xs">
236
+ Manual
237
+ <HandIcon class="scale-90" />
238
+ </h4>
239
+ <Switch class="mx-auto" v-model="task.manual" />
240
+ </div>
241
+ <div class="switch-wrapper flex flex-col">
242
+ <h4>
243
+ <span class="hidden xs:block">Do Not Pay</span>
244
+ <span class="block xs:hidden">DNP</span>
245
+ <SavingsIcon class="scale-90" />
246
+ </h4>
247
+ <Switch class="mx-auto" v-model="task.doNotPay" />
248
+ </div>
249
+ <div class="switch-wrapper flex flex-col">
250
+ <h4>
251
+ <span class="hidden xs:block">Smart Timer</span>
252
+ <span class="block xs:hidden">Timer</span>
253
+ <TimerIcon class="scale-90" />
254
+ </h4>
255
+ <Switch class="mx-auto" v-model="task.smartTimer" />
256
+ </div>
257
+ <div class="switch-wrapper flex flex-col">
258
+ <h4>
259
+ Login Later
260
+ <GroupIcon class="scale-90" />
261
+ </h4>
262
+ <Switch class="mx-auto" v-model="task.loginAfterCart" />
263
+ </div>
264
+ </div>
265
+
266
+ <div class="grid grid-cols-4 gap-y-4 justify-between task-switches">
267
+ <div class="switch-wrapper flex flex-col">
268
+ <h4>
269
+ <span class="hidden xs:block">Quick Queue</span>
270
+ <span class="block xs:hidden">Quick Q.</span> <SkiIcon class="scale-90" />
271
+ </h4>
272
+ <Switch class="mx-auto" v-model="task.quickQueue" />
273
+ </div>
274
+
275
+ <div class="switch-wrapper flex flex-col">
276
+ <h4>
277
+ Supports OTP
278
+ <MailIcon class="scale-90" />
279
+ </h4>
280
+ <Switch class="mx-auto" v-model="task.otpAccount" />
281
+ </div>
282
+ <div class="switch-wrapper flex flex-col">
283
+ <h4>
284
+ Aged <span class="hidden xs:block">Account</span>
285
+ <SandclockIcon />
286
+ </h4>
287
+ <Switch class="mx-auto" v-model="task.agedAccount" />
288
+ </div>
289
+ </div>
290
+ </div>
291
+
292
+ <!-- Task prefab -->
293
+ <div class="border border-light-300 my-3" />
294
+ <button class="btn-action mx-auto" @click="createTask">
295
+ Create
296
+ <EditIcon />
297
+ </button>
298
+ </Modal>
299
+ </template>
300
+
301
+ <script setup>
302
+ import { ref, watch } from "vue";
303
+ import Modal from "@/components/ui/Modal.vue";
304
+ import Switch from "@/components/ui/controls/atomic/Switch.vue";
305
+ import {
306
+ MailIcon,
307
+ CameraIcon,
308
+ AwardIcon,
309
+ StadiumIcon,
310
+ ScannerIcon,
311
+ BagIcon,
312
+ TagIcon,
313
+ SkiIcon,
314
+ HandIcon,
315
+ GroupIcon,
316
+ ShieldIcon,
317
+ TimerIcon,
318
+ SavingsIcon,
319
+ EditIcon,
320
+ UpIcon,
321
+ DownIcon,
322
+ SandclockIcon,
323
+ CartIcon,
324
+ PencilIcon
325
+ } from "@/components/icons";
326
+ import { useUIStore } from "@/stores/ui";
327
+ import { countries } from "@/stores/countries";
328
+ import Dropdown from "@/components/ui/controls/atomic/Dropdown.vue";
329
+ import MultiDropdown from "@/components/ui/controls/atomic/MultiDropdown.vue";
330
+ import { isEU, parseEventUrl, removeDuplicates } from "@/stores/utils";
331
+
332
+ const ui = useUIStore();
333
+
334
+ const accountTagOptions = ref(ui.profile.accountTags);
335
+ const defaultTags = ["Amex", "Visa", "Master"];
336
+
337
+ const profileTagsOptions = ref(removeDuplicates(["Any", ...defaultTags, ...ui.profile.profileTags]));
338
+
339
+ const baseTask = ref({
340
+ selected: false,
341
+ taskId: "",
342
+ active: false,
343
+ eventId: "",
344
+ status: "Created",
345
+ presaleCode: "",
346
+ quantity: 4,
347
+ reservedTicketsList: "ticket1-ticket2-ticket3",
348
+ email: "",
349
+ password: "",
350
+ proxy: "",
351
+ manual: true,
352
+ doNotPay: false,
353
+ incapsulaBypass: false,
354
+ quickQueue: false,
355
+ loginAfterCart: false,
356
+ smartTimer: false,
357
+ presaleMode: false,
358
+ agedAccount: false,
359
+ accountTag: accountTagOptions.value[0],
360
+ profileTags: ["Any"],
361
+ clOrigin: undefined,
362
+ eventDid: undefined,
363
+ taskQuantity: 1
364
+ });
365
+
366
+ baseTask.value.loginAfterCart = isEU(ui.currentCountry.siteId);
367
+
368
+ const task = ref(ui.modalData[`task_${ui.currentCountry.siteId}`] || baseTask);
369
+
370
+ function createTask() {
371
+ ui.logger.Info("Created new task", task.value);
372
+ const eventIds = task.value.eventId.split(",").map((t) => t.trim());
373
+ const presaleCodes = task.value.presaleCode ? task.value.presaleCode.split(",").map((t) => t.trim()) : [undefined];
374
+ eventIds.forEach((eventId) => {
375
+ presaleCodes.forEach((presaleCode) => {
376
+ const t = { ...task.value, eventId: eventId, presaleCode: presaleCode };
377
+ ui.addNewTask(t);
378
+ });
379
+ });
380
+ }
381
+
382
+ watch(
383
+ () => task.value.profileTags,
384
+ (newTags) => {
385
+ ui.logger.Info("Profile tags update", newTags, task.value);
386
+ if (!newTags.length) task.value.profileTags.push("Any");
387
+ else if (newTags.length === profileTagsOptions.value.length - 1 && profileTagsOptions.value.length !== 3)
388
+ task.value.profileTags = ["Any"];
389
+ else if (newTags.length > 1 && newTags.includes("Any"))
390
+ task.value.profileTags = task.value.profileTags = newTags.filter((e) => e != "Any");
391
+ }
392
+ );
393
+
394
+ watch(() => task.value, (ui.modalData[`task_${ui.currentCountry.siteId}`] = task.value));
395
+
396
+ watch(
397
+ () => task.value.eventId,
398
+ (url) => {
399
+ ui.logger.Info("URL changed", url);
400
+ if (!url.includes("https://")) return;
401
+ try {
402
+ url = url.replace(/livenation/, "ticketmaster");
403
+ let tld = url.split("ticketmaster.")[1].split("/")[0];
404
+ if (tld === "com") tld = "us";
405
+ else if (url.includes(".co.uk")) tld = "UK";
406
+ else if (url.includes("com.au")) tld = "AU";
407
+ else if (url.includes("co.nz")) tld = "NZ";
408
+
409
+ const tmid = `TM_${tld.toUpperCase()}`;
410
+ const country = countries.TM.find((c) => c.siteId === tmid);
411
+ if (country) ui.setCurrentCountry(country, false, ui.currentModule);
412
+
413
+ const { eventId, eventDid, clOrigin } = parseEventUrl(url);
414
+ task.value.clOrigin = clOrigin;
415
+ task.value.eventDid = eventDid;
416
+ task.value.eventId = eventId;
417
+ } catch (ex) {
418
+ ui.logger.Error("Could not parse url (2)", ex);
419
+ }
420
+ }
421
+ );
422
+
423
+ </script>
424
+
425
+ <style lang="scss" scoped>
426
+ .task-switches {
427
+ h4 {
428
+ color: #6e7084;
429
+ @apply text-xs text-center flex items-center gap-x-2 mx-auto;
430
+ }
431
+
432
+ .switch-wrapper {
433
+ @apply gap-y-2;
434
+ }
435
+ }
436
+
437
+ @media (max-width: 720px) {
438
+ .task-switches {
439
+ h4 {
440
+ font-size: 12px !important;
441
+ }
442
+ }
443
+ }
444
+ </style>
445
+ <style lang="scss" scoped>
446
+ .switch-wrapper {
447
+ svg path {
448
+ fill: #6e7084 !important;
449
+ }
450
+ }
451
+
452
+ .z-inf {
453
+ z-index: 1000;
454
+ }
455
+
456
+ .z-inf2 {
457
+ z-index: 2000;
458
+ }
459
+ </style>
@@ -0,0 +1,50 @@
1
+ <template>
2
+ <Modal>
3
+ <template #header> Mass Edit Presale Code <i class="fa fa-edit ml-3 mt-1"></i> </template>
4
+ <!-- Event ID -->
5
+ <div class="input-wrapper mt-7 mb-4">
6
+ <label class="label-override mb-2">Event ID <StadiumIcon /></label>
7
+ <div class="input-default required">
8
+ <input
9
+ :placeholder="!isEU(ui.currentCountry.siteId) ? '102PDA9125510GYU' : '529171'"
10
+ v-model="eventId"
11
+ />
12
+ </div>
13
+ </div>
14
+ <!-- Presale Code -->
15
+ <div class="input-wrapper mb-8">
16
+ <label class="label-override mb-2">Presale Code <BagIcon /></label>
17
+ <div class="input-default required">
18
+ <input placeholder="presale code" v-model="code" />
19
+ </div>
20
+ </div>
21
+ <button
22
+ class="button-default bg-dark-400 w-48 text-xs flex items-center justify-center gap-x-2 ml-auto border border-light-300 hover:border-light-400"
23
+ @click="done()"
24
+ >
25
+ Edit <EditIcon />
26
+ </button>
27
+ </Modal>
28
+ </template>
29
+ <style lang="scss" scoped>
30
+ .input-wrapper {
31
+ label {
32
+ @apply flex;
33
+ }
34
+ }
35
+ </style>
36
+ <script setup>
37
+ import Modal from "@/components/ui/Modal.vue";
38
+ import { StadiumIcon, BagIcon, EditIcon } from "@/components/icons";
39
+ import { useUIStore } from "@/stores/ui";
40
+ import { ref } from "vue";
41
+ import { isEU } from "@/stores/utils";
42
+
43
+ const ui = useUIStore();
44
+ const code = ref("");
45
+ const eventId = ref("");
46
+ function done() {
47
+ ui.toggleModal("");
48
+ ui.massEditPresaleCode(eventId.value, code.value);
49
+ }
50
+ </script>
@@ -0,0 +1,167 @@
1
+ <template>
2
+ <Modal>
3
+ <template #header
4
+ ><span class="mb-4 flex">Quick Settings <GearIcon class="ml-4 w-4" /></span
5
+ ></template>
6
+
7
+ <div v-for="(category, categoryName) in quickConfig.keys" :key="categoryName" class="mb-4">
8
+ <div class="text-light-400 mb-2">{{ categoryName }} Keys</div>
9
+ <div
10
+ v-for="(value, keyName) in category"
11
+ :key="keyName"
12
+ class="input-container"
13
+ >
14
+ <span class="w-1/3 text-light-300 font-medium text-xs">{{ keyName }}</span>
15
+ <div class="w-2/3 h-full flex items-center">
16
+ <input
17
+ type="text"
18
+ class="quick-settings-input"
19
+ :placeholder="`Enter ${keyName} key`"
20
+ v-model="quickConfig.keys[categoryName][keyName]"
21
+ />
22
+ </div>
23
+ </div>
24
+ </div>
25
+
26
+ <div class="input-container">
27
+ <span class="w-1/3 text-light-300 font-medium text-xs">Checkout Proxies</span>
28
+ <Dropdown
29
+ class="transparent !w-2/3 !px-0 bg-transparent border-none text-white z-50"
30
+ :default="ui.profile.proxyList?.checkout || proxyLists[0]"
31
+ :options="proxyLists"
32
+ :onClick="(f) => saveProxyListUpate('checkout', f)"
33
+ :allowDefault="false"
34
+ />
35
+ </div>
36
+
37
+ <div class="input-container">
38
+ <span class="w-1/3 text-light-300 font-medium text-xs">Queue Proxies</span>
39
+ <Dropdown
40
+ class="transparent !w-2/3 !px-0 bg-transparent border-none text-white z-30"
41
+ :default="ui.profile.proxyList?.queue || proxyLists[0]"
42
+ :onClick="(f) => saveProxyListUpate('queue', f)"
43
+ :options="proxyLists"
44
+ :allowDefault="false"
45
+ />
46
+ </div>
47
+ <div class="flex mt-5 justify-between flex-row items-center">
48
+ <div class="flex gap-3 items-center">
49
+ <div class="bg-gradient-to-r from-dark-400 to-dark-500 rounded-lg text-xs shadow-lg p-2 px-3 text-white font-medium border border-light-300">
50
+ Dashboard v{{ version }}
51
+ </div>
52
+ <div class="bg-gradient-to-r from-dark-400 to-dark-500 rounded-lg text-xs shadow-lg p-2 px-3 text-white font-medium border border-light-300">
53
+ Bot v{{ ui.botVersion }}
54
+ </div>
55
+ </div>
56
+
57
+ <div class="flex gap-5">
58
+ <button
59
+ class="button-default bg-dark-400 w-24 text-xs flex items-center justify-center gap-x-2 border border-light-300 hover:border-light-400"
60
+ @click="checkBalances()"
61
+ >
62
+ Balances <img src="@/assets/img/sell.svg" width="14" />
63
+ </button>
64
+ <button
65
+ class="button-default bg-dark-400 w-24 text-xs flex items-center justify-center gap-x-2 border border-light-300 hover:border-light-400"
66
+ @click="done(true)"
67
+ >
68
+ Save <img src="/img/save.svg" width="14" class="invert" />
69
+ </button>
70
+ </div>
71
+ </div>
72
+ </Modal>
73
+ </template>
74
+ <style lang="scss">
75
+ .input-wrapper {
76
+ label {
77
+ @apply flex;
78
+ }
79
+ }
80
+
81
+ .transparent {
82
+ background: transparent !important;
83
+ }
84
+
85
+ .input-container {
86
+ @apply text-white bg-dark-500 mb-3 px-3 rounded-lg border-dark-550 border-2 flex items-center justify-between h-10 overflow-hidden;
87
+ }
88
+
89
+ .quick-settings-input {
90
+ @apply w-full h-full text-sm text-white bg-transparent border-0 outline-none px-2 py-1 transition-colors duration-150;
91
+
92
+ &:focus {
93
+ @apply outline-none border-0 shadow-none bg-transparent;
94
+ }
95
+
96
+ &:hover:not(:focus) {
97
+ @apply bg-dark-550;
98
+ }
99
+
100
+ &::placeholder {
101
+ @apply text-light-400 opacity-70;
102
+ }
103
+ }
104
+ </style>
105
+ <script setup>
106
+ import Modal from "@/components/ui/Modal.vue";
107
+ import { GearIcon } from "@/components/icons";
108
+ import { useUIStore } from "@/stores/ui";
109
+ import { ref } from "vue";
110
+ import Switch from "@/components/ui/controls/atomic/Switch.vue";
111
+ import Dropdown from "@/components/ui/controls/atomic/Dropdown.vue";
112
+ import { sendQuickConfig, getQuickConfig } from "@/stores/requests";
113
+ import { getBalances, sendProxyList, getProxyLists } from "../../stores/requests";
114
+
115
+ const version = __APP_VERSION__;
116
+ const quickConfig = ref({});
117
+ const ui = useUIStore();
118
+ const proxyLists = ref(["loading..."]);
119
+
120
+ const loadCurrentQuickConfig = async () => {
121
+ try {
122
+ quickConfig.value = await getQuickConfig();
123
+ } catch {
124
+ ui.showError("Could not load config");
125
+ }
126
+ };
127
+ const saveQuickConfig = async () => {
128
+ await sendQuickConfig(quickConfig.value);
129
+ ui.showSuccess("Successfully saved Config");
130
+ };
131
+
132
+ const saveProxyList = async () => {
133
+ if (!ui.profile.proxyList) return ui.showError("No proxylists set");
134
+ const j = await sendProxyList(ui.profile.proxyList);
135
+ if (j.error) ui.showError(j.error);
136
+ else ui.setProfile(j);
137
+ };
138
+
139
+ const saveProxyListUpate = async (list, val) => {
140
+ ui.profile.proxyList[list] = val;
141
+ return saveProxyList();
142
+ };
143
+
144
+ loadCurrentQuickConfig();
145
+
146
+ async function done(save) {
147
+ if (save) await saveQuickConfig();
148
+ ui.toggleModal("");
149
+ }
150
+
151
+ const loadProxyLists = async () => {
152
+ const res = await getProxyLists();
153
+ if (Array.isArray(res)) proxyLists.value = res;
154
+ else ui.showError("Could not load proxylists");
155
+ };
156
+
157
+ const checkBalances = async () => {
158
+ const balances = await getBalances();
159
+ if (typeof balances == "object")
160
+ Object.entries(balances).forEach(([service, balance]) => {
161
+ ui.showSuccess(`${service} balance: ${balance}`);
162
+ });
163
+ else ui.showError("Could not get balances");
164
+ };
165
+
166
+ loadProxyLists();
167
+ </script>