diff --git a/CHANGELOG.md b/CHANGELOG.md
index 94ddaef..8f765e0 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -21,6 +21,8 @@ Format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/); version
### Changed
+- panel: the user create/edit form hides **Assigned domains** when the role is
+ global administrator, since that role manages every domain anyway.
- panel: **Settings** shows panel credentials and DMARC aggregate reports side
by side for global administrators (the same `.split` layout as a delivery's
message and history). Domain-scoped users keep the single narrow card.
diff --git a/internal/web/handlers/handlers_users.go b/internal/web/handlers/handlers_users.go
index 11af923..c1a2338 100644
--- a/internal/web/handlers/handlers_users.go
+++ b/internal/web/handlers/handlers_users.go
@@ -128,6 +128,7 @@ func (h *Handlers) renderUserForm(w http.ResponseWriter, r *http.Request, status
data["Error"] = view.FormErr
data["FormUsername"] = view.FormUsername
data["FormRole"] = view.FormRole
+ data["GlobalRole"] = store.RoleGlobal
data["FormDomains"] = view.FormDomains
data["FormPassword"] = view.FormPassword
data["IsEdit"] = userID != 0
diff --git a/internal/web/view/static/panel.js b/internal/web/view/static/panel.js
index 4b9fe12..146c688 100644
--- a/internal/web/view/static/panel.js
+++ b/internal/web/view/static/panel.js
@@ -72,6 +72,28 @@
});
}
+ // --- Domain pick shown only for domain administrators ------------------
+ // Global administrators manage every domain, so the assignment checkboxes
+ // are irrelevant for that role. The toggle runs on load too, because the
+ // edit form of an existing global user should not flash the fieldset.
+ function syncDomainPickField(select) {
+ var form = select.closest("form");
+ var field = form && form.querySelector("[data-domain-pick]");
+ if (!field) {
+ return;
+ }
+ field.hidden = select.value === select.dataset.globalRole;
+ }
+
+ function initDomainPickFields(root) {
+ root.querySelectorAll("select[data-global-role]").forEach(function (select) {
+ syncDomainPickField(select);
+ select.addEventListener("change", function () {
+ syncDomainPickField(select);
+ });
+ });
+ }
+
// --- Encryption password fields shown only when asked for --------------
// The backup, export and import forms carry an optional password block. It
// is hidden until the checkbox next to it is ticked, and cleared when it is
@@ -199,6 +221,7 @@
document.addEventListener("DOMContentLoaded", function () {
initAddressFields(document);
+ initDomainPickFields(document);
initEncryptFields(document);
initImportPasswordField(document);
initSectionIndex();
diff --git a/internal/web/view/templates/user_form.html b/internal/web/view/templates/user_form.html
index 864a859..1918ca9 100644
--- a/internal/web/view/templates/user_form.html
+++ b/internal/web/view/templates/user_form.html
@@ -14,12 +14,12 @@
-