HEX
Server: LiteSpeed
System: Linux houston.panomity.com 6.8.0-100-generic #100-Ubuntu SMP PREEMPT_DYNAMIC Tue Jan 13 16:40:06 UTC 2026 x86_64
User: nudepix (1011)
PHP: 7.4.33
Disabled: pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_wifsignaled,pcntl_wifcontinued,pcntl_wexitstatus,pcntl_wtermsig,pcntl_wstopsig,pcntl_signal,pcntl_signal_get_handler,pcntl_signal_dispatch,pcntl_get_last_error,pcntl_strerror,pcntl_sigprocmask,pcntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_exec,pcntl_getpriority,pcntl_setpriority,pcntl_async_signals,pcntl_unshare,
Upload Files
File: //opt/agentcloud/webapp/src/components/PermissionsEditor.tsx
import * as API from '@api';
import Permission from '@permission';
import { useAccountContext } from 'context/account';
import { useRouter } from 'next/router';
import Metadata from 'permissions/metadata';
import Permissions from 'permissions/permissions'; // Adjust the import path as necessary
import React, { useState } from 'react';
import { toast } from 'react-toastify';

// Helper function to check if a permission is allowed
const isPermissionAllowed = (editingPermission, permissionKey) => {
	const metadata = Metadata[permissionKey];
	if (!metadata || metadata?.blocked === true) { return false; }
	if (!metadata.parent) { return true; }
	// Check if the current permission includes the parent permission
	return editingPermission && editingPermission.get(metadata.parent);
};

function PermissionsEditor({ editingPermission }) {

	const [accountContext]: any = useAccountContext();
	const { csrf, permission: currentPermission } = accountContext as any;
	const router = useRouter();
	const { resourceSlug, memberId } = router.query;

	const [_state, _updateState] = useState(Date.now());

	async function permissionsPost(e) {
		e.preventDefault();
		const body = new FormData();
		body.set('resourceSlug', resourceSlug as string);
		body.set('memberId', memberId as string);
		body.set('_csrf', csrf as string);
		for (let elem of Array.from(e.target.elements).filter((z: any) => z.name.startsWith('permission_bit'))) {
			if (elem['checked']) {
				body.set(elem['name'], 'true'); //Note: value doesn't matter. Any value = true
			}
		}
		await API.editTeamMember(body, () => {
			toast.success('Permissions Updated');
		}, (res) => {
			toast.error(res);
		}, null);
	}

	return (
		<form onSubmit={permissionsPost} className='max-w-full'>
			<div className='grid gap-4 grid-cols-3'>
				{Object.entries(Metadata).map(([key, { title, label, desc, heading }], index) => {
					const isEnabled = isPermissionAllowed(currentPermission, key);
					return (<>
						{heading && <h2 className='font-semibold mt-4 col-span-3'>{heading}</h2>}
						<div key={`perm_${title}_${key}`} className={`${heading && index % 3 === 0 ? 'col-span-3' : ''}`}>
							<div className='flex'>
								<label>
									<input
										className='mr-2 h-4 w-4 rounded border-gray-300 text-indigo-600 focus:ring-indigo-500'
										type='checkbox'
										name={`permission_bit_${key}`}
										value='true'
										checked={editingPermission.get(parseInt(key))}
										onChange={(e) => {
											editingPermission.set(parseInt(key), e.target.checked ? true : false);
											_updateState(Date.now());
										}}
									/>
									<strong>{title}</strong>: {desc}
								</label>
							</div>
						</div>
					</>);
				})}
			</div>
			<button type='submit' value='submit'
				className='mt-4 rounded-md bg-indigo-600 px-3 py-2 text-sm font-semibold text-white shadow-sm hover:bg-indigo-500 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-indigo-600'

			>Submit</button>
		</form>
	);

}

export default PermissionsEditor;