Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
53 commits
Select commit Hold shift + click to select a range
0506de4
feat: migrate @dotcms/ui components to standalone
hmoreras Oct 9, 2025
3c30b29
feat: migrate 13/17 custom modules to standalone components
hmoreras Oct 9, 2025
0db1f81
feat: Complete migration to standalone components
hmoreras Oct 9, 2025
480d62f
chore: Remove obsolete module files after standalone migration
hmoreras Oct 9, 2025
967b37c
fix: Resolve NullInjectorError issues and optimize service providers
hmoreras Oct 9, 2025
7dbcea5
feat: Complete standalone component migration for 17 modules
hmoreras Oct 10, 2025
43798a7
feat: migrate MainLegacyComponent and dependencies to standalone
hmoreras Oct 10, 2025
6d2712d
feat: migrate DotThemeSelectorDropdownComponent to standalone
hmoreras Oct 10, 2025
1732fbe
feat: Complete migration to standalone components
hmoreras Oct 10, 2025
3a87df3
fix: Complete test fixes and optimize imports
hmoreras Oct 10, 2025
00faad9
refactor: migrate components to standalone and fix test providers
hmoreras Oct 13, 2025
da7eabc
refactor(ui): migrate dot-palette components to standalone
hmoreras Oct 13, 2025
16765dc
test: migrate dot-edit-page-toolbar-seo tests to Spectator and fix re…
hmoreras Oct 14, 2025
2e7929f
fix: migrate components to standalone and fix multiple test suites
hmoreras Oct 14, 2025
fd1a734
fix: restore files modified during pre-commit hook restoration
hmoreras Oct 14, 2025
219c8b9
refactor: migrate DotBlockEditorSidebarComponent to standalone and Do…
hmoreras Oct 14, 2025
7312c11
fix: adjust remaining test files and formatting
hmoreras Oct 14, 2025
71b9197
Merge branch 'main' into issue-33519-standalone-migration
hmoreras Oct 15, 2025
412d827
refactor: convert ContentTypesLayoutComponent to standalone and fix t…
hmoreras Oct 15, 2025
d7087ec
refactor: migrate components to standalone and fix test issues
hmoreras Oct 15, 2025
535a027
feat: migrate Angular modules to standalone components and route conf…
hmoreras Oct 16, 2025
5f5ca73
fix: resolve dependency injection errors in DotPagesComponent
hmoreras Oct 16, 2025
1eb741b
missing resolvers and services on routes
hmoreras Oct 17, 2025
3cbeb14
feat: migrate Angular components to standalone architecture (issue #3…
hmoreras Oct 17, 2025
04cea82
feat: migrate container modules to standalone components and refactor…
hmoreras Oct 17, 2025
79d4a7a
Merge branch 'main' into issue-33519-standalone-migration
hmoreras Oct 20, 2025
ffe439e
feat: migrate dot-apps and dot-categories features to standalone comp…
hmoreras Oct 20, 2025
1cb3583
feat: migrate common components and shared modules to standalone comp…
hmoreras Oct 21, 2025
3f1832d
feat: migrate additional components to standalone and fix dependency …
hmoreras Oct 22, 2025
55a4db7
feat: complete Phase 1 standalone migration - routing modules and uti…
hmoreras Oct 22, 2025
4e251c0
feat: migrate dot-edit-page feature modules to standalone components
hmoreras Oct 23, 2025
bb03886
Merge branch 'main' into issue-33519-standalone-migration
hmoreras Oct 23, 2025
e967a2a
remove migrated module in DotEditContentCompareComponent
hmoreras Oct 23, 2025
a327ee3
feat: complete standalone migration for content-types, containers, ca…
hmoreras Oct 27, 2025
4501afe
Merge branch 'main' into issue-33519-standalone-migration
hmoreras Oct 28, 2025
fb044a1
fix lint erros
hmoreras Oct 28, 2025
a6479ff
fix format in files
hmoreras Oct 28, 2025
f77cdf2
fix: resolve iframe dialog not showing due to multiple service instances
hmoreras Oct 29, 2025
96b148c
Merge branch 'main' into issue-33519-standalone-migration
hmoreras Oct 29, 2025
6a81a19
Merge branch 'main' into issue-33519-standalone-migration
hmoreras Oct 31, 2025
f934471
test: improve Monaco editor mocking and test setup
hmoreras Oct 31, 2025
39501b1
Add DotParseHtmlService to providers to fix PushPublish Dialog
hmoreras Oct 31, 2025
948fc1a
Merge branch 'main' into issue-33519-standalone-migration
hmoreras Oct 31, 2025
435327f
Merge branch 'main' into issue-33519-standalone-migration
hmoreras Nov 3, 2025
d439e5d
missing import in the content drive
hmoreras Nov 3, 2025
568e2da
refactor: migrate DotUploadFileService and DotAiService to root-level…
hmoreras Nov 4, 2025
9be1940
Merge branch 'main' into issue-33519-standalone-migration
hmoreras Nov 4, 2025
84fc891
fix: add providedIn: 'root' to services for standalone migration comp…
hmoreras Nov 5, 2025
521dd8c
fix: add providedIn: 'root' to services for standalone migration comp…
hmoreras Nov 5, 2025
b522366
Merge branch 'main' into issue-33519-standalone-migration
hmoreras Nov 5, 2025
b8996c7
fix files format
hmoreras Nov 5, 2025
d846bd9
Merge branch 'issue-33519-standalone-migration' of https://github.com…
hmoreras Nov 5, 2025
f8fc689
Merge branch 'main' into issue-33519-standalone-migration
hmoreras Nov 5, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
6 changes: 3 additions & 3 deletions core-web/apps/dotcdn/src/app/app.module.ts
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ import {
SiteService,
StringUtils
} from '@dotcms/dotcms-js';
import { DotIconModule, DotSpinnerModule } from '@dotcms/ui';
import { DotIconComponent, DotSpinnerComponent } from '@dotcms/ui';

import { AppComponent } from './app.component';
import { DotCDNStore } from './dotcdn.component.store';
Expand All @@ -49,10 +49,10 @@ const dotEventSocketURLFactory = () => {
ChartModule,
InputTextareaModule,
ButtonModule,
DotIconModule,
DotIconComponent,
FormsModule,
SkeletonModule,
DotSpinnerModule,
DotSpinnerComponent,
ReactiveFormsModule
],
providers: [
Expand Down
8 changes: 2 additions & 6 deletions core-web/apps/dotcms-block-editor/src/app/app.module.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,11 +10,7 @@ import { ListboxModule } from 'primeng/listbox';
import { OrderListModule } from 'primeng/orderlist';

import { BlockEditorModule, DotBlockEditorComponent } from '@dotcms/block-editor';
import {
DotPropertiesService,
DotContentSearchService,
DotLanguagesService
} from '@dotcms/data-access';
import { DotPropertiesService, DotContentSearchService } from '@dotcms/data-access';
import { DotAssetSearchComponent } from '@dotcms/ui';

import { AppComponent } from './app.component';
Expand All @@ -32,7 +28,7 @@ import { AppComponent } from './app.component';
HttpClientModule,
DotAssetSearchComponent
],
providers: [DotPropertiesService, DotContentSearchService, DotLanguagesService]
providers: [DotPropertiesService, DotContentSearchService]
})
export class AppModule implements DoBootstrap {
constructor(private injector: Injector) {}
Expand Down
16 changes: 8 additions & 8 deletions core-web/apps/dotcms-ui-e2e/playwright.config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -50,21 +50,21 @@ export default defineConfig({
// Uncomment for mobile browsers support
/* {
name: 'Mobile Chrome',
use: { ...devices['Pixel 5'] },
},
use: { ...devices['Pixel 5'] }
},
{
name: 'Mobile Safari',
use: { ...devices['iPhone 12'] },
}, */
use: { ...devices['iPhone 12'] }
}, */

// Uncomment for branded browsers
/* {
name: 'Microsoft Edge',
use: { ...devices['Desktop Edge'], channel: 'msedge' },
},
use: { ...devices['Desktop Edge'], channel: 'msedge' }
},
{
name: 'Google Chrome',
use: { ...devices['Desktop Chrome'], channel: 'chrome' },
} */
use: { ...devices['Desktop Chrome'], channel: 'chrome' }
} */
]
});
4 changes: 3 additions & 1 deletion core-web/apps/dotcms-ui/jest.config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,9 @@ export default {
}
]
},
transformIgnorePatterns: ['node_modules/(?!.*\\.mjs$|y-protocols|lib0|@tiptap|y-prosemirror)'],
transformIgnorePatterns: [
'node_modules/(?!.*\\.mjs$|y-protocols|lib0|@tiptap|y-prosemirror|gridstack|uuid)'
],
snapshotSerializers: [
'jest-preset-angular/build/serializers/no-ng-attributes',
'jest-preset-angular/build/serializers/ng-snapshot',
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,9 @@ export const COMPARE_CUSTOM_EVENT = 'compare-contentlet';
* @export
* @class DotCustomEventHandlerService
*/
@Injectable()
@Injectable({
providedIn: 'root'
})
export class DotCustomEventHandlerService {
private dotLoadingIndicatorService = inject(DotLoadingIndicatorService);
private dotRouterService = inject(DotRouterService);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -34,10 +34,8 @@ describe('ValidAuthGuardService', () => {
authGuardService = TestBed.inject(AuthGuardService);
dotRouterService = TestBed.inject(DotRouterService);
loginService = TestBed.inject(LoginService);
mockRouterStateSnapshot = jest.fn<RouterStateSnapshot>('RouterStateSnapshot', ['toString']);
mockActivatedRouteSnapshot = jest.fn<ActivatedRouteSnapshot>('ActivatedRouteSnapshot', [
'toString'
]);
mockRouterStateSnapshot = { url: '/test' } as RouterStateSnapshot;
mockActivatedRouteSnapshot = {} as ActivatedRouteSnapshot;
});

it('should allow access to the requested route, User is logged in', () => {
Expand Down
39 changes: 21 additions & 18 deletions core-web/apps/dotcms-ui/src/app/app-routing.module.ts
Original file line number Diff line number Diff line change
Expand Up @@ -33,23 +33,23 @@ const PORTLETS_ANGULAR: Route[] = [
{
path: 'containers',
loadChildren: () =>
import('@dotcms/app/portlets/dot-containers/dot-containers.module').then(
(m) => m.DotContainersModule
import('@dotcms/app/portlets/dot-containers/dot-containers.routes').then(
(m) => m.dotContainersRoutes
)
},
{
path: 'categories',
loadChildren: () =>
import('@dotcms/app/portlets/dot-categories/dot-categories.module').then(
(m) => m.DotCategoriesModule
import('@dotcms/app/portlets/dot-categories/dot-categories.routes').then(
(m) => m.dotCategoriesRoutes
)
},
{
path: 'templates',
canActivate: [MenuGuardService],
canActivateChild: [MenuGuardService],
loadChildren: () =>
import('@portlets/dot-templates/dot-templates.module').then((m) => m.DotTemplatesModule)
import('@portlets/dot-templates/dot-templates.routes').then((m) => m.DotTemplatesRoutes)
},
{
path: 'content-types-angular',
Expand All @@ -59,8 +59,8 @@ const PORTLETS_ANGULAR: Route[] = [
reuseRoute: false
},
loadChildren: () =>
import('@portlets/dot-content-types/dot-content-types.module').then(
(m) => m.DotContentTypesModule
import('@portlets/dot-content-types/dot-content-types.routes').then(
(m) => m.dotContentTypesRoutes
)
},
{
Expand Down Expand Up @@ -99,8 +99,8 @@ const PORTLETS_ANGULAR: Route[] = [
canActivate: [MenuGuardService],
canActivateChild: [MenuGuardService],
loadChildren: () =>
import('@portlets/dot-form-builder/dot-form-builder.module').then(
(m) => m.DotFormBuilderModule
import('@portlets/dot-form-builder/dot-form-builder.routes').then(
(m) => m.dotFormBuilderRoutes
),
data: {
filterBy: 'FORM'
Expand All @@ -122,7 +122,7 @@ const PORTLETS_ANGULAR: Route[] = [
canActivateChild: [MenuGuardService],
path: 'apps',
loadChildren: () =>
import('@portlets/dot-apps/dot-apps.module').then((m) => m.DotAppsModule)
import('./portlets/dot-apps/dot-apps.routes').then((m) => m.dotAppsRoutes)
},
{
path: 'edit-page',
Expand Down Expand Up @@ -154,7 +154,7 @@ const PORTLETS_ANGULAR: Route[] = [
canActivate: [MenuGuardService, PagesGuardService],
path: 'pages',
loadChildren: () =>
import('@portlets/dot-pages/dot-pages.module').then((m) => m.DotPagesModule)
import('@portlets/dot-pages/dot-pages.routes').then((m) => m.dotPagesRoutes)
},
{
canActivate: [MenuGuardService],
Expand All @@ -181,14 +181,14 @@ const PORTLETS_IFRAME = [
{
loadChildren: () =>
import(
'@components/dot-contentlet-editor/dot-contentlet-editor.routing.module'
).then((m) => m.DotContentletEditorRoutingModule),
'@components/dot-contentlet-editor/dot-contentlet-editor.routes'
).then((m) => m.dotContentletEditorRoutes),
path: 'new'
},
{
loadChildren: () =>
import('@portlets/dot-porlet-detail/dot-portlet-detail.module').then(
(m) => m.DotPortletDetailModule
loadComponent: () =>
import('@portlets/dot-porlet-detail/dot-portlet-detail.component').then(
(m) => m.DotPortletDetailComponent
),
path: ':asset',
data: {
Expand Down Expand Up @@ -231,7 +231,7 @@ const appRoutes: Routes = [
loginFormInfo: DotLoginPageResolver
},
loadChildren: () =>
import('@components/login/dot-login-page.module').then((m) => m.DotLoginPageModule)
import('@components/login/dot-login-page.routes').then((m) => m.dotLoginPageRoutes)
},
{
path: 'fromCore',
Expand Down Expand Up @@ -270,6 +270,9 @@ const appRoutes: Routes = [
onSameUrlNavigation: 'reload'
})
],
providers: [{ provide: RouteReuseStrategy, useClass: DotCustomReuseStrategyService }]
providers: [
{ provide: RouteReuseStrategy, useClass: DotCustomReuseStrategyService },
DotLoginPageResolver
]
})
export class AppRoutingModule {}
3 changes: 1 addition & 2 deletions core-web/apps/dotcms-ui/src/app/app.component.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -31,8 +31,7 @@ describe('AppComponent', () => {

beforeEach(() => {
TestBed.configureTestingModule({
declarations: [AppComponent],
imports: [RouterTestingModule, HttpClientTestingModule],
imports: [AppComponent, RouterTestingModule, HttpClientTestingModule],
providers: [
{ provide: CoreWebService, useClass: CoreWebServiceMock },
DotUiColorsService,
Expand Down
3 changes: 2 additions & 1 deletion core-web/apps/dotcms-ui/src/app/app.component.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import { Component, inject, OnInit } from '@angular/core';
import { RouterOutlet } from '@angular/router';

import { map, take } from 'rxjs/operators';

Expand All @@ -12,7 +13,7 @@ import { DotNavLogoService } from './api/services/dot-nav-logo/dot-nav-logo.serv
selector: 'dot-root',
templateUrl: './app.component.html',
styleUrls: ['./app.component.scss'],
standalone: false
imports: [RouterOutlet]
})
export class AppComponent implements OnInit {
private dotCmsConfigService = inject(DotcmsConfigService);
Expand Down
10 changes: 4 additions & 6 deletions core-web/apps/dotcms-ui/src/app/app.module.ts
Original file line number Diff line number Diff line change
Expand Up @@ -12,19 +12,17 @@ import { BrowserAnimationsModule } from '@angular/platform-browser/animations';
import { DotMessagePipe, DotSafeHtmlPipe } from '@dotcms/ui';

import { AppRoutingModule } from './app-routing.module';
import { AppComponent } from './app.component';
import { COMPONENTS } from './components';
import { CUSTOM_MODULES, NGFACES_MODULES } from './modules';
import { COMPONENTS, STANDALONE_COMPONENTS } from './components';
import { NGFACES_MODULES } from './modules';
import { ENV_PROVIDERS } from './providers';
import { DotDirectivesModule } from './shared/dot-directives.module';
import { SharedModule } from './shared/shared.module';

@NgModule({
bootstrap: [AppComponent],
declarations: [AppComponent, ...COMPONENTS],
declarations: [...COMPONENTS],
imports: [
...CUSTOM_MODULES,
...NGFACES_MODULES,
...STANDALONE_COMPONENTS,
CommonModule,
BrowserAnimationsModule,
BrowserModule,
Expand Down
55 changes: 52 additions & 3 deletions core-web/apps/dotcms-ui/src/app/components.ts
Original file line number Diff line number Diff line change
@@ -1,15 +1,64 @@
import { DotContentCompareComponent } from '@dotcms/portlets/dot-ema/ui';
import { DotDialogComponent, DotIconComponent } from '@dotcms/ui';

import { AppComponent } from './app.component';
import { DotActionButtonComponent } from './view/components/_common/dot-action-button/dot-action-button.component';
import { DotAlertConfirmComponent } from './view/components/_common/dot-alert-confirm/dot-alert-confirm';
import { DotDownloadBundleDialogComponent } from './view/components/_common/dot-download-bundle-dialog/dot-download-bundle-dialog.component';
import { DotGenerateSecurePasswordComponent } from './view/components/_common/dot-generate-secure-password/dot-generate-secure-password.component';
import { DotPushPublishDialogComponent } from './view/components/_common/dot-push-publish-dialog/dot-push-publish-dialog.component';
import { DotSiteSelectorComponent } from './view/components/_common/dot-site-selector/dot-site-selector.component';
import { DotTextareaContentComponent } from './view/components/_common/dot-textarea-content/dot-textarea-content.component';
import { DotWizardComponent } from './view/components/_common/dot-wizard/dot-wizard.component';
import { IframeComponent } from './view/components/_common/iframe/iframe-component/iframe.component';
import { IframePortletLegacyComponent } from './view/components/_common/iframe/iframe-porlet-legacy/iframe-porlet-legacy.component';
import { SearchableDropdownComponent } from './view/components/_common/searchable-dropdown/component/searchable-dropdown.component';
import { DotEditContentletComponent } from './view/components/dot-contentlet-editor/components/dot-edit-contentlet/dot-edit-contentlet.component';
import { DotCrumbtrailComponent } from './view/components/dot-crumbtrail/dot-crumbtrail.component';
import { DotLargeMessageDisplayComponent } from './view/components/dot-large-message-display/dot-large-message-display.component';
import { DotListingDataTableComponent } from './view/components/dot-listing-data-table/dot-listing-data-table.component';
import { DotMessageDisplayComponent } from './view/components/dot-message-display/dot-message-display.component';
import { DotThemeSelectorDropdownComponent } from './view/components/dot-theme-selector-dropdown/dot-theme-selector-dropdown.component';
import { DotToolbarComponent } from './view/components/dot-toolbar/dot-toolbar.component';
import { DotWorkflowTaskDetailComponent } from './view/components/dot-workflow-task-detail/dot-workflow-task-detail.component';
import { GlobalSearchComponent } from './view/components/global-search/global-search';
import { DotLogOutContainerComponent } from './view/components/login/dot-logout-container-component/dot-log-out-container';
import { DotLoginPageComponent } from './view/components/login/main/dot-login-page.component';
import { MainCoreLegacyComponent } from './view/components/main-core-legacy/main-core-legacy-component';
import { MainComponentLegacyComponent } from './view/components/main-legacy/main-legacy.component';

// Non-standalone components (traditional NgModule components)
export const COMPONENTS = [
MainCoreLegacyComponent,
DotLogOutContainerComponent,
GlobalSearchComponent
];

// Standalone components (migrated to standalone)
export const STANDALONE_COMPONENTS = [
AppComponent,
MainComponentLegacyComponent,
DotAlertConfirmComponent,
DotLoginPageComponent,
DotLogOutContainerComponent,
GlobalSearchComponent,
DotAlertConfirmComponent
DotToolbarComponent,
DotActionButtonComponent,
DotEditContentletComponent,
DotDialogComponent,
DotIconComponent,
DotTextareaContentComponent,
DotWorkflowTaskDetailComponent,
DotMessageDisplayComponent,
IframeComponent,
IframePortletLegacyComponent,
DotListingDataTableComponent,
SearchableDropdownComponent,
DotSiteSelectorComponent,
DotLargeMessageDisplayComponent,
DotPushPublishDialogComponent,
DotContentCompareComponent,
DotDownloadBundleDialogComponent,
DotWizardComponent,
DotGenerateSecurePasswordComponent,
DotThemeSelectorDropdownComponent,
DotCrumbtrailComponent
];
43 changes: 2 additions & 41 deletions core-web/apps/dotcms-ui/src/app/modules.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
// CUSTOM MDOULES
// PRIMENG MODULES
// Note: CUSTOM_MODULES has been removed - all standalone components are now in components.ts

import { SharedModule } from 'primeng/api';
import { AutoCompleteModule } from 'primeng/autocomplete';
Expand All @@ -21,46 +22,6 @@ import { TabViewModule } from 'primeng/tabview';
import { ToolbarModule } from 'primeng/toolbar';
import { TreeTableModule } from 'primeng/treetable';

import { DotContentCompareModule } from '@dotcms/portlets/dot-ema/ui';
import { DotDialogModule, DotIconModule } from '@dotcms/ui';

import { DotActionButtonModule } from './view/components/_common/dot-action-button/dot-action-button.module';
import { DotDownloadBundleDialogModule } from './view/components/_common/dot-download-bundle-dialog/dot-download-bundle-dialog.module';
import { DotGenerateSecurePasswordModule } from './view/components/_common/dot-generate-secure-password/dot-generate-secure-password.module';
import { DotPushPublishDialogModule } from './view/components/_common/dot-push-publish-dialog/dot-push-publish-dialog.module';
import { DotSiteSelectorModule } from './view/components/_common/dot-site-selector/dot-site-selector.module';
import { DotTextareaContentModule } from './view/components/_common/dot-textarea-content/dot-textarea-content.module';
import { DotWizardModule } from './view/components/_common/dot-wizard/dot-wizard.module';
import { IFrameModule } from './view/components/_common/iframe';
import { SearchableDropDownModule } from './view/components/_common/searchable-dropdown';
import { DotContentletEditorModule } from './view/components/dot-contentlet-editor/dot-contentlet-editor.module';
import { DotLargeMessageDisplayModule } from './view/components/dot-large-message-display/dot-large-message-display.module';
import { DotListingDataTableModule } from './view/components/dot-listing-data-table/dot-listing-data-table.module';
import { DotMessageDisplayModule } from './view/components/dot-message-display/dot-message-display.module';
import { DotToolbarModule } from './view/components/dot-toolbar/dot-toolbar.module';
import { DotWorkflowTaskDetailModule } from './view/components/dot-workflow-task-detail/dot-workflow-task-detail.module';

export const CUSTOM_MODULES = [
DotToolbarModule,
DotActionButtonModule,
DotContentletEditorModule,
DotDialogModule,
DotIconModule,
DotTextareaContentModule,
DotWorkflowTaskDetailModule,
DotMessageDisplayModule,
IFrameModule,
DotListingDataTableModule,
SearchableDropDownModule,
DotSiteSelectorModule,
DotLargeMessageDisplayModule,
DotPushPublishDialogModule,
DotContentCompareModule,
DotDownloadBundleDialogModule,
DotWizardModule,
DotGenerateSecurePasswordModule
];

export const NGFACES_MODULES = [
AutoCompleteModule,
BreadcrumbModule,
Expand Down
Loading