Add permission descriptions and role defaults to CompanyUsers Create/Edit

- Added form-text blurbs under every permission checkbox on both pages
  so admins know exactly what each permission unlocks at a glance
- Replaced single Accountant default with a full roleDefaults map covering
  Viewer, Worker, Accountant, and Manager roles
- Create page applies defaults on load and on role change (fresh form)
- Edit page preserves saved permissions on load; only resets to defaults
  when the role is explicitly changed

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-05-11 08:26:21 -04:00
parent dde66c807f
commit 656f830898
2 changed files with 66 additions and 29 deletions
@@ -119,90 +119,105 @@
<div class="form-check">
<input asp-for="CanManageJobs" class="form-check-input permission-checkbox" />
<label asp-for="CanManageJobs" class="form-check-label">Can Manage Jobs</label>
<div class="form-text text-muted small">Create, edit, and update job status; manage job items, worker assignments, and time entries</div>
</div>
</div>
<div class="col-md-6">
<div class="form-check">
<input asp-for="CanManageInventory" class="form-check-input permission-checkbox" />
<label asp-for="CanManageInventory" class="form-check-label">Can Manage Inventory</label>
<div class="form-text text-muted small">Add and adjust powder stock, record transactions, manage reorder levels</div>
</div>
</div>
<div class="col-md-6">
<div class="form-check">
<input asp-for="CanManageCustomers" class="form-check-input permission-checkbox" />
<label asp-for="CanManageCustomers" class="form-check-label">Can Manage Customers</label>
<div class="form-text text-muted small">Create and edit customer records, pricing tiers, tax exemption, and credit limits</div>
</div>
</div>
<div class="col-md-6">
<div class="form-check">
<input asp-for="CanCreateQuotes" class="form-check-input permission-checkbox" />
<label asp-for="CanCreateQuotes" class="form-check-label">Can Create Quotes</label>
<div class="form-text text-muted small">Build quotes with line items and AI photo quoting; convert accepted quotes to jobs</div>
</div>
</div>
<div class="col-md-6">
<div class="form-check">
<input asp-for="CanApproveQuotes" class="form-check-input permission-checkbox" />
<label asp-for="CanApproveQuotes" class="form-check-label">Can Approve Quotes</label>
<div class="form-text text-muted small">Accept or reject submitted quotes on behalf of the company</div>
</div>
</div>
<div class="col-md-6">
<div class="form-check">
<input asp-for="CanManageCalendar" class="form-check-input permission-checkbox" />
<label asp-for="CanManageCalendar" class="form-check-label">Can Manage Calendar</label>
<div class="form-text text-muted small">Create, edit, and delete oven schedule batches and calendar events</div>
</div>
</div>
<div class="col-md-6">
<div class="form-check">
<input asp-for="CanViewCalendar" class="form-check-input permission-checkbox" />
<label asp-for="CanViewCalendar" class="form-check-label">Can View Calendar</label>
<div class="form-text text-muted small">View the oven scheduler and job calendar (read-only, no editing)</div>
</div>
</div>
<div class="col-md-6">
<div class="form-check">
<input asp-for="CanManageProducts" class="form-check-input permission-checkbox" />
<label asp-for="CanManageProducts" class="form-check-label">Can Manage Products</label>
<div class="form-text text-muted small">Add and edit catalog items, service pricing, and pricing tier configurations</div>
</div>
</div>
<div class="col-md-6">
<div class="form-check">
<input asp-for="CanViewProducts" class="form-check-input permission-checkbox" />
<label asp-for="CanViewProducts" class="form-check-label">Can View Products</label>
<div class="form-text text-muted small">Browse the service catalog and inventory items (read-only, no editing)</div>
</div>
</div>
<div class="col-md-6">
<div class="form-check">
<input asp-for="CanManageEquipment" class="form-check-input permission-checkbox" />
<label asp-for="CanManageEquipment" class="form-check-label">Can Manage Equipment</label>
<div class="form-text text-muted small">Add and update equipment records, track status changes and operating costs</div>
</div>
</div>
<div class="col-md-6">
<div class="form-check">
<input asp-for="CanManageVendors" class="form-check-input permission-checkbox" />
<label asp-for="CanManageVendors" class="form-check-label">Can Manage Vendors</label>
<div class="form-text text-muted small">Add and edit vendor/supplier records, payment terms, and contact information</div>
</div>
</div>
<div class="col-md-6">
<div class="form-check">
<input asp-for="CanManageMaintenance" class="form-check-input permission-checkbox" />
<label asp-for="CanManageMaintenance" class="form-check-label">Can Manage Maintenance</label>
<div class="form-text text-muted small">Schedule and record equipment maintenance tasks, assign technicians, log parts used</div>
</div>
</div>
<div class="col-md-6">
<div class="form-check">
<input asp-for="CanManageInvoices" class="form-check-input permission-checkbox" />
<label asp-for="CanManageInvoices" class="form-check-label">Can Manage Invoices</label>
<div class="form-text text-muted small">Create invoices, record payments, send to customers, issue voids and write-offs</div>
</div>
</div>
<div class="col-md-6">
<div class="form-check">
<input asp-for="CanViewReports" class="form-check-input permission-checkbox" />
<label asp-for="CanViewReports" class="form-check-label">Can View Reports</label>
<div class="form-text text-muted small">Access financial and operational reports, analytics dashboards, and data exports</div>
</div>
</div>
<div class="col-md-6">
<div class="form-check">
<input asp-for="CanManageBills" class="form-check-input permission-checkbox" />
<label asp-for="CanManageBills" class="form-check-label">Can Manage Bills &amp; AP</label>
<div class="form-text text-muted small">Enter and pay vendor bills, manage purchase orders and accounts payable</div>
</div>
</div>
<div class="col-md-6">
@@ -237,32 +252,33 @@
const permissionCheckboxes = document.querySelectorAll('.permission-checkbox');
const adminAlert = document.getElementById('companyAdminAlert');
const accountantDefaults = ['CanManageInvoices', 'CanViewReports', 'CanManageVendors', 'CanManageBills', 'CanManageAccounting'];
const roleDefaults = {
'Viewer': ['CanViewCalendar', 'CanViewProducts'],
'Worker': ['CanManageJobs', 'CanViewCalendar', 'CanViewProducts'],
'Accountant': ['CanManageInvoices', 'CanViewReports', 'CanManageVendors', 'CanManageBills', 'CanManageAccounting'],
'Manager': ['CanManageJobs', 'CanManageInventory', 'CanManageCustomers', 'CanCreateQuotes', 'CanApproveQuotes',
'CanManageCalendar', 'CanViewCalendar', 'CanManageProducts', 'CanViewProducts',
'CanManageEquipment', 'CanManageVendors', 'CanManageMaintenance', 'CanManageInvoices',
'CanViewReports', 'CanManageBills']
};
function updatePermissionState() {
const role = roleSelect.value;
const isCompanyAdmin = role === 'CompanyAdmin';
const isAccountant = role === 'Accountant';
adminAlert.style.display = isCompanyAdmin ? 'block' : 'none';
const defaults = roleDefaults[role] || [];
permissionCheckboxes.forEach(checkbox => {
if (isCompanyAdmin) {
checkbox.checked = true;
checkbox.disabled = true;
} else {
checkbox.disabled = false;
if (isAccountant) {
checkbox.checked = accountantDefaults.includes(checkbox.id);
}
checkbox.checked = defaults.includes(checkbox.id);
}
});
}
// Run on page load
updatePermissionState();
// Run when role changes
roleSelect.addEventListener('change', updatePermissionState);
});
</script>
@@ -136,90 +136,105 @@
<div class="form-check">
<input asp-for="CanManageJobs" class="form-check-input permission-checkbox" />
<label asp-for="CanManageJobs" class="form-check-label">Can Manage Jobs</label>
<div class="form-text text-muted small">Create, edit, and update job status; manage job items, worker assignments, and time entries</div>
</div>
</div>
<div class="col-md-6">
<div class="form-check">
<input asp-for="CanManageInventory" class="form-check-input permission-checkbox" />
<label asp-for="CanManageInventory" class="form-check-label">Can Manage Inventory</label>
<div class="form-text text-muted small">Add and adjust powder stock, record transactions, manage reorder levels</div>
</div>
</div>
<div class="col-md-6">
<div class="form-check">
<input asp-for="CanManageCustomers" class="form-check-input permission-checkbox" />
<label asp-for="CanManageCustomers" class="form-check-label">Can Manage Customers</label>
<div class="form-text text-muted small">Create and edit customer records, pricing tiers, tax exemption, and credit limits</div>
</div>
</div>
<div class="col-md-6">
<div class="form-check">
<input asp-for="CanCreateQuotes" class="form-check-input permission-checkbox" />
<label asp-for="CanCreateQuotes" class="form-check-label">Can Create Quotes</label>
<div class="form-text text-muted small">Build quotes with line items and AI photo quoting; convert accepted quotes to jobs</div>
</div>
</div>
<div class="col-md-6">
<div class="form-check">
<input asp-for="CanApproveQuotes" class="form-check-input permission-checkbox" />
<label asp-for="CanApproveQuotes" class="form-check-label">Can Approve Quotes</label>
<div class="form-text text-muted small">Accept or reject submitted quotes on behalf of the company</div>
</div>
</div>
<div class="col-md-6">
<div class="form-check">
<input asp-for="CanManageCalendar" class="form-check-input permission-checkbox" />
<label asp-for="CanManageCalendar" class="form-check-label">Can Manage Calendar</label>
<div class="form-text text-muted small">Create, edit, and delete oven schedule batches and calendar events</div>
</div>
</div>
<div class="col-md-6">
<div class="form-check">
<input asp-for="CanViewCalendar" class="form-check-input permission-checkbox" />
<label asp-for="CanViewCalendar" class="form-check-label">Can View Calendar</label>
<div class="form-text text-muted small">View the oven scheduler and job calendar (read-only, no editing)</div>
</div>
</div>
<div class="col-md-6">
<div class="form-check">
<input asp-for="CanManageProducts" class="form-check-input permission-checkbox" />
<label asp-for="CanManageProducts" class="form-check-label">Can Manage Products</label>
<div class="form-text text-muted small">Add and edit catalog items, service pricing, and pricing tier configurations</div>
</div>
</div>
<div class="col-md-6">
<div class="form-check">
<input asp-for="CanViewProducts" class="form-check-input permission-checkbox" />
<label asp-for="CanViewProducts" class="form-check-label">Can View Products</label>
<div class="form-text text-muted small">Browse the service catalog and inventory items (read-only, no editing)</div>
</div>
</div>
<div class="col-md-6">
<div class="form-check">
<input asp-for="CanManageEquipment" class="form-check-input permission-checkbox" />
<label asp-for="CanManageEquipment" class="form-check-label">Can Manage Equipment</label>
<div class="form-text text-muted small">Add and update equipment records, track status changes and operating costs</div>
</div>
</div>
<div class="col-md-6">
<div class="form-check">
<input asp-for="CanManageVendors" class="form-check-input permission-checkbox" />
<label asp-for="CanManageVendors" class="form-check-label">Can Manage Vendors</label>
<div class="form-text text-muted small">Add and edit vendor/supplier records, payment terms, and contact information</div>
</div>
</div>
<div class="col-md-6">
<div class="form-check">
<input asp-for="CanManageMaintenance" class="form-check-input permission-checkbox" />
<label asp-for="CanManageMaintenance" class="form-check-label">Can Manage Maintenance</label>
<div class="form-text text-muted small">Schedule and record equipment maintenance tasks, assign technicians, log parts used</div>
</div>
</div>
<div class="col-md-6">
<div class="form-check">
<input asp-for="CanManageInvoices" class="form-check-input permission-checkbox" />
<label asp-for="CanManageInvoices" class="form-check-label">Can Manage Invoices</label>
<div class="form-text text-muted small">Create invoices, record payments, send to customers, issue voids and write-offs</div>
</div>
</div>
<div class="col-md-6">
<div class="form-check">
<input asp-for="CanViewReports" class="form-check-input permission-checkbox" />
<label asp-for="CanViewReports" class="form-check-label">Can View Reports</label>
<div class="form-text text-muted small">Access financial and operational reports, analytics dashboards, and data exports</div>
</div>
</div>
<div class="col-md-6">
<div class="form-check">
<input asp-for="CanManageBills" class="form-check-input permission-checkbox" />
<label asp-for="CanManageBills" class="form-check-label">Can Manage Bills &amp; AP</label>
<div class="form-text text-muted small">Enter and pay vendor bills, manage purchase orders and accounts payable</div>
</div>
</div>
<div class="col-md-6">
@@ -263,39 +278,45 @@
const adminAlert = document.getElementById('companyAdminAlert');
const isSuperAdmin = @((ViewBag.IsSuperAdmin as bool? ?? false) ? "true" : "false");
const accountantDefaults = ['CanManageInvoices', 'CanViewReports', 'CanManageVendors', 'CanManageBills', 'CanManageAccounting'];
const roleDefaults = {
'Viewer': ['CanViewCalendar', 'CanViewProducts'],
'Worker': ['CanManageJobs', 'CanViewCalendar', 'CanViewProducts'],
'Accountant': ['CanManageInvoices', 'CanViewReports', 'CanManageVendors', 'CanManageBills', 'CanManageAccounting'],
'Manager': ['CanManageJobs', 'CanManageInventory', 'CanManageCustomers', 'CanCreateQuotes', 'CanApproveQuotes',
'CanManageCalendar', 'CanViewCalendar', 'CanManageProducts', 'CanViewProducts',
'CanManageEquipment', 'CanManageVendors', 'CanManageMaintenance', 'CanManageInvoices',
'CanViewReports', 'CanManageBills']
};
function updatePermissionState() {
// On page load: only lock CompanyAdmin; preserve saved permission values for other roles.
function initPermissionLock() {
if (isSuperAdmin) return;
const isCompanyAdmin = roleSelect.value === 'CompanyAdmin';
adminAlert.style.display = isCompanyAdmin ? 'block' : 'none';
if (isCompanyAdmin) {
permissionCheckboxes.forEach(cb => { cb.checked = true; cb.disabled = true; });
}
}
// On role change: apply role defaults so the admin gets a sensible starting point.
function applyRoleDefaults() {
const role = roleSelect.value;
const isCompanyAdmin = role === 'CompanyAdmin';
const isAccountant = role === 'Accountant';
if (isSuperAdmin) {
adminAlert.style.display = 'none';
permissionCheckboxes.forEach(checkbox => { checkbox.disabled = false; });
return;
}
adminAlert.style.display = isCompanyAdmin ? 'block' : 'none';
const defaults = roleDefaults[role] || [];
permissionCheckboxes.forEach(checkbox => {
if (isCompanyAdmin) {
checkbox.checked = true;
checkbox.disabled = true;
} else {
checkbox.disabled = false;
if (isAccountant) {
checkbox.checked = accountantDefaults.includes(checkbox.id);
}
checkbox.checked = defaults.includes(checkbox.id);
}
});
}
// Run on page load
updatePermissionState();
// Run when role changes
roleSelect.addEventListener('change', updatePermissionState);
initPermissionLock();
roleSelect.addEventListener('change', applyRoleDefaults);
});
</script>
}