Skip to content

Commit 6784822

Browse files
committed
Edit album status and add/remove group permissions
1 parent a666156 commit 6784822

4 files changed

Lines changed: 129 additions & 78 deletions

File tree

lib/network/albums.dart

Lines changed: 15 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -206,24 +206,29 @@ Future<ApiResponse<bool>> moveAlbum(int catId, int parentCatId) async {
206206
return ApiResponse(error: ApiErrors.moveAlbumError);
207207
}
208208

209-
Future<ApiResponse<bool>> editAlbum(
210-
{required String name,
211-
required int albumId,
212-
String description = ''}) async {
209+
Future<ApiResponse<bool>> editAlbum({
210+
required int albumId,
211+
String? name,
212+
String? description,
213+
AlbumStatus? status,
214+
}) async {
213215
Map<String, String> queries = {
214216
'format': 'json',
215217
'method': 'pwg.categories.setInfo',
216218
};
217-
FormData formData = FormData.fromMap({
219+
Map<String, dynamic> data = {
218220
'category_id': albumId,
219-
'name': name,
220-
'comment': description,
221-
});
221+
};
222+
if (name != null) data['name'] = name;
223+
if (description != null) data['comment'] = description;
224+
if (status != null) data['status'] = status.toJson();
225+
226+
final FormData formData = FormData.fromMap(data);
222227

223228
try {
224229
Response response = await ApiClient.post(
225-
data: formData,
226230
queryParameters: queries,
231+
data: formData,
227232
);
228233

229234
if (response.statusCode == 200) {
@@ -232,6 +237,7 @@ Future<ApiResponse<bool>> editAlbum(
232237
debugPrint("$data");
233238
return ApiResponse(error: ApiErrors.editAlbumError);
234239
}
240+
print(data);
235241
return ApiResponse(data: true);
236242
}
237243
} on DioError catch (e) {

lib/network/groups.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ Future<List<GroupModel>?> getAllGroups({
2424
'page': page,
2525
};
2626

27-
if (groups != null) queries['groups[]'] = groups;
27+
if (groups != null) queries['group_id[]'] = groups;
2828
if (name != null) queries['name'] = "$name%";
2929

3030
try {

lib/network/permissions.dart

Lines changed: 13 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -79,24 +79,25 @@ Future<bool> addPermission({
7979
'method': 'pwg.permissions.add',
8080
};
8181

82-
Map<String, dynamic> body = {
82+
Map<String, dynamic> data = {
8383
'cat_id': albumId,
8484
'pwg_token': prefs.getString(Preferences.tokenKey),
8585
};
8686

87-
if (users != null) body['user_id'] = users;
88-
if (groups != null) body['group_id'] = groups;
89-
if (recursive != null) body['recursive'] = recursive;
87+
if (users != null) data['user_id'] = users;
88+
if (groups != null) data['group_id'] = groups;
89+
if (recursive != null) data['recursive'] = recursive;
90+
91+
final FormData formData = FormData.fromMap(data);
9092

9193
try {
9294
Response response = await ApiClient.post(
9395
queryParameters: queries,
94-
data: body,
96+
data: formData,
9597
);
9698

9799
if (response.statusCode == 200) {
98100
Map<String, dynamic> data = json.decode(response.data);
99-
print(data);
100101
return true;
101102
}
102103
} on DioError catch (e) {
@@ -119,23 +120,24 @@ Future<bool> removePermission({
119120
'method': 'pwg.permissions.remove',
120121
};
121122

122-
Map<String, dynamic> body = {
123+
Map<String, dynamic> data = {
123124
'cat_id': albumId,
124125
'pwg_token': prefs.getString(Preferences.tokenKey),
125126
};
126127

127-
if (users != null) body['user_id'] = users;
128-
if (groups != null) body['group_id'] = groups;
128+
if (users != null) data['user_id'] = users;
129+
if (groups != null) data['group_id'] = groups;
130+
131+
final FormData formData = FormData.fromMap(data);
129132

130133
try {
131134
Response response = await ApiClient.post(
132135
queryParameters: queries,
133-
data: body,
136+
data: formData,
134137
);
135138

136139
if (response.statusCode == 200) {
137140
Map<String, dynamic> data = json.decode(response.data);
138-
print(data);
139141
return true;
140142
}
141143
} on DioError catch (e) {

lib/views/album/album_privacy_page.dart

Lines changed: 100 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import 'package:piwigo_ng/models/album_model.dart';
77
import 'package:piwigo_ng/models/album_permission_model.dart';
88
import 'package:piwigo_ng/models/group_model.dart';
99
import 'package:piwigo_ng/models/user_model.dart';
10+
import 'package:piwigo_ng/network/albums.dart';
1011
import 'package:piwigo_ng/network/api_error.dart';
1112
import 'package:piwigo_ng/network/groups.dart';
1213
import 'package:piwigo_ng/network/permissions.dart';
@@ -48,7 +49,6 @@ class _AlbumPrivacyPageState extends State<AlbumPrivacyPage> {
4849
return;
4950
}
5051
_admins = response.data;
51-
print(_admins);
5252
}
5353

5454
Future<void> _getPermissions() async {
@@ -72,6 +72,33 @@ class _AlbumPrivacyPageState extends State<AlbumPrivacyPage> {
7272
_groups = [..._groups, ..._allowedGroups].toSet().toList();
7373
}
7474

75+
Future<void> _onConfirmPermissions() async {
76+
ApiResponse editResult = await editAlbum(
77+
albumId: widget.album.id,
78+
status: _selectedMode,
79+
);
80+
if (!editResult.hasData || !editResult.data) return;
81+
82+
if (_selectedMode == AlbumStatus.private) {
83+
List<GroupModel> newGroups =
84+
_groups.where((e) => !_allowedGroups.contains(e)).toList();
85+
List<GroupModel> removedGroups =
86+
_allowedGroups.where((e) => !_groups.contains(e)).toList();
87+
88+
bool addSuccess = await addPermission(
89+
albumId: widget.album.id,
90+
groups: newGroups.map((group) => group.id).toList(),
91+
);
92+
93+
bool removeSuccess = await removePermission(
94+
albumId: widget.album.id,
95+
groups: removedGroups.map((group) => group.id).toList(),
96+
);
97+
}
98+
99+
Navigator.of(context).pop();
100+
}
101+
75102
void _onChangeMode(AlbumStatus? mode) {
76103
if (mode == null) return;
77104
setState(() {
@@ -102,56 +129,67 @@ class _AlbumPrivacyPageState extends State<AlbumPrivacyPage> {
102129
appBar: AppBar(
103130
title: Text(appStrings.categoryPrivacy),
104131
),
105-
body: ListView(
106-
padding: const EdgeInsets.symmetric(
107-
vertical: 16.0,
108-
),
132+
body: Column(
109133
children: [
110-
Text(
111-
appStrings.categoryPrivacy_subtitle(widget.album.name),
112-
textAlign: TextAlign.center,
113-
),
114-
Padding(
115-
padding: const EdgeInsets.symmetric(
116-
vertical: 8.0,
117-
),
118-
child: Column(
134+
Expanded(
135+
child: ListView(
136+
padding: const EdgeInsets.symmetric(
137+
vertical: 16.0,
138+
),
119139
children: [
120-
RadioListTile<AlbumStatus>(
121-
value: AlbumStatus.public,
122-
groupValue: _selectedMode,
123-
activeColor: Theme.of(context).colorScheme.secondary,
124-
title: Text(appStrings.categoryPrivacyMode_public),
125-
subtitle: Text(appStrings.categoryPrivacyMode_publicMessage),
126-
onChanged: _onChangeMode,
140+
Text(
141+
appStrings.categoryPrivacy_subtitle(widget.album.name),
142+
textAlign: TextAlign.center,
143+
),
144+
Padding(
145+
padding: const EdgeInsets.symmetric(
146+
vertical: 8.0,
147+
),
148+
child: Column(
149+
children: [
150+
RadioListTile<AlbumStatus>(
151+
value: AlbumStatus.public,
152+
groupValue: _selectedMode,
153+
activeColor: Theme.of(context).colorScheme.secondary,
154+
title: Text(appStrings.categoryPrivacyMode_public),
155+
subtitle:
156+
Text(appStrings.categoryPrivacyMode_publicMessage),
157+
onChanged: _onChangeMode,
158+
),
159+
RadioListTile(
160+
value: AlbumStatus.private,
161+
groupValue: _selectedMode,
162+
activeColor: Theme.of(context).colorScheme.secondary,
163+
title: Text(appStrings.categoryPrivacyMode_private),
164+
subtitle:
165+
Text(appStrings.categoryPrivacyMode_privateMessage),
166+
onChanged: _onChangeMode,
167+
),
168+
],
169+
),
127170
),
128-
RadioListTile(
129-
value: AlbumStatus.private,
130-
groupValue: _selectedMode,
131-
activeColor: Theme.of(context).colorScheme.secondary,
132-
title: Text(appStrings.categoryPrivacyMode_private),
133-
subtitle: Text(appStrings.categoryPrivacyMode_privateMessage),
134-
onChanged: _onChangeMode,
171+
AnimatedSize(
172+
duration: const Duration(milliseconds: 300),
173+
reverseDuration: const Duration(milliseconds: 150),
174+
curve: Curves.ease,
175+
alignment: Alignment.topCenter,
176+
child: SizedBox(
177+
height: _selectedMode == AlbumStatus.public ? .0 : null,
178+
child: _privateSection,
179+
),
135180
),
136181
],
137182
),
138183
),
139-
AnimatedSize(
140-
duration: const Duration(milliseconds: 300),
141-
reverseDuration: const Duration(milliseconds: 150),
142-
curve: Curves.ease,
143-
alignment: Alignment.topCenter,
144-
child: SizedBox(
145-
height: _selectedMode == AlbumStatus.public ? .0 : null,
146-
child: _privateSection,
147-
),
148-
),
149-
PiwigoButton(
150-
margin: const EdgeInsets.symmetric(
184+
Padding(
185+
padding: const EdgeInsets.symmetric(
151186
horizontal: 24.0,
152187
vertical: 16.0,
153188
),
154-
text: appStrings.alertConfirmButton,
189+
child: PiwigoButton(
190+
onPressed: _onConfirmPermissions,
191+
text: appStrings.alertConfirmButton,
192+
),
155193
),
156194
],
157195
),
@@ -179,22 +217,14 @@ class _AlbumPrivacyPageState extends State<AlbumPrivacyPage> {
179217
child: FutureBuilder(
180218
future: _permissionsFuture,
181219
builder: (context, snapshot) {
182-
if (snapshot.connectionState == ConnectionState.done) {
183-
return Wrap(
184-
spacing: 8.0,
185-
runSpacing: .0,
186-
children: List.generate(_groups.length, (index) {
187-
GroupModel group = _groups[index];
188-
return PiwigoChip(
189-
onRemove: () => _onRemoveGroup(index),
190-
label: group.name,
191-
);
192-
}),
193-
);
220+
switch (snapshot.connectionState) {
221+
case ConnectionState.done:
222+
return _buildGroupPermissions;
223+
default:
224+
return Center(
225+
child: CircularProgressIndicator(),
226+
);
194227
}
195-
return Center(
196-
child: CircularProgressIndicator(),
197-
);
198228
},
199229
),
200230
),
@@ -206,7 +236,6 @@ class _AlbumPrivacyPageState extends State<AlbumPrivacyPage> {
206236
switch (snapshot.connectionState) {
207237
case ConnectionState.done:
208238
return _buildUserPermissions;
209-
case ConnectionState.waiting:
210239
default:
211240
return Center(
212241
child: CircularProgressIndicator(),
@@ -220,6 +249,20 @@ class _AlbumPrivacyPageState extends State<AlbumPrivacyPage> {
220249
);
221250
}
222251

252+
Widget get _buildGroupPermissions {
253+
return Wrap(
254+
spacing: 8.0,
255+
runSpacing: .0,
256+
children: List.generate(_groups.length, (index) {
257+
GroupModel group = _groups[index];
258+
return PiwigoChip(
259+
onRemove: () => _onRemoveGroup(index),
260+
label: group.name,
261+
);
262+
}),
263+
);
264+
}
265+
223266
Widget get _buildUserPermissions {
224267
if (_admins == null) {
225268
return Text(appStrings.none);

0 commit comments

Comments
 (0)