@necrolab/dashboard 0.4.221 → 0.5.1

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 (140) hide show
  1. package/.prettierrc +27 -1
  2. package/.vscode/extensions.json +1 -1
  3. package/README.md +64 -2
  4. package/artwork/image.png +0 -0
  5. package/backend/api.js +26 -24
  6. package/backend/auth.js +2 -2
  7. package/backend/batching.js +1 -1
  8. package/backend/endpoints.js +8 -11
  9. package/backend/index.js +2 -2
  10. package/backend/mock-data.js +27 -36
  11. package/backend/mock-src/classes/logger.js +5 -7
  12. package/backend/mock-src/classes/utils.js +3 -2
  13. package/backend/mock-src/ticketmaster.js +4 -4
  14. package/backend/validator.js +2 -2
  15. package/config/configs.json +0 -1
  16. package/dev-server.js +134 -0
  17. package/exit +209 -0
  18. package/index.html +78 -8
  19. package/index.js +1 -1
  20. package/jsconfig.json +16 -0
  21. package/package.json +39 -25
  22. package/postcss.config.js +1 -1
  23. package/postinstall.js +124 -20
  24. package/public/android-chrome-192x192.png +0 -0
  25. package/public/android-chrome-512x512.png +0 -0
  26. package/public/apple-touch-icon.png +0 -0
  27. package/public/favicon-16x16.png +0 -0
  28. package/public/favicon-32x32.png +0 -0
  29. package/public/favicon.ico +0 -0
  30. package/public/img/logo_trans.png +0 -0
  31. package/public/img/necro_logo.png +0 -0
  32. package/public/manifest.json +16 -10
  33. package/run +176 -9
  34. package/src/App.vue +498 -85
  35. package/src/assets/css/base/reset.scss +43 -0
  36. package/src/assets/css/base/scroll.scss +114 -0
  37. package/src/assets/css/base/typography.scss +37 -0
  38. package/src/assets/css/components/buttons.scss +216 -0
  39. package/src/assets/css/components/forms.scss +221 -0
  40. package/src/assets/css/components/modals.scss +13 -0
  41. package/src/assets/css/components/tables.scss +27 -0
  42. package/src/assets/css/components/toasts.scss +100 -0
  43. package/src/assets/css/main.scss +201 -122
  44. package/src/assets/img/background.svg +2 -2
  45. package/src/assets/img/background.svg.backup +11 -0
  46. package/src/assets/img/logo_trans.png +0 -0
  47. package/src/components/Auth/LoginForm.vue +62 -11
  48. package/src/components/Editors/Account/Account.vue +116 -40
  49. package/src/components/Editors/Account/AccountCreator.vue +88 -39
  50. package/src/components/Editors/Account/AccountView.vue +102 -34
  51. package/src/components/Editors/Account/CreateAccount.vue +80 -32
  52. package/src/components/Editors/Profile/CreateProfile.vue +269 -83
  53. package/src/components/Editors/Profile/Profile.vue +132 -47
  54. package/src/components/Editors/Profile/ProfileCountryChooser.vue +82 -20
  55. package/src/components/Editors/Profile/ProfileView.vue +89 -32
  56. package/src/components/Editors/TagLabel.vue +67 -6
  57. package/src/components/Editors/TagToggle.vue +7 -2
  58. package/src/components/Filter/Filter.vue +288 -71
  59. package/src/components/Filter/FilterPreview.vue +202 -31
  60. package/src/components/Filter/PriceSortToggle.vue +76 -6
  61. package/src/components/Table/Header.vue +1 -1
  62. package/src/components/Table/Row.vue +1 -1
  63. package/src/components/Table/Table.vue +19 -2
  64. package/src/components/Tasks/CheckStock.vue +6 -8
  65. package/src/components/Tasks/Controls/DesktopControls.vue +27 -17
  66. package/src/components/Tasks/Controls/MobileControls.vue +8 -45
  67. package/src/components/Tasks/CreateTaskAXS.vue +80 -72
  68. package/src/components/Tasks/CreateTaskTM.vue +95 -141
  69. package/src/components/Tasks/MassEdit.vue +4 -6
  70. package/src/components/Tasks/QuickSettings.vue +199 -30
  71. package/src/components/Tasks/ScrapeVenue.vue +5 -6
  72. package/src/components/Tasks/Stats.vue +50 -24
  73. package/src/components/Tasks/Task.vue +384 -179
  74. package/src/components/Tasks/TaskLabel.vue +2 -2
  75. package/src/components/Tasks/TaskView.vue +136 -48
  76. package/src/components/Tasks/Utilities.vue +25 -10
  77. package/src/components/Tasks/ViewTask.vue +321 -0
  78. package/src/components/icons/Bag.vue +1 -1
  79. package/src/components/icons/Check.vue +5 -0
  80. package/src/components/icons/Close.vue +21 -0
  81. package/src/components/icons/CloseX.vue +5 -0
  82. package/src/components/icons/Eye.vue +6 -0
  83. package/src/components/icons/Key.vue +21 -0
  84. package/src/components/icons/Loyalty.vue +1 -1
  85. package/src/components/icons/Mail.vue +2 -2
  86. package/src/components/icons/Pencil.vue +21 -0
  87. package/src/components/icons/Play.vue +2 -2
  88. package/src/components/icons/Profile.vue +18 -0
  89. package/src/components/icons/Reload.vue +4 -5
  90. package/src/components/icons/Sandclock.vue +2 -2
  91. package/src/components/icons/Sell.vue +21 -0
  92. package/src/components/icons/Spinner.vue +42 -0
  93. package/src/components/icons/SquareCheck.vue +18 -0
  94. package/src/components/icons/SquareUncheck.vue +18 -0
  95. package/src/components/icons/Stadium.vue +1 -1
  96. package/src/components/icons/Wildcard.vue +18 -0
  97. package/src/components/icons/index.js +26 -1
  98. package/src/components/ui/Modal.vue +107 -13
  99. package/src/components/ui/Navbar.vue +175 -40
  100. package/src/components/ui/ReconnectIndicator.vue +351 -55
  101. package/src/components/ui/Splash.vue +5 -35
  102. package/src/components/ui/controls/CountryChooser.vue +200 -62
  103. package/src/components/ui/controls/atomic/Checkbox.vue +119 -10
  104. package/src/components/ui/controls/atomic/Dropdown.vue +216 -39
  105. package/src/components/ui/controls/atomic/LoadingButton.vue +45 -0
  106. package/src/components/ui/controls/atomic/MultiDropdown.vue +300 -37
  107. package/src/components/ui/controls/atomic/Switch.vue +53 -25
  108. package/src/composables/useClickOutside.js +21 -0
  109. package/src/composables/useDropdownPosition.js +174 -0
  110. package/src/libs/Filter.js +60 -24
  111. package/src/registerServiceWorker.js +1 -1
  112. package/src/stores/connection.js +4 -4
  113. package/src/stores/sampleData.js +172 -199
  114. package/src/stores/ui.js +55 -20
  115. package/src/stores/utils.js +30 -4
  116. package/src/types/index.js +41 -0
  117. package/src/utils/debug.js +1 -0
  118. package/src/views/Accounts.vue +116 -50
  119. package/src/views/Console.vue +394 -77
  120. package/src/views/Editor.vue +1176 -123
  121. package/src/views/FilterBuilder.vue +528 -250
  122. package/src/views/Login.vue +76 -14
  123. package/src/views/Profiles.vue +119 -34
  124. package/src/views/Tasks.vue +266 -98
  125. package/static/offline.html +192 -50
  126. package/switch-branch.sh +41 -0
  127. package/tailwind.config.js +119 -27
  128. package/vite.config.js +73 -16
  129. package/workbox-config.cjs +63 -0
  130. package/ICONS.md +0 -21
  131. package/public/img/background.svg +0 -14
  132. package/public/img/logo.png +0 -0
  133. package/public/img/logo_icon.png +0 -0
  134. package/public/img/logo_icon_2.png +0 -0
  135. package/src/assets/css/_input.scss +0 -143
  136. package/src/assets/img/logo.png +0 -0
  137. package/src/assets/img/logo_icon.png +0 -0
  138. package/src/assets/img/logo_icon_2.png +0 -0
  139. package/vue.config.js +0 -32
  140. package/workbox-config.js +0 -7
