Home › Super Admin › Publishers
Publishers
Publisher-entity CRUD for platform staff — traced from the suspected anchors class/publisher.class.php / view/publisher.view.php and exhaustively from main/adm.php's JournalAdmin dispatch (class/adm.class.php); no such screen exists in the legacy codebase (see notes).
| Page | Status | E2E | Enhanced | Legacy Ref | Route | Roles |
|---|---|---|---|---|---|---|
| Publishers / Organizations | New | Yes | — | — | /en/super-admin/publishers | Super Admin |
Features
| Feature | Status | E2E | Description |
|---|---|---|---|
| Super Admin can browse publishers as a three-level hierarchical tree (Organization > Sub-organization > Division) with per-node expand/collapse and a global Collapse Layers action | New | Yes | Each row shows logo/initials thumbnail, level badge, location line, and a sub-unit count (sub-organizations / divisions). |
| Admin can live-search organizations across all tree levels with debounced input, match highlighting, and server-reported matched-node expansion | New | Yes | Search hits are highlighted in name and location text; clearing the box resets the list immediately without waiting for the debounce. |
| Admin can sort the list by created date, modified date, journal count, or title, and toggle ascending/descending order | New | Yes | Sort field and order live in the URL query string; any change resets pagination to page 1. |
| List loads incrementally via infinite scroll with a scroll sentinel, loading/scroll-for-more footer, and duplicate-safe page merging | New | Yes | Server renders page 1 (limit 20); further pages append client-side and matched search codes are merged across pages. |
| Admin sees the total organization count, locale-formatted, next to the sort controls | New | Yes | Count reflects the server pagination total for the current search, not just loaded rows. |
| Admin can add a root organization via a slide-in drawer form (EN/AR names, type, country, city, description, logo, collapsible additional info: website, contact person, role, email, phone) | New | Yes | Add is reachable from the header button, per-row add buttons, and the empty-state CTA. |
| Admin can add sub-organizations and divisions under a node, with the child form defaulting its country from the parent chain ('Use parent country') | New | Yes | Divisions (depth 2) are leaves — they expose no further add action. |
| After saving a new node, admin can chain-create: 'save and add child' opens the child-level add form pre-parented, while plain save keeps the drawer open reset for sequential same-level creation | New | Yes | Supports rapidly entering an organization together with its sub-organizations and divisions in one sitting. |
| Form input is validated client-side with Zod before submission (English name required, email/URL format checks, country required only when creating a root organization) | New | Yes | Field-level FormMessage errors appear inline in the drawer; invalid submissions never hit the API. |
| Admin can edit any node in the same drawer, with the tree patched optimistically on success (preserving existing children and sub-unit counts) and a success toast | New | Yes | Edit is offered via a per-row more-options menu (non-leaf) or inline pencil button (leaf divisions). |
| Admin can delete a node behind a confirmation dialog; deletion is blocked while the node still has children, with guidance to delete bottom-up first | New | Yes | Delete is optimistic — the node is removed from the tree immediately and rolled back with an error toast if the API call fails. |
| Admin sees an illustrated empty state with an inline 'add organization' call to action when no organizations exist | New | — | The empty-state CTA opens the same root-organization add drawer as the header button. |
| Search, sort, and page state live in the URL query string, so filtered views are shareable and survive reload | New | Yes | Initial render is server-side from the URL, so deep links show the filtered result without a client flash. |
| Page is localized (next-intl) with RTL-aware menu alignment and locale-formatted numbers, and the tree is accessible (tree/treeitem roles, aria-level/expanded/selected, Enter/Space row activation) | New | Yes | All strings come from the SuperAdminPublishersPage translation namespace; aria snapshots pin the accessible structure. |
Zero rows: no Super Admin screen manages a distinct "Publisher" entity.
The module's suspected anchors,
class/publisher.class.php and view/publisher.view.php, turned out on tracing to belong entirely to the Publishing Workflow segment's publisher role (ROLE_5, publisher.php entry point) — manuscript-to-article production (volumes/issues/articles/DOI/citations) for that role's own users, already catalogued under publishing-workflow/publisher.html. view/publisher.view.php is never require'd from main/adm.php or class/adm.class.php for any admin-role action; class/publisher.class.php is required once, inside JournalAdmin::assignDOI() (class/adm.class.php:1686), invoked by main/adm.php's own assign_doi action (main/adm.php:123-125) — but only as an internal utility for a batch DOI-registration loop (calling PublisherManager::prepareArticlesForDOI() per journal, class/publisher.class.php:3543) that renders no HTML screen of its own beyond terse per-article progress lines echoed into the standard admin page chrome, not a Publisher management UI (see super-admin/integrations.html's "pure handler, no rendered screen" note for the same action). A full trace of main/adm.php's dispatch switch (login, newj, main, preprint, roles, pass, register, report, py_report, revTrack, news, ads, editj, journal, assign_doi, default) and of every public method on class/adm.class.php's JournalAdmin found no publisher/organization action or menu link.The one near-match in the codebase is out of segment and non-functional.
class/organization.class.php (OrganizationManager) is the only publisher/organization-flavored admin scaffold in the repo, but it is wired at a single call site, mainm/adm.php?_action=orgs — the tenant-admin dispatch (Journal Admin segment), not main/adm.php; it is absent from both main/adm.php and mainn/adm.php. Its menu link is gated by $has_sub_org, hardcoded to 0 in mainm/adm.php (the dynamic setting lookup is commented out), and even a direct hit of the URL only reaches OrganizationManager::manageActions(), which does nothing but print_r($_PARAMS). The class's getOrganizationList/addEditOrganization/saveOrganization/deleteOrganization methods are unfinished stubs (empty query-less bodies, unlabeled/unnamed form fields) and are never called from anywhere in the codebase — so even setting segment aside, none of it renders a real screen.Where a journal's "publisher" name actually lives.
The only publisher-adjacent data in the legacy schema is
ow_note ("Owner Note" / publisher name), a free-text per-journal setting edited as one field inside the Journal add/edit form (view/add.journal.view.php, label ADDJ_OW_NOTE) and surfaced read-only in exports/citations/metadata. That field belongs to the sibling Journals module's Create/Update Journal rows, not to a standalone Publisher entity, so it is not duplicated here.