From 8f65568e0059f1126f68d52a2b50d2e13b6f29b0 Mon Sep 17 00:00:00 2001 From: Freddy Montes Date: Fri, 27 May 2022 11:38:26 -0600 Subject: [PATCH] Merge release 22.06 to master (#1999) * dotCMS/core#22017 Delete by range in case of select more than 1 node (#1988) * CI: bumps version to 22.6.0-rc.8 [skip ci] * dotCMS/core#22198 We are changing the relationship selection once that you create the field * CI: bumps version to 22.6.0-rc.9 [skip ci] * dotCMS/core#22039 Fix the back button when empty results in the suggestion search * dotCMS/core#21818 Reload contentlet on edit using #editContentlet macro (#1989) * delay in call * delay in call * reduce timeout * CI: bumps version to 22.6.0-rc.10 [skip ci] * Issue 21797 fix force menu to load and hide add to menu for host in content type (#1995) * dotCMS/core#21797 fix force-menu-to-load-and-hide-add-to-menu-for-host-content-type * Support other error msg handling from backend * dotCms/core#21797 fix when creating a new toolgroup in add-to-menu we need to concatenate the viewMode to make it unique * Feedback * CI: bumps version to 22.6.0-rc.11 [skip ci] * dotCMS/core#21915 fix-layout-broken-when-changed-CT-name (#1998) * CI: bumps version to 22.6.0-rc.12 [skip ci] * dotCMS/core#22204 We are not notifying the UI about the bad request error changing password Co-authored-by: Arcadio Quintero A Co-authored-by: victoralfaro-dotcms Co-authored-by: Humberto Morera <31667212+hmoreras@users.noreply.github.com> Co-authored-by: alfredo-dotcms <37185433+alfredo-dotcms@users.noreply.github.com> --- .../add-to-menu/add-to-menu.service.spec.ts | 19 ++- .../add-to-menu/add-to-menu.service.ts | 20 +++- .../dot-http-error-manager.service.spec.ts | 21 ++++ .../dot-http-error-manager.service.ts | 28 ++--- .../src/app/api/services/dot-menu.service.ts | 6 +- .../dot-edit-content-html.service.ts | 5 +- .../dot-cardinality-selector.component.html | 9 +- ...dot-cardinality-selector.component.spec.ts | 65 ++++------ .../dot-cardinality-selector.component.ts | 45 +------ .../dot-content-types-edit.component.spec.ts | 2 + .../dot-content-types-edit.component.ts | 3 + .../dot-add-to-menu.component.spec.ts | 13 +- .../dot-add-to-menu.component.ts | 9 +- .../dot-content-types.component.spec.ts | 8 ++ .../dot-content-types.component.ts | 3 + .../services/dot-navigation.service.spec.ts | 2 +- .../dot-my-account.component.html | 19 ++- .../dot-my-account.component.spec.ts | 111 ++++++++++++++++-- .../dot-my-account.component.ts | 87 +++++++++----- .../suggestions/suggestions.component.ts | 15 ++- .../src/lib/plugins/dot-bubble-menu.plugin.ts | 36 ++++-- 21 files changed, 345 insertions(+), 181 deletions(-) diff --git a/apps/dotcms-ui/src/app/api/services/add-to-menu/add-to-menu.service.spec.ts b/apps/dotcms-ui/src/app/api/services/add-to-menu/add-to-menu.service.spec.ts index 8cd558fda8..009a292f1e 100644 --- a/apps/dotcms-ui/src/app/api/services/add-to-menu/add-to-menu.service.spec.ts +++ b/apps/dotcms-ui/src/app/api/services/add-to-menu/add-to-menu.service.spec.ts @@ -67,7 +67,10 @@ describe('DotAddToMenuService', () => { const req = httpMock.expectOne(url); expect(req.request.method).toBe('POST'); - expect(req.request.body).toEqual({ ...customToolData, portletId: 'test' }); + expect(req.request.body).toEqual({ + ...customToolData, + portletId: `${customToolData.portletName}_${customToolData.dataViewMode}` + }); req.flush({ entity: 'ok' }); @@ -96,10 +99,14 @@ describe('DotAddToMenuService', () => { }); it('should add to layout a custom tool portlet', () => { - const url = `v1/portlet/custom/c_${customToolData.portletName}/_addtolayout/123`; + const url = `v1/portlet/custom/c_${customToolData.portletName}_${customToolData.dataViewMode}/_addtolayout/123`; dotAddToMenuService - .addToLayout(customToolData.portletName, '123') + .addToLayout({ + portletName: customToolData.portletName, + dataViewMode: customToolData.dataViewMode, + layoutId: '123' + }) .subscribe((response: string) => { expect(response).toEqual('ok'); }); @@ -117,7 +124,11 @@ describe('DotAddToMenuService', () => { spyOn(coreWebService, 'requestView').and.returnValue(throwError(error404)); dotAddToMenuService - .addToLayout(customToolData.portletName, '123') + .addToLayout({ + portletName: customToolData.portletName, + dataViewMode: customToolData.dataViewMode, + layoutId: '123' + }) .subscribe((response: string) => { expect(response).toEqual(null); }); diff --git a/apps/dotcms-ui/src/app/api/services/add-to-menu/add-to-menu.service.ts b/apps/dotcms-ui/src/app/api/services/add-to-menu/add-to-menu.service.ts index 501be84fff..f8eb4ca9ab 100644 --- a/apps/dotcms-ui/src/app/api/services/add-to-menu/add-to-menu.service.ts +++ b/apps/dotcms-ui/src/app/api/services/add-to-menu/add-to-menu.service.ts @@ -13,6 +13,12 @@ export interface DotCreateCustomTool { portletName: string; } +export interface DotCustomToolToLayout { + dataViewMode: string; + layoutId: string; + portletName: string; +} + /** * Provides methods to create and assign custom tools portlet to layout menu. * @export @@ -27,6 +33,7 @@ export class DotAddToMenuService { /** * Cleans the portletId string from special chars and replaces then with a dash + * * @param {string} name * @returns string * @memberof DotAddToMenuService @@ -37,6 +44,7 @@ export class DotAddToMenuService { /** * Creates a Custom tool portlet and returns the name of the portlet created + * * @param {DotCreateCustomTool} params * @returns Observable * @memberof DotAddToMenuService @@ -46,7 +54,7 @@ export class DotAddToMenuService { .requestView({ body: { ...params, - portletId: this.cleanUpPorletId(params.portletName) + portletId: `${this.cleanUpPorletId(params.portletName)}_${params.dataViewMode}` }, method: 'POST', url: `${addToMenuUrl}/custom` @@ -68,17 +76,17 @@ export class DotAddToMenuService { /** * Assigns a Custom tool portlet to a layout Id (menu) - * @param {string} layoutId - * @param {string} portletName + * + * @param {DotCustomToolToLayout} params * @returns Observable * @memberof DotAddToMenuService */ - addToLayout(portletName: string, layoutId: string): Observable { - const portletId = this.cleanUpPorletId(portletName); + addToLayout(params: DotCustomToolToLayout): Observable { + const portletId = `${this.cleanUpPorletId(params.portletName)}_${params.dataViewMode}`; return this.coreWebService .requestView({ method: 'PUT', - url: `${addToMenuUrl}/custom/c_${portletId}/_addtolayout/${layoutId}` + url: `${addToMenuUrl}/custom/c_${portletId}/_addtolayout/${params.layoutId}` }) .pipe( pluck('entity'), diff --git a/apps/dotcms-ui/src/app/api/services/dot-http-error-manager/dot-http-error-manager.service.spec.ts b/apps/dotcms-ui/src/app/api/services/dot-http-error-manager/dot-http-error-manager.service.spec.ts index 0e847be4a4..14ec9e1f68 100644 --- a/apps/dotcms-ui/src/app/api/services/dot-http-error-manager/dot-http-error-manager.service.spec.ts +++ b/apps/dotcms-ui/src/app/api/services/dot-http-error-manager/dot-http-error-manager.service.spec.ts @@ -204,6 +204,27 @@ describe('DotHttpErrorManagerService', () => { }); }); + it('should handle 400 error on error.errors[0]', () => { + spyOn(dotDialogService, 'alert'); + + const responseView: HttpErrorResponse = mockResponseView(400, null, null, { + errors: [{ message: 'Server Error' }] + }); + + service.handle(responseView).subscribe((res) => { + result = res; + }); + + expect(result).toEqual({ + redirected: false, + status: 400 + }); + expect(dotDialogService.alert).toHaveBeenCalledWith({ + message: 'Server Error', + header: '400 Header' + }); + }); + it('should handle 400 error and show reponse message', () => { spyOn(dotDialogService, 'alert'); diff --git a/apps/dotcms-ui/src/app/api/services/dot-http-error-manager/dot-http-error-manager.service.ts b/apps/dotcms-ui/src/app/api/services/dot-http-error-manager/dot-http-error-manager.service.ts index b564debbd4..543e34c34e 100644 --- a/apps/dotcms-ui/src/app/api/services/dot-http-error-manager/dot-http-error-manager.service.ts +++ b/apps/dotcms-ui/src/app/api/services/dot-http-error-manager/dot-http-error-manager.service.ts @@ -3,7 +3,7 @@ import { DotRouterService } from '../dot-router/dot-router.service'; import { DotMessageService } from '../dot-message/dot-messages.service'; import { Injectable } from '@angular/core'; -import { LoginService, HttpCode } from '@dotcms/dotcms-js'; +import { HttpCode, LoginService } from '@dotcms/dotcms-js'; import { DotAlertConfirmService } from '../dot-alert-confirm'; import { HttpErrorResponse } from '@angular/common/http'; @@ -53,13 +53,12 @@ export class DotHttpErrorManagerService { status: err.status }; - if ( - err['error'] && - !Array.isArray(err['error']) && - this.contentletIsForbidden(err['error'].message) - ) { + const error = err.error?.errors ? err.error.errors[0] : err.error; + + if (error && this.contentletIsForbidden(this.getErrorMessage(err))) { result.status = HttpCode.FORBIDDEN; } + return of(result); } @@ -75,8 +74,8 @@ export class DotHttpErrorManagerService { private contentletIsForbidden(error: string): boolean { return ( - error.indexOf('does not have permissions READ') > -1 || - error.indexOf('User cannot edit') > -1 + error?.indexOf('does not have permissions READ') > -1 || + error?.indexOf('User cannot edit') > -1 ); } @@ -114,7 +113,7 @@ export class DotHttpErrorManagerService { private handleServerError(response: HttpErrorResponse): boolean { this.dotDialogService.alert({ message: - response.error?.message || + this.getErrorMessage(response) || this.dotMessageService.get('dot.common.http.error.500.message'), header: this.dotMessageService.get('dot.common.http.error.500.header') }); @@ -122,11 +121,10 @@ export class DotHttpErrorManagerService { } private handleBadRequestError(response: HttpErrorResponse): boolean { - const msg = - this.getErrorMessage(response) || - this.dotMessageService.get('dot.common.http.error.400.message'); this.dotDialogService.alert({ - message: msg, + message: + this.getErrorMessage(response) || + this.dotMessageService.get('dot.common.http.error.400.message'), header: this.dotMessageService.get('dot.common.http.error.400.header') }); return false; @@ -152,8 +150,8 @@ export class DotHttpErrorManagerService { private getErrorMessage(response: HttpErrorResponse): string { let msg: string; - if (Array.isArray(response['error'])) { - msg = response.error[0].message; + if (Array.isArray(response['error']) || Array.isArray(response.error?.errors)) { + msg = response.error[0]?.message || response.error?.errors[0]?.message; } else { msg = response['error'] ? response['error']['message'] : null; } diff --git a/apps/dotcms-ui/src/app/api/services/dot-menu.service.ts b/apps/dotcms-ui/src/app/api/services/dot-menu.service.ts index 619fd799b9..b6b24d569f 100644 --- a/apps/dotcms-ui/src/app/api/services/dot-menu.service.ts +++ b/apps/dotcms-ui/src/app/api/services/dot-menu.service.ts @@ -55,12 +55,12 @@ export class DotMenuService { /** * Load and set menu from endpoint - * + * @param boolean force * @returns Observable * @memberof DotMenuService */ - loadMenu(): Observable { - if (!this.menu$) { + loadMenu(force = false): Observable { + if (!this.menu$ || force) { this.menu$ = this.coreWebService .requestView({ url: this.urlMenus diff --git a/apps/dotcms-ui/src/app/portlets/dot-edit-page/content/services/dot-edit-content-html/dot-edit-content-html.service.ts b/apps/dotcms-ui/src/app/portlets/dot-edit-page/content/services/dot-edit-content-html/dot-edit-content-html.service.ts index a3952c4220..aa57652a71 100644 --- a/apps/dotcms-ui/src/app/portlets/dot-edit-page/content/services/dot-edit-content-html/dot-edit-content-html.service.ts +++ b/apps/dotcms-ui/src/app/portlets/dot-edit-page/content/services/dot-edit-content-html/dot-edit-content-html.service.ts @@ -661,7 +661,10 @@ export class DotEditContentHtmlService { if (this.updateContentletInode) { this.currentContentlet.inode = contentlet.inode; } - this.renderEditedContentlet(this.currentContentlet); + // because: https://github.com/dotCMS/core/issues/21818 + setTimeout(() => { + this.renderEditedContentlet(this.currentContentlet); + }, 1800); } }, inlineEdit: (contentlet: DotInlineEditContent) => { diff --git a/apps/dotcms-ui/src/app/portlets/shared/dot-content-types-edit/components/fields/content-type-fields-properties-form/field-properties/dot-relationships-property/dot-cardinality-selector/dot-cardinality-selector.component.html b/apps/dotcms-ui/src/app/portlets/shared/dot-content-types-edit/components/fields/content-type-fields-properties-form/field-properties/dot-relationships-property/dot-cardinality-selector/dot-cardinality-selector.component.html index b6ab4f377f..4b75150c86 100644 --- a/apps/dotcms-ui/src/app/portlets/shared/dot-content-types-edit/components/fields/content-type-fields-properties-form/field-properties/dot-relationships-property/dot-cardinality-selector/dot-cardinality-selector.component.html +++ b/apps/dotcms-ui/src/app/portlets/shared/dot-content-types-edit/components/fields/content-type-fields-properties-form/field-properties/dot-relationships-property/dot-cardinality-selector/dot-cardinality-selector.component.html @@ -1,10 +1,11 @@ diff --git a/apps/dotcms-ui/src/app/portlets/shared/dot-content-types-edit/components/fields/content-type-fields-properties-form/field-properties/dot-relationships-property/dot-cardinality-selector/dot-cardinality-selector.component.spec.ts b/apps/dotcms-ui/src/app/portlets/shared/dot-content-types-edit/components/fields/content-type-fields-properties-form/field-properties/dot-relationships-property/dot-cardinality-selector/dot-cardinality-selector.component.spec.ts index 50e7efc561..d3e2314e92 100644 --- a/apps/dotcms-ui/src/app/portlets/shared/dot-content-types-edit/components/fields/content-type-fields-properties-form/field-properties/dot-relationships-property/dot-cardinality-selector/dot-cardinality-selector.component.spec.ts +++ b/apps/dotcms-ui/src/app/portlets/shared/dot-content-types-edit/components/fields/content-type-fields-properties-form/field-properties/dot-relationships-property/dot-cardinality-selector/dot-cardinality-selector.component.spec.ts @@ -1,12 +1,11 @@ import { Component, Input, Output, EventEmitter, Injectable, DebugElement } from '@angular/core'; -import { DOTTestBed } from '@dotcms/app/test/dot-test-bed'; import { DotCardinalitySelectorComponent } from './dot-cardinality-selector.component'; import { DotMessageService } from '@services/dot-message/dot-messages.service'; import { MockDotMessageService } from '@dotcms/app/test/dot-message-service.mock'; import { DotRelationshipCardinality } from '@portlets/shared/dot-content-types-edit/components/fields/content-type-fields-properties-form/field-properties/dot-relationships-property/model/dot-relationship-cardinality.model'; import { Observable, of } from 'rxjs'; import { DotRelationshipService } from '@portlets/shared/dot-content-types-edit/components/fields/content-type-fields-properties-form/field-properties/dot-relationships-property/services/dot-relationship.service'; -import { ComponentFixture, waitForAsync } from '@angular/core/testing'; +import { ComponentFixture, TestBed } from '@angular/core/testing'; import { By } from '@angular/platform-browser'; const cardinalities: DotRelationshipCardinality[] = [ @@ -49,69 +48,55 @@ describe('DotCardinalitySelectorComponent', () => { let fixtureHostComponent: ComponentFixture; let comp: DotCardinalitySelectorComponent; let de: DebugElement; + let dropdown: DebugElement; const messageServiceMock = new MockDotMessageService({ 'contenttypes.field.properties.relationship.cardinality.placeholder': 'Select Cardinality' }); - beforeEach( - waitForAsync(() => { - DOTTestBed.configureTestingModule({ - declarations: [DotCardinalitySelectorComponent, HostTestComponent], - imports: [], - providers: [ - { provide: DotMessageService, useValue: messageServiceMock }, - { provide: DotRelationshipService, useClass: MockRelationshipService } - ] - }); - - fixtureHostComponent = DOTTestBed.createComponent(HostTestComponent); - de = fixtureHostComponent.debugElement.query(By.css('dot-cardinality-selector')); - comp = de.componentInstance; - }) - ); - - it('should have a p-dropdown with right attributes', () => { + beforeEach(() => { + TestBed.configureTestingModule({ + declarations: [DotCardinalitySelectorComponent, HostTestComponent], + imports: [], + providers: [ + { provide: DotMessageService, useValue: messageServiceMock }, + { provide: DotRelationshipService, useClass: MockRelationshipService } + ] + }).compileComponents(); + + fixtureHostComponent = TestBed.createComponent(HostTestComponent); + de = fixtureHostComponent.debugElement.query(By.css('dot-cardinality-selector')); + comp = de.componentInstance; fixtureHostComponent.detectChanges(); + dropdown = de.query(By.css('[data-testId="dropdown"]')); + }); - const dropdown = de.query(By.css('p-dropdown')); - - expect(dropdown).toBeDefined(); - - expect(dropdown.componentInstance.appendTo).toBe('body'); - expect(dropdown.componentInstance.optionLabel).toBe('label'); + it('should have a p-dropdown with right attributes', () => { + expect(dropdown.attributes.appendTo).toBe('body'); }); it('should disabled p-dropdown', () => { fixtureHostComponent.componentInstance.disabled = true; fixtureHostComponent.detectChanges(); - - const dropdown = de.query(By.css('p-dropdown')); - expect(dropdown.componentInstance.disabled).toBe(true); }); it('should load cardinalities', () => { - fixtureHostComponent.componentInstance.disabled = true; - fixtureHostComponent.detectChanges(); - - const dropdown = de.query(By.css('p-dropdown')); - - expect(comp.options).toEqual(cardinalities); - expect(dropdown.componentInstance.options.map((option) => option)).toEqual(cardinalities); + const options: Observable = + dropdown.componentInstance.options; + options.subscribe((options) => { + expect(options).toEqual(cardinalities); + }); }); it('should trigger a change event p-dropdown', (done) => { - fixtureHostComponent.detectChanges(); - comp.switch.subscribe((change) => { expect(change).toEqual(cardinalities[1].id); done(); }); - const dropdown = de.query(By.css('p-dropdown')); dropdown.triggerEventHandler('onChange', { - value: cardinalities[1] + value: cardinalities[1].id }); }); }); diff --git a/apps/dotcms-ui/src/app/portlets/shared/dot-content-types-edit/components/fields/content-type-fields-properties-form/field-properties/dot-relationships-property/dot-cardinality-selector/dot-cardinality-selector.component.ts b/apps/dotcms-ui/src/app/portlets/shared/dot-content-types-edit/components/fields/content-type-fields-properties-form/field-properties/dot-relationships-property/dot-cardinality-selector/dot-cardinality-selector.component.ts index 70920fef8c..2c591a413f 100644 --- a/apps/dotcms-ui/src/app/portlets/shared/dot-content-types-edit/components/fields/content-type-fields-properties-form/field-properties/dot-relationships-property/dot-cardinality-selector/dot-cardinality-selector.component.ts +++ b/apps/dotcms-ui/src/app/portlets/shared/dot-content-types-edit/components/fields/content-type-fields-properties-form/field-properties/dot-relationships-property/dot-cardinality-selector/dot-cardinality-selector.component.ts @@ -1,14 +1,7 @@ -import { - Component, - Input, - EventEmitter, - Output, - OnInit, - SimpleChanges, - OnChanges -} from '@angular/core'; +import { Component, Input, EventEmitter, Output, OnInit } from '@angular/core'; import { DotRelationshipCardinality } from '@portlets/shared/dot-content-types-edit/components/fields/content-type-fields-properties-form/field-properties/dot-relationships-property/model/dot-relationship-cardinality.model'; import { DotRelationshipService } from '@portlets/shared/dot-content-types-edit/components/fields/content-type-fields-properties-form/field-properties/dot-relationships-property/services/dot-relationship.service'; +import { Observable } from 'rxjs'; /** *Selector for relationships cardinalities @@ -24,7 +17,7 @@ import { DotRelationshipService } from '@portlets/shared/dot-content-types-edit/ templateUrl: './dot-cardinality-selector.component.html', styleUrls: ['./dot-cardinality-selector.component.scss'] }) -export class DotCardinalitySelectorComponent implements OnInit, OnChanges { +export class DotCardinalitySelectorComponent implements OnInit { @Input() value: number; @@ -34,39 +27,11 @@ export class DotCardinalitySelectorComponent implements OnInit, OnChanges { @Output() switch: EventEmitter = new EventEmitter(); - options: DotRelationshipCardinality[]; - - cardinality: DotRelationshipCardinality; + options: Observable; constructor(private dotRelationshipService: DotRelationshipService) {} ngOnInit() { - this.dotRelationshipService - .loadCardinalities() - .subscribe((cardinalities: DotRelationshipCardinality[]) => { - this.options = cardinalities; - - if (this.value) { - this.cardinality = this.options[this.value]; - } - }); - } - - ngOnChanges(changes: SimpleChanges): void { - if (changes.value.currentValue) { - if (this.options) { - this.cardinality = this.options[changes.value.currentValue]; - } - } - } - - /** - *Trigger a change event - * - * @param {DotRelationshipCardinality} cardinality - * @memberof DotCardinalitySelectorComponent - */ - tiggerChanged(cardinality: DotRelationshipCardinality): void { - this.switch.next(cardinality.id); + this.options = this.dotRelationshipService.loadCardinalities(); } } diff --git a/apps/dotcms-ui/src/app/portlets/shared/dot-content-types-edit/dot-content-types-edit.component.spec.ts b/apps/dotcms-ui/src/app/portlets/shared/dot-content-types-edit/dot-content-types-edit.component.spec.ts index 3be09eaf96..0e9c1892a6 100644 --- a/apps/dotcms-ui/src/app/portlets/shared/dot-content-types-edit/dot-content-types-edit.component.spec.ts +++ b/apps/dotcms-ui/src/app/portlets/shared/dot-content-types-edit/dot-content-types-edit.component.spec.ts @@ -771,6 +771,8 @@ describe('DotContentTypesEditComponent', () => { (workflow) => workflow.id ); delete replacedWorkflowsPropContentType.workflows; + delete replacedWorkflowsPropContentType.fields; + delete replacedWorkflowsPropContentType.layout; expect(crudService.putData).toHaveBeenCalledWith( 'v1/contenttype/id/1234567890', diff --git a/apps/dotcms-ui/src/app/portlets/shared/dot-content-types-edit/dot-content-types-edit.component.ts b/apps/dotcms-ui/src/app/portlets/shared/dot-content-types-edit/dot-content-types-edit.component.ts index fef2566f2f..68356cb0fc 100644 --- a/apps/dotcms-ui/src/app/portlets/shared/dot-content-types-edit/dot-content-types-edit.component.ts +++ b/apps/dotcms-ui/src/app/portlets/shared/dot-content-types-edit/dot-content-types-edit.component.ts @@ -132,6 +132,9 @@ export class DotContentTypesEditComponent implements OnInit, OnDestroy { */ editContentTypeName(name: string): void { const updatedContentType = { ...this.data, name }; + delete updatedContentType.layout; + delete updatedContentType.fields; + this.updateContentType(updatedContentType); } diff --git a/apps/dotcms-ui/src/app/portlets/shared/dot-content-types-listing/components/dot-add-to-menu/dot-add-to-menu.component.spec.ts b/apps/dotcms-ui/src/app/portlets/shared/dot-content-types-listing/components/dot-add-to-menu/dot-add-to-menu.component.spec.ts index 7d2275b6ed..fa1127ce8a 100644 --- a/apps/dotcms-ui/src/app/portlets/shared/dot-content-types-listing/components/dot-add-to-menu/dot-add-to-menu.component.spec.ts +++ b/apps/dotcms-ui/src/app/portlets/shared/dot-content-types-listing/components/dot-add-to-menu/dot-add-to-menu.component.spec.ts @@ -68,6 +68,7 @@ describe('DotAddToMenuComponent', () => { let de: DebugElement; let dotdialog: DebugElement; let dotAddToMenuService: DotAddToMenuService; + let dotMenuService: DotMenuService; const messageServiceMock = new MockDotMessageService({ 'contenttypes.content.add_to_menu.header': 'Add to Menu', @@ -106,8 +107,10 @@ describe('DotAddToMenuComponent', () => { de = fixture.debugElement.query(By.css('dot-add-to-menu')); component = de.componentInstance; dotAddToMenuService = TestBed.inject(DotAddToMenuService); + dotMenuService = TestBed.inject(DotMenuService); dotdialog = de.query(By.css('dot-dialog')); + spyOn(dotMenuService, 'loadMenu').and.callThrough(); fixture.detectChanges(); }); @@ -159,6 +162,7 @@ describe('DotAddToMenuComponent', () => { expect(component.form.get('menuOption').value).toEqual('123'); expect(component.form.get('title').value).toEqual(contentTypeVar.name); expect(component.form.valid).toEqual(true); + expect(dotMenuService.loadMenu).toHaveBeenCalledWith(true); }); it('should invalidate form and set Add button disabled, when name empty', () => { @@ -188,10 +192,11 @@ describe('DotAddToMenuComponent', () => { contentTypes: contentTypeVar.variable, dataViewMode: 'list' }); - expect(dotAddToMenuService.addToLayout).toHaveBeenCalledWith( - 'Nuevo', - component.form.get('menuOption').value - ); + expect(dotAddToMenuService.addToLayout).toHaveBeenCalledWith({ + portletName: 'Nuevo', + dataViewMode: 'list', + layoutId: component.form.get('menuOption').value + }); expect(component.cancel.emit).toHaveBeenCalledTimes(1); }); diff --git a/apps/dotcms-ui/src/app/portlets/shared/dot-content-types-listing/components/dot-add-to-menu/dot-add-to-menu.component.ts b/apps/dotcms-ui/src/app/portlets/shared/dot-content-types-listing/components/dot-add-to-menu/dot-add-to-menu.component.ts index f9da09cd53..3a6978f59f 100644 --- a/apps/dotcms-ui/src/app/portlets/shared/dot-content-types-listing/components/dot-add-to-menu/dot-add-to-menu.component.ts +++ b/apps/dotcms-ui/src/app/portlets/shared/dot-content-types-listing/components/dot-add-to-menu/dot-add-to-menu.component.ts @@ -49,8 +49,7 @@ export class DotAddToMenuComponent implements OnInit, OnDestroy { ngOnInit() { this.initForm(); this.setDialogConfig(this.form); - - this.menu$ = this.dotMenuService.loadMenu().pipe( + this.menu$ = this.dotMenuService.loadMenu(true).pipe( take(1), tap((menu: DotMenu[]) => { this.form.patchValue({ @@ -91,7 +90,11 @@ export class DotAddToMenuComponent implements OnInit, OnDestroy { take(1), switchMap(() => { return this.dotAddToMenuService - .addToLayout(params.portletName, this.form.get('menuOption').value) + .addToLayout({ + portletName: params.portletName, + dataViewMode: this.form.get('defaultView').value, + layoutId: this.form.get('menuOption').value + }) .pipe(take(1)); }) ) diff --git a/apps/dotcms-ui/src/app/portlets/shared/dot-content-types-listing/dot-content-types.component.spec.ts b/apps/dotcms-ui/src/app/portlets/shared/dot-content-types-listing/dot-content-types.component.spec.ts index f179a320ea..7a0937ee5c 100644 --- a/apps/dotcms-ui/src/app/portlets/shared/dot-content-types-listing/dot-content-types.component.spec.ts +++ b/apps/dotcms-ui/src/app/portlets/shared/dot-content-types-listing/dot-content-types.component.spec.ts @@ -468,6 +468,14 @@ describe('DotContentTypesPortletComponent', () => { expect(shouldShow).toBeFalsy(); }); + it('should not show Add To Menu option if content type is HOST', () => { + fixture.detectChanges(); + const shouldShow = comp.rowActions[ADD_TO_MENU_INDEX].shouldShow({ + variable: 'Host' + }); + expect(shouldShow).toBeFalsy(); + }); + it('should show Add to Menu option', () => { fixture.detectChanges(); expect(comp.rowActions[ADD_TO_MENU_INDEX].menuItem.label).toBe('Add to Menu'); diff --git a/apps/dotcms-ui/src/app/portlets/shared/dot-content-types-listing/dot-content-types.component.ts b/apps/dotcms-ui/src/app/portlets/shared/dot-content-types-listing/dot-content-types.component.ts index aa8dc3407d..c40867cc18 100644 --- a/apps/dotcms-ui/src/app/portlets/shared/dot-content-types-listing/dot-content-types.component.ts +++ b/apps/dotcms-ui/src/app/portlets/shared/dot-content-types-listing/dot-content-types.component.ts @@ -220,6 +220,9 @@ export class DotContentTypesPortletComponent implements OnInit, OnDestroy { menuItem: { label: this.dotMessageService.get('contenttypes.content.add_to_menu'), command: (item: DotCMSContentType) => this.addToBundleMenu(item) + }, + shouldShow: (item: Record) => { + return item.variable !== 'Host'; } }); } diff --git a/apps/dotcms-ui/src/app/view/components/dot-navigation/services/dot-navigation.service.spec.ts b/apps/dotcms-ui/src/app/view/components/dot-navigation/services/dot-navigation.service.spec.ts index 36478bdfe5..3a8979de77 100644 --- a/apps/dotcms-ui/src/app/view/components/dot-navigation/services/dot-navigation.service.spec.ts +++ b/apps/dotcms-ui/src/app/view/components/dot-navigation/services/dot-navigation.service.spec.ts @@ -54,7 +54,7 @@ class RouterMock { } } export class DotMenuServiceMock { - loadMenu(): Observable { + loadMenu(_force?: boolean): Observable { return of([ { ...dotMenuMock(), diff --git a/apps/dotcms-ui/src/app/view/components/dot-toolbar/components/dot-my-account/dot-my-account.component.html b/apps/dotcms-ui/src/app/view/components/dot-toolbar/components/dot-my-account/dot-my-account.component.html index ece9f844bb..0bad84d5ce 100644 --- a/apps/dotcms-ui/src/app/view/components/dot-toolbar/components/dot-my-account/dot-my-account.component.html +++ b/apps/dotcms-ui/src/app/view/components/dot-toolbar/components/dot-my-account/dot-my-account.component.html @@ -3,14 +3,8 @@ [(visible)]="visible" [actions]="dialogActions" (hide)="shutdown.emit()" + [isSaving]="isSaving$ | async" > -
-