mirror of
https://codeberg.org/shroff/phylum.git
synced 2026-05-04 02:59:16 -05:00
[client] Allow updating permissions
This commit is contained in:
@@ -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,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) {
|
||||
|
||||
Reference in New Issue
Block a user