feat(planka): add Planka kanban to docker-compose + wire UI

- docker-compose: add planka + planka-db services (port 1337, isolated volume)
- apache.conf: add ProxyPass /board/ → localhost:1337
- .env.example: add PLANKA_SECRET_KEY + PLANKA_BASE_URL
- Sidebar: rename Planner → Tasks, open /board in new tab via <a>
- Router: remove /planner route
- Delete PlannerView.vue, TaskList.vue, TaskCard.vue (Calendar keeps TaskForm)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
Vadym Samoilenko 2026-05-07 12:15:25 +01:00
parent fe31ca0fd7
commit e401f9a60b
88 changed files with 2908 additions and 402 deletions

View file

@ -7,7 +7,41 @@
"Bash(CC_API_KEY=cc_YcRD4q8NqZanghwFA9z7b-ZgXf57vgBcKpjhlOM_Jd0 CC_SERVER=https://optical-dev.oliver.solutions/cc-dashboard CC_ROOT_PATH=/Volumes/SSD/Projects/Oliver python3 /Users/aimpress/.claude/cc-collector.py 2>&1)",
"Bash(bash deploy.sh)",
"Bash(rm -f ~/.claude/.cc-collector-state.json)",
"Bash(CC_API_KEY=cc_YcRD4q8NqZanghwFA9z7b-ZgXf57vgBcKpjhlOM_Jd0 CC_SERVER=https://optical-dev.oliver.solutions/cc-dashboard CC_ROOT_PATH=/Volumes/SSD/Projects/Oliver CC_LOOKBACK=8760 python3 /Users/aimpress/.claude/cc-collector.py)"
"Bash(CC_API_KEY=cc_YcRD4q8NqZanghwFA9z7b-ZgXf57vgBcKpjhlOM_Jd0 CC_SERVER=https://optical-dev.oliver.solutions/cc-dashboard CC_ROOT_PATH=/Volumes/SSD/Projects/Oliver CC_LOOKBACK=8760 python3 /Users/aimpress/.claude/cc-collector.py)",
"Bash(git -C /Users/ai_leed/Documents/Projects/Oliver/cc-dashboard remote -v)",
"Bash(git -C /Users/ai_leed/Documents/Projects/Oliver/cc-dashboard log --oneline main -5)",
"Bash(git -C /Users/ai_leed/Documents/Projects/Oliver/cc-dashboard log --oneline main..feat/planning-hub)",
"Bash(git checkout *)",
"Bash(git merge --no-ff feat/planning-hub -m ' *)",
"Bash(git -C /Users/ai_leed/Documents/Projects/Oliver/cc-dashboard add alembic/versions/0005_session_category.py)",
"Bash(git -C /Users/ai_leed/Documents/Projects/Oliver/cc-dashboard commit -m ' *)",
"Bash(git -C /Users/ai_leed/Documents/Projects/Oliver/cc-dashboard push origin main)",
"Bash(git -C /Users/ai_leed/Documents/Projects/Oliver/cc-dashboard add src/main.py)",
"Bash(git -C /Users/ai_leed/Documents/Projects/Oliver/cc-dashboard commit -m 'fix: remove add_logger_name from structlog — incompatible with PrintLoggerFactory *)",
"mcp__playwright__browser_navigate",
"Bash(ssh -f -N -L 18800:127.0.0.1:8800 optical-dev -o ExitOnForwardFailure=yes)",
"Bash(npx -y @21st-dev/magic@latest --help)",
"Bash(npm run *)",
"mcp__magic__21st_magic_component_refiner",
"mcp__magic__21st_magic_component_inspiration",
"mcp__playwright__browser_take_screenshot",
"mcp__playwright__browser_fill_form",
"mcp__playwright__browser_click",
"mcp__playwright__browser_snapshot",
"Read(//Users/ai_leed/.claude/skills/**)",
"Read(//Users/ai_leed/.claude/plugins/**)",
"Bash(git -C /Users/ai_leed/Documents/Projects/Oliver/cc-dashboard/.claude/worktrees/agent-abaceb40848f4ed6e diff HEAD --stat)",
"Bash(git -C /Users/ai_leed/Documents/Projects/Oliver/cc-dashboard add web/src/components/tasks/TaskForm.vue web/src/views/PlannerView.vue web/src/components/calendar/CalendarBlock.vue web/src/components/calendar/CalendarGrid.vue web/src/composables/useCalendarDnD.ts src/static/)",
"Bash(git -C /Users/ai_leed/Documents/Projects/Oliver/cc-dashboard status --short)",
"Bash(git *)",
"mcp__playwright__browser_console_messages",
"mcp__playwright__browser_network_request",
"mcp__playwright__browser_evaluate",
"Bash(obsidian vault=VadymSamoilenko *)",
"Bash(obsidian vault=\"VadymSamoilenko\" read path=\"01 Projects/cc-dashboard/CC Dashboard.md\")",
"Bash(obsidian vault=\"VadymSamoilenko\" search query=\"cc-dashboard\" limit=5)",
"Bash(ssh -o ConnectTimeout=10 optical-dev \"echo ok\")",
"Read(//Users/ai_leed/.ssh/**)"
]
}
}

@ -0,0 +1 @@
Subproject commit 9d9e8e82d46674d0a59359a8b510cd4ad703ba76

@ -0,0 +1 @@
Subproject commit 2b4fd5dee8d496fc67e5dd8f6f6826cacad63d5e

View file

@ -37,3 +37,7 @@ REPORT_EMAIL=you@example.com
DAILY_REPORT_HOUR=20
WEEKLY_REPORT_DAY=6
WEEKLY_REPORT_HOUR=21
# Planka kanban board (run: openssl rand -hex 64)
PLANKA_SECRET_KEY=changeme-use-openssl-rand-hex-64
PLANKA_BASE_URL=https://optical-dev.oliver.solutions/board

View file

@ -0,0 +1,18 @@
- generic [ref=e2]:
- generic [ref=e4]:
- generic [ref=e5]:
- img [ref=e7]
- heading "CC Dashboard" [level=1] [ref=e9]
- paragraph [ref=e10]: Corporate Planning Hub
- generic [ref=e13]:
- generic [ref=e14]:
- text: Email
- textbox "Email" [ref=e15]:
- /placeholder: you@company.com
- generic [ref=e16]:
- text: Password
- textbox "Password" [ref=e17]:
- /placeholder: ••••••••
- button "Sign in" [ref=e18] [cursor=pointer]
- region "Notifications alt+T":
- list

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

View file

@ -0,0 +1,21 @@
- generic [ref=e2]:
- generic [ref=e4]:
- generic [ref=e5]:
- img [ref=e7]
- heading "CC Dashboard" [level=1] [ref=e9]
- paragraph [ref=e10]: Corporate Planning Hub
- generic [ref=e13]:
- generic [ref=e19]: "[ { \"type\": \"model_attributes_type\", \"loc\": [ \"body\" ], \"msg\": \"Input should be a valid dictionary or object to extract fields from\", \"input\": \"username=vadymsamoilenko%40oliver.agency&password=Ukraine123%21\" } ]"
- generic [ref=e14]:
- text: Email
- textbox "Email" [ref=e15]:
- /placeholder: you@company.com
- text: vadymsamoilenko@oliver.agency
- generic [ref=e16]:
- text: Password
- textbox "Password" [ref=e17]:
- /placeholder: ••••••••
- text: Ukraine123!
- button "Sign in" [ref=e18] [cursor=pointer]
- region "Notifications alt+T":
- list

Binary file not shown.

After

Width:  |  Height:  |  Size: 40 KiB

View file

@ -0,0 +1,18 @@
- generic [ref=e2]:
- generic [ref=e4]:
- generic [ref=e5]:
- img [ref=e7]
- heading "CC Dashboard" [level=1] [ref=e9]
- paragraph [ref=e10]: Corporate Planning Hub
- generic [ref=e13]:
- generic [ref=e14]:
- text: Email
- textbox "Email" [ref=e15]:
- /placeholder: you@company.com
- generic [ref=e16]:
- text: Password
- textbox "Password" [ref=e17]:
- /placeholder: ••••••••
- button "Sign in" [ref=e18] [cursor=pointer]
- region "Notifications alt+T":
- list

View file

@ -0,0 +1,166 @@
- generic [ref=e2]:
- generic [ref=e19]:
- complementary [ref=e21]:
- generic [ref=e23]:
- img [ref=e25]
- generic [ref=e27]:
- paragraph [ref=e28]: CC Dashboard
- paragraph [ref=e29]: Oliver Agency
- navigation [ref=e30]:
- link "Dashboard" [ref=e31] [cursor=pointer]:
- /url: /cc-dashboard/
- img [ref=e33]
- generic [ref=e35]: Dashboard
- link "Calendar" [ref=e36] [cursor=pointer]:
- /url: /cc-dashboard/calendar
- img [ref=e37]
- generic [ref=e39]: Calendar
- link "Planner" [ref=e40] [cursor=pointer]:
- /url: /cc-dashboard/planner
- img [ref=e41]
- generic [ref=e43]: Planner
- link "Projects" [ref=e44] [cursor=pointer]:
- /url: /cc-dashboard/projects
- img [ref=e45]
- generic [ref=e47]: Projects
- link "Live Feed" [ref=e48] [cursor=pointer]:
- /url: /cc-dashboard/live
- img [ref=e49]
- generic [ref=e51]: Live Feed
- link "Reports" [ref=e52] [cursor=pointer]:
- /url: /cc-dashboard/reports
- img [ref=e53]
- generic [ref=e55]: Reports
- link "Keys" [ref=e56] [cursor=pointer]:
- /url: /cc-dashboard/keys
- img [ref=e57]
- generic [ref=e59]: Keys
- link "Settings" [ref=e60] [cursor=pointer]:
- /url: /cc-dashboard/settings
- img [ref=e61]
- generic [ref=e64]: Settings
- link "Admin" [ref=e65] [cursor=pointer]:
- /url: /cc-dashboard/admin
- img [ref=e66]
- generic [ref=e68]: Admin
- generic [ref=e70]:
- generic [ref=e71]: VA
- generic [ref=e72]:
- paragraph [ref=e73]: vadymsamoilenko
- generic [ref=e76]: Online
- generic [ref=e77]:
- banner [ref=e78]:
- heading "Dashboard" [level=1] [ref=e80]
- button "Toggle dark mode" [ref=e81] [cursor=pointer]:
- img [ref=e82]
- generic [ref=e85]:
- generic [ref=e86]: VA
- generic [ref=e87]: vadymsamoilenko
- button "Sign out" [ref=e88] [cursor=pointer]:
- img [ref=e89]
- text: Sign out
- main [ref=e91]:
- generic [ref=e92]:
- generic [ref=e93]:
- heading "Overview" [level=2] [ref=e94]
- generic [ref=e95]:
- button "Today" [ref=e96] [cursor=pointer]
- button "7 days" [ref=e97] [cursor=pointer]
- button "30 days" [ref=e98] [cursor=pointer]
- button "Custom" [ref=e99] [cursor=pointer]
- generic [ref=e100]:
- generic [ref=e103]:
- generic [ref=e104]:
- paragraph [ref=e105]: Total Hours
- paragraph [ref=e107]: 103h 40m
- img [ref=e109]
- generic [ref=e114]:
- generic [ref=e115]:
- paragraph [ref=e116]: Working Days
- paragraph [ref=e118]: "14"
- img [ref=e120]
- generic [ref=e125]:
- generic [ref=e126]:
- paragraph [ref=e127]: Projects
- paragraph [ref=e129]: "22"
- img [ref=e131]
- generic [ref=e136]:
- generic [ref=e137]:
- paragraph [ref=e138]: Avg / Day
- paragraph [ref=e140]: 7h 24m
- img [ref=e142]
- generic [ref=e147]:
- generic [ref=e148]:
- paragraph [ref=e149]: Top Project
- paragraph [ref=e151]: Video Accessibility
- img [ref=e153]
- generic [ref=e158]:
- generic [ref=e159]:
- paragraph [ref=e160]: Commits
- paragraph [ref=e162]: "286"
- img [ref=e164]
- generic [ref=e167]:
- generic [ref=e168]:
- heading "Hours by Day" [level=3] [ref=e170]
- generic [ref=e172]:
- 'generic "undefined: 39h 17m"'
- 'generic "undefined: 162h 50m"'
- 'generic "undefined: 87h 19m"'
- 'generic "undefined: 23h 37m"'
- generic [ref=e173]:
- heading "Hours by Day of Week" [level=3] [ref=e175]
- generic [ref=e177]:
- generic [ref=e178]:
- generic "47h 40m"
- generic [ref=e179]: Mo
- generic [ref=e180]:
- generic "45h 33m"
- generic [ref=e181]: Tu
- generic [ref=e182]:
- generic "65h 32m"
- generic [ref=e183]: We
- generic [ref=e184]:
- generic "71h 55m"
- generic [ref=e185]: Th
- generic [ref=e186]:
- generic "61h 25m"
- generic [ref=e187]: Fr
- generic [ref=e188]:
- generic "10h 32m"
- generic [ref=e189]: Sa
- generic [ref=e190]:
- generic "10h 28m"
- generic [ref=e191]: Su
- generic [ref=e192]:
- heading "Tool Usage" [level=3] [ref=e195]
- generic [ref=e196]:
- heading "Projects" [level=3] [ref=e198]
- generic [ref=e200]:
- generic [ref=e202]:
- generic [ref=e203]: Video Accessibility
- generic [ref=e204]: 33h 51m
- generic [ref=e208]:
- generic [ref=e209]: General
- generic [ref=e210]: 9h 22m
- generic [ref=e214]:
- generic [ref=e215]: Cinema Studio Pro Kling
- generic [ref=e216]: 6h 59m
- generic [ref=e220]:
- generic [ref=e221]: Ai Cost Tracker
- generic [ref=e222]: 5h 48m
- generic [ref=e226]:
- generic [ref=e227]: Sandbox Notebookllamalm Nextjs
- generic [ref=e228]: 4h 37m
- generic [ref=e232]:
- generic [ref=e233]: Barclays Banner Builder
- generic [ref=e234]: 4h 15m
- generic [ref=e238]:
- generic [ref=e239]: Ford Qc
- generic [ref=e240]: 3h 19m
- generic [ref=e244]:
- generic [ref=e245]: 3M Portal
- generic [ref=e246]: 2h 56m
- button "Open AI Assistant" [ref=e249] [cursor=pointer]:
- img [ref=e250]
- region "Notifications alt+T":
- list

Binary file not shown.

After

Width:  |  Height:  |  Size: 95 KiB

View file

@ -0,0 +1,4 @@
- generic [active]:
- generic:
- region "Notifications alt+T":
- list

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

View file

@ -0,0 +1,192 @@
- generic [ref=e2]:
- generic [ref=e19]:
- complementary [ref=e21]:
- generic [ref=e23]:
- img [ref=e25]
- generic [ref=e27]:
- paragraph [ref=e28]: CC Dashboard
- paragraph [ref=e29]: Oliver Agency
- navigation [ref=e30]:
- link "Dashboard" [ref=e31] [cursor=pointer]:
- /url: /cc-dashboard/
- img [ref=e33]
- generic [ref=e35]: Dashboard
- link "Calendar" [ref=e36] [cursor=pointer]:
- /url: /cc-dashboard/calendar
- img [ref=e37]
- generic [ref=e39]: Calendar
- link "Planner" [ref=e40] [cursor=pointer]:
- /url: /cc-dashboard/planner
- img [ref=e41]
- generic [ref=e43]: Planner
- link "Projects" [ref=e44] [cursor=pointer]:
- /url: /cc-dashboard/projects
- img [ref=e45]
- generic [ref=e47]: Projects
- link "Live Feed" [ref=e48] [cursor=pointer]:
- /url: /cc-dashboard/live
- img [ref=e49]
- generic [ref=e51]: Live Feed
- link "Reports" [ref=e52] [cursor=pointer]:
- /url: /cc-dashboard/reports
- img [ref=e53]
- generic [ref=e55]: Reports
- link "Keys" [ref=e56] [cursor=pointer]:
- /url: /cc-dashboard/keys
- img [ref=e57]
- generic [ref=e59]: Keys
- link "Settings" [ref=e60] [cursor=pointer]:
- /url: /cc-dashboard/settings
- img [ref=e61]
- generic [ref=e64]: Settings
- link "Admin" [ref=e65] [cursor=pointer]:
- /url: /cc-dashboard/admin
- img [ref=e66]
- generic [ref=e68]: Admin
- generic [ref=e70]:
- generic [ref=e71]: VA
- generic [ref=e72]:
- paragraph [ref=e73]: vadymsamoilenko
- generic [ref=e76]: Online
- generic [ref=e77]:
- banner [ref=e78]:
- heading "Dashboard" [level=1] [ref=e80]
- button "Toggle dark mode" [ref=e81] [cursor=pointer]:
- img [ref=e82]
- generic [ref=e85]:
- generic [ref=e86]: VA
- generic [ref=e87]: vadymsamoilenko
- button "Sign out" [ref=e88] [cursor=pointer]:
- img [ref=e89]
- text: Sign out
- main [ref=e91]:
- generic [ref=e92]:
- generic [ref=e93]:
- heading "Overview" [level=2] [ref=e94]
- generic [ref=e95]:
- button "Today" [ref=e96] [cursor=pointer]
- button "7 days" [ref=e97] [cursor=pointer]
- button "30 days" [ref=e98] [cursor=pointer]
- button "Custom" [ref=e99] [cursor=pointer]
- generic [ref=e100]:
- generic [ref=e103]:
- generic [ref=e104]:
- paragraph [ref=e105]: Total Hours
- paragraph [ref=e107]: 103h 40m
- img [ref=e109]
- generic [ref=e114]:
- generic [ref=e115]:
- paragraph [ref=e116]: Working Days
- paragraph [ref=e118]: "14"
- img [ref=e120]
- generic [ref=e125]:
- generic [ref=e126]:
- paragraph [ref=e127]: Projects
- paragraph [ref=e129]: "22"
- img [ref=e131]
- generic [ref=e136]:
- generic [ref=e137]:
- paragraph [ref=e138]: Avg / Day
- paragraph [ref=e140]: 7h 24m
- img [ref=e142]
- generic [ref=e147]:
- generic [ref=e148]:
- paragraph [ref=e149]: Top Project
- paragraph [ref=e151]: Video Accessibility
- img [ref=e153]
- generic [ref=e158]:
- generic [ref=e159]:
- paragraph [ref=e160]: Commits
- paragraph [ref=e162]: "286"
- img [ref=e164]
- generic [ref=e167]:
- generic [ref=e168]:
- heading "Hours by Day" [level=3] [ref=e170]
- generic [ref=e172]:
- 'generic "undefined: 39h 17m"'
- 'generic "undefined: 162h 50m"'
- 'generic "undefined: 87h 19m"'
- 'generic "undefined: 23h 37m"'
- generic [ref=e173]:
- heading "Hours by Day of Week" [level=3] [ref=e175]
- generic [ref=e177]:
- generic [ref=e178]:
- generic "47h 40m"
- generic [ref=e179]: Mo
- generic [ref=e180]:
- generic "45h 33m"
- generic [ref=e181]: Tu
- generic [ref=e182]:
- generic "65h 32m"
- generic [ref=e183]: We
- generic [ref=e184]:
- generic "71h 55m"
- generic [ref=e185]: Th
- generic [ref=e186]:
- generic "61h 25m"
- generic [ref=e187]: Fr
- generic [ref=e188]:
- generic "10h 32m"
- generic [ref=e189]: Sa
- generic [ref=e190]:
- generic "10h 28m"
- generic [ref=e191]: Su
- generic [ref=e192]:
- generic [ref=e193]:
- heading "Tool Usage" [level=3] [ref=e195]
- generic [ref=e197]:
- generic [ref=e198]:
- generic [ref=e199]: Bash
- generic [ref=e202]: 0%
- generic [ref=e203]:
- generic [ref=e204]: Read
- generic [ref=e207]: 0%
- generic [ref=e208]:
- generic [ref=e209]: Edit
- generic [ref=e212]: 0%
- generic [ref=e213]:
- generic [ref=e214]: Write
- generic [ref=e217]: 0%
- generic [ref=e218]:
- generic [ref=e219]: Agent
- generic [ref=e222]: 0%
- generic [ref=e223]:
- generic [ref=e224]: ToolSearch
- generic [ref=e227]: 0%
- generic [ref=e228]:
- generic [ref=e229]: mcp__playwright__browser_take_screenshot
- generic [ref=e232]: 0%
- generic [ref=e233]:
- generic [ref=e234]: WebFetch
- generic [ref=e237]: 0%
- generic [ref=e238]:
- heading "Projects" [level=3] [ref=e240]
- generic [ref=e242]:
- generic [ref=e244]:
- generic [ref=e245]: Video Accessibility
- generic [ref=e246]: 33h 51m
- generic [ref=e250]:
- generic [ref=e251]: General
- generic [ref=e252]: 9h 22m
- generic [ref=e256]:
- generic [ref=e257]: Cinema Studio Pro Kling
- generic [ref=e258]: 6h 59m
- generic [ref=e262]:
- generic [ref=e263]: Ai Cost Tracker
- generic [ref=e264]: 5h 48m
- generic [ref=e268]:
- generic [ref=e269]: Sandbox Notebookllamalm Nextjs
- generic [ref=e270]: 4h 37m
- generic [ref=e274]:
- generic [ref=e275]: Barclays Banner Builder
- generic [ref=e276]: 4h 15m
- generic [ref=e280]:
- generic [ref=e281]: Ford Qc
- generic [ref=e282]: 3h 19m
- generic [ref=e286]:
- generic [ref=e287]: 3M Portal
- generic [ref=e288]: 2h 56m
- button "Open AI Assistant" [ref=e291] [cursor=pointer]:
- img [ref=e292]
- region "Notifications alt+T":
- list

Binary file not shown.

After

Width:  |  Height:  |  Size: 106 KiB

View file

@ -0,0 +1,18 @@
- generic [ref=e2]:
- generic [ref=e4]:
- generic [ref=e5]:
- img [ref=e7]
- heading "CC Dashboard" [level=1] [ref=e9]
- paragraph [ref=e10]: Corporate Planning Hub
- generic [ref=e13]:
- generic [ref=e14]:
- text: Email
- textbox "Email" [ref=e15]:
- /placeholder: you@company.com
- generic [ref=e16]:
- text: Password
- textbox "Password" [ref=e17]:
- /placeholder: ••••••••
- button "Sign in" [ref=e18] [cursor=pointer]
- region "Notifications alt+T":
- list

View file

@ -0,0 +1,21 @@
- generic [ref=e2]:
- generic [ref=e4]:
- generic [ref=e5]:
- img [ref=e7]
- heading "CC Dashboard" [level=1] [ref=e9]
- paragraph [ref=e10]: Corporate Planning Hub
- generic [ref=e13]:
- generic [ref=e19]: Invalid credentials
- generic [ref=e14]:
- text: Email
- textbox "Email" [ref=e15]:
- /placeholder: you@company.com
- text: vadymsamoilenko@oliver.agency
- generic [ref=e16]:
- text: Password
- textbox "Password" [ref=e17]:
- /placeholder: ••••••••
- text: admin
- button "Sign in" [ref=e18] [cursor=pointer]
- region "Notifications alt+T":
- list

View file

@ -0,0 +1,177 @@
- generic [ref=e2]:
- generic [ref=e20]:
- complementary [ref=e22]:
- generic [ref=e24]:
- img [ref=e26]
- generic [ref=e28]:
- paragraph [ref=e29]: CC Dashboard
- paragraph [ref=e30]: Oliver Agency
- navigation [ref=e31]:
- link "Dashboard" [ref=e32] [cursor=pointer]:
- /url: /cc-dashboard/
- img [ref=e34]
- generic [ref=e36]: Dashboard
- link "Calendar" [ref=e37] [cursor=pointer]:
- /url: /cc-dashboard/calendar
- img [ref=e38]
- generic [ref=e40]: Calendar
- link "Planner" [ref=e41] [cursor=pointer]:
- /url: /cc-dashboard/planner
- img [ref=e42]
- generic [ref=e44]: Planner
- link "Projects" [ref=e45] [cursor=pointer]:
- /url: /cc-dashboard/projects
- img [ref=e46]
- generic [ref=e48]: Projects
- link "Live Feed" [ref=e49] [cursor=pointer]:
- /url: /cc-dashboard/live
- img [ref=e50]
- generic [ref=e52]: Live Feed
- link "Reports" [ref=e53] [cursor=pointer]:
- /url: /cc-dashboard/reports
- img [ref=e54]
- generic [ref=e56]: Reports
- link "Keys" [ref=e57] [cursor=pointer]:
- /url: /cc-dashboard/keys
- img [ref=e58]
- generic [ref=e60]: Keys
- link "DevOps" [ref=e61] [cursor=pointer]:
- /url: /cc-dashboard/devops
- img [ref=e62]
- generic [ref=e64]: DevOps
- link "Settings" [ref=e65] [cursor=pointer]:
- /url: /cc-dashboard/settings
- img [ref=e66]
- generic [ref=e69]: Settings
- link "Admin" [ref=e70] [cursor=pointer]:
- /url: /cc-dashboard/admin
- img [ref=e71]
- generic [ref=e73]: Admin
- generic [ref=e75]:
- generic [ref=e76]: VA
- generic [ref=e77]:
- paragraph [ref=e78]: vadymsamoilenko
- generic [ref=e81]: Online
- generic [ref=e82]:
- banner [ref=e83]:
- heading "Dashboard" [level=1] [ref=e85]
- button "Toggle dark mode" [ref=e86] [cursor=pointer]:
- img [ref=e87]
- generic [ref=e90]:
- generic [ref=e91]: VA
- generic [ref=e92]: vadymsamoilenko
- button "Sign out" [ref=e93] [cursor=pointer]:
- img [ref=e94]
- text: Sign out
- main [ref=e96]:
- generic [ref=e97]:
- generic [ref=e98]:
- heading "Overview" [level=2] [ref=e99]
- generic [ref=e100]:
- button "Today" [ref=e101] [cursor=pointer]
- button "7 days" [ref=e102] [cursor=pointer]
- button "30 days" [ref=e103] [cursor=pointer]
- button "Custom" [ref=e104] [cursor=pointer]
- generic [ref=e105]:
- generic [ref=e108]:
- generic [ref=e109]:
- paragraph [ref=e110]: Total Hours
- paragraph [ref=e112]: 9h 5m
- img [ref=e114]
- generic [ref=e119]:
- generic [ref=e120]:
- paragraph [ref=e121]: Working Days
- paragraph [ref=e123]: "1"
- img [ref=e125]
- generic [ref=e130]:
- generic [ref=e131]:
- paragraph [ref=e132]: Projects
- paragraph [ref=e134]: "3"
- img [ref=e136]
- generic [ref=e141]:
- generic [ref=e142]:
- paragraph [ref=e143]: Avg / Day
- paragraph [ref=e145]: 9h 5m
- img [ref=e147]
- generic [ref=e152]:
- generic [ref=e153]:
- paragraph [ref=e154]: Top Project
- paragraph [ref=e156]: Cc Dashboard
- img [ref=e158]
- generic [ref=e163]:
- generic [ref=e164]:
- paragraph [ref=e165]: Commits
- paragraph [ref=e167]: "18"
- img [ref=e169]
- generic [ref=e172]:
- generic [ref=e173]:
- heading "Hours by Day" [level=3] [ref=e175]
- 'generic "2026-05-06: 9h 5m" [ref=e178]'
- generic [ref=e180]:
- heading "By Day of Week" [level=3] [ref=e182]
- generic [ref=e184]:
- generic [ref=e185]:
- 'generic "Mon: 0m"'
- generic [ref=e186]: Mo
- generic [ref=e187]:
- 'generic "Tue: 0m"'
- generic [ref=e188]: Tu
- generic [ref=e189]:
- 'generic "Wed: 9h 5m"'
- generic [ref=e190]: We
- generic [ref=e191]:
- 'generic "Thu: 0m"'
- generic [ref=e192]: Th
- generic [ref=e193]:
- 'generic "Fri: 0m"'
- generic [ref=e194]: Fr
- generic [ref=e195]:
- 'generic "Sat: 0m"'
- generic [ref=e196]: Sa
- generic [ref=e197]:
- 'generic "Sun: 0m"'
- generic [ref=e198]: Su
- generic [ref=e199]:
- generic [ref=e200]:
- heading "Tool Usage" [level=3] [ref=e202]
- generic [ref=e204]:
- generic [ref=e205]:
- generic [ref=e206]: Bash
- generic [ref=e208]: 0%
- generic [ref=e209]:
- generic [ref=e210]: Read
- generic [ref=e212]: 0%
- generic [ref=e213]:
- generic [ref=e214]: Edit
- generic [ref=e216]: 0%
- generic [ref=e217]:
- generic [ref=e218]: mcp__playwright__browser_click
- generic [ref=e220]: 0%
- generic [ref=e221]:
- generic [ref=e222]: mcp__playwright__browser_take_screenshot
- generic [ref=e224]: 0%
- generic [ref=e225]:
- generic [ref=e226]: Write
- generic [ref=e228]: 0%
- generic [ref=e229]:
- generic [ref=e230]: Agent
- generic [ref=e232]: 0%
- generic [ref=e233]:
- generic [ref=e234]: ToolSearch
- generic [ref=e236]: 0%
- generic [ref=e237]:
- heading "Projects" [level=3] [ref=e239]
- generic [ref=e241]:
- generic [ref=e243]:
- generic [ref=e244]: Cc Dashboard
- generic [ref=e245]: 3h 24m
- generic [ref=e247]:
- generic [ref=e248]: Video Accessibility
- generic [ref=e249]: 1h 22m
- generic [ref=e251]:
- generic [ref=e252]: Baic Dashboard
- generic [ref=e253]: 31m
- button "Open AI Assistant" [ref=e254] [cursor=pointer]:
- img [ref=e255]
- region "Notifications alt+T":
- list

