Skip to content

Portals ​

Overview ​

The Portals feature provides brand-scoped portal management within the DAM. Each portal represents a branded entry point with its own logo, favicon, URL slug, tags, and user access list. Portals replaced the older per-asset "Visibility" concept and are managed from a dedicated Portals sidebar section in the DAM.

Key Features ​

  • Portal List: View and manage all brand portals for a DAM instance
  • Portal Detail: Configure logo, favicon, URL, tags, and stats per portal
  • Create Portal: Add new portals via CreatePortalDialog
  • Logo & Favicon Upload: Edit per-portal branding via PortalLogoEditDialog and PortalFaviconEditDialog
  • Portal Limit: Enforced via PortalLimitDialog when plan limit is reached
  • Permission-Gated: Access controlled via canManageBrandPortalSettings, canManageBrandPortalUsers, canManageBrandPortalBanners, canManageBrandPortalTiles
  • Sidebar Navigation: Dedicated Portals nav item using CollagePortalIcon
  • Portal Users: Manage portal-level user access at workspace-settings/portals/users/

File Structure ​

Pages ​

  • pages/_workspace_id/dam/portals/index.vue — Portal list page; shows all portals with skeleton loader, empty state, and "Add Portal" button (visible when canCreateBrandPortal)
  • pages/_workspace_id/dam/portals/_id.vue — Portal detail page; configure branding, tags, URL, stats

Dialogs ​

  • components/dam/Dialogs/CreatePortalDialog.vue — Create new portal
  • components/dam/Dialogs/PortalLogoEditDialog.vue — Upload / crop portal logo
  • components/dam/Dialogs/PortalFaviconEditDialog.vue — Upload portal favicon
  • components/dam/Dialogs/PortalLimitDialog.vue — Shown when portal count exceeds plan limit
  • components/theme/global/LeftMenu.vue — Adds Portals nav item (route: workspace_id-dam-portals) using CollagePortalIcon; visibility controlled by canAccessPortals computed property

Icon ​

  • components/svg/CollagePortalIcon.vue — Portal SVG icon used in sidebar and permission dialogs

Settings ​

  • pages/_workspace_id/workspace-settings/portals/users/index.vue — Portal users management page

Access Control ​

The canAccessPortals computed in LeftMenu.vue checks:

javascript
canAccessPortals() {
  return this.$canManageBrandPortalSettings(workspace) ||
         this.$canManageBrandPortalUsers(workspace) ||
         this.$canManageBrandPortalBanners(workspace) ||
         this.$canManageBrandPortalTiles(workspace)
}

Route-level access per hasAccess switch in LeftMenu.vue:

RouteRequired Permission
workspace_id-dam-portalsrequireAccess: 'portals' → canAccessPortals
workspace_id-workspace-settings-portals-userscanManageBrandPortalUsers

Portal-Wise Content Visibility ​

This is the core paradigm change from the old public/private toggle. Instead of making content globally public or private, you now select which portals a folder, asset, or collage appears on.

How It Works ​

The "Portals" dialog (components/dam/Dialogs/PermissionDialog.vue) opens from folder cards, asset detail, and collage detail pages. It fetches the workspace's portal list and shows each portal with a toggle switch. Users select any combination of portals.

Folder / Asset / Collage
    → Click portal icon (CollagePortalIcon)
    → PermissionDialog opens (title: "Portals")
    → Shows list of portals with toggles
    → User selects which portals to publish to
    → Saves via API

Triggering the Dialog ​

ContextWhere triggeredCapability required
FolderFolderCard.vue portal iconfolder_permission → $canManageFolderPermission(workspace)
Assetpages/.../dam/files/_id.vueasset_permission → $canManageAssetPermission(workspace)
Collagepages/.../dam/collage/_id/index.vuecollage_permission → $canManageCollagePermission(workspace)

Roles with access: manager, admin (viewers cannot change portal visibility).

API ​

javascript
POST /digital-assets/permission/change-permission
{
  workspace_id: 123,
  visibility: 0,                      // 0 = visible on selected portals
  instance_ids: [portalId1, portalId2], // which portals to publish to
  category_ids: [folderId],           // for folders (plural array)
  collection_ids: [collageId],        // for collages
  asset_ids: [assetId],               // for assets
  nested_apply: 0 | 1,                // folders only: apply to subfolders
}

To remove from all portals (hide):

javascript
{ visibility: 1, instance_ids: [] }

Emitted Event ​

After save, PermissionDialog emits:

javascript
this.$emit('permission-updated', {
  id: resourceId,
  instance_visibility: [portalId1, portalId2], // portals now active
  isNested: 0 | 1,
})

Parent components use instance_visibility to update local state (show portal badge indicators on cards).

Plan Limit ​

When canUpdateVisibility is false (plan limit reached), PermissionDialog shows StaticPermissionDialog + UpgradePlanSection instead of the portal list.

Bulk Support ​

The dialog accepts arrays (assetIds, folderIds, collectionIds) — multiple resources can have portal visibility set in one API call from bulk-action flows.