@necrolab/dashboard 0.4.61 → 0.4.208

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (133) hide show
  1. package/.prettierrc +1 -27
  2. package/.vscode/extensions.json +1 -1
  3. package/README.md +79 -43
  4. package/backend/api.js +48 -40
  5. package/backend/auth.js +3 -3
  6. package/backend/batching.js +1 -1
  7. package/backend/endpoints.js +77 -13
  8. package/backend/index.js +2 -2
  9. package/backend/mock-data.js +38 -29
  10. package/backend/mock-src/classes/logger.js +8 -8
  11. package/backend/mock-src/classes/utils.js +3 -7
  12. package/backend/mock-src/database.js +0 -0
  13. package/backend/mock-src/ticketmaster.js +79 -79
  14. package/backend/validator.js +2 -2
  15. package/config/configs.json +3 -2
  16. package/config/filter.json +3 -2
  17. package/index.html +10 -81
  18. package/index.js +1 -1
  19. package/package.json +25 -40
  20. package/postcss.config.js +1 -1
  21. package/postinstall.js +17 -98
  22. package/public/android-chrome-192x192.png +0 -0
  23. package/public/android-chrome-512x512.png +0 -0
  24. package/public/apple-touch-icon.png +0 -0
  25. package/public/favicon-16x16.png +0 -0
  26. package/public/favicon-32x32.png +0 -0
  27. package/public/favicon.ico +0 -0
  28. package/public/manifest.json +7 -12
  29. package/public/sw.js +2 -0
  30. package/public/workbox-49fdaf31.js +2 -0
  31. package/public/workbox-49fdaf31.js.map +1 -0
  32. package/public/workbox-88575b92.js +2 -0
  33. package/public/workbox-88575b92.js.map +1 -0
  34. package/public/workbox-a67a7b11.js +2 -0
  35. package/public/workbox-a67a7b11.js.map +1 -0
  36. package/public/workbox-d4314735.js +2 -0
  37. package/public/workbox-d4314735.js.map +1 -0
  38. package/public/workbox-e0f89ef3.js +2 -0
  39. package/public/workbox-e0f89ef3.js.map +1 -0
  40. package/run +9 -176
  41. package/src/App.vue +85 -498
  42. package/src/assets/css/_input.scss +99 -144
  43. package/src/assets/css/main.scss +99 -450
  44. package/src/assets/img/background.svg +2 -2
  45. package/src/assets/img/logo_icon.png +0 -0
  46. package/src/components/Auth/LoginForm.vue +11 -62
  47. package/src/components/Editors/Account/Account.vue +40 -116
  48. package/src/components/Editors/Account/AccountCreator.vue +39 -88
  49. package/src/components/Editors/Account/AccountView.vue +34 -102
  50. package/src/components/Editors/Account/CreateAccount.vue +32 -80
  51. package/src/components/Editors/Profile/CreateProfile.vue +83 -269
  52. package/src/components/Editors/Profile/Profile.vue +47 -132
  53. package/src/components/Editors/Profile/ProfileCountryChooser.vue +20 -82
  54. package/src/components/Editors/Profile/ProfileView.vue +34 -91
  55. package/src/components/Editors/TagLabel.vue +6 -67
  56. package/src/components/Filter/Filter.vue +72 -289
  57. package/src/components/Filter/FilterPreview.vue +30 -171
  58. package/src/components/Filter/PriceSortToggle.vue +4 -74
  59. package/src/components/Table/Header.vue +1 -1
  60. package/src/components/Table/Row.vue +1 -1
  61. package/src/components/Table/Table.vue +2 -19
  62. package/src/components/Tasks/CheckStock.vue +13 -28
  63. package/src/components/Tasks/Controls/DesktopControls.vue +17 -17
  64. package/src/components/Tasks/Controls/MobileControls.vue +45 -8
  65. package/src/components/Tasks/CreateTaskAXS.vue +73 -79
  66. package/src/components/Tasks/CreateTaskTM.vue +142 -94
  67. package/src/components/Tasks/MassEdit.vue +7 -9
  68. package/src/components/Tasks/QuickSettings.vue +55 -169
  69. package/src/components/Tasks/ScrapeVenue.vue +4 -7
  70. package/src/components/Tasks/Stats.vue +23 -52
  71. package/src/components/Tasks/Task.vue +136 -378
  72. package/src/components/Tasks/TaskView.vue +47 -107
  73. package/src/components/Tasks/Utilities.vue +6 -5
  74. package/src/components/icons/Bag.vue +1 -1
  75. package/src/components/icons/Loyalty.vue +1 -1
  76. package/src/components/icons/Mail.vue +2 -2
  77. package/src/components/icons/Play.vue +2 -2
  78. package/src/components/icons/Reload.vue +5 -4
  79. package/src/components/icons/Sandclock.vue +2 -2
  80. package/src/components/icons/Stadium.vue +1 -1
  81. package/src/components/icons/index.js +1 -24
  82. package/src/components/ui/Modal.vue +13 -105
  83. package/src/components/ui/Navbar.vue +38 -171
  84. package/src/components/ui/ReconnectIndicator.vue +55 -351
  85. package/src/components/ui/Splash.vue +35 -5
  86. package/src/components/ui/controls/CountryChooser.vue +62 -200
  87. package/src/components/ui/controls/atomic/Checkbox.vue +10 -119
  88. package/src/components/ui/controls/atomic/Dropdown.vue +39 -208
  89. package/src/components/ui/controls/atomic/MultiDropdown.vue +37 -300
  90. package/src/libs/Filter.js +170 -200
  91. package/src/registerServiceWorker.js +1 -1
  92. package/src/stores/connection.js +53 -51
  93. package/src/stores/logger.js +3 -11
  94. package/src/stores/sampleData.js +235 -207
  95. package/src/stores/ui.js +44 -112
  96. package/src/stores/utils.js +6 -90
  97. package/src/views/Accounts.vue +35 -44
  98. package/src/views/Console.vue +90 -341
  99. package/src/views/Editor.vue +123 -1176
  100. package/src/views/FilterBuilder.vue +251 -607
  101. package/src/views/Login.vue +14 -76
  102. package/src/views/Profiles.vue +25 -44
  103. package/src/views/Tasks.vue +100 -187
  104. package/static/offline.html +50 -192
  105. package/tailwind.config.js +26 -104
  106. package/vite.config.js +16 -73
  107. package/vue.config.js +32 -0
  108. package/workbox-config.js +11 -0
  109. package/artwork/image.png +0 -0
  110. package/dev-server.js +0 -136
  111. package/exit +0 -209
  112. package/jsconfig.json +0 -16
  113. package/src/assets/css/_utilities.scss +0 -388
  114. package/src/assets/img/background.svg.backup +0 -11
  115. package/src/components/icons/Check.vue +0 -5
  116. package/src/components/icons/Close.vue +0 -21
  117. package/src/components/icons/CloseX.vue +0 -5
  118. package/src/components/icons/Key.vue +0 -21
  119. package/src/components/icons/Pencil.vue +0 -21
  120. package/src/components/icons/Profile.vue +0 -18
  121. package/src/components/icons/Sell.vue +0 -21
  122. package/src/components/icons/Spinner.vue +0 -42
  123. package/src/components/icons/SquareCheck.vue +0 -18
  124. package/src/components/icons/SquareUncheck.vue +0 -18
  125. package/src/components/icons/Wildcard.vue +0 -18
  126. package/src/components/ui/controls/atomic/LoadingButton.vue +0 -45
  127. package/src/composables/useClickOutside.js +0 -21
  128. package/src/composables/useDropdownPosition.js +0 -174
  129. package/src/types/index.js +0 -41
  130. package/src/utils/debug.js +0 -1
  131. package/switch-branch.sh +0 -41
  132. package/workbox-config.cjs +0 -63
  133. /package/src/assets/img/{logo_icon-old.png → logo_icon_2.png} +0 -0
