@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
@@ -1,225 +1,87 @@
1
1
  <template>
2
- <div>
3
- <div
4
- class="dropdown input-default p-4 w-16 bg-dark-550 small-dropdown"
5
- ref="dropdownRef"
6
- @click="toggleOpen"
7
- >
8
- <span class="flex justify-between items-center z-50 text-white">
9
- <div class="flex gap-3 justify-center">
10
- <img
11
- class="w-5"
12
- :src="`/flags/${ui.currentCountry.siteId.split('_')[1].toLowerCase()}.svg`"
13
- />
2
+ <div @click="open = !open">
3
+ <div class="dropdown input-default p-4 w-16 bg-dark-550 small-dropdown">
4
+ <span class="flex justify-between items-center z-inf text-white">
5
+ <div class="flex gap-3 justify-center">
6
+ <img class="w-5" :src="`/flags/${ui.currentCountry.siteId.split('_')[1].toLowerCase()}.svg`" />
7
+ </div>
8
+ </span>
9
+ <transition name="fade">
10
+ <div
11
+ v-if="open"
12
+ class="dropdown-content special-dropdown mt-2 snap-mandatory snap-y z-inf overflow-scroll hidden-scrollbars"
13
+ >
14
+ <div class="snap-start pt-2 text-sm font-bold text-center">TM</div>
15
+ <div
16
+ v-bind:key="country.id"
17
+ v-for="(country, i) in countries.TM"
18
+ :class="`cursor-pointer snap-start w-12 ${i === 0 ? 'pt-2' : 'my-2'}`"
19
+ @click="ui.setCurrentCountry(country, true, 'TM')"
20
+ >
21
+ <div class="flex justify-between smooth-hover">
22
+ <span class="text-sm">{{ country.siteId.split("_")[1] }} </span>
23
+ <img class="w-5" :src="`/flags/${country.siteId.split('_')[1].toLowerCase()}.svg`" />
24
+ </div>
25
+ </div>
26
+ <div class="snap-start pt-2 text-sm font-bold text-center">AXS</div>
27
+ <div
28
+ v-bind:key="country.id"
29
+ v-for="(country, i) in countries.AXS"
30
+ :class="`cursor-pointer snap-start w-12 ${i === 0 ? 'pt-2' : 'my-2'}`"
31
+ @click="ui.setCurrentCountry(country, true, 'AXS')"
32
+ >
33
+ <div class="flex gap-3 justify-between smooth-hover">
34
+ <span class="text-sm">{{ country.siteId.split("_")[1] }} </span>
35
+ <img class="w-5" :src="`/flags/${country.siteId.split('_')[1].toLowerCase()}.svg`" />
36
+ </div>
37
+ </div>
38
+ </div>
39
+ </transition>
14
40
  </div>
15
- </span>
16
- <Teleport to="body">
17
- <transition name="fade">
18
- <div
19
- v-if="open"
20
- class="dropdown-content-portal special-dropdown"
21
- :style="menuStyle"
22
- @click.stop
23
- @wheel.stop
24
- @touchmove.stop
25
- >
26
- <div class="header-item">TM</div>
27
- <div
28
- v-bind:key="country.id"
29
- v-for="country in countries.TM"
30
- class="country-item"
31
- @click="selectCountry(country, 'TM')"
32
- >
33
- <div class="flex items-center justify-center gap-2">
34
- <span class="text-xs font-medium">{{
35
- country.siteId.split("_")[1]
36
- }}</span>
37
- <img
38
- class="w-5 h-4"
39
- :src="`/flags/${country.siteId.split('_')[1].toLowerCase()}.svg`"
40
- />
41
- </div>
42
- </div>
43
- <div class="header-item">AXS</div>
44
- <div
45
- v-bind:key="country.id"
46
- v-for="country in countries.AXS"
47
- class="country-item"
48
- @click="selectCountry(country, 'AXS')"
49
- >
50
- <div class="flex items-center justify-center gap-2">
51
- <span class="text-xs font-medium">{{
52
- country.siteId.split("_")[1]
53
- }}</span>
54
- <img
55
- class="w-5 h-4"
56
- :src="`/flags/${country.siteId.split('_')[1].toLowerCase()}.svg`"
57
- />
58
- </div>
59
- </div>
60
- </div>
61
- </transition>
62
- </Teleport>
63
41
  </div>
64
- </div>
65
42
  </template>
66
43
 
67
44
  <script setup>
68
45
  import { ref } from "vue";
69
46
  import { useUIStore } from "@/stores/ui";
70
47
  import { countries } from "@/stores/countries";
71
- import { useDropdownPosition } from "@/composables/useDropdownPosition";
72
- import { useClickOutside } from "@/composables/useClickOutside";
73
-
74
48
  const ui = useUIStore();
75
49
  const open = ref(false);
