feat(gitlab): members screen
This commit is contained in:
parent
b56111db6f
commit
d1d2e9e0fb
|
@ -15,6 +15,7 @@ import 'package:git_touch/screens/gitlab_commits.dart';
|
||||||
import 'package:git_touch/screens/gitlab_group.dart';
|
import 'package:git_touch/screens/gitlab_group.dart';
|
||||||
import 'package:git_touch/screens/gitlab_issue.dart';
|
import 'package:git_touch/screens/gitlab_issue.dart';
|
||||||
import 'package:git_touch/screens/gitlab_issues.dart';
|
import 'package:git_touch/screens/gitlab_issues.dart';
|
||||||
|
import 'package:git_touch/screens/gitlab_members.dart';
|
||||||
import 'package:git_touch/screens/gitlab_merge_requests.dart';
|
import 'package:git_touch/screens/gitlab_merge_requests.dart';
|
||||||
import 'package:git_touch/screens/gitlab_project.dart';
|
import 'package:git_touch/screens/gitlab_project.dart';
|
||||||
import 'package:git_touch/screens/gitlab_tree.dart';
|
import 'package:git_touch/screens/gitlab_tree.dart';
|
||||||
|
@ -79,6 +80,8 @@ void main() async {
|
||||||
gitlabIssuesRouter,
|
gitlabIssuesRouter,
|
||||||
gitlabMergeRequestsRouter,
|
gitlabMergeRequestsRouter,
|
||||||
gitlabCommitsRouter,
|
gitlabCommitsRouter,
|
||||||
|
gitlabProjectMembersRouter,
|
||||||
|
gitlabGroupMembersRouter,
|
||||||
giteaUserRouter,
|
giteaUserRouter,
|
||||||
giteaRepoRouter,
|
giteaRepoRouter,
|
||||||
giteaObjectRouter,
|
giteaObjectRouter,
|
||||||
|
|
|
@ -10,6 +10,7 @@ class GitlabUser {
|
||||||
String avatarUrl;
|
String avatarUrl;
|
||||||
String bio;
|
String bio;
|
||||||
DateTime createdAt;
|
DateTime createdAt;
|
||||||
|
int accessLevel;
|
||||||
GitlabUser();
|
GitlabUser();
|
||||||
factory GitlabUser.fromJson(Map<String, dynamic> json) =>
|
factory GitlabUser.fromJson(Map<String, dynamic> json) =>
|
||||||
_$GitlabUserFromJson(json);
|
_$GitlabUserFromJson(json);
|
||||||
|
|
|
@ -15,7 +15,8 @@ GitlabUser _$GitlabUserFromJson(Map<String, dynamic> json) {
|
||||||
..bio = json['bio'] as String
|
..bio = json['bio'] as String
|
||||||
..createdAt = json['created_at'] == null
|
..createdAt = json['created_at'] == null
|
||||||
? null
|
? null
|
||||||
: DateTime.parse(json['created_at'] as String);
|
: DateTime.parse(json['created_at'] as String)
|
||||||
|
..accessLevel = json['access_level'] as int;
|
||||||
}
|
}
|
||||||
|
|
||||||
Map<String, dynamic> _$GitlabUserToJson(GitlabUser instance) =>
|
Map<String, dynamic> _$GitlabUserToJson(GitlabUser instance) =>
|
||||||
|
@ -26,6 +27,7 @@ Map<String, dynamic> _$GitlabUserToJson(GitlabUser instance) =>
|
||||||
'avatar_url': instance.avatarUrl,
|
'avatar_url': instance.avatarUrl,
|
||||||
'bio': instance.bio,
|
'bio': instance.bio,
|
||||||
'created_at': instance.createdAt?.toIso8601String(),
|
'created_at': instance.createdAt?.toIso8601String(),
|
||||||
|
'access_level': instance.accessLevel,
|
||||||
};
|
};
|
||||||
|
|
||||||
GitlabGroup _$GitlabGroupFromJson(Map<String, dynamic> json) {
|
GitlabGroup _$GitlabGroupFromJson(Map<String, dynamic> json) {
|
||||||
|
|
|
@ -51,6 +51,7 @@ class GitlabGroupScreen extends StatelessWidget {
|
||||||
EntryItem(
|
EntryItem(
|
||||||
count: data.item2,
|
count: data.item2,
|
||||||
text: 'Members',
|
text: 'Members',
|
||||||
|
url: '/gitlab/groups/$id/members',
|
||||||
),
|
),
|
||||||
]),
|
]),
|
||||||
CommonStyle.border,
|
CommonStyle.border,
|
||||||
|
|
|
@ -0,0 +1,63 @@
|
||||||
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:git_touch/models/auth.dart';
|
||||||
|
import 'package:git_touch/models/gitlab.dart';
|
||||||
|
import 'package:git_touch/scaffolds/list_stateful.dart';
|
||||||
|
import 'package:git_touch/utils/utils.dart';
|
||||||
|
import 'package:git_touch/widgets/app_bar_title.dart';
|
||||||
|
import 'package:git_touch/widgets/user_item.dart';
|
||||||
|
import 'package:provider/provider.dart';
|
||||||
|
|
||||||
|
final gitlabProjectMembersRouter = RouterScreen(
|
||||||
|
'/gitlab/projects/:id/members',
|
||||||
|
(context, parameters) =>
|
||||||
|
GitlabMembers(int.parse(parameters['id'].first), 'projects'));
|
||||||
|
|
||||||
|
final gitlabGroupMembersRouter = RouterScreen(
|
||||||
|
'/gitlab/groups/:id/members',
|
||||||
|
(context, parameters) =>
|
||||||
|
GitlabMembers(int.parse(parameters['id'].first), 'groups'));
|
||||||
|
|
||||||
|
class GitlabMembers extends StatelessWidget {
|
||||||
|
final int id;
|
||||||
|
final String type;
|
||||||
|
GitlabMembers(this.id, this.type);
|
||||||
|
|
||||||
|
Future<ListPayload<GitlabUser, int>> _query(BuildContext context,
|
||||||
|
[int page = 1]) async {
|
||||||
|
final auth = Provider.of<AuthModel>(context);
|
||||||
|
final res = await auth.fetchGitlabWithPage('/$type/$id/members?page=$page');
|
||||||
|
return ListPayload(
|
||||||
|
cursor: res.cursor,
|
||||||
|
hasMore: res.hasMore,
|
||||||
|
items: <GitlabUser>[
|
||||||
|
for (var v in res.data) GitlabUser.fromJson(v),
|
||||||
|
],
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
// https://docs.gitlab.com/ee/api/access_requests.html#valid-access-levels
|
||||||
|
static const accessLevelMap = {
|
||||||
|
10: 'Guest',
|
||||||
|
20: 'Reporter',
|
||||||
|
30: 'Developer',
|
||||||
|
40: 'Maintainer',
|
||||||
|
50: 'Owner',
|
||||||
|
};
|
||||||
|
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
return ListStatefulScaffold<GitlabUser, int>(
|
||||||
|
title: AppBarTitle('Members'),
|
||||||
|
onRefresh: () => _query(context),
|
||||||
|
onLoadMore: (page) => _query(context, page),
|
||||||
|
itemBuilder: (v) {
|
||||||
|
return UserItem(
|
||||||
|
avatarUrl: v.avatarUrl,
|
||||||
|
login: v.username,
|
||||||
|
bio: Text(accessLevelMap[v.accessLevel] ?? ''),
|
||||||
|
url: '/gitlab/user/${v.id}',
|
||||||
|
);
|
||||||
|
},
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
|
@ -96,6 +96,7 @@ class GitlabProjectScreen extends StatelessWidget {
|
||||||
EntryItem(
|
EntryItem(
|
||||||
count: t.item4,
|
count: t.item4,
|
||||||
text: 'Members',
|
text: 'Members',
|
||||||
|
url: '/gitlab/projects/$id/members',
|
||||||
),
|
),
|
||||||
EntryItem(
|
EntryItem(
|
||||||
count: p.starCount,
|
count: p.starCount,
|
||||||
|
|
Loading…
Reference in New Issue