@@ -6,85 +6,63 @@
6
6
  </template>
7
7
 
8
8
  <div>
9
- <div class="form-grid mb-4 mt-7">
10
- <div class="input-wrapper relative-positioned z-tooltip col-span-8">
11
- <label class="label-override mb-2">
12
- Account Tag
13
- <TagIcon />
14
- </label>
15
- <Dropdown
16
- class="input-default dropdown w-full p-4"
17
- :default="ui.profile.tags[0]"
18
- :options="ui.profile.tags"
19
- :onClick="(f) => (creatorConfig.tag = f)"
20
- :capitalize="true"
21
- :allowDefault="false"
22
- :chosen="creatorConfig.tag" />
9
+ <div class="my-3 grid grid-cols-12 gap-3 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>
23
22
  </div>
24
23
 
25
24
  <div class="input-wrapper col-span-4">
26
- <label class="label-override mb-2">
27
- Threads
28
- <EditIcon />
29
- </label>
25
+ <label class="label-override">Threads</label>
30
26
  <div :class="`input-default ${errors.includes('threads') ? 'error' : ''}`">
31
27
  <input placeholder="1" type="number" min="1" max="50" v-model="creatorConfig.threads" />
32
- <div class="input-incrementer">
33
- <button @click="creatorConfig.threads++">
34
- <UpIcon />
35
- </button>
36
- <button @click="if (creatorConfig.threads > 1) creatorConfig.threads--;">
37
- <DownIcon />
38
- </button>
39
- </div>
40
28
  </div>