76
- const dropdownRef = ref(null);
77
-
78
- // Use composables for positioning and click outside
79
- const { menuStyle, updatePosition } = useDropdownPosition(dropdownRef, {
80
- offset: { x: -26, y: 4 },
81
- minWidth: 100,
82
- maxHeight: 208,
83
- estimateHeight: () => {
84
- const tmCount = countries.TM?.length || 0;
85
- const axsCount = countries.AXS?.length || 0;
86
- const totalItems = tmCount + axsCount + 2; // +2 for headers
87
- return Math.min(totalItems * 32, 208);
88
- },
89
- });
90
-
91
- useClickOutside(dropdownRef, () => {
92
- if (open.value) {
93
- open.value = false;
94
- }
95
- });
96
-
97
- const toggleOpen = () => {
98
- open.value = !open.value;
99
- if (open.value) {
100
- updatePosition();
101
- }
102
- };
103
-
104
- const selectCountry = (country, module) => {
105
- ui.setCurrentCountry(country, true, module);
106
- open.value = false;
107
- };
108
50
  </script>
109
51
 
110
52
  <style scoped>
111
53
  .special-dropdown {
112
- @apply min-w-20;
54
+ @apply min-w-20;
113
55
  }
114
56
 
115
57
  .small-dropdown {
116
- background-clip: border-box !important;
117
- border-radius: 100% !important;
118
- padding: 0;
119
- width: 3em !important;
120
- height: 3em !important;
121
- display: flex;
122
- justify-items: center;
123
- justify-content: center;
124
- }
125
-
126
- .dropdown-content-portal {
127
- @apply bg-dark-400 border border-dark-650 rounded-lg shadow-2xl z-50;
128
- padding: 0.5rem;
129
- max-height: 208px !important;
130
- overflow-y: auto !important;
131
- overscroll-behavior: contain !important;
132
- touch-action: pan-y !important;
133
- -webkit-overflow-scrolling: touch !important;
134
- scrollbar-width: none;
135
- -ms-overflow-style: none;
136
- min-width: 100px;
137
- width: 100px;
138
- }
139
-
140
- .dropdown-content-portal::-webkit-scrollbar {
141
- display: none;
58
+ background-clip: border-box !important;
59
+ border-radius: 100% !important;
60
+ padding: 0;
61
+ width: 3em !important;
62
+ height: 3em !important;
63
+ display: flex;
64
+ justify-items: center;
65
+ justify-content: center;
142
66
  }
143
67
 
