Home › Journal Admin › News
News
Journal-scoped news & announcements management — list, create, edit, delete, and drag-to-reorder. Legacy entry: manager.php (role 6, _action=news), dispatched into class/news.class.php's NewsManager and rendered by view/news.view.php.
| Page | Status | E2E | Enhanced | Legacy Ref | Route | Roles |
|---|---|---|---|---|---|---|
| News & Announcements List | Full | Yes | filters | manager.php?_action=news | /manager?_action=news | Journal Admin (role 6, manager.php) or Management Assistant (role 16, mng_assist.php) — see gating notes |
| Add / Edit News | Full | Yes | validation | manager.php?_action=news&edt=0[&_ts=<news_code>] | /manager?_action=news&edt=0 | Journal Admin (role 6, manager.php) or Management Assistant (role 16, mng_assist.php) — see gating notes |
Features
| Feature | Status | E2E | Description |
|---|---|---|---|
| Admin can view the journal-scoped News & Announcements list (title, thumbnail, status, last-updated) in display order | Full | Yes | List shows all items regardless of status, ordered by news_order with newest-first fallback, matching legacy ordering. |
| Admin can live-search news by title and filter by Enabled/Disabled status, with a no-results state and Clear Filters | New | Yes | Search is debounced 500ms and combined with the status filter; clearing filters resets both. |
| News list paginates via infinite scroll instead of loading every row | New | — | Pages of 20 items load as the admin scrolls, with a loading-more indicator. |
| Admin can create a news item with publish date, status, image, and primary-language title/body | Full | Yes | Add is a dedicated page with Clear Form reset; success shows a toast and returns to the list. |
| Admin can edit an existing news item, both from a dedicated Edit page and inline via an Edit dialog on the list row | Full | Yes | Edit pre-populates all fields including image preview; legacy had only the single combined form. |
| Second-language title and body fields are offered only when the journal has a secondary locale, with per-locale text direction | Full | Yes | Bilingual journals must provide both titles (Zod bilingual required-title validation); RTL locales render RTL inputs. |
| Admin can attach an image to a news item, see a preview, and remove it; replaced/removed image files are deleted from storage | Full | Yes | Legacy limited uploads to gif/jpg/png ≤ ~500KB and deleted the old file on replace; image removal is now part of the form instead of a separate AJAX call. |
| Admin can drag-to-reorder news items and the new order is persisted and drives display order | Full | Yes | Reorder is auto-saved on each drop (move-after semantics) instead of a bulk rewrite of the whole list on Save. |
| Admin can delete a news item after an explicit confirmation, and its image file is removed from storage | Full | Yes | Confirmation is a styled dialog naming the item, with toast feedback, replacing the browser confirm. |
| Admin can set a news item's publish date and Enabled/Disabled status | Full | Yes | Disabled items stay visible in the admin list but are hidden from the public site. |
| News create/update/delete writes a contact action audit record (legacy cn_action_type 41/42/43) | Full | — | Audit records the acting user, action type, news code and title, as in legacy. |
| Duplicate news titles within the same journal are rejected on save | Pending | — | Legacy saveNews (apps/legacy/js/class/news.class.php:126-142) re-rendered the form with MNG_DUPLICATE_NEWS_ERR on a duplicate title; no duplicate/conflict check was found in apps/api/src/news/management.news.service.ts or the web form. |
| Management Assistant (role 16) can access the news list and add/edit screens via mng_assist.php | Pending | — | Web pages gate on JOURNAL_ADMIN only; the legacy role-16 path (with its documented broken-save bug — forms post to manager.php because fileName is never overridden) is cataloged under Publishing Workflow › Management Assistant, not ported here. |
| Published (Enabled) news items feed the journal's public-facing news list and detail pages | Full | — | Admin-managed ordering and Enabled status determine what the public site shows; the public pages themselves belong to the public-content segment. |
Page gate is not journal-scoped, even though the data is.
Per
apps/legacy/spec/admin/content-management/news-list.md, both rows above require only a row in ju_contact_role with _role = 6 for any journal — the check does not restrict to the journal the admin is currently in. The list/form data itself is still filtered to ju_news.journal_code = current journal by a separate rule, so access-scope and data-scope are enforced independently.A second, fully tenant-scoped access path exists via Management Assistant (role 16).
mng_assist.php gates on a ju_contact_role row with _role = 16 (the same tenant SESSION_NAME_ID session as manager.php; journalCode is never overridden to 0), and its dispatch (case 'news') calls NewsManager::manageNewsActions with no restriction narrower than manager.php's. This path is already cataloged at Publishing Workflow › Management Assistant ("News & Announcements List" / "Add / Edit News" rows) — including a documented broken-save bug there: NewsManager's fileName property defaults to "manager" and mng_assist.php's dispatch never overrides it (unlike several sibling cases in the same switch), so both screens' forms silently post to manager.php and fail to save for staff who hold role 16 but not role 6.Reorder and image-delete are AJAX-only, not separate screens.
request/manager.ajax.php's reOrderNews and deleteImage handlers (NewsManager::reOrderNews / ::deleteImage) have no page of their own — they mutate ju_news and the list re-renders in place — so they aren't counted as rows. Per the same spec's Inconsistency States, these AJAX endpoints accept _role IN (4, 6, 16), broader than the page gate's _role = 6, so a role-4/16 holder can reorder news or delete a news image without being able to reach either row above.Platform-wide News (journal_code = 0) is intentionally not claimed here.
mainm/adm.php and mainn/adm.php (and main/adm.php) also expose _action=news, instantiating the same NewsManager with journalCode = 0 under the platform Super Admin session ($_SESSION['juAdmUser__'], via class/adm.class.php's JournalAdmin) rather than the tenant admin session this module's rows use. That variant is not tenant-scoped, so it doesn't fit this segment's "one journal's staff" remit; it is catalogued under Super Admin › Content Management, which claims the platform-scope _action=news (and _action=ads) screens as its News & Announcements / Ads rows.Also independently cataloged, unfolded, on Publishing Workflow › Manager.
manager.php?_action=news is the identical NewsManager screen that Publishing Workflow › Manager also lists (folded into a single "News & Announcements" row alongside ~15 sibling _action screens, per that page's own granularity note). It is catalogued here as its own module page instead because News is one of this segment's six dedicated Journal Admin modules; no row here should be re-added there or vice versa — see also that page for the shared-router framing.