Binary file not shown.

After

Width:  |  Height:  |  Size: 94 KiB

View file

@ -0,0 +1,200 @@
- generic [ref=e2]:
- generic [ref=e20]:
- complementary [ref=e22]:
- generic [ref=e24]:
- img [ref=e26]
- generic [ref=e28]:
- paragraph [ref=e29]: CC Dashboard
- paragraph [ref=e30]: Oliver Agency
- navigation [ref=e31]:
- link "Dashboard" [ref=e32] [cursor=pointer]:
- /url: /cc-dashboard/
- img [ref=e34]
- generic [ref=e36]: Dashboard
- link "Calendar" [ref=e37] [cursor=pointer]:
- /url: /cc-dashboard/calendar
- img [ref=e38]
- generic [ref=e40]: Calendar
- link "Planner" [ref=e41] [cursor=pointer]:
- /url: /cc-dashboard/planner
- img [ref=e42]
- generic [ref=e44]: Planner
- link "Projects" [ref=e45] [cursor=pointer]:
- /url: /cc-dashboard/projects
- img [ref=e46]
- generic [ref=e48]: Projects
- link "Live Feed" [ref=e49] [cursor=pointer]:
- /url: /cc-dashboard/live
- img [ref=e50]
- generic [ref=e52]: Live Feed
- link "Reports" [ref=e53] [cursor=pointer]:
- /url: /cc-dashboard/reports
- img [ref=e54]
- generic [ref=e56]: Reports
- link "Keys" [ref=e57] [cursor=pointer]:
- /url: /cc-dashboard/keys
- img [ref=e58]
- generic [ref=e60]: Keys
- link "DevOps" [ref=e61] [cursor=pointer]:
- /url: /cc-dashboard/devops
- img [ref=e62]
- generic [ref=e64]: DevOps
- link "Settings" [ref=e65] [cursor=pointer]:
- /url: /cc-dashboard/settings
- img [ref=e66]
- generic [ref=e69]: Settings
- link "Admin" [ref=e70] [cursor=pointer]:
- /url: /cc-dashboard/admin
- img [ref=e71]
- generic [ref=e73]: Admin
- generic [ref=e75]:
- generic [ref=e76]: VA
- generic [ref=e77]:
- paragraph [ref=e78]: vadymsamoilenko
- generic [ref=e81]: Online
- generic [ref=e82]:
- banner [ref=e83]:
- heading "Dashboard" [level=1] [ref=e85]
- button "Toggle dark mode" [ref=e86] [cursor=pointer]:
- img [ref=e87]
- generic [ref=e90]:
- generic [ref=e91]: VA
- generic [ref=e92]: vadymsamoilenko
- button "Sign out" [ref=e93] [cursor=pointer]:
- img [ref=e94]
- text: Sign out
- main [ref=e96]:
- generic [ref=e97]:
- generic [ref=e98]:
- heading "Overview" [level=2] [ref=e99]
- generic [ref=e100]:
- button "Today" [ref=e101] [cursor=pointer]
- button "7 days" [active] [ref=e102] [cursor=pointer]
- button "30 days" [ref=e103] [cursor=pointer]
- button "Custom" [ref=e104] [cursor=pointer]
- generic [ref=e105]:
- generic [ref=e108]:
- generic [ref=e109]:
- paragraph [ref=e110]: Total Hours
- paragraph [ref=e257]: 53h 1m
- img [ref=e114]
- generic [ref=e119]:
- generic [ref=e120]:
- paragraph [ref=e121]: Working Days
- paragraph [ref=e258]: "5"
- img [ref=e125]
- generic [ref=e130]:
- generic [ref=e131]:
- paragraph [ref=e132]: Projects
- paragraph [ref=e259]: "12"
- img [ref=e136]
- generic [ref=e141]:
- generic [ref=e142]:
- paragraph [ref=e143]: Avg / Day
- paragraph [ref=e260]: 10h 36m
- img [ref=e147]
- generic [ref=e152]:
- generic [ref=e153]:
- paragraph [ref=e154]: Top Project
- paragraph [ref=e261]: Video Accessibility
- img [ref=e158]
- generic [ref=e163]:
- generic [ref=e164]:
- paragraph [ref=e165]: Commits
- paragraph [ref=e262]: "156"
- img [ref=e169]
- generic [ref=e172]:
- generic [ref=e173]:
- heading "Hours by Day" [level=3] [ref=e175]
- generic [ref=e263]:
- 'generic "2026-04-29: 14h 20m" [ref=e264]'
- 'generic "2026-04-30: 13h 26m" [ref=e266]'
- 'generic "2026-05-01: 10h 56m" [ref=e268]'
- 'generic "2026-05-02: 0m" [ref=e270]'
- 'generic "2026-05-03: 0m" [ref=e272]'
- 'generic "2026-05-04: 0m" [ref=e274]'
- 'generic "2026-05-05: 5h 13m" [ref=e276]'
- 'generic "2026-05-06: 9h 5m" [ref=e278]'
- generic [ref=e180]:
- heading "By Day of Week" [level=3] [ref=e182]
- generic [ref=e280]:
- generic [ref=e281]:
- 'generic "Mon: 0m"'
- generic [ref=e282]: Mo
- generic [ref=e283]:
- 'generic "Tue: 5h 13m"'
- generic [ref=e284]: Tu
- generic [ref=e285]:
- 'generic "Wed: 23h 26m"'
- generic [ref=e286]: We
- generic [ref=e287]:
- 'generic "Thu: 13h 26m"'
- generic [ref=e288]: Th
- generic [ref=e289]:
- 'generic "Fri: 10h 56m"'
- generic [ref=e290]: Fr
- generic [ref=e291]:
- 'generic "Sat: 0m"'
- generic [ref=e292]: Sa
- generic [ref=e293]:
- 'generic "Sun: 0m"'
- generic [ref=e294]: Su
- generic [ref=e199]:
- generic [ref=e200]:
- heading "Tool Usage" [level=3] [ref=e202]
- generic [ref=e295]:
- generic [ref=e296]:
- generic [ref=e297]: Bash
- generic [ref=e299]: 0%
- generic [ref=e300]:
- generic [ref=e301]: Read
- generic [ref=e303]: 0%
- generic [ref=e304]:
- generic [ref=e305]: Edit
- generic [ref=e307]: 0%
- generic [ref=e308]:
- generic [ref=e309]: Write
- generic [ref=e311]: 0%
- generic [ref=e312]:
- generic [ref=e313]: mcp__playwright__browser_take_screenshot
- generic [ref=e315]: 0%
- generic [ref=e316]:
- generic [ref=e317]: Agent
- generic [ref=e319]: 0%
- generic [ref=e320]:
- generic [ref=e321]: mcp__playwright__browser_click
- generic [ref=e323]: 0%
- generic [ref=e324]:
- generic [ref=e325]: ToolSearch
- generic [ref=e327]: 0%
- generic [ref=e237]:
- heading "Projects" [level=3] [ref=e239]
- generic [ref=e328]:
- generic [ref=e330]:
- generic [ref=e331]: Video Accessibility
- generic [ref=e332]: 25h 41m
- generic [ref=e334]:
- generic [ref=e335]: General
- generic [ref=e336]: 3h 44m
- generic [ref=e338]:
- generic [ref=e339]: Cc Dashboard
- generic [ref=e340]: 3h 24m
- generic [ref=e342]:
- generic [ref=e343]: 3M Portal
- generic [ref=e344]: 2h 56m
- generic [ref=e346]:
- generic [ref=e347]: Cinema Studio Pro Kling
- generic [ref=e348]: 2h 2m
- generic [ref=e350]:
- generic [ref=e351]: Ford Qc
- generic [ref=e352]: 1h 55m
- generic [ref=e354]:
- generic [ref=e355]: Video Accessibility Old
- generic [ref=e356]: 1h 41m
- generic [ref=e358]:
- generic [ref=e359]: Oliver Sales Ops Platform
- generic [ref=e360]: 59m
- button "Open AI Assistant" [ref=e254] [cursor=pointer]:
- img [ref=e255]
- region "Notifications alt+T":
- list

Binary file not shown.

After

Width:  |  Height:  |  Size: 107 KiB

View file

@ -0,0 +1,4 @@
- generic [active]:
- generic:
- region "Notifications alt+T":
- list

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

View file

@ -0,0 +1,177 @@
- generic [ref=e2]:
- generic [ref=e19]:
- complementary [ref=e21]:
- generic [ref=e23]:
- img [ref=e25]
- generic [ref=e27]:
- paragraph [ref=e28]: CC Dashboard
- paragraph [ref=e29]: Oliver Agency
- navigation [ref=e30]:
- link "Dashboard" [ref=e31] [cursor=pointer]:
- /url: /cc-dashboard/
- img [ref=e33]
- generic [ref=e35]: Dashboard
- link "Calendar" [ref=e36] [cursor=pointer]:
- /url: /cc-dashboard/calendar
- img [ref=e37]
- generic [ref=e39]: Calendar
- link "Planner" [ref=e40] [cursor=pointer]:
- /url: /cc-dashboard/planner
- img [ref=e41]
- generic [ref=e43]: Planner
- link "Projects" [ref=e44] [cursor=pointer]:
- /url: /cc-dashboard/projects
- img [ref=e45]
- generic [ref=e47]: Projects
- link "Live Feed" [ref=e48] [cursor=pointer]:
- /url: /cc-dashboard/live
- img [ref=e49]
- generic [ref=e51]: Live Feed
- link "Reports" [ref=e52] [cursor=pointer]:
- /url: /cc-dashboard/reports
- img [ref=e53]
- generic [ref=e55]: Reports
- link "Keys" [ref=e56] [cursor=pointer]:
- /url: /cc-dashboard/keys
- img [ref=e57]
- generic [ref=e59]: Keys
- link "DevOps" [ref=e60] [cursor=pointer]:
- /url: /cc-dashboard/devops
- img [ref=e61]
- generic [ref=e63]: DevOps
- link "Settings" [ref=e64] [cursor=pointer]:
- /url: /cc-dashboard/settings
- img [ref=e65]
- generic [ref=e68]: Settings
- link "Admin" [ref=e69] [cursor=pointer]:
- /url: /cc-dashboard/admin
- img [ref=e70]
- generic [ref=e72]: Admin
- generic [ref=e74]:
- generic [ref=e75]: VA
- generic [ref=e76]:
- paragraph [ref=e77]: vadymsamoilenko
- generic [ref=e80]: Online
- generic [ref=e81]:
- banner [ref=e82]:
- heading "Dashboard" [level=1] [ref=e84]
- button "Toggle dark mode" [ref=e85] [cursor=pointer]:
- img [ref=e86]
- generic [ref=e89]:
- generic [ref=e90]: VA
- generic [ref=e91]: vadymsamoilenko
- button "Sign out" [ref=e92] [cursor=pointer]:
- img [ref=e93]
- text: Sign out
- main [ref=e95]:
- generic [ref=e96]:
- generic [ref=e97]:
- heading "Overview" [level=2] [ref=e98]
- generic [ref=e99]:
- button "Today" [ref=e100] [cursor=pointer]
- button "7 days" [ref=e101] [cursor=pointer]
- button "30 days" [ref=e102] [cursor=pointer]
- button "Custom" [ref=e103] [cursor=pointer]
- generic [ref=e104]:
- generic [ref=e107]:
- generic [ref=e108]:
- paragraph [ref=e109]: Total Hours
- paragraph [ref=e111]: 9h 11m
- img [ref=e113]
- generic [ref=e118]:
- generic [ref=e119]:
- paragraph [ref=e120]: Working Days
- paragraph [ref=e122]: "1"
- img [ref=e124]
- generic [ref=e129]:
- generic [ref=e130]:
- paragraph [ref=e131]: Projects
- paragraph [ref=e133]: "3"
- img [ref=e135]
- generic [ref=e140]:
- generic [ref=e141]:
- paragraph [ref=e142]: Avg / Day
- paragraph [ref=e144]: 9h 11m
- img [ref=e146]
- generic [ref=e151]:
- generic [ref=e152]:
- paragraph [ref=e153]: Top Project
- paragraph [ref=e155]: Cc Dashboard
- img [ref=e157]
- generic [ref=e162]:
- generic [ref=e163]:
- paragraph [ref=e164]: Commits
- paragraph [ref=e166]: "18"
- img [ref=e168]
- generic [ref=e171]:
- generic [ref=e172]:
- heading "Hours by Day" [level=3] [ref=e174]
- 'generic "2026-05-06: 9h 11m" [ref=e177]'
- generic [ref=e179]:
- heading "By Day of Week" [level=3] [ref=e181]
- generic [ref=e183]:
- generic [ref=e184]:
- 'generic "Mon: 0m"'
- generic [ref=e185]: Mo
- generic [ref=e186]:
- 'generic "Tue: 0m"'
- generic [ref=e187]: Tu
- generic [ref=e188]:
- 'generic "Wed: 9h 11m"'
- generic [ref=e189]: We
- generic [ref=e190]:
- 'generic "Thu: 0m"'
- generic [ref=e191]: Th
- generic [ref=e192]:
- 'generic "Fri: 0m"'
- generic [ref=e193]: Fr
- generic [ref=e194]:
- 'generic "Sat: 0m"'
- generic [ref=e195]: Sa
- generic [ref=e196]:
- 'generic "Sun: 0m"'
- generic [ref=e197]: Su
- generic [ref=e198]:
- generic [ref=e199]:
- heading "Tool Usage" [level=3] [ref=e201]
- generic [ref=e203]:
- generic [ref=e204]:
- generic [ref=e205]: Bash
- generic [ref=e207]: 0%
- generic [ref=e208]:
- generic [ref=e209]: Read
- generic [ref=e211]: 0%
- generic [ref=e212]:
- generic [ref=e213]: Edit
- generic [ref=e215]: 0%
- generic [ref=e216]:
- generic [ref=e217]: mcp__playwright__browser_click
- generic [ref=e219]: 0%
- generic [ref=e220]:
- generic [ref=e221]: mcp__playwright__browser_take_screenshot
- generic [ref=e223]: 0%
- generic [ref=e224]:
- generic [ref=e225]: Write
- generic [ref=e227]: 0%
- generic [ref=e228]:
- generic [ref=e229]: Agent
- generic [ref=e231]: 0%
- generic [ref=e232]:
- generic [ref=e233]: ToolSearch
- generic [ref=e235]: 0%
- generic [ref=e236]:
- heading "Projects" [level=3] [ref=e238]
- generic [ref=e240]:
- generic [ref=e242]:
- generic [ref=e243]: Cc Dashboard
- generic [ref=e244]: 3h 29m
- generic [ref=e246]:
- generic [ref=e247]: Video Accessibility
- generic [ref=e248]: 1h 22m
- generic [ref=e250]:
- generic [ref=e251]: Baic Dashboard
- generic [ref=e252]: 31m
- button "Open AI Assistant" [ref=e253] [cursor=pointer]:
- img [ref=e254]
- region "Notifications alt+T":
- list

Binary file not shown.

After

Width:  |  Height:  |  Size: 94 KiB

View file

@ -0,0 +1,200 @@
- generic [ref=e2]:
- generic [ref=e19]:
- complementary [ref=e21]:
- generic [ref=e23]:
- img [ref=e25]
- generic [ref=e27]:
- paragraph [ref=e28]: CC Dashboard
- paragraph [ref=e29]: Oliver Agency
- navigation [ref=e30]:
- link "Dashboard" [ref=e31] [cursor=pointer]:
- /url: /cc-dashboard/
- img [ref=e33]
- generic [ref=e35]: Dashboard
- link "Calendar" [ref=e36] [cursor=pointer]:
- /url: /cc-dashboard/calendar
- img [ref=e37]
- generic [ref=e39]: Calendar
- link "Planner" [ref=e40] [cursor=pointer]:
- /url: /cc-dashboard/planner
- img [ref=e41]
- generic [ref=e43]: Planner
- link "Projects" [ref=e44] [cursor=pointer]:
- /url: /cc-dashboard/projects
- img [ref=e45]
- generic [ref=e47]: Projects
- link "Live Feed" [ref=e48] [cursor=pointer]:
- /url: /cc-dashboard/live
- img [ref=e49]
- generic [ref=e51]: Live Feed
- link "Reports" [ref=e52] [cursor=pointer]:
- /url: /cc-dashboard/reports
- img [ref=e53]
- generic [ref=e55]: Reports
- link "Keys" [ref=e56] [cursor=pointer]:
- /url: /cc-dashboard/keys
- img [ref=e57]
- generic [ref=e59]: Keys
- link "DevOps" [ref=e60] [cursor=pointer]:
- /url: /cc-dashboard/devops
- img [ref=e61]
- generic [ref=e63]: DevOps
- link "Settings" [ref=e64] [cursor=pointer]:
- /url: /cc-dashboard/settings
- img [ref=e65]
- generic [ref=e68]: Settings
- link "Admin" [ref=e69] [cursor=pointer]:
- /url: /cc-dashboard/admin
- img [ref=e70]
- generic [ref=e72]: Admin
- generic [ref=e74]:
- generic [ref=e75]: VA
- generic [ref=e76]:
- paragraph [ref=e77]: vadymsamoilenko
- generic [ref=e80]: Online
- generic [ref=e81]:
- banner [ref=e82]:
- heading "Dashboard" [level=1] [ref=e84]
- button "Toggle dark mode" [ref=e85] [cursor=pointer]:
- img [ref=e86]
- generic [ref=e89]:
- generic [ref=e90]: VA
- generic [ref=e91]: vadymsamoilenko
- button "Sign out" [ref=e92] [cursor=pointer]:
- img [ref=e93]
- text: Sign out
- main [ref=e95]:
- generic [ref=e96]:
- generic [ref=e97]:
- heading "Overview" [level=2] [ref=e98]
- generic [ref=e99]:
- button "Today" [ref=e100] [cursor=pointer]
- button "7 days" [active] [ref=e101] [cursor=pointer]
- button "30 days" [ref=e102] [cursor=pointer]
- button "Custom" [ref=e103] [cursor=pointer]
- generic [ref=e104]:
- generic [ref=e107]:
- generic [ref=e108]:
- paragraph [ref=e109]: Total Hours
- paragraph [ref=e256]: 53h 6m
- img [ref=e113]
- generic [ref=e118]:
- generic [ref=e119]:
- paragraph [ref=e120]: Working Days
- paragraph [ref=e257]: "5"
- img [ref=e124]
- generic [ref=e129]:
- generic [ref=e130]:
- paragraph [ref=e131]: Projects
- paragraph [ref=e258]: "12"
- img [ref=e135]
- generic [ref=e140]:
- generic [ref=e141]:
- paragraph [ref=e142]: Avg / Day
- paragraph [ref=e259]: 10h 37m
- img [ref=e146]
- generic [ref=e151]:
- generic [ref=e152]:
- paragraph [ref=e153]: Top Project
- paragraph [ref=e260]: Video Accessibility
- img [ref=e157]
- generic [ref=e162]:
- generic [ref=e163]:
- paragraph [ref=e164]: Commits
- paragraph [ref=e261]: "156"
- img [ref=e168]
- generic [ref=e171]:
- generic [ref=e172]:
- heading "Hours by Day" [level=3] [ref=e174]
- generic [ref=e262]:
- 'generic "2026-04-29: 14h 20m" [ref=e263]'
- 'generic "2026-04-30: 13h 26m" [ref=e265]'
- 'generic "2026-05-01: 10h 56m" [ref=e267]'
- 'generic "2026-05-02: 0m" [ref=e269]'
- 'generic "2026-05-03: 0m" [ref=e271]'
- 'generic "2026-05-04: 0m" [ref=e273]'
- 'generic "2026-05-05: 5h 13m" [ref=e275]'
- 'generic "2026-05-06: 9h 11m" [ref=e277]'
- generic [ref=e179]:
- heading "By Day of Week" [level=3] [ref=e181]
- generic [ref=e279]:
- generic [ref=e280]:
- 'generic "Mon: 0m"'
- generic [ref=e281]: Mo
- generic [ref=e282]:
- 'generic "Tue: 5h 13m"'
- generic [ref=e283]: Tu
- generic [ref=e284]:
- 'generic "Wed: 23h 31m"'
- generic [ref=e285]: We
- generic [ref=e286]:
- 'generic "Thu: 13h 26m"'
- generic [ref=e287]: Th
- generic [ref=e288]:
- 'generic "Fri: 10h 56m"'
- generic [ref=e289]: Fr
- generic [ref=e290]:
- 'generic "Sat: 0m"'
- generic [ref=e291]: Sa
- generic [ref=e292]:
- 'generic "Sun: 0m"'
- generic [ref=e293]: Su
- generic [ref=e198]:
- generic [ref=e199]:
- heading "Tool Usage" [level=3] [ref=e201]
- generic [ref=e294]:
- generic [ref=e295]:
- generic [ref=e296]: Bash
- generic [ref=e298]: 0%
- generic [ref=e299]:
- generic [ref=e300]: Read
- generic [ref=e302]: 0%
- generic [ref=e303]:
- generic [ref=e304]: Edit
- generic [ref=e306]: 0%
- generic [ref=e307]:
- generic [ref=e308]: Write
- generic [ref=e310]: 0%
- generic [ref=e311]:
- generic [ref=e312]: mcp__playwright__browser_take_screenshot
- generic [ref=e314]: 0%
- generic [ref=e315]:
- generic [ref=e316]: Agent
- generic [ref=e318]: 0%
- generic [ref=e319]:
- generic [ref=e320]: mcp__playwright__browser_click
- generic [ref=e322]: 0%
- generic [ref=e323]:
- generic [ref=e324]: ToolSearch
- generic [ref=e326]: 0%
- generic [ref=e236]:
- heading "Projects" [level=3] [ref=e238]
- generic [ref=e327]:
- generic [ref=e329]:
- generic [ref=e330]: Video Accessibility
- generic [ref=e331]: 25h 41m
- generic [ref=e333]:
- generic [ref=e334]: General
- generic [ref=e335]: 3h 44m
- generic [ref=e337]:
- generic [ref=e338]: Cc Dashboard
- generic [ref=e339]: 3h 29m
- generic [ref=e341]:
- generic [ref=e342]: 3M Portal
- generic [ref=e343]: 2h 56m
- generic [ref=e345]:
- generic [ref=e346]: Cinema Studio Pro Kling
- generic [ref=e347]: 2h 2m
- generic [ref=e349]:
- generic [ref=e350]: Ford Qc
- generic [ref=e351]: 1h 55m
- generic [ref=e353]:
- generic [ref=e354]: Video Accessibility Old
- generic [ref=e355]: 1h 41m
- generic [ref=e357]:
- generic [ref=e358]: Oliver Sales Ops Platform
- generic [ref=e359]: 59m
- button "Open AI Assistant" [ref=e253] [cursor=pointer]:
- img [ref=e254]
- region "Notifications alt+T":
- list

Binary file not shown.

After

Width:  |  Height:  |  Size: 107 KiB

View file

@ -0,0 +1,4 @@
- generic [active]:
- generic:
- region "Notifications alt+T":
- list

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

View file

