Commit Graph
734 Commits
Author SHA1 Message Date
REDCODE 89c91b2291 refactor: replace tuple + custom header with ChildrenResponse DTO
- Add ChildrenResponse DTO (Children + Since) in Butter.Dtos.Jobs
- JobManager.GetChildren returns List<JobStatusDto> only (no tuple),
  active children filtered via LINQ over activeJobs.Values
- JobsController generates Since timestamp, returns ChildrenResponse
  instead of setting x-delta-timestamp header
- JobsService deserializes ChildrenResponse instead of parsing headers
2026-07-10 17:40:28 +02:00
REDCODE 4a6bc2f8aa Merge branch 'develop' into fix/preview-subjob-status-reporting 2026-07-10 17:37:34 +02:00
REDCODE ac5b75c0d6 fix: suppress nullable warnings on Include chain in GetAllVisible 2026-07-10 17:36:52 +02:00
REDCODE 7e1a2a7ed6 Merge branch 'develop' into fix/preview-subjob-status-reporting 2026-07-10 15:36:11 +00:00
REDCODE e98aa6167e fix: translate GetAllVisible to client-side eval for SharedWith navigation
EF Core cannot translate three-level nested Any through many-to-many
navigation (Person→Albums→Assets→SharedWith). Load data with Include
chain and filter visible persons in-memory instead.
2026-07-10 17:28:13 +02:00
REDCODE 17ddd1c332 feat: hide cosplayers with no visible content from regular users
- IPersonRepository.GetAllVisible filters persons by asset visibility
- For User level: only returns persons that have at least one album
  with a non-deleted asset that is publicly shared, owned by the user,
  or explicitly shared with the user
- For Admin/Curator: returns all persons (unchanged behavior)
- PersonController.GetAll extracts user data and uses GetAllVisible
2026-07-10 17:21:47 +02:00
REDCODE b0b65e808d refactor: extract password strength UI into shared PasswordField component
Create PasswordField.razor in Components/Shared with:
- Two-way binding for Password, ConfirmPassword, OldPassword
- Strength bar with color-coded segments
- Requirements checklist (min length, upper/lower, number/special)
- Passwords-do-not-match validation
- Public IsValid property for parent submit-button checks
- ShowOldPassword toggle for change-password vs register flows

Register.razor and User.razor now use the shared component,
eliminating duplicated password validation logic.
2026-07-10 15:26:26 +02:00
REDCODE 0a99178416 feat: add password strength validation to registration page
Copy password validation UI from User.razor — strength bar,
requirements checklist, passsword match check, submit disabled
until all requirements are met.
2026-07-10 15:23:02 +02:00
REDCODE 91cb420743 fix: update albums logged-out message to match home/cosplayers 2026-07-10 15:21:01 +02:00
REDCODE f4a62eafc2 fix: update home logged-out message to match cosplayers wording 2026-07-10 15:19:39 +02:00
REDCODE dc5ac98c68 feat: return-url login redirects + keepalive + cosplayers fix
- NavigationExtensions: centralized NavigateToLogin/NavigateToLoginForce
  helpers that include returnUrl query parameter
- LoginService: SemaphoreSlim guard on Reauthenticate to prevent
  concurrent refresh races (timer + API handler)
- MainLayout: expiry-driven keepalive loop — parses JWT, schedules
  reauthentication 2 min before token expiry; starts on login,
  stops on logout/force-logout
- Login page: reads returnUrl from query via SupplyParameterFromQuery,
  navigates there (or /) on success
- All NavigateTo(/login) call sites updated to use returnUrl:
  App, MainLayout, NavMenu, Jobs, Settings, AdminUsers
- Cosplayers: fix eternal spinner when logged out (set isLoading=false),
  update message to 'No media available' with hint about public content
2026-07-10 15:16:59 +02:00
REDCODE b741f331e9 revert: restore docker-compose.yml LactoseBaseUrl to 192.168.50.100 2026-07-10 13:23:00 +02:00
REDCODE 04a528ce55 fix: eager-fetch children for all roots including past jobs
Remove status filter in EagerFetchMissing so past (completed) roots
also get their child status icons on load.
2026-07-10 13:17:17 +02:00
REDCODE ac7833a069 fix: re-render after eager child fetch so icons appear immediately 2026-07-10 13:15:02 +02:00
REDCODE 27eec196a0 fix: eagerly fetch children on load and hide sub-jobs placeholder
- EagerFetchMissing fetches children for active roots on parameter set
  so the summary never shows the placeholder