@@ -1,87 +1,225 @@
1
1
  <template>
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>
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
+ />
40
14
  </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>
41
63
  </div>
64
+ </div>
42
65
  </template>
43
66
 
44
67
  <script setup>
45
68
  import { ref } from "vue";
46
69
  import { useUIStore } from "@/stores/ui";
47
70
  import { countries } from "@/stores/countries";
71
+ import { useDropdownPosition } from "@/composables/useDropdownPosition";
72
+ import { useClickOutside } from "@/composables/useClickOutside";
73
+
48
74
  const ui = useUIStore();
49
75
  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
+ };
50
108
  </script>
51
109
 
52
110
  <style scoped>
53
111
  .special-dropdown {
54
- @apply min-w-20;
112
+ @apply min-w-20;
55
113
  }
56
114
 
57
115
  .small-dropdown {
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;
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;
66
142
  }
67
143
 
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;
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;
76
167
  }
77
168
 
78
- @media (max-width: 1024px) {
79
- .small-dropdown {
80
- @apply bg-dark-550 !important;
81
- }
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
+ }
82
219
 
83
- .dropdown-content {
84
- @apply bg-dark-550 !important;
85
- }
220
+ .country-item .flex img {
221
+ width: 18px;
222
+ height: 14px;
223
+ flex-shrink: 0;
86
224
  }
