dotCMS / dotCMS/core

Dojo to Angular: Publishing Queue Portlet

Open
#34,734 2 comments 0 reactions 1 assignee View on GitHub

@hmoreras is already working on this.

Since Jun 8, 2026.

Team : Modernization
Dominant language
Java
Stars
970
Forks
486
Avg merge
3d 33m
Merged PRs (30d)
170

Description

Context

The Publishing Queue portlet (push-publish workflow management: pending jobs, audit history, unsent bundles) currently ships as a Dojo + JSP portlet built around dijit.layout.TabContainer, dotcms.dojo.push.PushHandler, and dojox.form.Uploader. This epic migrates it to Angular + PrimeNG and reshapes the information architecture per the new design.

The migration is decomposed into a consolidated spike (current state + backend API + target UI mapping), a single FE + BE implementation task (Angular library + portlet.xml rewiring + rollback toggle), and a docs task.

Design reference: https://claude.ai/design/p/52e62c08-322d-4a8e-9900-95e5668c4d74?file=Publishing+Queue+Redesign.html&via=share (internal — auth required). Screenshots of the 8 key screens are attached below.

Current State (Dojo)

Aspect Value
Entry point Portlet publishing-queue registered in dotCMS/src/main/webapp/WEB-INF/portlet.xml (lines ~212-225)
Portlet class com.liferay.portlet.JSPPortlet
Shell JSP dotCMS/src/main/webapp/html/portlet/ext/contentlet/publishing/view_publish_tool.jsp
Tab JSPs view_publish_queue_list.jsp (Pending), view_publish_audit_list.jsp (Status / History), view_unpushed_bundles.jsp (Bundles)
Modal JSPs view_publish_audit_detail.jsp, edit_publish_bundle.jsp
Tab framework Dojo dijit.layout.TabContainer with three tabs
Push dialog Dojo dotcms.dojo.push.PushHandler
Upload widget dojox.form.Uploader
PortletID enum com.dotmarketing.util.PortletID#PUBLISHING_QUEUE
i18n label com.dotcms.repackage.javax.portlet.title.publishing-queue=Publishing Queue
Backend surface /v1/publishing/* (modern), /v1/bundles/* (modern), /v1/publishqueue (modern), /bundle/* (legacy: download, generate, upload, getunsendbundles, updatebundle, assets), /environment, /v1/environments/endpoints, /v1/pushpublish/filters
Gates License + role gating preserved (publishing-queue portlet, requireLicense(true) on bundle uploads)

Target State (Angular)

Information architecture shift

Dojo (today) Angular (target)
Tab: Pending jobs Right column of Queue tab → IN PROGRESS
Tab: Status / History Standalone tab → History
Tab: Bundles (unsent drafts) Left column of Queue tab → READY TO SEND
Three per-tab search inputs Single top-bar global search
PushHandler Dojo dialog New Configure & send modal (Push / Remove / Push+Remove + Send now / Schedule + env + filter)
view_publish_audit_detail.jsp modal Two modals: Asset list (Name / Type / State) + Bundle details (metadata + endpoints-by-environment)
Inline retry options dialog Inline per-row Retry + auto-retry hint inside Configure & send
Legacy Upload Bundle dialog Top-bar Upload Bundle action with redesigned modal

Structure

  • New Nx library: core-web/libs/portlets/dot-publishing-queue/ (shell + page + SignalStore + data-access service + models)
  • Two PrimeNG tabs: Queue (two-column READY TO SEND + IN PROGRESS) and History
  • New data-access service libs/data-access/src/lib/dot-publishing-queue/ covering /v1/publishing/*, /v1/bundles/*, /v1/publishqueue, and remaining legacy /bundle/* endpoints until consolidated
  • Reuse existing services where possible: push-publish.service.ts, dot-push-publish-filters.service.ts, add-to-bundle.service.ts
  • Reuse models from libs/dotcms-models: DotEnvironment, DotBundle, DotPushPublishData, DotPushPublishDialogData
  • License + role gating preserved; any gap surfaced in the spike's API audit is filed as a separate security task and linked here

Backend Wiring

  • dotCMS/src/main/webapp/WEB-INF/portlet.xml: publishing-queue points at the new Angular shell; a new publishing-queue-legacy entry points at the existing JSP for rollback
  • Reuse existing PortletID.PUBLISHING_QUEUE enum entry and existing publishing-queue i18n key
  • Live-toggle rollback so admins can revert to the JSP without redeploy
  • Backend hardening discovered during the spike (OpenAPI gaps on legacy resources, consolidation of legacy /bundle/* endpoints into /v1/publishing/* and /v1/bundles/*) is tracked in separate [Task] issues filed by the spike and linked here

Acceptance Criteria

  • Publishing Queue portlet loads at the existing publishing-queue route, served by the new Angular shell
  • Queue tab renders the two-column layout (READY TO SEND + IN PROGRESS) with counts shown in each column header
  • A READY TO SEND row exposes a primary Send action and a kebab with Configure & send, Generate / download, Remove from queue
  • An IN PROGRESS row renders status chips (Scheduled, Retry, etc.) and a Retry action when applicable
  • History tab renders sortable BUNDLE / STATUS columns with Sent / Failed chips, pagination, and bulk select
  • Top-bar search filters bundles / content / environments across the active tab
  • Upload Bundle action accepts a .tar.gz file and refreshes the active tab on success
  • Configure & send modal exposes Push / Remove / Push+Remove cards, Send now / Schedule, environment dropdown, and filter dropdown
  • Row click opens the Asset list modal (Name / Type / State) from both Queue and History
  • Bundle details modal renders metadata + endpoints-by-environment table; Download is available for completed bundles
  • License + role gating preserved (publishing-queue portlet, requireLicense(true) on uploads)
  • Rollback toggle: switching publishing-queuepublishing-queue-legacy in portlet.xml reverts to the JSP without redeploy

Sub-tasks

  • #36039 — [Spike] consolidated audit (current state + backend API + target UI mapping + backend hardening backlog)
  • #36040 — [Task] Angular implementation + backend wiring
  • #36041 — [Docs] document UI/UX changes after Dojo → Angular migration

Contributor guide

Open the contributing guide

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.