Dojo to Angular: Publishing Queue Portlet
@hmoreras is already working on this.
Since Jun 8, 2026.
- 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-columnREADY TO SEND+IN PROGRESS) andHistory - 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-queuepoints at the new Angular shell; a newpublishing-queue-legacyentry points at the existing JSP for rollback- Reuse existing
PortletID.PUBLISHING_QUEUEenum entry and existingpublishing-queuei18n 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-queueroute, 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 SENDrow exposes a primarySendaction and a kebab withConfigure & send,Generate / download,Remove from queue - An
IN PROGRESSrow renders status chips (Scheduled,Retry, etc.) and aRetryaction when applicable - History tab renders sortable BUNDLE / STATUS columns with
Sent/Failedchips, pagination, and bulk select - Top-bar search filters bundles / content / environments across the active tab
Upload Bundleaction accepts a.tar.gzfile and refreshes the active tab on successConfigure & sendmodal 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-queueportlet,requireLicense(true)on uploads) - Rollback toggle: switching
publishing-queue↔publishing-queue-legacyinportlet.xmlreverts 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
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
Assessment
This issue has not been assessed yet.