Skip to content
This repository has been archived by the owner on Dec 16, 2024. It is now read-only.

Commit

Permalink
Merge release 22.06 to master (#1999)
Browse files Browse the repository at this point in the history
* 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 <[email protected]>
Co-authored-by: victoralfaro-dotcms <[email protected]>
Co-authored-by: Humberto Morera <[email protected]>
Co-authored-by: alfredo-dotcms <[email protected]>
  • Loading branch information
5 people authored May 27, 2022
1 parent b5d8ca9 commit 8f65568
Show file tree
Hide file tree
Showing 21 changed files with 345 additions and 181 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -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'
});
Expand Down Expand Up @@ -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');
});
Expand All @@ -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);
});
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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
Expand All @@ -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<string>
* @memberof DotAddToMenuService
Expand All @@ -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`
Expand All @@ -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<string>
* @memberof DotAddToMenuService
*/
addToLayout(portletName: string, layoutId: string): Observable<string> {
const portletId = this.cleanUpPorletId(portletName);
addToLayout(params: DotCustomToolToLayout): Observable<string> {
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'),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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');

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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';
Expand Down Expand Up @@ -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);
}

Expand All @@ -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
);
}

Expand Down Expand Up @@ -114,19 +113,18 @@ 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')
});
return false;
}

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;
Expand All @@ -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;
}
Expand Down
6 changes: 3 additions & 3 deletions apps/dotcms-ui/src/app/api/services/dot-menu.service.ts
Original file line number Diff line number Diff line change
Expand Up @@ -55,12 +55,12 @@ export class DotMenuService {

/**
* Load and set menu from endpoint
*
* @param boolean force
* @returns Observable<DotMenu[]>
* @memberof DotMenuService
*/
loadMenu(): Observable<DotMenu[]> {
if (!this.menu$) {
loadMenu(force = false): Observable<DotMenu[]> {
if (!this.menu$ || force) {
this.menu$ = this.coreWebService
.requestView({
url: this.urlMenus
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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) => {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,10 +1,11 @@
<p-dropdown
(onChange)="tiggerChanged($event.value)"
[(ngModel)]="cardinality"
(onChange)="switch.emit($event.value)"
data-testId="dropdown"
[ngModel]="value"
[disabled]="disabled"
[options]="options"
optionValue="id"
[options]="options | async"
[style]="{ width: '100%' }"
appendTo="body"
optionLabel="label"
>
</p-dropdown>
Original file line number Diff line number Diff line change
@@ -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[] = [
Expand Down Expand Up @@ -49,69 +48,55 @@ describe('DotCardinalitySelectorComponent', () => {
let fixtureHostComponent: ComponentFixture<HostTestComponent>;
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<DotRelationshipCardinality[]> =
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
});
});
});
Loading

0 comments on commit 8f65568

Please sign in to comment.