@necrolab/dashboard 0.4.38 → 0.4.39

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 (60) hide show
  1. package/.claude/settings.local.json +3 -1
  2. package/backend/api.js +20 -16
  3. package/backend/auth.js +2 -2
  4. package/backend/batching.js +1 -1
  5. package/backend/endpoints.js +5 -5
  6. package/backend/index.js +2 -2
  7. package/backend/mock-data.js +19 -20
  8. package/backend/mock-src/classes/logger.js +5 -7
  9. package/backend/mock-src/classes/utils.js +3 -2
  10. package/backend/mock-src/ticketmaster.js +2 -2
  11. package/backend/validator.js +2 -2
  12. package/dev-server.js +49 -0
  13. package/index.html +1 -1
  14. package/index.js +1 -1
  15. package/package.json +6 -5
  16. package/postcss.config.js +1 -1
  17. package/postinstall.js +5 -3
  18. package/public/android-chrome-192x192.png +0 -0
  19. package/public/android-chrome-512x512.png +0 -0
  20. package/public/apple-touch-icon.png +0 -0
  21. package/public/favicon-16x16.png +0 -0
  22. package/public/favicon-32x32.png +0 -0
  23. package/public/favicon.ico +0 -0
  24. package/public/manifest.json +4 -4
  25. package/src/App.vue +471 -49
  26. package/src/assets/css/_input.scss +25 -25
  27. package/src/assets/css/main.scss +116 -22
  28. package/src/assets/img/android-chrome-192x192.png +0 -0
  29. package/src/assets/img/logo_icon-old.png +0 -0
  30. package/src/assets/img/logo_icon.png +0 -0
  31. package/src/components/Editors/Account/Account.vue +19 -19
  32. package/src/components/Editors/Account/AccountCreator.vue +3 -3
  33. package/src/components/Editors/Account/AccountView.vue +17 -6
  34. package/src/components/Editors/Profile/Profile.vue +24 -24
  35. package/src/components/Editors/Profile/ProfileView.vue +22 -9
  36. package/src/components/Editors/TagLabel.vue +6 -7
  37. package/src/components/Table/Table.vue +15 -0
  38. package/src/components/Tasks/Controls/DesktopControls.vue +1 -1
  39. package/src/components/Tasks/CreateTaskAXS.vue +15 -15
  40. package/src/components/Tasks/CreateTaskTM.vue +5 -4
  41. package/src/components/Tasks/Task.vue +23 -35
  42. package/src/components/Tasks/TaskView.vue +19 -18
  43. package/src/components/Tasks/Utilities.vue +1 -1
  44. package/src/components/icons/Mail.vue +2 -2
  45. package/src/components/ui/Modal.vue +84 -15
  46. package/src/components/ui/Navbar.vue +118 -39
  47. package/src/components/ui/controls/atomic/Dropdown.vue +23 -3
  48. package/src/components/ui/controls/atomic/MultiDropdown.vue +43 -23
  49. package/src/stores/sampleData.js +5 -4
  50. package/src/stores/ui.js +3 -3
  51. package/src/views/Accounts.vue +2 -2
  52. package/src/views/Console.vue +78 -30
  53. package/src/views/Editor.vue +175 -24
  54. package/src/views/FilterBuilder.vue +21 -7
  55. package/src/views/Profiles.vue +8 -8
  56. package/src/views/Tasks.vue +51 -2
  57. package/tailwind.config.js +1 -1
  58. package/vite.config.js +8 -1
  59. package/vue.config.js +1 -1
  60. package/{workbox-config.js → workbox-config.cjs} +1 -4
