mirror of
https://github.com/git-touch/git-touch
synced 2025-02-20 13:30:38 +01:00
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_issue.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_project.dart';
|
||||
import 'package:git_touch/screens/gitlab_tree.dart';
|
||||
@ -79,6 +80,8 @@ void main() async {
|
||||
gitlabIssuesRouter,
|
||||
gitlabMergeRequestsRouter,
|
||||
gitlabCommitsRouter,
|
||||
gitlabProjectMembersRouter,
|
||||
gitlabGroupMembersRouter,
|
||||
giteaUserRouter,
|
||||
giteaRepoRouter,
|
||||
giteaObjectRouter,
|
||||
|
@ -10,6 +10,7 @@ class GitlabUser {
|
||||
String avatarUrl;
|
||||
String bio;
|
||||
DateTime createdAt;
|
||||
int accessLevel;
|
||||
GitlabUser();
|
||||
factory GitlabUser.fromJson(Map<String, dynamic> json) =>
|
||||
_$GitlabUserFromJson(json);
|
||||
|
@ -15,7 +15,8 @@ GitlabUser _$GitlabUserFromJson(Map<String, dynamic> json) {
|
||||
..bio = json['bio'] as String
|
||||
..createdAt = json['created_at'] == 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) =>
|
||||
@ -26,6 +27,7 @@ Map<String, dynamic> _$GitlabUserToJson(GitlabUser instance) =>
|
||||
'avatar_url': instance.avatarUrl,
|
||||
'bio': instance.bio,
|
||||
'created_at': instance.createdAt?.toIso8601String(),
|
||||
'access_level': instance.accessLevel,
|
||||
};
|
||||
|
||||
GitlabGroup _$GitlabGroupFromJson(Map<String, dynamic> json) {
|
||||
|
@ -51,6 +51,7 @@ class GitlabGroupScreen extends StatelessWidget {
|
||||
EntryItem(
|
||||
count: data.item2,
|
||||
text: 'Members',
|
||||
url: '/gitlab/groups/$id/members',
|
||||
),
|
||||
]),
|
||||
CommonStyle.border,
|
||||
|
63
lib/screens/gitlab_members.dart
Normal file
63
lib/screens/gitlab_members.dart
Normal file
@ -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(
|
||||
count: t.item4,
|
||||
text: 'Members',
|
||||
url: '/gitlab/projects/$id/members',
|
||||
),
|
||||
EntryItem(
|
||||
count: p.starCount,
|
||||
|
Loading…
x
Reference in New Issue
Block a user