- ChildSummary returns null instead of "sub-jobs..." when not fetched
2026-07-10 13:12:37 +02:00
REDCODE c6d8d2c746 feat: poll children for all active roots and fix segment progress bar colors
- JobTree polls children for all Level 0 active roots (not just expanded),
  so segment progress bars update on collapsed rows too
- Add PollChildren helper to deduplicate fetch logic
- OnExpanded only stops refresh when no active roots remain
- Store UtcNow as fallback when server x-delta-timestamp is missing
- Fix segment colors: share ToCssClass between single and stacked bars,
  use text-bg-* classes for proper Bootstrap 5.3 progress-bar override
- Replace status words with Bootstrap icons in child summary
  (e.g. "15 Running" → "15 🔃") for compact display
2026-07-10 13:09:56 +02:00
REDCODE 71ac41086c fix: pass null since on first child fetch instead of DateTime.MinValue
GetValueOrDefault on missing key returns DateTime.MinValue (year 0001),
causing every poll to send since=0001-01-01 instead of omitting it.
2026-07-10 12:56:00 +02:00
REDCODE da3a2a0a4b feat: add delta merge logic to job tree components
- JobsService.GetChildren returns (Children, Since) tuple
  with x-delta-timestamp parsed from response headers
- JobTree stores per-parent _sinceTimestamps
- ChildRefreshLoop fetches deltas with since param
- MergeChildren replaces/inserts entries by ID
- Jobs.razor FetchChildren signature updated for delta
2026-07-10 12:49:47 +02:00
REDCODE 0203644b3e feat: implement delta-based children endpoint with ?since parameter
- JobManager.GetChildren now accepts optional 'since' parameter
- Returns only children with LastChange/ModifiedAt > since
- Includes seenIds dedup between active and past children
- Returns response timestamp for next poll
- Controller sets x-delta-timestamp header
2026-07-10 12:49:43 +02:00
REDCODE dd43d069d5 feat: add ModifiedAt to JobRecord with delta query support
- Add ModifiedAt (DateTime?) to JobRecord
- Auto-set on Insert/Update in repository
- Add GetChildrenModifiedSince to interface + implementation
- EF Core migration AddModifiedAtToJobRecord
2026-07-10 12:49:40 +02:00
REDCODE 7dc5eff14b feat: add LastChange tracking to JobStatus
Set LastChange = UtcNow on every status/progress transition
for delta-based children sync.
2026-07-10 12:49:36 +02:00
REDCODE 314ac766e4 fix: metadata icon visible in job list rows 2026-07-10 12:30:36 +02:00
REDCODE 7456850dec fix: metadata icon in dropdown uses text-light for visibility 2026-07-10 12:29:53 +02:00
REDCODE 30de7d0784 style: mobile launch button cyan for better contrast 2026-07-10 12:29:36 +02:00
REDCODE 3a892f6f7a style: custom job color palette based on purpose, avoid red
Scan: cyan (discovery)
Metadata: gray (technical data)
Thumbnails: blue (core functionality)
Previews: green (final visual output)
PHash: purple (identity/fingerprinting)
Integrity: white (clean health check)
CreatePersons: amber (warm, people)
CreateAlbums: teal (collection, organization)

Launch buttons use filled variants (btn-*) instead of outline.
Custom btn-job-purple and btn-job-teal CSS classes added to
Jobs.razor.css with proper hover/active states.
2026-07-10 12:26:51 +02:00
REDCODE b8be4f7314 style: replace badge backgrounds with colored icons + matching launch buttons
- Removed job type badge spans from desktop and mobile JobRow
- Colored job-type icons instead (text-info/secondary/primary/etc)
- Desktop launch buttons use matching btn-outline-* colors per job type
- Mobile launch dropdown changed from dropup to dropdown to avoid
  clipping into navbar
- Dropdown item icons colored per job type
2026-07-10 12:22:45 +02:00
REDCODE 5514bf89d9 fix: remove double-count of failed assets in master Done handler
The Interlocked.Increment(ref failedAssets) for Failed subjobs
caused double-counting: a subjob with N/12 failed assets would
add 1 (failed subjob) + 12 (individual assets) = 13, exceeding
the total asset count. Removed the Increment since subjob's
failedAssets is already the accurate per-asset count.
2026-07-10 12:17:50 +02:00
REDCODE 326966b774 feat(ui): redesign jobs page with tabs, search, filters, and mobile cards
- Unified Active/Past tabbed view replacing separate sections
- Search by name/message, filter by job type and status
- Status summary strip with colored counts
- Job type badges with distinct colors per EJobType
- Status labels next to status dots
- Compact mobile card layout (d-md-none)
- Tighter tree spacing with lighter indentation
- Scoped Jobs.razor.css extracted from inline styles

