Home › Super Admin › Content Management
Content Management
Platform-scope content screens (journal_code = 0) confirmed reachable in this segment: Related Links (the only reachable one of this module's original six suspected anchors — pages, faq, glossary, link, section, type), plus News and Ads — both documented in apps/legacy/spec/admin/content-management/, the spec directory matching this module's own name (unlike Related Links, whose spec sits under apps/legacy/spec/admin/site-structure/ instead). Entry files: main/adm.php (primary Super Admin dispatch), mainm/adm.php and mainn/adm.php (super-admin dashboards), backed by class/link.class.php, class/news.class.php and class/ads.class.php, rendered by view/link.view.php, view/news.view.php and view/ads.view.php.
| Page | Status | E2E | Enhanced | Legacy Ref | Route | Roles |
|---|---|---|---|---|---|---|
| Manage Related Links | Pending | — | — | mainm/adm.php?_action=link | /adm?_action=link | Super Admin — the report-only restriction (contact code 3) applies only via mainm/adm.php: a hard exit() blocks any _action outside ["","report","arst_report","act_report","pass"] (lines 63–70), and the menu entry is separately omitted for it (line 445). mainn/adm.php's case "link" block is byte-identical (lines 313–319), but that file has no report_only/contact-code-3 check anywhere — its menu entry (line 438) and the action itself are reachable unrestricted for any super-admin session that reaches mainn's dispatch. |
| News & Announcements List | Full | Yes | drag-reorder | main/adm.php?_action=news | /adm?_action=news | Super Admin — unrestricted via main/adm.php and mainn/adm.php (neither has a report-only gate); mainm/adm.php alone applies the same report-only restriction as Manage Related Links — contact code 3 ($_SESSION['juAdmUser__'] == 3) is blocked by the hard exit() gate at lines 68-70 (any _action outside ["","report","arst_report","act_report","pass"]), and the MENU_NEWS quick-link is separately omitted for it (inside the same report_only==0 block, line 458) |
| Add / Edit News | Full | Yes | validation | main/adm.php?_action=news&edt=0[&_ts=<news_code>] | /adm?_action=news&edt=0 | Super Admin — unrestricted via main/adm.php and mainn/adm.php; mainm/adm.php alone applies the same report-only restriction as Manage Related Links (contact code 3 blocked by the exit() gate, lines 68-70) |
| Ads List | Full | Yes | drag-reorder | main/adm.php?_action=ads | /adm?_action=ads | Super Admin — unrestricted via main/adm.php and mainn/adm.php; mainm/adm.php alone applies the same report-only restriction as Manage Related Links — contact code 3 blocked by the exit() gate at lines 68-70, and the MNG_ADS quick-link is separately omitted for it (same report_only==0 block, line 460) |
| Ads — Add / Edit | Full | Yes | image-upload | main/adm.php?_action=ads&_ts=0 | /adm?_action=ads&_ts=0 | Super Admin — unrestricted via main/adm.php and mainn/adm.php; mainm/adm.php alone applies the same report-only restriction as Manage Related Links (contact code 3 blocked by the exit() gate, lines 68-70) |
Features
| Feature | Status | E2E | Description |
|---|---|---|---|
| Admin can view the platform-wide (journalCode=0) news list | Full | Yes | List shows title, publish/modify date and enabled/disabled status for every platform-scope news item, mirroring legacy _action=news. |
| Admin can live-search, filter by status, and infinitely paginate the news list | New | Yes | No legacy predecessor; added so the platform news list stays usable at scale. |
| Admin can drag-to-reorder news and the order persists | Full | Partial | Legacy required pressing an explicit 'Save' order button after sorting; the port persists each drop immediately. |
| Admin can create a news item (title, secondary-language title, rich-text body, image, publish date, status) | Full | Yes | Add is available both as a standalone page and as an in-place dialog opened from the list. |
| Admin can edit an existing news item | Full | — | Edit pre-loads the record via managementNewsControllerFindById and reuses the same validated form. |
| Admin can delete a news item with confirmation | Full | — | Confirmation moves from a browser confirm() to a proper dialog; the stored image is cleaned up server-side as in legacy. |
| Admin can attach, replace, or remove a news image | Full | — | Port adds live preview and an explicit clear control instead of legacy's separate delete-image link. |
| Duplicate news titles are rejected on save | Pending | — | Legacy saveNews (class/news.class.php:126-142) re-renders the form with MNG_DUPLICATE_NEWS_ERR on a same-title row; the ported API (apps/api/src/news/management.news.service.ts createNews) performs no uniqueness check — no counterpart found. |
| News and ads create/update/delete actions are recorded in the contact action history log | Full | — | Audit side-effect invisible at page granularity; preserved in the ported backend. |
| Admin can view the platform-wide ads list including per-ad click counts | Full | Yes | Legacy hides ads with ads_position = -1; the ported API scopes listing by a position filter (apps/api/src/ads/management.ads.service.ts positionFilter). |
| Admin can live-search, filter by status, and infinitely paginate the ads list | New | Yes | No legacy predecessor for search/filter/pagination on the ads list. |
| Admin can drag-to-reorder ads and the order persists | Full | — | Same per-drop persistence upgrade as news; no dedicated ads reorder e2e spec exists. |
| Admin can create or edit an ad (title, secondary-language title/note, link URL, banner image, status) | Full | Yes | In apps/web this is an in-place dialog with no standalone route; the cited e2e specs drive a standalone /ads/add route that exists only in apps/js. |
| Admin can delete an ad with confirmation | Full | — | Replaces legacy confirm() delete link on the list row. |
| Ad link URLs without a scheme are silently auto-prefixed with http:// | Dropped | — | Deliberate UX change: invalid URLs now surface an inline validation error instead of being silently rewritten. |
| Duplicate ad titles are rejected on save | Pending | — | Legacy saveAds (class/ads.class.php:138-154) blocks a second ad with the same title (including the '||' bilingual-joined variant); no uniqueness check found in the ported ads service or Zod schema. |
| Super Admin can manage platform-scope (journalCode=0) related links — add, edit with pre-filled form, delete | Pending | — | Legacy LinkManager::manageLinkActions via mainm/mainn adm.php?_action=link: combined list+form screen with bilingual link title, URL auto-prefixed http:// when scheme-less, and duplicate-title rejection; the only apps/web related-links surface is the tenant public listing, and the generated management-related-links Orval client has no consumer. |
| Super Admin can reorder platform-scope related links | Pending | — | Legacy LinkManager::reOrderLinks (class/link.class.php:210) persists a comma-separated new order from the sortable list; no apps/web counterpart. |
| Related-links changes are recorded in the contact action history log | Pending | — | Legacy saveCnActionHistory action types 32 (create), 33 (update), 34 (delete) in class/link.class.php:156-197; ships with whatever ports the Pending related-links screen. |
| Report-only super-admin accounts (contact code 3) are blocked from all content-management screens on the mainm dashboard | Pending | — | mainm/adm.php hard exit() gate (lines 63-70) restricts contact-code-3 sessions to report actions and hides the News/Ads/Links menu entries, while mainn/adm.php has no such gate — the port must decide which behavior is canonical. |
Only one of the six suggested anchors is real at this segment/scope.
class/link.class.php (LinkManager) is exhaustively confirmed as the sole one of the brief's six anchors (pages, faq, glossary, link, section, type) ever instantiated with journalCode = 0 anywhere in the codebase — done explicitly in mainm/adm.php and mainn/adm.php's _action=link case. apps/legacy/spec/admin/site-structure/related-links.md confirms this directly: "The super-admin panel also exposes this feature with journal_code = 0, managing links that belong to no specific journal." main/adm.php (this segment's primary dispatch) has no case "link" at all, so the row above is sourced from mainm/mainn — whose case "link" block is byte-identical (mainm/adm.php:326–332 == mainn/adm.php:313–319), though the report-only/contact-code-3 gating around it is not (see Roles cell) — and its Legacy Ref is qualified accordingly per this segment's action-name-collision guidance — the same _action=link name also exists in manager.php/mng_assist.php (Publishing Workflow's tenant-scoped Manager / Management Assistant roles), where it manages a given journal's own related links instead.Static pages, FAQ, glossary, and sections/types stay out — verified as tenant-only, not assumed.
class/pages.class.php (PageManager) is instantiated only from manager.php:590 — mng_assist.php never references it at all, so Management Assistant has no Pages access at all. class/faq.class.php (FAQManager) is instantiated from manager.php:476, mng_assist.php:337, and request/manager.ajax.php:172 (reorder AJAX). class/glossary.class.php (GlossaryManager) is instantiated from manager.php:481 and mng_assist.php:342. class/section.class.php (SectionManager) is instantiated from manager.php:456 and request/manager.ajax.php:140 (reorder AJAX) — not mng_assist.php. None of the four is ever constructed with journalCode overridden to 0. class/type.class.php (TypeManager) likewise appears only in manager.php, mng_assist.php, the manager AJAX handlers, and the journal-setup-wizard checklist (class/functions.php) — all current-journal-scoped. None of the five is require'd from main/adm.php, mainm/adm.php, or mainn/adm.php. Per this design's row-identification method these are journal-configuration screens with no platform-scope counterpart, so they are correctly out of scope for this module (they already sit under the Publishing Workflow segment's open-flagged manager / management-assistant modules).Platform-wide News and Ads are claimed here, resolving the earlier deferral.
main/adm.php (lines 287–305 news, 306–323 ads), mainm/adm.php (312–318 / 319–325), and mainn/adm.php (299–305 / 306–312) all expose _action=news and _action=ads against NewsManager/AdsManager with journalCode = 0 — the identical platform-scope idiom as Manage Related Links above; the mainm and mainn case blocks are byte-identical to each other. apps/legacy/spec's own directory grouping places news-list.md, news-add-edit.md, ads-list.md, and ads-add-edit.md in apps/legacy/spec/admin/content-management/ — the same spec category as this module's own name (apps/legacy/spec/admin/site-structure/ is a separate category, which is why Related Links is documented there instead). No other Super Admin module claims _action=news or _action=ads anywhere in the segment (checked every sibling module page plus a full-inventory grep for _action=news/_action=ads and for the words News/Ads), so the rows above are their home. portal/news.html independently cross-references this exact _action=news screen as the intended admin-authoring home for platform news, corroborating the claim.