Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat(edit-page-2): Allow drag and drop functionality for images in dotcms #28249

Merged
Show file tree
Hide file tree
Changes from 39 commits
Commits
Show all changes
56 commits
Select commit Hold shift + click to select a range
fc0cbd9
wip
zJaaal Apr 16, 2024
c1589e6
move drag item to the store
zJaaal Apr 16, 2024
a82a5a2
Update edit-ema-editor.component.ts
zJaaal Apr 16, 2024
21aa7a5
unify drag and drop
zJaaal Apr 16, 2024
fcc7489
Merge branch 'master' into 28039-edit-page-v2-allow-drag-and-drop-fun…
zJaaal Apr 16, 2024
d9175a7
now we can drop images
zJaaal Apr 16, 2024
d0605f5
Merge branch 'master' into 28039-edit-page-v2-allow-drag-and-drop-fun…
zJaaal Apr 16, 2024
77c0656
Merge branch '28039-edit-page-v2-allow-drag-and-drop-functionality-fo…
zJaaal Apr 16, 2024
6583f45
code cleaning
zJaaal Apr 16, 2024
c056eba
Merge branch 'master' into 28039-edit-page-v2-allow-drag-and-drop-fun…
zJaaal Apr 16, 2024
2de732c
Merge branch 'master' into 28039-edit-page-v2-allow-drag-and-drop-fun…
zJaaal Apr 16, 2024
a85580c
Merge branch 'master' into 28039-edit-page-v2-allow-drag-and-drop-fun…
zJaaal Apr 16, 2024
90494ed
Merge branch 'master' into 28039-edit-page-v2-allow-drag-and-drop-fun…
zJaaal Apr 16, 2024
65cede0
Merge branch 'master' into 28039-edit-page-v2-allow-drag-and-drop-fun…
zJaaal Apr 17, 2024
0cb96e4
Merge branch 'master' into 28039-edit-page-v2-allow-drag-and-drop-fun…
zJaaal Apr 17, 2024
41d6e64
merge conflicts
zJaaal Apr 17, 2024
1ff5902
merge
zJaaal Apr 17, 2024
f621fd7
Merge branch 'master' into 28039-edit-page-v2-allow-drag-and-drop-fun…
zJaaal Apr 17, 2024
71897b6
handle drop on the editor and handle file dropping
zJaaal Apr 17, 2024
d99dfd7
fix dropzone bug
zJaaal Apr 17, 2024
002ce28
Merge branch 'master' into 28039-edit-page-v2-allow-drag-and-drop-fun…
zJaaal Apr 17, 2024
e49c7c4
partial fix of a bug
zJaaal Apr 17, 2024
b16faa7
potential fix for the out of bounds bug
zJaaal Apr 18, 2024
0dc3a55
Merge branch 'master' into 28039-edit-page-v2-allow-drag-and-drop-fun…
zJaaal Apr 19, 2024
6c1b47a
Merge branch '28039-edit-page-v2-allow-drag-and-drop-functionality-fo…
zJaaal Apr 19, 2024
61edb39
clean state on mouse over and no dragItem
zJaaal Apr 19, 2024
3956b5f
was not the fix
zJaaal Apr 19, 2024
d3628bd
error handling
zJaaal Apr 19, 2024
dc216fa
fix dropzone tests
zJaaal Apr 19, 2024
f0a343d
fix palette and tools tests
zJaaal Apr 19, 2024
3eff7bb
Merge branch 'master' into 28039-edit-page-v2-allow-drag-and-drop-fun…
zJaaal Apr 22, 2024
6db9826
add test cases first part
zJaaal Apr 22, 2024
c8b131a
fix broken test
zJaaal Apr 22, 2024
9c083ac
Merge branch 'master' into 28039-edit-page-v2-allow-drag-and-drop-fun…
zJaaal Apr 22, 2024
1ffb1bd
add test cases part 2
zJaaal Apr 22, 2024
2a5d8ae
add rest of test cases
zJaaal Apr 22, 2024
b40ffdc
Merge branch 'master' into 28039-edit-page-v2-allow-drag-and-drop-fun…
zJaaal Apr 22, 2024
049dff1
Merge branch 'master' into 28039-edit-page-v2-allow-drag-and-drop-fun…
zJaaal Apr 22, 2024
284fe07
Merge branch 'master' into 28039-edit-page-v2-allow-drag-and-drop-fun…
zJaaal Apr 23, 2024
bc1f289
small refactor to avoid double calculations
zJaaal Apr 23, 2024
09099d5
optimize ngFor
zJaaal Apr 23, 2024
a9eda11
Merge branch 'master' into 28039-edit-page-v2-allow-drag-and-drop-fun…
zJaaal Apr 23, 2024
86450ad
Merge branch 'master' into 28039-edit-page-v2-allow-drag-and-drop-fun…
zJaaal Apr 23, 2024
0179f11
feedback
zJaaal Apr 23, 2024
a9e591e
feedback
zJaaal Apr 23, 2024
98fc245
fix sonarqube
zJaaal Apr 23, 2024
fc82c6b
Merge branch 'master' into 28039-edit-page-v2-allow-drag-and-drop-fun…
zJaaal Apr 23, 2024
96177da
Merge branch 'master' into 28039-edit-page-v2-allow-drag-and-drop-fun…
zJaaal Apr 24, 2024
864c5ff
Merge branch 'master' into 28039-edit-page-v2-allow-drag-and-drop-fun…
zJaaal Apr 24, 2024
d6e8f7c
feedback
zJaaal Apr 24, 2024
d70e7bf
Merge branch 'master' into 28039-edit-page-v2-allow-drag-and-drop-fun…
zJaaal Apr 24, 2024
d238ee2
Merge branch 'master' into 28039-edit-page-v2-allow-drag-and-drop-fun…
zJaaal Apr 24, 2024
ba43b8d
Merge branch 'master' into 28039-edit-page-v2-allow-drag-and-drop-fun…
zJaaal Apr 26, 2024
81629f4
Merge branch 'master' into 28039-edit-page-v2-allow-drag-and-drop-fun…
zJaaal Apr 26, 2024
d860721
fix after merge
zJaaal Apr 26, 2024
f7d6c90
Merge branch 'master' into 28039-edit-page-v2-allow-drag-and-drop-fun…
zJaaal Apr 29, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,8 @@ import {

import {
Container,
ContentletArea
ContentletArea,
EmaDragItem
} from '../../edit-ema-editor/components/ema-page-dropzone/types';
import {
DotPageApiParams,
Expand Down Expand Up @@ -96,6 +97,7 @@ export class EditEmaStore extends ComponentStore<EditEmaState> {
*******************/

readonly clientHost$ = this.select((state) => state.clientHost);
readonly dragItem$ = this.select((state) => state.dragItem);

private readonly stateLoad$ = this.select((state) => state.editorState);
private readonly code$ = this.select((state) => state.editor.page.rendered);
Expand Down Expand Up @@ -217,6 +219,7 @@ export class EditEmaStore extends ComponentStore<EditEmaState> {
this.iframeURL$,
this.isEnterpriseLicense$,
this.pageURL$,
this.dragItem$,
(
bounds,
clientHost,
Expand All @@ -228,7 +231,8 @@ export class EditEmaStore extends ComponentStore<EditEmaState> {
favoritePageURL,
iframeURL,
isEnterpriseLicense,
pageURL
pageURL,
dragItem
) => {
return {
apiURL: `${window.location.origin}/api/v1/page/json/${pageURL}`,
Expand All @@ -247,7 +251,8 @@ export class EditEmaStore extends ComponentStore<EditEmaState> {
favoritePageURL,
iframeURL,
isEnterpriseLicense,
state: currentState
state: currentState,
dragItem
};
}
);
Expand Down Expand Up @@ -297,6 +302,11 @@ export class EditEmaStore extends ComponentStore<EditEmaState> {
}
);

readonly dragState$ = this.select(this.stateLoad$, this.dragItem$, (editorState, dragItem) => ({
editorState,
dragItem
}));

/**
* Concurrently loads page and license data to updat the state.
*
Expand Down Expand Up @@ -585,6 +595,23 @@ export class EditEmaStore extends ComponentStore<EditEmaState> {
);
});

readonly setDragItem = this.updater((state, dragItem: EmaDragItem) => {
return {
...state,
dragItem,
editorState: EDITOR_STATE.DRAGGING
};
});

readonly resetDragProperties = this.updater((state) => {
return {
...state,
dragItem: undefined,
bounds: [],
contentletArea: undefined
};
});

private createPageURL(state: EditEmaState): string {
const params = {
url: state.editor.page.pageURI,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,15 +24,15 @@
*ngFor="let contenttype of contentTypes; let i = index"
zJaaal marked this conversation as resolved.
Show resolved Hide resolved
[attr.data-item]="
{
variable: contenttype.variable,
name: contenttype.name,
contentType: contenttype.variable,
baseType: contenttype.baseType
contentType: {
variable: contenttype.variable,
name: contenttype.name,
baseType: contenttype.baseType,
},
move: false
zJaaal marked this conversation as resolved.
Show resolved Hide resolved
} | json
"
[attr.data-testId]="'content-type-' + i"
(dragstart)="dragStart.emit($event)"
(dragend)="dragEnd.emit($event)"
zJaaal marked this conversation as resolved.
Show resolved Hide resolved
data-type="content-type"
draggable="true">
<button
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -50,40 +50,6 @@ describe('EditEmaPaletteContentTypeComponent', () => {
});
});

it('should emit dragStart event on drag start', () => {
const dragSpy = jest.spyOn(spectator.component.dragStart, 'emit');

spectator.triggerEventHandler('[data-testId="content-type-0"]', 'dragstart', {
variable: 'test',
name: 'Test',
contentType: 'test',
baseType: 'CONTENT'
});
expect(dragSpy).toHaveBeenCalledWith({
variable: 'test',
name: 'Test',
contentType: 'test',
baseType: 'CONTENT'
});
});

it('should emit dragEnd event on drag end', () => {
const dragSpy = jest.spyOn(spectator.component.dragEnd, 'emit');

spectator.triggerEventHandler('[data-testId="content-type-0"]', 'dragend', {
variable: 'test',
name: 'Test',
contentType: 'test',
baseType: 'CONTENT'
});
expect(dragSpy).toHaveBeenCalledWith({
variable: 'test',
name: 'Test',
contentType: 'test',
baseType: 'CONTENT'
});
});

it('should emit showContentlets event with contentTypeName', () => {
const spy = jest.spyOn(spectator.component.showContentlets, 'emit');
spectator.click('[data-testId="content-type-0-button-go-content"]');
Expand All @@ -98,10 +64,12 @@ describe('EditEmaPaletteContentTypeComponent', () => {
expect(spectator.query('[data-testId="content-type-0"]')).not.toBeNull();
expect(spectator.query('[data-testId="content-type-0"]')).toHaveAttribute('data-item');
expect(data).toEqual({
variable: 'Test1',
name: 'Test Content Type',
contentType: 'Test1',
baseType: 'CONTENT'
contentType: {
variable: 'Test1',
name: 'Test Content Type',
baseType: 'CONTENT'
},
move: false
});
});

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -42,8 +42,6 @@ export class EditEmaPaletteContentTypeComponent implements OnInit, OnDestroy {
@Input() filter = '';
@Input() paletteStatus: EditEmaPaletteStoreStatus;

@Output() dragStart = new EventEmitter();
@Output() dragEnd = new EventEmitter();
zJaaal marked this conversation as resolved.
Show resolved Hide resolved
@Output() showContentlets = new EventEmitter<string>();
@Output() search = new EventEmitter<string>();

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -32,14 +32,17 @@
*ngFor="let contentlet of contentlets.items; let i = index"
[attr.data-item]="
{
contentlet: { identifier: contentlet.identifier },
contentType: contentlet?.contentType,
baseType: contentlet.baseType
contentlet: {
identifier: contentlet.identifier,
contentType: contentlet.contentType,
baseType: contentlet.baseType,
inode: contentlet.inode,
title: contentlet.title
},
zJaaal marked this conversation as resolved.
Show resolved Hide resolved
move: false
} | json
"
[attr.data-testId]="'contentlet-' + i"
(dragstart)="dragStart.emit($event)"
(dragend)="dragEnd.emit($event)"
data-type="contentlet"
draggable="true">
<dot-icon [size]="20" name="drag_indicator"></dot-icon>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -46,24 +46,6 @@ describe('EditEmaPaletteContentletsComponent', () => {
});
});

it('should emit dragStart event on drag start', () => {
const dragSpy = jest.spyOn(spectator.component.dragStart, 'emit');
spectator.triggerEventHandler('[data-testId="contentlet-0"]', 'dragstart', {
identifier: '123',
contentType: 'Activity'
});
expect(dragSpy).toHaveBeenCalledWith({ identifier: '123', contentType: 'Activity' });
});

it('should emit dragEnd event on drag end', () => {
const dragSpy = jest.spyOn(spectator.component.dragEnd, 'emit');
spectator.triggerEventHandler('[data-testId="contentlet-0"]', 'dragend', {
identifier: '123',
contentType: 'Activity'
});
expect(dragSpy).toHaveBeenCalledWith({ identifier: '123', contentType: 'Activity' });
});

it('should emit showContentTypes event on backToContentTypes', () => {
const spy = jest.spyOn(spectator.component.showContentTypes, 'emit');
const button = spectator.query(byTestId('contentlet-back-button'));
Expand All @@ -87,10 +69,13 @@ describe('EditEmaPaletteContentletsComponent', () => {
expect(spectator.query('[data-testId="contentlet-0"]')).toHaveAttribute('data-item');
expect(data).toEqual({
contentlet: {
identifier: CONTENTLETS_MOCK[0].identifier
identifier: CONTENTLETS_MOCK[0].identifier,
contentType: CONTENTLETS_MOCK[0].contentType,
baseType: CONTENTLETS_MOCK[0].baseType,
title: CONTENTLETS_MOCK[0].title,
inode: CONTENTLETS_MOCK[0].inode
},
contentType: CONTENTLETS_MOCK[0].contentType,
baseType: CONTENTLETS_MOCK[0].baseType
move: false
});
});

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -47,8 +47,6 @@ export class EditEmaPaletteContentletsComponent implements OnInit, OnDestroy {
@Input() contentlets;
@Input() paletteStatus: EditEmaPaletteStoreStatus;

@Output() dragStart = new EventEmitter();
@Output() dragEnd = new EventEmitter();
zJaaal marked this conversation as resolved.
Show resolved Hide resolved
@Output() paginate = new EventEmitter();
@Output() showContentTypes = new EventEmitter();
@Output() search = new EventEmitter<string>();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,17 +5,13 @@
[filter]="vm.contenttypes.filter"
[paletteStatus]="vm.status"
(search)="loadContentTypes($event, vm.allowedTypes)"
(showContentlets)="showContentletsFromContentType($event)"
(dragStart)="onDragStart($event)"
(dragEnd)="onDragEnd($event)" />
(showContentlets)="showContentletsFromContentType($event)" />

<dot-edit-ema-palette-contentlets
*ngIf="vm.currentPaletteType === PALETTE_TYPES_ENUM.CONTENTLET"
[contentlets]="vm.contentlets"
[paletteStatus]="vm.status"
(paginate)="onPaginate($event)"
(search)="loadContentlets($event, vm.currentContentType)"
(showContentTypes)="showContentTypes()"
(dragStart)="onDragStart($event)"
(dragEnd)="onDragEnd($event)" />
(showContentTypes)="showContentTypes()" />
</ng-container>
Original file line number Diff line number Diff line change
Expand Up @@ -224,33 +224,6 @@ describe('EditEmaPaletteComponent', () => {
expect(spectator.query(EditEmaPaletteContentletsComponent)).toBeNull();
});

it('should emit dragStart event on drag start', () => {
const dragSpy = jest.spyOn(spectator.component.dragStart, 'emit');

spectator.triggerEventHandler(EditEmaPaletteContentTypeComponent, 'dragStart', {
variable: 'test',
name: 'Test'
});

expect(dragSpy).toHaveBeenCalledWith({
variable: 'test',
name: 'Test'
});
});

it('should emit dragEnd event on drag end', () => {
const dragSpy = jest.spyOn(spectator.component.dragEnd, 'emit');

spectator.triggerEventHandler(EditEmaPaletteContentTypeComponent, 'dragEnd', {
variable: 'test',
name: 'Test'
});
expect(dragSpy).toHaveBeenCalledWith({
variable: 'test',
name: 'Test'
});
});

it('should show contentlets from content type', () => {
const storeSpy = jest.spyOn(store, 'loadContentlets');
spectator.triggerEventHandler(
Expand Down Expand Up @@ -332,27 +305,5 @@ describe('EditEmaPaletteComponent', () => {

expect(resetContentLetsSpy).toHaveBeenCalled();
});

it('should emit dragStart event on drag start', () => {
const dragSpy = jest.spyOn(spectator.component.dragStart, 'emit');

spectator.triggerEventHandler(EditEmaPaletteContentletsComponent, 'dragStart', {
inode: '123'
});
expect(dragSpy).toHaveBeenCalledWith({
inode: '123'
});
});

it('should emit dragEnd event on drag end', () => {
const dragSpy = jest.spyOn(spectator.component.dragEnd, 'emit');

spectator.triggerEventHandler(EditEmaPaletteContentletsComponent, 'dragEnd', {
inode: '123'
});
expect(dragSpy).toHaveBeenCalledWith({
inode: '123'
});
});
});
});
zJaaal marked this conversation as resolved.
Show resolved Hide resolved
Original file line number Diff line number Diff line change
Expand Up @@ -4,11 +4,9 @@ import { AsyncPipe, NgIf } from '@angular/common';
import {
ChangeDetectionStrategy,
Component,
EventEmitter,
Input,
OnDestroy,
OnInit,
Output,
inject
} from '@angular/core';

Expand Down Expand Up @@ -37,9 +35,6 @@ export class EditEmaPaletteComponent implements OnInit, OnDestroy {
@Input() languageId: number;
@Input() containers: DotPageContainerStructure;

@Output() dragStart = new EventEmitter();
@Output() dragEnd = new EventEmitter();

private readonly store = inject(DotPaletteStore);
private destroy$ = new Subject<void>();

Expand All @@ -51,22 +46,6 @@ export class EditEmaPaletteComponent implements OnInit, OnDestroy {
this.store.loadAllowedContentTypes({ containers: this.containers });
}

/**
* Event handler for the drag start event.
* @param event The drag event.
*/
onDragStart(event: DragEvent) {
this.dragStart.emit(event);
}

/**
* Handles the drag end event.
* @param event The drag event.
*/
onDragEnd(event: DragEvent) {
this.dragEnd.emit(event);
}

/**
* Shows contentlets from a specific content type.
*
Expand Down