Commit Graph

102 Commits

Author SHA1 Message Date
8e52e2bf74 feat(ui): overridable favicon/logo with branded default
Replace the  emoji with a real logo image used as the in-app brand
mark and the favicon. Default bundled public/logo.svg is the
HangmanLab mark recolored to the Foundry-Deck ember (#ff6a1a).
Override at deploy time via HARBORFORGE_LOGO_URL (injected into
runtime-config.js; getLogoUrl() + favicon swap), no rebuild needed.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-17 22:39:58 +01:00
h z
4d0575291d Merge pull request 'feature/oidc-login' (#12) from feature/oidc-login into main
Reviewed-on: #12
2026-05-17 21:27:55 +00:00
73da3926e7 feat(auth): admin_role config; drop manual admin-subject from wizard
OIDC settings page + setup wizard now configure the bootstrap admin
role instead of a hand-typed OIDC subject. The OIDC-only admin link is
handled automatically by the backend admin-role auto-connect on first
sign-in (explained inline in both the wizard and settings page).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-17 21:05:40 +01:00
782e42ac64 feat(setup): OIDC step in setup wizard + runtime OIDC_ONLY flag
Solves the OIDC-only bootstrap lockout (admin can't reach the in-app
OIDC settings page when password login is disabled and OIDC is unset).

- Frontend image entrypoint injects /runtime-config.js from the
  deploy-time HARBORFORGE_OIDC_ONLY env so the SPA knows the mode
  before the backend exists.
- Setup wizard gains an "OIDC" step (between Admin and Backend):
  required when OIDC-only (incl. admin's OIDC subject so the bootstrap
  admin can sign in), optional otherwise; written into harborforge.json.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-17 20:50:58 +01:00
ba55fee9d5 fix(auth): register /settings/oidc route for admins only
Non-admins fall through to the catch-all redirect instead of seeing
the OIDC settings page shell. Sidebar link, in-page guard and the
admin-only backend API remain as defense in depth.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-17 20:33:28 +01:00
8cac6951d7 feat(auth): admin OIDC settings page
New admin page /settings/oidc to configure the OIDC provider (issuer,
client id/secret, redirect/callback URL, scopes, post-login redirect).
Prominently shows the callback URL to register at the IdP, current
status/source, and the read-only deploy-level OIDC-only flag. Secret
is write-only (blank = keep). Sidebar entry for admins.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-17 20:29:22 +01:00
8f8d6d5465 feat(auth): OIDC login UI + binding management + OIDC-only mode
- useAuthConfig fetches public /auth/config; LoginPage hides the
  password form when oidc_only and shows an SSO button when enabled.
- /oidc/callback route applies the returned JWT (sign-in) or shows the
  link result; oidc_error surfaced on LoginPage.
- UsersPage: hides password fields in OIDC-only mode; admin OIDC
  bind/unbind UI per user. Sidebar self-service "Link OIDC account"
  (non-OIDC_ONLY).
- Dockerfile ARG/ENV HARBORFORGE_OIDC_ONLY.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-17 20:22:14 +01:00
aaf36a4f5c Merge feature/foundry-deck-ui into main
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-16 17:56:00 +01:00
0fba859adf feat(ui): "Foundry Deck" visual redesign + full README
Complete visual redesign via a single centralized design system in
src/index.css (no JSX/logic changes; all existing class selectors kept
1:1, so all ~20 pages restyle at once): blackened-steel dark palette,
molten-ember accent with heat glow, blueprint-grid + grain background,
Saira Condensed / Hanken Grotesk / JetBrains Mono web fonts, staggered
load animations, reduced-motion fallback. README written from stub.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-16 17:50:26 +01:00
6432255203 quick fix 2026-04-15 07:14:36 +01:00
0b55bc873e fix: use npx tsc in build script to ensure tsc is resolved from node_modules 2026-04-15 05:07:45 +00:00
95972b329e fix(api): handle null return type for localStorage getItem 2026-04-15 05:04:11 +00:00
1a20a1050b fix: remove redundant VITE_API_BASE fallback, use wizard config as sole source of truth for HF_BACKEND_BASE_URL 2026-04-15 05:00:56 +00:00
h z
f61c506fdb Merge pull request 'HarborForge.Frontend: proposal/essential tests on current branch head' (#11) from pr/dev-2026-03-29-frontend-tests-20260405 into main
Reviewed-on: #11
2026-04-05 22:07:46 +00:00
zhi
38ebd2bbd1 TEST-FE-PR-001: adapt proposal/essential tests for current UI 2026-04-05 20:48:47 +00:00
zhi
83c9cd8fb7 TEST-FE-PR-001: Add Proposal/Essential frontend unit tests
- Essential list rendering and display tests
- Essential create/edit/delete form tests
- Accept modal with milestone selection tests
- Story creation restriction UI tests
- Error handling tests
2026-04-05 20:48:47 +00:00
8014dcd602 feat: add calendar plan create and edit ui 2026-04-04 15:30:03 +00:00
f39e7da33c fix: render calendar overlap conflicts safely 2026-04-04 14:50:42 +00:00
ea841d0d39 fix: use current calendar slot endpoints 2026-04-04 12:09:43 +00:00
a431711ff0 fix: handle wrapped calendar api responses 2026-04-04 10:44:51 +00:00
8208b3b27b feat: switch frontend indexing to code-first identifiers 2026-04-03 16:25:11 +00:00
zhi
e4804128f6 TEST-FE-CAL-001 add calendar frontend tests 2026-04-01 11:05:58 +00:00
zhi
978d69eea3 FE-CAL-004/005: Add slot create/edit/cancel modals and status warnings
- Create slot modal with type, time, duration, priority, event type/data fields
- Edit slot modal (pre-populates from existing slot)
- Cancel slot with confirmation dialog
- Cancel plan with confirmation dialog
- Overlap error display in modal
- Workload warnings banner after save
- Deferred slots notice banner
- Edit/Cancel buttons on modifiable slots (not_started/deferred, non-past dates)
- Past date detection prevents new slot creation
2026-04-01 06:50:03 +00:00
zhi
4932974579 FE-CAL-001/002/003: Add Calendar page with daily slot view and plans tab
- New CalendarPage with daily view (date navigation, slot list) and plans tab
- Route /calendar added in App.tsx
- Sidebar entry added after Proposals
- Daily view: shows time slots with type, status, priority, duration, event data
- Distinguishes real vs virtual (plan) slots visually
- Plans tab: shows schedule plan rules with schedule parameters
2026-04-01 06:48:12 +00:00
zhi
e45281f5ed FE-PR-005: Remove story from task creation - restricted to Proposal Accept only
- Remove 'story' type from TASK_TYPES in CreateTaskPage.tsx and CreateTaskModal.tsx
- All story/* task types now only creatable via Proposal Accept workflow
- Added comments explaining the restriction
2026-04-01 06:46:18 +00:00
zhi
9de59cacfa FE-PR-002: Proposal 详情页增加 Essential 列表区
- Add Essential and EssentialType types to frontend types
- Add essentials state and CRUD handlers in ProposalDetailPage
- Display Essential list with type, code, title
- Handle empty state (show message when no essentials)
- Add create/edit modal for Essentials
- Only show edit/delete buttons for open proposals
2026-04-01 06:25:06 +00:00
zhi
a08644dde3 FE-PR-001: Rename Propose -> Proposal across frontend
- Rename ProposesPage -> ProposalsPage, ProposeDetailPage -> ProposalDetailPage
- Update Propose type to Proposal (keep Propose as deprecated alias)
- Add GeneratedTask type for accept results
- Switch API calls from /proposes to /proposals (canonical)
- Update sidebar label: Proposes -> Proposals
- Update routes: /proposals (+ legacy /proposes compat)
- Update all UI text: Propose -> Proposal
- Remove feat_task_id display, add generated_tasks section
- Clean up propose references in comments
2026-04-01 04:46:46 +00:00
6c8c8b78b6 Merge pull request 'Merge dev-2026-03-22 into main' (#10) from dev-2026-03-22 into main
Reviewed-on: #10
2026-03-22 14:06:54 +00:00
zhi
5fccc7dc7d Fix: milestone routes use milestone_code, config check via backend
- Milestone navigation now uses milestone_code instead of numeric id
- MilestoneDetailPage uses milestone.id (numeric) for project-scoped API calls
- App.tsx checks /config/status on backend first, falls back to wizard
- Added milestone_code to Milestone type
- Fixed MilestoneDetailPage to use fetched milestone.id for sub-queries
2026-03-22 10:58:14 +00:00
zhi
ce07ee9021 Fix project detail milestones fetch + reset-apikey UI
- Fix: ProjectDetailPage now uses /projects/{id}/milestones instead of /milestones?project_id={code} (fixes 422)
- Add: Reset API Key button on UsersPage with permission-based visibility
- Add: One-time key display with copy-to-clipboard
- Protect admin and acc-mgr accounts from deletion in UI
2026-03-22 05:39:12 +00:00
zhi
4fc120f595 feat: add click-to-copy CopyableCode component across all detail pages
- New CopyableCode component with monospace styling and click-to-copy
- TaskDetailPage: copyable task code in header
- ProjectDetailPage: copyable project code in header
- MilestoneDetailPage: copyable milestone code in header
- MeetingDetailPage: copyable meeting code in header
- SupportDetailPage: copyable support code in header
- ProposeDetailPage: copyable propose code in header and info section

Helps users easily copy resource codes for CLI usage (hf task get <code>, etc)
2026-03-22 00:22:28 +00:00
zhi
a65429250a feat: wire meeting/support detail routes and fix code-first navigation
- Add routes for /meetings/:meetingId and /supports/:supportId in App.tsx
- Fix MilestoneDetailPage to navigate to code-first detail URLs
- Update table headers from '#' to 'Code' for supports/meetings lists
- Fix TypeScript types for supports/meetings (use any[] instead of Task[])
- MeetingDetailPage: full detail view with attend, transition, edit, delete
- SupportDetailPage: full detail view with take, transition, edit, delete
2026-03-22 00:17:33 +00:00
zhi
41ebd36218 feat: code-first navigation — use resource codes in links and displays
- DashboardPage: show task_code instead of #id, link via code
- TasksPage: navigate to tasks via task_code
- MilestoneDetailPage: navigate to tasks/supports/meetings via codes
- MilestoneDetailPage: display codes in support/meeting tables
- Fix support/meeting state types to any[] for code property access
2026-03-21 21:38:14 +00:00
zhi
fb5658739b feat: code-first migration — replace raw IDs with codes and usernames
- TaskDetailPage: show task_code instead of raw #id in header
- TaskDetailPage: show author_username in comment metadata
- ProjectDetailPage: show member username instead of User #id
- ProposeDetailPage: show created_by_username instead of User #id
- TasksPage: fix status filter options to match actual statuses
  (pending/open/undergoing/completed/closed)
- TasksPage: fix status color map for correct status values
- Types: add username/full_name to ProjectMember, author_username
  to Comment, created_by_username to Propose
- Supports TODO §3.1 (code-first UI migration)
2026-03-21 20:28:35 +00:00
zhi
dc97764e43 Surface canonical codes in list views 2026-03-21 16:06:41 +00:00
zhi
fd28bb6b6f feat(users): use role dropdowns instead of admin checkboxes 2026-03-21 08:44:19 +00:00
zhi
50563f2b3d feat(users): add admin user management page 2026-03-20 10:56:00 +00:00
zhi
caad6be048 feat(monitor): show nginx telemetry in monitor cards 2026-03-20 10:03:56 +00:00
a6faf5534c Merge pull request 'feat: monitor API key management UI' (#9) from feat/monitor-api-key-ui into main
Reviewed-on: #9
2026-03-20 09:17:24 +00:00
zhi
bad1c8fca9 feat(monitor): add API key actions and remove challenge UI
- Add Generate API Key button
- Add Revoke API Key button
- Remove Generate Challenge entry
- Show plugin version in monitor cards
2026-03-20 07:42:43 +00:00
bdeb06407e Merge pull request 'feat: milestone/task status UI + propose pages + action buttons' (#8) from feat/milestone-propose-state-machine into main
Reviewed-on: #8
2026-03-19 11:12:03 +00:00
zhi
d399668932 feat(P7.1-P7.2): remove task_type='task' from frontend — type union, create forms, defaults changed to issue 2026-03-17 16:05:32 +00:00
zhi
208538f930 feat(propose): P10.7 edit modal for open proposes — title+description editable, hidden for accepted/rejected 2026-03-17 14:05:31 +00:00
zhi
2897172213 feat(P9.6): remove feature and release subtypes from general create task forms 2026-03-17 13:02:47 +00:00
zhi
638427db65 feat(P5.7/P9.3): task edit button visibility — status+assignee-aware guard, hide edit in non-editable states 2026-03-17 12:04:12 +00:00
zhi
d6a45c3e17 feat(P5.3+P5.4): pass completion comment in transition body, remove separate comment API call for finish/close 2026-03-17 11:02:19 +00:00
zhi
faf7842cba feat(P8.3): freeze/start buttons disabled with hints when pre-conditions unmet 2026-03-17 10:04:17 +00:00
zhi
a4b4ffcb88 feat(P3.6): hide Edit Milestone button in freeze/undergoing/terminal states, show locked notice 2026-03-17 09:01:40 +00:00
zhi
e6b91e9558 P9.2+P9.4: Task action buttons (open/start/finish/close/reopen) with finish-comment modal and close-reason modal 2026-03-17 07:07:04 +00:00
zhi
18703d98f8 feat(P8.1-P8.2): milestone status action buttons + badge styles + started_at display
- Add freeze/start/close action buttons on MilestoneDetailPage
- Freeze: visible in open status, calls POST .../actions/freeze
- Start: visible in freeze status, calls POST .../actions/start
- Close: visible in open/freeze/undergoing, with reason input + confirmation
- Display started_at in milestone meta when present
- Hide edit button and create-item buttons in terminal states
- Add CSS badge styles for freeze (purple), undergoing (amber), completed (green)
- All actions show loading state and error feedback
2026-03-17 06:05:09 +00:00