@necrolab/dashboard 0.4.55 → 0.4.57

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/README.md CHANGED
@@ -1,4 +1,8 @@
1
- # 🎫 Necro Dashboard
1
+ <div align="center">
2
+ <img src="./artwork/image.png" alt="Dashboard" width="400">
3
+ </div>
4
+
5
+ # 🎫 Dashboard
2
6
 
3
7
  A sophisticated PWA dashboard for managing ticket purchasing automation across multiple platforms. Built with Vue 3 and real-time WebSocket communication.
4
8
 
@@ -20,34 +24,32 @@ Visit `http://localhost:5173` and you're live.
20
24
  | `npm run build` | Production build with PWA |
21
25
  | `npm run lint` | Code formatting |
22
26
 
23
- **Frontend Stack**
27
+ ### 🧱 Frontend Stack
24
28
 
25
- - Vue 3 + Composition API
26
- - Pinia state management
27
- - TailwindCSS + SCSS
28
- - PWA with offline support
29
+ - Vue 3 + Composition API
30
+ - Pinia state management
31
+ - TailwindCSS + SCSS
32
+ - PWA with offline support
29
33
 
30
- **Backend Stack**
34
+ ### 🛠 Backend Stack
31
35
 
32
- - Express.js with WebSockets
33
- - MessagePack serialization for big socket messages
34
- - Real-time message batching
35
- - Platform abstraction layer
36
+ - Express.js with WebSockets
37
+ - MessagePack serialization
38
+ - Real-time message batching
39
+ - Platform abstraction layer
36
40
 
37
41
  ## 📱 PWA Support
38
42
 
39
- Built as a Progressive Web App with:
40
-
41
- - 📲 Install to home screen
42
- - 🔄 Background sync
43
- - 📶 Offline functionality
44
- - 🎨 Native app feel
43
+ - 📲 Install to home screen
44
+ - 🔄 Background sync
45
+ - 📶 Offline functionality
46
+ - 🎨 Native app feel
45
47
 
46
48
  ## 🛠️ Development
47
49
 
48
- The app runs in mock mode by default for development. Backend simulates bot operations while frontend provides full UI functionality.
50
+ Runs in mock mode by default. Backend simulates bot operations; frontend provides full UI functionality.
49
51
 
50
- **File Structure**
52
+ ### 🗂️ File Structure
51
53
 
52
54
  ```
53
55
  src/
@@ -61,5 +63,3 @@ backend/
61
63
  ├─ mock-data.js # Development data
62
64
  └─ endpoints.js # API route definitions
63
65
  ```
64
-
65
- ---
Binary file
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@necrolab/dashboard",
3
- "version": "0.4.55",
3
+ "version": "0.4.57",
4
4
  "type": "module",
