@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,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>