diff --git a/mobile/lib/modules/album/views/album_viewer_page.dart b/mobile/lib/modules/album/views/album_viewer_page.dart index 23358f33513cb..a0ae8a2130f71 100644 --- a/mobile/lib/modules/album/views/album_viewer_page.dart +++ b/mobile/lib/modules/album/views/album_viewer_page.dart @@ -164,8 +164,13 @@ class AlbumViewerPage extends HookConsumerWidget { } Widget buildAlbumDateRange(Album album) { - final DateTime startDate = album.assets.first.fileCreatedAt; - final DateTime endDate = album.assets.last.fileCreatedAt; //Need default. + final DateTime? startDate = album.startDate; + final DateTime? endDate = album.endDate; + + if (startDate == null || endDate == null) { + return const SizedBox(); + } + final String startDateText = (startDate.year == endDate.year ? DateFormat.MMMd() : DateFormat.yMMMd()) diff --git a/mobile/lib/shared/models/album.dart b/mobile/lib/shared/models/album.dart index 94afe1d76ddc4..f338abca3d1e3 100644 --- a/mobile/lib/shared/models/album.dart +++ b/mobile/lib/shared/models/album.dart @@ -18,6 +18,8 @@ class Album { required this.name, required this.createdAt, required this.modifiedAt, + this.startDate, + this.endDate, this.lastModifiedAssetTimestamp, required this.shared, }); @@ -30,6 +32,8 @@ class Album { String name; DateTime createdAt; DateTime modifiedAt; + DateTime? startDate; + DateTime? endDate; DateTime? lastModifiedAssetTimestamp; bool shared; final IsarLink owner = IsarLink(); @@ -144,6 +148,8 @@ class Album { modifiedAt: dto.updatedAt, lastModifiedAssetTimestamp: dto.lastModifiedAssetTimestamp, shared: dto.shared, + startDate: dto.startDate, + endDate: dto.endDate, ); a.owner.value = await db.users.getById(dto.ownerId); if (dto.albumThumbnailAssetId != null) { diff --git a/mobile/lib/shared/models/album.g.dart b/mobile/lib/shared/models/album.g.dart index 63f71f380f1a2..9cdb59a5e8e2b 100644 --- a/mobile/lib/shared/models/album.g.dart +++ b/mobile/lib/shared/models/album.g.dart @@ -22,35 +22,45 @@ const AlbumSchema = CollectionSchema( name: r'createdAt', type: IsarType.dateTime, ), - r'lastModifiedAssetTimestamp': PropertySchema( + r'endDate': PropertySchema( id: 1, + name: r'endDate', + type: IsarType.dateTime, + ), + r'lastModifiedAssetTimestamp': PropertySchema( + id: 2, name: r'lastModifiedAssetTimestamp', type: IsarType.dateTime, ), r'localId': PropertySchema( - id: 2, + id: 3, name: r'localId', type: IsarType.string, ), r'modifiedAt': PropertySchema( - id: 3, + id: 4, name: r'modifiedAt', type: IsarType.dateTime, ), r'name': PropertySchema( - id: 4, + id: 5, name: r'name', type: IsarType.string, ), r'remoteId': PropertySchema( - id: 5, + id: 6, name: r'remoteId', type: IsarType.string, ), r'shared': PropertySchema( - id: 6, + id: 7, name: r'shared', type: IsarType.bool, + ), + r'startDate': PropertySchema( + id: 8, + name: r'startDate', + type: IsarType.dateTime, ) }, estimateSize: _albumEstimateSize, @@ -148,12 +158,14 @@ void _albumSerialize( Map> allOffsets, ) { writer.writeDateTime(offsets[0], object.createdAt); - writer.writeDateTime(offsets[1], object.lastModifiedAssetTimestamp); - writer.writeString(offsets[2], object.localId); - writer.writeDateTime(offsets[3], object.modifiedAt); - writer.writeString(offsets[4], object.name); - writer.writeString(offsets[5], object.remoteId); - writer.writeBool(offsets[6], object.shared); + writer.writeDateTime(offsets[1], object.endDate); + writer.writeDateTime(offsets[2], object.lastModifiedAssetTimestamp); + writer.writeString(offsets[3], object.localId); + writer.writeDateTime(offsets[4], object.modifiedAt); + writer.writeString(offsets[5], object.name); + writer.writeString(offsets[6], object.remoteId); + writer.writeBool(offsets[7], object.shared); + writer.writeDateTime(offsets[8], object.startDate); } Album _albumDeserialize( @@ -164,12 +176,14 @@ Album _albumDeserialize( ) { final object = Album( createdAt: reader.readDateTime(offsets[0]), - lastModifiedAssetTimestamp: reader.readDateTimeOrNull(offsets[1]), - localId: reader.readStringOrNull(offsets[2]), - modifiedAt: reader.readDateTime(offsets[3]), - name: reader.readString(offsets[4]), - remoteId: reader.readStringOrNull(offsets[5]), - shared: reader.readBool(offsets[6]), + endDate: reader.readDateTimeOrNull(offsets[1]), + lastModifiedAssetTimestamp: reader.readDateTimeOrNull(offsets[2]), + localId: reader.readStringOrNull(offsets[3]), + modifiedAt: reader.readDateTime(offsets[4]), + name: reader.readString(offsets[5]), + remoteId: reader.readStringOrNull(offsets[6]), + shared: reader.readBool(offsets[7]), + startDate: reader.readDateTimeOrNull(offsets[8]), ); object.id = id; return object; @@ -187,15 +201,19 @@ P _albumDeserializeProp

( case 1: return (reader.readDateTimeOrNull(offset)) as P; case 2: - return (reader.readStringOrNull(offset)) as P; + return (reader.readDateTimeOrNull(offset)) as P; case 3: - return (reader.readDateTime(offset)) as P; + return (reader.readStringOrNull(offset)) as P; case 4: - return (reader.readString(offset)) as P; + return (reader.readDateTime(offset)) as P; case 5: - return (reader.readStringOrNull(offset)) as P; + return (reader.readString(offset)) as P; case 6: + return (reader.readStringOrNull(offset)) as P; + case 7: return (reader.readBool(offset)) as P; + case 8: + return (reader.readDateTimeOrNull(offset)) as P; default: throw IsarError('Unknown property with id $propertyId'); } @@ -477,6 +495,75 @@ extension AlbumQueryFilter on QueryBuilder { }); } + QueryBuilder endDateIsNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(const FilterCondition.isNull( + property: r'endDate', + )); + }); + } + + QueryBuilder endDateIsNotNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(const FilterCondition.isNotNull( + property: r'endDate', + )); + }); + } + + QueryBuilder endDateEqualTo( + DateTime? value) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'endDate', + value: value, + )); + }); + } + + QueryBuilder endDateGreaterThan( + DateTime? value, { + bool include = false, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.greaterThan( + include: include, + property: r'endDate', + value: value, + )); + }); + } + + QueryBuilder endDateLessThan( + DateTime? value, { + bool include = false, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.lessThan( + include: include, + property: r'endDate', + value: value, + )); + }); + } + + QueryBuilder endDateBetween( + DateTime? lower, + DateTime? upper, { + bool includeLower = true, + bool includeUpper = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.between( + property: r'endDate', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + )); + }); + } + QueryBuilder idEqualTo(Id value) { return QueryBuilder.apply(this, (query) { return query.addFilterCondition(FilterCondition.equalTo( @@ -1084,6 +1171,75 @@ extension AlbumQueryFilter on QueryBuilder { )); }); } + + QueryBuilder startDateIsNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(const FilterCondition.isNull( + property: r'startDate', + )); + }); + } + + QueryBuilder startDateIsNotNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(const FilterCondition.isNotNull( + property: r'startDate', + )); + }); + } + + QueryBuilder startDateEqualTo( + DateTime? value) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'startDate', + value: value, + )); + }); + } + + QueryBuilder startDateGreaterThan( + DateTime? value, { + bool include = false, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.greaterThan( + include: include, + property: r'startDate', + value: value, + )); + }); + } + + QueryBuilder startDateLessThan( + DateTime? value, { + bool include = false, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.lessThan( + include: include, + property: r'startDate', + value: value, + )); + }); + } + + QueryBuilder startDateBetween( + DateTime? lower, + DateTime? upper, { + bool includeLower = true, + bool includeUpper = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.between( + property: r'startDate', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + )); + }); + } } extension AlbumQueryObject on QueryBuilder {} @@ -1241,6 +1397,18 @@ extension AlbumQuerySortBy on QueryBuilder { }); } + QueryBuilder sortByEndDate() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'endDate', Sort.asc); + }); + } + + QueryBuilder sortByEndDateDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'endDate', Sort.desc); + }); + } + QueryBuilder sortByLastModifiedAssetTimestamp() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'lastModifiedAssetTimestamp', Sort.asc); @@ -1313,6 +1481,18 @@ extension AlbumQuerySortBy on QueryBuilder { return query.addSortBy(r'shared', Sort.desc); }); } + + QueryBuilder sortByStartDate() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'startDate', Sort.asc); + }); + } + + QueryBuilder sortByStartDateDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'startDate', Sort.desc); + }); + } } extension AlbumQuerySortThenBy on QueryBuilder { @@ -1328,6 +1508,18 @@ extension AlbumQuerySortThenBy on QueryBuilder { }); } + QueryBuilder thenByEndDate() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'endDate', Sort.asc); + }); + } + + QueryBuilder thenByEndDateDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'endDate', Sort.desc); + }); + } + QueryBuilder thenById() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'id', Sort.asc); @@ -1412,6 +1604,18 @@ extension AlbumQuerySortThenBy on QueryBuilder { return query.addSortBy(r'shared', Sort.desc); }); } + + QueryBuilder thenByStartDate() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'startDate', Sort.asc); + }); + } + + QueryBuilder thenByStartDateDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'startDate', Sort.desc); + }); + } } extension AlbumQueryWhereDistinct on QueryBuilder { @@ -1421,6 +1625,12 @@ extension AlbumQueryWhereDistinct on QueryBuilder { }); } + QueryBuilder distinctByEndDate() { + return QueryBuilder.apply(this, (query) { + return query.addDistinctBy(r'endDate'); + }); + } + QueryBuilder distinctByLastModifiedAssetTimestamp() { return QueryBuilder.apply(this, (query) { return query.addDistinctBy(r'lastModifiedAssetTimestamp'); @@ -1459,6 +1669,12 @@ extension AlbumQueryWhereDistinct on QueryBuilder { return query.addDistinctBy(r'shared'); }); } + + QueryBuilder distinctByStartDate() { + return QueryBuilder.apply(this, (query) { + return query.addDistinctBy(r'startDate'); + }); + } } extension AlbumQueryProperty on QueryBuilder { @@ -1474,6 +1690,12 @@ extension AlbumQueryProperty on QueryBuilder { }); } + QueryBuilder endDateProperty() { + return QueryBuilder.apply(this, (query) { + return query.addPropertyName(r'endDate'); + }); + } + QueryBuilder lastModifiedAssetTimestampProperty() { return QueryBuilder.apply(this, (query) { @@ -1510,4 +1732,10 @@ extension AlbumQueryProperty on QueryBuilder { return query.addPropertyName(r'shared'); }); } + + QueryBuilder startDateProperty() { + return QueryBuilder.apply(this, (query) { + return query.addPropertyName(r'startDate'); + }); + } }