feat(album): album view sort order (#14648)

* feat(mobile): album view sort order

* feat: add error message

* refactor(mobile): album page (#14659)

* refactor album page

* update lint rule

* const record

* fix: updating sort order when pull to refresh

---------

Co-authored-by: Alex <alex.tran1502@gmail.com>

* Move sort toggle button to bottom sheet menu

* chore: revert multiselectgrid loading status

* chore: revert multiselectgrid loading status

---------

Co-authored-by: Mert <101130780+mertalev@users.noreply.github.com>
This commit is contained in:
Alex
2024-12-16 10:11:48 -06:00
committed by GitHub
parent 364b717fde
commit 9503bf479b
32 changed files with 711 additions and 336 deletions

View File

@@ -1,4 +1,5 @@
import 'package:flutter/foundation.dart';
import 'package:immich_mobile/constants/enums.dart';
import 'package:immich_mobile/entities/asset.entity.dart';
import 'package:immich_mobile/entities/user.entity.dart';
import 'package:immich_mobile/utils/datetime_comparison.dart';
@@ -23,6 +24,7 @@ class Album {
this.lastModifiedAssetTimestamp,
required this.shared,
required this.activityEnabled,
this.sortOrder = SortOrder.desc,
});
// fields stored in DB
@@ -39,6 +41,8 @@ class Album {
DateTime? lastModifiedAssetTimestamp;
bool shared;
bool activityEnabled;
@enumerated
SortOrder sortOrder;
final IsarLink<User> owner = IsarLink<User>();
final IsarLink<Asset> thumbnail = IsarLink<Asset>();
final IsarLinks<User> sharedUsers = IsarLinks<User>();
@@ -154,6 +158,11 @@ class Album {
);
a.remoteAssetCount = dto.assetCount;
a.owner.value = await db.users.getById(dto.ownerId);
if (dto.order != null) {
a.sortOrder =
dto.order == AssetOrder.asc ? SortOrder.asc : SortOrder.desc;
}
if (dto.albumThumbnailAssetId != null) {
a.thumbnail.value = await db.assets
.where()

View File

@@ -62,8 +62,14 @@ const AlbumSchema = CollectionSchema(
name: r'shared',
type: IsarType.bool,
),
r'startDate': PropertySchema(
r'sortOrder': PropertySchema(
id: 9,
name: r'sortOrder',
type: IsarType.byte,
enumMap: _AlbumsortOrderEnumValueMap,
),
r'startDate': PropertySchema(
id: 10,
name: r'startDate',
type: IsarType.dateTime,
)
@@ -171,7 +177,8 @@ void _albumSerialize(
writer.writeString(offsets[6], object.name);
writer.writeString(offsets[7], object.remoteId);
writer.writeBool(offsets[8], object.shared);
writer.writeDateTime(offsets[9], object.startDate);
writer.writeByte(offsets[9], object.sortOrder.index);
writer.writeDateTime(offsets[10], object.startDate);
}
Album _albumDeserialize(
@@ -190,7 +197,9 @@ Album _albumDeserialize(
name: reader.readString(offsets[6]),
remoteId: reader.readStringOrNull(offsets[7]),
shared: reader.readBool(offsets[8]),
startDate: reader.readDateTimeOrNull(offsets[9]),
sortOrder: _AlbumsortOrderValueEnumMap[reader.readByteOrNull(offsets[9])] ??
SortOrder.desc,
startDate: reader.readDateTimeOrNull(offsets[10]),
);
object.id = id;
return object;
@@ -222,12 +231,24 @@ P _albumDeserializeProp<P>(
case 8:
return (reader.readBool(offset)) as P;
case 9:
return (_AlbumsortOrderValueEnumMap[reader.readByteOrNull(offset)] ??
SortOrder.desc) as P;
case 10:
return (reader.readDateTimeOrNull(offset)) as P;
default:
throw IsarError('Unknown property with id $propertyId');
}
}
const _AlbumsortOrderEnumValueMap = {
'asc': 0,
'desc': 1,
};
const _AlbumsortOrderValueEnumMap = {
0: SortOrder.asc,
1: SortOrder.desc,
};
Id _albumGetId(Album object) {
return object.id;
}
@@ -1191,6 +1212,59 @@ extension AlbumQueryFilter on QueryBuilder<Album, Album, QFilterCondition> {
});
}
QueryBuilder<Album, Album, QAfterFilterCondition> sortOrderEqualTo(
SortOrder value) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.equalTo(
property: r'sortOrder',
value: value,
));
});
}
QueryBuilder<Album, Album, QAfterFilterCondition> sortOrderGreaterThan(
SortOrder value, {
bool include = false,
}) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.greaterThan(
include: include,
property: r'sortOrder',
value: value,
));
});
}
QueryBuilder<Album, Album, QAfterFilterCondition> sortOrderLessThan(
SortOrder value, {
bool include = false,
}) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.lessThan(
include: include,
property: r'sortOrder',
value: value,
));
});
}
QueryBuilder<Album, Album, QAfterFilterCondition> sortOrderBetween(
SortOrder lower,
SortOrder upper, {
bool includeLower = true,
bool includeUpper = true,
}) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.between(
property: r'sortOrder',
lower: lower,
includeLower: includeLower,
upper: upper,
includeUpper: includeUpper,
));
});
}
QueryBuilder<Album, Album, QAfterFilterCondition> startDateIsNull() {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(const FilterCondition.isNull(
@@ -1513,6 +1587,18 @@ extension AlbumQuerySortBy on QueryBuilder<Album, Album, QSortBy> {
});
}
QueryBuilder<Album, Album, QAfterSortBy> sortBySortOrder() {
return QueryBuilder.apply(this, (query) {
return query.addSortBy(r'sortOrder', Sort.asc);
});
}
QueryBuilder<Album, Album, QAfterSortBy> sortBySortOrderDesc() {
return QueryBuilder.apply(this, (query) {
return query.addSortBy(r'sortOrder', Sort.desc);
});
}
QueryBuilder<Album, Album, QAfterSortBy> sortByStartDate() {
return QueryBuilder.apply(this, (query) {
return query.addSortBy(r'startDate', Sort.asc);
@@ -1648,6 +1734,18 @@ extension AlbumQuerySortThenBy on QueryBuilder<Album, Album, QSortThenBy> {
});
}
QueryBuilder<Album, Album, QAfterSortBy> thenBySortOrder() {
return QueryBuilder.apply(this, (query) {
return query.addSortBy(r'sortOrder', Sort.asc);
});
}
QueryBuilder<Album, Album, QAfterSortBy> thenBySortOrderDesc() {
return QueryBuilder.apply(this, (query) {
return query.addSortBy(r'sortOrder', Sort.desc);
});
}
QueryBuilder<Album, Album, QAfterSortBy> thenByStartDate() {
return QueryBuilder.apply(this, (query) {
return query.addSortBy(r'startDate', Sort.asc);
@@ -1719,6 +1817,12 @@ extension AlbumQueryWhereDistinct on QueryBuilder<Album, Album, QDistinct> {
});
}
QueryBuilder<Album, Album, QDistinct> distinctBySortOrder() {
return QueryBuilder.apply(this, (query) {
return query.addDistinctBy(r'sortOrder');
});
}
QueryBuilder<Album, Album, QDistinct> distinctByStartDate() {
return QueryBuilder.apply(this, (query) {
return query.addDistinctBy(r'startDate');
@@ -1788,6 +1892,12 @@ extension AlbumQueryProperty on QueryBuilder<Album, Album, QQueryProperty> {
});
}
QueryBuilder<Album, SortOrder, QQueryOperations> sortOrderProperty() {
return QueryBuilder.apply(this, (query) {
return query.addPropertyName(r'sortOrder');
});
}
QueryBuilder<Album, DateTime?, QQueryOperations> startDateProperty() {
return QueryBuilder.apply(this, (query) {
return query.addPropertyName(r'startDate');