@ -0,0 +1,177 @@
- generic [ref=e2]:
- generic [ref=e19]:
- complementary [ref=e21]:
- generic [ref=e23]:
- img [ref=e25]
- generic [ref=e27]:
- paragraph [ref=e28]: CC Dashboard
- paragraph [ref=e29]: Oliver Agency
- navigation [ref=e30]:
- link "Dashboard" [ref=e31] [cursor=pointer]:
- /url: /cc-dashboard/
- img [ref=e33]
- generic [ref=e35]: Dashboard
- link "Calendar" [ref=e36] [cursor=pointer]:
- /url: /cc-dashboard/calendar
- img [ref=e37]
- generic [ref=e39]: Calendar
- link "Planner" [ref=e40] [cursor=pointer]:
- /url: /cc-dashboard/planner
- img [ref=e41]
- generic [ref=e43]: Planner
- link "Projects" [ref=e44] [cursor=pointer]:
- /url: /cc-dashboard/projects
- img [ref=e45]
- generic [ref=e47]: Projects
- link "Live Feed" [ref=e48] [cursor=pointer]:
- /url: /cc-dashboard/live
- img [ref=e49]
- generic [ref=e51]: Live Feed
- link "Reports" [ref=e52] [cursor=pointer]:
- /url: /cc-dashboard/reports
- img [ref=e53]
- generic [ref=e55]: Reports
- link "Keys" [ref=e56] [cursor=pointer]:
- /url: /cc-dashboard/keys
- img [ref=e57]
- generic [ref=e59]: Keys
- link "DevOps" [ref=e60] [cursor=pointer]:
- /url: /cc-dashboard/devops
- img [ref=e61]
- generic [ref=e63]: DevOps
- link "Settings" [ref=e64] [cursor=pointer]:
- /url: /cc-dashboard/settings
- img [ref=e65]
- generic [ref=e68]: Settings
- link "Admin" [ref=e69] [cursor=pointer]:
- /url: /cc-dashboard/admin
- img [ref=e70]
- generic [ref=e72]: Admin
- generic [ref=e74]:
- generic [ref=e75]: VA
- generic [ref=e76]:
- paragraph [ref=e77]: vadymsamoilenko
- generic [ref=e80]: Online
- generic [ref=e81]:
- banner [ref=e82]:
- heading "Dashboard" [level=1] [ref=e84]
- button "Toggle dark mode" [ref=e85] [cursor=pointer]:
- img [ref=e86]
- generic [ref=e89]:
- generic [ref=e90]: VA
- generic [ref=e91]: vadymsamoilenko
- button "Sign out" [ref=e92] [cursor=pointer]:
- img [ref=e93]
- text: Sign out
- main [ref=e95]:
- generic [ref=e96]:
- generic [ref=e97]:
- heading "Overview" [level=2] [ref=e98]
- generic [ref=e99]:
- button "Today" [ref=e100] [cursor=pointer]
- button "7 days" [ref=e101] [cursor=pointer]
- button "30 days" [ref=e102] [cursor=pointer]
- button "Custom" [ref=e103] [cursor=pointer]
- generic [ref=e104]:
- generic [ref=e107]:
- generic [ref=e108]:
- paragraph [ref=e109]: Total Hours
- paragraph [ref=e111]: 9h 14m
- img [ref=e113]
- generic [ref=e118]:
- generic [ref=e119]:
- paragraph [ref=e120]: Working Days
- paragraph [ref=e122]: "1"
- img [ref=e124]
- generic [ref=e129]:
- generic [ref=e130]:
- paragraph [ref=e131]: Projects
- paragraph [ref=e133]: "3"
- img [ref=e135]
- generic [ref=e140]:
- generic [ref=e141]:
- paragraph [ref=e142]: Avg / Day
- paragraph [ref=e144]: 9h 14m
- img [ref=e146]
- generic [ref=e151]:
- generic [ref=e152]:
- paragraph [ref=e153]: Top Project
- paragraph [ref=e155]: Cc Dashboard
- img [ref=e157]
- generic [ref=e162]:
- generic [ref=e163]:
- paragraph [ref=e164]: Commits
- paragraph [ref=e166]: "19"
- img [ref=e168]
- generic [ref=e171]:
- generic [ref=e172]:
- heading "Hours by Day" [level=3] [ref=e174]
- 'generic "2026-05-06: 9h 14m" [ref=e177]'
- generic [ref=e179]:
- heading "By Day of Week" [level=3] [ref=e181]
- generic [ref=e183]:
- generic [ref=e184]:
- 'generic "Mon: 0m"'
- generic [ref=e185]: Mo
- generic [ref=e186]:
- 'generic "Tue: 0m"'
- generic [ref=e187]: Tu
- generic [ref=e188]:
- 'generic "Wed: 9h 14m"'
- generic [ref=e189]: We
- generic [ref=e190]:
- 'generic "Thu: 0m"'
- generic [ref=e191]: Th
- generic [ref=e192]:
- 'generic "Fri: 0m"'
- generic [ref=e193]: Fr
- generic [ref=e194]:
- 'generic "Sat: 0m"'
- generic [ref=e195]: Sa
- generic [ref=e196]:
- 'generic "Sun: 0m"'
- generic [ref=e197]: Su
- generic [ref=e198]:
- generic [ref=e199]:
- heading "Tool Usage" [level=3] [ref=e201]
- generic [ref=e203]:
- generic [ref=e204]:
- generic [ref=e205]: Bash
- generic [ref=e208]: 49%
- generic [ref=e209]:
- generic [ref=e210]: Read
- generic [ref=e213]: 19%
- generic [ref=e214]:
- generic [ref=e215]: Edit
- generic [ref=e218]: 13%
- generic [ref=e219]:
- generic [ref=e220]: mcp__playwright__browser_click
- generic [ref=e223]: 4%
- generic [ref=e224]:
- generic [ref=e225]: mcp__playwright__browser_take_screenshot
- generic [ref=e228]: 3%
- generic [ref=e229]:
- generic [ref=e230]: Write
- generic [ref=e233]: 2%
- generic [ref=e234]:
- generic [ref=e235]: ToolSearch
- generic [ref=e238]: 2%
- generic [ref=e239]:
- generic [ref=e240]: Agent
- generic [ref=e243]: 2%
- generic [ref=e244]:
- heading "Projects" [level=3] [ref=e246]
- generic [ref=e248]:
- generic [ref=e250]:
- generic [ref=e251]: Cc Dashboard
- generic [ref=e252]: 3h 33m
- generic [ref=e254]:
- generic [ref=e255]: Video Accessibility
- generic [ref=e256]: 1h 22m
- generic [ref=e258]:
- generic [ref=e259]: Baic Dashboard
- generic [ref=e260]: 31m
- button "Open AI Assistant" [ref=e261] [cursor=pointer]:
- img [ref=e262]
- region "Notifications alt+T":
- list

View file

@ -0,0 +1,200 @@
- generic [ref=e2]:
- generic [ref=e19]:
- complementary [ref=e21]:
- generic [ref=e23]:
- img [ref=e25]
- generic [ref=e27]:
- paragraph [ref=e28]: CC Dashboard
- paragraph [ref=e29]: Oliver Agency
- navigation [ref=e30]:
- link "Dashboard" [ref=e31] [cursor=pointer]:
- /url: /cc-dashboard/
- img [ref=e33]
- generic [ref=e35]: Dashboard
- link "Calendar" [ref=e36] [cursor=pointer]:
- /url: /cc-dashboard/calendar
- img [ref=e37]
- generic [ref=e39]: Calendar
- link "Planner" [ref=e40] [cursor=pointer]:
- /url: /cc-dashboard/planner
- img [ref=e41]
- generic [ref=e43]: Planner
- link "Projects" [ref=e44] [cursor=pointer]:
- /url: /cc-dashboard/projects
- img [ref=e45]
- generic [ref=e47]: Projects
- link "Live Feed" [ref=e48] [cursor=pointer]:
- /url: /cc-dashboard/live
- img [ref=e49]
- generic [ref=e51]: Live Feed
- link "Reports" [ref=e52] [cursor=pointer]:
- /url: /cc-dashboard/reports
- img [ref=e53]
- generic [ref=e55]: Reports
- link "Keys" [ref=e56] [cursor=pointer]:
- /url: /cc-dashboard/keys
- img [ref=e57]
- generic [ref=e59]: Keys
- link "DevOps" [ref=e60] [cursor=pointer]:
- /url: /cc-dashboard/devops
- img [ref=e61]
- generic [ref=e63]: DevOps
- link "Settings" [ref=e64] [cursor=pointer]:
- /url: /cc-dashboard/settings
- img [ref=e65]
- generic [ref=e68]: Settings
- link "Admin" [ref=e69] [cursor=pointer]:
- /url: /cc-dashboard/admin
- img [ref=e70]
- generic [ref=e72]: Admin
- generic [ref=e74]:
- generic [ref=e75]: VA
- generic [ref=e76]:
- paragraph [ref=e77]: vadymsamoilenko
- generic [ref=e80]: Online
- generic [ref=e81]:
- banner [ref=e82]:
- heading "Dashboard" [level=1] [ref=e84]
- button "Toggle dark mode" [ref=e85] [cursor=pointer]:
- img [ref=e86]
- generic [ref=e89]:
- generic [ref=e90]: VA
- generic [ref=e91]: vadymsamoilenko
- button "Sign out" [ref=e92] [cursor=pointer]:
- img [ref=e93]
- text: Sign out
- main [ref=e95]:
- generic [ref=e96]:
- generic [ref=e97]:
- heading "Overview" [level=2] [ref=e98]
- generic [ref=e99]:
- button "Today" [ref=e100] [cursor=pointer]
- button "7 days" [active] [ref=e101] [cursor=pointer]
- button "30 days" [ref=e102] [cursor=pointer]
- button "Custom" [ref=e103] [cursor=pointer]
- generic [ref=e104]:
- generic [ref=e107]:
- generic [ref=e108]:
- paragraph [ref=e109]: Total Hours
- paragraph [ref=e264]: 53h 10m
- img [ref=e113]
- generic [ref=e118]:
- generic [ref=e119]:
- paragraph [ref=e120]: Working Days
- paragraph [ref=e265]: "5"
- img [ref=e124]
- generic [ref=e129]:
- generic [ref=e130]:
- paragraph [ref=e131]: Projects
- paragraph [ref=e266]: "12"
- img [ref=e135]
- generic [ref=e140]:
- generic [ref=e141]:
- paragraph [ref=e142]: Avg / Day
- paragraph [ref=e267]: 10h 38m
- img [ref=e146]
- generic [ref=e151]:
- generic [ref=e152]:
- paragraph [ref=e153]: Top Project
- paragraph [ref=e268]: Video Accessibility
- img [ref=e157]
- generic [ref=e162]:
- generic [ref=e163]:
- paragraph [ref=e164]: Commits
- paragraph [ref=e269]: "157"
- img [ref=e168]
- generic [ref=e171]:
- generic [ref=e172]:
- heading "Hours by Day" [level=3] [ref=e174]
- generic [ref=e270]:
- 'generic "2026-04-29: 14h 20m" [ref=e271]'
- 'generic "2026-04-30: 13h 26m" [ref=e273]'
- 'generic "2026-05-01: 10h 56m" [ref=e275]'
- 'generic "2026-05-02: 0m" [ref=e277]'
- 'generic "2026-05-03: 0m" [ref=e279]'
- 'generic "2026-05-04: 0m" [ref=e281]'
- 'generic "2026-05-05: 5h 13m" [ref=e283]'
- 'generic "2026-05-06: 9h 14m" [ref=e285]'
- generic [ref=e179]:
- heading "By Day of Week" [level=3] [ref=e181]
- generic [ref=e287]:
- generic [ref=e288]:
- 'generic "Mon: 0m"'
- generic [ref=e289]: Mo
- generic [ref=e290]:
- 'generic "Tue: 5h 13m"'
- generic [ref=e291]: Tu
- generic [ref=e292]:
- 'generic "Wed: 23h 35m"'
- generic [ref=e293]: We
- generic [ref=e294]:
- 'generic "Thu: 13h 26m"'
- generic [ref=e295]: Th
- generic [ref=e296]:
- 'generic "Fri: 10h 56m"'
- generic [ref=e297]: Fr
- generic [ref=e298]:
- 'generic "Sat: 0m"'
- generic [ref=e299]: Sa
- generic [ref=e300]:
- 'generic "Sun: 0m"'
- generic [ref=e301]: Su
- generic [ref=e198]:
- generic [ref=e199]:
- heading "Tool Usage" [level=3] [ref=e201]
- generic [ref=e302]:
- generic [ref=e303]:
- generic [ref=e304]: Bash
- generic [ref=e307]: 51%
- generic [ref=e308]:
- generic [ref=e309]: Read
- generic [ref=e312]: 21%
- generic [ref=e313]:
- generic [ref=e314]: Edit
- generic [ref=e317]: 17%
- generic [ref=e318]:
- generic [ref=e319]: Write
- generic [ref=e322]: 3%
- generic [ref=e323]:
- generic [ref=e324]: mcp__playwright__browser_take_screenshot
- generic [ref=e327]: 2%
- generic [ref=e328]:
- generic [ref=e329]: Agent
- generic [ref=e332]: 1%
- generic [ref=e333]:
- generic [ref=e334]: mcp__playwright__browser_click
- generic [ref=e337]: 1%
- generic [ref=e338]:
- generic [ref=e339]: ToolSearch
- generic [ref=e342]: 1%
- generic [ref=e244]:
- heading "Projects" [level=3] [ref=e246]
- generic [ref=e343]:
- generic [ref=e345]:
- generic [ref=e346]: Video Accessibility
- generic [ref=e347]: 25h 41m
- generic [ref=e349]:
- generic [ref=e350]: General
- generic [ref=e351]: 3h 44m
- generic [ref=e353]:
- generic [ref=e354]: Cc Dashboard
- generic [ref=e355]: 3h 33m
- generic [ref=e357]:
- generic [ref=e358]: 3M Portal
- generic [ref=e359]: 2h 56m
- generic [ref=e361]:
- generic [ref=e362]: Cinema Studio Pro Kling
- generic [ref=e363]: 2h 2m
- generic [ref=e365]:
- generic [ref=e366]: Ford Qc
- generic [ref=e367]: 1h 55m
- generic [ref=e369]:
- generic [ref=e370]: Video Accessibility Old
- generic [ref=e371]: 1h 41m
- generic [ref=e373]:
- generic [ref=e374]: Oliver Sales Ops Platform
- generic [ref=e375]: 59m
- button "Open AI Assistant" [ref=e261] [cursor=pointer]:
- img [ref=e262]
- region "Notifications alt+T":
- list

Binary file not shown.

After

Width:  |  Height:  |  Size: 107 KiB

View file

@ -0,0 +1,18 @@
- generic [ref=e2]:
- generic [ref=e4]:
- generic [ref=e5]:
- img [ref=e7]
- heading "CC Dashboard" [level=1] [ref=e9]
- paragraph [ref=e10]: Corporate Planning Hub
- generic [ref=e13]:
- generic [ref=e14]:
- text: Email
- textbox "Email" [ref=e15]:
- /placeholder: you@company.com
- generic [ref=e16]:
- text: Password
- textbox "Password" [ref=e17]:
- /placeholder: ••••••••
- button "Sign in" [ref=e18] [cursor=pointer]
- region "Notifications alt+T":
- list

View file

@ -0,0 +1,177 @@
- generic [ref=e2]:
- generic [ref=e19]:
- complementary [ref=e21]:
- generic [ref=e23]:
- img [ref=e25]
- generic [ref=e27]:
- paragraph [ref=e28]: CC Dashboard
- paragraph [ref=e29]: Oliver Agency
- navigation [ref=e30]:
- link "Dashboard" [ref=e31] [cursor=pointer]:
- /url: /cc-dashboard/
- img [ref=e33]
- generic [ref=e35]: Dashboard
- link "Calendar" [ref=e36] [cursor=pointer]:
- /url: /cc-dashboard/calendar
- img [ref=e37]
- generic [ref=e39]: Calendar
- link "Planner" [ref=e40] [cursor=pointer]:
- /url: /cc-dashboard/planner
- img [ref=e41]
- generic [ref=e43]: Planner
- link "Projects" [ref=e44] [cursor=pointer]:
- /url: /cc-dashboard/projects
- img [ref=e45]
- generic [ref=e47]: Projects
- link "Live Feed" [ref=e48] [cursor=pointer]:
- /url: /cc-dashboard/live
- img [ref=e49]
- generic [ref=e51]: Live Feed
- link "Reports" [ref=e52] [cursor=pointer]:
- /url: /cc-dashboard/reports
- img [ref=e53]
- generic [ref=e55]: Reports
- link "Keys" [ref=e56] [cursor=pointer]:
- /url: /cc-dashboard/keys
- img [ref=e57]
- generic [ref=e59]: Keys
- link "DevOps" [ref=e60] [cursor=pointer]:
- /url: /cc-dashboard/devops
- img [ref=e61]
- generic [ref=e63]: DevOps
- link "Settings" [ref=e64] [cursor=pointer]:
- /url: /cc-dashboard/settings
- img [ref=e65]
- generic [ref=e68]: Settings
- link "Admin" [ref=e69] [cursor=pointer]:
- /url: /cc-dashboard/admin
- img [ref=e70]
- generic [ref=e72]: Admin
- generic [ref=e74]:
- generic [ref=e75]: VA
- generic [ref=e76]:
- paragraph [ref=e77]: vadymsamoilenko
- generic [ref=e80]: Online
- generic [ref=e81]:
- banner [ref=e82]:
- heading "Dashboard" [level=1] [ref=e84]
- button "Toggle dark mode" [ref=e85] [cursor=pointer]:
- img [ref=e86]
- generic [ref=e89]:
- generic [ref=e90]: VA
- generic [ref=e91]: vadymsamoilenko
- button "Sign out" [ref=e92] [cursor=pointer]:
- img [ref=e93]
- text: Sign out
- main [ref=e95]:
- generic [ref=e96]:
- generic [ref=e97]:
- heading "Overview" [level=2] [ref=e98]
- generic [ref=e99]:
- button "Today" [ref=e100] [cursor=pointer]
- button "7 days" [ref=e101] [cursor=pointer]
- button "30 days" [ref=e102] [cursor=pointer]
- button "Custom" [ref=e103] [cursor=pointer]
- generic [ref=e104]:
- generic [ref=e107]:
- generic [ref=e108]:
- paragraph [ref=e109]: Total Hours
- paragraph [ref=e111]: 9h 14m
- img [ref=e113]
- generic [ref=e118]:
- generic [ref=e119]:
- paragraph [ref=e120]: Working Days
- paragraph [ref=e122]: "1"
- img [ref=e124]
- generic [ref=e129]:
- generic [ref=e130]:
- paragraph [ref=e131]: Projects
- paragraph [ref=e133]: "3"
- img [ref=e135]
- generic [ref=e140]:
- generic [ref=e141]:
- paragraph [ref=e142]: Avg / Day
- paragraph [ref=e144]: 9h 14m
- img [ref=e146]
- generic [ref=e151]:
- generic [ref=e152]:
- paragraph [ref=e153]: Top Project
- paragraph [ref=e155]: Cc Dashboard
- img [ref=e157]
- generic [ref=e162]:
- generic [ref=e163]:
- paragraph [ref=e164]: Commits
- paragraph [ref=e166]: "19"
- img [ref=e168]
- generic [ref=e171]:
- generic [ref=e172]:
- heading "Hours by Day" [level=3] [ref=e174]
- 'generic "2026-05-06: 9h 14m" [ref=e177]'
- generic [ref=e179]:
- heading "By Day of Week" [level=3] [ref=e181]
- generic [ref=e183]:
- generic [ref=e184]:
- 'generic "Mon: 0m"'
- generic [ref=e185]: Mo
- generic [ref=e186]:
- 'generic "Tue: 0m"'
- generic [ref=e187]: Tu
- generic [ref=e188]:
- 'generic "Wed: 9h 14m"'
- generic [ref=e189]: We
- generic [ref=e190]:
- 'generic "Thu: 0m"'
- generic [ref=e191]: Th
- generic [ref=e192]:
- 'generic "Fri: 0m"'
- generic [ref=e193]: Fr
- generic [ref=e194]:
- 'generic "Sat: 0m"'
- generic [ref=e195]: Sa
- generic [ref=e196]:
- 'generic "Sun: 0m"'
- generic [ref=e197]: Su
- generic [ref=e198]:
- generic [ref=e199]:
- heading "Tool Usage" [level=3] [ref=e201]
- generic [ref=e203]:
- generic [ref=e204]:
- generic [ref=e205]: Bash
- generic [ref=e208]: 49%
- generic [ref=e209]:
- generic [ref=e210]: Read
- generic [ref=e213]: 19%
- generic [ref=e214]:
- generic [ref=e215]: Edit
- generic [ref=e218]: 13%
- generic [ref=e219]:
- generic [ref=e220]: mcp__playwright__browser_click
- generic [ref=e223]: 4%
- generic [ref=e224]:
- generic [ref=e225]: mcp__playwright__browser_take_screenshot
- generic [ref=e228]: 3%
- generic [ref=e229]:
- generic [ref=e230]: Write
- generic [ref=e233]: 2%
- generic [ref=e234]:
- generic [ref=e235]: ToolSearch
- generic [ref=e238]: 2%
- generic [ref=e239]:
- generic [ref=e240]: Agent
- generic [ref=e243]: 2%
- generic [ref=e244]:
- heading "Projects" [level=3] [ref=e246]
- generic [ref=e248]:
- generic [ref=e250]:
- generic [ref=e251]: Cc Dashboard
- generic [ref=e252]: 3h 33m
- generic [ref=e254]:
- generic [ref=e255]: Video Accessibility
- generic [ref=e256]: 1h 22m
- generic [ref=e258]:
- generic [ref=e259]: Baic Dashboard
- generic [ref=e260]: 31m
- button "Open AI Assistant" [ref=e261] [cursor=pointer]:
- img [ref=e262]
- region "Notifications alt+T":
- list

View file

@ -0,0 +1,200 @@
- generic [ref=e2]:
- generic [ref=e19]:
- complementary [ref=e21]:
- generic [ref=e23]:
- img [ref=e25]
- generic [ref=e27]:
- paragraph [ref=e28]: CC Dashboard
- paragraph [ref=e29]: Oliver Agency
- navigation [ref=e30]:
- link "Dashboard" [ref=e31] [cursor=pointer]:
- /url: /cc-dashboard/
- img [ref=e33]
- generic [ref=e35]: Dashboard
- link "Calendar" [ref=e36] [cursor=pointer]:
- /url: /cc-dashboard/calendar
- img [ref=e37]
- generic [ref=e39]: Calendar
- link "Planner" [ref=e40] [cursor=pointer]:
- /url: /cc-dashboard/planner
- img [ref=e41]
- generic [ref=e43]: Planner
- link "Projects" [ref=e44] [cursor=pointer]:
- /url: /cc-dashboard/projects
- img [ref=e45]
- generic [ref=e47]: Projects
- link "Live Feed" [ref=e48] [cursor=pointer]:
- /url: /cc-dashboard/live
- img [ref=e49]
- generic [ref=e51]: Live Feed
- link "Reports" [ref=e52] [cursor=pointer]:
- /url: /cc-dashboard/reports
- img [ref=e53]
- generic [ref=e55]: Reports
- link "Keys" [ref=e56] [cursor=pointer]:
- /url: /cc-dashboard/keys
- img [ref=e57]
- generic [ref=e59]: Keys
- link "DevOps" [ref=e60] [cursor=pointer]:
- /url: /cc-dashboard/devops
- img [ref=e61]
- generic [ref=e63]: DevOps
- link "Settings" [ref=e64] [cursor=pointer]:
- /url: /cc-dashboard/settings
- img [ref=e65]
- generic [ref=e68]: Settings
- link "Admin" [ref=e69] [cursor=pointer]:
- /url: /cc-dashboard/admin
- img [ref=e70]
- generic [ref=e72]: Admin
- generic [ref=e74]:
- generic [ref=e75]: VA
- generic [ref=e76]:
- paragraph [ref=e77]: vadymsamoilenko
- generic [ref=e80]: Online
- generic [ref=e81]:
- banner [ref=e82]:
- heading "Dashboard" [level=1] [ref=e84]
- button "Toggle dark mode" [ref=e85] [cursor=pointer]:
- img [ref=e86]
- generic [ref=e89]:
- generic [ref=e90]: VA
- generic [ref=e91]: vadymsamoilenko
- button "Sign out" [ref=e92] [cursor=pointer]:
- img [ref=e93]
- text: Sign out
- main [ref=e95]:
- generic [ref=e96]:
- generic [ref=e97]:
- heading "Overview" [level=2] [ref=e98]
- generic [ref=e99]:
- button "Today" [ref=e100] [cursor=pointer]
- button "7 days" [active] [ref=e101] [cursor=pointer]
- button "30 days" [ref=e102] [cursor=pointer]
- button "Custom" [ref=e103] [cursor=pointer]
- generic [ref=e104]:
- generic [ref=e107]:
- generic [ref=e108]:
- paragraph [ref=e109]: Total Hours
- paragraph [ref=e264]: 53h 10m
- img [ref=e113]
- generic [ref=e118]:
- generic [ref=e119]:
- paragraph [ref=e120]: Working Days
- paragraph [ref=e265]: "5"
- img [ref=e124]
- generic [ref=e129]:
- generic [ref=e130]:
- paragraph [ref=e131]: Projects
- paragraph [ref=e266]: "12"
- img [ref=e135]
- generic [ref=e140]:
- generic [ref=e141]:
- paragraph [ref=e142]: Avg / Day
- paragraph [ref=e267]: 10h 38m
- img [ref=e146]
- generic [ref=e151]:
- generic [ref=e152]:
- paragraph [ref=e153]: Top Project
- paragraph [ref=e268]: Video Accessibility
- img [ref=e157]
- generic [ref=e162]:
- generic [ref=e163]:
- paragraph [ref=e164]: Commits
- paragraph [ref=e269]: "157"
- img [ref=e168]
- generic [ref=e171]:
- generic [ref=e172]:
- heading "Hours by Day" [level=3] [ref=e174]
- generic [ref=e270]:
- 'generic "2026-04-29: 14h 20m" [ref=e271]'
- 'generic "2026-04-30: 13h 26m" [ref=e273]'
- 'generic "2026-05-01: 10h 56m" [ref=e275]'
- 'generic "2026-05-02: 0m" [ref=e277]'
- 'generic "2026-05-03: 0m" [ref=e279]'
- 'generic "2026-05-04: 0m" [ref=e281]'
- 'generic "2026-05-05: 5h 13m" [ref=e283]'
- 'generic "2026-05-06: 9h 14m" [ref=e285]'
- generic [ref=e179]:
- heading "By Day of Week" [level=3] [ref=e181]
- generic [ref=e287]:
- generic [ref=e288]:
- 'generic "Mon: 0m"'
- generic [ref=e289]: Mo
- generic [ref=e290]:
- 'generic "Tue: 5h 13m"'
- generic [ref=e291]: Tu
- generic [ref=e292]:
- 'generic "Wed: 23h 35m"'
- generic [ref=e293]: We
- generic [ref=e294]:
- 'generic "Thu: 13h 26m"'
- generic [ref=e295]: Th
- generic [ref=e296]:
- 'generic "Fri: 10h 56m"'
- generic [ref=e297]: Fr
- generic [ref=e298]:
- 'generic "Sat: 0m"'
- generic [ref=e299]: Sa
- generic [ref=e300]:
- 'generic "Sun: 0m"'
- generic [ref=e301]: Su
- generic [ref=e198]:
- generic [ref=e199]:
- heading "Tool Usage" [level=3] [ref=e201]
- generic [ref=e302]:
- generic [ref=e303]:
- generic [ref=e304]: Bash
- generic [ref=e307]: 51%
- generic [ref=e308]:
- generic [ref=e309]: Read
- generic [ref=e312]: 21%
- generic [ref=e313]:
- generic [ref=e314]: Edit
- generic [ref=e317]: 17%
- generic [ref=e318]:
- generic [ref=e319]: Write
- generic [ref=e322]: 3%
- generic [ref=e323]:
- generic [ref=e324]: mcp__playwright__browser_take_screenshot
- generic [ref=e327]: 2%
- generic [ref=e328]:
- generic [ref=e329]: Agent
- generic [ref=e332]: 1%
- generic [ref=e333]:
- generic [ref=e334]: mcp__playwright__browser_click
- generic [ref=e337]: 1%
- generic [ref=e338]:
- generic [ref=e339]: ToolSearch
- generic [ref=e342]: 1%
- generic [ref=e244]:
- heading "Projects" [level=3] [ref=e246]
- generic [ref=e343]:
- generic [ref=e345]:
- generic [ref=e346]: Video Accessibility
- generic [ref=e347]: 25h 41m
- generic [ref=e349]:
- generic [ref=e350]: General
- generic [ref=e351]: 3h 44m
- generic [ref=e353]:
- generic [ref=e354]: Cc Dashboard
- generic [ref=e355]: 3h 33m
- generic [ref=e357]:
- generic [ref=e358]: 3M Portal
- generic [ref=e359]: 2h 56m
- generic [ref=e361]:
- generic [ref=e362]: Cinema Studio Pro Kling
- generic [ref=e363]: 2h 2m
- generic [ref=e365]:
- generic [ref=e366]: Ford Qc
- generic [ref=e367]: 1h 55m
- generic [ref=e369]:
- generic [ref=e370]: Video Accessibility Old
- generic [ref=e371]: 1h 41m
- generic [ref=e373]:
- generic [ref=e374]: Oliver Sales Ops Platform
- generic [ref=e375]: 59m
- button "Open AI Assistant" [ref=e261] [cursor=pointer]:
- img [ref=e262]
- region "Notifications alt+T":
- list