41
29
  </div>
42
30
  <div class="input-wrapper col-span-8">
43
- <label class="label-override mb-2">
44
- Email catchall
45
- <MailIcon />
46
- </label>
31
+ <label class="label-override">Email catchall</label>
47
32
  <div :class="`input-default ${errors.includes('catchall') ? 'error' : ''}`">
48
- <input placeholder="example.com" v-model="creatorConfig.catchall" />
33
+ <input placeholder="mycatchall.com" v-model="creatorConfig.catchall" />
49
34
  </div>
50
35
  </div>
51
36
  <div class="input-wrapper col-span-4">
52
- <label class="label-override mb-2">
53
- Catchall amount
54
- <BagIcon />
55
- </label>
37
+ <label class="label-override">Catchall amount</label>
56
38
  <div :class="`input-default ${errors.includes('number') ? 'error' : ''}`">
57
39
  <input placeholder="1" type="number" min="0" max="5000" v-model="creatorConfig.number" />
58
- <div class="input-incrementer">
59
- <button @click="creatorConfig.number++">
60
- <UpIcon />
61
- </button>
62
- <button @click="if (creatorConfig.number > 0) creatorConfig.number--;">
63
- <DownIcon />
64
- </button>
65
- </div>
66
40
  </div>
67
41
  </div>
68
42
  <div class="input-wrapper col-span-12">
69
- <label class="label-override mb-2">
70
- Emails
71
- <MailIcon />
72
- </label>
73
- <div :class="`${errors.includes('emails') ? 'error-border' : ''}`">
74
- <textarea
75
- v-model="creatorConfig.emails"
76
- class="proxy-editor"
77
- spellcheck="false"
78
- style="max-height: 250px; min-height: 150px"
79
- placeholder="Enter emails here - One per line"></textarea>
43
+ <div class="flex items-center gap-2">
44
+ <label class="label-override">Emails </label>
80
45
  </div>
46
+ <!-- <div :class="`input-default ${errors.includes('email') ? 'error' : ''}`"> -->
47
+ <!-- <input placeholder="email@example.com" type="email" v-model="account.email" /> -->
48
+
49
+ <CodeEditor
50
+ v-model="creatorConfig.emails"
51
+ width="100%"
52
+ spellcheck="false"
53
+ :hide_header="true"
54
+ :language_selector="false"
55
+ :languages="[['text']]"
56
+ theme="dark"
57
+ :class="`${errors.includes('emails') ? 'error' : ''} max-h-60`"
58
+ ></CodeEditor>
81
59
  </div>
82
60
  </div>
83
61
  <button