@@ -1,21 +1,21 @@
1
1
  .input-default {
2
2
  @apply h-12 bg-dark-500 flex items-center bg-clip-padding rounded-lg relative box-border border-dark-550 border-2;
3
-
3
+
4
4
  input {
5
5
  @apply h-full w-full px-4 focus:outline-none text-xs text-white;
6
6
  background-color: transparent;
7
7
  }
8
-
8
+
9
9
  /* When input has incrementer, add right padding */
10
10
  &:has(.input-incrementer) input {
11
11
  @apply pr-10;
12
12
  }
13
-
13
+
14
14
  /* Required field indicator */
15
15
  &.required {
16
16
  /* Professional style with colored border */
17
17
  border-left: 3px solid rgba(239, 68, 68, 0.7);
18
-
18
+
19
19
  /* Red bullet indicator directly in the field */
20
20
  &::after {
21
21
  content: "";
@@ -28,7 +28,7 @@
28
28
  border-radius: 50%;
29
29
  background-color: #ef4444;
30
30
  }
31
-
31
+
32
32
  &:has(.input-incrementer)::after {
33
33
  right: 16px;
34
34
  }
@@ -36,7 +36,7 @@
36
36
  }
37
37
  .input-wrapper {
38
38
  @apply z-20;
39
-
39
+
40
40
  label {
41
41
  @apply text-xs text-light-300 block;
42
42
  }
@@ -51,7 +51,7 @@ input[type="number"] {
51
51
  -webkit-appearance: textfield;
52
52
  -moz-appearance: textfield;
53
53
  appearance: textfield;
54
-
54
+
55
55
  &::-webkit-inner-spin-button,
56
56
  &::-webkit-outer-spin-button {
57
57
  -webkit-appearance: none;
@@ -61,24 +61,24 @@ input[type="number"] {
61
61
  .input-incrementer {
62
62
  @apply flex flex-col absolute right-2 top-1/2 transform -translate-y-1/2 #{!important};
63
63
  gap: 2px;
64
-
64
+
65
65
  button {
66
66
  @apply w-6 h-4 flex items-center justify-center transition-all duration-150 rounded-sm;
67
67
  background: rgba(46, 47, 52, 0.8);
68
68
  border: 1px solid rgba(61, 62, 68, 0.6);
69
69
  color: rgba(255, 255, 255, 0.9);
70
70
  font-size: 8px;
71
-
71
+
72
72
  &:hover {
73
73
  background: rgba(68, 69, 75, 0.9);
74
- border-color: rgba(93, 124, 192, 0.4);
74
+ border-color: rgba(255, 255, 255, 0.4);
75
75
  color: white;
76
76
  }
77
-
77
+
78
78
  &:active {
79
79
  background: rgba(35, 36, 41, 0.9);
80
80
  }
81
-
81
+
82
82
  svg {
83
83
  @apply w-2.5 h-2.5;
84
84
  }
@@ -89,33 +89,33 @@ input[type="number"] {
89
89
  @media (max-width: 810px) {
90
90
  .input-default {
91
91
  height: 40px;
92
-
92
+
93
93
  input {
94
94
  font-size: 12px;
95
95
  }
96
-
96
+
97
97
  .input-incrementer button {
98
98
  @apply w-5 h-3;
99
-
99
+
100
100
  svg {
101
101
  @apply w-2 h-2;
102
102
  }
103
103
  }
104
104
  }
105
-
105
+
106
106
  .input-wrapper label {
107
107
  font-size: 15px;
108
108
  }
109
-
109
+
110
110
  .ant-select {
111
111
  height: fit-content;
112
112
  min-height: 40px;
113
113
  padding: 0;
114
-
114
+
115
115
  &-show-search:not(.ant-select-customize-input) .ant-select-selector {
116
116
  font-size: 12px;
117
117
  }
118
-
118
+
119
119
  &-multiple .ant-select-selection-item {
120
120
  height: 25px;
121
121
  }
@@ -132,7 +132,7 @@ input[type="number"] {
132
132
  @apply bg-dark-500 flex items-center bg-clip-padding rounded-lg relative box-border px-1 py-1 border-dark-550 border-2 #{!important};
133
133
  min-height: 3.45em;
134
134
  height: fit-content;
135
-
135
+
136
136
  .ant-select-selector {
137
137
  @apply h-full w-full focus:outline-none text-xs text-white #{!important};
138
138
  background: transparent;
@@ -150,7 +150,7 @@ input[type="number"] {
150
150
  border-radius: 10px;
151
151
  height: 40px;
152
152
  border: 0;
153
-
153
+
154
154
  &-remove > .anticon {
155
155
  vertical-align: 0.05rem;
156
156
  }
@@ -167,20 +167,20 @@ input[type="number"] {
167
167
  .ant-select-item-option {
168
168
  &-selected:not(.ant-select-item-option-disabled) {
169
169
  @apply bg-dark-500 text-white #{!important};
170
-
170
+
171
171
  .ant-select-item-option-state {
172
172
  @apply text-white #{!important};
173
-
173
+
174
174
  svg {
175
175
  margin-top: -1.5px;
176
176
  }
177
177
  }
178
178
  }
179
-
179
+
180
180
  &-active:not(.ant-select-item-option-disabled) {
181
181
  background-color: transparent;
182
182
  }
183
-
183
+
184
184
  &-content {
185
185
  @apply text-white #{!important};
186
186
  }
@@ -1,16 +1,21 @@
1
1
  @use "input";
2
2
 
3
3
  /* Global input styling fixes for iOS and other platforms */
4
- input, textarea, select, button {
4
+ input,
5
+ textarea,
6
+ select,
7
+ button {
5
8
  /* Remove iOS blue highlight/border */
6
9
  -webkit-tap-highlight-color: transparent;
7
10
  -webkit-touch-callout: none;
8
-
11
+
9
12
  /* Remove default focus outline */
10
13
  outline: none;
11
14
  }
12
15
 
13
- input, textarea, select {
16
+ input,
17
+ textarea,
18
+ select {
14
19
  /* Remove browser default styling */
15
20
  -webkit-appearance: none;
16
21
  -moz-appearance: none;
@@ -18,15 +23,20 @@ input, textarea, select {
18
23
  }
19
24
 
20
25
  /* Enhanced focus state removal for iOS */
21
- input:focus, textarea:focus, select:focus {
26
+ input:focus,
27
+ textarea:focus,
28
+ select:focus {
22
29
  outline: none !important;
23
30
  -webkit-tap-highlight-color: transparent !important;
24
31
  box-shadow: none !important;
25
32
  }
26
33
 
27
- // Base styles
34
+ // Base styles - Ultra bulletproof scroll prevention
28
35
  html {
29
- overscroll-behavior: contain;
36
+ overflow: hidden !important;
37
+ overscroll-behavior: none !important;
38
+ height: 100% !important;
39
+ width: 100% !important;
30
40
  }
31
41
 
32
42
  * {
@@ -35,6 +45,49 @@ html {
35
45
  -moz-user-select: none;
36
46
  -ms-user-select: none;
37
47
  user-select: none;
48
+ overscroll-behavior: none !important;
49
+ }
50
+
51
+ // Override for textareas to allow scrolling and selection
52
+ textarea,
53
+ .code-editor,
54
+ .proxy-editor {
55
+ -webkit-user-select: text !important;
56
+ -moz-user-select: text !important;
57
+ -ms-user-select: text !important;
58
+ user-select: text !important;
59
+ overscroll-behavior: auto !important;
60
+ touch-action: pan-y !important;
61
+ }
62
+
63
+ // Override for dropdown menus to allow scrolling - must be very specific to override global rules
64
+ .dropdown-menu,
65
+ .dropdown-menu *,
66
+ .option-list,
67
+ .option-list *,
68
+ .dropdown-menu.scrollable,
69
+ .dropdown-menu.scrollable * {
70
+ overscroll-behavior: auto !important;
71
+ touch-action: pan-y !important;
72
+ -webkit-overflow-scrolling: touch !important;
73
+ overflow-y: auto !important;
74
+ }
75
+
76
+ // Additional specific overrides for dropdown buttons and text
77
+ .dropdown-item,
78
+ .dropdown-item *,
79
+ .dropdown-item-text {
80
+ overscroll-behavior: auto !important;
81
+ touch-action: pan-y !important;
82
+ }
83
+
84
+ // Override for console scrolling
85
+ .console,
86
+ .console *,
87
+ .console.scrollable {
88
+ overscroll-behavior: auto !important;
89
+ touch-action: pan-y !important;
90
+ -webkit-overflow-scrolling: touch !important;
38
91
  }
39
92
 
40
93
  body {
@@ -43,11 +96,13 @@ body {
43
96
  background-size: cover;
44
97
  background-attachment: fixed;
45
98
  min-height: 100vh;
46
- padding-top: 10px;
47
- overscroll-behavior-y: contain;
99
+ overflow: hidden !important;
100
+ overscroll-behavior: none !important;
101
+ width: 100% !important;
102
+ height: 100% !important;
48
103
  -webkit-font-smoothing: antialiased;
49
104
  -moz-osx-font-smoothing: grayscale;
50
- touch-action: pan-x pan-y;
105
+ touch-action: none !important;
51
106
  color: #e2e2e5;
52
107
  @apply bg-dark-300;
53
108
  }
@@ -89,7 +144,7 @@ img {
89
144
  .btn-primary {
90
145
  @apply bg-accent-blue hover:bg-opacity-80 text-white font-medium px-4 py-2 rounded transition-all duration-150;
91
146
  border: 1px solid #5d7cc0;
92
-
147
+
93
148
  &:hover {
94
149
  border-color: #4a6ba0;
95
150
  }
@@ -108,7 +163,7 @@ img {
108
163
  .btn-icon {
109
164
  @apply p-1 rounded transition-all duration-150 flex-center hover:bg-dark-500 border border-transparent;
110
165
  color: #d0d0d3;
111
-
166
+
112
167
  &:hover {
113
168
  color: #ffffff;
114
169
  border-color: #3d3e44;
@@ -128,7 +183,7 @@ img {
128
183
  .label-override {
129
184
  @apply flex items-center text-xs mb-2;
130
185
  color: #a0a0a6;
131
-
186
+
132
187
  svg {
133
188
  @apply ml-2;
134
189
  color: #a0a0a6 !important;
@@ -175,17 +230,32 @@ img {
175
230
  }
176
231
 
177
232
  .status-indicator {
178
- @apply w-2 h-2 rounded-full;
233
+ @apply w-2 h-2 rounded-full flex-shrink-0;
234
+ min-width: 4px;
235
+ min-height: 4px;
236
+
237
+ @media (max-width: 768px) {
238
+ width: 6px;
239
+ height: 6px;
240
+ min-width: 6px;
241
+ min-height: 6px;
242
+ }
243
+
244
+ @media (max-width: 480px) {
245
+ width: 5px;
246
+ height: 5px;
247
+ min-width: 5px;
248
+ min-height: 5px;
249
+ }
179
250
  }
180
251
 
181
-
182
252
  .mobile-icons {
183
253
  @apply flex lg:hidden ml-auto items-center gap-x-2;
184
-
254
+
185
255
  button {
186
256
  @apply w-8 h-8 flex-center bg-dark-500 rounded transition-all duration-150 border border-dark-650 hover:bg-dark-550;
187
257
  color: #d0d0d3;
188
-
258
+
189
259
  &:hover {
190
260
  color: #ffffff;
191
261
  }
@@ -214,7 +284,7 @@ img {
214
284
  .hidden-scrollbars {
215
285
  scrollbar-width: none;
216
286
  -ms-overflow-style: none;
217
-
287
+
218
288
  &::-webkit-scrollbar {
219
289
  display: none;
220
290
  }
@@ -266,6 +336,15 @@ img {
266
336
  --toastify-toast-width: 520px;
267
337
  }
268
338
 
339
+ // iOS layout stabilization
340
+ @supports (-webkit-appearance: none) {
341
+ .component-container,
342
+ .card-dark,
343
+ h1, h2, h3, h4, h5, h6 {
344
+ transform: translate3d(0, 0, 0);
345
+ }
346
+ }
347
+
269
348
  // Toast notifications
270
349
  .Toastify__toast-theme--colored.Toastify__toast--default,
271
350
  .Toastify__toast-theme--light {
@@ -294,13 +373,14 @@ img {
294
373
  .Toastify__toast {
295
374
  min-height: 50px !important;
296
375
  height: 50px !important;
297
-
376
+ pointer-events: none !important;
377
+
298
378
  &-body > div:last-child {
299
379
  font-family: "Inter", sans-serif;
300
380
  @apply font-medium;
301
381
  }
302
-
303
- &--error {
382
+
383
+ &--error {
304
384
  .Toastify__progress-bar {
305
385
  @apply bg-red-400;
306
386
  }
@@ -328,13 +408,27 @@ img {
328
408
  .text-heading {
329
409
  @apply text-sm;
330
410
  }
331
-
411
+
332
412
  .btn-primary,
333
413
  .btn-secondary {
334
414
  @apply text-sm px-3 py-1.5;
335
415
  }
336
-
416
+
417
+ .btn-action {
418
+ @apply text-sm px-6 h-12;
419
+ min-height: 48px; // Apple's recommended minimum touch target size
420
+ }
421
+
337
422
  .form-grid {
338
423
  @apply grid-cols-1;
339
424
  }
340
425
  }
426
+
427
+ // iPhone landscape mode - larger buttons for easier touch
428
+ @media only screen and (max-device-width: 430px) and (orientation: landscape) {
429
+ .btn-action {
430
+ @apply text-base px-8 h-14;
431
+ min-height: 56px; // Extra large for landscape touch
432
+ font-weight: 600;
433
+ }
434
+ }
Binary file
Binary file
@@ -7,20 +7,20 @@
7
7
  <div class="col-span-3 lg:col-span-2 flex">
8
8
  <Checkbox
9
9
  class="ml-0 mr-4"
10
- :toggled="props.task.selected"
11
- @valueUpdate="ui.toggleAccountSelected(props.task._id)"
10
+ :toggled="props.account.selected"
11
+ @valueUpdate="ui.toggleAccountSelected(props.account._id)"
12
12
  />
13
- <h4 class="mx-auto text-white" @click="copy(props.task.email)">
14
- {{ props.task.email }}
13
+ <h4 class="mx-auto text-white" @click="copy(props.account.email)">
14
+ {{ props.account.email }}
15
15
  </h4>
16
16
  </div>
17
- <div class="col-span-2 hidden ipadlg:block" @click="copy(props.task.password)">
17
+ <div class="col-span-2 hidden ipadlg:block" @click="copy(props.account.password)">
18
18
  <h4 class="text-white">
19
- {{ props.task.privacy ? "•".repeat(props.task.password.length) : props.task.password }}
19
+ {{ props.account.privacy ? "•".repeat(props.account.password.length) : props.account.password }}
20
20
  </h4>
21
21
  </div>
22
22
  <div class="col-span-1">
23
- <h4 v-if="props.task.enabled" class="text-green-400 flex justify-center">
23
+ <h4 v-if="props.account.enabled" class="text-green-400 flex justify-center">
24
24
  <img class="w-3 h-3 green" src="/img/controls/enable.svg" />
25
25
  </h4>
26
26
  <h4 v-else class="text-red-400 flex justify-center">
@@ -30,18 +30,18 @@
30
30
 
31
31
  <div class="col-span-1 hidden lg:block">
32
32
  <h4 class="text-white flex justify-center gap-1">
33
- <TagLabel v-for="tag in props.task.tags" :key="tag" :text="tag" />
33
+ <TagLabel v-for="tag in props.account.tags" :key="tag" :text="tag" />
34
34
  </h4>
35
35
  </div>
36
36
 
37
37
  <div class="col-span-1 flex">
38
- <ul class="task-buttons">
38
+ <ul class="account-buttons">
39
39
  <li>
40
40
  <button @click="edit">
41
41
  <EditIcon />
42
42
  </button>
43
43
  </li>
44
- <li v-if="props.task.enabled">
44
+ <li v-if="props.account.enabled">
45
45
  <button @click="disable">
46
46
  <img class="w-4 h-4" src="/img/controls/disable.svg" />
47
47
  </button>
@@ -59,7 +59,7 @@
59
59
  h4 {
60
60
  @apply text-center;
61
61
  }
62
- .task-buttons {
62
+ .account-buttons {
63
63
  @apply flex items-center justify-center mx-auto bg-dark-500 border border-dark-650 rounded;
64
64
  padding: 3px;
65
65
  gap: 2px;
@@ -102,7 +102,7 @@ h4 {
102
102
  font-size: 10px !important;
103
103
  }
104
104
 
105
- .task-buttons {
105
+ .account-buttons {
106
106
  padding: 3px;
107
107
  gap: 2px;
108
108
 
@@ -118,7 +118,7 @@ h4 {
118
118
  }
119
119
  }
120
120
 
121
- .task-id {
121
+ .account-id {
122
122
  font-size: 6px !important;
123
123
  margin-right: -12px;
124
124
  margin-top: 20px;
@@ -127,7 +127,7 @@ h4 {
127
127
 
128
128
  // Mobile optimization
129
129
  @media (max-width: 768px) {
130
- .task-buttons {
130
+ .account-buttons {
131
131
  padding: 2px;
132
132
  gap: 1px;
133
133
 
@@ -146,7 +146,7 @@ h4 {
146
146
 
147
147
  // iPhone vertical (portrait) specific
148
148
  @media (max-width: 480px) and (orientation: portrait) {
149
- .task-buttons {
149
+ .account-buttons {
150
150
  padding: 2px;
151
151
  gap: 1px;
152
152
 
@@ -177,7 +177,7 @@ import TagLabel from "@/components/Editors/TagLabel.vue";
177
177
  const ui = useUIStore();
178
178
 
179
179
  const props = defineProps({
180
- task: { type: Object }
180
+ account: { type: Object }
181
181
  });
182
182
 
183
183
  const copy = (txt) => {
@@ -185,10 +185,10 @@ const copy = (txt) => {
185
185
  navigator.clipboard.writeText(txt);
186
186
  ui.showSuccess("Copied text");
187
187
  };
188
- const enable = async () => await ui.addAccount({ ...props.task, enabled: true });
189
- const disable = async () => await ui.addAccount({ ...props.task, enabled: false });
188
+ const enable = async () => await ui.addAccount({ ...props.account, enabled: true });
189
+ const disable = async () => await ui.addAccount({ ...props.account, enabled: false });
190
190
  const edit = () => {
191
- ui.currentlyEditing = props.task;
191
+ ui.currentlyEditing = props.account;
192
192
  ui.toggleModal("create-account");
193
193
  };
194
194
  </script>
@@ -48,7 +48,7 @@
48
48
  v-model="creatorConfig.emails"
49
49
  class="proxy-editor"
50
50
  spellcheck="false"
51
- style="max-height: 250px; min-height: 150px;"
51
+ style="max-height: 250px; min-height: 150px"
52
52
  ></textarea>
53
53
  </div>
54
54
  </div>
@@ -83,7 +83,7 @@
83
83
  width: 100%;
84
84
  background-color: #2e2f34;
85
85
  color: #e2e2e5;
86
- font-family: 'JetBrains Mono', 'Fira Code', 'Menlo', 'Monaco', 'Courier New', monospace;
86
+ font-family: "JetBrains Mono", "Fira Code", "Menlo", "Monaco", "Courier New", monospace;
87
87
  padding: 12px;
88
88
  border: none;
89
89
  resize: none;
@@ -98,7 +98,7 @@
98
98
 
99
99
  .proxy-editor:focus {
100
100
  border-color: #5d7cc0;
101
- box-shadow: 0 0 0 2px rgba(93, 124, 192, 0.25);
101
+ box-shadow: 0 0 0 2px rgba(255, 255, 255, 0.4);
102
102
  }
103
103
 
104
104
  .z-inf {
@@ -48,8 +48,10 @@
48
48
  </template>
49
49
  </RecycleScroller>
50
50
  </div>
51
- <div v-else class="flex justify-center py-8 bg-dark-400 empty-state">
52
- No accounts found
51
+ <div v-else class="flex flex-col items-center justify-center py-8 bg-dark-400 empty-state text-center">
52
+ <MailIcon class="w-12 h-12 text-dark-400 mb-3 opacity-50" />
53
+ <p class="text-light-400 text-sm">No accounts found</p>
54
+ <p class="text-light-500 text-xs mt-1">Create accounts to get started</p>
53
55
  </div>
54
56
  </Table>
55
57
  </template>
@@ -73,22 +75,31 @@ h4 {
73
75
  </style>
74
76
  <script setup>
75
77
  import { Table, Header } from "@/components/Table";
76
- import { EventIcon, TicketIcon, StatusIcon, ClickIcon, DownIcon, MailIcon, KeyIcon, CheckmarkIcon } from "@/components/icons";
78
+ import {
79
+ EventIcon,
80
+ TicketIcon,
81
+ StatusIcon,
82
+ ClickIcon,
83
+ DownIcon,
84
+ MailIcon,
85
+ KeyIcon,
86
+ CheckmarkIcon
87
+ } from "@/components/icons";
77
88
  import Account from "./Account.vue";
78
89
  import Checkbox from "@/components/ui/controls/atomic/Checkbox.vue";
79
90
  import { useUIStore } from "@/stores/ui";
80
91
  import { computed, ref } from "vue";
81
92
 
82
93
  const props = defineProps({
83
- tasks: { type: Object }
94
+ accounts: { type: Object }
84
95
  });
85
96
  const i = ref({});
86
- props.tasks.forEach((t) => (i.value[t._id] = 0));
97
+ props.accounts.forEach((t) => (i.value[t._id] = 0));
87
98
 
88
99
  const ui = useUIStore();
89
100
 
90
101
  const toRender = computed(() => {
91
102
  let c = 0;
92
- return props.tasks.map((t) => ({ ...t, index: c++ }));
103
+ return props.accounts.map((t) => ({ ...t, index: c++ }));
93
104
  });
94
105
  </script>