Binary file not shown.

After

Width:  |  Height:  |  Size: 107 KiB

View file

@ -0,0 +1,18 @@
- generic [ref=e2]:
- generic [ref=e4]:
- generic [ref=e5]:
- img [ref=e7]
- heading "CC Dashboard" [level=1] [ref=e9]
- paragraph [ref=e10]: Corporate Planning Hub
- generic [ref=e13]:
- generic [ref=e14]:
- text: Email
- textbox "Email" [ref=e15]:
- /placeholder: you@company.com
- generic [ref=e16]:
- text: Password
- textbox "Password" [ref=e17]:
- /placeholder: ••••••••
- button "Sign in" [ref=e18] [cursor=pointer]
- region "Notifications alt+T":
- list

View file

@ -0,0 +1,177 @@
- generic [ref=e2]:
- generic [ref=e19]:
- complementary [ref=e21]:
- generic [ref=e23]:
- img [ref=e25]
- generic [ref=e27]:
- paragraph [ref=e28]: CC Dashboard
- paragraph [ref=e29]: Oliver Agency
- navigation [ref=e30]:
- link "Dashboard" [ref=e31] [cursor=pointer]:
- /url: /cc-dashboard/
- img [ref=e33]
- generic [ref=e35]: Dashboard
- link "Calendar" [ref=e36] [cursor=pointer]:
- /url: /cc-dashboard/calendar
- img [ref=e37]
- generic [ref=e39]: Calendar
- link "Planner" [ref=e40] [cursor=pointer]:
- /url: /cc-dashboard/planner
- img [ref=e41]
- generic [ref=e43]: Planner
- link "Projects" [ref=e44] [cursor=pointer]:
- /url: /cc-dashboard/projects
- img [ref=e45]
- generic [ref=e47]: Projects
- link "Live Feed" [ref=e48] [cursor=pointer]:
- /url: /cc-dashboard/live
- img [ref=e49]
- generic [ref=e51]: Live Feed
- link "Reports" [ref=e52] [cursor=pointer]:
- /url: /cc-dashboard/reports
- img [ref=e53]
- generic [ref=e55]: Reports
- link "Keys" [ref=e56] [cursor=pointer]:
- /url: /cc-dashboard/keys
- img [ref=e57]
- generic [ref=e59]: Keys
- link "DevOps" [ref=e60] [cursor=pointer]:
- /url: /cc-dashboard/devops
- img [ref=e61]
- generic [ref=e63]: DevOps
- link "Settings" [ref=e64] [cursor=pointer]:
- /url: /cc-dashboard/settings
- img [ref=e65]
- generic [ref=e68]: Settings
- link "Admin" [ref=e69] [cursor=pointer]:
- /url: /cc-dashboard/admin
- img [ref=e70]
- generic [ref=e72]: Admin
- generic [ref=e74]:
- generic [ref=e75]: VA
- generic [ref=e76]:
- paragraph [ref=e77]: vadymsamoilenko
- generic [ref=e80]: Online
- generic [ref=e81]:
- banner [ref=e82]:
- heading "Dashboard" [level=1] [ref=e84]
- button "Toggle dark mode" [ref=e85] [cursor=pointer]:
- img [ref=e86]
- generic [ref=e89]:
- generic [ref=e90]: VA
- generic [ref=e91]: vadymsamoilenko
- button "Sign out" [ref=e92] [cursor=pointer]:
- img [ref=e93]
- text: Sign out
- main [ref=e95]:
- generic [ref=e96]:
- generic [ref=e97]:
- heading "Overview" [level=2] [ref=e98]
- generic [ref=e99]:
- button "Today" [ref=e100] [cursor=pointer]
- button "7 days" [ref=e101] [cursor=pointer]
- button "30 days" [ref=e102] [cursor=pointer]
- button "Custom" [ref=e103] [cursor=pointer]
- generic [ref=e104]:
- generic [ref=e107]:
- generic [ref=e108]:
- paragraph [ref=e109]: Total Hours
- paragraph [ref=e111]: 9h 14m
- img [ref=e113]
- generic [ref=e118]:
- generic [ref=e119]:
- paragraph [ref=e120]: Working Days
- paragraph [ref=e122]: "1"
- img [ref=e124]
- generic [ref=e129]:
- generic [ref=e130]:
- paragraph [ref=e131]: Projects
- paragraph [ref=e133]: "3"
- img [ref=e135]
- generic [ref=e140]:
- generic [ref=e141]:
- paragraph [ref=e142]: Avg / Day
- paragraph [ref=e144]: 9h 14m
- img [ref=e146]
- generic [ref=e151]:
- generic [ref=e152]:
- paragraph [ref=e153]: Top Project
- paragraph [ref=e155]: Cc Dashboard
- img [ref=e157]
- generic [ref=e162]:
- generic [ref=e163]:
- paragraph [ref=e164]: Commits
- paragraph [ref=e166]: "19"
- img [ref=e168]
- generic [ref=e171]:
- generic [ref=e172]:
- heading "Hours by Day" [level=3] [ref=e174]
- 'generic "2026-05-06: 9h 14m" [ref=e177]'
- generic [ref=e179]:
- heading "By Day of Week" [level=3] [ref=e181]
- generic [ref=e183]:
- generic [ref=e184]:
- 'generic "Mon: 0m"'
- generic [ref=e185]: Mo
- generic [ref=e186]:
- 'generic "Tue: 0m"'
- generic [ref=e187]: Tu
- generic [ref=e188]:
- 'generic "Wed: 9h 14m"'
- generic [ref=e189]: We
- generic [ref=e190]:
- 'generic "Thu: 0m"'
- generic [ref=e191]: Th
- generic [ref=e192]:
- 'generic "Fri: 0m"'
- generic [ref=e193]: Fr
- generic [ref=e194]:
- 'generic "Sat: 0m"'
- generic [ref=e195]: Sa
- generic [ref=e196]:
- 'generic "Sun: 0m"'
- generic [ref=e197]: Su
- generic [ref=e198]:
- generic [ref=e199]:
- heading "Tool Usage" [level=3] [ref=e201]
- generic [ref=e203]:
- generic [ref=e204]:
- generic [ref=e205]: Bash
- generic [ref=e208]: 49%
- generic [ref=e209]:
- generic [ref=e210]: Read
- generic [ref=e213]: 19%
- generic [ref=e214]:
- generic [ref=e215]: Edit
- generic [ref=e218]: 13%
- generic [ref=e219]:
- generic [ref=e220]: mcp__playwright__browser_click
- generic [ref=e223]: 4%
- generic [ref=e224]:
- generic [ref=e225]: mcp__playwright__browser_take_screenshot
- generic [ref=e228]: 3%
- generic [ref=e229]:
- generic [ref=e230]: Write
- generic [ref=e233]: 2%
- generic [ref=e234]:
- generic [ref=e235]: ToolSearch
- generic [ref=e238]: 2%
- generic [ref=e239]:
- generic [ref=e240]: Agent
- generic [ref=e243]: 2%
- generic [ref=e244]:
- heading "Projects" [level=3] [ref=e246]
- generic [ref=e248]:
- generic [ref=e250]:
- generic [ref=e251]: Cc Dashboard
- generic [ref=e252]: 3h 33m
- generic [ref=e254]:
- generic [ref=e255]: Video Accessibility
- generic [ref=e256]: 1h 22m
- generic [ref=e258]:
- generic [ref=e259]: Baic Dashboard
- generic [ref=e260]: 31m
- button "Open AI Assistant" [ref=e261] [cursor=pointer]:
- img [ref=e262]
- region "Notifications alt+T":
- list

View file

@ -0,0 +1,200 @@
- generic [ref=e2]:
- generic [ref=e19]:
- complementary [ref=e21]:
- generic [ref=e23]:
- img [ref=e25]
- generic [ref=e27]:
- paragraph [ref=e28]: CC Dashboard
- paragraph [ref=e29]: Oliver Agency
- navigation [ref=e30]:
- link "Dashboard" [ref=e31] [cursor=pointer]:
- /url: /cc-dashboard/
- img [ref=e33]
- generic [ref=e35]: Dashboard
- link "Calendar" [ref=e36] [cursor=pointer]:
- /url: /cc-dashboard/calendar
- img [ref=e37]
- generic [ref=e39]: Calendar
- link "Planner" [ref=e40] [cursor=pointer]:
- /url: /cc-dashboard/planner
- img [ref=e41]
- generic [ref=e43]: Planner
- link "Projects" [ref=e44] [cursor=pointer]:
- /url: /cc-dashboard/projects
- img [ref=e45]
- generic [ref=e47]: Projects
- link "Live Feed" [ref=e48] [cursor=pointer]:
- /url: /cc-dashboard/live
- img [ref=e49]
- generic [ref=e51]: Live Feed
- link "Reports" [ref=e52] [cursor=pointer]:
- /url: /cc-dashboard/reports
- img [ref=e53]
- generic [ref=e55]: Reports
- link "Keys" [ref=e56] [cursor=pointer]:
- /url: /cc-dashboard/keys
- img [ref=e57]
- generic [ref=e59]: Keys
- link "DevOps" [ref=e60] [cursor=pointer]:
- /url: /cc-dashboard/devops
- img [ref=e61]
- generic [ref=e63]: DevOps
- link "Settings" [ref=e64] [cursor=pointer]:
- /url: /cc-dashboard/settings
- img [ref=e65]
- generic [ref=e68]: Settings
- link "Admin" [ref=e69] [cursor=pointer]:
- /url: /cc-dashboard/admin
- img [ref=e70]
- generic [ref=e72]: Admin
- generic [ref=e74]:
- generic [ref=e75]: VA
- generic [ref=e76]:
- paragraph [ref=e77]: vadymsamoilenko
- generic [ref=e80]: Online
- generic [ref=e81]:
- banner [ref=e82]:
- heading "Dashboard" [level=1] [ref=e84]
- button "Toggle dark mode" [ref=e85] [cursor=pointer]:
- img [ref=e86]
- generic [ref=e89]:
- generic [ref=e90]: VA
- generic [ref=e91]: vadymsamoilenko
- button "Sign out" [ref=e92] [cursor=pointer]:
- img [ref=e93]
- text: Sign out
- main [ref=e95]:
- generic [ref=e96]:
- generic [ref=e97]:
- heading "Overview" [level=2] [ref=e98]
- generic [ref=e99]:
- button "Today" [ref=e100] [cursor=pointer]
- button "7 days" [active] [ref=e101] [cursor=pointer]
- button "30 days" [ref=e102] [cursor=pointer]
- button "Custom" [ref=e103] [cursor=pointer]
- generic [ref=e104]:
- generic [ref=e107]:
- generic [ref=e108]:
- paragraph [ref=e109]: Total Hours
- paragraph [ref=e264]: 53h 10m
- img [ref=e113]
- generic [ref=e118]:
- generic [ref=e119]:
- paragraph [ref=e120]: Working Days
- paragraph [ref=e265]: "5"
- img [ref=e124]
- generic [ref=e129]:
- generic [ref=e130]:
- paragraph [ref=e131]: Projects
- paragraph [ref=e266]: "12"
- img [ref=e135]
- generic [ref=e140]:
- generic [ref=e141]:
- paragraph [ref=e142]: Avg / Day
- paragraph [ref=e267]: 10h 38m
- img [ref=e146]
- generic [ref=e151]:
- generic [ref=e152]:
- paragraph [ref=e153]: Top Project
- paragraph [ref=e268]: Video Accessibility
- img [ref=e157]
- generic [ref=e162]:
- generic [ref=e163]:
- paragraph [ref=e164]: Commits
- paragraph [ref=e269]: "157"
- img [ref=e168]
- generic [ref=e171]:
- generic [ref=e172]:
- heading "Hours by Day" [level=3] [ref=e174]
- generic [ref=e270]:
- 'generic "2026-04-29: 14h 20m" [ref=e271]'
- 'generic "2026-04-30: 13h 26m" [ref=e273]'
- 'generic "2026-05-01: 10h 56m" [ref=e275]'
- 'generic "2026-05-02: 0m" [ref=e277]'
- 'generic "2026-05-03: 0m" [ref=e279]'
- 'generic "2026-05-04: 0m" [ref=e281]'
- 'generic "2026-05-05: 5h 13m" [ref=e283]'
- 'generic "2026-05-06: 9h 14m" [ref=e285]'
- generic [ref=e179]:
- heading "By Day of Week" [level=3] [ref=e181]
- generic [ref=e287]:
- generic [ref=e288]:
- 'generic "Mon: 0m"'
- generic [ref=e289]: Mo
- generic [ref=e290]:
- 'generic "Tue: 5h 13m"'
- generic [ref=e291]: Tu
- generic [ref=e292]:
- 'generic "Wed: 23h 35m"'
- generic [ref=e293]: We
- generic [ref=e294]:
- 'generic "Thu: 13h 26m"'
- generic [ref=e295]: Th
- generic [ref=e296]:
- 'generic "Fri: 10h 56m"'
- generic [ref=e297]: Fr
- generic [ref=e298]:
- 'generic "Sat: 0m"'
- generic [ref=e299]: Sa
- generic [ref=e300]:
- 'generic "Sun: 0m"'
- generic [ref=e301]: Su
- generic [ref=e198]:
- generic [ref=e199]:
- heading "Tool Usage" [level=3] [ref=e201]
- generic [ref=e302]:
- generic [ref=e303]:
- generic [ref=e304]: Bash
- generic [ref=e307]: 51%
- generic [ref=e308]:
- generic [ref=e309]: Read
- generic [ref=e312]: 21%
- generic [ref=e313]:
- generic [ref=e314]: Edit
- generic [ref=e317]: 17%
- generic [ref=e318]:
- generic [ref=e319]: Write
- generic [ref=e322]: 3%
- generic [ref=e323]:
- generic [ref=e324]: mcp__playwright__browser_take_screenshot
- generic [ref=e327]: 2%
- generic [ref=e328]:
- generic [ref=e329]: Agent
- generic [ref=e332]: 1%
- generic [ref=e333]:
- generic [ref=e334]: mcp__playwright__browser_click
- generic [ref=e337]: 1%
- generic [ref=e338]:
- generic [ref=e339]: ToolSearch
- generic [ref=e342]: 1%
- generic [ref=e244]:
- heading "Projects" [level=3] [ref=e246]
- generic [ref=e343]:
- generic [ref=e345]:
- generic [ref=e346]: Video Accessibility
- generic [ref=e347]: 25h 41m
- generic [ref=e349]:
- generic [ref=e350]: General
- generic [ref=e351]: 3h 44m
- generic [ref=e353]:
- generic [ref=e354]: Cc Dashboard
- generic [ref=e355]: 3h 33m
- generic [ref=e357]:
- generic [ref=e358]: 3M Portal
- generic [ref=e359]: 2h 56m
- generic [ref=e361]:
- generic [ref=e362]: Cinema Studio Pro Kling
- generic [ref=e363]: 2h 2m
- generic [ref=e365]:
- generic [ref=e366]: Ford Qc
- generic [ref=e367]: 1h 55m
- generic [ref=e369]:
- generic [ref=e370]: Video Accessibility Old
- generic [ref=e371]: 1h 41m
- generic [ref=e373]:
- generic [ref=e374]: Oliver Sales Ops Platform
- generic [ref=e375]: 59m
- button "Open AI Assistant" [ref=e261] [cursor=pointer]:
- img [ref=e262]
- region "Notifications alt+T":
- list

Binary file not shown.

After

Width:  |  Height:  |  Size: 107 KiB

View file

@ -0,0 +1,4 @@
- generic [active]:
- generic:
- region "Notifications alt+T":
- list

View file

@ -0,0 +1,177 @@
- generic [ref=e2]:
- generic [ref=e19]:
- complementary [ref=e21]:
- generic [ref=e23]:
- img [ref=e25]
- generic [ref=e27]:
- paragraph [ref=e28]: CC Dashboard
- paragraph [ref=e29]: Oliver Agency
- navigation [ref=e30]:
- link "Dashboard" [ref=e31] [cursor=pointer]:
- /url: /cc-dashboard/
- img [ref=e33]
- generic [ref=e35]: Dashboard
- link "Calendar" [ref=e36] [cursor=pointer]:
- /url: /cc-dashboard/calendar
- img [ref=e37]
- generic [ref=e39]: Calendar
- link "Planner" [ref=e40] [cursor=pointer]:
- /url: /cc-dashboard/planner
- img [ref=e41]
- generic [ref=e43]: Planner
- link "Projects" [ref=e44] [cursor=pointer]:
- /url: /cc-dashboard/projects
- img [ref=e45]
- generic [ref=e47]: Projects
- link "Live Feed" [ref=e48] [cursor=pointer]:
- /url: /cc-dashboard/live
- img [ref=e49]
- generic [ref=e51]: Live Feed
- link "Reports" [ref=e52] [cursor=pointer]:
- /url: /cc-dashboard/reports
- img [ref=e53]
- generic [ref=e55]: Reports
- link "Keys" [ref=e56] [cursor=pointer]:
- /url: /cc-dashboard/keys
- img [ref=e57]
- generic [ref=e59]: Keys
- link "DevOps" [ref=e60] [cursor=pointer]:
- /url: /cc-dashboard/devops
- img [ref=e61]
- generic [ref=e63]: DevOps
- link "Settings" [ref=e64] [cursor=pointer]:
- /url: /cc-dashboard/settings
- img [ref=e65]
- generic [ref=e68]: Settings
- link "Admin" [ref=e69] [cursor=pointer]:
- /url: /cc-dashboard/admin
- img [ref=e70]
- generic [ref=e72]: Admin
- generic [ref=e74]:
- generic [ref=e75]: VA
- generic [ref=e76]:
- paragraph [ref=e77]: vadymsamoilenko
- generic [ref=e80]: Online
- generic [ref=e81]:
- banner [ref=e82]:
- heading "Dashboard" [level=1] [ref=e84]
- button "Toggle dark mode" [ref=e85] [cursor=pointer]:
- img [ref=e86]
- generic [ref=e89]:
- generic [ref=e90]: VA
- generic [ref=e91]: vadymsamoilenko
- button "Sign out" [ref=e92] [cursor=pointer]:
- img [ref=e93]
- text: Sign out
- main [ref=e95]:
- generic [ref=e96]:
- generic [ref=e97]:
- heading "Overview" [level=2] [ref=e98]
- generic [ref=e99]:
- button "Today" [ref=e100] [cursor=pointer]
- button "7 days" [ref=e101] [cursor=pointer]
- button "30 days" [ref=e102] [cursor=pointer]
- button "Custom" [ref=e103] [cursor=pointer]
- generic [ref=e104]:
- generic [ref=e107]:
- generic [ref=e108]:
- paragraph [ref=e109]: Total Hours
- paragraph [ref=e111]: 9h 14m
- img [ref=e113]
- generic [ref=e118]:
- generic [ref=e119]:
- paragraph [ref=e120]: Working Days
- paragraph [ref=e122]: "1"
- img [ref=e124]
- generic [ref=e129]:
- generic [ref=e130]:
- paragraph [ref=e131]: Projects
- paragraph [ref=e133]: "3"
- img [ref=e135]
- generic [ref=e140]:
- generic [ref=e141]:
- paragraph [ref=e142]: Avg / Day
- paragraph [ref=e144]: 9h 14m
- img [ref=e146]
- generic [ref=e151]:
- generic [ref=e152]:
- paragraph [ref=e153]: Top Project
- paragraph [ref=e155]: Cc Dashboard
- img [ref=e157]
- generic [ref=e162]:
- generic [ref=e163]:
- paragraph [ref=e164]: Commits
- paragraph [ref=e166]: "19"
- img [ref=e168]
- generic [ref=e171]:
- generic [ref=e172]:
- heading "Hours by Day" [level=3] [ref=e174]
- 'generic "2026-05-06: 9h 14m" [ref=e177]'
- generic [ref=e178]:
- heading "By Day of Week" [level=3] [ref=e180]
- generic [ref=e182]:
- generic [ref=e183]:
- 'generic "Mon: 0m" [ref=e184]'
- generic [ref=e185]: Mo
- generic [ref=e186]:
- 'generic "Tue: 0m" [ref=e187]'
- generic [ref=e188]: Tu
- generic [ref=e189]:
- 'generic "Wed: 9h 14m" [ref=e190]'
- generic [ref=e191]: We
- generic [ref=e192]:
- 'generic "Thu: 0m" [ref=e193]'
- generic [ref=e194]: Th
- generic [ref=e195]:
- 'generic "Fri: 0m" [ref=e196]'
- generic [ref=e197]: Fr
- generic [ref=e198]:
- 'generic "Sat: 0m" [ref=e199]'
- generic [ref=e200]: Sa
- generic [ref=e201]:
- 'generic "Sun: 0m" [ref=e202]'
- generic [ref=e203]: Su
- generic [ref=e204]:
- generic [ref=e205]:
- heading "Tool Usage" [level=3] [ref=e207]
- generic [ref=e209]:
- generic [ref=e210]:
- generic [ref=e211]: Bash
- generic [ref=e214]: 49%
- generic [ref=e215]:
- generic [ref=e216]: Read
- generic [ref=e219]: 19%
- generic [ref=e220]:
- generic [ref=e221]: Edit
- generic [ref=e224]: 13%
- generic [ref=e225]:
- generic [ref=e226]: mcp__playwright__browser_click
- generic [ref=e229]: 4%
- generic [ref=e230]:
- generic [ref=e231]: mcp__playwright__browser_take_screenshot
- generic [ref=e234]: 3%
- generic [ref=e235]:
- generic [ref=e236]: Write
- generic [ref=e239]: 2%
- generic [ref=e240]:
- generic [ref=e241]: ToolSearch
- generic [ref=e244]: 2%
- generic [ref=e245]:
- generic [ref=e246]: Agent
- generic [ref=e249]: 2%
- generic [ref=e250]:
- heading "Projects" [level=3] [ref=e252]
- generic [ref=e254]:
- generic [ref=e256]:
- generic [ref=e257]: Cc Dashboard
- generic [ref=e258]: 3h 33m
- generic [ref=e260]:
- generic [ref=e261]: Video Accessibility
- generic [ref=e262]: 1h 22m
- generic [ref=e264]:
- generic [ref=e265]: Baic Dashboard
- generic [ref=e266]: 31m
- button "Open AI Assistant" [ref=e267] [cursor=pointer]:
- img [ref=e268]
- region "Notifications alt+T":
- list

View file

