in public/apps/configuration/panels/permission-list/permission-list.tsx [178:304]
export function PermissionList(props: AppDependencies) {
const [permissionList, setPermissionList] = useState<PermissionListingItem[]>([]);
const [actionGroupDict, setActionGroupDict] = useState<DataObject<ActionGroupItem>>({});
const [errorFlag, setErrorFlag] = useState<boolean>(false);
const [selection, setSelection] = React.useState<PermissionListingItem[]>([]);
const [itemIdToExpandedRowMap, setItemIdToExpandedRowMap] = useState<ExpandedRowMapInterface>({});
// Modal state
const [editModal, setEditModal] = useState<ReactNode>(null);
const [toasts, addToast, removeToast] = useToastState();
const [loading, setLoading] = useState(false);
const [query, setQuery] = useState<Query | null>(null);
const fetchData = useCallback(async () => {
try {
setLoading(true);
const actionGroups = await fetchActionGroups(props.coreStart.http);
setActionGroupDict(actionGroups);
setPermissionList(await mergeAllPermissions(actionGroups));
} catch (e) {
console.log(e);
setErrorFlag(true);
} finally {
setLoading(false);
}
}, [props.coreStart.http]);
React.useEffect(() => {
fetchData();
}, [props.coreStart.http, fetchData]);
const handleDelete = async () => {
const groupsToDelete: string[] = selection.map((r) => r.name);
try {
await requestDeleteActionGroups(props.coreStart.http, groupsToDelete);
setPermissionList(difference(permissionList, selection));
setSelection([]);
} catch (e) {
console.log(e);
} finally {
closeActionsMenu();
}
};
const [showDeleteConfirmModal, deleteConfirmModal] = useDeleteConfirmState(
handleDelete,
'action group(s)'
);
const actionsMenuItems = [
<EuiButtonEmpty
id="edit"
key="edit"
onClick={() => showEditModal(selection[0].name, Action.edit, selection[0].allowedActions)}
disabled={selection.length !== 1 || selection[0].reserved}
>
Edit
</EuiButtonEmpty>,
<EuiButtonEmpty
id="duplicate"
key="duplicate"
onClick={() =>
showEditModal(
generateResourceName(Action.duplicate, selection[0].name),
Action.duplicate,
selection[0].allowedActions
)
}
disabled={selection.length !== 1 || selection[0].type !== 'Action group'}
>
Duplicate
</EuiButtonEmpty>,
<EuiButtonEmpty
key="delete"
color="danger"
onClick={showDeleteConfirmModal}
disabled={selection.length === 0 || selection.some((group) => group.reserved)}
>
Delete
</EuiButtonEmpty>,
];
const [actionsMenu, closeActionsMenu] = useContextMenuState('Actions', {}, actionsMenuItems);
const showEditModal = (
initialGroupName: string,
action: Action,
initialAllowedAction: string[]
) => {
setEditModal(
<PermissionEditModal
groupName={initialGroupName}
action={action}
allowedActions={initialAllowedAction}
optionUniverse={permissionList.map((group) => stringToComboBoxOption(group.name))}
handleClose={() => setEditModal(null)}
handleSave={async (groupName, allowedAction) => {
try {
await updateActionGroup(props.coreStart.http, groupName, {
allowed_actions: allowedAction,
});
setEditModal(null);
fetchData();
addToast({
id: 'saveSucceeded',
title: getSuccessToastMessage('Action group', action, groupName),
color: 'success',
});
} catch (e) {
console.log(e);
setEditModal(null);
addToast({
id: 'saveFailed',
title: `Failed to save ${action} group. You may refresh the page to retry or see browser console for more information.`,
color: 'danger',
});
}
}}
/>
);
};
const createActionGroupMenuItems = [
<EuiButtonEmpty key="create-from-blank" onClick={() => showEditModal('', Action.create, [])}>