Skip to content

Commit 76cb77f

Browse files
authored
Merge pull request #124 from abrenoch/more_list_types
Add support for viewing images by tags
2 parents c0b883c + a79ee17 commit 76cb77f

7 files changed

Lines changed: 1108 additions & 1 deletion

File tree

lib/app.dart

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ import 'package:piwigo_ng/views/image/edit_image_page.dart';
1616
import 'package:piwigo_ng/views/image/image_favorites_page.dart';
1717
import 'package:piwigo_ng/views/image/image_page.dart';
1818
import 'package:piwigo_ng/views/image/image_search_page.dart';
19+
import 'package:piwigo_ng/views/image/image_tags_page.dart';
1920
import 'package:piwigo_ng/views/image/video_player_page.dart';
2021
import 'package:piwigo_ng/views/settings/auto_upload_page.dart';
2122
import 'package:piwigo_ng/views/settings/privacy_policy_page.dart';
@@ -147,6 +148,14 @@ Route<dynamic> generateRoute(RouteSettings settings) {
147148
),
148149
settings: settings,
149150
);
151+
case ImageTagsPage.routeName:
152+
return MaterialPageRoute(
153+
builder: (_) => ImageTagsPage(
154+
isAdmin: arguments['isAdmin'] ?? isAdmin,
155+
tag: arguments["tag"],
156+
),
157+
settings: settings,
158+
);
150159
case ImageFavoritesPage.routeName:
151160
return MaterialPageRoute(
152161
builder: (_) => ImageFavoritesPage(

lib/components/appbars/root_search_app_bar.dart

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import 'package:flutter/material.dart';
2+
import 'package:piwigo_ng/components/dialogs/tags_dialogs.dart';
23
import 'package:piwigo_ng/components/notification_dot.dart';
34
import 'package:piwigo_ng/components/popup_list_item.dart';
45
import 'package:piwigo_ng/services/preferences_service.dart';
@@ -147,6 +148,15 @@ class _RootSearchAppBarState extends State<RootSearchAppBar> {
147148
],
148149
),
149150
),
151+
PopupMenuItem(
152+
onTap: () => (
153+
showChooseTagSheet(context)
154+
),
155+
child: PopupListItem(
156+
icon: Icons.local_offer_outlined,
157+
text: appStrings.tags,
158+
),
159+
),
150160
if (Preferences.getUserStatus != 'guest')
151161
PopupMenuItem(
152162
onTap: () => Future.delayed(

lib/network/images.dart

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -167,6 +167,49 @@ Future<ApiResponse<Map>> fetchFavorites([
167167
return ApiResponse(error: ApiErrors.error);
168168
}
169169

170+
Future<ApiResponse<Map>> fetchTagImages(int tagID, [int page = 0]) async {
171+
Map<String, String> query = {
172+
"format": "json",
173+
"method": "pwg.tags.getImages",
174+
"tag_id": tagID.toString(),
175+
"per_page": "100",
176+
"page": page.toString(),
177+
};
178+
179+
try {
180+
Response response = await ApiClient.get(queryParameters: query);
181+
182+
if (response.statusCode == 200) {
183+
final Map<String, dynamic> result = json.decode(response.data);
184+
if (result['stat'] == 'fail') {
185+
return ApiResponse<Map>(data: {
186+
'total_count': 0,
187+
'images': [],
188+
});
189+
}
190+
final jsonImages = result['result']['images'];
191+
List<ImageModel> images = List<ImageModel>.from(
192+
jsonImages.map((image) {
193+
image['tags'] = null;
194+
return ImageModel.fromJson(image);
195+
}),
196+
);
197+
198+
print(result['result']['paging']);
199+
200+
return ApiResponse<Map>(data: {
201+
'total_count': result['result']['paging']['total_count'],
202+
'images': images,
203+
});
204+
}
205+
} on DioError catch (e) {
206+
debugPrint('Fetch tag images: ${e.message}');
207+
} on Error catch (e) {
208+
debugPrint('Fetch tag images: ${e.stackTrace}');
209+
}
210+
return ApiResponse(error: ApiErrors.error);
211+
}
212+
170213
Future<String?> pickDirectoryPath() async {
171214
return await FilePicker.platform.getDirectoryPath();
172215
}

lib/network/tags.dart

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import 'package:dio/dio.dart';
44
import 'package:flutter/material.dart';
55
import 'package:piwigo_ng/models/tag_model.dart';
66
import 'package:piwigo_ng/network/api_error.dart';
7+
import 'package:piwigo_ng/services/preferences_service.dart';
78

89
import 'api_client.dart';
910

@@ -60,3 +61,34 @@ Future<ApiResponse<TagModel>> createTag(String name) async {
6061
}
6162
return ApiResponse(error: ApiErrors.error);
6263
}
64+
65+
Future<dynamic> editTag(int tagId, String tagName) async {
66+
Map<String, String> queries = {
67+
"format": "json",
68+
"method": "pwg.tags.rename",
69+
};
70+
FormData formData = FormData.fromMap({
71+
"tag_id": tagId,
72+
"new_name": tagName,
73+
'pwg_token': appPreferences.getString('PWG_TOKEN'),
74+
});
75+
Response response = await ApiClient.post(
76+
data: formData,
77+
queryParameters: queries
78+
);
79+
80+
try {
81+
if (response.statusCode == 200) {
82+
var data = json.decode(response.data);
83+
if (data['stat'] == 'fail') {
84+
return ApiResponse(error: ApiErrors.error);
85+
}
86+
return ApiResponse(data: true);
87+
}
88+
} on DioError catch (e) {
89+
debugPrint('Get tags: ${e.message}');
90+
} on Error catch (e) {
91+
debugPrint('Get tags: $e\n${e.stackTrace}');
92+
}
93+
return ApiResponse(error: ApiErrors.error);
94+
}

0 commit comments

Comments
 (0)