@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,48 @@
|
|
|
1
|
+
<template>
|
|
2
|
+
<div class="form-section">
|
|
3
|
+
<!-- Username -->
|
|
4
|
+
<div class="input-wrapper">
|
|
5
|
+
<label class="label-override mb-2">Username</label>
|
|
6
|
+
<div class="input-default">
|
|
7
|
+
<input v-model="user" placeholder="Username" />
|
|
8
|
+
</div>
|
|
9
|
+
</div>
|
|
10
|
+
<!-- Password -->
|
|
11
|
+
<div class="input-wrapper">
|
|
12
|
+
<label class="label-override mb-2">Password</label>
|
|
13
|
+
<div class="input-default">
|
|
14
|
+
<input v-model="password" type="password" placeholder="Password" />
|
|
15
|
+
</div>
|
|
16
|
+
</div>
|
|
17
|
+
<button
|
|
18
|
+
class="btn-primary w-full mt-4"
|
|
19
|
+
@click="login()"
|
|
20
|
+
:disabled="buttonDisabled"
|
|
21
|
+
>
|
|
22
|
+
<span v-if="!buttonDisabled">Login</span>
|
|
23
|
+
<div v-else class="loading-spinner mx-auto"></div>
|
|
24
|
+
</button>
|
|
25
|
+
</div>
|
|
26
|
+
</template>
|
|
27
|
+
<script setup>
|
|
28
|
+
import { useUIStore } from "@/stores/ui";
|
|
29
|
+
import { ref } from "vue";
|
|
30
|
+
import router from "@/router/index";
|
|
31
|
+
import { sendLogin } from "@/stores/requests";
|
|
32
|
+
|
|
33
|
+
const password = ref("");
|
|
34
|
+
const user = ref("");
|
|
35
|
+
const ui = useUIStore();
|
|
36
|
+
const buttonDisabled = ref(false);
|
|
37
|
+
|
|
38
|
+
async function login() {
|
|
39
|
+
buttonDisabled.value = true;
|
|
40
|
+
const json = await sendLogin(user.value, password.value);
|
|
41
|
+
if (json.error) ui.showError(json.error);
|
|
42
|
+
else {
|
|
43
|
+
ui.profile.value = json.profile;
|
|
44
|
+
router.push("/");
|
|
45
|
+
}
|
|
46
|
+
buttonDisabled.value = false;
|
|
47
|
+
}
|
|
48
|
+
</script>
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
<template>
|
|
2
|
+
<Row
|
|
3
|
+
class="relative text-white grid-cols-5 ipadlg:grid-cols-7 h-16"
|
|
4
|
+
@click="ui.setOpenContextMenu('')"
|
|
5
|
+
@click.right.prevent="ui.setOpenContextMenu('')"
|
|
6
|
+
>
|
|
7
|
+
<div class="col-span-3 lg:col-span-2 flex">
|
|
8
|
+
<Checkbox
|
|
9
|
+
class="ml-0 mr-4"
|
|
10
|
+
:toggled="props.task.selected"
|
|
11
|
+
@valueUpdate="ui.toggleAccountSelected(props.task._id)"
|
|
12
|
+
/>
|
|
13
|
+
<h4 class="mx-auto text-white" @click="copy(props.task.email)">
|
|
14
|
+
{{ props.task.email }}
|
|
15
|
+
</h4>
|
|
16
|
+
</div>
|
|
17
|
+
<div class="col-span-2 hidden ipadlg:block" @click="copy(props.task.password)">
|
|
18
|
+
<h4 class="text-white">
|
|
19
|
+
{{ props.task.privacy ? "•".repeat(props.task.password.length) : props.task.password }}
|
|
20
|
+
</h4>
|
|
21
|
+
</div>
|
|
22
|
+
<div class="col-span-1">
|
|
23
|
+
<h4 v-if="props.task.enabled" class="text-green-400 flex justify-center">
|
|
24
|
+
<img class="w-3 h-3 green" src="/img/controls/enable.svg" />
|
|
25
|
+
</h4>
|
|
26
|
+
<h4 v-else class="text-red-400 flex justify-center">
|
|
27
|
+
<img class="w-3 h-3 fill-red-400" src="/img/close.svg" />
|
|
28
|
+
</h4>
|
|
29
|
+
</div>
|
|
30
|
+
|
|
31
|
+
<div class="col-span-1 hidden lg:block">
|
|
32
|
+
<h4 class="text-white flex justify-center gap-1">
|
|
33
|
+
<TagLabel v-for="tag in props.task.tags" :key="tag" :text="tag" />
|
|
34
|
+
</h4>
|
|
35
|
+
</div>
|
|
36
|
+
|
|
37
|
+
<div class="col-span-1 flex">
|
|
38
|
+
<ul class="task-buttons">
|
|
39
|
+
<li>
|
|
40
|
+
<button @click="edit">
|
|
41
|
+
<EditIcon />
|
|
42
|
+
</button>
|
|
43
|
+
</li>
|
|
44
|
+
<li v-if="props.task.enabled">
|
|
45
|
+
<button @click="disable">
|
|
46
|
+
<img class="w-4 h-4" src="/img/controls/disable.svg" />
|
|
47
|
+
</button>
|
|
48
|
+
</li>
|
|
49
|
+
<li v-else>
|
|
50
|
+
<button @click="enable">
|
|
51
|
+
<img class="w-4 h-4" src="/img/controls/enable.svg" />
|
|
52
|
+
</button>
|
|
53
|
+
</li>
|
|
54
|
+
</ul>
|
|
55
|
+
</div>
|
|
56
|
+
</Row>
|
|
57
|
+
</template>
|
|
58
|
+
<style lang="scss" scoped>
|
|
59
|
+
h4 {
|
|
60
|
+
@apply text-center;
|
|
61
|
+
}
|
|
62
|
+
.task-buttons {
|
|
63
|
+
@apply flex mx-auto gap-x-2;
|
|
64
|
+
|
|
65
|
+
button {
|
|
66
|
+
@apply p-1 rounded transition-colors hover:bg-dark-500;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
svg {
|
|
70
|
+
@apply w-4 h-4;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
img {
|
|
74
|
+
@apply w-4 h-4;
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
@media (max-width: 1024px) {
|
|
79
|
+
h4 {
|
|
80
|
+
font-size: 10px !important;
|
|
81
|
+
}
|
|
82
|
+
.task-buttons {
|
|
83
|
+
@apply gap-x-3;
|
|
84
|
+
}
|
|
85
|
+
.task-id {
|
|
86
|
+
font-size: 6px !important;
|
|
87
|
+
margin-right: -12px;
|
|
88
|
+
margin-top: 20px;
|
|
89
|
+
}
|
|
90
|
+
.task-id-alt {
|
|
91
|
+
font-size: 7px !important;
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
</style>
|
|
95
|
+
<script setup>
|
|
96
|
+
import { Row } from "@/components/Table";
|
|
97
|
+
import { PlayIcon, TrashIcon, BagWhiteIcon, PauseIcon, EditIcon } from "@/components/icons";
|
|
98
|
+
import Checkbox from "@/components/ui/controls/atomic/Checkbox.vue";
|
|
99
|
+
import { useUIStore } from "@/stores/ui";
|
|
100
|
+
import TagLabel from "@/components/Editors/TagLabel.vue";
|
|
101
|
+
|
|
102
|
+
const ui = useUIStore();
|
|
103
|
+
|
|
104
|
+
const props = defineProps({
|
|
105
|
+
task: { type: Object }
|
|
106
|
+
});
|
|
107
|
+
|
|
108
|
+
const copy = (txt) => {
|
|
109
|
+
if (!txt) return;
|
|
110
|
+
navigator.clipboard.writeText(txt);
|
|
111
|
+
ui.showSuccess("Copied text");
|
|
112
|
+
};
|
|
113
|
+
const enable = async () => await ui.addAccount({ ...props.task, enabled: true });
|
|
114
|
+
const disable = async () => await ui.addAccount({ ...props.task, enabled: false });
|
|
115
|
+
const edit = () => {
|
|
116
|
+
ui.currentlyEditing = props.task;
|
|
117
|
+
ui.toggleModal("create-account");
|
|
118
|
+
};
|
|
119
|
+
</script>
|
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
<template>
|
|
2
|
+
<Modal>
|
|
3
|
+
<template #header>
|
|
4
|
+
<span>Create Accounts</span>
|
|
5
|
+
<img src="@/assets/img/scanner.svg" class="ml-4" />
|
|
6
|
+
</template>
|
|
7
|
+
|
|
8
|
+
<div>
|
|
9
|
+
<div class="form-grid mt-7 mb-4">
|
|
10
|
+
<div class="input-wrapper col-span-8 z-inf">
|
|
11
|
+
<label class="label-override">Account Tag </label>
|
|
12
|
+
<div :class="`input-default ${errors.includes('accountTag') ? 'error' : ''}`">
|
|
13
|
+
<Dropdown
|
|
14
|
+
class="text-xs w-64 h-8"
|
|
15
|
+
:default="ui.profile.accountTags[0]"
|
|
16
|
+
:options="ui.profile.accountTags"
|
|
17
|
+
:onClick="(f) => (creatorConfig.tag = f)"
|
|
18
|
+
:capitalize="true"
|
|
19
|
+
rightAmount="right-6 lg:right-2 top-2"
|
|
20
|
+
/>
|
|
21
|
+
</div>
|
|
22
|
+
</div>
|
|
23
|
+
|
|
24
|
+
<div class="input-wrapper col-span-4">
|
|
25
|
+
<label class="label-override">Threads</label>
|
|
26
|
+
<div :class="`input-default ${errors.includes('threads') ? 'error' : ''}`">
|
|
27
|
+
<input placeholder="1" type="number" min="1" max="50" v-model="creatorConfig.threads" />
|
|
28
|
+
</div>
|
|
29
|
+
</div>
|
|
30
|
+
<div class="input-wrapper col-span-8">
|
|
31
|
+
<label class="label-override">Email catchall</label>
|
|
32
|
+
<div :class="`input-default ${errors.includes('catchall') ? 'error' : ''}`">
|
|
33
|
+
<input placeholder="mycatchall.com" v-model="creatorConfig.catchall" />
|
|
34
|
+
</div>
|
|
35
|
+
</div>
|
|
36
|
+
<div class="input-wrapper col-span-4">
|
|
37
|
+
<label class="label-override">Catchall amount</label>
|
|
38
|
+
<div :class="`input-default ${errors.includes('number') ? 'error' : ''}`">
|
|
39
|
+
<input placeholder="1" type="number" min="0" max="5000" v-model="creatorConfig.number" />
|
|
40
|
+
</div>
|
|
41
|
+
</div>
|
|
42
|
+
<div class="input-wrapper col-span-12">
|
|
43
|
+
<div class="flex items-center gap-2">
|
|
44
|
+
<label class="label-override">Emails </label>
|
|
45
|
+
</div>
|
|
46
|
+
<div :class="`${errors.includes('emails') ? 'error-border' : ''}`">
|
|
47
|
+
<textarea
|
|
48
|
+
v-model="creatorConfig.emails"
|
|
49
|
+
class="proxy-editor"
|
|
50
|
+
spellcheck="false"
|
|
51
|
+
style="max-height: 250px; min-height: 150px;"
|
|
52
|
+
></textarea>
|
|
53
|
+
</div>
|
|
54
|
+
</div>
|
|
55
|
+
</div>
|
|
56
|
+
<button
|
|
57
|
+
class="button-default hover:opacity-70 active:opacity-50 bg-dark-400 w-48 text-xs flex items-center justify-center gap-x-2 ml-auto mt-4"
|
|
58
|
+
@click="done()"
|
|
59
|
+
>
|
|
60
|
+
Start <EditIcon />
|
|
61
|
+
</button>
|
|
62
|
+
</div>
|
|
63
|
+
</Modal>
|
|
64
|
+
</template>
|
|
65
|
+
<style lang="scss" scoped>
|
|
66
|
+
.input-wrapper {
|
|
67
|
+
label {
|
|
68
|
+
@apply flex;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
.error {
|
|
72
|
+
border-width: 2px !important;
|
|
73
|
+
border-color: rgb(238 130 130) !important;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
.error-border {
|
|
77
|
+
border: 2px solid rgb(238 130 130) !important;
|
|
78
|
+
border-radius: 8px;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
/* Proxy editor styles */
|
|
82
|
+
.proxy-editor {
|
|
83
|
+
width: 100%;
|
|
84
|
+
background-color: #1a1a2e;
|
|
85
|
+
color: #f8f8f2;
|
|
86
|
+
font-family: 'JetBrains Mono', 'Fira Code', 'Menlo', 'Monaco', 'Courier New', monospace;
|
|
87
|
+
padding: 12px;
|
|
88
|
+
border: none;
|
|
89
|
+
resize: none;
|
|
90
|
+
font-size: 14px;
|
|
91
|
+
line-height: 1.6;
|
|
92
|
+
tab-size: 4;
|
|
93
|
+
outline: none;
|
|
94
|
+
border: 1px solid #2d2d3b;
|
|
95
|
+
border-radius: 8px;
|
|
96
|
+
overflow: auto;
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
.proxy-editor:focus {
|
|
100
|
+
border-color: #6272a4;
|
|
101
|
+
box-shadow: 0 0 0 2px rgba(98, 114, 164, 0.25);
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
.z-inf {
|
|
105
|
+
z-index: 99999999999999;
|
|
106
|
+
}
|
|
107
|
+
</style>
|
|
108
|
+
<script setup>
|
|
109
|
+
import Modal from "@/components/ui/Modal.vue";
|
|
110
|
+
import { EditIcon } from "@/components/icons";
|
|
111
|
+
import { useUIStore } from "@/stores/ui";
|
|
112
|
+
import Dropdown from "@/components/ui/controls/atomic/Dropdown.vue";
|
|
113
|
+
|
|
114
|
+
import { ref } from "vue";
|
|
115
|
+
|
|
116
|
+
const ui = useUIStore();
|
|
117
|
+
const creatorConfig = ref({
|
|
118
|
+
threads: 5,
|
|
119
|
+
catchall: "",
|
|
120
|
+
emails: "",
|
|
121
|
+
tag: ui.profile.accountTags[0],
|
|
122
|
+
number: 0
|
|
123
|
+
});
|
|
124
|
+
|
|
125
|
+
const errors = ref([]);
|
|
126
|
+
|
|
127
|
+
const validate = (p) => {
|
|
128
|
+
errors.value = [];
|
|
129
|
+
if (
|
|
130
|
+
p.emails.trim().length !== 0 &&
|
|
131
|
+
p.emails
|
|
132
|
+
.trim()
|
|
133
|
+
.split("\n")
|
|
134
|
+
.some((s) => !s.includes("@"))
|
|
135
|
+
)
|
|
136
|
+
errors.value.push("emails");
|
|
137
|
+
if (p.catchall && !p.catchall.includes(".")) errors.value.push("catchall");
|
|
138
|
+
|
|
139
|
+
return errors.value.length === 0;
|
|
140
|
+
};
|
|
141
|
+
|
|
142
|
+
function done() {
|
|
143
|
+
if (!validate(creatorConfig.value)) return;
|
|
144
|
+
ui.toggleModal("");
|
|
145
|
+
ui.createAcconts(creatorConfig.value);
|
|
146
|
+
}
|
|
147
|
+
</script>
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
<template>
|
|
2
|
+
<Table>
|
|
3
|
+
<Header class="text-center grid-cols-5 ipadlg:grid-cols-7">
|
|
4
|
+
<div class="lg:col-span-2 col-span-3 flex">
|
|
5
|
+
<Checkbox
|
|
6
|
+
class="mr-3"
|
|
7
|
+
:toggled="ui.mainCheckbox.accounts"
|
|
8
|
+
@valueUpdate="ui.toggleMainCheckbox('accounts')"
|
|
9
|
+
/>
|
|
10
|
+
<div class="mx-auto flex items-center" @click="ui.toggleSort('eventId')">
|
|
11
|
+
<MailIcon class="mr-0 ipadlg:mr-3 w-4 h-4" />
|
|
12
|
+
<h4 class="hidden ipadlg:flex">Email</h4>
|
|
13
|
+
</div>
|
|
14
|
+
</div>
|
|
15
|
+
<div class="col-span-2 items-center justify-center hidden ipadlg:flex" v-once>
|
|
16
|
+
<KeyIcon class="mr-0 ipadlg:mr-3 w-4 h-4" />
|
|
17
|
+
<h4 class="hidden ipadlg:flex">Password</h4>
|
|
18
|
+
</div>
|
|
19
|
+
<div class="col-span-1 flex items-center justify-center" v-once>
|
|
20
|
+
<CheckmarkIcon class="mr-0 ipadlg:mr-3 w-4 h-4" />
|
|
21
|
+
<h4 class="hidden ipadlg:flex">Enabled</h4>
|
|
22
|
+
</div>
|
|
23
|
+
<div class="col-span-1 hidden lg:flex items-center justify-center" v-once>
|
|
24
|
+
<TicketIcon class="mr-0 ipadlg:mr-3 w-4 h-4" />
|
|
25
|
+
<h4 class="hidden ipadlg:flex">Tags</h4>
|
|
26
|
+
</div>
|
|
27
|
+
<div class="col-span-1 flex items-center justify-center" v-once>
|
|
28
|
+
<ClickIcon class="mr-0 ipadlg:mr-3 w-4 h-4" />
|
|
29
|
+
<h4 class="hidden ipadlg:flex">Actions</h4>
|
|
30
|
+
</div>
|
|
31
|
+
</Header>
|
|
32
|
+
<div v-if="toRender.length > 0">
|
|
33
|
+
<RecycleScroller
|
|
34
|
+
:items="toRender"
|
|
35
|
+
:item-size="64"
|
|
36
|
+
key-field="_id"
|
|
37
|
+
class="scroller vue-recycle-scroller ready direction-vertical flex flex-col divide-y-2 divide-border max-h-big overflow-y-auto hidden-scrollbars overflow-x-hidden stop-pan"
|
|
38
|
+
>
|
|
39
|
+
<template #default="props">
|
|
40
|
+
<div class="task" :key="i[props.item._id]">
|
|
41
|
+
<Account
|
|
42
|
+
@click="i[props.item._id]++"
|
|
43
|
+
:class="[props.item.index % 2 == 1 ? 'bg-dark-500' : 'bg-dark-550']"
|
|
44
|
+
:task="props.item"
|
|
45
|
+
/>
|
|
46
|
+
</div>
|
|
47
|
+
</template>
|
|
48
|
+
</RecycleScroller>
|
|
49
|
+
</div>
|
|
50
|
+
<div v-else class="flex justify-center text-light-400 py-2 bg-dark-500 border-b-2 border-border">
|
|
51
|
+
No accounts found
|
|
52
|
+
</div>
|
|
53
|
+
</Table>
|
|
54
|
+
</template>
|
|
55
|
+
<style lang="scss" scoped>
|
|
56
|
+
.task {
|
|
57
|
+
height: 64px;
|
|
58
|
+
}
|
|
59
|
+
h4 {
|
|
60
|
+
@apply text-white;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
.stop-pan {
|
|
64
|
+
touch-action: pan-y pan-up pan-down;
|
|
65
|
+
}
|
|
66
|
+
</style>
|
|
67
|
+
<script setup>
|
|
68
|
+
import { Table, Header } from "@/components/Table";
|
|
69
|
+
import { EventIcon, TicketIcon, StatusIcon, ClickIcon, DownIcon, MailIcon, KeyIcon, CheckmarkIcon } from "@/components/icons";
|
|
70
|
+
import Account from "./Account.vue";
|
|
71
|
+
import Checkbox from "@/components/ui/controls/atomic/Checkbox.vue";
|
|
72
|
+
import { useUIStore } from "@/stores/ui";
|
|
73
|
+
import { computed, ref } from "vue";
|
|
74
|
+
|
|
75
|
+
const props = defineProps({
|
|
76
|
+
tasks: { type: Object }
|
|
77
|
+
});
|
|
78
|
+
const i = ref({});
|
|
79
|
+
props.tasks.forEach((t) => (i.value[t._id] = 0));
|
|
80
|
+
|
|
81
|
+
const ui = useUIStore();
|
|
82
|
+
|
|
83
|
+
const toRender = computed(() => {
|
|
84
|
+
let c = 0;
|
|
85
|
+
return props.tasks.map((t) => ({ ...t, index: c++ }));
|
|
86
|
+
});
|
|
87
|
+
</script>
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
<template>
|
|
2
|
+
<Modal>
|
|
3
|
+
<template #header>
|
|
4
|
+
<span v-if="!ui.currentlyEditing?.email">Add Account</span>
|
|
5
|
+
<span v-else>Edit Account</span>
|
|
6
|
+
<img src="@/assets/img/scanner.svg" class="ml-4" />
|
|
7
|
+
</template>
|
|
8
|
+
|
|
9
|
+
<div>
|
|
10
|
+
<div class="my-3 grid grid-cols-12 gap-3 mt-7 mb-4">
|
|
11
|
+
<div class="input-wrapper col-span-4 z-10">
|
|
12
|
+
<label class="label-override">Profile Tag </label>
|
|
13
|
+
<Dropdown
|
|
14
|
+
:class="`input-default dropdown w-full ${errors.includes('profileTag') ? 'error' : ''}`"
|
|
15
|
+
:default="ui.profile.accountTags[0]"
|
|
16
|
+
:options="ui.profile.accountTags"
|
|
17
|
+
:onClick="(f) => (account.tag = f)"
|
|
18
|
+
:capitalize="true"
|
|
19
|
+
/>
|
|
20
|
+
</div>
|
|
21
|
+
<div class="input-wrapper col-span-8">
|
|
22
|
+
<label class="label-override">Email </label>
|
|
23
|
+
<div :class="`input-default required ${errors.includes('email') ? 'error' : ''}`">
|
|
24
|
+
<input
|
|
25
|
+
placeholder="email@example.com"
|
|
26
|
+
type="text"
|
|
27
|
+
v-model="account.email"
|
|
28
|
+
required
|
|
29
|
+
autocomplete="new-password"
|
|
30
|
+
name="not-email-field-random-12345"
|
|
31
|
+
data-dashlane-rid=""
|
|
32
|
+
data-dashlane-label=""
|
|
33
|
+
data-dashlane-classification=""
|
|
34
|
+
data-form-type="other"
|
|
35
|
+
role="textbox"
|
|
36
|
+
inputmode="email"
|
|
37
|
+
/>
|
|
38
|
+
</div>
|
|
39
|
+
</div>
|
|
40
|
+
</div>
|
|
41
|
+
<div class="input-wrapper col-span-12">
|
|
42
|
+
<label class="label-override">Password </label>
|
|
43
|
+
<div :class="`input-default required ${errors.includes('password') ? 'error' : ''}`">
|
|
44
|
+
<input
|
|
45
|
+
placeholder="***********"
|
|
46
|
+
v-model="account.password"
|
|
47
|
+
required
|
|
48
|
+
autocomplete="off"
|
|
49
|
+
name="account_password_disableautocomplete"
|
|
50
|
+
/>
|
|
51
|
+
</div>
|
|
52
|
+
</div>
|
|
53
|
+
<button
|
|
54
|
+
class="button-default hover:opacity-70 active:opacity-50 bg-dark-400 w-48 text-xs flex items-center justify-center gap-x-2 ml-auto mt-4"
|
|
55
|
+
@click="done()"
|
|
56
|
+
>
|
|
57
|
+
Save <EditIcon />
|
|
58
|
+
</button>
|
|
59
|
+
</div>
|
|
60
|
+
</Modal>
|
|
61
|
+
</template>
|
|
62
|
+
<style lang="scss" scoped>
|
|
63
|
+
.input-wrapper {
|
|
64
|
+
label {
|
|
65
|
+
@apply flex;
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
.error {
|
|
69
|
+
border-width: 2px !important;
|
|
70
|
+
border-color: rgb(238 130 130) !important;
|
|
71
|
+
}
|
|
72
|
+
</style>
|
|
73
|
+
<script setup>
|
|
74
|
+
import Modal from "@/components/ui/Modal.vue";
|
|
75
|
+
import { EditIcon } from "@/components/icons";
|
|
76
|
+
import { useUIStore } from "@/stores/ui";
|
|
77
|
+
import Dropdown from "@/components/ui/controls/atomic/Dropdown.vue";
|
|
78
|
+
|
|
79
|
+
import { ref } from "vue";
|
|
80
|
+
|
|
81
|
+
const ui = useUIStore();
|
|
82
|
+
const account = ref({
|
|
83
|
+
email: "",
|
|
84
|
+
password: "",
|
|
85
|
+
tag: ui.profile.accountTags[0]
|
|
86
|
+
});
|
|
87
|
+
|
|
88
|
+
if (ui.currentlyEditing?.email) account.value = ui.currentlyEditing;
|
|
89
|
+
|
|
90
|
+
const errors = ref([]);
|
|
91
|
+
|
|
92
|
+
const validate = (p) => {
|
|
93
|
+
errors.value = [];
|
|
94
|
+
|
|
95
|
+
if (!p.email.includes("@")) errors.value.push("email");
|
|
96
|
+
if (p.password.length < 5) errors.value.push("password");
|
|
97
|
+
|
|
98
|
+
return errors.value.length === 0;
|
|
99
|
+
};
|
|
100
|
+
|
|
101
|
+
function done() {
|
|
102
|
+
if (!validate(account.value)) return;
|
|
103
|
+
ui.toggleModal("");
|
|
104
|
+
ui.addAccount(account.value);
|
|
105
|
+
}
|
|
106
|
+
</script>
|