@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 +21 -21
- package/artwork/image.png +0 -0
- package/package.json +2 -2
- package/src/components/Editors/Account/CreateAccount.vue +3 -3
- package/src/components/Tasks/CreateTaskAXS.vue +4 -3
- package/src/components/Tasks/CreateTaskTM.vue +4 -2
- package/src/components/Tasks/Task.vue +1 -1
- package/src/stores/utils.js +4 -1
- package/src/views/Tasks.vue +1 -1
- package/switch-branch.sh +41 -0
- package/.claude/settings.local.json +0 -60
package/README.md
CHANGED
|
@@ -1,4 +1,8 @@
|
|
|
1
|
-
|
|
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
|
-
|
|
27
|
+
### 🧱 Frontend Stack
|
|
24
28
|
|
|
25
|
-
-
|
|
26
|
-
-
|
|
27
|
-
-
|
|
28
|
-
-
|
|
29
|
+
- Vue 3 + Composition API
|
|
30
|
+
- Pinia state management
|
|
31
|
+
- TailwindCSS + SCSS
|
|
32
|
+
- PWA with offline support
|
|
29
33
|
|
|
30
|
-
|
|
34
|
+
### 🛠 Backend Stack
|
|
31
35
|
|
|
32
|
-
-
|
|
33
|
-
-
|
|
34
|
-
-
|
|
35
|
-
-
|
|
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
|
-
|
|
40
|
-
|
|
41
|
-
-
|
|
42
|
-
-
|
|
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
|
-
|
|
50
|
+
Runs in mock mode by default. Backend simulates bot operations; frontend provides full UI functionality.
|
|
49
51
|
|
|
50
|
-
|
|
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.
|
|
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.
|
|
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
|
-
<!--
|
|
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
|
-
|
|
14
|
+
Account Tag
|
|
15
15
|
<TagIcon />
|
|
16
16
|
</label>
|
|
17
17
|
<Dropdown
|
|
18
|
-
:class="`input-default dropdown w-full p-4
|
|
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(
|
|
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(
|
|
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("://")
|
|
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);
|
package/src/stores/utils.js
CHANGED
|
@@ -398,7 +398,7 @@ const parseTmEventUrl = (url) => {
|
|
|
398
398
|
};
|
|
399
399
|
};
|
|
400
400
|
|
|
401
|
-
const isEU = (siteId) => !["US", "AU", "UK", "
|
|
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
|
};
|
package/src/views/Tasks.vue
CHANGED
|
@@ -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
|
|
212
|
+
.filter((t) => t.siteId === ui.currentCountry.siteId && !t.eventId?.includes("@"))
|
|
213
213
|
.map((v) => `${v.eventName} (${v.eventId})`)
|
|
214
214
|
),
|
|
215
215
|
];
|
package/switch-branch.sh
ADDED
|
@@ -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
|
-
}
|