Landing
The root public site's welcome screen and general-purpose chrome — the un-claimed portion of main/index.php's default view (shared with the Journals and Articles modules' own rows), its admin-configurable ?menu= static-page branch, the standalone main/contact.us.php page, and the main/ directory's cross-journal role-portal login gateway and hub (main/login.php, main/pm.php) — otherwise-unclaimed main/ entry points, catalogued here for the same reason.
| Page | Status | E2E | Enhanced | Legacy Ref | Route | Roles |
|---|---|---|---|---|---|---|
| Portal Home | Full | Yes | streaming | main/index.php | / | Public |
| Static Menu Page | Pending | — | — | main/index.php?menu=... | /?menu=... | Public |
| Contact Us | Pending | — | — | main/contact.us.php | /contact.us | Public |
| Role-Portal Login Gateway | Pending | — | — | main/login.php | /login | Public (login form); success gated to roles 5, 7, 8, 11, 13, 17 via adminLoginAction (adm.class.php:126) |
| Role-Portal Hub | Pending | — | — | main/pm.php | /pm | Signed in via the gateway above; hub renders a link per held role among 5 (Publisher), 7 (Page Designer), 8 (Language Editor), 11 (Production Manager) |
| Production Manager Queue | Pending | — | — | main/pm.php?_action=pm | /pm?_action=pm[&st=...] | Production Manager (role 11) |
| Production Manager Report | Pending | — | — | main/pm.php?_action=pm&st=report | /pm?_action=pm&st=report[&rep_role=1|2&rep_st=0|1|2&group_editor=0|1&search] | Production Manager (role 11) |
| Language Editor Queue | Pending | — | — | main/pm.php?_action=tedt | /pm?_action=tedt[&st=...] | Language Editor (role 8) |
| Page Designer Queue | Pending | — | — | main/pm.php?_action=pd | /pm?_action=pd[&st=...] | Page Designer (role 7) |
| Publisher View | Pending | — | — | main/pm.php?_action=pub | /pm?_action=pub | Publisher (role 5) |
| Change Password (Role Portal) | Pending | — | — | main/pm.php?_action=pass | /pm?_action=pass | Any authenticated role-portal contact |
Features
| Feature | Status | E2E | Description |
|---|---|---|---|
| Visitor sees the portal home landing page with hero and discovery sections | Full | Yes | Replaces the sparse legacy main/index.php default view; sections stream independently with skeleton fallbacks. |
| Visitor searches articles by keyword from the home page | Full | Yes | Search results themselves are catalogued under the Articles module; this is the home-page entry widget. |
| Visitor clicks popular/suggested search terms in the hero | New | Yes | Suggested-query chips accelerate first search without typing. |
| Visitor navigates the portal via header nav and footer chrome | Full | Yes | Legacy nav was partly admin-driven (menu1..menu5 slots) and session-aware (admin/editorial/logout links); new nav is a fixed designed set with auth-aware header controls. |
| Visitor switches locale on the landing page and content round-trips correctly | Full | Yes | Locale is now a URL segment rather than a server-side language include. |
| Visitor sees platform advertisements/links on the home page | Full | Yes | Legacy rendered image-or-title link list with per-language title/note split on '||'; carousel form and autoplay are new. |
| Visitor sees live platform statistics (journals/issues/articles counts, views, downloads) | Full | Yes | Adds a global-reach map with legend absent from the legacy plain count table. |
| Visitor sees platform and journal news on the home page | Full | Yes | Legacy split news into two sidebar gadgets (system vs per-journal); the port shows one designed news section. |
| Visitor browses journals by subject/category from the home page | New | Yes | Net-new discovery section for this dispatch root. |
| Visitor filters featured journals via tabs on the home page | New | Yes | Curated, filterable featured-journals strip replaces part of the flat legacy directory experience. |
| Visitor sees trending research keywords and can click through to search | New | Yes | Keyword chips deep-link into article search results. |
| Visitor sees top authors and can jump to an author's subject/articles | New | Yes | Author cards link to their subject/profile listings. |
| Visitor sees journal indexing services showcased on the home page | New | Yes | Marketing strip of indexing/abstracting services. |
| Visitor reads an about-us section on the home page | New | Yes | Fixed designed narrative section replacing the admin freeform welcome block role. |
| Admin publishes a configurable welcome/notes banner on the portal home | Pending | — | Legacy home_page_title/home_page_notes (settings journal_code=0, main/index.php:60-92, 329-342) render an admin HTML block above the search box; no apps/web public renderer exists though the settings remain writable. |
| Admin publishes up to 5 static menu pages that appear as portal nav links | Pending | — | Legacy main/header.php:96-100 renders a nav link per non-empty menuN_title; main/index.php?menu=N (index.php:210-247) shows that slot's title/body. Super-admin can still write menu1Title/menu1Cnt (apps/web/lib/actions/settings.ts) but nothing public renders them. |
| Admin controls portal chrome via settings (page_title, meta_tags, right_note, footer_note) | Pending | — | Legacy main/header.php:2-51 reads journal_code=0 settings to set the page title, injected meta tags and footer note; the redesigned public chrome is fixed and not settings-driven. |
| Visitor views a portal contact-us page with admin-editable content | Pending | — | Legacy main/contact.us.php renders the journal_code=0 'contact_us' setting; apps/web only has a per-tenant contact page ([tenant]/(public)/contact-us), none in the portal (public) group. |
| Editorial staff logs in through the cross-journal role-portal gateway | Pending | — | main/login.php forces pm=1 so JournalAdmin::adminLoginAction (class/adm.class.php:126) accepts roles 5,7,8,11,13,17, sets $_SESSION[SESSION_NAME_ID] and redirects to /pm; apps/web auth is per-tenant or super-admin only. |
| Signed-in editorial user sees a hub listing a link per held role (Publisher 5, Page Designer 7, Language Editor 8, Production Manager 11) plus change-password and logout | Pending | — | main/pm.php default branch (pm.php:267-307) queries ju_contact_role and renders one link per held role; ?logout destroys the session. No cross-journal hub exists in apps/web. |
| Production manager works a manuscript queue bucketed by status with live counts (new, sent-to/performed-by language editor, sent-to/responded page designer, galley proof, finally accepted) | Pending | — | main/pm.php?_action=pm dashboard shows per-bucket counts via PMAdmin::getSubmissionList (class/pm.class.php) mapped to manu_status 33/19/20,21/27/28/6,29/8; st=returned and st=search are reachable but unlinked. Duplicate of the canonical Publishing Workflow PM module (PMAdmin vs EditorManager). |
| Production manager generates a workload report filtered by role, state, editor grouping and search | Pending | — | main/pm.php?_action=pm&st=report → PMAdmin::getPMReportForm/getPMReportResult (class/pm.class.php:9,1538) with rep_role/rep_st/group_editor/search params; undiscoverable from the dashboard but reachable. No PM report screen in apps/web. |
| Language editor works assigned/performed manuscript queues with live counts | Pending | — | main/pm.php?_action=tedt → TechEditorManager::preAssignedManuscript (class/tech.editor.class.php) over manu_status 19 (assign) and 20,21 (assigned), scoped to the editor's journals via getPMJournals(8); AJAX actions via main/request/tech.editor.ajax.php + inc/js/tech.editor.js. |
| Page designer works assigned/performed manuscript queues with live counts | Pending | — | main/pm.php?_action=pd → PageEditorManager::preAssignedManuscript (class/page.editor.class.php) over manu_status 27/28, scoped via getPMJournals(7); AJAX via main/request/page.editor.ajax.php + inc/js/page.editor.js. |
| Publisher (role 5) views the journals/manuscripts assigned to them | Pending | — | main/pm.php?_action=pub → PMAdmin::getJournslForPublisher; distinct from the apps/web publisher-organization directory/CRUD, which is a different 'publisher' concept. |
| Role-portal user changes their own password | Pending | — | main/pm.php?_action=pass → Contact_Manager::changePasswordForm/Action (class/contacts.class.php) with journalCode=0; apps/web change-password exists only inside tenant-admin and super-admin panels, not a role portal. |
Row split with sibling "Journals" and "Articles" modules.
main/index.php's default view (no _action) is a single HTTP response containing several visually distinct panels: an optional admin-configured welcome/notes block (home_page_title/home_page_notes, settings row journal_code = 0), a quick keyword-search box that submits to ?_action=article, and the full journal-directory grid. The journal-directory panel is catalogued as the Journals module's own "Journal Directory" row, and the search box's destinations (results/author/advanced search) are catalogued under the Articles module — both of their pages explicitly cross-reference this row as "the Landing module's home screen." "Portal Home" above is what remains: the page shell, the optional welcome banner, and the search box as a widget (not its results). All three rows legitimately share the identical main/index.php legacy ref/route by design.Not routed via
class/index.class.php / view/index.view.php.The assignment brief's suggested anchors resolve elsewhere:
class/index.class.php defines IndexManager, the per-journal "indexing services" (DOAJ/Scopus-style) CRUD reached from the role-portal's manager.php — unrelated to the portal home page. main/index.php is a monolithic script with no class/view layer of its own; every branch above is an inline if/elseif in that one file."Static Menu Page" covers up to 5 admin-configured slots.
main/header.php renders a nav link for each non-empty menu1_title…menu5_title setting (journal_code = 0); clicking one hits main/index.php?menu=N, which swaps the main panel for that slot's title/body pair (menuN_title/menuN_cnt). All five slots render through the same code path and are treated as one row.Excluded
main/ files.main/adm.php (Super Admin) is a separate segment's entry point, out of scope here. main/jufile.php, main/robots.txt.php, and main/sitemap.xml.php are non-HTML file/crawler outputs, not screens. main/request/*.ajax.php (editor.ajax.php, tech.editor.ajax.php, page.editor.ajax.php) are AJAX fragment handlers for the Role-Portal Hub's queues below, with no rendered screen of their own — mostly GET requests issued by inc/js/pm.js, tech.editor.js, and page.editor.js (a couple of calls, e.g. pm.js's save-action task, use POST); not POST-only as an earlier draft of this note claimed.main/login.php and main/pm.php are catalogued above, not excluded.An earlier draft of this note dismissed
main/login.php as merely an alternate path to the Super Admin login and attributed main/pm.php to the Publishing Workflow segment's Production Manager module — both wrong. main/login.php unconditionally sets $_PARAMS['pm']=1 (main/login.php:26-27), routing JournalAdmin::adminLoginForm/adminLoginAction (class/adm.class.php:33-44, 97-154) into a materially different branch than the Super Admin login: the role filter is _role IN(5,7,8,11,13,17) instead of _role = 10 (adm.class.php:126), success sets $_SESSION[SESSION_NAME_ID] instead of $_SESSION['juAdmUser__'], and it redirects to pm (main/pm.php) instead of adm. And publishing-workflow/production-manager.html's own note explicitly disclaims main/pm.php as an "old duplicate app tree" built on class/pm.class.php's PMAdmin — a different class than that module's EditorManager — so in fact no page in this inventory covers it. Both files are live under main/ (this segment's own dispatch root — the j.ekb.eg vhost in httpd-vhosts.conf confirms main/ is served, not dead code), so they are catalogued here as Landing's catch for otherwise-unclaimed main/ screens, the same treatment already given to Static Menu Page and Contact Us above.Production Manager / Language Editor / Page Designer / Publisher Queue rows are a duplicate role-portal, not the canonical Publishing Workflow screens.
main/pm.php instantiates class/pm.class.php's PMAdmin (Production Manager Queue), class/tech.editor.class.php's TechEditorManager (Language Editor Queue), and class/page.editor.class.php's PageEditorManager (Page Designer Queue) — a separate, simpler class tree than the canonical publishing-workflow/production-manager.html (root pm.php + EditorManager), language-editor.html, and page-designer.html modules, and missing several of those modules' rows (tech_au/au_tech/handled have no equivalent anywhere in class/pm.class.php — confirmed by grep, zero matches; returned (class/pm.class.php:56) and search (class/pm.class.php:81, inside PMAdmin::getSubmissionList) ARE present in the class and reachable via ?_action=pm&st=returned|search even though main/pm.php's own dashboard links to neither — same undiscoverable-but-reachable pattern as the new Production Manager Report row above (class/pm.class.php:9, 1538, for st=report). The sibling st=track branch (class/pm.class.php:13) delegates to EditorManager::showManuscriptTracking (editor.class.php:4619), which returns early with no output when no manuscript row matches the given manu code, so it is a manuscript-detail fragment rather than a standalone screen and is not added as its own row here). Each queue's own st= sub-filters (pm's new/tech_editor/tech_editor_p/page_designer/page_designer_p/galley_proof/final_accept; tedt's and pd's assign/assigned) render the same filtered-list-with-live-count pattern as the parent queue's own default view, so — consistent with this page's Static Menu Page row — they are grouped under one row per top-level branch rather than one row per filter. Roles 13 (Abstract Editor) and 17 (Supervisor Editor), though admitted by the login gateway's role filter (adm.class.php:126) and referenced inside class/pm.class.php's manuscript-action logic, have no corresponding link on the Role-Portal Hub or a dedicated queue of their own here; flagged as an open gap, not resolved in this pass.Dead/stale rewrite rules in
main/.htaccess.That file also rewrites
years.html, list_N.html, rss, and contact.us$ → ?contact, but main/index.php has no code path reading $_GET['years'] (grepping main/index.php case-insensitively for "year" only hits the vi_year DB column), $_GET['list'], $_GET['rss'], or $_GET['contact'] — those params are only implemented in mainn/index.php (a different dispatch dir, out of the Portal segment's scope per the design doc). The contact.us pretty URL is actually served by the real main/contact.us.php file via the generic "append .php" rule earlier in the same file, which fires first. Also worth noting: common/subjects.md describes a "portal home sidebar" that filters the journal directory by Portal Subject (?list=) — that behavior exists only in mainn/index.php's showJList(), not in main/index.php, so it is not reflected as a Landing (or Journals) row here.