84
- class="button-default ml-auto mt-4 flex w-48 items-center justify-center gap-x-2 bg-dark-400 text-xs hover:opacity-70 active:opacity-50"
85
- @click="done()">
86
- Start
87
- <EditIcon />
62
+ 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"
63
+ @click="done()"
64
+ >
65
+ Start <EditIcon />
88
66
  </button>
89
67
  </div>
90
68
  </Modal>
@@ -100,43 +78,16 @@
100
78
  border-color: rgb(238 130 130) !important;
101
79
  }
102
80
 
103
- .error-border {
104
- border: 2px solid rgb(238 130 130) !important;
105
- border-radius: 8px;
106
- }
107
-
108
- /* Proxy editor styles */
109
- .proxy-editor {
110
- width: 100%;
111
- background-color: #2e2f34;
112
- color: #e2e2e5;
113
- font-family: "JetBrains Mono", "Fira Code", "Menlo", "Monaco", "Courier New", monospace;
114
- padding: 12px;
115
- border: none;
116
- resize: none;
117
- font-size: 14px;
118
- line-height: 1.6;
119
- tab-size: 4;
120
- outline: none;
121
- border: 1px solid #3d3e44;
122
- border-radius: 8px;
123
- overflow: auto;
124
- }
125
-
126
- .proxy-editor:focus {
127
- border-color: #44454b;
128
- box-shadow: 0 0 0 1px rgba(255, 255, 255, 0.2);
129
- }
130
-
131
81
  .z-inf {
132
82
  z-index: 99999999999999;
133
83
  }
134
84
  </style>
135
85
  <script setup>
136
86
  import Modal from "@/components/ui/Modal.vue";
137
- import { EditIcon, TagIcon, SpinnerIcon, UpIcon, DownIcon, MailIcon, BagIcon } from "@/components/icons";
87
+ import { EditIcon } from "@/components/icons";
138
88
  import { useUIStore } from "@/stores/ui";
139
89
  import Dropdown from "@/components/ui/controls/atomic/Dropdown.vue";
90
+ import CodeEditor from "simple-code-editor";
140
91
 
141
92
  import { ref } from "vue";
142
93
 
@@ -145,7 +96,7 @@ const creatorConfig = ref({
145
96
  threads: 5,
146
97
  catchall: "",
147
98
  emails: "",
148
- tag: ui.profile.tags[0],
99
+ tag: ui.profile.accountTags[0],
149
100
  number: 0
150
101
  });
151
102
 
@@ -1,62 +1,59 @@
1
1
  <template>
2
2
  <Table>
3
- <Header class="sticky top-0 z-10 grid-cols-5 bg-dark-400 text-center md:grid-cols-7">
4
- <div class="col-span-3 flex lg:col-span-2">
3
+ <Header class="text-center grid-cols-5 ipadlg:grid-cols-7">
4
+ <div class="lg:col-span-2 col-span-3 flex">
5
5
  <Checkbox
6
6
  class="mr-3"
7
7
  :toggled="ui.mainCheckbox.accounts"
8
8
  @valueUpdate="ui.toggleMainCheckbox('accounts')"
9
- :isHeader="true" />
9
+ />
10
10
  <div class="mx-auto flex items-center" @click="ui.toggleSort('eventId')">
11
- <MailIcon class="mr-0 h-4 w-4 md:mr-3" />
12
- <h4 class="hidden md:flex">Email</h4>
11
+ <img src="/img/mail.svg" class="mr-0 ipadlg:mr-3" />
12
+ <h4 class="hidden ipadlg:flex">Email</h4>
13
13
  </div>
14
14
  </div>
15
- <div class="col-span-2 hidden items-center justify-center md:flex" v-once>
16
- <KeyIcon class="mr-0 h-4 w-4 md:mr-3" />
17
- <h4 class="hidden md:flex">Password</h4>
15
+ <div class="col-span-2 items-center justify-center hidden ipadlg:flex" v-once>
16
+ <img src="/img/key.svg" class="mr-0 ipadlg:mr-3" />
17
+ <h4 class="hidden ipadlg:flex">Password</h4>
18
18
  </div>
