redesign for settings page
This commit is contained in:
162
frontend/pweb/lib/pages/roles/page.dart
Normal file
162
frontend/pweb/lib/pages/roles/page.dart
Normal file
@@ -0,0 +1,162 @@
|
||||
import 'package:flutter/material.dart';
|
||||
|
||||
import 'package:go_router/go_router.dart';
|
||||
|
||||
import 'package:provider/provider.dart';
|
||||
|
||||
import 'package:pshared/models/permissions/data/policy.dart';
|
||||
import 'package:pshared/models/permissions/descriptions/role.dart';
|
||||
import 'package:pshared/models/resources.dart';
|
||||
import 'package:pshared/provider/permissions.dart';
|
||||
|
||||
import 'package:pweb/app/router/payout_routes.dart';
|
||||
import 'package:pweb/app/router/page_params.dart';
|
||||
import 'package:pweb/app/router/pages.dart';
|
||||
import 'package:pweb/pages/loader.dart';
|
||||
import 'package:pweb/pages/roles/widgets/actions.dart';
|
||||
import 'package:pweb/pages/roles/widgets/header.dart';
|
||||
import 'package:pweb/pages/roles/widgets/list.dart';
|
||||
import 'package:pweb/models/state/visibility.dart';
|
||||
import 'package:pweb/utils/roles/is_owner_role.dart';
|
||||
import 'package:pweb/widgets/sidebar/destinations.dart';
|
||||
import 'package:pweb/widgets/dialogs/confirmation_dialog.dart';
|
||||
import 'package:pweb/utils/error/snackbar.dart';
|
||||
import 'package:pweb/widgets/roles/create_role_dialog.dart';
|
||||
|
||||
import 'package:pweb/generated/i18n/app_localizations.dart';
|
||||
|
||||
|
||||
class RolesSettingsPage extends StatelessWidget {
|
||||
const RolesSettingsPage({super.key});
|
||||
|
||||
Future<void> _createRole(BuildContext context) async {
|
||||
final loc = AppLocalizations.of(context)!;
|
||||
final draft = await showCreateRoleDialog(
|
||||
context,
|
||||
// title: loc.rolesCreateTitle,
|
||||
// confirmLabel: loc.rolesCreateAction,
|
||||
);
|
||||
if (draft == null) return;
|
||||
|
||||
final permissions = context.read<PermissionsProvider>();
|
||||
await executeActionWithNotification(
|
||||
context: context,
|
||||
action: () => permissions.createRoleDescription(
|
||||
name: draft.name,
|
||||
description: draft.description.isEmpty ? null : draft.description,
|
||||
),
|
||||
successMessage: loc.rolesCreateSuccess,
|
||||
errorMessage: loc.rolesCreateFailed,
|
||||
);
|
||||
}
|
||||
|
||||
Future<void> _copyRole(BuildContext context, RoleDescription role) async {
|
||||
final loc = AppLocalizations.of(context)!;
|
||||
final permissions = context.read<PermissionsProvider>();
|
||||
final sourcePolicies = permissions.getRolePolicies(role.id);
|
||||
final draft = await showCreateRoleDialog(
|
||||
context,
|
||||
// initialDraft: RoleDraft(
|
||||
// name: copyName,
|
||||
// description: role.description ?? '',
|
||||
// ),
|
||||
// title: loc.rolesCopyTitle,
|
||||
// confirmLabel: loc.rolesCopyAction,
|
||||
);
|
||||
if (draft == null) return;
|
||||
|
||||
await executeActionWithNotification(
|
||||
context: context,
|
||||
action: () async {
|
||||
final createdRole = await permissions.createRoleDescription(
|
||||
name: draft.name,
|
||||
description: draft.description.isEmpty ? null : draft.description,
|
||||
);
|
||||
if (createdRole == null || sourcePolicies.isEmpty) return createdRole;
|
||||
final copiedPolicies = sourcePolicies.map((policy) => Policy(
|
||||
roleDescriptionRef: createdRole.id,
|
||||
organizationRef: policy.organizationRef,
|
||||
descriptionRef: policy.descriptionRef,
|
||||
objectRef: policy.objectRef,
|
||||
effect: policy.effect,
|
||||
)).toList();
|
||||
await permissions.createPermissions(copiedPolicies);
|
||||
return createdRole;
|
||||
},
|
||||
successMessage: loc.rolesCopySuccess,
|
||||
errorMessage: loc.rolesCopyFailed,
|
||||
);
|
||||
}
|
||||
|
||||
Future<void> _deleteRole(BuildContext context, RoleDescription role) async {
|
||||
final loc = AppLocalizations.of(context)!;
|
||||
final confirmed = await showConfirmationDialog(
|
||||
context: context,
|
||||
title: loc.rolesDeleteConfirmTitle,
|
||||
message: loc.rolesDeleteConfirmMessage(role.name),
|
||||
confirmLabel: loc.delete,
|
||||
);
|
||||
if (!confirmed) return;
|
||||
|
||||
final permissions = context.read<PermissionsProvider>();
|
||||
await executeActionWithNotification(
|
||||
context: context,
|
||||
action: () => permissions.deleteRoleDescription(role.id),
|
||||
successMessage: loc.rolesDeleteSuccess,
|
||||
errorMessage: loc.rolesDeleteFailed,
|
||||
);
|
||||
}
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
final loc = AppLocalizations.of(context)!;
|
||||
final permissions = context.watch<PermissionsProvider>();
|
||||
final canCreate = permissions.canCreate(ResourceType.roles);
|
||||
final canDelete = permissions.canDelete(ResourceType.roles);
|
||||
final roles = permissions.roleDescriptions;
|
||||
bool isPermanentRole(RoleDescription role) => isOwnerRole(role, loc);
|
||||
VisibilityState hiddenIf(bool isHidden) =>
|
||||
isHidden ? VisibilityState.hidden : VisibilityState.visible;
|
||||
|
||||
return PageViewLoader(
|
||||
child: SafeArea(
|
||||
child: SingleChildScrollView(
|
||||
padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 16),
|
||||
child: Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
RolesHeader(
|
||||
title: loc.rolesPageTitle,
|
||||
subtitle: loc.rolesPageSubtitle,
|
||||
onBack: () => context.goToPayout(PayoutDestination.invitations),
|
||||
),
|
||||
const SizedBox(height: 16),
|
||||
RolesActions(
|
||||
canCreate: canCreate,
|
||||
onCreateRole: () => _createRole(context),
|
||||
createLabel: loc.rolesCreateAction,
|
||||
),
|
||||
const SizedBox(height: 16),
|
||||
RolesList(
|
||||
roles: roles,
|
||||
canCopy: (role) => hiddenIf(!canCreate || isPermanentRole(role)),
|
||||
canDelete: (role) => hiddenIf(!canDelete || isPermanentRole(role)),
|
||||
canManagePolicies: (role) => hiddenIf(isPermanentRole(role)),
|
||||
emptyLabel: loc.rolesEmpty,
|
||||
policiesCount: (role) => permissions.getRolePolicies(role.id).length,
|
||||
onCopy: (role) => _copyRole(context, role),
|
||||
onDelete: (role) => _deleteRole(context, role),
|
||||
onManagePolicies: (role) => context.pushNamed(
|
||||
Pages.permissions.name,
|
||||
pathParameters: {
|
||||
PageParams.roleRef.name: role.id,
|
||||
},
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user