87
225
  </style>
@@ -1,29 +1,138 @@
1
1
  <template>
2
2
  <button
3
- class="check-component"
3
+ class="modern-checkbox"
4
4
  @click="
5
5
  checked = !checked;
6
6
  $emit('valueUpdate', checked);
7
7
  "
8
- :class="{ 'border-light-300': !toggled }"
8
+ :class="{ checked: toggled, 'header-checkbox': isHeader }"
9
9
  >
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>
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>
15
31
  </div>
16
32
  </button>
17
33
  </template>
18
34
  <style lang="scss" scoped>
19
- .check-component {
20
- @apply border-dashed duration-200 rounded border flex items-center justify-center w-4 h-4;
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 oklch(0.28 0 0);
41
+ background: transparent;
42
+ transition: all 0.2s ease;
43
+
44
+ &:hover {
45
+ border-color: oklch(0.33 0 0);
46
+ transform: scale(1.05);
47
+ }
48
+
49
+ &.checked {
50
+ background: oklch(0.72 0.15 145);
51
+ border-color: oklch(0.72 0.15 145);
52
+
53
+ &:hover {
54
+ background: oklch(0.78 0.12 145);
55
+ border-color: oklch(0.78 0.12 145);
56
+ }
57
+ }
58
+
59
+ &.header-checkbox {
60
+ width: 16px;
61
+ height: 16px;
62
+ border-color: oklch(0.33 0 0);
63
+
64
+ &:hover {
65
+ border-color: oklch(0.72 0.15 145);
66
+ background: rgba(136, 201, 153, 0.1);
67
+ }
68
+
69
+ &.checked {
70
+ background: oklch(0.72 0.15 145);
71
+ border-color: oklch(0.72 0.15 145);
72
+
73
+ &:hover {
74
+ background: oklch(0.78 0.12 145);
75
+ border-color: oklch(0.78 0.12 145);
76
+ }
77
+ }
78
+ }
79
+
80
+ &:focus-visible {
81
+ outline: 2px solid oklch(0.72 0.15 145);
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
+ }
21
127
  }
22
128
  </style>
23
129
  <script setup>
24
130
  import { CheckmarkIcon } from "@/components/icons";
25
131
  import { ref } from "vue";
26
- const props = defineProps({ toggled: { type: Boolean, required: false, default: false } });
132
+ const props = defineProps({
133
+ toggled: { type: Boolean, required: false, default: false },
134
+ isHeader: { type: Boolean, required: false, default: false }
135
+ });
27
136
 
28
137
  const checked = ref(props.toggled);
29
138
  </script>