19
19
  <div class="col-span-1 flex items-center justify-center" v-once>
20
- <CheckmarkIcon class="mr-0 h-4 w-4 md:mr-3" />
21
- <h4 class="hidden md:flex">Enabled</h4>
20
+ <img src="/img/controls/enable.svg" width="14" class="mr-0 ipadlg:mr-3" />
21
+ <h4 class="hidden ipadlg:flex">Enabled</h4>
22
22
  </div>
23
- <div class="col-span-1 hidden items-center justify-center lg:flex" v-once>
24
- <TicketIcon class="mr-0 h-4 w-4 md:mr-3" />
25
- <h4 class="hidden md:flex">Tags</h4>
23
+ <div class="col-span-1 hidden lg:flex items-center justify-center" v-once>
24
+ <TicketIcon class="mr-0 ipadlg:mr-3" />
25
+ <h4 class="hidden ipadlg:flex">Tags</h4>
26
26
  </div>
27
27
  <div class="col-span-1 flex items-center justify-center" v-once>
28
- <ClickIcon class="mr-0 h-4 w-4 md:mr-3" />
29
- <h4 class="hidden md:flex">Actions</h4>
28
+ <ClickIcon class="mr-0 ipadlg:mr-3" />
29
+ <h4 class="hidden ipadlg:flex">Actions</h4>
30
30
  </div>
31
31
  </Header>
32
- <div
33
- v-if="toRender.length != 0"
34
- class="hidden-scrollbars stop-pan overflow-y-auto overflow-x-hidden"
35
- :style="{ maxHeight: dynamicTableHeight }">
32
+ <div v-if="toRender.length > 0">
36
33
  <RecycleScroller
37
34
  :items="toRender"
38
35
  :item-size="64"
39
- key-field="index"
40
- class="scroller vue-recycle-scroller ready direction-vertical flex flex-col divide-y divide-dark-650">
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
+ >
41
39
  <template #default="props">
42
- <div class="account" :key="`account-${props.item.id || props.item.index}`">
40
+ <div class="task" :key="i[props.item._id]">
43
41
  <Account
44
- @click="i[props.item.index]++"
45
- :class="props.item.index % 2 == 1 ? 'table-row-even' : 'table-row-odd'"
46
- :account="props.item" />
42
+ @click="i[props.item._id]++"
43
+ :class="[props.item.index % 2 == 1 ? 'bg-dark-500' : 'bg-dark-550']"
44
+ :task="props.item"
45
+ />
47
46
  </div>
48
47
  </template>
49
48
  </RecycleScroller>
50
49
  </div>
51
- <div v-else class="empty-state flex flex-col items-center justify-center bg-dark-400 py-8 text-center">
52
- <MailIcon class="mb-3 h-12 w-12 text-dark-400 opacity-50" />
53
- <p class="text-sm text-light-400">No accounts found</p>
54
- <p class="mt-1 text-xs text-light-500">Create accounts to get started</p>
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
55
52
  </div>
56
53
  </Table>
57
54
  </template>
58
55
  <style lang="scss" scoped>
