Add category filter to galleries

This commit is contained in:
2024-08-10 10:04:48 +00:00
committed by GitHub
parent e74a940191
commit 1a79e41f7a
8 changed files with 210 additions and 85 deletions

View File

@@ -240,6 +240,7 @@ abstract class _EHApi {
@Query("sort_by_gid") bool? sortByGid,
@Query("uploader") String? uploader,
@Query("tag") String? tag,
@Query("category") String? category,
@CancelRequest() CancelToken? cancel});
@GET('/tag/{id}')

View File

@@ -6,7 +6,7 @@ part of 'client.dart';
// RetrofitGenerator
// **************************************************************************
// ignore_for_file: unnecessary_brace_in_string_interps,no_leading_underscores_for_local_identifiers
// ignore_for_file: unnecessary_brace_in_string_interps,no_leading_underscores_for_local_identifiers,unused_element
class __EHApi implements _EHApi {
__EHApi(
@@ -51,11 +51,11 @@ class __EHApi implements _EHApi {
_dio.options.baseUrl,
baseUrl,
))));
final value = ApiResult<BUser>.fromJson(
final _value = ApiResult<BUser>.fromJson(
_result.data!,
(json) => BUser.fromJson(json as Map<String, dynamic>),
);
return value;
return _value;
}
@override
@@ -101,11 +101,11 @@ class __EHApi implements _EHApi {
_dio.options.baseUrl,
baseUrl,
))));
final value = ApiResult<dynamic>.fromJson(
final _value = ApiResult<dynamic>.fromJson(
_result.data!,
(json) => json as dynamic,
);
return value;
return _value;
}
@override
@@ -160,11 +160,11 @@ class __EHApi implements _EHApi {
_dio.options.baseUrl,
baseUrl,
))));
final value = ApiResult<int>.fromJson(
final _value = ApiResult<int>.fromJson(
_result.data!,
(json) => json as int,
);
return value;
return _value;
}
@override
@@ -209,11 +209,11 @@ class __EHApi implements _EHApi {
_dio.options.baseUrl,
baseUrl,
))));
final value = ApiResult<dynamic>.fromJson(
final _value = ApiResult<dynamic>.fromJson(
_result.data!,
(json) => json as dynamic,
);
return value;
return _value;
}
@override
@@ -248,11 +248,11 @@ class __EHApi implements _EHApi {
_dio.options.baseUrl,
baseUrl,
))));
final value = ApiResult<BUser>.fromJson(
final _value = ApiResult<BUser>.fromJson(
_result.data!,
(json) => BUser.fromJson(json as Map<String, dynamic>),
);
return value;
return _value;
}
@override
@@ -289,7 +289,7 @@ class __EHApi implements _EHApi {
_dio.options.baseUrl,
baseUrl,
))));
final value = ApiResult<List<BUser>>.fromJson(
final _value = ApiResult<List<BUser>>.fromJson(
_result.data!,
(json) => json is List<dynamic>
? json
@@ -297,7 +297,7 @@ class __EHApi implements _EHApi {
.toList()
: List.empty(),
);
return value;
return _value;
}
@override
@@ -370,11 +370,11 @@ class __EHApi implements _EHApi {
_dio.options.baseUrl,
baseUrl,
))));
final value = ApiResult<BUser>.fromJson(
final _value = ApiResult<BUser>.fromJson(
_result.data!,
(json) => BUser.fromJson(json as Map<String, dynamic>),
);
return value;
return _value;
}
@override
@@ -402,11 +402,11 @@ class __EHApi implements _EHApi {
_dio.options.baseUrl,
baseUrl,
))));
final value = ApiResult<ServerStatus>.fromJson(
final _value = ApiResult<ServerStatus>.fromJson(
_result.data!,
(json) => ServerStatus.fromJson(json as Map<String, dynamic>),
);
return value;
return _value;
}
@override
@@ -501,11 +501,11 @@ class __EHApi implements _EHApi {
_dio.options.baseUrl,
baseUrl,
))));
final value = ApiResult<Token>.fromJson(
final _value = ApiResult<Token>.fromJson(
_result.data!,
(json) => Token.fromJson(json as Map<String, dynamic>),
);
return value;
return _value;
}
@override
@@ -571,11 +571,11 @@ class __EHApi implements _EHApi {
_dio.options.baseUrl,
baseUrl,
))));
final value = ApiResult<Token>.fromJson(
final _value = ApiResult<Token>.fromJson(
_result.data!,
(json) => Token.fromJson(json as Map<String, dynamic>),
);
return value;
return _value;
}
@override
@@ -613,11 +613,11 @@ class __EHApi implements _EHApi {
_dio.options.baseUrl,
baseUrl,
))));
final value = ApiResult<bool>.fromJson(
final _value = ApiResult<bool>.fromJson(
_result.data!,
(json) => json as bool,
);
return value;
return _value;
}
@override
@@ -648,11 +648,11 @@ class __EHApi implements _EHApi {
_dio.options.baseUrl,
baseUrl,
))));
final value = ApiResult<TokenWithUserInfo>.fromJson(
final _value = ApiResult<TokenWithUserInfo>.fromJson(
_result.data!,
(json) => TokenWithUserInfo.fromJson(json as Map<String, dynamic>),
);
return value;
return _value;
}
@override
@@ -684,8 +684,8 @@ class __EHApi implements _EHApi {
_dio.options.baseUrl,
baseUrl,
))));
final value = _result.data!.cast<int>();
final httpResponse = HttpResponse(value, _result);
final _value = _result.data!.cast<int>();
final httpResponse = HttpResponse(_value, _result);
return httpResponse;
}
@@ -718,11 +718,11 @@ class __EHApi implements _EHApi {
_dio.options.baseUrl,
baseUrl,
))));
final value = ApiResult<EhFileExtend>.fromJson(
final _value = ApiResult<EhFileExtend>.fromJson(
_result.data!,
(json) => EhFileExtend.fromJson(json as Map<String, dynamic>),
);
return value;
return _value;
}
@override
@@ -760,8 +760,8 @@ class __EHApi implements _EHApi {
_dio.options.baseUrl,
baseUrl,
))));
final value = _result.data!.cast<int>();
final httpResponse = HttpResponse(value, _result);
final _value = _result.data!.cast<int>();
final httpResponse = HttpResponse(_value, _result);
return httpResponse;
}
@@ -793,11 +793,11 @@ class __EHApi implements _EHApi {
_dio.options.baseUrl,
baseUrl,
))));
final value = ApiResult<EhFiles>.fromJson(
final _value = ApiResult<EhFiles>.fromJson(
_result.data!,
(json) => EhFiles.fromJson(json as Map<String, dynamic>),
);
return value;
return _value;
}
@override
@@ -844,8 +844,8 @@ class __EHApi implements _EHApi {
_dio.options.baseUrl,
baseUrl,
))));
final value = _result.data!.cast<int>();
final httpResponse = HttpResponse(value, _result);
final _value = _result.data!.cast<int>();
final httpResponse = HttpResponse(_value, _result);
return httpResponse;
}
@@ -877,11 +877,11 @@ class __EHApi implements _EHApi {
_dio.options.baseUrl,
baseUrl,
))));
final value = ApiResult<GalleryData>.fromJson(
final _value = ApiResult<GalleryData>.fromJson(
_result.data!,
(json) => GalleryData.fromJson(json as Map<String, dynamic>),
);
return value;
return _value;
}
@override
@@ -912,11 +912,11 @@ class __EHApi implements _EHApi {
_dio.options.baseUrl,
baseUrl,
))));
final value = ApiResult<GMetaInfos>.fromJson(
final _value = ApiResult<GMetaInfos>.fromJson(
_result.data!,
(json) => GMetaInfos.fromJson(json as Map<String, dynamic>),
);
return value;
return _value;
}
@override
@@ -927,6 +927,7 @@ class __EHApi implements _EHApi {
bool? sortByGid,
String? uploader,
String? tag,
String? category,
CancelToken? cancel,
}) async {
final _extra = <String, dynamic>{};
@@ -937,6 +938,7 @@ class __EHApi implements _EHApi {
r'sort_by_gid': sortByGid,
r'uploader': uploader,
r'tag': tag,
r'category': category,
};
queryParameters.removeWhere((k, v) => v == null);
final _headers = <String, dynamic>{};
@@ -959,7 +961,7 @@ class __EHApi implements _EHApi {
_dio.options.baseUrl,
baseUrl,
))));
final value = ApiResult<List<GMeta>>.fromJson(
final _value = ApiResult<List<GMeta>>.fromJson(
_result.data!,
(json) => json is List<dynamic>
? json
@@ -967,7 +969,7 @@ class __EHApi implements _EHApi {
.toList()
: List.empty(),
);
return value;
return _value;
}
@override
@@ -998,11 +1000,11 @@ class __EHApi implements _EHApi {
_dio.options.baseUrl,
baseUrl,
))));
final value = ApiResult<Tags>.fromJson(
final _value = ApiResult<Tags>.fromJson(
_result.data!,
(json) => Tags.fromJson(json as Map<String, dynamic>),
);
return value;
return _value;
}
@override
@@ -1030,7 +1032,7 @@ class __EHApi implements _EHApi {
_dio.options.baseUrl,
baseUrl,
))));
final value = ApiResult<List<Tag>>.fromJson(
final _value = ApiResult<List<Tag>>.fromJson(
_result.data!,
(json) => json is List<dynamic>
? json
@@ -1038,7 +1040,7 @@ class __EHApi implements _EHApi {
.toList()
: List.empty(),
);
return value;
return _value;
}
@override
@@ -1077,8 +1079,8 @@ class __EHApi implements _EHApi {
_dio.options.baseUrl,
baseUrl,
))));
final value = _result.data;
final httpResponse = HttpResponse(value, _result);
final _value = _result.data;
final httpResponse = HttpResponse(_value, _result);
return httpResponse;
}
@@ -1136,11 +1138,11 @@ class __EHApi implements _EHApi {
_dio.options.baseUrl,
baseUrl,
))));
final value = ApiResult<dynamic>.fromJson(
final _value = ApiResult<dynamic>.fromJson(
_result.data!,
(json) => json as dynamic,
);
return value;
return _value;
}
@override
@@ -1190,11 +1192,11 @@ class __EHApi implements _EHApi {
_dio.options.baseUrl,
baseUrl,
))));
final value = ApiResult<dynamic>.fromJson(
final _value = ApiResult<dynamic>.fromJson(
_result.data!,
(json) => json as dynamic,
);
return value;
return _value;
}
@override
@@ -1244,11 +1246,11 @@ class __EHApi implements _EHApi {
_dio.options.baseUrl,
baseUrl,
))));
final value = ApiResult<dynamic>.fromJson(
final _value = ApiResult<dynamic>.fromJson(
_result.data!,
(json) => json as dynamic,
);
return value;
return _value;
}
@override
@@ -1279,8 +1281,8 @@ class __EHApi implements _EHApi {
_dio.options.baseUrl,
baseUrl,
))));
final value = Config.fromJson(_result.data!);
return value;
final _value = Config.fromJson(_result.data!);
return _value;
}
@override
@@ -1312,8 +1314,8 @@ class __EHApi implements _EHApi {
_dio.options.baseUrl,
baseUrl,
))));
final value = UpdateConfigResult.fromJson(_result.data!);
return value;
final _value = UpdateConfigResult.fromJson(_result.data!);
return _value;
}
@override
@@ -1348,11 +1350,11 @@ class __EHApi implements _EHApi {
_dio.options.baseUrl,
baseUrl,
))));
final value = ApiResult<EHMetaInfo>.fromJson(
final _value = ApiResult<EHMetaInfo>.fromJson(
_result.data!,
(json) => EHMetaInfo.fromJson(json as Map<String, dynamic>),
);
return value;
return _value;
}
@override
@@ -1403,11 +1405,11 @@ class __EHApi implements _EHApi {
_dio.options.baseUrl,
baseUrl,
))));
final value = ApiResult<Task>.fromJson(
final _value = ApiResult<Task>.fromJson(
_result.data!,
(json) => Task.fromJson(json as Map<String, dynamic>),
);
return value;
return _value;
}
@override
@@ -1453,11 +1455,11 @@ class __EHApi implements _EHApi {
_dio.options.baseUrl,
baseUrl,
))));
final value = ApiResult<Task>.fromJson(
final _value = ApiResult<Task>.fromJson(
_result.data!,
(json) => Task.fromJson(json as Map<String, dynamic>),
);
return value;
return _value;
}
@override
@@ -1508,11 +1510,11 @@ class __EHApi implements _EHApi {
_dio.options.baseUrl,
baseUrl,
))));
final value = ApiResult<Task>.fromJson(
final _value = ApiResult<Task>.fromJson(
_result.data!,
(json) => Task.fromJson(json as Map<String, dynamic>),
);
return value;
return _value;
}
@override
@@ -1541,11 +1543,11 @@ class __EHApi implements _EHApi {
_dio.options.baseUrl,
baseUrl,
))));
final value = ApiResult<DownloadConfig>.fromJson(
final _value = ApiResult<DownloadConfig>.fromJson(
_result.data!,
(json) => DownloadConfig.fromJson(json as Map<String, dynamic>),
);
return value;
return _value;
}
@override
@@ -1574,11 +1576,11 @@ class __EHApi implements _EHApi {
_dio.options.baseUrl,
baseUrl,
))));
final value = ApiResult<ExportZipConfig>.fromJson(
final _value = ApiResult<ExportZipConfig>.fromJson(
_result.data!,
(json) => ExportZipConfig.fromJson(json as Map<String, dynamic>),
);
return value;
return _value;
}
@override
@@ -1607,11 +1609,11 @@ class __EHApi implements _EHApi {
_dio.options.baseUrl,
baseUrl,
))));
final value = ApiResult<DefaultImportConfig>.fromJson(
final _value = ApiResult<DefaultImportConfig>.fromJson(
_result.data!,
(json) => DefaultImportConfig.fromJson(json as Map<String, dynamic>),
);
return value;
return _value;
}
RequestOptions _setStreamType<T>(RequestOptions requestOptions) {

View File

@@ -57,7 +57,14 @@ class GalleryBasicInfo extends StatelessWidget {
context.pushNamed("/galleries",
queryParameters: {"uploader": gMeta.uploader});
})),
SelectableText(gMeta.category),
SelectableText.rich(TextSpan(
text: gMeta.category,
mouseCursor: SystemMouseCursors.click,
recognizer: TapGestureRecognizer()
..onTap = () {
context.pushNamed("/galleries",
queryParameters: {"category": gMeta.category});
})),
],
))
])),

