* Match fade transition timing between photo-viewer and memory-viewer.
* Fix blank page after refreshing memory page.
If the user refreshed in the browser while on the memory page, the page
would show a blank page. This was caused by skipping initialization in
afterNavigate. Fix by always initializing the memory page in
afterNavigate.
* refactor: timeline manager renames
* refactor(web): improve timeline manager naming consistency
- Rename AddContext → GroupInsertionCache for clearer purpose
- Rename TimelineDay → DayGroup for better clarity
- Rename TimelineMonth → MonthGroup for better clarity
- Replace all "bucket" references with "monthGroup" terminology
- Update all component props, method names, and variable references
- Maintain consistent naming patterns across TypeScript and Svelte files
* refactor(web): rename buckets to months in timeline manager
- Rename TimelineManager.buckets property to months
- Update all store.buckets references to store.months
- Use 'month' shorthand for monthGroup arguments (not method names)
- Update component templates and test files for consistency
- Maintain API-related 'bucket' terminology (bucketHeight, getTimeBucket)
* refactor(web): rename assetStore to timelineManager and update types
- Rename assetStore variables to timelineManager in all .svelte files
- Update parameter names in actions.ts and asset-utils.ts functions
- Rename AssetStoreLayoutOptions to TimelineManagerLayoutOptions
- Rename AssetStoreOptions to TimelineManagerOptions
- Move assets-store.spec.ts to timeline-manager.spec.ts
* refactor(web): rename intersectingAssets to viewerAssets and fix property references
- Rename intersectingAssets to viewerAssets in DayGroup and MonthGroup classes
- Update arrow function parameters to use viewerAsset/viewAsset shorthand
- Rename topIntersectingBucket to topIntersectingMonthGroup
- Fix dateGroups references to dayGroups in asset-utils.ts and album page
- Update template loops and variable names in Svelte components
* refactor(web): rename #initializeTimeBuckets to #initializeMonthGroups and bucketDateFormatted to monthGroupTitle
* refactor(web): rename monthGroupHeight to height
* refactor(web): rename bucketCount to assetsCount, bucketsIterator to monthGroupIterator, and related properties
* refactor(web): rename count to assetCount in TimelineManager
* refactor(web): rename LiteBucket to ScrubberMonth and update scrubber variables
- Rename LiteBucket type to ScrubberMonth
- Rename bucketDateFormattted to title in ScrubberMonth type
- Rename bucketPercentY to monthGroupPercentY in scrubber component
- Rename scrubBucket to scrubberMonth and scrubBucketPercent to scrubberMonthPercent
* fix remaining refs to bucket
* reset submodule to correct commit
* reset submodule to correct commit
* refactor(web): extract TimelineManager internals into separate modules
- Move search-related functions to internal/search-support.svelte.ts
- Extract websocket event handling into WebsocketSupport class
- Move utility functions (updateObject, isMismatched) to internal/utils.svelte.ts
- Update imports in tests to use new module structure
* refactor(web): extract intersection logic from TimelineManager
- Create intersection-support.svelte.ts with updateIntersection and calculateIntersecting functions
- Remove private intersection methods from TimelineManager
- Export findMonthGroupForAsset from search-support for reuse
- Update TimelineManager to use the extracted intersection functions
* refactor(web): rename a few methods in intersecting
* refactor(web): rename a few methods in intersecting
* refactor(web): extract layout logic from TimelineManager
- Create layout-support.svelte.ts with updateGeometry and layoutMonthGroup functions
- Remove private layout methods from TimelineManager
- Update TimelineManager to use the extracted layout functions
- Remove unused UpdateGeometryOptions import
* refactor(web): extract asset operations from TimelineManager
- Create operations-support.svelte.ts with addAssetsToMonthGroups and runAssetOperation functions
- Remove private asset operation methods from TimelineManager
- Update TimelineManager to use extracted operation functions with proper AssetOrder handling
- Rename getMonthGroupIndexByAssetId to getMonthGroupByAssetId for consistency
- Move utility functions from utils.svelte.ts to internal/utils.svelte.ts
- Fix method name references in asset-grid.svelte and tests
* refactor(web): extract loading logic from TimelineManager
- Create load-support.svelte.ts with loadFromTimeBuckets function
- Extract time bucket loading, album asset handling, and error logging
- Simplify TimelineManager's loadMonthGroup method to use extracted function
* refresh timeline after archive keyboard shortcut
* remove debugger
* rename
* Review comments - remove shadowed var
* reduce indents - early return
* review comment
* refactor: simplify asset filtering in addAssets method
Replace for loop with filter operation for better readability
* fix: bad merge
* refactor(web): simplify timeline layout algorithm
- Replace rowSpaceRemaining array with direct cumulative width tracking
- Invert logic from tracking remaining space to tracking used space
- Fix spelling: cummulative to cumulative
- Rename lastRowHeight to currentRowHeight for clarity
- Remove confusing lastRow variable and simplify final height calculation
- Add explanatory comments for clarity
- Rename loop variable assetGroup to dayGroup for consistency
* simplify assetsIterator usage
* merge/lint
---------
Co-authored-by: Alex <alex.tran1502@gmail.com>
* fix handling historical timezones in web client
* honor dst when calculating the timezone offset
* fix variable used to construct timezones list to honor dst
* remove unused variable. fix lint
* - Add set primary primary asset button to asset viewer
* - Cleanup
- change AssetAction to contain a StackResponseDto
- Properly update displayed stack at bottom of the asset viewer
* - update the assetStore with the changed stack
* - Cleanup
* Add a user setting for default album sort order.
Add a user setting under "Features" to control the initial sort order
when creating an album. Default to the existing behavior of
"newest first".
* chore: patch openapi
---------
Co-authored-by: Alex <alex.tran1502@gmail.com>
* fix: regression: sort day by fileCreatedAt again
* lint
* e2e test
* inline function
* e2e
* Address comments. Drop dayGroup and timezone in favor of localOffsetMinutes
* lint and some api-doc
* lint, more api-doc
* format
* Move minutes to fractional hours
* make sql
* merge/conflict
* merge fallout, review comments
* spelling
* drop offset from returned date
* move description into decorator where possible, regen api
* refactor: asset-store
* Potential fix for code scanning alert no. 152: Prototype-polluting function
Co-authored-by: Copilot Autofix powered by AI <62310815+github-advanced-security[bot]@users.noreply.github.com>
---------
Co-authored-by: Copilot Autofix powered by AI <62310815+github-advanced-security[bot]@users.noreply.github.com>
* feat: display number of likes
* fix: properly decrement like count on unlike
Co-authored-by: Daniel Dietzler <36593685+danieldietzler@users.noreply.github.com>
* chore: pr feedback
* chore: updated related test
* chore: formatter run
* chore: force numberOfLikes to null in album context to pass lint
* chore: open-api updated
* fix: use undefined, not null
* styling tweaks
* chore: updated sql
---------
Co-authored-by: Daniel Dietzler <36593685+danieldietzler@users.noreply.github.com>
Co-authored-by: Alex Tran <alex.tran1502@gmail.com>
* wip
* added user metadata key
* wip
* restructure onboarding system and add initial locale
* update language card and fix translation updating
* remove prints
* new card formattings
* fix cursed unmount effect
* add OAuth route onboarding
* remove required admin auth for onboarding
* delete the hotwire button
* update open-api files
* delete import
* fix failing oauth onboarding fields
* fix e2e test
* fix web e2e test
* add onboarding to user registration e2e test
* remove todo
this was a holdover during dev and didn't get deleted
* fix server small tests
* use onDestroy to save settings rather than a bind:this
* change to false for isOnboarded
* fix other auth small test
* provide type annotation in user factory metadata field
* remove onboardingCompelted from UserDto
* move translations to onboarding steps array and mark as derived so they update
* break language selector out into its own component as per @danieldietzler suggestion
* remove hello header on card
* fix flixkering on server privacy card
* label/id fixes
* openapi
---------
Co-authored-by: Alex Tran <alex.tran1502@gmail.com>
* remove import and referenced file
* first pass at replacing all CircleIconButtons
* fix linting issues
* fix combobox formatting issues
* fix button context menu coloring
* remove circle icon button from search history box
* use theme switcher from UI lib
* dark mode force the asset viewer icons
* fix forced dark mode icons
* dark mode memory viewer icons
* fix: back button in memory viewer
---------
Co-authored-by: Alex <alex.tran1502@gmail.com>
* Add a new setting to toggle autoplay when showing the slideshow.
* Fix an issue where the slideshow would restart automatically when
navigating after it was paused.
* Add a keyboard shortcut 's' to start the slideshow from the asset
viewer.
* Add a keyboard shortcut ' ' to toggle the slideshow play/paused.
* Change the timeout for hiding the slideshow controls from 10 to 2.5
seconds.
* Add English translation for the 'autoplay_slideshow' setting.
Co-authored-by: Alex <alex.tran1502@gmail.com>
* Fix an issue where clicking the zoom-button after having zoomed in
would not zoom completely out, but leave the image in the zoomed-in
state. The new behavior properly zoomes the image completely out after
clicking the zoom-button.
* Revert to the default setting for `wheelZoomRatio` as the previous
setting of 0.2 was borderline unusable on a trackpad. This could
probably be moved to a user setting if needed.
* Add a keyboard shortcut 'z' to toggle image zoom.