59
- .account {
56
+ .task {
60
57
  height: 64px;
61
58
  }
62
59
  h4 {
@@ -66,90 +63,25 @@ h4 {
66
63
  .stop-pan {
67
64
  touch-action: pan-y pan-up pan-down;
68
65
  }
69
-
70
- .empty-state {
71
- color: #969696;
72
- font-size: 14px;
73
- font-weight: 500;
74
- }
75
66
  </style>
76
67
  <script setup>
77
68
  import { Table, Header } from "@/components/Table";
78
- import {
79
- EventIcon,
80
- TicketIcon,
81
- StatusIcon,
82
- ClickIcon,
83
- DownIcon,
84
- MailIcon,
85
- KeyIcon,
86
- CheckmarkIcon
87
- } from "@/components/icons";
69
+ import { EventIcon, TicketIcon, StatusIcon, ClickIcon, DownIcon } from "@/components/icons";
88
70
  import Account from "./Account.vue";
89
71
  import Checkbox from "@/components/ui/controls/atomic/Checkbox.vue";
90
72
  import { useUIStore } from "@/stores/ui";
91
- import { computed, ref, onMounted, onUnmounted } from "vue";
73
+ import { computed, ref } from "vue";
92
74
 
93
75
  const props = defineProps({
94
- accounts: { type: Object }
76
+ tasks: { type: Object }
95
77
  });
78
+ const i = ref({});
79
+ props.tasks.forEach((t) => (i.value[t._id] = 0));
80
+
96
81
  const ui = useUIStore();
97
82
 
98
- const i = ref({});
99
83
  const toRender = computed(() => {
100
84
  let c = 0;
101
- const rendered = props.accounts.map((t) => ({ ...t, index: c++ }));
102
-
103
- // Initialize reactive refs for click tracking
104
- rendered.forEach((t) => {
105
- if (t.id && !(t.id in i.value)) {
106
- i.value[t.id] = 0;
107
- }
108
- if (!(t.index in i.value)) {
109
- i.value[t.index] = 0;
110
- }
111
- });
112
-
113
- return rendered;
114
- });
115
-
116
- // Dynamic height calculation for perfect item fitting
117
- const windowHeight = ref(window.innerHeight);
118
- const windowWidth = ref(window.innerWidth);
119
-
120
- const updateDimensions = () => {
121
- windowHeight.value = window.innerHeight;
122
- windowWidth.value = window.innerWidth;
123
- };
124
-
125
- onMounted(() => {
126
- window.addEventListener("resize", updateDimensions);
127
- });
128
-
129
- onUnmounted(() => {
130
- window.removeEventListener("resize", updateDimensions);
131
- });
132
-
133
- const dynamicTableHeight = computed(() => {
134
- // Calculate available space for accounts table with conservative buffer
135
- const headerHeight = 60; // Header + navbar
136
- const titleHeight = 50; // Accounts title and controls
137
- const searchHeight = 50; // Search and filter controls
138
- const margins = windowWidth.value >= 1024 ? 40 : 25;
139
- const bufferSpace = 50; // Conservative buffer to prevent partial items
140
-
141
- const totalUsedSpace = headerHeight + titleHeight + searchHeight + margins + bufferSpace;
142
- const availableHeight = windowHeight.value - totalUsedSpace;
143
-
144
- // Account row height is always 64px
145
- const rowHeight = 64;
146
- const minRowsToShow = 2;
147
- const minHeight = minRowsToShow * rowHeight;
148
-
149
- // Calculate exact number of complete rows that fit with conservative approach
150
- const maxCompleteRows = Math.floor(Math.max(availableHeight, minHeight) / rowHeight);
151
- const exactHeight = maxCompleteRows * rowHeight;
152
-
153
- return exactHeight + "px";
85
+ return props.tasks.map((t) => ({ ...t, index: c++ }));
154
86
  });
155
87
  </script>
@@ -7,71 +7,42 @@
7
7
  </template>
8
8
 
9
9
  <div>
10
- <div class="my-3 grid grid-cols-12 gap-3">
11
- <!-- Account tag -->
12
- <div class="input-wrapper relative-positioned z-tooltip col-span-4">
13
- <label class="label-override mb-2">
14
- Account Tag
15
- <TagIcon />
16
- </label>
17
- <Dropdown
18
- :class="`input-default dropdown w-full p-4`"
19
- :default="ui.profile.tags[0]"
20
- :options="ui.profile.tags"
21
- :onClick="(f) => (account.tag = f)"
22
- :capitalize="true"
23
- :allowDefault="false"
24
- :chosen="account.tag" />
25
- </div>
26
-
27
- <!-- Email -->
28
- <div class="input-wrapper z-0 col-span-8">
29
- <label class="label-override mb-2">
30
- Email
31
- <MailIcon />
32
- </label>
33
- <div :class="`input-default required ${errors.includes('email') ? 'error' : ''}`">
34
- <input
35
- placeholder="email@example.com"
36
- type="email"
37
- v-model="account.email"
38
- required
39
- autocomplete="new-password"
40
- name="not-email-field-random-12345"
41
- data-dashlane-rid=""
42
- data-dashlane-label=""
43
- data-dashlane-classification=""
44
- data-form-type="other"
45
- role="textbox"
46
- inputmode="email" />
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
+ <div :class="`input-default ${errors.includes('profileTag') ? 'error' : ''}`">
14
+ <Dropdown
15
+ class="text-xs w-64 h-8"
16
+ :default="ui.profile.accountTags[0]"
17
+ :options="ui.profile.accountTags"
18
+ :onClick="(f) => (account.tag = f)"
19
+ :capitalize="true"
20
+ rightAmount="right-6 lg:right-2 top-2"
21
+ />
47
22
  </div>
48
23
  </div>
49
-
50
- <!-- Password -->
51
- <div class="input-wrapper z-0 col-span-12">
52
- <label class="label-override mb-2">
53
- Password
54
- <KeyIcon />
55
- </label>
56
- <div :class="`input-default required ${errors.includes('password') ? 'error' : ''}`">
57
- <input
58
- placeholder="***********"
59
- type="password"
60
- v-model="account.password"
61
- required
62
- autocomplete="off"
63
- name="account_password_disableautocomplete" />
24
+ <div class="input-wrapper col-span-8">
25
+ <label class="label-override">Email </label>
26
+ <div :class="`input-default ${errors.includes('email') ? 'error' : ''}`">
27
+ <input placeholder="email@example.com" type="email" v-model="account.email" />
28
+ <span class="text-red-400 my-auto mr-2 mt-3">* </span>
64
29
  </div>
65
30
  </div>
66
31
  </div>
32
+ <div class="input-wrapper col-span-12">
33
+ <label class="label-override">Password </label>
34
+ <div :class="`input-default ${errors.includes('password') ? 'error' : ''}`">
35
+ <input placeholder="***********" v-model="account.password" />
36
+ <span class="text-red-400 my-auto mr-2 mt-3">* </span>
37
+ </div>
38
+ </div>
39
+ <button
40
+ 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"
41
+ @click="done()"
42
+ >
43
+ Save <EditIcon />
44
+ </button>
67
45
  </div>
68
-
69
- <button
70
- class="button-default ml-auto mt-4 flex w-48 items-center justify-center gap-x-2 bg-dark-400 text-xs hover:opacity-70 active:opacity-50"
71
- @click="done()">
72
- Save
73
- <EditIcon />
74
- </button>
75
46
  </Modal>
76
47
  </template>
77
48
  <style lang="scss" scoped>
@@ -80,16 +51,6 @@
80
51
  @apply flex;
81
52
  }
82
53
  }
83
- .z-0 {
84
- z-index: 0 !important;
85
- }
86
- .z-1 {
87
- z-index: 1 !important;
88
- }
89
- .z-2 {
90
- z-index: 2 !important;
91
- }
92
-
93
54
  .error {
94
55
  border-width: 2px !important;
95
56
  border-color: rgb(238 130 130) !important;
@@ -97,16 +58,7 @@
97
58
  </style>
98
59
  <script setup>
99
60
  import Modal from "@/components/ui/Modal.vue";
100
- import {
101
- EditIcon,
102
- MailIcon,
103
- KeyIcon,
104
- ProfileIcon,
105
- TimerIcon,
106
- SandclockIcon,
107
- TagIcon,
108
- ScannerIcon
109
- } from "@/components/icons";
61
+ import { EditIcon } from "@/components/icons";
110
62
  import { useUIStore } from "@/stores/ui";
111
63
  import Dropdown from "@/components/ui/controls/atomic/Dropdown.vue";
112
64
 
@@ -116,7 +68,7 @@ const ui = useUIStore();
116
68
  const account = ref({
117
69
  email: "",
118
70
  password: "",
119
- tag: ui.profile.tags[0]
71
+ tag: ui.profile.accountTags[0]
120
72
  });
121
73
 
122
74
  if (ui.currentlyEditing?.email) account.value = ui.currentlyEditing;