@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.
- package/.prettierrc +1 -27
- package/.vscode/extensions.json +1 -1
- package/README.md +79 -43
- package/backend/api.js +48 -40
- package/backend/auth.js +3 -3
- package/backend/batching.js +1 -1
- package/backend/endpoints.js +77 -13
- package/backend/index.js +2 -2
- package/backend/mock-data.js +38 -29
- package/backend/mock-src/classes/logger.js +8 -8
- package/backend/mock-src/classes/utils.js +3 -7
- package/backend/mock-src/database.js +0 -0
- package/backend/mock-src/ticketmaster.js +79 -79
- package/backend/validator.js +2 -2
- package/config/configs.json +3 -2
- package/config/filter.json +3 -2
- package/index.html +10 -81
- package/index.js +1 -1
- package/package.json +25 -40
- package/postcss.config.js +1 -1
- package/postinstall.js +17 -98
- 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/manifest.json +7 -12
- package/public/sw.js +2 -0
- package/public/workbox-49fdaf31.js +2 -0
- package/public/workbox-49fdaf31.js.map +1 -0
- package/public/workbox-88575b92.js +2 -0
- package/public/workbox-88575b92.js.map +1 -0
- package/public/workbox-a67a7b11.js +2 -0
- package/public/workbox-a67a7b11.js.map +1 -0
- package/public/workbox-d4314735.js +2 -0
- package/public/workbox-d4314735.js.map +1 -0
- package/public/workbox-e0f89ef3.js +2 -0
- package/public/workbox-e0f89ef3.js.map +1 -0
- package/run +9 -176
- package/src/App.vue +85 -498
- package/src/assets/css/_input.scss +99 -144
- package/src/assets/css/main.scss +99 -450
- package/src/assets/img/background.svg +2 -2
- package/src/assets/img/logo_icon.png +0 -0
- package/src/components/Auth/LoginForm.vue +11 -62
- package/src/components/Editors/Account/Account.vue +40 -116
- package/src/components/Editors/Account/AccountCreator.vue +39 -88
- package/src/components/Editors/Account/AccountView.vue +34 -102
- package/src/components/Editors/Account/CreateAccount.vue +32 -80
- package/src/components/Editors/Profile/CreateProfile.vue +83 -269
- package/src/components/Editors/Profile/Profile.vue +47 -132
- package/src/components/Editors/Profile/ProfileCountryChooser.vue +20 -82
- package/src/components/Editors/Profile/ProfileView.vue +34 -91
- package/src/components/Editors/TagLabel.vue +6 -67
- package/src/components/Filter/Filter.vue +72 -289
- package/src/components/Filter/FilterPreview.vue +30 -171
- package/src/components/Filter/PriceSortToggle.vue +4 -74
- package/src/components/Table/Header.vue +1 -1
- package/src/components/Table/Row.vue +1 -1
- package/src/components/Table/Table.vue +2 -19
- package/src/components/Tasks/CheckStock.vue +13 -28
- package/src/components/Tasks/Controls/DesktopControls.vue +17 -17
- package/src/components/Tasks/Controls/MobileControls.vue +45 -8
- package/src/components/Tasks/CreateTaskAXS.vue +73 -79
- package/src/components/Tasks/CreateTaskTM.vue +142 -94
- package/src/components/Tasks/MassEdit.vue +7 -9
- package/src/components/Tasks/QuickSettings.vue +55 -169
- package/src/components/Tasks/ScrapeVenue.vue +4 -7
- package/src/components/Tasks/Stats.vue +23 -52
- package/src/components/Tasks/Task.vue +136 -378
- package/src/components/Tasks/TaskView.vue +47 -107
- package/src/components/Tasks/Utilities.vue +6 -5
- package/src/components/icons/Bag.vue +1 -1
- package/src/components/icons/Loyalty.vue +1 -1
- package/src/components/icons/Mail.vue +2 -2
- package/src/components/icons/Play.vue +2 -2
- package/src/components/icons/Reload.vue +5 -4
- package/src/components/icons/Sandclock.vue +2 -2
- package/src/components/icons/Stadium.vue +1 -1
- package/src/components/icons/index.js +1 -24
- package/src/components/ui/Modal.vue +13 -105
- package/src/components/ui/Navbar.vue +38 -171
- package/src/components/ui/ReconnectIndicator.vue +55 -351
- package/src/components/ui/Splash.vue +35 -5
- package/src/components/ui/controls/CountryChooser.vue +62 -200
- package/src/components/ui/controls/atomic/Checkbox.vue +10 -119
- package/src/components/ui/controls/atomic/Dropdown.vue +39 -208
- package/src/components/ui/controls/atomic/MultiDropdown.vue +37 -300
- package/src/libs/Filter.js +170 -200
- package/src/registerServiceWorker.js +1 -1
- package/src/stores/connection.js +53 -51
- package/src/stores/logger.js +3 -11
- package/src/stores/sampleData.js +235 -207
- package/src/stores/ui.js +44 -112
- package/src/stores/utils.js +6 -90
- package/src/views/Accounts.vue +35 -44
- package/src/views/Console.vue +90 -341
- package/src/views/Editor.vue +123 -1176
- package/src/views/FilterBuilder.vue +251 -607
- package/src/views/Login.vue +14 -76
- package/src/views/Profiles.vue +25 -44
- package/src/views/Tasks.vue +100 -187
- package/static/offline.html +50 -192
- package/tailwind.config.js +26 -104
- package/vite.config.js +16 -73
- package/vue.config.js +32 -0
- package/workbox-config.js +11 -0
- package/artwork/image.png +0 -0
- package/dev-server.js +0 -136
- package/exit +0 -209
- package/jsconfig.json +0 -16
- package/src/assets/css/_utilities.scss +0 -388
- package/src/assets/img/background.svg.backup +0 -11
- package/src/components/icons/Check.vue +0 -5
- package/src/components/icons/Close.vue +0 -21
- package/src/components/icons/CloseX.vue +0 -5
- package/src/components/icons/Key.vue +0 -21
- package/src/components/icons/Pencil.vue +0 -21
- package/src/components/icons/Profile.vue +0 -18
- package/src/components/icons/Sell.vue +0 -21
- package/src/components/icons/Spinner.vue +0 -42
- package/src/components/icons/SquareCheck.vue +0 -18
- package/src/components/icons/SquareUncheck.vue +0 -18
- package/src/components/icons/Wildcard.vue +0 -18
- package/src/components/ui/controls/atomic/LoadingButton.vue +0 -45
- package/src/composables/useClickOutside.js +0 -21
- package/src/composables/useDropdownPosition.js +0 -174
- package/src/types/index.js +0 -41
- package/src/utils/debug.js +0 -1
- package/switch-branch.sh +0 -41
- package/workbox-config.cjs +0 -63
- /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="
|
|
10
|
-
<div class="input-wrapper
|
|
11
|
-
<label class="label-override
|
|
12
|
-
|
|
13
|
-
<
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
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
|
|
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
|
|
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="
|
|
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
|
|
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
|
-
<
|
|
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
|
|
85
|
-
@click="done()"
|
|
86
|
-
|
|
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
|
|
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.
|
|
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="
|
|
4
|
-
<div class="col-span-
|
|
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
|
-
|
|
9
|
+
/>
|
|
10
10
|
<div class="mx-auto flex items-center" @click="ui.toggleSort('eventId')">
|
|
11
|
-
<
|
|
12
|
-
<h4 class="hidden
|
|
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
|
|
16
|
-
<
|
|
17
|
-
<h4 class="hidden
|
|
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
|
-
<
|
|
21
|
-
<h4 class="hidden
|
|
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
|
|
24
|
-
<TicketIcon class="mr-0
|
|
25
|
-
<h4 class="hidden
|
|
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
|
|
29
|
-
<h4 class="hidden
|
|
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="
|
|
40
|
-
class="scroller vue-recycle-scroller ready direction-vertical flex flex-col divide-y divide-
|
|
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="
|
|
40
|
+
<div class="task" :key="i[props.item._id]">
|
|
43
41
|
<Account
|
|
44
|
-
@click="i[props.item.
|
|
45
|
-
:class="props.item.index % 2 == 1 ? '
|
|
46
|
-
:
|
|
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="
|
|
52
|
-
|
|
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
|
-
.
|
|
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
|
|
73
|
+
import { computed, ref } from "vue";
|
|
92
74
|
|
|
93
75
|
const props = defineProps({
|
|
94
|
-
|
|
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
|
-
|
|
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
|
-
|
|
12
|
-
|
|
13
|
-
<
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
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
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
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.
|
|
71
|
+
tag: ui.profile.accountTags[0]
|
|
120
72
|
});
|
|
121
73
|
|
|
122
74
|
if (ui.currentlyEditing?.email) account.value = ui.currentlyEditing;
|