[AAE-3410] Restrict breadcrumb if upload widget type set to Alfresco Content (#6220)

* [AAE-3410] Restricted Breadcrumb navigation when upload widget type set to only ACS

* * Added/Modified unit tests to the recent changes

* Fixed failing UT

* * Updated contentNodeSelectorPanel doc

* * After rebase
This commit is contained in:
siva kumar
2020-10-12 16:58:29 +05:30
committed by GitHub
parent 2b23edd0bd
commit 40b5822e62
5 changed files with 72 additions and 13 deletions

View File

@@ -52,6 +52,7 @@ Opens a [Content Node Selector](content-node-selector.component.md) in its own
| ---------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------- | | ---------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------- |
| navigationChange | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`<`[`NodeEntryEvent`](../../../lib/content-services/src/lib/document-list/components/node.event.ts)`>` | Emitted when the navigation changes. | | navigationChange | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`<`[`NodeEntryEvent`](../../../lib/content-services/src/lib/document-list/components/node.event.ts)`>` | Emitted when the navigation changes. |
| select | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`<`[`Node`](https://github.com/Alfresco/alfresco-js-api/blob/develop/src/api/content-rest-api/docs/Node.md)`[]>` | Emitted when the user has chosen an item. | | select | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`<`[`Node`](https://github.com/Alfresco/alfresco-js-api/blob/develop/src/api/content-rest-api/docs/Node.md)`[]>` | Emitted when the user has chosen an item. |
| showingSearch | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`<boolean>` | Emitted when search is running. |
| siteChange | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`<string>` | Emitted when the select site changes. | | siteChange | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`<string>` | Emitted when the select site changes. |
## Details ## Details

View File

@@ -212,7 +212,7 @@ export class ContentNodeSelectorPanelComponent implements OnInit, OnDestroy {
@Output() @Output()
siteChange: EventEmitter<string> = new EventEmitter<string>(); siteChange: EventEmitter<string> = new EventEmitter<string>();
/** Emitted on search input. */ /** Emitted when search is running. */
@Output() @Output()
showingSearch: EventEmitter<boolean> = new EventEmitter<boolean>(); showingSearch: EventEmitter<boolean> = new EventEmitter<boolean>();

View File

@@ -376,7 +376,7 @@ describe('AttachFileCloudWidgetComponent', () => {
fixture.detectChanges(); fixture.detectChanges();
expect(widget.rootNodeId).toEqual('-root-'); expect(widget.rootNodeId).toEqual('-root-');
expect(openUploadFileDialogSpy).toHaveBeenCalledWith('-root-', 'single', true); expect(openUploadFileDialogSpy).toHaveBeenCalledWith('-root-', 'single', true, true);
}); });
it('Should set default user alias (-my-) as rootNodeId if destinationFolderPath contains wrong alias and single upload for Alfresco Content + Locale', async () => { it('Should set default user alias (-my-) as rootNodeId if destinationFolderPath contains wrong alias and single upload for Alfresco Content + Locale', async () => {
@@ -398,7 +398,7 @@ describe('AttachFileCloudWidgetComponent', () => {
fixture.detectChanges(); fixture.detectChanges();
expect(widget.rootNodeId).toEqual('-my-'); expect(widget.rootNodeId).toEqual('-my-');
expect(openUploadFileDialogSpy).toHaveBeenCalledWith('-my-', 'single', true); expect(openUploadFileDialogSpy).toHaveBeenCalledWith('-my-', 'single', true, true);
}); });
it('Should set default user alias (-my-) as rootNodeId if destinationFolderPath contains wrong alias and multiple upload for Alfresco Content + Locale', async () => { it('Should set default user alias (-my-) as rootNodeId if destinationFolderPath contains wrong alias and multiple upload for Alfresco Content + Locale', async () => {
@@ -420,7 +420,7 @@ describe('AttachFileCloudWidgetComponent', () => {
fixture.detectChanges(); fixture.detectChanges();
expect(widget.rootNodeId).toEqual('-my-'); expect(widget.rootNodeId).toEqual('-my-');
expect(openUploadFileDialogSpy).toHaveBeenCalledWith('-my-', 'multiple', true); expect(openUploadFileDialogSpy).toHaveBeenCalledWith('-my-', 'multiple', true, true);
}); });
it('Should set default user alias (-my-) as rootNodeId if destinationFolderPath does not have alias for Alfresco Content + Locale', async () => { it('Should set default user alias (-my-) as rootNodeId if destinationFolderPath does not have alias for Alfresco Content + Locale', async () => {
@@ -442,7 +442,7 @@ describe('AttachFileCloudWidgetComponent', () => {
fixture.detectChanges(); fixture.detectChanges();
expect(widget.rootNodeId).toEqual('-my-'); expect(widget.rootNodeId).toEqual('-my-');
expect(openUploadFileDialogSpy).toHaveBeenCalledWith('-my-', 'multiple', true); expect(openUploadFileDialogSpy).toHaveBeenCalledWith('-my-', 'multiple', true, true);
}); });
it('should return the application name in case -appname- placeholder is present', async() => { it('should return the application name in case -appname- placeholder is present', async() => {
@@ -461,7 +461,8 @@ describe('AttachFileCloudWidgetComponent', () => {
}); });
describe('FilesSource', () => { describe('FilesSource', () => {
it('Should set default user alias (-my-) as rootNodeId if fileSource set only to Alfresco Content', async () => { it('Should be able to fetch nodeId of default user alias (-my-) if fileSource set only to Alfresco Content', async () => {
const fetchNodeIdFromRelativePathSpy = spyOn(contentCloudNodeSelectorService, 'fetchNodeIdFromRelativePath').and.returnValue(mockNodeId);
widget.field = new FormFieldModel(new FormModel(), { widget.field = new FormFieldModel(new FormModel(), {
type: FormFieldTypes.UPLOAD, type: FormFieldTypes.UPLOAD,
value: [] value: []
@@ -478,8 +479,61 @@ describe('AttachFileCloudWidgetComponent', () => {
await fixture.whenStable(); await fixture.whenStable();
fixture.detectChanges(); fixture.detectChanges();
const alias = '-my-';
const opt = { relativePath: '' };
expect(fetchNodeIdFromRelativePathSpy).toHaveBeenCalledWith(alias, opt);
expect(widget.rootNodeId).toEqual('mock-node-id');
expect(openUploadFileDialogSpy).toHaveBeenCalledWith('mock-node-id', 'single', false, true);
});
it('Should be able to fetch nodeId of default user alias (-my-) if fileSource set to multiple upload for Alfresco Content', async () => {
const fetchNodeIdFromRelativePathSpy = spyOn(contentCloudNodeSelectorService, 'fetchNodeIdFromRelativePath').and.returnValue(mockNodeId);
widget.field = new FormFieldModel(new FormModel(), {
type: FormFieldTypes.UPLOAD,
value: []
});
widget.field.id = 'attach-file-alfresco';
widget.field.params = <FormFieldMetadata> contentSourceParam;
widget.field.params.multiple = true;
fixture.detectChanges();
await fixture.whenStable();
const attachButton: HTMLButtonElement = element.querySelector('#attach-file-alfresco');
expect(attachButton).not.toBeNull();
attachButton.click();
await fixture.whenStable();
fixture.detectChanges();
const alias = '-my-';
const opt = { relativePath: '' };
expect(fetchNodeIdFromRelativePathSpy).toHaveBeenCalledWith(alias, opt);
expect(widget.rootNodeId).toEqual('mock-node-id');
expect(openUploadFileDialogSpy).toHaveBeenCalledWith('mock-node-id', 'multiple', false, true);
});
it('Should be able to set default user alias (-my-) as rootNodeId if the nodeId of the alias is not fetched from the api', async () => {
widget.field = new FormFieldModel(new FormModel(), {
type: FormFieldTypes.UPLOAD,
value: []
});
widget.field.id = 'attach-file-alfresco';
widget.field.params = <FormFieldMetadata> contentSourceParam;
widget.field.params.multiple = false;
fixture.detectChanges();
await fixture.whenStable();
const attachButton: HTMLButtonElement = element.querySelector('#attach-file-alfresco');
expect(attachButton).not.toBeNull();
attachButton.click();
await fixture.whenStable();
fixture.detectChanges();
expect(widget.rootNodeId).toEqual('-my-'); expect(widget.rootNodeId).toEqual('-my-');
expect(openUploadFileDialogSpy).toHaveBeenCalledWith('-my-', 'single', false); expect(openUploadFileDialogSpy).toHaveBeenCalledWith('-my-', 'single', false, true);
}); });
it('should display tooltip when tooltip is set', async(() => { it('should display tooltip when tooltip is set', async(() => {
@@ -552,6 +606,7 @@ describe('AttachFileCloudWidgetComponent', () => {
describe('when a file is uploaded', () => { describe('when a file is uploaded', () => {
beforeEach(async () => { beforeEach(async () => {
apiServiceSpy = spyOn(alfrescoApiService.getInstance().node, 'getNode').and.returnValue(new Promise(resolve => resolve({entry: fakeNodeWithProperties}))); apiServiceSpy = spyOn(alfrescoApiService.getInstance().node, 'getNode').and.returnValue(new Promise(resolve => resolve({entry: fakeNodeWithProperties})));
spyOn(contentCloudNodeSelectorService, 'fetchNodeIdFromRelativePath').and.returnValue(new Promise(resolve => resolve('fake-properties')));
spyOn( spyOn(
contentCloudNodeSelectorService, contentCloudNodeSelectorService,
'openUploadFileDialog' 'openUploadFileDialog'
@@ -649,6 +704,8 @@ describe('AttachFileCloudWidgetComponent', () => {
it('should request form to be updated with metadata when retrieve is clicked', (done) => { it('should request form to be updated with metadata when retrieve is clicked', (done) => {
updateFormSpy = spyOn(formService.updateFormValuesRequested, 'next'); updateFormSpy = spyOn(formService.updateFormValuesRequested, 'next');
widget.field.value = [fakeNodeWithProperties];
fixture.detectChanges();
const menuButton: HTMLButtonElement = <HTMLButtonElement> ( const menuButton: HTMLButtonElement = <HTMLButtonElement> (
fixture.debugElement.query(By.css('#file-fake-properties-option-menu')) fixture.debugElement.query(By.css('#file-fake-properties-option-menu'))

View File

@@ -124,17 +124,18 @@ export class AttachFileCloudWidgetComponent extends UploadCloudWidgetComponent i
async openSelectDialog() { async openSelectDialog() {
const selectedMode = this.field.params.multiple ? 'multiple' : 'single'; const selectedMode = this.field.params.multiple ? 'multiple' : 'single';
let destinationFolderPath = <DestinationFolderPathModel> { alias: AttachFileCloudWidgetComponent.ALIAS_USER_FOLDER, path: '' };
if (this.isAlfrescoAndLocal()) { if (this.isAlfrescoAndLocal()) {
const destinationFolderPath = this.getAliasAndRelativePathFromDestinationFolderPath(this.field.params.fileSource.destinationFolderPath); destinationFolderPath = this.getAliasAndRelativePathFromDestinationFolderPath(this.field.params.fileSource.destinationFolderPath);
destinationFolderPath.path = this.replaceAppNameAliasWithValue(destinationFolderPath.path); destinationFolderPath.path = this.replaceAppNameAliasWithValue(destinationFolderPath.path);
const nodeId = await this.contentNodeSelectorService.fetchNodeIdFromRelativePath(destinationFolderPath.alias, { relativePath: destinationFolderPath.path });
this.rootNodeId = nodeId ? nodeId : destinationFolderPath.alias;
} }
const nodeId = await this.contentNodeSelectorService.fetchNodeIdFromRelativePath(destinationFolderPath.alias, { relativePath: destinationFolderPath.path });
this.rootNodeId = nodeId ? nodeId : destinationFolderPath.alias;
this.contentNodeSelectorPanelService.customModels = this.field.params.customModels; this.contentNodeSelectorPanelService.customModels = this.field.params.customModels;
this.contentNodeSelectorService this.contentNodeSelectorService
.openUploadFileDialog(this.rootNodeId, selectedMode, this.isAlfrescoAndLocal()) .openUploadFileDialog(this.rootNodeId, selectedMode, this.isAlfrescoAndLocal(), true)
.subscribe((selections: Node[]) => { .subscribe((selections: Node[]) => {
selections.forEach(node => (node['isExternal'] = true)); selections.forEach(node => (node['isExternal'] = true));
const selectionWithoutDuplication = this.removeExistingSelection(selections); const selectionWithoutDuplication = this.removeExistingSelection(selections);

View File

@@ -32,7 +32,7 @@ export class ContentCloudNodeSelectorService {
private dialog: MatDialog) { private dialog: MatDialog) {
} }
openUploadFileDialog(currentFolderId?: string, selectionMode?: string, isAllFileSources?: boolean): Observable<Node[]> { openUploadFileDialog(currentFolderId?: string, selectionMode?: string, isAllFileSources?: boolean, restrictRootToCurrentFolderId?: boolean): Observable<Node[]> {
const select = new Subject<Node[]>(); const select = new Subject<Node[]>();
select.subscribe({ select.subscribe({
complete: this.close.bind(this) complete: this.close.bind(this)
@@ -41,7 +41,7 @@ export class ContentCloudNodeSelectorService {
title: 'Select a file', title: 'Select a file',
actionName: 'Attach', actionName: 'Attach',
currentFolderId, currentFolderId,
restrictRootToCurrentFolderId: isAllFileSources, restrictRootToCurrentFolderId,
select, select,
selectionMode, selectionMode,
isSelectionValid: (entry: Node) => entry.isFile, isSelectionValid: (entry: Node) => entry.isFile,