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 _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(); await executeActionWithNotification( context: context, action: () => permissions.createRoleDescription( name: draft.name, description: draft.description.isEmpty ? null : draft.description, ), successMessage: loc.rolesCreateSuccess, errorMessage: loc.rolesCreateFailed, ); } Future _copyRole(BuildContext context, RoleDescription role) async { final loc = AppLocalizations.of(context)!; final permissions = context.read(); 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 _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(); 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(); 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, }, ), ), ], ), ), ), ); } }