@ -0,0 +1,200 @@
- generic [ref=e2]:
- generic [ref=e19]:
- complementary [ref=e21]:
- generic [ref=e23]:
- img [ref=e25]
- generic [ref=e27]:
- paragraph [ref=e28]: CC Dashboard
- paragraph [ref=e29]: Oliver Agency
- navigation [ref=e30]:
- link "Dashboard" [ref=e31] [cursor=pointer]:
- /url: /cc-dashboard/
- img [ref=e33]
- generic [ref=e35]: Dashboard
- link "Calendar" [ref=e36] [cursor=pointer]:
- /url: /cc-dashboard/calendar
- img [ref=e37]
- generic [ref=e39]: Calendar
- link "Planner" [ref=e40] [cursor=pointer]:
- /url: /cc-dashboard/planner
- img [ref=e41]
- generic [ref=e43]: Planner
- link "Projects" [ref=e44] [cursor=pointer]:
- /url: /cc-dashboard/projects
- img [ref=e45]
- generic [ref=e47]: Projects
- link "Live Feed" [ref=e48] [cursor=pointer]:
- /url: /cc-dashboard/live
- img [ref=e49]
- generic [ref=e51]: Live Feed
- link "Reports" [ref=e52] [cursor=pointer]:
- /url: /cc-dashboard/reports
- img [ref=e53]
- generic [ref=e55]: Reports
- link "Keys" [ref=e56] [cursor=pointer]:
- /url: /cc-dashboard/keys
- img [ref=e57]
- generic [ref=e59]: Keys
- link "DevOps" [ref=e60] [cursor=pointer]:
- /url: /cc-dashboard/devops
- img [ref=e61]
- generic [ref=e63]: DevOps
- link "Settings" [ref=e64] [cursor=pointer]:
- /url: /cc-dashboard/settings
- img [ref=e65]
- generic [ref=e68]: Settings
- link "Admin" [ref=e69] [cursor=pointer]:
- /url: /cc-dashboard/admin
- img [ref=e70]
- generic [ref=e72]: Admin
- generic [ref=e74]:
- generic [ref=e75]: VA
- generic [ref=e76]:
- paragraph [ref=e77]: vadymsamoilenko
- generic [ref=e80]: Online
- generic [ref=e81]:
- banner [ref=e82]:
- heading "Dashboard" [level=1] [ref=e84]
- button "Toggle dark mode" [ref=e85] [cursor=pointer]:
- img [ref=e86]
- generic [ref=e89]:
- generic [ref=e90]: VA
- generic [ref=e91]: vadymsamoilenko
- button "Sign out" [ref=e92] [cursor=pointer]:
- img [ref=e93]
- text: Sign out
- main [ref=e95]:
- generic [ref=e96]:
- generic [ref=e97]:
- heading "Overview" [level=2] [ref=e98]
- generic [ref=e99]:
- button "Today" [ref=e100] [cursor=pointer]
- button "7 days" [active] [ref=e101] [cursor=pointer]
- button "30 days" [ref=e102] [cursor=pointer]
- button "Custom" [ref=e103] [cursor=pointer]
- generic [ref=e104]:
- generic [ref=e107]:
- generic [ref=e108]:
- paragraph [ref=e109]: Total Hours
- paragraph [ref=e270]: 53h 10m
- img [ref=e113]
- generic [ref=e118]:
- generic [ref=e119]:
- paragraph [ref=e120]: Working Days
- paragraph [ref=e271]: "5"
- img [ref=e124]
- generic [ref=e129]:
- generic [ref=e130]:
- paragraph [ref=e131]: Projects
- paragraph [ref=e272]: "12"
- img [ref=e135]
- generic [ref=e140]:
- generic [ref=e141]:
- paragraph [ref=e142]: Avg / Day
- paragraph [ref=e273]: 10h 38m
- img [ref=e146]
- generic [ref=e151]:
- generic [ref=e152]:
- paragraph [ref=e153]: Top Project
- paragraph [ref=e274]: Video Accessibility
- img [ref=e157]
- generic [ref=e162]:
- generic [ref=e163]:
- paragraph [ref=e164]: Commits
- paragraph [ref=e275]: "157"
- img [ref=e168]
- generic [ref=e171]:
- generic [ref=e172]:
- heading "Hours by Day" [level=3] [ref=e174]
- generic [ref=e276]:
- 'generic "2026-04-29: 14h 20m" [ref=e277]'
- 'generic "2026-04-30: 13h 26m" [ref=e278]'
- 'generic "2026-05-01: 10h 56m" [ref=e279]'
- 'generic "2026-05-02: 0m" [ref=e280]'
- 'generic "2026-05-03: 0m" [ref=e281]'
- 'generic "2026-05-04: 0m" [ref=e282]'
- 'generic "2026-05-05: 5h 13m" [ref=e283]'
- 'generic "2026-05-06: 9h 14m" [ref=e284]'
- generic [ref=e178]:
- heading "By Day of Week" [level=3] [ref=e180]
- generic [ref=e285]:
- generic [ref=e286]:
- 'generic "Mon: 0m" [ref=e287]'
- generic [ref=e288]: Mo
- generic [ref=e289]:
- 'generic "Tue: 5h 13m" [ref=e290]'
- generic [ref=e291]: Tu
- generic [ref=e292]:
- 'generic "Wed: 23h 35m" [ref=e293]'
- generic [ref=e294]: We
- generic [ref=e295]:
- 'generic "Thu: 13h 26m" [ref=e296]'
- generic [ref=e297]: Th
- generic [ref=e298]:
- 'generic "Fri: 10h 56m" [ref=e299]'
- generic [ref=e300]: Fr
- generic [ref=e301]:
- 'generic "Sat: 0m" [ref=e302]'
- generic [ref=e303]: Sa
- generic [ref=e304]:
- 'generic "Sun: 0m" [ref=e305]'
- generic [ref=e306]: Su
- generic [ref=e204]:
- generic [ref=e205]:
- heading "Tool Usage" [level=3] [ref=e207]
- generic [ref=e307]:
- generic [ref=e308]:
- generic [ref=e309]: Bash
- generic [ref=e312]: 51%
- generic [ref=e313]:
- generic [ref=e314]: Read
- generic [ref=e317]: 21%
- generic [ref=e318]:
- generic [ref=e319]: Edit
- generic [ref=e322]: 17%
- generic [ref=e323]:
- generic [ref=e324]: Write
- generic [ref=e327]: 3%
- generic [ref=e328]:
- generic [ref=e329]: mcp__playwright__browser_take_screenshot
- generic [ref=e332]: 2%
- generic [ref=e333]:
- generic [ref=e334]: Agent
- generic [ref=e337]: 1%
- generic [ref=e338]:
- generic [ref=e339]: mcp__playwright__browser_click
- generic [ref=e342]: 1%
- generic [ref=e343]:
- generic [ref=e344]: ToolSearch
- generic [ref=e347]: 1%
- generic [ref=e250]:
- heading "Projects" [level=3] [ref=e252]
- generic [ref=e348]:
- generic [ref=e350]:
- generic [ref=e351]: Video Accessibility
- generic [ref=e352]: 25h 41m
- generic [ref=e354]:
- generic [ref=e355]: General
- generic [ref=e356]: 3h 44m
- generic [ref=e358]:
- generic [ref=e359]: Cc Dashboard
- generic [ref=e360]: 3h 33m
- generic [ref=e362]:
- generic [ref=e363]: 3M Portal
- generic [ref=e364]: 2h 56m
- generic [ref=e366]:
- generic [ref=e367]: Cinema Studio Pro Kling
- generic [ref=e368]: 2h 2m
- generic [ref=e370]:
- generic [ref=e371]: Ford Qc
- generic [ref=e372]: 1h 55m
- generic [ref=e374]:
- generic [ref=e375]: Video Accessibility Old
- generic [ref=e376]: 1h 41m
- generic [ref=e378]:
- generic [ref=e379]: Oliver Sales Ops Platform
- generic [ref=e380]: 59m
- button "Open AI Assistant" [ref=e267] [cursor=pointer]:
- img [ref=e268]
- region "Notifications alt+T":
- list

Binary file not shown.

After

Width:  |  Height:  |  Size: 108 KiB

View file

@ -22,3 +22,12 @@
RequestHeader set X-Forwarded-For "%{REMOTE_ADDR}s"
RequestHeader set X-Forwarded-Proto "https"
</Location>
# Planka kanban board
<Location /board/>
ProxyPreserveHost On
ProxyPass http://127.0.0.1:1337/
ProxyPassReverse http://127.0.0.1:1337/
RequestHeader set X-Forwarded-For "%{REMOTE_ADDR}s"
RequestHeader set X-Forwarded-Proto "https"
</Location>

View file

