[client] Allow updating permissions

This commit is contained in:
Abhishek Shroff
2024-11-29 07:32:41 +05:30
parent e17b70554a
commit dad6f0ef10
3 changed files with 82 additions and 15 deletions
@@ -30,12 +30,13 @@ class ResourceShareAction extends PhylumAction with JsonApiAction {
{required this.resourceId, required this.resourceName, required this.username, required this.permission, required this.modified});
ResourceShareAction({
required Resource r,
required String resourceId,
required String resourceName,
required String username,
required int permission,
}) : this._(
resourceId: r.id,
resourceName: r.name,
resourceId: resourceId,
resourceName: resourceName,
username: username,
permission: permission,
modified: DateTime.now(),
@@ -1,6 +1,7 @@
import 'dart:async';
import 'package:flutter/material.dart';
import 'package:phylum/libphylum/actions/action_resource_share.dart';
import 'package:phylum/libphylum/db/db.dart';
import 'package:phylum/libphylum/phylum_account.dart';
import 'package:phylum/util/permissions.dart';
@@ -16,6 +17,7 @@ class ResourcePermissionsView extends StatefulWidget {
}
class _ResourcePermissionsViewState extends State<ResourcePermissionsView> {
late String resourceName;
Map<String, Permission>? inheritedPermissions;
Map<String, Permission>? permissions;
@@ -28,6 +30,7 @@ class _ResourcePermissionsViewState extends State<ResourcePermissionsView> {
final inheritedPermissions = calculatePermissionSet(data.sublist(0, data.length - 1).map((e) => e.permissions));
final permissions = mergePermissions(Map.of(inheritedPermissions), data.last.permissions);
setState(() {
resourceName = data.last.name;
this.inheritedPermissions = inheritedPermissions;
this.permissions = permissions;
});
@@ -45,28 +48,85 @@ class _ResourcePermissionsViewState extends State<ResourcePermissionsView> {
final permissions = this.permissions;
if (permissions == null) return const CircularProgressIndicator();
final repository = context.read<PhylumAccount>().userRepository;
final account = context.read<PhylumAccount>();
final repository = account.userRepository;
final userPermissions = permissions[account.userName] ?? 0;
final entries = permissions.entries.toList(growable: false)
..sort(((a, b) {
return a.value == b.value ? a.key.compareTo(b.key) : a.value.compareTo(b.value);
}));
return Column(
return DropdownButtonHideUnderline(
child: Column(
children: [
for (final e in entries)
ListTile(
visualDensity: VisualDensity.adaptivePlatformDensity,
title: Text(repository.getUserDisplayName(e.key)),
trailing: DropdownButton<Permission>(
items: _createPermissionsItems(),
value: e.value,
onChanged: (userPermissions & permissionShare) == 0
? null
: (value) {
if (value == null) return;
account.addAction(ResourceShareAction(
resourceId: widget.resourceId,
resourceName: resourceName,
username: e.key,
permission: value,
));
},
),
// trailing: _getPermissionIcon(e.value),
),
],
),
);
}
List<DropdownMenuItem<Permission>> _createPermissionsItems() {
return [
_buildDropdownMenuItem(permissionSetNone),
_buildDropdownMenuItem(permissionSetReadOnly),
_buildDropdownMenuItem(permissionSetReadWrite),
_buildDropdownMenuItem(permissionSetReadWriteShare),
_buildDropdownMenuItem(permissionSetAll),
];
}
DropdownMenuItem<Permission> _buildDropdownMenuItem(Permission p) {
return DropdownMenuItem(value: p, child: _buildTile(p));
}
Widget _buildTile(Permission p) {
return Row(
mainAxisSize: MainAxisSize.min,
mainAxisAlignment: MainAxisAlignment.start,
children: [
for (final e in entries)
ListTile(
title: Text(repository.getUserDisplayName(e.key)),
trailing: _getPermissionIcon(e.value),
),
Padding(
padding: const EdgeInsets.only(right: 8.0),
child: _getIcon(p),
),
Text(_getText(p)),
],
);
}
Icon? _getPermissionIcon(Permission p) {
if (p == 0) return null;
Icon _getIcon(Permission p) {
if (p == 0) return const Icon(Icons.block);
if (p == -1) return const Icon(Icons.shield_outlined);
if (p == permissionRead) return const Icon(Icons.visibility);
if (p == (permissionRead | permissionWrite)) return const Icon(Icons.edit);
if (p == (permissionRead | permissionWrite | permissionShare)) return const Icon(Icons.person_add);
if (p == permissionSetReadOnly) return const Icon(Icons.visibility);
if (p == permissionSetReadWrite) return const Icon(Icons.edit);
if (p == permissionSetReadWriteShare) return const Icon(Icons.person_add);
return const Icon(Icons.settings);
}
String _getText(Permission p) {
if (p == 0) return 'None';
if (p == -1) return 'Admin';
if (p == permissionSetReadOnly) return 'Viewer';
if (p == permissionSetReadWrite) return 'Collaborator';
if (p == permissionSetReadWriteShare) return 'Editor';
return 'Custom';
}
}
+6
View File
@@ -6,6 +6,12 @@ const Permission permissionRead = 4;
const Permission permissionWrite = 32;
const Permission permissionShare = 128;
const Permission permissionSetNone = 0;
const Permission permissionSetAll = -1;
const Permission permissionSetReadOnly = permissionRead;
const Permission permissionSetReadWrite = permissionRead | permissionWrite;
const Permission permissionSetReadWriteShare = permissionRead | permissionWrite | permissionShare;
Map<String, Permission> calculatePermissionSet(Iterable<String?> permissionJsons) {
final permissions = <String, Permission>{};
for (final p in permissionJsons) {