View File

@@ -94,8 +94,17 @@ class GalleryInfoDesktop extends StatelessWidget {
SizedBox(
width: 170,
child: Column(children: [
SelectableText(gData.meta.category,
style: TextStyle(color: cs.secondary)),
SelectableText.rich(TextSpan(
text: gData.meta.category,
style: TextStyle(color: cs.secondary),
mouseCursor: SystemMouseCursors.click,
recognizer: TapGestureRecognizer()
..onTap = () {
context.pushNamed("/galleries",
queryParameters: {
"category": gData.meta.category
});
})),
SelectableText.rich(TextSpan(
text: gData.meta.uploader,
style: TextStyle(color: cs.secondary),

View File

@@ -61,7 +61,7 @@
}
}
},
"tagUploaderGalleries": "Galleries tagged {tag} by {uploader}",
"tagUploaderGalleries": "Galleries tagged {tag} uploaded by {uploader}",
"@tagUploaderGalleries": {
"placeholders": {
"tag": {
@@ -269,5 +269,49 @@
"thumbnailAlignHelp": "This only works if the scaling method is to touch container from outside/inside.",
"createImportTask": "Create import task",
"importPath": "Path to the file/directory to import",
"importSize": "Image size"
"importSize": "Image size",
"tagUploaderCategoryGalleries": "Galleries tagged {tag} uploaded by {uploader} in category {category}",
"@tagUploaderCategoryGalleries": {
"placeholders": {
"tag": {
"type": "String"
},
"uploader": {
"type": "String"
},
"category": {
"type": "String"
}
}
},
"categoryGalleries": "Galleries with category {category}",
"@categoryGalleries": {
"placeholders": {
"category": {
"type": "String"
}
}
},
"uploaderCategoryGalleries": "Galleries with category {category} uploaded by {uploader}",
"@uploaderCategoryGalleries": {
"placeholders": {
"category": {
"type": "String"
},
"uploader": {
"type": "String"
}
}
},
"tagCategoryGalleries": "Galleries with category {category} tagged {tag}",
"@tagCategoryGalleries": {
"placeholders": {
"category": {
"type": "String"
},
"tag": {
"type": "String"
}
}
}
}

View File

@@ -12,9 +12,9 @@
"networkError": "网络错误。",
"internalError": "出现了内部错误,请将日志发送给开发者。",
"setServerUrl": "服务器地址",
"createRootUser": "建根用户",
"createRootUser": "建根用户",
"skip": "跳过",
"create": "建",
"create": "建",
"settings": "设置",
"lang": "语言",
"systemLang": "系统语言",
@@ -267,7 +267,51 @@
"center": "居中",
"rightOrBottom": "右/下",
"thumbnailAlignHelp": "仅当缩放方法是缩放以填满/适合容器时生效。",
"createImportTask": "建导入任务",
"createImportTask": "建导入任务",
"importPath": "需要导入的文件/文件夹路径",
"importSize": "图像大小"
"importSize": "图像大小",
"tagUploaderCategoryGalleries": "在分类 {category} 中 {uploader} 上传的带有 {tag} 标签的画廊",
"@tagUploaderCategoryGalleries": {
"placeholders": {
"tag": {
"type": "String"
},
"uploader": {
"type": "String"
},
"category": {
"type": "String"
}
}
},
"categoryGalleries": "分类为 {category} 的画廊",
"@categoryGalleries": {
"placeholders": {
"category": {
"type": "String"
}
}
},
"uploaderCategoryGalleries": "{uploader} 上传的分类为 {category} 的画廊",
"@uploaderCategoryGalleries": {
"placeholders": {
"category": {
"type": "String"
},
"uploader": {
"type": "String"
}
}
},
"tagCategoryGalleries": "分类为 {category} 的带有 {tag} 标签的画廊",
"@tagCategoryGalleries": {
"placeholders": {
"category": {
"type": "String"
},
"tag": {
"type": "String"
}
}
}
}

View File

@@ -72,6 +72,7 @@ final _router = GoRouter(
}
final tag = state.uri.queryParameters["tag"];
final uploader = state.uri.queryParameters["uploader"];
final category = state.uri.queryParameters["category"];
final extra = state.extra as GalleriesPageExtra?;
return GalleriesPage(
key: state.pageKey,
@@ -79,6 +80,7 @@ final _router = GoRouter(
tag: tag,
uploader: uploader,
translatedTag: extra?.translatedTag,
category: category,
hasExtra: extra != null);
}),
GoRoute(

View File

@@ -23,12 +23,14 @@ class GalleriesPage extends StatefulWidget {
this.uploader,
this.tag,
this.translatedTag,
this.category,
this.hasExtra = false});
final SortByGid? sortByGid;
final String? uploader;
final String? tag;
final String? translatedTag;
final bool hasExtra;
final String? category;
bool _stt(BuildContext context) =>
prefs.getBool("showTranslatedTag") ??
MainApp.of(context).lang.toLocale().languageCode == "zh";
@@ -61,6 +63,7 @@ class _GalleriesPage extends State<GalleriesPage>
limit: _pageSize,
sortByGid: _sortByGid,
uploader: widget.uploader,
category: widget.category,
tag: widget.tag))
.unwrap();
final isLastPage = list.length < _pageSize;
@@ -140,6 +143,7 @@ class _GalleriesPage extends State<GalleriesPage>
"sortByGid": [v!.index.toString()],
"tag": [widget.tag ?? ""],
"uploader": [widget.uploader ?? ""],
"category": [widget.category ?? ""],
};
queryParameters.removeWhere((k, v) => v[0].isEmpty);
context.pushReplacementNamed("/galleries",
@@ -155,12 +159,24 @@ class _GalleriesPage extends State<GalleriesPage>
],
leadingIcon: const Icon(Icons.sort),
);
final title = widget.uploader != null && widget.tag != null
? i18n.tagUploaderGalleries(preferredTag(context)!, widget.uploader!)
final title = widget.tag != null
? widget.uploader != null
? widget.category != null
? i18n.tagUploaderCategoryGalleries(
preferredTag(context)!, widget.uploader!, widget.category!)
: i18n.tagUploaderGalleries(
preferredTag(context)!, widget.uploader!)
: widget.category != null
? i18n.tagCategoryGalleries(
widget.category!, preferredTag(context)!)
: i18n.tagGalleries(preferredTag(context)!)
: widget.uploader != null
? i18n.uploaderGalleries(widget.uploader!)
: widget.tag != null
? i18n.tagGalleries(preferredTag(context)!)
? widget.category != null
? i18n.uploaderCategoryGalleries(
widget.category!, widget.uploader!)
: i18n.uploaderGalleries(widget.uploader!)
: widget.category != null
? i18n.categoryGalleries(widget.category!)
: i18n.galleries;
if (isTop(context)) {
setCurrentTitle(title, Theme.of(context).primaryColor.value);