HomeSuper 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

FeatureStatusE2EDescription
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.