Appearance
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
PortalLogoEditDialogandPortalFaviconEditDialog - Portal Limit: Enforced via
PortalLimitDialogwhen plan limit is reached - Permission-Gated: Access controlled via
canManageBrandPortalSettings,canManageBrandPortalUsers,canManageBrandPortalBanners,canManageBrandPortalTiles - Sidebar Navigation: Dedicated
Portalsnav item usingCollagePortalIcon - 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 whencanCreateBrandPortal)pages/_workspace_id/dam/portals/_id.vue— Portal detail page; configure branding, tags, URL, stats
Dialogs ​
components/dam/Dialogs/CreatePortalDialog.vue— Create new portalcomponents/dam/Dialogs/PortalLogoEditDialog.vue— Upload / crop portal logocomponents/dam/Dialogs/PortalFaviconEditDialog.vue— Upload portal faviconcomponents/dam/Dialogs/PortalLimitDialog.vue— Shown when portal count exceeds plan limit
Navigation ​
components/theme/global/LeftMenu.vue— AddsPortalsnav item (route:workspace_id-dam-portals) usingCollagePortalIcon; visibility controlled bycanAccessPortalscomputed 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:
| Route | Required Permission |
|---|---|
workspace_id-dam-portals | requireAccess: 'portals' → canAccessPortals |
workspace_id-workspace-settings-portals-users | canManageBrandPortalUsers |
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 APITriggering the Dialog ​
| Context | Where triggered | Capability required |
|---|---|---|
| Folder | FolderCard.vue portal icon | folder_permission → $canManageFolderPermission(workspace) |
| Asset | pages/.../dam/files/_id.vue | asset_permission → $canManageAssetPermission(workspace) |
| Collage | pages/.../dam/collage/_id/index.vue | collage_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.
Related Documentation ​
- Components — Portal dialog components
- Pages — Portal pages
- Permissions & Access — Role-based access control