Refs #76
2026-07-10 12:15:55 +02:00
REDCODE 8ad378b649 fix: batch-processing subjobs report correct status on asset failures
Subjobs (SlaveJob) now check failedAssets after processing:
- All failed -> JobStatus.Fail()
- Some failed -> JobStatus.CompleteWithErrors()
- None failed -> JobStatus.Complete()

Also fixed race condition in master Done handler:
- Replaced non-atomic failedAssets += sub.failedAssets
- with Interlocked.Add(ref failedAssets, sub.failedAssets)

Affects: PreviewJob, ThumbnailJob, MetadataJob, PHashJob

Refs #76
2026-07-10 12:05:45 +02:00
REDCODE 41f977d262 Merge pull request 'feat: add album select/edit mode with bulk deletion' (#75) from feature/albums-edit-mode into develop
Reviewed-on: #75
Reviewed-by: Samuele Lorefice <aironenerowork@gmail.com>
2026-07-10 09:56:56 +00:00
REDCODE 5b04f39bfe feat(ui): add album select/edit mode with bulk deletion 2026-07-10 11:50:39 +02:00
REDCODE 71dba46565 feat(api): add BulkDeleteAlbumsAsync for bulk album deletion 2026-07-10 11:50:36 +02:00
REDCODE c16749bdf6 Merge pull request 'Album detail page — multi-select/edit mode with cosplayer link (#63)' (#74) from feature/album-detail-edit-mode into develop
Reviewed-on: #74
Reviewed-by: Samuele Lorefice <aironenerowork@gmail.com>
2026-07-10 09:43:29 +00:00
REDCODE 1d107d2de6 chore: revert docker-compose.yml to match develop 2026-07-10 11:42:50 +02:00
REDCODE 5b445cbe89 fix(mobile): keep back button inline with title, collapse admin actions into dropdown 2026-07-10 11:40:18 +02:00
REDCODE 3482f5adde style: cosplayer link dims on hover instead of blue/underline 2026-07-10 11:33:46 +02:00
REDCODE 3dd73d3a63 style: borderless edit pencil with hover reveal on header 2026-07-10 11:31:41 +02:00
REDCODE 3b4a06709a refactor: center-align header, album name on top, cosplayer smaller below 2026-07-10 11:29:37 +02:00
REDCODE 5ffb114532 fix: use bold (700) instead of semi-bold for reliable font rendering 2026-07-10 11:22:33 +02:00
REDCODE 590aef2ece style: consistent inline typography for album title and cosplayer name with dash separator 2026-07-10 11:22:08 +02:00
REDCODE e3a2a78b21 style: match cosplayer link font size to h3, remove icon, keep regular weight 2026-07-10 11:19:23 +02:00
REDCODE d0bf3b7ec7 refactor: move cosplayer link to same line as album name 2026-07-10 11:15:46 +02:00
REDCODE 2af3995ae7 style: style cosplayer link with inherited color and person icon 2026-07-10 11:15:24 +02:00
REDCODE 02bdba3891 feat(ui): album detail multi-select edit mode, cosplayer link, move edit button (#63)
- Replace non-functional cosplayer badge with clickable link to cosplayer page
- Move Edit button next to album title in info section
- Add select mode: select/deselect image tiles with check overlays
- Add bulk removal of selected assets (unlink from album)
- Add Select / Done / Remove N action buttons replacing Edit in actions area
- Add scoped CSS for cosplayer link style and tile selection overlays
2026-07-10 11:13:15 +02:00
REDCODE 8ba1c9b6b2 Merge pull request 'User profile & admin users page redesign (#72)' (#73) from feature/user-pages-redesign into develop
Reviewed-on: #73
Reviewed-by: Samuele Lorefice <aironenerowork@gmail.com>
2026-07-10 09:03:47 +00:00
REDCODE e188cc35e3 feat(ui): show avatar initial in navbar instead of generic icon 2026-07-10 10:53:54 +02:00
REDCODE 75cbe2717f fix: default sort users table by role descending (admin on top) 2026-07-10 10:52:56 +02:00
REDCODE 4c63e80b6c feat(ui): rewrite admin users page with sortable table, search, and modal-based editing 2026-07-10 10:50:34 +02:00
REDCODE 354198c413 feat(ui): redesign user profile page with avatar initials and edit profile modal 2026-07-10 10:50:30 +02:00
REDCODE 56c3f9c8e1 Merge pull request 'Add password change field on user's own page (#46)' (#71) from feature/password-change-self-service into develop
Reviewed-on: #71
Reviewed-by: Samuele Lorefice <aironenerowork@gmail.com>
2026-07-10 08:42:59 +00:00