5
5
  "scripts": {
6
6
  "build": "rm -rf dist && npx workbox-cli generateSW workbox-config.cjs && vite build",
@@ -15,7 +15,7 @@
15
15
  "dependencies": {
16
16
  "@faker-js/faker": "^7.6.0",
17
17
  "@msgpack/msgpack": "^3.0.0-beta2",
18
- "@necrolab/tm-renderer": "^0.1.10",
18
+ "@necrolab/tm-renderer": "^0.1.11",
19
19
  "@vitejs/plugin-vue": "^5.2.1",
20
20
  "@vueuse/core": "^11.3.0",
21
21
  "autoprefixer": "^10.4.21",
@@ -8,14 +8,14 @@
8
8
 
9
9
  <div>
10
10
  <div class="my-3 grid grid-cols-12 gap-3">
11
- <!-- Profile tag -->
11
+ <!-- Account tag -->
12
12
  <div class="input-wrapper relative-positioned z-tooltip col-span-4">
13
13
  <label class="label-override mb-2">
14
- Profile Tag
14
+ Account Tag
15
15
  <TagIcon />
16
16
  </label>
17
17
  <Dropdown
18
- :class="`input-default dropdown w-full p-4 ${errors.includes('profileTag') ? 'error' : ''}`"
18
+ :class="`input-default dropdown w-full p-4`"
19
19
  :default="ui.profile.tags[0]"
20
20
  :options="ui.profile.tags"
21
21
  :onClick="(f) => (account.tag = f)"
@@ -216,15 +216,16 @@ import {
216
216
  import { useUIStore } from "@/stores/ui";
217
217
  import Dropdown from "@/components/ui/controls/atomic/Dropdown.vue";
218
218
  import MultiDropdown from "@/components/ui/controls/atomic/MultiDropdown.vue";
219
- import { parseAxsEventUrl, removeDuplicates } from "@/stores/utils";
219
+ import { firstUpper, parseAxsEventUrl, removeDuplicates } from "@/stores/utils";
220
220
 
221
221
  const ui = useUIStore();
222
222
 
223
223
  const accountTagOptions = ref(ui.profile.tags);
224
224
  const defaultTags = ["Amex", "Visa", "Master"];
225
225
 
226
- const profileTagsOptions = ref(removeDuplicates(["Any", ...defaultTags, ...ui.profile.profileTags]));
227
-
226
+ const profileTagsOptions = ref(
227
+ removeDuplicates(["Any", ...defaultTags, ...ui.profile.profileTags.map((x) => firstUpper(x))])
228
+ );
228
229
  const baseTask = ref({
229
230
  selected: false,
230
231
  taskId: "",
@@ -338,14 +338,16 @@ import { useUIStore } from "@/stores/ui";
338
338
  import { countries } from "@/stores/countries";
339
339
  import Dropdown from "@/components/ui/controls/atomic/Dropdown.vue";
340
340
  import MultiDropdown from "@/components/ui/controls/atomic/MultiDropdown.vue";
341
- import { isEU, parseTmEventUrl, removeDuplicates } from "@/stores/utils";
341
+ import { isEU, firstUpper, parseTmEventUrl, removeDuplicates } from "@/stores/utils";
342
342
 
343
343
  const ui = useUIStore();
344
344
 
345
345
  const accountTagOptions = ref(ui.profile.tags);
346
346
  const defaultTags = ["Amex", "Visa", "Master"];
347
347
 
348
- const profileTagsOptions = ref(removeDuplicates(["Any", ...defaultTags, ...ui.profile.profileTags]));
348
+ const profileTagsOptions = ref(
349
+ removeDuplicates(["Any", ...defaultTags, ...ui.profile.profileTags.map((x) => firstUpper(x))])
350
+ );
349
351
 
350
352
  const baseTask = ref({
351
353
  selected: false,
@@ -504,7 +504,7 @@ const openInBrowser = (debug) => {
504
504
  if (!props.task.openerLink) return;
505
505
  ui.showSuccess(`Opening in browser ${debug ? "(debug)" : ""}`);
506
506
  const input = props.task.openerLink;
507
- const data = JSON.parse(atob(input.split("://")[1]));
507
+ const data = JSON.parse(atob(input.split("://").pop()));
508
508
  data.config.debug = debug;
509
509
  const out = "necro://" + btoa(JSON.stringify(data));
510
510
  openInNewTab(out);
@@ -398,7 +398,7 @@ const parseTmEventUrl = (url) => {
398
398
  };
399
399
  };
400
400
 
401
- const isEU = (siteId) => !["US", "AU", "UK", "LN", "CA", "NZ", "IE"].includes(siteId.replaceAll("TM_", ""));
401
+ const isEU = (siteId) => !["US", "AU", "UK", "CA", "NZ", "IE"].includes(siteId.split("_")?.[1] || siteId);
402
402
 
403
403
  const removeDuplicates = (arr) => [...new Set(arr)];
404
404
 
@@ -531,6 +531,8 @@ function sortTaskIds(a, b) {
531
531
  return aInfo.num - bInfo.num;
532
532
  }
533
533
 
534
+ const firstUpper = (str) => `${str[0].toUpperCase()}${str.slice(1).toLowerCase()}`;
535
+
534
536
  function betterSort(a, b) {
535
537
  if (a === undefined || a === null) return b === undefined || b === null ? 0 : -1;
536
538
  if (b === undefined || b === null) return 1;
@@ -573,5 +575,6 @@ export {
573
575
  getCardType,
574
576
  validateCard,
575
577
  sortTaskIds,
578
+ firstUpper,
576
579
  betterSort
577
580
  };
@@ -209,7 +209,7 @@ const uniqEventIds = computed(() => {
209
209
  const ids = [
210
210
  ...new Set(
211
211
  Object.values(ui.tasks)
212
- .filter((t) => t.siteId === ui.currentCountry.siteId && !t.eventId.includes("@"))
212
+ .filter((t) => t.siteId === ui.currentCountry.siteId && !t.eventId?.includes("@"))
213
213
  .map((v) => `${v.eventName} (${v.eventId})`)
214
214
  ),
215
215
  ];
@@ -0,0 +1,41 @@
1
+ #!/bin/bash
2
+
3
+ # USAGE: ./git-force-switch.sh target-branch-name
4
+
5
+ set -e
6
+
7
+ TARGET_BRANCH="$1"
8
+
9
+ if [ -z "$TARGET_BRANCH" ]; then
10
+ echo "❌ Usage: $0 <branch-name>"
11
+ exit 1
12
+ fi
13
+
14
+ echo "🔧 Forcing checkout to '$TARGET_BRANCH'..."
15
+
16
+ # Step 1: Make sure Git respects case differences
17
+ git config core.ignoreCase false
18
+
19
+ # Step 2: Try checkout to see if it fails and capture errors
20
+ ERROR_OUTPUT=$(git checkout "$TARGET_BRANCH" 2>&1) || true
21
+
22
+ # Step 3: Check if it failed due to untracked files
23
+ if echo "$ERROR_OUTPUT" | grep -q "would be overwritten by checkout"; then
24
+ echo "⚠️ Conflicting untracked files detected. Cleaning them up..."
25
+
26
+ # Extract file paths and delete them
27
+ echo "$ERROR_OUTPUT" |
28
+ grep "^\s" |
29
+ sed 's/^[ \t]*//' |
30
+ while read -r FILE; do
31
+ if [ -f "$FILE" ] || [ -d "$FILE" ]; then
32
+ echo "🗑️ Removing $FILE"
33
+ rm -rf "$FILE"
34
+ fi
35
+ done
36
+
37
+ echo "🔁 Retrying checkout..."
38
+ git checkout "$TARGET_BRANCH"
39
+ else
40
+ echo "✅ Switched to $TARGET_BRANCH successfully."
41
+ fi
@@ -1,60 +0,0 @@
1
- {
2
- "permissions": {
3
- "allow": [
4
- "Bash(npm run lint)",
5
- "Bash(find:*)",
6
- "Bash(ls:*)",
7
- "Bash(grep:*)",
8
- "Bash(npm run build:*)",
9
- "Bash(npm view:*)",
10
- "Bash(npm run dev:*)",
11
- "Bash(sudo rm:*)",
12
- "Bash(rm:*)",
13
- "Bash(rg:*)",
14
- "Bash(/opt/homebrew/lib/node_modules/@anthropic-ai/claude-code/vendor/ripgrep/arm64-darwin/rg -n \"const DEBUG\" /Users/luca/Documents/GitHub/Necro/Dashboard/src/views/)",
15
- "Bash(/opt/homebrew/lib/node_modules/@anthropic-ai/claude-code/vendor/ripgrep/arm64-darwin/rg -n \"border-2 border-dark-550\" /Users/luca/Documents/GitHub/Necro/Dashboard/src/)",
16
- "Bash(/opt/homebrew/lib/node_modules/@anthropic-ai/claude-code/vendor/ripgrep/arm64-darwin/rg -n \"bg-dark-500\" /Users/luca/Documents/GitHub/Necro/Dashboard/src/)",
17
- "Bash(/opt/homebrew/lib/node_modules/@anthropic-ai/claude-code/vendor/ripgrep/arm64-darwin/rg -n \"flex items-center justify-center\" /Users/luca/Documents/GitHub/Necro/Dashboard/src/)",
18
- "Bash(/opt/homebrew/lib/node_modules/@anthropic-ai/claude-code/vendor/ripgrep/arm64-darwin/rg -n \"col-span.*flex.*items-center.*justify-center\" /Users/luca/Documents/GitHub/Necro/Dashboard/src/)",
19
- "Bash(/opt/homebrew/lib/node_modules/@anthropic-ai/claude-code/vendor/ripgrep/arm64-darwin/rg -n \"button.*flex.*items-center.*justify-center.*gap\" /Users/luca/Documents/GitHub/Necro/Dashboard/src/)",
20
- "Bash(/opt/homebrew/lib/node_modules/@anthropic-ai/claude-code/vendor/ripgrep/arm64-darwin/rg -n \"import.*useUIStore\" /Users/luca/Documents/GitHub/Necro/Dashboard/src/)",
21
- "Bash(/opt/homebrew/lib/node_modules/@anthropic-ai/claude-code/vendor/ripgrep/arm64-darwin/rg -n \"const.*ref\\(\" /Users/luca/Documents/GitHub/Necro/Dashboard/src/)",
22
- "Bash(/opt/homebrew/lib/node_modules/@anthropic-ai/claude-code/vendor/ripgrep/arm64-darwin/rg -n \"button-default.*bg-dark-400.*w-48.*text-xs.*flex.*items-center.*justify-center.*gap-x-2\" /Users/luca/Documents/GitHub/Necro/Dashboard/src/)",
23
- "Bash(/opt/homebrew/lib/node_modules/@anthropic-ai/claude-code/vendor/ripgrep/arm64-darwin/rg -n \"const DEBUG.*window\\.location\" /Users/luca/Documents/GitHub/Necro/Dashboard/src/)",
24
- "Bash(/opt/homebrew/lib/node_modules/@anthropic-ai/claude-code/vendor/ripgrep/arm64-darwin/rg -A5 -B5 \"input-incrementer\" /Users/luca/Documents/GitHub/Necro/Dashboard/src/components/Tasks/CreateTaskTM.vue)",
25
- "Bash(/opt/homebrew/lib/node_modules/@anthropic-ai/claude-code/vendor/ripgrep/arm64-darwin/rg -A2 -B2 \"label-override\" /Users/luca/Documents/GitHub/Necro/Dashboard/src/assets/css/main.scss)",
26
- "Bash(/opt/homebrew/lib/node_modules/@anthropic-ai/claude-code/vendor/ripgrep/arm64-darwin/rg -n \"MultiDropdown\" /Users/luca/Documents/GitHub/Necro/Dashboard/src/)",
27
- "Bash(/opt/homebrew/lib/node_modules/@anthropic-ai/claude-code/vendor/ripgrep/arm64-darwin/rg -n \"ant-select.*multiple\" /Users/luca/Documents/GitHub/Necro/Dashboard/src/)",
28
- "Bash(/opt/homebrew/lib/node_modules/@anthropic-ai/claude-code/vendor/ripgrep/arm64-darwin/rg -n \"multiple.*true\" /Users/luca/Documents/GitHub/Necro/Dashboard/src/)",
29
- "Bash(/opt/homebrew/lib/node_modules/@anthropic-ai/claude-code/vendor/ripgrep/arm64-darwin/rg -n \"a-select\" /Users/luca/Documents/GitHub/Necro/Dashboard/src/)",
30
- "Bash(/opt/homebrew/lib/node_modules/@anthropic-ai/claude-code/vendor/ripgrep/arm64-darwin/rg -n \"Select\" /Users/luca/Documents/GitHub/Necro/Dashboard/src/)",
31
- "Bash(/opt/homebrew/lib/node_modules/@anthropic-ai/claude-code/vendor/ripgrep/arm64-darwin/rg -A5 -B5 \"mode.*multiple\" /Users/luca/Documents/GitHub/Necro/Dashboard/src/components/Tasks/)",
32
- "Bash(/opt/homebrew/lib/node_modules/@anthropic-ai/claude-code/vendor/ripgrep/arm64-darwin/rg -A10 -B5 \"a-select\" /Users/luca/Documents/GitHub/Necro/Dashboard/src/components/Tasks/CreateTaskTM.vue)",
33
- "Bash(/opt/homebrew/lib/node_modules/@anthropic-ai/claude-code/vendor/ripgrep/arm64-darwin/rg -n \"CountryChooser\\|currentCountry\" /Users/luca/Documents/GitHub/Necro/Dashboard/src/views/Tasks.vue)",
34
- "Bash(/opt/homebrew/lib/node_modules/@anthropic-ai/claude-code/vendor/ripgrep/arm64-darwin/rg -n \"currentModule\\|CountryChooser\" /Users/luca/Documents/GitHub/Necro/Dashboard/src/components/ui/Navbar.vue)",
35
- "Bash(/opt/homebrew/lib/node_modules/@anthropic-ai/claude-code/vendor/ripgrep/arm64-darwin/rg -l \"CountryChooser\" /Users/luca/Documents/GitHub/Necro/Dashboard/src/)",
36
- "Bash(/opt/homebrew/lib/node_modules/@anthropic-ai/claude-code/vendor/ripgrep/arm64-darwin/rg -n \"bg-dark-400.*button\\|button.*bg-dark-400\" /Users/luca/Documents/GitHub/Necro/Dashboard/src/views/Tasks.vue)",
37
- "Bash(npm install:*)",
38
- "Bash(sudo chown:*)",
39
- "Bash(sudo npm install:*)",
40
- "Bash(node:*)",
41
- "Bash(git checkout:*)",
42
- "Bash(npx vue-tsc:*)",
43
- "Bash(npx vite build:*)",
44
- "Bash(npx eslint:*)",
45
- "Bash(cp:*)",
46
- "Bash(sed:*)",
47
- "Bash(true)",
48
- "Bash(./run build)",
49
- "Bash(mv:*)",
50
- "Bash(chown:*)",
51
- "Bash(chmod:*)",
52
- "Bash(timeout 10s npm run dev)",
53
- "Bash(gtimeout:*)",
54
- "Bash(echo $SHELL)",
55
- "Bash(mkdir:*)",
56
- "Bash(base64:*)"
57
- ],
58
- "deny": []
59
- }
60
- }