@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.
- package/.claude/settings.local.json +45 -0
- package/.eslintrc.js +24 -0
- package/.prettierignore +1 -0
- package/.prettierrc +10 -0
- package/.vscode/extensions.json +3 -0
- package/ICONS.md +21 -0
- package/README.md +65 -0
- package/backend/api.js +430 -0
- package/backend/auth.js +62 -0
- package/backend/batching.js +43 -0
- package/backend/endpoints.js +343 -0
- package/backend/index.js +23 -0
- package/backend/mock-data.js +66 -0
- package/backend/mock-src/classes/logger.js +112 -0
- package/backend/mock-src/classes/utils.js +42 -0
- package/backend/mock-src/ticketmaster.js +92 -0
- package/backend/validator.js +62 -0
- package/config/configs.json +20 -0
- package/config/filter.json +3 -0
- package/config/presale.csv +3 -0
- package/config/proxies.txt +6 -0
- package/config/used-codes.json +4 -0
- package/index.html +114 -0
- package/index.js +2 -0
- package/jsconfig.json +16 -0
- package/package.json +48 -0
- package/postcss.config.js +6 -0
- package/postinstall.js +9 -0
- 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/flags/ae.svg +1 -0
- package/public/flags/at.svg +1 -0
- package/public/flags/au.svg +1 -0
- package/public/flags/be.svg +1 -0
- package/public/flags/ch.svg +1 -0
- package/public/flags/cz.svg +1 -0
- package/public/flags/de.svg +1 -0
- package/public/flags/dk.svg +1 -0
- package/public/flags/es.svg +1 -0
- package/public/flags/nl.svg +1 -0
- package/public/flags/no.svg +1 -0
- package/public/flags/nz.svg +1 -0
- package/public/flags/pl.svg +1 -0
- package/public/flags/se.svg +1 -0
- package/public/flags/uk.svg +1 -0
- package/public/flags/us.svg +1 -0
- package/public/img/award.svg +3 -0
- package/public/img/background.svg +14 -0
- package/public/img/bag_w.svg +12 -0
- package/public/img/banks/amex.svg +4 -0
- package/public/img/banks/mastercard.svg +4 -0
- package/public/img/banks/visa.svg +4 -0
- package/public/img/camera.svg +3 -0
- package/public/img/close.svg +3 -0
- package/public/img/controls/disable.svg +5 -0
- package/public/img/controls/enable.svg +5 -0
- package/public/img/groups.svg +3 -0
- package/public/img/hand.svg +3 -0
- package/public/img/key.svg +3 -0
- 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/public/img/logo_trans.png +0 -0
- package/public/img/loyalty.svg +3 -0
- package/public/img/mail.svg +3 -0
- package/public/img/pencil.svg +3 -0
- package/public/img/profile.svg +4 -0
- package/public/img/reload.svg +3 -0
- package/public/img/sandclock.svg +25 -0
- package/public/img/save.svg +5 -0
- package/public/img/savings.svg +3 -0
- package/public/img/scanner.svg +3 -0
- package/public/img/sell.svg +3 -0
- package/public/img/shield.svg +3 -0
- package/public/img/ski.svg +3 -0
- package/public/img/stadium.svg +8 -0
- package/public/img/stadium_w.svg +8 -0
- package/public/img/timer.svg +3 -0
- package/public/manifest.json +27 -0
- package/public/robots.txt +2 -0
- package/run +10 -0
- package/src/App.vue +307 -0
- package/src/assets/css/_input.scss +197 -0
- package/src/assets/css/main.scss +269 -0
- package/src/assets/css/tailwind.css +3 -0
- package/src/assets/img/award.svg +3 -0
- package/src/assets/img/background.svg +11 -0
- package/src/assets/img/camera.svg +3 -0
- package/src/assets/img/close.svg +3 -0
- package/src/assets/img/eyes/closed.svg +13 -0
- package/src/assets/img/eyes/open.svg +12 -0
- package/src/assets/img/groups.svg +3 -0
- package/src/assets/img/hand.svg +3 -0
- package/src/assets/img/key.svg +3 -0
- 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/src/assets/img/logo_trans.png +0 -0
- package/src/assets/img/loyalty.svg +3 -0
- package/src/assets/img/mail.svg +3 -0
- package/src/assets/img/pencil.svg +3 -0
- package/src/assets/img/reload.svg +3 -0
- package/src/assets/img/savings.svg +3 -0
- package/src/assets/img/scanner.svg +3 -0
- package/src/assets/img/sell.svg +3 -0
- package/src/assets/img/shield.svg +3 -0
- package/src/assets/img/ski.svg +3 -0
- package/src/assets/img/square_check.svg +5 -0
- package/src/assets/img/square_uncheck.svg +5 -0
- package/src/assets/img/stadium.svg +8 -0
- package/src/assets/img/timer.svg +3 -0
- package/src/assets/img/wildcard.svg +7 -0
- package/src/components/Auth/LoginForm.vue +48 -0
- package/src/components/Editors/Account/Account.vue +119 -0
- package/src/components/Editors/Account/AccountCreator.vue +147 -0
- package/src/components/Editors/Account/AccountView.vue +87 -0
- package/src/components/Editors/Account/CreateAccount.vue +106 -0
- package/src/components/Editors/Profile/CreateProfile.vue +321 -0
- package/src/components/Editors/Profile/Profile.vue +142 -0
- package/src/components/Editors/Profile/ProfileCountryChooser.vue +75 -0
- package/src/components/Editors/Profile/ProfileView.vue +96 -0
- package/src/components/Editors/TagLabel.vue +16 -0
- package/src/components/Editors/TagToggle.vue +41 -0
- package/src/components/Filter/Filter.vue +409 -0
- package/src/components/Filter/FilterPreview.vue +236 -0
- package/src/components/Filter/PriceSortToggle.vue +105 -0
- package/src/components/Table/Header.vue +5 -0
- package/src/components/Table/Row.vue +5 -0
- package/src/components/Table/Table.vue +14 -0
- package/src/components/Table/index.js +4 -0
- package/src/components/Tasks/CheckStock.vue +62 -0
- package/src/components/Tasks/Controls/DesktopControls.vue +73 -0
- package/src/components/Tasks/Controls/MobileControls.vue +32 -0
- package/src/components/Tasks/Controls/index.js +3 -0
- package/src/components/Tasks/CreateTaskAXS.vue +339 -0
- package/src/components/Tasks/CreateTaskTM.vue +459 -0
- package/src/components/Tasks/MassEdit.vue +50 -0
- package/src/components/Tasks/QuickSettings.vue +167 -0
- package/src/components/Tasks/ScrapeVenue.vue +42 -0
- package/src/components/Tasks/Stats.vue +66 -0
- package/src/components/Tasks/Task.vue +296 -0
- package/src/components/Tasks/TaskLabel.vue +20 -0
- package/src/components/Tasks/TaskView.vue +126 -0
- package/src/components/Tasks/Utilities.vue +33 -0
- package/src/components/icons/Award.vue +8 -0
- package/src/components/icons/Bag.vue +8 -0
- package/src/components/icons/BagWhite.vue +8 -0
- package/src/components/icons/Box.vue +8 -0
- package/src/components/icons/Camera.vue +8 -0
- package/src/components/icons/Cart.vue +8 -0
- package/src/components/icons/Check.vue +5 -0
- package/src/components/icons/Checkmark.vue +11 -0
- package/src/components/icons/Click.vue +8 -0
- package/src/components/icons/Close.vue +21 -0
- package/src/components/icons/CloseX.vue +5 -0
- package/src/components/icons/Console.vue +13 -0
- package/src/components/icons/Down.vue +8 -0
- package/src/components/icons/Edit.vue +13 -0
- package/src/components/icons/Event.vue +8 -0
- package/src/components/icons/Expand.vue +8 -0
- package/src/components/icons/Filter.vue +13 -0
- package/src/components/icons/Gear.vue +8 -0
- package/src/components/icons/Group.vue +8 -0
- package/src/components/icons/Hand.vue +8 -0
- package/src/components/icons/Key.vue +21 -0
- package/src/components/icons/Logout.vue +13 -0
- package/src/components/icons/Loyalty.vue +8 -0
- package/src/components/icons/Mail.vue +8 -0
- package/src/components/icons/Menu.vue +8 -0
- package/src/components/icons/Pause.vue +5 -0
- package/src/components/icons/Pencil.vue +21 -0
- package/src/components/icons/Play.vue +8 -0
- package/src/components/icons/Plus.vue +8 -0
- package/src/components/icons/Profile.vue +18 -0
- package/src/components/icons/Reload.vue +7 -0
- package/src/components/icons/Sandclock.vue +33 -0
- package/src/components/icons/Savings.vue +8 -0
- package/src/components/icons/Scanner.vue +8 -0
- package/src/components/icons/Scrape.vue +8 -0
- package/src/components/icons/Sell.vue +21 -0
- package/src/components/icons/Shield.vue +8 -0
- package/src/components/icons/Shrink.vue +8 -0
- package/src/components/icons/Ski.vue +8 -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 +13 -0
- package/src/components/icons/StadiumWhite.vue +13 -0
- package/src/components/icons/Status.vue +8 -0
- package/src/components/icons/Tag.vue +8 -0
- package/src/components/icons/Tasks.vue +13 -0
- package/src/components/icons/Ticket.vue +8 -0
- package/src/components/icons/Timer.vue +8 -0
- package/src/components/icons/Trash.vue +8 -0
- package/src/components/icons/Up.vue +10 -0
- package/src/components/icons/Wildcard.vue +18 -0
- package/src/components/icons/index.js +111 -0
- package/src/components/ui/Modal.vue +61 -0
- package/src/components/ui/Navbar.vue +207 -0
- package/src/components/ui/ReconnectIndicator.vue +90 -0
- package/src/components/ui/Splash.vue +24 -0
- package/src/components/ui/controls/CountryChooser.vue +87 -0
- package/src/components/ui/controls/EyeToggle.vue +11 -0
- package/src/components/ui/controls/atomic/Checkbox.vue +28 -0
- package/src/components/ui/controls/atomic/Dropdown.vue +138 -0
- package/src/components/ui/controls/atomic/LoadingButton.vue +45 -0
- package/src/components/ui/controls/atomic/MultiDropdown.vue +262 -0
- package/src/components/ui/controls/atomic/Switch.vue +84 -0
- package/src/libs/Filter.js +593 -0
- package/src/libs/ansii.js +565 -0
- package/src/libs/panzoom.js +1413 -0
- package/src/main.js +23 -0
- package/src/registerServiceWorker.js +32 -0
- package/src/router/index.js +65 -0
- package/src/stores/cities.json +1 -0
- package/src/stores/connection.js +399 -0
- package/src/stores/countries.js +88 -0
- package/src/stores/logger.js +103 -0
- package/src/stores/requests.js +88 -0
- package/src/stores/sampleData.js +1034 -0
- package/src/stores/ui.js +584 -0
- package/src/stores/utils.js +554 -0
- package/src/types/index.js +42 -0
- package/src/utils/debug.js +1 -0
- package/src/views/Accounts.vue +191 -0
- package/src/views/Console.vue +224 -0
- package/src/views/Editor.vue +785 -0
- package/src/views/FilterBuilder.vue +785 -0
- package/src/views/Login.vue +27 -0
- package/src/views/Profiles.vue +209 -0
- package/src/views/Tasks.vue +157 -0
- package/static/offline.html +184 -0
- package/tailwind.config.js +57 -0
- package/vite.config.js +63 -0
- package/vue.config.js +32 -0
- 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>
|