144
- .header-item {
145
- text-align: center !important;
146
- font-size: 0.75rem;
147
- font-weight: 700;
148
- color: white;
149
- padding: 8px 4px;
150
- cursor: default;
151
- pointer-events: none;
152
- margin: 4px 2px;
153
- position: relative;
154
- background: linear-gradient(
155
- 135deg,
156
- rgba(255, 255, 255, 0.08) 0%,
157
- rgba(255, 255, 255, 0.04) 100%
158
- );
159
- border: 1px solid rgba(255, 255, 255, 0.1);
160
- border-radius: 6px;
161
- letter-spacing: 0.5px;
162
- text-shadow: 0 1px 2px rgba(0, 0, 0, 0.3);
163
- box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
164
- display: flex;
165
- align-items: center;
166
- justify-content: center;
68
+ .dropdown-content {
69
+ left: -1.25rem;
70
+ background-clip: border-box !important;
71
+ @apply border border-light-300;
72
+ border-width: 2px;
73
+ --tw-border-opacity: 1;
74
+ border-color: rgb(41 42 67 / var(--tw-border-opacity));
75
+ max-height: 13rem;
167
76
  }
168
77
 
169
- .header-item:first-child {
170
- margin-top: 2px;
171
- }
172
-
173
- .header-item::before {
174
- content: "";
175
- position: absolute;
176
- top: 0;
177
- left: 0;
178
- right: 0;
179
- height: 1px;
180
- background: linear-gradient(
181
- 90deg,
182
- transparent 0%,
183
- rgba(255, 255, 255, 0.2) 50%,
184
- transparent 100%
185
- );
186
- border-radius: 6px 6px 0 0;
187
- }
188
-
189
- .country-item {
190
- padding: 8px 4px;
191
- font-size: 0.875rem;
192
- color: white;
193
- cursor: pointer;
194
- border-radius: 6px;
195
- margin: 1px 2px;
196
- transition: all 0.15s ease;
197
- display: flex;
198
- align-items: center;
199
- justify-content: center;
200
- min-height: 32px;
201
- }
202
-
203
- .country-item .flex {
204
- display: flex;
205
- align-items: center;
206
- justify-content: center;
207
- gap: 6px;
208
- width: 100%;
209
- flex-wrap: nowrap;
210
- }
211
-
212
- .country-item .flex span {
213
- font-size: 0.75rem;
214
- font-weight: 500;
215
- white-space: nowrap;
216
- flex-shrink: 0;
217
- text-align: center;
218
- }
78
+ @media (max-width: 1024px) {
79
+ .small-dropdown {
80
+ @apply bg-dark-550 !important;
81
+ }
219
82
 
220
- .country-item .flex img {
221
- width: 18px;
222
- height: 14px;
223
- flex-shrink: 0;
83
+ .dropdown-content {
84
+ @apply bg-dark-550 !important;
85
+ }
224
86
  }
225
87
  </style>
@@ -1,138 +1,29 @@
1
1
  <template>
2
2
  <button
3
- class="modern-checkbox"
3
+ class="check-component"
4
4
  @click="
5
5
  checked = !checked;
6
6
  $emit('valueUpdate', checked);
7
7
  "
8
- :class="{ checked: toggled, 'header-checkbox': isHeader }"
8
+ :class="{ 'border-light-300': !toggled }"
9
9
  >
10
- <div class="checkbox-inner">
11
- <!-- Header checkbox design -->
12
- <div v-if="isHeader" class="header-indicator" :class="{ visible: toggled }"></div>
13
-
14
- <!-- Row checkbox design -->
15
- <svg
16
- v-else
17
- class="checkmark"
18
- :class="{ visible: toggled }"
19
- viewBox="0 0 24 24"
20
- fill="none"
21
- xmlns="http://www.w3.org/2000/svg"
22
- >
23
- <path
24
- d="M20 6L9 17L4 12"
25
- stroke="currentColor"
26
- stroke-width="3"
27
- stroke-linecap="round"
28
- stroke-linejoin="round"
29
- />
30
- </svg>
10
+ <!-- {{ toggled }} -->
11
+ <div class="flex items-center justify-center w-4 h-4">
12
+ <transition name="fade">
13
+ <span v-if="toggled" class="will-change-auto"> <CheckmarkIcon /> </span>
14
+ </transition>
31
15
  </div>
32
16
  </button>
33
17
  </template>
34
18
  <style lang="scss" scoped>
35
- .modern-checkbox {
36
- @apply relative flex items-center justify-center cursor-pointer flex-shrink-0;
37
- width: 18px;
38
- height: 18px;
39
- border-radius: 50%;
40
- border: 2px solid #44454b;
41
- background: transparent;
42
- transition: all 0.2s ease;
43
-
44
- &:hover {
45
- border-color: #52535a;
46
- transform: scale(1.05);
47
- }
48
-
49
- &.checked {
50
- background: #88c999;
51
- border-color: #88c999;
52
-
53
- &:hover {
54
- background: #9dd3a8;
55
- border-color: #9dd3a8;
56
- }
57
- }
58
-
59
- &.header-checkbox {
60
- width: 16px;
61
- height: 16px;
62
- border-color: #52535a;
63
-
64
- &:hover {
65
- border-color: #88c999;
66
- background: rgba(136, 201, 153, 0.1);
67
- }
68
-
69
- &.checked {
70
- background: #88c999;
71
- border-color: #88c999;
72
-
73
- &:hover {
74
- background: #9dd3a8;
75
- border-color: #9dd3a8;
76
- }
77
- }
78
- }
79
-
80
- &:focus-visible {
81
- outline: 2px solid #88c999;
82
- outline-offset: 2px;
83
- }
84
- }
85
-
86
- .checkbox-inner {
87
- @apply relative w-full h-full flex items-center justify-center;
88
- }
89
-
90
- .checkmark {
91
- width: 8px;
92
- height: 8px;
93
- color: #ffffff;
94
- opacity: 0;
95
- transform: scale(0.5);
96
- transition: all 0.2s ease;
97
-
98
- &.visible {
99
- opacity: 1;
100
- transform: scale(1);
101
- }
102
- }
103
-
104
- .header-indicator {
105
- width: 6px;
106
- height: 6px;
107
- background: #ffffff;
108
- border-radius: 50%;
109
- opacity: 0;
110
- transform: scale(0.3);
111
- transition: all 0.2s ease;
112
-
113
- &.visible {
114
- opacity: 1;
115
- transform: scale(1);
116
- }
117
- }
118
-
119
- @media (hover: hover) {
120
- .modern-checkbox:hover {
121
- transform: scale(1.05);
122
- }
123
-
124
- .modern-checkbox.checked:hover .checkmark {
125
- transform: scale(1.1);
126
- }
19
+ .check-component {
20
+ @apply border-dashed duration-200 rounded border flex items-center justify-center w-4 h-4;
127
21
  }
128
22
  </style>
129
23
  <script setup>
130
24
  import { CheckmarkIcon } from "@/components/icons";
131
25
  import { ref } from "vue";
132
- const props = defineProps({
133
- toggled: { type: Boolean, required: false, default: false },
134
- isHeader: { type: Boolean, required: false, default: false }
135
- });
26
+ const props = defineProps({ toggled: { type: Boolean, required: false, default: false } });
136
27
 
137
28
  const checked = ref(props.toggled);
138
29
  </script>