@ -26,5 +26,42 @@ services:
retries: 10
restart: unless-stopped
planka:
image: ghcr.io/plankanban/planka:latest
restart: unless-stopped
ports:
- "1337:1337"
environment:
BASE_URL: ${PLANKA_BASE_URL:-https://optical-dev.oliver.solutions/board}
DATABASE_URL: postgresql://planka:planka@planka-db:5432/planka
SECRET_KEY: ${PLANKA_SECRET_KEY}
TRUST_PROXY: "1"
volumes:
- planka-avatars:/app/public/user-avatars
- planka-backgrounds:/app/public/project-background-images
- planka-attachments:/app/private/attachments
depends_on:
planka-db:
condition: service_healthy
planka-db:
image: postgres:16-alpine
restart: unless-stopped
environment:
POSTGRES_DB: planka
POSTGRES_USER: planka
POSTGRES_PASSWORD: planka
volumes:
- planka-db-data:/var/lib/postgresql/data
healthcheck:
test: ["CMD-SHELL", "pg_isready -U planka -d planka"]
interval: 5s
timeout: 3s
retries: 10
volumes:
pgdata:
planka-db-data:
planka-avatars:
planka-backgrounds:
planka-attachments:

View file

@ -1 +1 @@
import{d as _,u as y,x as h,c as r,a as t,e as n,k as v,w as d,f as b,q as m,o as s,F as g,r as k,t as a,p as u,h as A}from"./index-Coy22yOp.js";import{a as w}from"./admin-p6BxWcDa.js";import{_ as B,a as S}from"./CardContent.vue_vue_type_script_setup_true_lang-DUVu0jq9.js";import{_ as f}from"./Badge.vue_vue_type_script_setup_true_lang-CLRDsB_H.js";import{_ as V}from"./Spinner.vue_vue_type_script_setup_true_lang-B7DG-xnx.js";import{a as $}from"./utils-7WVCegLb.js";const N={class:"p-6"},C={key:0,class:"flex items-center justify-center h-20"},D={class:"w-full"},E={class:"px-4 py-3"},F={class:"text-sm font-medium text-foreground"},R={class:"px-4 py-3 text-sm text-muted-foreground"},U={class:"px-4 py-3"},j={class:"px-4 py-3"},q={class:"px-4 py-3 text-xs text-muted-foreground"},H=_({__name:"AdminView",setup(I){const x=y(),p=b(),i=m([]),l=m(!1);return h(async()=>{if(!x.isAdmin){p.push("/");return}l.value=!0;try{const c=await w.users();i.value=c.data}finally{l.value=!1}}),(c,o)=>(s(),r("div",N,[o[1]||(o[1]=t("h2",{class:"text-lg font-semibold text-foreground mb-6"},"Admin — Users",-1)),l.value?(s(),r("div",C,[n(V,{class:"text-primary"})])):(s(),v(B,{key:1},{default:d(()=>[n(S,{class:"p-0"},{default:d(()=>[t("table",D,[o[0]||(o[0]=t("thead",null,[t("tr",{class:"border-b border-border"},[t("th",{class:"text-left text-xs font-medium text-muted-foreground px-4 py-3"},"User"),t("th",{class:"text-left text-xs font-medium text-muted-foreground px-4 py-3"},"Email"),t("th",{class:"text-left text-xs font-medium text-muted-foreground px-4 py-3"},"Role"),t("th",{class:"text-left text-xs font-medium text-muted-foreground px-4 py-3"},"Status"),t("th",{class:"text-left text-xs font-medium text-muted-foreground px-4 py-3"},"Joined")])],-1)),t("tbody",null,[(s(!0),r(g,null,k(i.value,e=>(s(),r("tr",{key:e.id,class:"border-b border-border last:border-0 hover:bg-muted/30"},[t("td",E,[t("p",F,a(e.username),1)]),t("td",R,a(e.email),1),t("td",U,[n(f,{variant:e.role==="admin"?"default":"secondary",class:"text-xs"},{default:d(()=>[u(a(e.role),1)]),_:2},1032,["variant"])]),t("td",j,[n(f,{variant:e.is_active?"success":"outline",class:"text-xs"},{default:d(()=>[u(a(e.is_active?"Active":"Inactive"),1)]),_:2},1032,["variant"])]),t("td",q,a(A($)(e.created_at)),1)]))),128))])])]),_:1})]),_:1}))]))}});export{H as default};
import{d as p,u as y,y as h,c as r,a as t,e as n,k as v,w as d,f as b,s as m,o as s,F as g,r as k,t as a,q as u,h as A}from"./index-BP_aNEdP.js";import{a as w}from"./admin-C27haAMd.js";import{_ as B,a as S}from"./CardContent.vue_vue_type_script_setup_true_lang-B8VjSxLa.js";import{_ as f}from"./Badge.vue_vue_type_script_setup_true_lang-B2H6z2RD.js";import{_ as V}from"./Spinner.vue_vue_type_script_setup_true_lang-Cu49-Cc4.js";import{a as $}from"./utils-7WVCegLb.js";const N={class:"p-6"},C={key:0,class:"flex items-center justify-center h-20"},D={class:"w-full"},E={class:"px-4 py-3"},F={class:"text-sm font-medium text-foreground"},R={class:"px-4 py-3 text-sm text-muted-foreground"},U={class:"px-4 py-3"},j={class:"px-4 py-3"},q={class:"px-4 py-3 text-xs text-muted-foreground"},H=p({__name:"AdminView",setup(I){const x=y(),_=b(),i=m([]),l=m(!1);return h(async()=>{if(!x.isAdmin){_.push("/");return}l.value=!0;try{const c=await w.users();i.value=c.data}finally{l.value=!1}}),(c,o)=>(s(),r("div",N,[o[1]||(o[1]=t("h2",{class:"text-lg font-semibold text-foreground mb-6"},"Admin — Users",-1)),l.value?(s(),r("div",C,[n(V,{class:"text-primary"})])):(s(),v(B,{key:1},{default:d(()=>[n(S,{class:"p-0"},{default:d(()=>[t("table",D,[o[0]||(o[0]=t("thead",null,[t("tr",{class:"border-b border-border"},[t("th",{class:"text-left text-xs font-medium text-muted-foreground px-4 py-3"},"User"),t("th",{class:"text-left text-xs font-medium text-muted-foreground px-4 py-3"},"Email"),t("th",{class:"text-left text-xs font-medium text-muted-foreground px-4 py-3"},"Role"),t("th",{class:"text-left text-xs font-medium text-muted-foreground px-4 py-3"},"Status"),t("th",{class:"text-left text-xs font-medium text-muted-foreground px-4 py-3"},"Joined")])],-1)),t("tbody",null,[(s(!0),r(g,null,k(i.value,e=>(s(),r("tr",{key:e.id,class:"border-b border-border last:border-0 hover:bg-muted/30"},[t("td",E,[t("p",F,a(e.username),1)]),t("td",R,a(e.email),1),t("td",U,[n(f,{variant:e.role==="admin"?"default":"secondary",class:"text-xs"},{default:d(()=>[u(a(e.role),1)]),_:2},1032,["variant"])]),t("td",j,[n(f,{variant:e.is_active?"success":"outline",class:"text-xs"},{default:d(()=>[u(a(e.is_active?"Active":"Inactive"),1)]),_:2},1032,["variant"])]),t("td",q,a(A($)(e.created_at)),1)]))),128))])])]),_:1})]),_:1}))]))}});export{H as default};

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View file

@ -1 +1 @@
import{c as a}from"./utils-7WVCegLb.js";import{d as n,o,c as s,n as d,h as i,m as c}from"./index-Coy22yOp.js";const f=n({__name:"Badge",props:{variant:{default:"default"},class:{}},setup(r){const e=r;return(t,l)=>(o(),s("span",{class:d(i(a)("inline-flex items-center rounded-full px-2.5 py-0.5 text-xs font-semibold transition-colors",{"bg-primary text-primary-foreground":e.variant==="default","bg-secondary text-secondary-foreground":e.variant==="secondary","bg-destructive text-destructive-foreground":e.variant==="destructive","border border-border text-foreground":e.variant==="outline","bg-emerald-500/20 text-emerald-400":e.variant==="success","bg-amber-500/20 text-amber-400":e.variant==="warning"},e.class))},[c(t.$slots,"default")],2))}});export{f as _};
import{c as a}from"./utils-7WVCegLb.js";import{d as n,o,c as s,n as d,h as i,p as c}from"./index-BP_aNEdP.js";const f=n({__name:"Badge",props:{variant:{default:"default"},class:{}},setup(r){const e=r;return(t,l)=>(o(),s("span",{class:d(i(a)("inline-flex items-center rounded-full px-2.5 py-0.5 text-xs font-semibold transition-colors",{"bg-primary text-primary-foreground":e.variant==="default","bg-secondary text-secondary-foreground":e.variant==="secondary","bg-destructive text-destructive-foreground":e.variant==="destructive","border border-border text-foreground":e.variant==="outline","bg-emerald-500/20 text-emerald-400":e.variant==="success","bg-amber-500/20 text-amber-400":e.variant==="warning"},e.class))},[c(t.$slots,"default")],2))}});export{f as _};

View file

@ -1 +1 @@
import{_ as c}from"./Spinner.vue_vue_type_script_setup_true_lang-B7DG-xnx.js";import{c as l}from"./utils-7WVCegLb.js";import{d as u,c as m,n as f,k as b,i as v,m as g,j as p,o as n}from"./index-Coy22yOp.js";const y=["type","disabled"],z=u({__name:"Button",props:{variant:{default:"default"},size:{default:"md"},loading:{type:Boolean,default:!1},disabled:{type:Boolean,default:!1},type:{default:"button"},class:{}},emits:["click"],setup(t,{emit:s}){const e=t,a=s,r=p(()=>l("inline-flex items-center justify-center rounded-md font-medium transition-colors","focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2","disabled:pointer-events-none disabled:opacity-50",{"bg-primary text-primary-foreground hover:bg-primary/90":e.variant==="default","border border-input bg-background hover:bg-accent hover:text-accent-foreground":e.variant==="outline","hover:bg-accent hover:text-accent-foreground":e.variant==="ghost","bg-destructive text-destructive-foreground hover:bg-destructive/90":e.variant==="destructive","bg-secondary text-secondary-foreground hover:bg-secondary/80":e.variant==="secondary","underline-offset-4 hover:underline text-primary":e.variant==="link","h-8 px-3 text-xs":e.size==="sm","h-10 px-4 py-2 text-sm":e.size==="md","h-11 px-8 text-base":e.size==="lg","h-9 w-9 p-0":e.size==="icon"},e.class));return(i,o)=>(n(),m("button",{class:f(r.value),type:t.type,disabled:t.disabled||t.loading,onClick:o[0]||(o[0]=d=>a("click",d))},[t.loading?(n(),b(c,{key:0,size:"sm",class:"mr-2"})):v("",!0),g(i.$slots,"default")],10,y))}});export{z as _};
import{_ as c}from"./Spinner.vue_vue_type_script_setup_true_lang-Cu49-Cc4.js";import{c as l}from"./utils-7WVCegLb.js";import{d as u,c as f,n as m,k as b,i as v,p as g,j as p,o as n}from"./index-BP_aNEdP.js";const y=["type","disabled"],z=u({__name:"Button",props:{variant:{default:"default"},size:{default:"md"},loading:{type:Boolean,default:!1},disabled:{type:Boolean,default:!1},type:{default:"button"},class:{}},emits:["click"],setup(t,{emit:s}){const e=t,a=s,r=p(()=>l("inline-flex items-center justify-center rounded-md font-medium transition-colors","focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2","disabled:pointer-events-none disabled:opacity-50",{"bg-primary text-primary-foreground hover:bg-primary/90":e.variant==="default","border border-input bg-background hover:bg-accent hover:text-accent-foreground":e.variant==="outline","hover:bg-accent hover:text-accent-foreground":e.variant==="ghost","bg-destructive text-destructive-foreground hover:bg-destructive/90":e.variant==="destructive","bg-secondary text-secondary-foreground hover:bg-secondary/80":e.variant==="secondary","underline-offset-4 hover:underline text-primary":e.variant==="link","h-8 px-3 text-xs":e.size==="sm","h-10 px-4 py-2 text-sm":e.size==="md","h-11 px-8 text-base":e.size==="lg","h-9 w-9 p-0":e.size==="icon"},e.class));return(i,o)=>(n(),f("button",{class:m(r.value),type:t.type,disabled:t.disabled||t.loading,onClick:o[0]||(o[0]=d=>a("click",d))},[t.loading?(n(),b(c,{key:0,size:"sm",class:"mr-2"})):v("",!0),g(i.$slots,"default")],10,y))}});export{z as _};

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View file

@ -0,0 +1 @@
import{c as e}from"./utils-7WVCegLb.js";import{d as o,c as n,n as t,h as c,p,o as l}from"./index-BP_aNEdP.js";const _=o({__name:"Card",props:{class:{}},setup(s){const a=s;return(r,d)=>(l(),n("div",{class:t(c(e)("rounded-lg border bg-card text-card-foreground shadow-sm",a.class))},[p(r.$slots,"default")],2))}}),f=o({__name:"CardContent",props:{class:{}},setup(s){const a=s;return(r,d)=>(l(),n("div",{class:t(c(e)("p-6 pt-0",a.class))},[p(r.$slots,"default")],2))}});export{_,f as a};

View file

@ -1 +0,0 @@
import{c as e}from"./utils-7WVCegLb.js";import{d as o,c as n,n as t,h as c,m as l,o as p}from"./index-Coy22yOp.js";const _=o({__name:"Card",props:{class:{}},setup(s){const a=s;return(r,d)=>(p(),n("div",{class:t(c(e)("rounded-lg border bg-card text-card-foreground shadow-sm",a.class))},[l(r.$slots,"default")],2))}}),f=o({__name:"CardContent",props:{class:{}},setup(s){const a=s;return(r,d)=>(p(),n("div",{class:t(c(e)("p-6 pt-0",a.class))},[l(r.$slots,"default")],2))}});export{_,f as a};

View file

@ -0,0 +1 @@
import{c as t}from"./utils-7WVCegLb.js";import{d as n,o,c as r,n as c,h as l,p}from"./index-BP_aNEdP.js";const f=n({__name:"CardHeader",props:{class:{}},setup(s){const e=s;return(a,i)=>(o(),r("div",{class:c(l(t)("flex flex-col space-y-1.5 p-6",e.class))},[p(a.$slots,"default")],2))}}),_=n({__name:"CardTitle",props:{class:{}},setup(s){const e=s;return(a,i)=>(o(),r("h3",{class:c(l(t)("text-lg font-semibold leading-none tracking-tight",e.class))},[p(a.$slots,"default")],2))}});export{f as _,_ as a};

View file

@ -1 +0,0 @@
import{c as t}from"./utils-7WVCegLb.js";import{d as n,o,c as r,n as c,h as l,m as p}from"./index-Coy22yOp.js";const f=n({__name:"CardHeader",props:{class:{}},setup(s){const e=s;return(a,m)=>(o(),r("div",{class:c(l(t)("flex flex-col space-y-1.5 p-6",e.class))},[p(a.$slots,"default")],2))}}),_=n({__name:"CardTitle",props:{class:{}},setup(s){const e=s;return(a,m)=>(o(),r("h3",{class:c(l(t)("text-lg font-semibold leading-none tracking-tight",e.class))},[p(a.$slots,"default")],2))}});export{f as _,_ as a};

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View file

@ -1 +1 @@
import{u as D}from"./devops-CA4DvhgQ.js";import{_}from"./Input.vue_vue_type_script_setup_true_lang-BI-qyrUT.js";import{_ as V}from"./Button.vue_vue_type_script_setup_true_lang-B1z2uxja.js";import{d as j,q as c,o as i,c as m,h as a,a as o,p as g,t as d,i as p,e as v,w as k,k as z,K as u}from"./index-Coy22yOp.js";const B={class:"space-y-4"},I={key:0,class:"text-xs text-muted-foreground space-y-1"},N={class:"text-foreground"},P={class:"text-foreground"},S={key:0},U={key:1,class:"text-red-400"},b={class:"grid grid-cols-2 gap-3"},A={class:"space-y-1.5"},F={class:"space-y-1.5"},O={class:"space-y-1.5"},q={class:"flex items-center gap-2"},G=j({__name:"DevopsConnectForm",setup(E){var y,x;const t=D(),n=c(((y=t.integration)==null?void 0:y.organization)??""),r=c(((x=t.integration)==null?void 0:x.project)??""),s=c(""),f=c(!1);async function w(){if(!n.value||!r.value||!s.value){u.error("All fields are required");return}f.value=!0;try{await t.saveIntegration({organization:n.value,project:r.value,pat:s.value}),s.value="",u.success("Integration saved")}catch{u.error("Failed to save integration")}finally{f.value=!1}}async function C(){if(confirm("Delete ADO integration?"))try{await t.deleteIntegration(),n.value="",r.value="",s.value="",u.success("Integration deleted")}catch{u.error("Failed to delete integration")}}return(K,e)=>(i(),m("div",B,[a(t).integration?(i(),m("div",I,[o("p",null,[e[3]||(e[3]=g(" Connected to ",-1)),o("strong",N,d(a(t).integration.organization),1),e[4]||(e[4]=g(" / ",-1)),o("strong",P,d(a(t).integration.project),1)]),a(t).integration.last_synced_at?(i(),m("p",S," Last synced: "+d(new Date(a(t).integration.last_synced_at).toLocaleString()),1)):p("",!0),a(t).integration.last_sync_error?(i(),m("p",U," Error: "+d(a(t).integration.last_sync_error),1)):p("",!0)])):p("",!0),o("div",b,[o("div",A,[e[5]||(e[5]=o("label",{class:"text-sm font-medium text-foreground"},"Organization",-1)),v(_,{modelValue:n.value,"onUpdate:modelValue":e[0]||(e[0]=l=>n.value=l),placeholder:"myorg"},null,8,["modelValue"])]),o("div",F,[e[6]||(e[6]=o("label",{class:"text-sm font-medium text-foreground"},"Project",-1)),v(_,{modelValue:r.value,"onUpdate:modelValue":e[1]||(e[1]=l=>r.value=l),placeholder:"myproject"},null,8,["modelValue"])])]),o("div",O,[e[7]||(e[7]=o("label",{class:"text-sm font-medium text-foreground"}," Personal Access Token ",-1)),v(_,{modelValue:s.value,"onUpdate:modelValue":e[2]||(e[2]=l=>s.value=l),type:"password",placeholder:"••••••••",autocomplete:"new-password"},null,8,["modelValue"])]),o("div",q,[v(V,{loading:f.value,onClick:w},{default:k(()=>[g(d(a(t).integration?"Update":"Connect"),1)]),_:1},8,["loading"]),a(t).integration?(i(),z(V,{key:0,variant:"destructive",size:"sm",onClick:C},{default:k(()=>[...e[8]||(e[8]=[g(" Disconnect ",-1)])]),_:1})):p("",!0)])]))}});export{G as _};
import{u as D}from"./devops-DxRDHPW5.js";import{_}from"./Input.vue_vue_type_script_setup_true_lang-SeygKlpx.js";import{_ as V}from"./Button.vue_vue_type_script_setup_true_lang-B_YE_XNW.js";import{d as j,s as c,o as i,c as m,h as a,a as o,q as g,t as d,i as p,e as v,w as k,k as z,K as u}from"./index-BP_aNEdP.js";const B={class:"space-y-4"},I={key:0,class:"text-xs text-muted-foreground space-y-1"},N={class:"text-foreground"},P={class:"text-foreground"},S={key:0},U={key:1,class:"text-red-400"},b={class:"grid grid-cols-2 gap-3"},A={class:"space-y-1.5"},F={class:"space-y-1.5"},O={class:"space-y-1.5"},q={class:"flex items-center gap-2"},G=j({__name:"DevopsConnectForm",setup(E){var y,x;const t=D(),n=c(((y=t.integration)==null?void 0:y.organization)??""),r=c(((x=t.integration)==null?void 0:x.project)??""),s=c(""),f=c(!1);async function w(){if(!n.value||!r.value||!s.value){u.error("All fields are required");return}f.value=!0;try{await t.saveIntegration({organization:n.value,project:r.value,pat:s.value}),s.value="",u.success("Integration saved")}catch{u.error("Failed to save integration")}finally{f.value=!1}}async function C(){if(confirm("Delete ADO integration?"))try{await t.deleteIntegration(),n.value="",r.value="",s.value="",u.success("Integration deleted")}catch{u.error("Failed to delete integration")}}return(K,e)=>(i(),m("div",B,[a(t).integration?(i(),m("div",I,[o("p",null,[e[3]||(e[3]=g(" Connected to ",-1)),o("strong",N,d(a(t).integration.organization),1),e[4]||(e[4]=g(" / ",-1)),o("strong",P,d(a(t).integration.project),1)]),a(t).integration.last_synced_at?(i(),m("p",S," Last synced: "+d(new Date(a(t).integration.last_synced_at).toLocaleString()),1)):p("",!0),a(t).integration.last_sync_error?(i(),m("p",U," Error: "+d(a(t).integration.last_sync_error),1)):p("",!0)])):p("",!0),o("div",b,[o("div",A,[e[5]||(e[5]=o("label",{class:"text-sm font-medium text-foreground"},"Organization",-1)),v(_,{modelValue:n.value,"onUpdate:modelValue":e[0]||(e[0]=l=>n.value=l),placeholder:"myorg"},null,8,["modelValue"])]),o("div",F,[e[6]||(e[6]=o("label",{class:"text-sm font-medium text-foreground"},"Project",-1)),v(_,{modelValue:r.value,"onUpdate:modelValue":e[1]||(e[1]=l=>r.value=l),placeholder:"myproject"},null,8,["modelValue"])])]),o("div",O,[e[7]||(e[7]=o("label",{class:"text-sm font-medium text-foreground"}," Personal Access Token ",-1)),v(_,{modelValue:s.value,"onUpdate:modelValue":e[2]||(e[2]=l=>s.value=l),type:"password",placeholder:"••••••••",autocomplete:"new-password"},null,8,["modelValue"])]),o("div",q,[v(V,{loading:f.value,onClick:w},{default:k(()=>[g(d(a(t).integration?"Update":"Connect"),1)]),_:1},8,["loading"]),a(t).integration?(i(),z(V,{key:0,variant:"destructive",size:"sm",onClick:C},{default:k(()=>[...e[8]||(e[8]=[g(" Disconnect ",-1)])]),_:1})):p("",!0)])]))}});export{G as _};

File diff suppressed because one or more lines are too long

View file

@ -1 +1 @@
import{d as k,x as y,G as b,k as h,H as x,e as c,T as g,w as m,o as a,c as n,a as o,m as r,t as u,i,n as w}from"./index-Coy22yOp.js";import{_ as $}from"./Button.vue_vue_type_script_setup_true_lang-B1z2uxja.js";const C={key:0,class:"fixed inset-0 z-50 flex items-center justify-center p-4"},B=["aria-label"],j={key:0,class:"flex items-center justify-between p-6 pb-4"},z={class:"text-lg font-semibold text-foreground"},E={key:0,class:"text-sm text-muted-foreground mt-1"},L={class:"px-6 pb-4"},M={key:1,class:"flex justify-end gap-2 px-6 pb-6"},V=k({__name:"Dialog",props:{open:{type:Boolean},title:{},description:{},maxWidth:{default:"max-w-lg"}},emits:["close"],setup(e,{emit:f}){const p=e,l=f;function d(t){t.key==="Escape"&&p.open&&l("close")}return y(()=>document.addEventListener("keydown",d)),b(()=>document.removeEventListener("keydown",d)),(t,s)=>(a(),h(x,{to:"body"},[c(g,{"enter-active-class":"transition-opacity duration-200","enter-from-class":"opacity-0","enter-to-class":"opacity-100","leave-active-class":"transition-opacity duration-200","leave-from-class":"opacity-100","leave-to-class":"opacity-0"},{default:m(()=>[e.open?(a(),n("div",C,[o("div",{class:"absolute inset-0 bg-black/60 backdrop-blur-sm",onClick:s[0]||(s[0]=v=>l("close"))}),o("div",{class:w(["relative w-full bg-card border border-border rounded-lg shadow-xl z-10",e.maxWidth]),role:"dialog","aria-modal":!0,"aria-label":e.title},[e.title||t.$slots.header?(a(),n("div",j,[o("div",null,[r(t.$slots,"header",{},()=>[o("h2",z,u(e.title),1),e.description?(a(),n("p",E,u(e.description),1)):i("",!0)])]),c($,{variant:"ghost",size:"icon",class:"shrink-0",onClick:s[1]||(s[1]=v=>l("close"))},{default:m(()=>[...s[2]||(s[2]=[o("svg",{class:"h-4 w-4",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[o("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M6 18L18 6M6 6l12 12"})],-1)])]),_:1})])):i("",!0),o("div",L,[r(t.$slots,"default")]),t.$slots.footer?(a(),n("div",M,[r(t.$slots,"footer")])):i("",!0)],10,B)])):i("",!0)]),_:3})]))}});export{V as _};
import{d as y,y as k,G as b,k as h,H as g,e as c,T as x,w as u,o as a,c as n,a as o,p as r,t as m,i,n as w}from"./index-BP_aNEdP.js";import{_ as $}from"./Button.vue_vue_type_script_setup_true_lang-B_YE_XNW.js";const C={key:0,class:"fixed inset-0 z-50 flex items-center justify-center p-4"},B=["aria-label"],j={key:0,class:"flex items-center justify-between p-6 pb-4"},z={class:"text-lg font-semibold text-foreground"},E={key:0,class:"text-sm text-muted-foreground mt-1"},L={class:"px-6 pb-4"},M={key:1,class:"flex justify-end gap-2 px-6 pb-6"},V=y({__name:"Dialog",props:{open:{type:Boolean},title:{},description:{},maxWidth:{default:"max-w-lg"}},emits:["close"],setup(e,{emit:f}){const p=e,l=f;function d(t){t.key==="Escape"&&p.open&&l("close")}return k(()=>document.addEventListener("keydown",d)),b(()=>document.removeEventListener("keydown",d)),(t,s)=>(a(),h(g,{to:"body"},[c(x,{"enter-active-class":"transition-opacity duration-200","enter-from-class":"opacity-0","enter-to-class":"opacity-100","leave-active-class":"transition-opacity duration-200","leave-from-class":"opacity-100","leave-to-class":"opacity-0"},{default:u(()=>[e.open?(a(),n("div",C,[o("div",{class:"absolute inset-0 bg-black/60 backdrop-blur-sm",onClick:s[0]||(s[0]=v=>l("close"))}),o("div",{class:w(["relative w-full bg-card border border-border rounded-lg shadow-xl z-10",e.maxWidth]),role:"dialog","aria-modal":!0,"aria-label":e.title},[e.title||t.$slots.header?(a(),n("div",j,[o("div",null,[r(t.$slots,"header",{},()=>[o("h2",z,m(e.title),1),e.description?(a(),n("p",E,m(e.description),1)):i("",!0)])]),c($,{variant:"ghost",size:"icon",class:"shrink-0",onClick:s[1]||(s[1]=v=>l("close"))},{default:u(()=>[...s[2]||(s[2]=[o("svg",{class:"h-4 w-4",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[o("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M6 18L18 6M6 6l12 12"})],-1)])]),_:1})])):i("",!0),o("div",L,[r(t.$slots,"default")]),t.$slots.footer?(a(),n("div",M,[r(t.$slots,"footer")])):i("",!0)],10,B)])):i("",!0)]),_:3})]))}});export{V as _};

View file

@ -1 +1 @@
import{c as i}from"./utils-7WVCegLb.js";import{d,c as s,n as u,h as m,o as r}from"./index-Coy22yOp.js";const c=["id","name","type","value","placeholder","disabled","autocomplete","min","max","step"],g=d({__name:"Input",props:{modelValue:{},type:{},placeholder:{},disabled:{type:Boolean},class:{},id:{},name:{},autocomplete:{},min:{},max:{},step:{}},emits:["update:modelValue","change","blur","focus"],setup(e,{emit:n}){const a=e,o=n;return(f,t)=>(r(),s("input",{id:e.id,name:e.name,type:e.type??"text",value:e.modelValue,placeholder:e.placeholder,disabled:e.disabled,autocomplete:e.autocomplete,min:e.min,max:e.max,step:e.step,class:u(m(i)("flex h-10 w-full rounded-md border border-input bg-background px-3 py-2 text-sm","ring-offset-background file:border-0 file:bg-transparent file:text-sm file:font-medium","placeholder:text-muted-foreground","focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2","disabled:cursor-not-allowed disabled:opacity-50",a.class)),onInput:t[0]||(t[0]=l=>o("update:modelValue",l.target.value)),onChange:t[1]||(t[1]=l=>o("change",l.target.value)),onBlur:t[2]||(t[2]=l=>o("blur",l)),onFocus:t[3]||(t[3]=l=>o("focus",l))},null,42,c))}});export{g as _};
import{c as i}from"./utils-7WVCegLb.js";import{d,o as s,c as u,n as m,h as r}from"./index-BP_aNEdP.js";const c=["id","name","type","value","placeholder","disabled","autocomplete","min","max","step"],g=d({__name:"Input",props:{modelValue:{},type:{},placeholder:{},disabled:{type:Boolean},class:{},id:{},name:{},autocomplete:{},min:{},max:{},step:{}},emits:["update:modelValue","change","blur","focus"],setup(e,{emit:n}){const a=e,o=n;return(f,t)=>(s(),u("input",{id:e.id,name:e.name,type:e.type??"text",value:e.modelValue,placeholder:e.placeholder,disabled:e.disabled,autocomplete:e.autocomplete,min:e.min,max:e.max,step:e.step,class:m(r(i)("flex h-10 w-full rounded-md border border-input bg-background px-3 py-2 text-sm","ring-offset-background file:border-0 file:bg-transparent file:text-sm file:font-medium","placeholder:text-muted-foreground","focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2","disabled:cursor-not-allowed disabled:opacity-50",a.class)),onInput:t[0]||(t[0]=l=>o("update:modelValue",l.target.value)),onChange:t[1]||(t[1]=l=>o("change",l.target.value)),onBlur:t[2]||(t[2]=l=>o("blur",l)),onFocus:t[3]||(t[3]=l=>o("focus",l))},null,42,c))}});export{g as _};

View file

@ -1 +1 @@
import{a as b}from"./admin-p6BxWcDa.js";import{_ as K,a as $}from"./CardContent.vue_vue_type_script_setup_true_lang-DUVu0jq9.js";import{_ as p}from"./Button.vue_vue_type_script_setup_true_lang-B1z2uxja.js";import{_ as V}from"./Dialog.vue_vue_type_script_setup_true_lang-DdEHw_yS.js";import{_ as N}from"./Input.vue_vue_type_script_setup_true_lang-BI-qyrUT.js";import{_ as A}from"./Spinner.vue_vue_type_script_setup_true_lang-B7DG-xnx.js";import{d as B,x as L,c as l,a as t,e as r,w as n,q as i,o as a,p as v,F as P,r as F,t as u,h as k,k as I,i as j,K as y}from"./index-Coy22yOp.js";import{a as h}from"./utils-7WVCegLb.js";const D={class:"p-6"},R={class:"flex items-center justify-between mb-6"},z={key:0,class:"flex items-center justify-center h-20"},M={key:1,class:"text-center text-muted-foreground py-8 text-sm"},T={key:2,class:"w-full"},U={class:"px-4 py-3 text-sm text-foreground"},q={class:"px-4 py-3 text-sm font-mono text-muted-foreground"},E={class:"px-4 py-3 text-xs text-muted-foreground"},H={class:"px-4 py-3 text-xs text-muted-foreground"},S={class:"px-4 py-3 text-right"},G={class:"space-y-4"},J={key:0,class:"rounded-md bg-emerald-500/10 border border-emerald-500/30 p-3"},O={class:"text-xs font-mono text-foreground break-all"},Q={key:1,class:"space-y-1.5"},re=B({__name:"KeysView",setup(W){const f=i([]),_=i(!1),c=i(!1),m=i(""),x=i(!1),d=i(null);L(()=>g());async function g(){_.value=!0;try{const o=await b.keys();f.value=o.data}finally{_.value=!1}}async function w(){if(m.value.trim()){x.value=!0;try{const o=await b.createKey({label:m.value});d.value=o.data.key,y.success("API key created"),await g(),m.value=""}catch{y.error("Failed to create key")}finally{x.value=!1}}}async function C(o){if(confirm(`Revoke key "${o.label}"? This cannot be undone.`))try{await b.revokeKey(o.id),y.success("Key revoked"),f.value=f.value.filter(e=>e.id!==o.id)}catch{y.error("Failed to revoke key")}}return(o,e)=>(a(),l("div",D,[t("div",R,[e[5]||(e[5]=t("h2",{class:"text-lg font-semibold text-foreground"},"API Keys",-1)),r(p,{size:"sm",onClick:e[0]||(e[0]=s=>{c.value=!0,d.value=null})},{default:n(()=>[...e[4]||(e[4]=[t("svg",{class:"h-4 w-4 mr-1.5",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[t("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M12 4v16m8-8H4"})],-1),v(" New Key ",-1)])]),_:1})]),r(K,null,{default:n(()=>[r($,{class:"p-0"},{default:n(()=>[_.value?(a(),l("div",z,[r(A,{class:"text-primary"})])):f.value.length===0?(a(),l("div",M," No API keys ")):(a(),l("table",T,[e[7]||(e[7]=t("thead",null,[t("tr",{class:"border-b border-border"},[t("th",{class:"text-left text-xs font-medium text-muted-foreground px-4 py-3"},"Label"),t("th",{class:"text-left text-xs font-medium text-muted-foreground px-4 py-3"},"Prefix"),t("th",{class:"text-left text-xs font-medium text-muted-foreground px-4 py-3"},"Created"),t("th",{class:"text-left text-xs font-medium text-muted-foreground px-4 py-3"},"Last Used"),t("th",{class:"px-4 py-3"})])],-1)),t("tbody",null,[(a(!0),l(P,null,F(f.value,s=>(a(),l("tr",{key:s.id,class:"border-b border-border last:border-0 hover:bg-muted/30"},[t("td",U,u(s.label),1),t("td",q,u(s.prefix)+"...",1),t("td",E,u(k(h)(s.created_at)),1),t("td",H,u(s.last_used?k(h)(s.last_used):"Never"),1),t("td",S,[r(p,{variant:"ghost",size:"sm",class:"text-destructive",onClick:X=>C(s)},{default:n(()=>[...e[6]||(e[6]=[v(" Revoke ",-1)])]),_:1},8,["onClick"])])]))),128))])]))]),_:1})]),_:1}),r(V,{open:c.value,title:"Create API Key",onClose:e[3]||(e[3]=s=>c.value=!1)},{footer:n(()=>[r(p,{variant:"outline",onClick:e[2]||(e[2]=s=>c.value=!1)},{default:n(()=>[v(u(d.value?"Done":"Cancel"),1)]),_:1}),d.value?j("",!0):(a(),I(p,{key:0,loading:x.value,onClick:w},{default:n(()=>[...e[10]||(e[10]=[v(" Create ",-1)])]),_:1},8,["loading"]))]),default:n(()=>[t("div",G,[d.value?(a(),l("div",J,[e[8]||(e[8]=t("p",{class:"text-xs text-emerald-400 font-medium mb-1"},"Key created — save it now!",-1)),t("p",O,u(d.value),1)])):(a(),l("div",Q,[e[9]||(e[9]=t("label",{class:"text-sm font-medium text-foreground"},"Label",-1)),r(N,{modelValue:m.value,"onUpdate:modelValue":e[1]||(e[1]=s=>m.value=s),placeholder:"e.g. claude-collector",disabled:x.value},null,8,["modelValue","disabled"])]))])]),_:1},8,["open"])]))}});export{re as default};
import{a as b}from"./admin-C27haAMd.js";import{_ as K,a as $}from"./CardContent.vue_vue_type_script_setup_true_lang-B8VjSxLa.js";import{_ as v}from"./Button.vue_vue_type_script_setup_true_lang-B_YE_XNW.js";import{_ as V}from"./Dialog.vue_vue_type_script_setup_true_lang-v8iqnRk8.js";import{_ as N}from"./Input.vue_vue_type_script_setup_true_lang-SeygKlpx.js";import{_ as A}from"./Spinner.vue_vue_type_script_setup_true_lang-Cu49-Cc4.js";import{d as B,y as L,c as l,a as t,e as r,w as n,s as i,o as a,q as p,F as P,r as F,t as u,h as k,k as I,i as j,K as y}from"./index-BP_aNEdP.js";import{a as h}from"./utils-7WVCegLb.js";const D={class:"p-6"},R={class:"flex items-center justify-between mb-6"},z={key:0,class:"flex items-center justify-center h-20"},M={key:1,class:"text-center text-muted-foreground py-8 text-sm"},T={key:2,class:"w-full"},U={class:"px-4 py-3 text-sm text-foreground"},q={class:"px-4 py-3 text-sm font-mono text-muted-foreground"},E={class:"px-4 py-3 text-xs text-muted-foreground"},H={class:"px-4 py-3 text-xs text-muted-foreground"},S={class:"px-4 py-3 text-right"},G={class:"space-y-4"},J={key:0,class:"rounded-md bg-emerald-500/10 border border-emerald-500/30 p-3"},O={class:"text-xs font-mono text-foreground break-all"},Q={key:1,class:"space-y-1.5"},re=B({__name:"KeysView",setup(W){const f=i([]),_=i(!1),c=i(!1),m=i(""),x=i(!1),d=i(null);L(()=>g());async function g(){_.value=!0;try{const o=await b.keys();f.value=o.data}finally{_.value=!1}}async function w(){if(m.value.trim()){x.value=!0;try{const o=await b.createKey({label:m.value});d.value=o.data.key,y.success("API key created"),await g(),m.value=""}catch{y.error("Failed to create key")}finally{x.value=!1}}}async function C(o){if(confirm(`Revoke key "${o.label}"? This cannot be undone.`))try{await b.revokeKey(o.id),y.success("Key revoked"),f.value=f.value.filter(e=>e.id!==o.id)}catch{y.error("Failed to revoke key")}}return(o,e)=>(a(),l("div",D,[t("div",R,[e[5]||(e[5]=t("h2",{class:"text-lg font-semibold text-foreground"},"API Keys",-1)),r(v,{size:"sm",onClick:e[0]||(e[0]=s=>{c.value=!0,d.value=null})},{default:n(()=>[...e[4]||(e[4]=[t("svg",{class:"h-4 w-4 mr-1.5",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[t("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M12 4v16m8-8H4"})],-1),p(" New Key ",-1)])]),_:1})]),r(K,null,{default:n(()=>[r($,{class:"p-0"},{default:n(()=>[_.value?(a(),l("div",z,[r(A,{class:"text-primary"})])):f.value.length===0?(a(),l("div",M," No API keys ")):(a(),l("table",T,[e[7]||(e[7]=t("thead",null,[t("tr",{class:"border-b border-border"},[t("th",{class:"text-left text-xs font-medium text-muted-foreground px-4 py-3"},"Label"),t("th",{class:"text-left text-xs font-medium text-muted-foreground px-4 py-3"},"Prefix"),t("th",{class:"text-left text-xs font-medium text-muted-foreground px-4 py-3"},"Created"),t("th",{class:"text-left text-xs font-medium text-muted-foreground px-4 py-3"},"Last Used"),t("th",{class:"px-4 py-3"})])],-1)),t("tbody",null,[(a(!0),l(P,null,F(f.value,s=>(a(),l("tr",{key:s.id,class:"border-b border-border last:border-0 hover:bg-muted/30"},[t("td",U,u(s.label),1),t("td",q,u(s.prefix)+"...",1),t("td",E,u(k(h)(s.created_at)),1),t("td",H,u(s.last_used?k(h)(s.last_used):"Never"),1),t("td",S,[r(v,{variant:"ghost",size:"sm",class:"text-destructive",onClick:X=>C(s)},{default:n(()=>[...e[6]||(e[6]=[p(" Revoke ",-1)])]),_:1},8,["onClick"])])]))),128))])]))]),_:1})]),_:1}),r(V,{open:c.value,title:"Create API Key",onClose:e[3]||(e[3]=s=>c.value=!1)},{footer:n(()=>[r(v,{variant:"outline",onClick:e[2]||(e[2]=s=>c.value=!1)},{default:n(()=>[p(u(d.value?"Done":"Cancel"),1)]),_:1}),d.value?j("",!0):(a(),I(v,{key:0,loading:x.value,onClick:w},{default:n(()=>[...e[10]||(e[10]=[p(" Create ",-1)])]),_:1},8,["loading"]))]),default:n(()=>[t("div",G,[d.value?(a(),l("div",J,[e[8]||(e[8]=t("p",{class:"text-xs text-emerald-400 font-medium mb-1"},"Key created — save it now!",-1)),t("p",O,u(d.value),1)])):(a(),l("div",Q,[e[9]||(e[9]=t("label",{class:"text-sm font-medium text-foreground"},"Label",-1)),r(N,{modelValue:m.value,"onUpdate:modelValue":e[1]||(e[1]=s=>m.value=s),placeholder:"e.g. claude-collector",disabled:x.value},null,8,["modelValue","disabled"])]))])]),_:1},8,["open"])]))}});export{re as default};

View file

@ -1 +1 @@
import{G as T,q as y,d as J,u as O,x as V,c as f,a as o,n as b,h as l,t as v,k as $,w as x,i as k,e as C,o as c,p as w,F as B,r as F,j as z}from"./index-Coy22yOp.js";import{_ as A,a as D}from"./CardContent.vue_vue_type_script_setup_true_lang-DUVu0jq9.js";import{_ as N}from"./Button.vue_vue_type_script_setup_true_lang-B1z2uxja.js";import"./utils-7WVCegLb.js";import"./Spinner.vue_vue_type_script_setup_true_lang-B7DG-xnx.js";function U(E){const e=y([]),i=y(!1),m=y(null);let s=null,r=null,u=!1;function p(){if(!u)try{s=new EventSource(E),s.onopen=()=>{i.value=!0,m.value=null},s.onmessage=n=>{try{const g=JSON.parse(n.data);e.value.push({type:"message",data:g}),e.value.length>200&&e.value.shift()}catch{e.value.push({type:"message",data:n.data})}},s.addEventListener("session_start",n=>{try{e.value.push({type:"session_start",data:JSON.parse(n.data)})}catch{e.value.push({type:"session_start",data:n.data})}e.value.length>200&&e.value.shift()}),s.addEventListener("session_end",n=>{try{e.value.push({type:"session_end",data:JSON.parse(n.data)})}catch{e.value.push({type:"session_end",data:n.data})}e.value.length>200&&e.value.shift()}),s.addEventListener("activity",n=>{try{e.value.push({type:"activity",data:JSON.parse(n.data)})}catch{e.value.push({type:"activity",data:n.data})}e.value.length>200&&e.value.shift()}),s.onerror=()=>{i.value=!1,m.value="Connection lost, reconnecting...",s==null||s.close(),s=null,u||(r=setTimeout(()=>p(),5e3))}}catch{m.value="Failed to connect to event stream",u||(r=setTimeout(()=>p(),5e3))}}function _(){u=!0,r&&clearTimeout(r),s==null||s.close(),s=null,i.value=!1}function h(){e.value=[]}return T(()=>{_()}),{events:e,connected:i,error:m,connect:p,disconnect:_,clearEvents:h}}const I={class:"p-6 h-full flex flex-col"},R={class:"flex items-center gap-3 mb-4"},q={class:"flex items-center gap-2"},G={class:"text-xs text-muted-foreground"},M={key:0,class:"mb-4 text-xs text-amber-400 bg-amber-500/10 border border-amber-500/30 rounded px-3 py-2"},P={key:0,class:"flex items-center justify-center h-full text-sm text-muted-foreground"},W={key:1,class:"overflow-y-auto h-full font-mono text-xs"},H={class:"flex-1 min-w-0"},K={class:"flex items-center gap-2 flex-wrap"},Q={key:0,class:"text-muted-foreground"},X={class:"text-muted-foreground truncate mt-0.5"},ne=J({__name:"LiveView",setup(E){const e=O(),i=e.getToken(),m=`/cc-dashboard/api/events${i?`?token=${encodeURIComponent(i)}`:""}`,{events:s,connected:r,error:u,connect:p,clearEvents:_}=U(m);V(()=>{e.isAuthenticated&&i&&p()});const h=z(()=>[...s.value].reverse().slice(0,100));function n(t){return t==="session_start"?"text-emerald-400":t==="session_end"?"text-amber-400":t==="activity"?"text-blue-400":"text-muted-foreground"}function g(t){return t==="session_start"?"▶":t==="session_end"?"■":t==="activity"?"●":"○"}function j(t){if(typeof t=="string")return t;if(t&&typeof t=="object"){const a=t;return a.message||a.summary||JSON.stringify(t)}return String(t)}function S(t){if(t&&typeof t=="object"){const a=t;return a.display_name||a.project_id||""}return""}return(t,a)=>(c(),f("div",I,[o("div",R,[a[2]||(a[2]=o("h2",{class:"text-lg font-semibold text-foreground flex-1"},"Live Feed",-1)),o("div",q,[o("div",{class:b(["h-2 w-2 rounded-full",l(r)?"bg-emerald-500 animate-pulse":"bg-red-500"])},null,2),o("span",G,v(l(r)?"Connected":"Disconnected"),1)]),l(r)?k("",!0):(c(),$(N,{key:0,variant:"outline",size:"sm",onClick:l(p)},{default:x(()=>[...a[0]||(a[0]=[w(" Reconnect ",-1)])]),_:1},8,["onClick"])),C(N,{variant:"ghost",size:"sm",onClick:l(_)},{default:x(()=>[...a[1]||(a[1]=[w(" Clear ",-1)])]),_:1},8,["onClick"])]),l(u)&&!l(r)?(c(),f("div",M,v(l(u)),1)):k("",!0),C(A,{class:"flex-1 overflow-hidden"},{default:x(()=>[C(D,{class:"p-0 h-full"},{default:x(()=>[h.value.length===0?(c(),f("div",P,[...a[3]||(a[3]=[o("div",{class:"text-center"},[o("div",{class:"text-2xl mb-2"},"📡"),o("p",null,"Waiting for events..."),o("p",{class:"text-xs mt-1"},"Activity will appear here in real-time")],-1)])])):(c(),f("div",W,[(c(!0),f(B,null,F(h.value,(d,L)=>(c(),f("div",{key:L,class:"flex items-start gap-2 px-4 py-1.5 hover:bg-muted/50 border-b border-border/30"},[o("span",{class:b([n(d.type),"shrink-0 mt-0.5"])},v(g(d.type)),3),o("div",H,[o("div",K,[o("span",{class:b([n(d.type),"font-medium"])},v(d.type),3),S(d.data)?(c(),f("span",Q,v(S(d.data)),1)):k("",!0)]),o("p",X,v(j(d.data)),1)])]))),128))]))]),_:1})]),_:1})]))}});export{ne as default};
import{G as T,s as g,d as J,u as O,y as V,c as f,a as o,n as b,h as l,t as v,k as $,w as x,i as k,e as C,o as c,q as w,F as B,r as F,j as z}from"./index-BP_aNEdP.js";import{_ as A,a as D}from"./CardContent.vue_vue_type_script_setup_true_lang-B8VjSxLa.js";import{_ as N}from"./Button.vue_vue_type_script_setup_true_lang-B_YE_XNW.js";import"./utils-7WVCegLb.js";import"./Spinner.vue_vue_type_script_setup_true_lang-Cu49-Cc4.js";function U(E){const e=g([]),i=g(!1),m=g(null);let s=null,r=null,u=!1;function p(){if(!u)try{s=new EventSource(E),s.onopen=()=>{i.value=!0,m.value=null},s.onmessage=n=>{try{const y=JSON.parse(n.data);e.value.push({type:"message",data:y}),e.value.length>200&&e.value.shift()}catch{e.value.push({type:"message",data:n.data})}},s.addEventListener("session_start",n=>{try{e.value.push({type:"session_start",data:JSON.parse(n.data)})}catch{e.value.push({type:"session_start",data:n.data})}e.value.length>200&&e.value.shift()}),s.addEventListener("session_end",n=>{try{e.value.push({type:"session_end",data:JSON.parse(n.data)})}catch{e.value.push({type:"session_end",data:n.data})}e.value.length>200&&e.value.shift()}),s.addEventListener("activity",n=>{try{e.value.push({type:"activity",data:JSON.parse(n.data)})}catch{e.value.push({type:"activity",data:n.data})}e.value.length>200&&e.value.shift()}),s.onerror=()=>{i.value=!1,m.value="Connection lost, reconnecting...",s==null||s.close(),s=null,u||(r=setTimeout(()=>p(),5e3))}}catch{m.value="Failed to connect to event stream",u||(r=setTimeout(()=>p(),5e3))}}function _(){u=!0,r&&clearTimeout(r),s==null||s.close(),s=null,i.value=!1}function h(){e.value=[]}return T(()=>{_()}),{events:e,connected:i,error:m,connect:p,disconnect:_,clearEvents:h}}const I={class:"p-6 h-full flex flex-col"},R={class:"flex items-center gap-3 mb-4"},q={class:"flex items-center gap-2"},G={class:"text-xs text-muted-foreground"},M={key:0,class:"mb-4 text-xs text-amber-400 bg-amber-500/10 border border-amber-500/30 rounded px-3 py-2"},P={key:0,class:"flex items-center justify-center h-full text-sm text-muted-foreground"},W={key:1,class:"overflow-y-auto h-full font-mono text-xs"},H={class:"flex-1 min-w-0"},K={class:"flex items-center gap-2 flex-wrap"},Q={key:0,class:"text-muted-foreground"},X={class:"text-muted-foreground truncate mt-0.5"},ne=J({__name:"LiveView",setup(E){const e=O(),i=e.getToken(),m=`/cc-dashboard/api/events${i?`?token=${encodeURIComponent(i)}`:""}`,{events:s,connected:r,error:u,connect:p,clearEvents:_}=U(m);V(()=>{e.isAuthenticated&&i&&p()});const h=z(()=>[...s.value].reverse().slice(0,100));function n(t){return t==="session_start"?"text-emerald-400":t==="session_end"?"text-amber-400":t==="activity"?"text-blue-400":"text-muted-foreground"}function y(t){return t==="session_start"?"▶":t==="session_end"?"■":t==="activity"?"●":"○"}function j(t){if(typeof t=="string")return t;if(t&&typeof t=="object"){const a=t;return a.message||a.summary||JSON.stringify(t)}return String(t)}function S(t){if(t&&typeof t=="object"){const a=t;return a.display_name||a.project_id||""}return""}return(t,a)=>(c(),f("div",I,[o("div",R,[a[2]||(a[2]=o("h2",{class:"text-lg font-semibold text-foreground flex-1"},"Live Feed",-1)),o("div",q,[o("div",{class:b(["h-2 w-2 rounded-full",l(r)?"bg-emerald-500 animate-pulse":"bg-red-500"])},null,2),o("span",G,v(l(r)?"Connected":"Disconnected"),1)]),l(r)?k("",!0):(c(),$(N,{key:0,variant:"outline",size:"sm",onClick:l(p)},{default:x(()=>[...a[0]||(a[0]=[w(" Reconnect ",-1)])]),_:1},8,["onClick"])),C(N,{variant:"ghost",size:"sm",onClick:l(_)},{default:x(()=>[...a[1]||(a[1]=[w(" Clear ",-1)])]),_:1},8,["onClick"])]),l(u)&&!l(r)?(c(),f("div",M,v(l(u)),1)):k("",!0),C(A,{class:"flex-1 overflow-hidden"},{default:x(()=>[C(D,{class:"p-0 h-full"},{default:x(()=>[h.value.length===0?(c(),f("div",P,[...a[3]||(a[3]=[o("div",{class:"text-center"},[o("div",{class:"text-2xl mb-2"},"📡"),o("p",null,"Waiting for events..."),o("p",{class:"text-xs mt-1"},"Activity will appear here in real-time")],-1)])])):(c(),f("div",W,[(c(!0),f(B,null,F(h.value,(d,L)=>(c(),f("div",{key:L,class:"flex items-start gap-2 px-4 py-1.5 hover:bg-muted/50 border-b border-border/30"},[o("span",{class:b([n(d.type),"shrink-0 mt-0.5"])},v(y(d.type)),3),o("div",H,[o("div",K,[o("span",{class:b([n(d.type),"font-medium"])},v(d.type),3),S(d.data)?(c(),f("span",Q,v(S(d.data)),1)):k("",!0)]),o("p",X,v(j(d.data)),1)])]))),128))]))]),_:1})]),_:1})]))}});export{ne as default};

View file

@ -1 +1 @@
import{d as h,u as f,c as o,a as t,b as m,e as a,w as d,o as r,f as g,g as p,h as i,t as x,i as w}from"./index-Coy22yOp.js";import{_ as y,a as b}from"./CardContent.vue_vue_type_script_setup_true_lang-DUVu0jq9.js";import"./utils-7WVCegLb.js";const v={class:"min-h-screen flex items-center justify-center bg-background p-4"},_={class:"w-full max-w-sm"},k={class:"space-y-4"},C={key:0,class:"rounded-md bg-destructive/10 border border-destructive/30 px-3 py-2 text-sm text-destructive"},B=["disabled"],V={key:0},S={key:1},M=h({__name:"LoginView",setup(F){const c=g(),l=p(),s=f();async function u(){try{await s.loginWithMicrosoft();const n=l.query.redirect;c.push(n??"/")}catch{}}return(n,e)=>(r(),o("div",v,[t("div",_,[e[2]||(e[2]=m('<div class="text-center mb-8"><div class="inline-flex h-12 w-12 items-center justify-center rounded-xl bg-primary mb-3"><svg class="h-7 w-7 text-white" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 19v-6a2 2 0 00-2-2H5a2 2 0 00-2 2v6a2 2 0 002 2h2a2 2 0 002-2zm0 0V9a2 2 0 012-2h2a2 2 0 012 2v10m-6 0a2 2 0 002 2h2a2 2 0 002-2m0 0V5a2 2 0 012-2h2a2 2 0 012 2v14a2 2 0 01-2 2h-2a2 2 0 01-2-2z"></path></svg></div><h1 class="text-2xl font-bold text-foreground">CC Dashboard</h1><p class="text-sm text-muted-foreground mt-1">Corporate Planning Hub</p></div>',1)),a(y,null,{default:d(()=>[a(b,{class:"pt-6"},{default:d(()=>[t("div",k,[i(s).error?(r(),o("div",C,x(i(s).error),1)):w("",!0),t("button",{type:"button",disabled:i(s).loading,class:"w-full flex items-center justify-center gap-3 rounded-md border border-border bg-white px-4 py-2.5 text-sm font-medium text-gray-700 shadow-sm hover:bg-gray-50 focus:outline-none focus:ring-2 focus:ring-primary focus:ring-offset-2 disabled:opacity-50 disabled:cursor-not-allowed transition-colors",onClick:u},[e[0]||(e[0]=t("svg",{class:"h-5 w-5 shrink-0",viewBox:"0 0 21 21",fill:"none",xmlns:"http://www.w3.org/2000/svg"},[t("rect",{x:"1",y:"1",width:"9",height:"9",fill:"#F25022"}),t("rect",{x:"11",y:"1",width:"9",height:"9",fill:"#7FBA00"}),t("rect",{x:"1",y:"11",width:"9",height:"9",fill:"#00A4EF"}),t("rect",{x:"11",y:"11",width:"9",height:"9",fill:"#FFB900"})],-1)),i(s).loading?(r(),o("span",V,"Signing in…")):(r(),o("span",S,"Sign in with Microsoft"))],8,B),e[1]||(e[1]=t("p",{class:"text-center text-xs text-muted-foreground"}," Use your @oliver.agency account ",-1))])]),_:1})]),_:1})])]))}});export{M as default};
import{d as h,u as f,c as o,a as t,b as m,e as a,w as d,o as r,f as g,g as p,h as i,t as x,i as w}from"./index-BP_aNEdP.js";import{_ as y,a as b}from"./CardContent.vue_vue_type_script_setup_true_lang-B8VjSxLa.js";import"./utils-7WVCegLb.js";const v={class:"min-h-screen flex items-center justify-center bg-background p-4"},_={class:"w-full max-w-sm"},k={class:"space-y-4"},C={key:0,class:"rounded-md bg-destructive/10 border border-destructive/30 px-3 py-2 text-sm text-destructive"},B=["disabled"],V={key:0},S={key:1},M=h({__name:"LoginView",setup(F){const c=g(),l=p(),s=f();async function u(){try{await s.loginWithMicrosoft();const n=l.query.redirect;c.push(n??"/")}catch{}}return(n,e)=>(r(),o("div",v,[t("div",_,[e[2]||(e[2]=m('<div class="text-center mb-8"><div class="inline-flex h-12 w-12 items-center justify-center rounded-xl bg-primary mb-3"><svg class="h-7 w-7 text-white" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 19v-6a2 2 0 00-2-2H5a2 2 0 00-2 2v6a2 2 0 002 2h2a2 2 0 002-2zm0 0V9a2 2 0 012-2h2a2 2 0 012 2v10m-6 0a2 2 0 002 2h2a2 2 0 002-2m0 0V5a2 2 0 012-2h2a2 2 0 012 2v14a2 2 0 01-2 2h-2a2 2 0 01-2-2z"></path></svg></div><h1 class="text-2xl font-bold text-foreground">CC Dashboard</h1><p class="text-sm text-muted-foreground mt-1">Corporate Planning Hub</p></div>',1)),a(y,null,{default:d(()=>[a(b,{class:"pt-6"},{default:d(()=>[t("div",k,[i(s).error?(r(),o("div",C,x(i(s).error),1)):w("",!0),t("button",{type:"button",disabled:i(s).loading,class:"w-full flex items-center justify-center gap-3 rounded-md border border-border bg-white px-4 py-2.5 text-sm font-medium text-gray-700 shadow-sm hover:bg-gray-50 focus:outline-none focus:ring-2 focus:ring-primary focus:ring-offset-2 disabled:opacity-50 disabled:cursor-not-allowed transition-colors",onClick:u},[e[0]||(e[0]=t("svg",{class:"h-5 w-5 shrink-0",viewBox:"0 0 21 21",fill:"none",xmlns:"http://www.w3.org/2000/svg"},[t("rect",{x:"1",y:"1",width:"9",height:"9",fill:"#F25022"}),t("rect",{x:"11",y:"1",width:"9",height:"9",fill:"#7FBA00"}),t("rect",{x:"1",y:"11",width:"9",height:"9",fill:"#00A4EF"}),t("rect",{x:"11",y:"11",width:"9",height:"9",fill:"#FFB900"})],-1)),i(s).loading?(r(),o("span",V,"Signing in…")):(r(),o("span",S,"Sign in with Microsoft"))],8,B),e[1]||(e[1]=t("p",{class:"text-center text-xs text-muted-foreground"}," Use your @oliver.agency account ",-1))])]),_:1})]),_:1})])]))}});export{M as default};

File diff suppressed because one or more lines are too long

View file

@ -1 +1 @@
import{c as r}from"./utils-7WVCegLb.js";import{d as s,o as n,c as t,n as l,h as c,a as d,A as u}from"./index-Coy22yOp.js";const h=s({__name:"Progress",props:{value:{},max:{default:100},class:{},color:{default:"default"}},setup(a){const e=a,o=()=>Math.min(100,Math.max(0,e.value/e.max*100));return(i,m)=>(n(),t("div",{class:l(c(r)("relative h-2 w-full overflow-hidden rounded-full bg-secondary",e.class))},[d("div",{class:l(["h-full rounded-full transition-all duration-300",{"bg-primary":a.color==="default","bg-emerald-500":a.color==="success","bg-amber-500":a.color==="warning","bg-red-500":a.color==="danger"}]),style:u({width:`${o()}%`})},null,6)],2))}});export{h as _};
import{c as r}from"./utils-7WVCegLb.js";import{d as s,o as n,c as t,n as l,h as c,a as d,B as u}from"./index-BP_aNEdP.js";const h=s({__name:"Progress",props:{value:{},max:{default:100},class:{},color:{default:"default"}},setup(a){const e=a,o=()=>Math.min(100,Math.max(0,e.value/e.max*100));return(i,m)=>(n(),t("div",{class:l(c(r)("relative h-2 w-full overflow-hidden rounded-full bg-secondary",e.class))},[d("div",{class:l(["h-full rounded-full transition-all duration-300",{"bg-primary":a.color==="default","bg-emerald-500":a.color==="success","bg-amber-500":a.color==="warning","bg-red-500":a.color==="danger"}]),style:u({width:`${o()}%`})},null,6)],2))}});export{h as _};

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View file

@ -1,4 +1,4 @@
var Ce=Object.defineProperty;var ae=a=>{throw TypeError(a)};var Ee=(a,t,e)=>t in a?Ce(a,t,{enumerable:!0,configurable:!0,writable:!0,value:e}):a[t]=e;var k=(a,t,e)=>Ee(a,typeof t!="symbol"?t+"":t,e),Le=(a,t,e)=>t.has(a)||ae("Cannot "+e);var ce=(a,t,e)=>t.has(a)?ae("Cannot add the same private member more than once"):t instanceof WeakSet?t.add(a):t.set(a,e);var Z=(a,t,e)=>(Le(a,t,"access private method"),e);import{E as V,d as Be,x as qe,c as z,a as x,n as U,e as P,w as I,F as Ze,r as Pe,q as A,o as _,p as G,k as pe,t as W,h as Me,i as he,K as ue}from"./index-Coy22yOp.js";import{a as De,_ as Qe}from"./CardContent.vue_vue_type_script_setup_true_lang-DUVu0jq9.js";import{_ as fe}from"./Badge.vue_vue_type_script_setup_true_lang-CLRDsB_H.js";import{_ as Ne}from"./Button.vue_vue_type_script_setup_true_lang-B1z2uxja.js";import{_ as je}from"./Spinner.vue_vue_type_script_setup_true_lang-B7DG-xnx.js";import{a as Oe,i as He}from"./utils-7WVCegLb.js";import{_ as Fe}from"./_plugin-vue_export-helper-DlAUqK2U.js";const de={list:()=>V.get("/api/reports"),get:a=>V.get(`/api/reports/${a}`),generate:a=>V.post("/api/reports/generate",a)};function J(){return{async:!1,breaks:!1,extensions:null,gfm:!0,hooks:null,pedantic:!1,renderer:null,silent:!1,tokenizer:null,walkTokens:null}}let S=J();function we(a){S=a}const ye=/[&<>"']/,Ve=new RegExp(ye.source,"g"),_e=/[<>"']|&(?!(#\d{1,7}|#[Xx][a-fA-F0-9]{1,6}|\w+);)/,Ue=new RegExp(_e.source,"g"),Ge={"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#39;"},ge=a=>Ge[a];function m(a,t){if(t){if(ye.test(a))return a.replace(Ve,ge)}else if(_e.test(a))return a.replace(Ue,ge);return a}const We=/&(#(?:\d+)|(?:#x[0-9A-Fa-f]+)|(?:\w+));?/ig;function Xe(a){return a.replace(We,(t,e)=>(e=e.toLowerCase(),e==="colon"?":":e.charAt(0)==="#"?e.charAt(1)==="x"?String.fromCharCode(parseInt(e.substring(2),16)):String.fromCharCode(+e.substring(1)):""))}const Ke=/(^|[^\[])\^/g;function g(a,t){let e=typeof a=="string"?a:a.source;t=t||"";const n={replace:(i,r)=>{let s=typeof r=="string"?r:r.source;return s=s.replace(Ke,"$1"),e=e.replace(i,s),n},getRegex:()=>new RegExp(e,t)};return n}function ke(a){try{a=encodeURI(a).replace(/%25/g,"%")}catch{return null}return a}const E={exec:()=>null};function xe(a,t){const e=a.replace(/\|/g,(r,s,o)=>{let l=!1,u=s;for(;--u>=0&&o[u]==="\\";)l=!l;return l?"|":" |"}),n=e.split(/ \|/);let i=0;if(n[0].trim()||n.shift(),n.length>0&&!n[n.length-1].trim()&&n.pop(),t)if(n.length>t)n.splice(t);else for(;n.length<t;)n.push("");for(;i<n.length;i++)n[i]=n[i].trim().replace(/\\\|/g,"|");return n}function M(a,t,e){const n=a.length;if(n===0)return"";let i=0;for(;i<n&&a.charAt(n-i-1)===t;)i++;return a.slice(0,n-i)}function Je(a,t){if(a.indexOf(t[1])===-1)return-1;let e=0;for(let n=0;n<a.length;n++)if(a[n]==="\\")n++;else if(a[n]===t[0])e++;else if(a[n]===t[1]&&(e--,e<0))return n;return-1}function me(a,t,e,n){const i=t.href,r=t.title?m(t.title):null,s=a[1].replace(/\\([\[\]])/g,"$1");if(a[0].charAt(0)!=="!"){n.state.inLink=!0;const o={type:"link",raw:e,href:i,title:r,text:s,tokens:n.inlineTokens(s)};return n.state.inLink=!1,o}return{type:"image",raw:e,href:i,title:r,text:m(s)}}function Ye(a,t){const e=a.match(/^(\s+)(?:```)/);if(e===null)return t;const n=e[1];return t.split(`
var Ce=Object.defineProperty;var ae=a=>{throw TypeError(a)};var Ee=(a,t,e)=>t in a?Ce(a,t,{enumerable:!0,configurable:!0,writable:!0,value:e}):a[t]=e;var k=(a,t,e)=>Ee(a,typeof t!="symbol"?t+"":t,e),Le=(a,t,e)=>t.has(a)||ae("Cannot "+e);var ce=(a,t,e)=>t.has(a)?ae("Cannot add the same private member more than once"):t instanceof WeakSet?t.add(a):t.set(a,e);var Z=(a,t,e)=>(Le(a,t,"access private method"),e);import{E as V,d as Be,y as qe,c as z,a as x,n as U,e as P,w as I,F as Ze,r as Pe,s as A,o as _,q as G,k as pe,t as W,h as Me,i as he,K as ue}from"./index-BP_aNEdP.js";import{a as De,_ as Qe}from"./CardContent.vue_vue_type_script_setup_true_lang-B8VjSxLa.js";import{_ as fe}from"./Badge.vue_vue_type_script_setup_true_lang-B2H6z2RD.js";import{_ as Ne}from"./Button.vue_vue_type_script_setup_true_lang-B_YE_XNW.js";import{_ as je}from"./Spinner.vue_vue_type_script_setup_true_lang-Cu49-Cc4.js";import{a as Oe,i as He}from"./utils-7WVCegLb.js";import{_ as Fe}from"./_plugin-vue_export-helper-DlAUqK2U.js";const de={list:()=>V.get("/api/reports"),get:a=>V.get(`/api/reports/${a}`),generate:a=>V.post("/api/reports/generate",a)};function J(){return{async:!1,breaks:!1,extensions:null,gfm:!0,hooks:null,pedantic:!1,renderer:null,silent:!1,tokenizer:null,walkTokens:null}}let S=J();function we(a){S=a}const ye=/[&<>"']/,Ve=new RegExp(ye.source,"g"),_e=/[<>"']|&(?!(#\d{1,7}|#[Xx][a-fA-F0-9]{1,6}|\w+);)/,Ue=new RegExp(_e.source,"g"),Ge={"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#39;"},ge=a=>Ge[a];function m(a,t){if(t){if(ye.test(a))return a.replace(Ve,ge)}else if(_e.test(a))return a.replace(Ue,ge);return a}const We=/&(#(?:\d+)|(?:#x[0-9A-Fa-f]+)|(?:\w+));?/ig;function Xe(a){return a.replace(We,(t,e)=>(e=e.toLowerCase(),e==="colon"?":":e.charAt(0)==="#"?e.charAt(1)==="x"?String.fromCharCode(parseInt(e.substring(2),16)):String.fromCharCode(+e.substring(1)):""))}const Ke=/(^|[^\[])\^/g;function g(a,t){let e=typeof a=="string"?a:a.source;t=t||"";const n={replace:(i,r)=>{let s=typeof r=="string"?r:r.source;return s=s.replace(Ke,"$1"),e=e.replace(i,s),n},getRegex:()=>new RegExp(e,t)};return n}function ke(a){try{a=encodeURI(a).replace(/%25/g,"%")}catch{return null}return a}const E={exec:()=>null};function xe(a,t){const e=a.replace(/\|/g,(r,s,o)=>{let l=!1,u=s;for(;--u>=0&&o[u]==="\\";)l=!l;return l?"|":" |"}),n=e.split(/ \|/);let i=0;if(n[0].trim()||n.shift(),n.length>0&&!n[n.length-1].trim()&&n.pop(),t)if(n.length>t)n.splice(t);else for(;n.length<t;)n.push("");for(;i<n.length;i++)n[i]=n[i].trim().replace(/\\\|/g,"|");return n}function M(a,t,e){const n=a.length;if(n===0)return"";let i=0;for(;i<n&&a.charAt(n-i-1)===t;)i++;return a.slice(0,n-i)}function Je(a,t){if(a.indexOf(t[1])===-1)return-1;let e=0;for(let n=0;n<a.length;n++)if(a[n]==="\\")n++;else if(a[n]===t[0])e++;else if(a[n]===t[1]&&(e--,e<0))return n;return-1}function me(a,t,e,n){const i=t.href,r=t.title?m(t.title):null,s=a[1].replace(/\\([\[\]])/g,"$1");if(a[0].charAt(0)!=="!"){n.state.inLink=!0;const o={type:"link",raw:e,href:i,title:r,text:s,tokens:n.inlineTokens(s)};return n.state.inLink=!1,o}return{type:"image",raw:e,href:i,title:r,text:m(s)}}function Ye(a,t){const e=a.match(/^(\s+)(?:```)/);if(e===null)return t;const n=e[1];return t.split(`
`).map(i=>{const r=i.match(/^\s+/);if(r===null)return i;const[s]=r;return s.length>=n.length?i.slice(n.length):i}).join(`
`)}class Q{constructor(t){k(this,"options");k(this,"rules");k(this,"lexer");this.options=t||S}space(t){const e=this.rules.block.newline.exec(t);if(e&&e[0].length>0)return{type:"space",raw:e[0]}}code(t){const e=this.rules.block.code.exec(t);if(e){const n=e[0].replace(/^ {1,4}/gm,"");return{type:"code",raw:e[0],codeBlockStyle:"indented",text:this.options.pedantic?n:M(n,`
`)}}}fences(t){const e=this.rules.block.fences.exec(t);if(e){const n=e[0],i=Ye(n,e[3]||"");return{type:"code",raw:n,lang:e[2]?e[2].trim().replace(this.rules.inline.anyPunctuation,"$1"):e[2],text:i}}}heading(t){const e=this.rules.block.heading.exec(t);if(e){let n=e[2].trim();if(/#$/.test(n)){const i=M(n,"#");(this.options.pedantic||!i||/ $/.test(i))&&(n=i.trim())}return{type:"heading",raw:e[0],depth:e[1].length,text:n,tokens:this.lexer.inline(n)}}}hr(t){const e=this.rules.block.hr.exec(t);if(e)return{type:"hr",raw:e[0]}}blockquote(t){const e=this.rules.block.blockquote.exec(t);if(e){let n=e[0].replace(/\n {0,3}((?:=+|-+) *)(?=\n|$)/g,`

View file

@ -1 +1 @@
import{d as N,u as E,x as P,c as U,a,e as t,w as s,q as f,o as k,p as u,h as c,k as z,i as B,E as I,K as x}from"./index-Coy22yOp.js";import{u as F}from"./devops-CA4DvhgQ.js";import{_ as w,a as V}from"./CardContent.vue_vue_type_script_setup_true_lang-DUVu0jq9.js";import{_ as $,a as S}from"./CardTitle.vue_vue_type_script_setup_true_lang-oG7GV-Yg.js";import{_ as y}from"./Input.vue_vue_type_script_setup_true_lang-BI-qyrUT.js";import{_}from"./Button.vue_vue_type_script_setup_true_lang-B1z2uxja.js";import{_ as O}from"./DevopsConnectForm.vue_vue_type_script_setup_true_lang-MckPP1w4.js";import{i as C}from"./utils-7WVCegLb.js";import"./Spinner.vue_vue_type_script_setup_true_lang-B7DG-xnx.js";function T(i,l){const n=`/cc-dashboard/api/export/timesheet.csv?from=${i}&to=${l}`,o=document.createElement("a");o.href=n,o.download=`timesheet-${i}-${l}.csv`,o.click()}function A(i,l){const n=`/cc-dashboard/api/export/timesheet.ics?from=${i}&to=${l}`,o=document.createElement("a");o.href=n,o.download=`timesheet-${i}-${l}.ics`,o.click()}const H={class:"p-6 space-y-6 max-w-2xl"},K={class:"space-y-1.5"},M={class:"space-y-1.5"},j={class:"flex items-center justify-between"},q={class:"flex items-center gap-3 flex-wrap"},h={class:"space-y-1.5"},G={class:"space-y-1.5"},J={class:"flex items-center gap-2"},se=N({__name:"SettingsView",setup(i){const l=E(),n=F(),o=f(""),p=f(0),g=f(!1),d=f(""),m=f("");P(()=>{l.user&&(o.value=l.user.username,p.value=l.user.daily_overhead_hours??0),n.fetchIntegration();const v=new Date;m.value=C(v);const e=new Date(v);e.setDate(v.getDate()-30),d.value=C(e)});async function D(){g.value=!0;try{await I.patch("/api/auth/me",{username:o.value,daily_overhead_hours:p.value}),await l.fetchMe(),x.success("Profile saved")}catch{x.error("Failed to save profile")}finally{g.value=!1}}async function b(){try{await n.sync(),x.success("Sync complete")}catch{x.error(n.error??"Sync failed")}}return(v,e)=>(k(),U("div",H,[e[18]||(e[18]=a("h2",{class:"text-lg font-semibold text-foreground"},"Settings",-1)),t(w,null,{default:s(()=>[t($,null,{default:s(()=>[t(S,{class:"text-sm"},{default:s(()=>[...e[6]||(e[6]=[u("Profile",-1)])]),_:1})]),_:1}),t(V,{class:"space-y-4"},{default:s(()=>[a("div",K,[e[7]||(e[7]=a("label",{class:"text-sm font-medium text-foreground"},"Username",-1)),t(y,{modelValue:o.value,"onUpdate:modelValue":e[0]||(e[0]=r=>o.value=r),placeholder:"username"},null,8,["modelValue"])]),a("div",M,[e[8]||(e[8]=a("label",{class:"text-sm font-medium text-foreground"},"Daily Overhead Hours",-1)),t(y,{modelValue:p.value,"onUpdate:modelValue":e[1]||(e[1]=r=>p.value=r),type:"number",min:"0",max:"8",step:"0.25",class:"w-32"},null,8,["modelValue"]),e[9]||(e[9]=a("p",{class:"text-xs text-muted-foreground"}," Hours per day to add for overhead / meetings ",-1))]),t(_,{loading:g.value,onClick:D},{default:s(()=>[...e[10]||(e[10]=[u("Save Profile",-1)])]),_:1},8,["loading"])]),_:1})]),_:1}),t(w,null,{default:s(()=>[t($,null,{default:s(()=>[a("div",j,[t(S,{class:"text-sm"},{default:s(()=>[...e[11]||(e[11]=[u("Azure DevOps Integration",-1)])]),_:1}),c(n).integration?(k(),z(_,{key:0,variant:"outline",size:"sm",loading:c(n).syncing,onClick:b},{default:s(()=>[...e[12]||(e[12]=[u(" Sync Now ",-1)])]),_:1},8,["loading"])):B("",!0)])]),_:1}),t(V,null,{default:s(()=>[t(O)]),_:1})]),_:1}),t(w,null,{default:s(()=>[t($,null,{default:s(()=>[t(S,{class:"text-sm"},{default:s(()=>[...e[13]||(e[13]=[u("Export",-1)])]),_:1})]),_:1}),t(V,{class:"space-y-4"},{default:s(()=>[a("div",q,[a("div",h,[e[14]||(e[14]=a("label",{class:"text-xs text-muted-foreground"},"From",-1)),t(y,{modelValue:d.value,"onUpdate:modelValue":e[2]||(e[2]=r=>d.value=r),type:"date",class:"h-8 text-xs"},null,8,["modelValue"])]),a("div",G,[e[15]||(e[15]=a("label",{class:"text-xs text-muted-foreground"},"To",-1)),t(y,{modelValue:m.value,"onUpdate:modelValue":e[3]||(e[3]=r=>m.value=r),type:"date",class:"h-8 text-xs"},null,8,["modelValue"])])]),a("div",J,[t(_,{variant:"outline",size:"sm",onClick:e[4]||(e[4]=r=>c(T)(d.value,m.value))},{default:s(()=>[...e[16]||(e[16]=[u(" Download CSV ",-1)])]),_:1}),t(_,{variant:"outline",size:"sm",onClick:e[5]||(e[5]=r=>c(A)(d.value,m.value))},{default:s(()=>[...e[17]||(e[17]=[u(" Download ICS ",-1)])]),_:1})])]),_:1})]),_:1})]))}});export{se as default};
import{d as N,u as E,y as P,c as U,a,e as t,w as s,s as f,o as k,q as u,h as c,k as z,i as B,E as I,K as x}from"./index-BP_aNEdP.js";import{u as F}from"./devops-DxRDHPW5.js";import{_ as w,a as V}from"./CardContent.vue_vue_type_script_setup_true_lang-B8VjSxLa.js";import{_ as $,a as S}from"./CardTitle.vue_vue_type_script_setup_true_lang-KH4UhlTi.js";import{_ as y}from"./Input.vue_vue_type_script_setup_true_lang-SeygKlpx.js";import{_}from"./Button.vue_vue_type_script_setup_true_lang-B_YE_XNW.js";import{_ as O}from"./DevopsConnectForm.vue_vue_type_script_setup_true_lang-DQc_dk7n.js";import{i as C}from"./utils-7WVCegLb.js";import"./Spinner.vue_vue_type_script_setup_true_lang-Cu49-Cc4.js";function T(i,l){const n=`/cc-dashboard/api/export/timesheet.csv?from=${i}&to=${l}`,o=document.createElement("a");o.href=n,o.download=`timesheet-${i}-${l}.csv`,o.click()}function A(i,l){const n=`/cc-dashboard/api/export/timesheet.ics?from=${i}&to=${l}`,o=document.createElement("a");o.href=n,o.download=`timesheet-${i}-${l}.ics`,o.click()}const H={class:"p-6 space-y-6 max-w-2xl"},K={class:"space-y-1.5"},M={class:"space-y-1.5"},j={class:"flex items-center justify-between"},q={class:"flex items-center gap-3 flex-wrap"},h={class:"space-y-1.5"},G={class:"space-y-1.5"},J={class:"flex items-center gap-2"},se=N({__name:"SettingsView",setup(i){const l=E(),n=F(),o=f(""),p=f(0),g=f(!1),d=f(""),m=f("");P(()=>{l.user&&(o.value=l.user.username,p.value=l.user.daily_overhead_hours??0),n.fetchIntegration();const v=new Date;m.value=C(v);const e=new Date(v);e.setDate(v.getDate()-30),d.value=C(e)});async function D(){g.value=!0;try{await I.patch("/api/auth/me",{username:o.value,daily_overhead_hours:p.value}),await l.fetchMe(),x.success("Profile saved")}catch{x.error("Failed to save profile")}finally{g.value=!1}}async function b(){try{await n.sync(),x.success("Sync complete")}catch{x.error(n.error??"Sync failed")}}return(v,e)=>(k(),U("div",H,[e[18]||(e[18]=a("h2",{class:"text-lg font-semibold text-foreground"},"Settings",-1)),t(w,null,{default:s(()=>[t($,null,{default:s(()=>[t(S,{class:"text-sm"},{default:s(()=>[...e[6]||(e[6]=[u("Profile",-1)])]),_:1})]),_:1}),t(V,{class:"space-y-4"},{default:s(()=>[a("div",K,[e[7]||(e[7]=a("label",{class:"text-sm font-medium text-foreground"},"Username",-1)),t(y,{modelValue:o.value,"onUpdate:modelValue":e[0]||(e[0]=r=>o.value=r),placeholder:"username"},null,8,["modelValue"])]),a("div",M,[e[8]||(e[8]=a("label",{class:"text-sm font-medium text-foreground"},"Daily Overhead Hours",-1)),t(y,{modelValue:p.value,"onUpdate:modelValue":e[1]||(e[1]=r=>p.value=r),type:"number",min:"0",max:"8",step:"0.25",class:"w-32"},null,8,["modelValue"]),e[9]||(e[9]=a("p",{class:"text-xs text-muted-foreground"}," Hours per day to add for overhead / meetings ",-1))]),t(_,{loading:g.value,onClick:D},{default:s(()=>[...e[10]||(e[10]=[u("Save Profile",-1)])]),_:1},8,["loading"])]),_:1})]),_:1}),t(w,null,{default:s(()=>[t($,null,{default:s(()=>[a("div",j,[t(S,{class:"text-sm"},{default:s(()=>[...e[11]||(e[11]=[u("Azure DevOps Integration",-1)])]),_:1}),c(n).integration?(k(),z(_,{key:0,variant:"outline",size:"sm",loading:c(n).syncing,onClick:b},{default:s(()=>[...e[12]||(e[12]=[u(" Sync Now ",-1)])]),_:1},8,["loading"])):B("",!0)])]),_:1}),t(V,null,{default:s(()=>[t(O)]),_:1})]),_:1}),t(w,null,{default:s(()=>[t($,null,{default:s(()=>[t(S,{class:"text-sm"},{default:s(()=>[...e[13]||(e[13]=[u("Export",-1)])]),_:1})]),_:1}),t(V,{class:"space-y-4"},{default:s(()=>[a("div",q,[a("div",h,[e[14]||(e[14]=a("label",{class:"text-xs text-muted-foreground"},"From",-1)),t(y,{modelValue:d.value,"onUpdate:modelValue":e[2]||(e[2]=r=>d.value=r),type:"date",class:"h-8 text-xs"},null,8,["modelValue"])]),a("div",G,[e[15]||(e[15]=a("label",{class:"text-xs text-muted-foreground"},"To",-1)),t(y,{modelValue:m.value,"onUpdate:modelValue":e[3]||(e[3]=r=>m.value=r),type:"date",class:"h-8 text-xs"},null,8,["modelValue"])])]),a("div",J,[t(_,{variant:"outline",size:"sm",onClick:e[4]||(e[4]=r=>c(T)(d.value,m.value))},{default:s(()=>[...e[16]||(e[16]=[u(" Download CSV ",-1)])]),_:1}),t(_,{variant:"outline",size:"sm",onClick:e[5]||(e[5]=r=>c(A)(d.value,m.value))},{default:s(()=>[...e[17]||(e[17]=[u(" Download ICS ",-1)])]),_:1})])]),_:1})]),_:1})]))}});export{se as default};

View file

@ -1 +1 @@
import{d as l,o as n,c as o,n as t,a as r}from"./index-Coy22yOp.js";const i=l({__name:"Spinner",props:{size:{},class:{}},setup(s){return(a,e)=>(n(),o("svg",{class:t(["animate-spin text-current",s.size==="sm"?"h-3 w-3":s.size==="lg"?"h-6 w-6":"h-4 w-4",a.$props.class]),xmlns:"http://www.w3.org/2000/svg",fill:"none",viewBox:"0 0 24 24"},[...e[0]||(e[0]=[r("circle",{class:"opacity-25",cx:"12",cy:"12",r:"10",stroke:"currentColor","stroke-width":"4"},null,-1),r("path",{class:"opacity-75",fill:"currentColor",d:"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z"},null,-1)])],2))}});export{i as _};
import{d as l,o as n,c as o,n as t,a as r}from"./index-BP_aNEdP.js";const i=l({__name:"Spinner",props:{size:{},class:{}},setup(s){return(a,e)=>(n(),o("svg",{class:t(["animate-spin text-current",s.size==="sm"?"h-3 w-3":s.size==="lg"?"h-6 w-6":"h-4 w-4",a.$props.class]),xmlns:"http://www.w3.org/2000/svg",fill:"none",viewBox:"0 0 24 24"},[...e[0]||(e[0]=[r("circle",{class:"opacity-25",cx:"12",cy:"12",r:"10",stroke:"currentColor","stroke-width":"4"},null,-1),r("path",{class:"opacity-75",fill:"currentColor",d:"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z"},null,-1)])],2))}});export{i as _};

File diff suppressed because one or more lines are too long

View file

@ -1 +1 @@
import{E as e}from"./index-Coy22yOp.js";const i={users:()=>e.get("/api/admin/users"),keys:()=>e.get("/api/keys"),createKey:s=>e.post("/api/keys",s),revokeKey:s=>e.delete(`/api/keys/${s}`)};export{i as a};
import{E as e}from"./index-BP_aNEdP.js";const i={users:()=>e.get("/api/admin/users"),keys:()=>e.get("/api/keys"),createKey:s=>e.post("/api/keys",s),revokeKey:s=>e.delete(`/api/keys/${s}`)};export{i as a};

View file

@ -1 +1 @@
import{E as t}from"./index-Coy22yOp.js";const e={summary:a=>t.get("/api/dashboard/summary",{params:a}),projects:a=>t.get("/api/dashboard/projects",{params:a}),timeline:a=>t.get("/api/dashboard/timeline",{params:a}),monthly:a=>t.get("/api/dashboard/monthly",{params:a}),dow:a=>t.get("/api/dashboard/dow",{params:a}),tools:a=>t.get("/api/dashboard/tools",{params:a}),activity:a=>t.get("/api/dashboard/activity",{params:a}),calendar:a=>t.get("/api/dashboard/calendar",{params:a}),project:(a,o)=>t.get("/api/dashboard/project/"+a,{params:o})};export{e as d};
import{E as t}from"./index-BP_aNEdP.js";const e={summary:a=>t.get("/api/dashboard/summary",{params:a}),projects:a=>t.get("/api/dashboard/projects",{params:a}),timeline:a=>t.get("/api/dashboard/timeline",{params:a}),monthly:a=>t.get("/api/dashboard/monthly",{params:a}),dow:a=>t.get("/api/dashboard/dow",{params:a}),tools:a=>t.get("/api/dashboard/tools",{params:a}),activity:a=>t.get("/api/dashboard/activity",{params:a}),calendar:a=>t.get("/api/dashboard/calendar",{params:a}),project:(a,o)=>t.get("/api/dashboard/project/"+a,{params:o})};export{e as d};

View file

@ -1 +1 @@
import{E as s,B as I,q as o}from"./index-Coy22yOp.js";const i={getIntegration:()=>s.get("/api/devops/integration"),saveIntegration:e=>s.put("/api/devops/integration",e),deleteIntegration:()=>s.delete("/api/devops/integration"),sync:()=>s.post("/api/devops/sync"),workItems:e=>s.get("/api/devops/work-items",{params:e?{state:e}:void 0})},m=I("devops",()=>{const e=o(null),l=o([]),r=o(!1),n=o(!1),c=o(null);async function u(){n.value=!0;try{const t=await i.getIntegration();e.value=t.data}catch{e.value=null}finally{n.value=!1}}async function d(t){const a=await i.saveIntegration(t);e.value=a.data}async function g(){await i.deleteIntegration(),e.value=null}async function f(){var t,a;r.value=!0,c.value=null;try{await i.sync(),await u()}catch(v){const p=v;throw c.value=((a=(t=p.response)==null?void 0:t.data)==null?void 0:a.detail)??p.message??"Sync failed",v}finally{r.value=!1}}async function y(t){n.value=!0;try{const a=await i.workItems(t);l.value=a.data}catch{l.value=[]}finally{n.value=!1}}return{integration:e,workItems:l,syncing:r,loading:n,error:c,fetchIntegration:u,saveIntegration:d,deleteIntegration:g,sync:f,fetchWorkItems:y}});export{m as u};
import{E as s,C as I,s as o}from"./index-BP_aNEdP.js";const i={getIntegration:()=>s.get("/api/devops/integration"),saveIntegration:e=>s.put("/api/devops/integration",e),deleteIntegration:()=>s.delete("/api/devops/integration"),sync:()=>s.post("/api/devops/sync"),workItems:e=>s.get("/api/devops/work-items",{params:e?{state:e}:void 0})},m=I("devops",()=>{const e=o(null),l=o([]),r=o(!1),n=o(!1),c=o(null);async function u(){n.value=!0;try{const t=await i.getIntegration();e.value=t.data}catch{e.value=null}finally{n.value=!1}}async function d(t){const a=await i.saveIntegration(t);e.value=a.data}async function g(){await i.deleteIntegration(),e.value=null}async function f(){var t,a;r.value=!0,c.value=null;try{await i.sync(),await u()}catch(v){const p=v;throw c.value=((a=(t=p.response)==null?void 0:t.data)==null?void 0:a.detail)??p.message??"Sync failed",v}finally{r.value=!1}}async function y(t){n.value=!0;try{const a=await i.workItems(t);l.value=a.data}catch{l.value=[]}finally{n.value=!1}}return{integration:e,workItems:l,syncing:r,loading:n,error:c,fetchIntegration:u,saveIntegration:d,deleteIntegration:g,sync:f,fetchWorkItems:y}});export{m as u};

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View file

@ -0,0 +1 @@
import{E as l,C as w,s as i}from"./index-BP_aNEdP.js";const o={list:a=>l.get("/api/tasks",{params:a}),get:a=>l.get(`/api/tasks/${a}`),create:a=>l.post("/api/tasks",a),update:(a,s)=>l.patch(`/api/tasks/${a}`,s),remove:a=>l.delete(`/api/tasks/${a}`),complete:a=>l.post(`/api/tasks/${a}/complete`),blocks:a=>l.get(`/api/tasks/${a}/blocks`),createBlock:(a,s)=>l.post(`/api/tasks/${a}/blocks`,s),updateBlock:(a,s)=>l.patch(`/api/tasks/blocks/${a}`,s),deleteBlock:a=>l.delete(`/api/tasks/blocks/${a}`)},b=Object.freeze(Object.defineProperty({__proto__:null,tasksApi:o},Symbol.toStringTag,{value:"Module"})),$=w("tasks",()=>{const a=i([]),s=i(!1),n=i(null);async function u(t){s.value=!0,n.value=null;try{const e=await o.list({date:t});a.value=e.data}catch(e){const c=e;n.value=c.message??"Failed to fetch tasks"}finally{s.value=!1}}async function d(t){s.value=!0,n.value=null;try{const e=await o.list(t?{project_id:t}:void 0);a.value=e.data}catch(e){const c=e;n.value=c.message??"Failed to fetch tasks"}finally{s.value=!1}}async function p(t){const e=await o.create(t);return a.value.push(e.data),e.data}async function k(t,e){const c=await o.update(t,e),r=a.value.findIndex(h=>h.id===t);return r!==-1&&(a.value[r]=c.data),c.data}async function f(t){await o.remove(t),a.value=a.value.filter(e=>e.id!==t)}async function v(t){const e=await o.complete(t),c=a.value.findIndex(r=>r.id===t);return c!==-1&&(a.value[c]=e.data),e.data}async function y(t,e){return(await o.createBlock(t,e)).data}async function m(t,e){return(await o.updateBlock(t,e)).data}async function g(t){await o.deleteBlock(t)}return{tasks:a,loading:s,error:n,fetchForDate:u,fetchAll:d,create:p,update:k,remove:f,complete:v,createBlock:y,updateBlock:m,deleteBlock:g}});export{b as t,$ as u};

View file

@ -14,8 +14,8 @@
else { document.documentElement.classList.remove('dark'); }
})();
</script>
<script type="module" crossorigin src="/cc-dashboard/static/assets/index-Coy22yOp.js"></script>
<link rel="stylesheet" crossorigin href="/cc-dashboard/static/assets/index-CYkXL5qI.css">
<script type="module" crossorigin src="/cc-dashboard/static/assets/index-BP_aNEdP.js"></script>
<link rel="stylesheet" crossorigin href="/cc-dashboard/static/assets/index-Bq2H3vqg.css">
</head>
<body>
<div id="app"></div>

View file

@ -1,6 +1,6 @@
<script setup lang="ts">
import { computed } from 'vue'
import { useRoute } from 'vue-router'
import { useRoute, RouterLink } from 'vue-router'
import { useAuthStore } from '@/stores/auth'
const route = useRoute()
@ -13,12 +13,13 @@ interface NavItem {
path: string
icon: string
adminOnly?: boolean
external?: boolean
}
const navItems: NavItem[] = [
{ name: 'Dashboard', path: '/', icon: 'grid' },
{ name: 'Calendar', path: '/calendar', icon: 'calendar' },
{ name: 'Planner', path: '/planner', icon: 'check-square' },
{ name: 'Tasks', path: '/board', icon: 'check-square', external: true },
{ name: 'Projects', path: '/projects', icon: 'folder' },
{ name: 'Live Feed', path: '/live', icon: 'activity' },
{ name: 'Reports', path: '/reports', icon: 'file-text' },
@ -63,10 +64,11 @@ const userInitials = computed(() => {
<!-- Navigation -->
<nav class="flex-1 px-2 py-3 space-y-0.5 overflow-y-auto">
<RouterLink
<component
:is="item.external ? 'a' : RouterLink"
v-for="item in visibleItems"
:key="item.path"
:to="item.path"
v-bind="item.external ? { href: item.path, target: '_blank', rel: 'noopener' } : { to: item.path }"
:class="[
'relative flex items-center gap-3 px-3 h-10 rounded-lg text-sm font-medium transition-all duration-150 group',
isActive(item.path)
@ -120,7 +122,7 @@ const userInitials = computed(() => {
</svg>
<span class="text-sm">{{ item.name }}</span>
</RouterLink>
</component>
</nav>
<!-- User info at bottom -->

View file

@ -1,113 +0,0 @@
<script setup lang="ts">
import type { Task } from '@/types'
import Badge from '@/components/ui/Badge.vue'
import { formatDuration } from '@/lib/utils'
const props = defineProps<{
task: Task
draggable?: boolean
}>()
const emit = defineEmits<{
edit: [task: Task]
complete: [task: Task]
delete: [task: Task]
}>()
const statusVariant = (status: Task['status']) => {
const map: Record<Task['status'], 'default' | 'secondary' | 'success' | 'warning' | 'outline'> = {
todo: 'outline',
doing: 'default',
done: 'success',
cancelled: 'secondary',
}
return map[status]
}
const priorityLabel = (p: number): string => {
const labels = ['', 'Low', 'Medium', 'High', 'Critical', 'Blocker']
return labels[p] ?? 'Unknown'
}
const priorityColor = (p: number) => {
if (p >= 4) return 'bg-red-500'
if (p === 3) return 'bg-amber-500'
return 'bg-emerald-500'
}
</script>
<template>
<div
:draggable="draggable"
class="rounded-lg border border-border bg-card p-3 hover:border-primary/50 transition-colors cursor-pointer group"
@click="emit('edit', task)"
>
<div class="flex items-start gap-2">
<!-- Priority dot -->
<div
:class="['h-2 w-2 rounded-full mt-1.5 shrink-0', priorityColor(task.priority)]"
:title="priorityLabel(task.priority)"
/>
<div class="flex-1 min-w-0">
<!-- Title -->
<p class="text-sm font-medium text-foreground leading-tight truncate">{{ task.title }}</p>
<!-- Tags -->
<div v-if="task.tags?.length" class="flex items-center gap-1 mt-1 flex-wrap">
<span
v-for="tag in task.tags"
:key="tag.id"
class="inline-flex items-center px-1.5 py-0.5 rounded text-xs font-medium"
:style="{ background: `${tag.color_hex}22`, color: tag.color_hex }"
>
{{ tag.name }}
</span>
</div>
<!-- Meta row -->
<div class="flex items-center gap-2 mt-1.5 flex-wrap">
<Badge :variant="statusVariant(task.status)" class="text-xs py-0">
{{ task.status }}
</Badge>
<span v-if="task.estimate_hours" class="text-xs text-muted-foreground">
~{{ formatDuration(task.estimate_hours) }}
</span>
<span v-if="task.actual_hours" class="text-xs text-emerald-400">
{{ formatDuration(task.actual_hours) }} actual
</span>
<span
v-if="task.azure_work_item_id"
class="text-xs text-blue-400 ml-auto"
title="Azure DevOps"
>
#{{ task.azure_work_item_id }}
</span>
</div>
</div>
<!-- Actions -->
<div class="flex items-center gap-1 opacity-0 group-hover:opacity-100 shrink-0">
<button
v-if="task.status !== 'done'"
class="p-1 rounded hover:bg-emerald-500/20 text-emerald-400"
title="Mark done"
@click.stop="emit('complete', task)"
>
<svg class="h-3.5 w-3.5" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M5 13l4 4L19 7" />
</svg>
</button>
<button
class="p-1 rounded hover:bg-red-500/20 text-red-400"
title="Delete"
@click.stop="emit('delete', task)"
>
<svg class="h-3.5 w-3.5" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M19 7l-.867 12.142A2 2 0 0116.138 21H7.862a2 2 0 01-1.995-1.858L5 7m5 4v6m4-6v6m1-10V4a1 1 0 00-1-1h-4a1 1 0 00-1 1v3M4 7h16" />
</svg>
</button>
</div>
</div>
</div>
</template>

View file

@ -1,75 +0,0 @@
<script setup lang="ts">
import { computed } from 'vue'
import type { Task } from '@/types'
import TaskCard from './TaskCard.vue'
const props = defineProps<{
tasks: Task[]
loading?: boolean
}>()
const emit = defineEmits<{
edit: [task: Task]
complete: [task: Task]
delete: [task: Task]
}>()
const grouped = computed(() => {
const groups: Record<string, Task[]> = {
doing: [],
todo: [],
done: [],
cancelled: [],
}
for (const task of props.tasks) {
groups[task.status]?.push(task)
}
return groups
})
const statusLabels: Record<string, string> = {
doing: 'In Progress',
todo: 'To Do',
done: 'Done',
cancelled: 'Cancelled',
}
</script>
<template>
<div class="space-y-6">
<div v-if="loading" class="text-sm text-muted-foreground py-4 text-center">Loading tasks...</div>
<template v-else>
<div
v-for="(group, status) in grouped"
:key="status"
v-show="group.length > 0"
>
<div class="flex items-center gap-2 mb-2">
<h3 class="text-xs font-semibold uppercase tracking-wide text-muted-foreground">
{{ statusLabels[status] }}
</h3>
<span class="text-xs text-muted-foreground bg-muted px-1.5 py-0.5 rounded-full">
{{ group.length }}
</span>
</div>
<div class="space-y-2">
<TaskCard
v-for="task in group"
:key="task.id"
:task="task"
draggable
@edit="emit('edit', task)"
@complete="emit('complete', task)"
@delete="emit('delete', task)"
/>
</div>
</div>
<div
v-if="!props.tasks.length"
class="text-sm text-muted-foreground text-center py-8"
>
No tasks found
</div>
</template>
</div>
</template>

View file

@ -22,11 +22,6 @@ const routes = [
name: 'calendar',
component: () => import('@/views/CalendarView.vue'),
},
{
path: 'planner',
name: 'planner',
component: () => import('@/views/PlannerView.vue'),
},
{
path: 'projects',
name: 'projects',

View file

@ -1,156 +0,0 @@
<script setup lang="ts">
import { ref, watch, computed, onMounted } from 'vue'
import { useTasksStore } from '@/stores/tasks'
import TaskList from '@/components/tasks/TaskList.vue'
import TaskForm from '@/components/tasks/TaskForm.vue'
import Button from '@/components/ui/Button.vue'
import Input from '@/components/ui/Input.vue'
import { toast } from 'vue-sonner'
import { isoDateStr } from '@/lib/utils'
import type { Task } from '@/types'
import type { TaskCreatePayload, TaskUpdatePayload } from '@/api/endpoints/tasks'
const tasksStore = useTasksStore()
const selectedDate = ref(isoDateStr(new Date()))
const showForm = ref(false)
const editingTask = ref<Task | null>(null)
const filterProject = ref('')
onMounted(() => {
tasksStore.fetchForDate(selectedDate.value)
})
watch(selectedDate, () => {
tasksStore.fetchForDate(selectedDate.value)
})
const filteredTasks = computed(() => {
if (!filterProject.value) return tasksStore.tasks
return tasksStore.tasks.filter(
(t) =>
t.project_id?.toLowerCase().includes(filterProject.value.toLowerCase()) ||
t.title.toLowerCase().includes(filterProject.value.toLowerCase())
)
})
function openCreate() {
editingTask.value = null
showForm.value = true
}
function openEdit(task: Task) {
editingTask.value = task
showForm.value = true
}
async function handleSave(payload: TaskCreatePayload | TaskUpdatePayload, block?: { start_at: string; end_at: string }) {
try {
if (editingTask.value) {
await tasksStore.update(editingTask.value.id, payload as TaskUpdatePayload)
toast.success('Task updated')
} else {
const newTask = await tasksStore.create(payload as TaskCreatePayload)
if (block && newTask?.id) {
await tasksStore.createBlock(newTask.id, block)
}
toast.success('Task created')
}
showForm.value = false
tasksStore.fetchForDate(selectedDate.value)
} catch {
toast.error('Failed to save task')
}
}
async function handleComplete(task: Task) {
try {
await tasksStore.complete(task.id)
toast.success('Task completed')
} catch {
toast.error('Failed to complete task')
}
}
async function handleDelete(task: Task) {
if (!confirm(`Delete "${task.title}"?`)) return
try {
await tasksStore.remove(task.id)
toast.success('Task deleted')
} catch {
toast.error('Failed to delete task')
}
}
function navigateDate(dir: -1 | 1) {
const d = new Date(selectedDate.value)
d.setDate(d.getDate() + dir)
selectedDate.value = isoDateStr(d)
}
</script>
<template>
<div class="p-6">
<!-- Header -->
<div class="flex items-center gap-3 mb-6 flex-wrap">
<h2 class="text-lg font-semibold text-foreground flex-1">Planner</h2>
<!-- Date navigation -->
<div class="flex items-center gap-1">
<Button variant="outline" size="sm" @click="navigateDate(-1)">
<svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M15 19l-7-7 7-7" />
</svg>
</Button>
<Input
v-model="selectedDate"
type="date"
class="h-8 w-36 text-xs"
/>
<Button variant="outline" size="sm" @click="navigateDate(1)">
<svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 5l7 7-7 7" />
</svg>
</Button>
<Button
variant="outline"
size="sm"
@click="selectedDate = isoDateStr(new Date())"
>Today</Button>
</div>
<!-- Filter -->
<Input
v-model="filterProject"
placeholder="Search tasks..."
class="h-8 w-40 text-xs"
/>
<!-- New task -->
<Button size="sm" @click="openCreate">
<svg class="h-4 w-4 mr-1.5" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M12 4v16m8-8H4" />
</svg>
New Task
</Button>
</div>
<!-- Task list -->
<TaskList
:tasks="filteredTasks"
:loading="tasksStore.loading"
@edit="openEdit"
@complete="handleComplete"
@delete="handleDelete"
/>
<!-- Form dialog -->
<TaskForm
:open="showForm"
:task="editingTask"
:default-date="selectedDate"
@close="showForm = false"
@save="handleSave"
/>
</div>
</template>