@dotcms/angular
is the official Angular library designed to work seamlessly with dotCMS. This library simplifies the process of rendering dotCMS pages and integrating with the Universal Visual Editor in your Angular applications.
- Features
- Installation
- Configuration
- Components
- Best Practices
- Troubleshooting
- Contributing
- Licensing
- A set of Angular components developed for dotCMS page rendering and editor integration.
- Enhanced development workflow with full TypeScript support.
- Optimized performance for efficient rendering of dotCMS pages in Angular applications.
- Flexible customization options to adapt to various project requirements.
Install the package using npm:
npm install @dotcms/angular
Or using Yarn:
yarn add @dotcms/angular
We need to provide the information of our dotCMS instance
import { ClientConfig } from '@dotcms/client';
const DOTCMS_CLIENT_CONFIG: ClientConfig = {
dotcmsUrl: environment.dotcmsUrl,
authToken: environment.authToken,
siteId: environment.siteId
};
Add this configuration to ApplicationConfig
in your Angular app.
src/app/app.config.ts
import { InjectionToken } from '@angular/core';
import { ClientConfig, DotCmsClient } from '@dotcms/client';
export const DOTCMS_CLIENT_TOKEN = new InjectionToken<DotCmsClient>('DOTCMS_CLIENT');
export const appConfig: ApplicationConfig = {
providers: [
provideRouter(routes),
{
provide: DOTCMS_CLIENT_TOKEN,
useValue: DotCmsClient.init(DOTCMS_CLIENT_CONFIG),
}
],
};
This way, we will have access to DOTCMS_CLIENT_TOKEN
from anywhere in our application.
To interact with the client and obtain information from, for example, our pages
export class YourComponent {
private readonly client = inject(DOTCMS_CLIENT_TOKEN);
this.client.page
.get({ ...pageParams })
.then((response) => {
// Use your response
})
.catch((e) => {
const error: PageError = {
message: e.message,
status: e.status,
};
// Use the error response
})
}
For more information on how to use the dotCMS Client, you can visit the documentation
The DotcmsLayoutComponent
requires a DotCMSPageAsset
object to be passed in to it. This object represents a dotCMS page and can be fetched using the @dotcms/client
library.
The DotcmsLayoutComponent
is a crucial component for rendering dotCMS page layouts in your Angular application.
Name | Type | Description |
---|---|---|
pageAsset |
DotCMSPageAsset |
The object representing a dotCMS page from PageAPI response. |
components |
DotCMSPageComponent |
An object mapping contentlets to their respective render components. |
editor |
EditorConfig |
Configuration for data fetching in Edit Mode. |
In your component file (e.g., pages.component.ts
):
import { Component, signal } from '@angular/core';
import { DotCMSPageComponent, EditorConfig } from '@dotcms/angular';
@Component({
selector: 'app-pages',
templateUrl: './pages.component.html',
})
export class PagesComponent {
DYNAMIC_COMPONENTS: DotCMSPageComponent = {
Activity: import('../pages/content-types/activity/activity.component').then(
(c) => c.ActivityComponent
),
Banner: import('../pages/content-types/banner/banner.component').then(
(c) => c.BannerComponent
),
// Add other components as needed
};
components = signal(this.DYNAMIC_COMPONENTS);
editorConfig = signal<EditorConfig>({ params: { depth: 2 } });
// Assume pageAsset is fetched or provided somehow
pageAsset: DotCMSPageAsset;
}
In your template file (e.g., pages.component.html
):
<dotcms-layout
[pageAsset]="pageAsset"
[components]="components()"
[editor]="editorConfig()"
/>
This setup allows for dynamic rendering of different content types on your dotCMS pages.
- Lazy Loading: Use dynamic imports for components to improve initial load times.
- Error Handling: Implement robust error handling for API calls and component rendering.
- Type Safety: Leverage TypeScript's type system to ensure proper usage of dotCMS structures.
- Performance Optimization: Monitor and optimize the performance of rendered components.
If you encounter issues while using @dotcms/angular
, here are some common problems and their solutions:
-
Dependency Issues:
- Ensure that all dependencies, such as
@dotcms/client
,@angular/core
, andrxjs
, are correctly installed and up-to-date. You can verify installed versions by running:npm list @dotcms/client @angular/core rxjs
- If there are any missing or incompatible versions, reinstall dependencies by running:
or
npm install
npm install --force
- Ensure that all dependencies, such as
-
Configuration Errors:
-
DotCMS Configuration: Double-check that your
DOTCMS_CLIENT_CONFIG
settings (URL, auth token, site ID) are correct and aligned with the environment variables. For example:const DOTCMS_CLIENT_CONFIG: ClientConfig = { dotcmsUrl: environment.dotcmsUrl, // Ensure this is a valid URL authToken: environment.authToken, // Ensure auth token has the correct permissions siteId: environment.siteId // Ensure site ID is valid and accessible };
-
Injection Issues: Ensure that
DOTCMS_CLIENT_TOKEN
is provided globally. Errors likeNullInjectorError
usually mean the token hasn’t been properly added to theApplicationConfig
. Verify by checkingsrc/app/app.config.ts
.
-
DotCMS Configuration: Double-check that your
-
Network and API Errors:
-
dotCMS API Connectivity: If API calls are failing, check your browser’s Network tab to ensure requests to
dotcmsUrl
are successful. For CORS-related issues, ensure that your dotCMS server allows requests from your application’s domain. -
Auth Token Permissions: If you’re seeing
401 Unauthorized
errors, make sure the auth token used inDOTCMS_CLIENT_CONFIG
has appropriate permissions in dotCMS for accessing pages and content.
-
dotCMS API Connectivity: If API calls are failing, check your browser’s Network tab to ensure requests to
-
Page and Component Rendering:
-
Dynamic Imports: If you’re encountering issues with lazy-loaded components, make sure dynamic imports are correctly set up, as in:
const DYNAMIC_COMPONENTS: DotCMSPageComponent = { Activity: import('../pages/content-types/activity/activity.component').then( (c) => c.ActivityComponent ) };
-
Invalid Page Assets: Ensure that
pageAsset
objects are correctly formatted. Missing fields inpageAsset
can cause errors inDotcmsLayoutComponent
. Validate the structure by loggingpageAsset
before passing it in.
-
Dynamic Imports: If you’re encountering issues with lazy-loaded components, make sure dynamic imports are correctly set up, as in:
-
Common Angular Errors:
-
Change Detection: Angular sometimes fails to detect changes with dynamic content. If
DotcmsLayoutComponent
isn’t updating as expected, you may need to callChangeDetectorRef.detectChanges()
manually. -
TypeScript Type Errors: Ensure all types (e.g.,
DotCMSPageAsset
,DotCMSPageComponent
) are imported correctly from@dotcms/angular
. Type mismatches can often be resolved by verifying imports.
-
Change Detection: Angular sometimes fails to detect changes with dynamic content. If
-
Consult Documentation: Refer to the official dotCMS documentation and the @dotcms/angular GitHub repository. These sources often provide updates and additional usage examples.
GitHub pull requests are the preferred method to contribute code to dotCMS. Before any pull requests can be accepted, an automated tool will ask you to agree to the dotCMS Contributor's Agreement.
dotCMS comes in multiple editions and as such is dual licensed. The dotCMS Community Edition is licensed under the GPL 3.0 and is freely available for download, customization and deployment for use within organizations of all stripes. dotCMS Enterprise Editions (EE) adds a number of enterprise features and is available via a supported, indemnified commercial license from dotCMS. For the differences between the editions, see the feature page.