From e93a77136648b09530101dcd68287cef7bf22d7f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Popovics=20Andr=C3=A1s?= Date: Tue, 8 Aug 2017 16:41:20 +0100 Subject: [PATCH] [ADF-459] Copy & move further features (#2187) * Adding current folder to list by default * Fix documentlist component's rowFilter and imageResolver * Adding rowfilter to not show the current node in the list * Removing unpermitted nodes from the selectable ones (not visually) * Restore documentlist original behaviour (rowFilter and imageResolver) * Select event interface works with array from this point on * Introducing the one and only, mighty Breadcrumb * Breadcrumb position fix * Extract hightlight transform functionality from highlight pipe * Highlight part I. * Showing breadcrumb with the new redesigned functionality * Rebase fix * Error and success callback for the new content actions * Tests for HighlightDirective * Update documentation * Until proper pagination we use this temporary fix * Fix node unselection on folder change * Fix accessibility support in dropdown breadcrumb --- .../app/components/files/files.component.html | 8 + .../app/components/files/files.component.ts | 26 +- ng2-components/ng2-alfresco-core/index.ts | 11 +- .../directives/highlight.directive.spec.ts | 125 ++++++++ .../src/directives/highlight.directive.ts | 52 ++++ .../src/pipes/text-highlight.pipe.ts | 18 +- .../services/highlight-transform.service.ts | 44 +++ .../ng2-alfresco-documentlist/README.md | 31 +- .../assets/document-action-copymovedialog.png | Bin 78744 -> 78812 bytes .../dropdown-breadcrumb.component.html | 11 +- .../dropdown-breadcrumb.component.scss | 3 + .../content-action.component.spec.ts | 6 +- .../content-action.component.ts | 24 ++ .../content-node-selector.component.html | 27 +- .../content-node-selector.component.scss | 8 + .../content-node-selector.component.spec.ts | 289 +++++++++++++++--- .../content-node-selector.component.ts | 111 +++++-- .../document-list.component.spec.ts | 19 +- .../src/components/document-list.component.ts | 34 ++- .../src/i18n/en.json | 3 +- .../services/document-actions.service.spec.ts | 10 +- .../src/services/document-actions.service.ts | 28 +- .../src/services/folder-actions.service.ts | 25 +- .../src/services/node-actions.service.ts | 64 ++-- 24 files changed, 793 insertions(+), 184 deletions(-) create mode 100644 ng2-components/ng2-alfresco-core/src/directives/highlight.directive.spec.ts create mode 100644 ng2-components/ng2-alfresco-core/src/directives/highlight.directive.ts create mode 100644 ng2-components/ng2-alfresco-core/src/services/highlight-transform.service.ts diff --git a/demo-shell-ng2/app/components/files/files.component.html b/demo-shell-ng2/app/components/files/files.component.html index e8aa437a82..388a6b0ffc 100644 --- a/demo-shell-ng2/app/components/files/files.component.html +++ b/demo-shell-ng2/app/components/files/files.component.html @@ -137,6 +137,8 @@ title="{{'DOCUMENT_LIST.ACTIONS.FOLDER.COPY' | translate}}" permission="update" [disableWithNoPermission]="true" + (error)="onContentActionError($event)" + (success)="onContentActionSuccess($event)" handler="copy"> { diff --git a/ng2-components/ng2-alfresco-core/index.ts b/ng2-components/ng2-alfresco-core/index.ts index 82b045a76a..aebfe3b591 100644 --- a/ng2-components/ng2-alfresco-core/index.ts +++ b/ng2-components/ng2-alfresco-core/index.ts @@ -52,12 +52,15 @@ import { TranslationService } from './src/services/translation.service'; import { UploadService } from './src/services/upload.service'; import { UserPreferencesService } from './src/services/user-preferences.service'; +import { HighlightDirective } from './src/directives/highlight.directive'; import { DeletedNodesApiService } from './src/services/deleted-nodes-api.service'; import { DiscoveryApiService } from './src/services/discovery-api.service'; import { FavoritesApiService } from './src/services/favorites-api.service'; +import { HighlightTransformService } from './src/services/highlight-transform.service'; import { NodesApiService } from './src/services/nodes-api.service'; import { PeopleApiService } from './src/services/people-api.service'; import { SearchApiService } from './src/services/search-api.service'; +import { SearchService } from './src/services/search.service'; import { SharedLinksApiService } from './src/services/shared-links-api.service'; import { SitesApiService } from './src/services/sites-api.service'; @@ -89,7 +92,7 @@ export { UpdateNotification } from './src/services/card-view-update.service'; export { ClickNotification } from './src/services/card-view-update.service'; export { AppConfigModule } from './src/services/app-config.service'; export { UserPreferencesService } from './src/services/user-preferences.service'; -import { SearchService } from './src/services/search.service'; +export { HighlightTransformService, HightlightTransformResult } from './src/services/highlight-transform.service'; export { DeletedNodesApiService } from './src/services/deleted-nodes-api.service'; export { FavoritesApiService } from './src/services/favorites-api.service'; @@ -121,6 +124,7 @@ export { CardViewItem } from './src/interface/card-view-item.interface'; export * from './src/components/data-column/data-column.component'; export * from './src/components/data-column/data-column-list.component'; export * from './src/directives/upload.directive'; +export * from './src/directives/highlight.directive'; export * from './src/utils/index'; export * from './src/events/base.event'; export * from './src/events/base-ui.event'; @@ -171,7 +175,8 @@ export function providers() { SearchApiService, SharedLinksApiService, SitesApiService, - DiscoveryApiService + DiscoveryApiService, + HighlightTransformService ]; } @@ -220,6 +225,7 @@ export function createTranslateLoader(http: Http, logService: LogService) { ...obsoleteMdlDirectives(), UploadDirective, NodePermissionDirective, + HighlightDirective, DataColumnComponent, DataColumnListComponent, FileSizePipe, @@ -243,6 +249,7 @@ export function createTranslateLoader(http: Http, logService: LogService) { ...obsoleteMdlDirectives(), UploadDirective, NodePermissionDirective, + HighlightDirective, DataColumnComponent, DataColumnListComponent, FileSizePipe, diff --git a/ng2-components/ng2-alfresco-core/src/directives/highlight.directive.spec.ts b/ng2-components/ng2-alfresco-core/src/directives/highlight.directive.spec.ts new file mode 100644 index 0000000000..f7596dd9f4 --- /dev/null +++ b/ng2-components/ng2-alfresco-core/src/directives/highlight.directive.spec.ts @@ -0,0 +1,125 @@ +/*! + * @license + * Copyright 2016 Alfresco Software, Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { Component, ViewChildren } from '@angular/core'; +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; +import { By } from '@angular/platform-browser'; +import { HighlightTransformService } from '../services/highlight-transform.service'; +import { HighlightDirective } from './highlight.directive'; + +const template: string = ` +
+
Lorem ipsum salana-eyong-aysis dolor sit amet
+
Lorem ipsum salana-eyong-aysis dolor sit amet
+
consectetur adipiscing elit
+
sed do eiusmod salana-eyong-aysis tempor incididunt
+
+
+
Lorem ipsum salana-eyong-aysis dolor sit amet
+
`; + +@Component({ selector: 'adf-test-component', template }) +class TestComponent { + @ViewChildren(HighlightDirective) public hightlightDirectives; +} + +describe('HighlightDirective', () => { + + let fixture: ComponentFixture; + let component: TestComponent; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ + HighlightDirective, + TestComponent + ], + providers: [ + HighlightTransformService + ] + }).compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(TestComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should replace the searched text with the default hightlight class in the proper element (adf-highlight-selector)', () => { + component.hightlightDirectives.last.highlight('salana-eyong-aysis'); + fixture.detectChanges(); + + const containerElement = fixture.debugElement.query(By.css('#innerDiv21')); + expect(containerElement).not.toBeNull(); + expect(containerElement.nativeElement.innerHTML).toBe('Lorem ipsum salana-eyong-aysis dolor sit amet'); + }); + + it('should replace the searched text with the default hightlight class in every proper element (highlight-for-free-willy)', () => { + component.hightlightDirectives.first.highlight('salana-eyong-aysis'); + fixture.detectChanges(); + + const containerElement1 = fixture.debugElement.query(By.css('#innerDiv11')); + const containerElement2 = fixture.debugElement.query(By.css('#innerDiv14')); + expect(containerElement1).not.toBeNull(); + expect(containerElement2).not.toBeNull(); + expect(containerElement1.nativeElement.innerHTML).toBe('Lorem ipsum salana-eyong-aysis dolor sit amet'); + expect(containerElement2.nativeElement.innerHTML).toBe('sed do eiusmod salana-eyong-aysis tempor incididunt'); + }); + + it('should NOT replace the searched text in an element without the proper selector class', () => { + component.hightlightDirectives.first.highlight('salana-eyong-aysis'); + fixture.detectChanges(); + + const containerElement1 = fixture.debugElement.query(By.css('#innerDiv12')); + expect(containerElement1).not.toBeNull(); + expect(containerElement1.nativeElement.innerHTML).toBe('Lorem ipsum salana-eyong-aysis dolor sit amet'); + }); + + it('should NOT reinsert the same text to the innerText if there was no change at all (search string is not found)', () => { + const highlighter = TestBed.get(HighlightTransformService); + spyOn(highlighter, 'highlight').and.returnValue({ changed: false, text: 'Modified text' }); + component.hightlightDirectives.first.highlight('salana-eyong-aysis'); + fixture.detectChanges(); + + const containerElement = fixture.debugElement.query(By.css('#innerDiv11')); + expect(containerElement).not.toBeNull(); + expect(containerElement.nativeElement.innerHTML).not.toContain('Modified text'); + }); + + it('should do the search only if there is a search string presented', () => { + const highlighter = TestBed.get(HighlightTransformService); + spyOn(highlighter, 'highlight').and.callThrough(); + component.hightlightDirectives.first.highlight(''); + fixture.detectChanges(); + + expect(highlighter.highlight).not.toHaveBeenCalled(); + }); + + it('should do the search only if there is a node selector string presented', () => { + const highlighter = TestBed.get(HighlightTransformService); + spyOn(highlighter, 'highlight').and.callThrough(); + + const callback = function() { + component.hightlightDirectives.first.highlight('raddish', ''); + fixture.detectChanges(); + }; + + expect(callback).not.toThrowError(); + expect(highlighter.highlight).not.toHaveBeenCalled(); + }); +}); diff --git a/ng2-components/ng2-alfresco-core/src/directives/highlight.directive.ts b/ng2-components/ng2-alfresco-core/src/directives/highlight.directive.ts new file mode 100644 index 0000000000..78a6db810c --- /dev/null +++ b/ng2-components/ng2-alfresco-core/src/directives/highlight.directive.ts @@ -0,0 +1,52 @@ +/*! + * @license + * Copyright 2016 Alfresco Software, Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { Directive, ElementRef, Input, Renderer } from '@angular/core'; +import { HighlightTransformService, HightlightTransformResult } from '../services/highlight-transform.service'; + +@Directive({ + selector: '[adf-highlight]' +}) +export class HighlightDirective { + + @Input('adf-highlight-selector') + selector: string = ''; + + @Input('adf-highlight') + search: string = ''; + + @Input('adf-highlight-class') + classToApply: string = 'adf-highlight'; + + constructor( + private el: ElementRef, + private renderer: Renderer, + private highlightTransformService: HighlightTransformService) { } + + public highlight(search = this.search, selector = this.selector, classToApply = this.classToApply) { + if (search && selector) { + const elements = this.el.nativeElement.querySelectorAll(selector); + + elements.forEach((element) => { + const result: HightlightTransformResult = this.highlightTransformService.highlight(element.innerHTML, search, classToApply); + if (result.changed) { + this.renderer.setElementProperty(element, 'innerHTML', result.text); + } + }); + } + } +} diff --git a/ng2-components/ng2-alfresco-core/src/pipes/text-highlight.pipe.ts b/ng2-components/ng2-alfresco-core/src/pipes/text-highlight.pipe.ts index fbf7bf2c9a..466ebaac0e 100644 --- a/ng2-components/ng2-alfresco-core/src/pipes/text-highlight.pipe.ts +++ b/ng2-components/ng2-alfresco-core/src/pipes/text-highlight.pipe.ts @@ -16,25 +16,17 @@ */ import { Pipe, PipeTransform } from '@angular/core'; +import { HighlightTransformService, HightlightTransformResult } from '../services/highlight-transform.service'; @Pipe({ name: 'highlight' }) export class HighlightPipe implements PipeTransform { - constructor() { } + constructor(private highlightTransformService: HighlightTransformService) { } - transform(text: string, search: string): any { - if (search && text) { - let pattern = search.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, '\\$&'); - pattern = pattern.split(' ').filter((t) => { - return t.length > 0; - }).join('|'); - const regex = new RegExp(pattern, 'gi'); - let result = text.replace(regex, (match) => `${match}`); - return result; - } else { - return text; - } + transform(text: string, search: string): string { + const result: HightlightTransformResult = this.highlightTransformService.highlight(text, search); + return result.text; } } diff --git a/ng2-components/ng2-alfresco-core/src/services/highlight-transform.service.ts b/ng2-components/ng2-alfresco-core/src/services/highlight-transform.service.ts new file mode 100644 index 0000000000..e922e5fb48 --- /dev/null +++ b/ng2-components/ng2-alfresco-core/src/services/highlight-transform.service.ts @@ -0,0 +1,44 @@ +/*! + * @license + * Copyright 2016 Alfresco Software, Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +export interface HightlightTransformResult { + text: string; + changed: boolean; +} +export class HighlightTransformService { + + public highlight(text: string, search: string, wrapperClass: string = 'highlight'): HightlightTransformResult { + let isMatching = false, + result = text; + + if (search && text) { + let pattern = search.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, '\\$&'); + pattern = pattern.split(' ').filter((t) => { + return t.length > 0; + }).join('|'); + + const regex = new RegExp(pattern, 'gi'); + result = text.replace(regex, (match) => { + isMatching = true; + return `${match}`; + }); + return { text: result, changed: isMatching}; + } else { + return { text: result, changed: isMatching}; + } + } +} diff --git a/ng2-components/ng2-alfresco-documentlist/README.md b/ng2-components/ng2-alfresco-documentlist/README.md index 64cbfedc27..5213de0e9b 100644 --- a/ng2-components/ng2-alfresco-documentlist/README.md +++ b/ng2-components/ng2-alfresco-documentlist/README.md @@ -33,6 +33,7 @@ - [Delete - Disable button checking the permission](#delete---disable-button-checking-the-permission) - [Download](#download) - [Copy and move](#copy-and-move) + * [Error, Permission and success callback](#error-permission-and-success-callback) + [Folder actions](#folder-actions) * [Context Menu](#context-menu) * [Navigation mode](#navigation-mode) @@ -610,15 +611,17 @@ Properties: | --- | --- | --- | --- | | `target` | string | | "document" or "folder" | | `title` | string | | The title of the action as shown in the menu | -| `handler` | string | | System type actions. Can be "delete" or "download" | +| `handler` | string | | System type actions. Can be "delete", "download", "copy" or "move" | | `permission` | string | | The name of the permission | Events: -| Name | Description | -| --- | --- | -| `execute` | Emitted when user clicks on the action. For combined handlers see below | -| `permissionEvent` | Emitted when a permission error happens | +| Name | Handler | Description | +| --- | --- | --- | +| `execute` | All | Emitted when user clicks on the action. For combined handlers see below | +| `permissionEvent` | All | Emitted when a permission error happens | +| `success` | copy, move | Emitted on successful action with the success string message | +| `error` | copy, move | Emitted on unsuccessful action with the error event | DocumentList supports declarative actions for Documents and Folders. Each action can be bound to either default out-of-the-box handler, to a custom behaviour or to both. @@ -776,7 +779,7 @@ Initiates download of the corresponding document file. ##### Copy and move -Shows the destination chooser dialog for copy and move actions +Shows the destination chooser dialog for copy and move actions. By default the destination chooser lists all the folders of the subject item's parent (except the selected item which is about to be copied/moved if it was a folder itself also). ![Copy/move dialog](docs/assets/document-action-copymovedialog.png) @@ -790,15 +793,21 @@ Shows the destination chooser dialog for copy and move actions title="copy" permission="update" [disableWithNoPermission]="true" + (error)="onContentActionError($event)" + (success)="onContentActionSuccess($event)" + (permissionEvent)="onPermissionsFailed($event)" handler="copy">
@@ -806,6 +815,14 @@ Shows the destination chooser dialog for copy and move actions ``` +###### Error, Permission and success callback + +Defining error, permission and success callbacks are pretty much the same as doing it for the delete permission handling. + +- The error handler callback gets the error object which was raised +- The success callback's only parameter is the translatable success message string (could be used for showing in snackbar for example) +- The permissionEvent callback is the same as described above with the delete action + ![Copy/move document action](docs/assets/document-action-copymove.png) #### Folder actions diff --git a/ng2-components/ng2-alfresco-documentlist/docs/assets/document-action-copymovedialog.png b/ng2-components/ng2-alfresco-documentlist/docs/assets/document-action-copymovedialog.png index 6963fd7327519f3c57fc2e9a99806e6bbb8864a4..7f9e0c1ffaea84876d497fc8da9f887ef48f20bc 100644 GIT binary patch literal 78812 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 literal 78744 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 - folder + data-automation-id="dropdown-breadcrumb-trigger"> + folder + chevron_right {{ node.name }} - { beforeEach(() => { contentService = TestBed.get(AlfrescoContentService); translateService = { addTranslationFolder: () => {}}; - nodeActionsService = new NodeActionsService(null, translateService, null, null); + nodeActionsService = new NodeActionsService(null, null, null); notificationService = new NotificationService(null); let documentServiceMock = new DocumentListServiceMock(); - documentActions = new DocumentActionsService(translateService, notificationService, nodeActionsService); - folderActions = new FolderActionsService(translateService, notificationService, nodeActionsService, null, contentService); + documentActions = new DocumentActionsService(nodeActionsService); + folderActions = new FolderActionsService(nodeActionsService, null, contentService); documentList = new DocumentListComponent(documentServiceMock, null, null, null); actionList = new ContentActionListComponent(documentList); diff --git a/ng2-components/ng2-alfresco-documentlist/src/components/content-action/content-action.component.ts b/ng2-components/ng2-alfresco-documentlist/src/components/content-action/content-action.component.ts index 6ab3c2ea86..0a78801891 100644 --- a/ng2-components/ng2-alfresco-documentlist/src/components/content-action/content-action.component.ts +++ b/ng2-components/ng2-alfresco-documentlist/src/components/content-action/content-action.component.ts @@ -58,6 +58,12 @@ export class ContentActionComponent implements OnInit, OnChanges { @Output() permissionEvent = new EventEmitter(); + @Output() + error = new EventEmitter(); + + @Output() + success = new EventEmitter(); + model: ContentActionModel; constructor( @@ -111,6 +117,15 @@ export class ContentActionComponent implements OnInit, OnChanges { this.documentActions.permissionEvent.subscribe((permision) => { this.permissionEvent.emit(permision); }); + + this.documentActions.error.subscribe((errors) => { + this.error.emit(errors); + }); + + this.documentActions.success.subscribe((message) => { + this.success.emit(message); + }); + return this.documentActions.getHandler(name); } return null; @@ -121,6 +136,15 @@ export class ContentActionComponent implements OnInit, OnChanges { this.folderActions.permissionEvent.subscribe((permision) => { this.permissionEvent.emit(permision); }); + + this.folderActions.error.subscribe((errors) => { + this.error.emit(errors); + }); + + this.folderActions.success.subscribe((message) => { + this.success.emit(message); + }); + return this.folderActions.getHandler(name); } return null; diff --git a/ng2-components/ng2-alfresco-documentlist/src/components/content-node-selector/content-node-selector.component.html b/ng2-components/ng2-alfresco-documentlist/src/components/content-node-selector/content-node-selector.component.html index 292957de3d..d6cee7f4bf 100644 --- a/ng2-components/ng2-alfresco-documentlist/src/components/content-node-selector/content-node-selector.component.html +++ b/ng2-components/ng2-alfresco-documentlist/src/components/content-node-selector/content-node-selector.component.html @@ -4,14 +4,13 @@
+ (node-select)="onNodeSelect($event)"> @@ -31,18 +30,34 @@ (change)="siteChanged($event)" data-automation-id="content-node-selector-sites-combo"> + + + + + + +
- diff --git a/ng2-components/ng2-alfresco-documentlist/src/components/content-node-selector/content-node-selector.component.scss b/ng2-components/ng2-alfresco-documentlist/src/components/content-node-selector/content-node-selector.component.scss index 7a759813c0..534d3dd7cd 100644 --- a/ng2-components/ng2-alfresco-documentlist/src/components/content-node-selector/content-node-selector.component.scss +++ b/ng2-components/ng2-alfresco-documentlist/src/components/content-node-selector/content-node-selector.component.scss @@ -53,11 +53,19 @@ } } + & /deep/ .adf-toolbar .mat-toolbar { + border: none; + } + &-list { height: 200px; overflow: auto; border: 1px solid rgba(0, 0, 0, 0.07); + & /deep/ .adf-highlight { + color: #33afdf; + } + & /deep/ .adf-data-table { border: none; diff --git a/ng2-components/ng2-alfresco-documentlist/src/components/content-node-selector/content-node-selector.component.spec.ts b/ng2-components/ng2-alfresco-documentlist/src/components/content-node-selector/content-node-selector.component.spec.ts index 778740b387..6aede2bd31 100644 --- a/ng2-components/ng2-alfresco-documentlist/src/components/content-node-selector/content-node-selector.component.spec.ts +++ b/ng2-components/ng2-alfresco-documentlist/src/components/content-node-selector/content-node-selector.component.spec.ts @@ -16,14 +16,15 @@ */ import { DebugElement, EventEmitter } from '@angular/core'; -import { async, ComponentFixture, TestBed } from '@angular/core/testing'; +import { async, ComponentFixture, fakeAsync, TestBed, tick } from '@angular/core/testing'; import { MD_DIALOG_DATA, MdDialogRef } from '@angular/material'; import { By } from '@angular/platform-browser'; import { MinimalNodeEntryEntity } from 'alfresco-js-api'; -import { AlfrescoTranslationService, CoreModule, SearchService, SiteModel } from 'ng2-alfresco-core'; +import { AlfrescoContentService, AlfrescoTranslationService, CoreModule, SearchService, SiteModel } from 'ng2-alfresco-core'; import { DataTableModule } from 'ng2-alfresco-datatable'; import { MaterialModule } from '../../material.module'; import { DocumentListService } from '../../services/document-list.service'; +import { DropdownBreadcrumbComponent } from '../breadcrumb/dropdown-breadcrumb.component'; import { DocumentListComponent } from '../document-list.component'; import { DocumentMenuActionComponent } from '../document-menu-action.component'; import { EmptyFolderContentDirective } from '../empty-folder/empty-folder-content.directive'; @@ -45,7 +46,6 @@ const ONE_FOLDER_RESULT = { }; describe('ContentNodeSelectorComponent', () => { - let component: ContentNodeSelectorComponent; let fixture: ComponentFixture; let element: DebugElement; @@ -59,7 +59,7 @@ describe('ContentNodeSelectorComponent', () => { function typeToSearchBox(searchTerm = 'string-to-search') { let searchInput = fixture.debugElement.query(By.css('[data-automation-id="content-node-selector-search-input"]')); searchInput.nativeElement.value = searchTerm; - searchInput.triggerEventHandler('keyup', {}); + searchInput.triggerEventHandler('input', {}); fixture.detectChanges(); } @@ -79,9 +79,11 @@ describe('ContentNodeSelectorComponent', () => { DocumentMenuActionComponent, EmptyFolderContentDirective, DropdownSitesComponent, + DropdownBreadcrumbComponent, ContentNodeSelectorComponent ], providers: [ + AlfrescoContentService, AlfrescoTranslationService, DocumentListService, SearchService, @@ -100,7 +102,10 @@ describe('ContentNodeSelectorComponent', () => { beforeEach(async(() => { data = { title: 'Move along citizen...', - select: new EventEmitter() + select: new EventEmitter(), + rowFilter: () => {}, + imageResolver: () => 'piccolo', + currentFolderId: 'cat-girl-nuku-nuku' }; setupTestbed([{ provide: MD_DIALOG_DATA, useValue: data }]); @@ -122,10 +127,29 @@ describe('ContentNodeSelectorComponent', () => { expect(titleElement.nativeElement.innerText).toBe('Move along citizen...'); }); + it('should pass through the injected currentFolderId to the documentlist', () => { + let documentList = fixture.debugElement.query(By.directive(DocumentListComponent)); + expect(documentList).not.toBeNull('Document list should be shown'); + expect(documentList.componentInstance.currentFolderId).toBe('cat-girl-nuku-nuku'); + }); + + it('should pass through the injected rowFilter to the documentlist', () => { + let documentList = fixture.debugElement.query(By.directive(DocumentListComponent)); + expect(documentList).not.toBeNull('Document list should be shown'); + expect(documentList.componentInstance.rowFilter).toBe(data.rowFilter); + }); + + it('should pass through the injected imageResolver to the documentlist', () => { + let documentList = fixture.debugElement.query(By.directive(DocumentListComponent)); + expect(documentList).not.toBeNull('Document list should be shown'); + expect(documentList.componentInstance.imageResolver).toBe(data.imageResolver); + }); + it('should trigger the INJECTED select event when selection has been made', (done) => { const expectedNode = {}; - data.select.subscribe((node) => { - expect(node).toBe(expectedNode); + data.select.subscribe((nodes) => { + expect(nodes.length).toBe(1); + expect(nodes[0]).toBe(expectedNode); done(); }); @@ -143,13 +167,13 @@ describe('ContentNodeSelectorComponent', () => { }); it('should be shown if dialogRef is injected', () => { - const componentInstance = new ContentNodeSelectorComponent(null, null, data, dummyMdDialogRef); + const componentInstance = new ContentNodeSelectorComponent(null, null, null, data, dummyMdDialogRef); expect(componentInstance.inDialog).toBeTruthy(); }); it('should should call the close method in the injected dialogRef', () => { spyOn(dummyMdDialogRef, 'close'); - const componentInstance = new ContentNodeSelectorComponent(null, null, data, dummyMdDialogRef); + const componentInstance = new ContentNodeSelectorComponent(null, null, null, data, dummyMdDialogRef); componentInstance.close(); @@ -192,8 +216,9 @@ describe('ContentNodeSelectorComponent', () => { it('should trigger the select event when selection has been made', (done) => { const expectedNode = {}; - component.select.subscribe((node) => { - expect(node).toBe(expectedNode); + component.select.subscribe((nodes) => { + expect(nodes.length).toBe(1); + expect(nodes[0]).toBe(expectedNode); done(); }); @@ -202,19 +227,131 @@ describe('ContentNodeSelectorComponent', () => { }); }); + describe('Breadcrumbs', () => { + + let documentListService, + expectedDefaultFolderNode; + + beforeEach(() => { + expectedDefaultFolderNode = { path: { elements: [] } }; + documentListService = TestBed.get(DocumentListService); + spyOn(documentListService, 'getFolderNode').and.returnValue(Promise.resolve(expectedDefaultFolderNode)); + component.currentFolderId = 'cat-girl-nuku-nuku'; + fixture.detectChanges(); + }); + + it('should show the breadcrumb for the currentFolderId by default', (done) => { + fixture.detectChanges(); + + fixture.whenStable().then(() => { + fixture.detectChanges(); + const breadcrumb = fixture.debugElement.query(By.directive(DropdownBreadcrumbComponent)); + expect(breadcrumb).not.toBeNull(); + expect(breadcrumb.componentInstance.folderNode).toBe(expectedDefaultFolderNode); + done(); + }); + }); + + it('should not show the breadcrumb if search was performed as last action', (done) => { + typeToSearchBox(); + respondWithSearchResults(ONE_FOLDER_RESULT); + + fixture.whenStable().then(() => { + fixture.detectChanges(); + const breadcrumb = fixture.debugElement.query(By.directive(DropdownBreadcrumbComponent)); + expect(breadcrumb).toBeNull(); + done(); + }); + }); + + it('should show the breadcrumb again on folder navigation in the results list', (done) => { + typeToSearchBox(); + respondWithSearchResults(ONE_FOLDER_RESULT); + + fixture.whenStable().then(() => { + fixture.detectChanges(); + component.onFolderChange(); + fixture.detectChanges(); + const breadcrumb = fixture.debugElement.query(By.directive(DropdownBreadcrumbComponent)); + expect(breadcrumb).not.toBeNull(); + done(); + }); + }); + + it('should show the breadcrumb for the selected node when search results are displayed', (done) => { + const alfrescoContentService = TestBed.get(AlfrescoContentService); + spyOn(alfrescoContentService, 'hasPermission').and.returnValue(true); + + typeToSearchBox(); + respondWithSearchResults(ONE_FOLDER_RESULT); + + fixture.whenStable().then(() => { + fixture.detectChanges(); + + const chosenNode = { path: { elements: [] } }; + component.onNodeSelect({ detail: { node: { entry: chosenNode} } }); + fixture.detectChanges(); + + const breadcrumb = fixture.debugElement.query(By.directive(DropdownBreadcrumbComponent)); + expect(breadcrumb).not.toBeNull(); + expect(breadcrumb.componentInstance.folderNode).toBe(chosenNode); + done(); + }); + }); + + it('should NOT show the breadcrumb for the selected node when not on search results list', (done) => { + const alfrescoContentService = TestBed.get(AlfrescoContentService); + spyOn(alfrescoContentService, 'hasPermission').and.returnValue(true); + + typeToSearchBox(); + respondWithSearchResults(ONE_FOLDER_RESULT); + + fixture.whenStable().then(() => { + fixture.detectChanges(); + component.onFolderChange(); + fixture.detectChanges(); + + const chosenNode = { path: { elements: [] } }; + component.onNodeSelect({ detail: { node: { entry: chosenNode} } }); + fixture.detectChanges(); + + const breadcrumb = fixture.debugElement.query(By.directive(DropdownBreadcrumbComponent)); + expect(breadcrumb).not.toBeNull(); + expect(breadcrumb.componentInstance.folderNode).toBe(expectedDefaultFolderNode); + done(); + }); + }); + }); + describe('Search functionality', () => { + function defaultSearchOptions(rootNodeId = undefined) { + return { + include: ['path', 'allowableOperations'], + skipCount: 0, + rootNodeId, + nodeType: 'cm:folder', + maxItems: 200, + orderBy: null + }; + } + + beforeEach(() => { + component.currentFolderId = 'cat-girl-nuku-nuku'; + fixture.detectChanges(); + }); + it('should load the results by calling the search api on search change', () => { typeToSearchBox('kakarot'); - expect(searchSpy).toHaveBeenCalledWith('kakarot*', { - include: ['path'], - skipCount: 0, - rootNodeId: undefined, - nodeType: 'cm:folder', - maxItems: 40, - orderBy: null - }); + expect(searchSpy).toHaveBeenCalledWith('kakarot*', defaultSearchOptions()); + }); + + it('should reset the currently chosen node in case of starting a new search', () => { + component.chosenNode = {}; + typeToSearchBox('kakarot'); + + expect(component.chosenNode).toBeNull(); }); it('should NOT call the search api if the searchTerm length is less than 4 characters', () => { @@ -236,14 +373,7 @@ describe('ContentNodeSelectorComponent', () => { component.siteChanged( { guid: 'namek' }); expect(searchSpy.calls.count()).toBe(2, 'Search count should be two after the site change'); - expect(searchSpy.calls.argsFor(1)).toEqual(['vegeta*', { - include: ['path'], - skipCount: 0, - rootNodeId: 'namek', - nodeType: 'cm:folder', - maxItems: 40, - orderBy: null - }]); + expect(searchSpy.calls.argsFor(1)).toEqual(['vegeta*', defaultSearchOptions('namek') ]); }); it('should show the search icon by default without the X (clear) icon', () => { @@ -269,20 +399,43 @@ describe('ContentNodeSelectorComponent', () => { it('should clear the search field, nodes and chosenNode when clicking on the X (clear) icon', () => { component.chosenNode = {}; component.nodes = [ component.chosenNode ]; - component.searchTerm = 'whatever'; - component.searched = true; + component.searchTerm = 'piccolo'; + component.showingSearchResults = true; component.clear(); - expect(component.searched).toBe(false); expect(component.searchTerm).toBe(''); expect(component.nodes).toEqual([]); expect(component.chosenNode).toBeNull(); + expect(component.showingSearchResults).toBeFalsy(); }); - it('should show the default text instead of result list if search was not performed', () => { - let documentList = fixture.debugElement.query(By.css('[data-automation-id="content-node-selector-document-list"]')); - expect(documentList).toBeNull('Document list should not be shown by default'); + it('should show the current folder\'s content instead of search results if search was not performed', () => { + let documentList = fixture.debugElement.query(By.directive(DocumentListComponent)); + expect(documentList).not.toBeNull('Document list should be shown'); + expect(documentList.componentInstance.currentFolderId).toBe('cat-girl-nuku-nuku'); + }); + + it('should pass through the rowFilter to the documentList', () => { + const filter = () => {}; + component.rowFilter = filter; + + fixture.detectChanges(); + + let documentList = fixture.debugElement.query(By.directive(DocumentListComponent)); + expect(documentList).not.toBeNull('Document list should be shown'); + expect(documentList.componentInstance.rowFilter).toBe(filter); + }); + + it('should pass through the imageResolver to the documentList', () => { + const resolver = () => 'piccolo'; + component.imageResolver = resolver; + + fixture.detectChanges(); + + let documentList = fixture.debugElement.query(By.directive(DocumentListComponent)); + expect(documentList).not.toBeNull('Document list should be shown'); + expect(documentList.componentInstance.imageResolver).toBe(resolver); }); it('should show the result list when search was performed', async(() => { @@ -292,10 +445,21 @@ describe('ContentNodeSelectorComponent', () => { fixture.whenStable().then(() => { fixture.detectChanges(); let documentList = fixture.debugElement.query(By.css('[data-automation-id="content-node-selector-document-list"]')); - expect(documentList).not.toBeNull('Document list should be shown after search'); + expect(documentList).not.toBeNull('Document list should be shown'); + expect(documentList.componentInstance.currentFolderId).toBeNull(); }); })); + it('should highlight the results when search was performed in the next timeframe', fakeAsync(() => { + spyOn(component.highlighter, 'highlight'); + typeToSearchBox('shenron'); + respondWithSearchResults(ONE_FOLDER_RESULT); + + expect(component.highlighter.highlight).not.toHaveBeenCalled(); + tick(); + expect(component.highlighter.highlight).toHaveBeenCalledWith('shenron'); + })); + it('should show the default text instead of result list if search was cleared', async(() => { typeToSearchBox(); respondWithSearchResults(ONE_FOLDER_RESULT); @@ -308,7 +472,8 @@ describe('ContentNodeSelectorComponent', () => { fixture.detectChanges(); let documentList = fixture.debugElement.query(By.css('[data-automation-id="content-node-selector-document-list"]')); - expect(documentList).toBeNull('Document list should NOT be shown after clearing the search'); + expect(documentList).not.toBeNull('Document list should be shown'); + expect(documentList.componentInstance.currentFolderId).toBe('cat-girl-nuku-nuku'); }); })); @@ -331,6 +496,14 @@ describe('ContentNodeSelectorComponent', () => { describe('Choose button', () => { + const entry: MinimalNodeEntryEntity = {}; + let hasPermission; + + beforeEach(() => { + const alfrescoContentService = TestBed.get(AlfrescoContentService); + spyOn(alfrescoContentService, 'hasPermission').and.callFake(() => hasPermission); + }); + it('should be disabled by default', () => { fixture.detectChanges(); @@ -338,21 +511,57 @@ describe('ContentNodeSelectorComponent', () => { expect(chooseButton.nativeElement.disabled).toBe(true); }); - it('should be enabled when clicking on one element in the list (onNodeSelect)', () => { - fixture.detectChanges(); + it('should be enabled when clicking on a node (with the right permissions) in the list (onNodeSelect)', () => { + hasPermission = true; - component.onNodeSelect({ detail: { node: { entry: {} } } }); + component.onNodeSelect({ detail: { node: { entry } } }); fixture.detectChanges(); let chooseButton = fixture.debugElement.query(By.css('[data-automation-id="content-node-selector-actions-choose"]')); expect(chooseButton.nativeElement.disabled).toBe(false); }); - it('should be disabled when deselecting the previously selected element in the list (onNodeUnselect)', () => { + it('should remain disabled when clicking on a node (with the WRONG permissions) in the list (onNodeSelect)', () => { + hasPermission = false; + + component.onNodeSelect({ detail: { node: { entry } } }); + fixture.detectChanges(); + + let chooseButton = fixture.debugElement.query(By.css('[data-automation-id="content-node-selector-actions-choose"]')); + expect(chooseButton.nativeElement.disabled).toBe(true); + }); + + it('should become disabled when clicking on a node (with the WRONG permissions) after previously selecting a right node', () => { + hasPermission = true; + component.onNodeSelect({ detail: { node: { entry } } }); + fixture.detectChanges(); + + hasPermission = false; + component.onNodeSelect({ detail: { node: { entry } } }); + fixture.detectChanges(); + + let chooseButton = fixture.debugElement.query(By.css('[data-automation-id="content-node-selector-actions-choose"]')); + expect(chooseButton.nativeElement.disabled).toBe(true); + }); + + it('should become disabled when changing directory after previously selecting a right node', () => { + hasPermission = true; + component.onNodeSelect({ detail: { node: { entry } } }); + fixture.detectChanges(); + + component.onFolderChange(); + fixture.detectChanges(); + + let chooseButton = fixture.debugElement.query(By.css('[data-automation-id="content-node-selector-actions-choose"]')); + expect(chooseButton.nativeElement.disabled).toBe(true); + }); + + it('should be disabled when resetting the chosen node', () => { + hasPermission = true; component.onNodeSelect({ detail: { node: { entry: {} } } }); fixture.detectChanges(); - component.onNodeUnselect(); + component.resetChosenNode(); fixture.detectChanges(); let chooseButton = fixture.debugElement.query(By.css('[data-automation-id="content-node-selector-actions-choose"]')); diff --git a/ng2-components/ng2-alfresco-documentlist/src/components/content-node-selector/content-node-selector.component.ts b/ng2-components/ng2-alfresco-documentlist/src/components/content-node-selector/content-node-selector.component.ts index ee114c58cb..4fc08eb040 100644 --- a/ng2-components/ng2-alfresco-documentlist/src/components/content-node-selector/content-node-selector.component.ts +++ b/ng2-components/ng2-alfresco-documentlist/src/components/content-node-selector/content-node-selector.component.ts @@ -15,14 +15,19 @@ * limitations under the License. */ -import { Component, EventEmitter, Inject, Input, Optional, Output, ViewEncapsulation } from '@angular/core'; +import { Component, EventEmitter, Inject, Input, OnInit, Optional, Output, ViewChild, ViewEncapsulation } from '@angular/core'; import { MD_DIALOG_DATA, MdDialogRef } from '@angular/material'; import { MinimalNodeEntryEntity, NodePaging } from 'alfresco-js-api'; -import { AlfrescoTranslationService, SearchOptions, SearchService, SiteModel } from 'ng2-alfresco-core'; +import { AlfrescoContentService, AlfrescoTranslationService, HighlightDirective, SearchOptions, SearchService, SiteModel } from 'ng2-alfresco-core'; +import { ImageResolver, RowFilter } from '../../data/share-datatable-adapter'; +import { DocumentListComponent } from '../document-list.component'; export interface ContentNodeSelectorComponentData { title: string; - select: EventEmitter; + currentFolderId?: string; + rowFilter?: RowFilter; + imageResolver?: ImageResolver; + select: EventEmitter; } @Component({ @@ -31,24 +36,41 @@ export interface ContentNodeSelectorComponentData { templateUrl: './content-node-selector.component.html', encapsulation: ViewEncapsulation.None }) -export class ContentNodeSelectorComponent { +export class ContentNodeSelectorComponent implements OnInit { - nodes: NodePaging|Array; - siteId: null|string; + nodes: NodePaging | Array; + siteId: null | string; searchTerm: string = ''; - searched: boolean = false; + showingSearchResults: boolean = false; inDialog: boolean = false; chosenNode: MinimalNodeEntryEntity | null = null; + folderIdToShow: string | null = null; @Input() title: string; + @Input() + currentFolderId: string | null = null; + + @Input() + rowFilter: RowFilter = null; + + @Input() + imageResolver: ImageResolver = null; + @Output() - select: EventEmitter = new EventEmitter(); + select: EventEmitter = new EventEmitter(); + + @ViewChild(DocumentListComponent) + documentList: DocumentListComponent; + + @ViewChild(HighlightDirective) + highlighter: HighlightDirective; constructor(private searchService: SearchService, + private contentService: AlfrescoContentService, @Optional() translateService: AlfrescoTranslationService, - @Optional() @Inject(MD_DIALOG_DATA) public data?: ContentNodeSelectorComponentData, + @Optional() @Inject(MD_DIALOG_DATA) data?: ContentNodeSelectorComponentData, @Optional() private containingDialog?: MdDialogRef) { if (translateService) { @@ -58,13 +80,20 @@ export class ContentNodeSelectorComponent { if (data) { this.title = data.title; this.select = data.select; + this.currentFolderId = data.currentFolderId; + this.rowFilter = data.rowFilter; + this.imageResolver = data.imageResolver; } - if (containingDialog) { + if (this.containingDialog) { this.inDialog = true; } } + ngOnInit() { + this.folderIdToShow = this.currentFolderId; + } + /** * Updates the site attribute and starts a new search * @@ -85,14 +114,33 @@ export class ContentNodeSelectorComponent { this.querySearch(); } + needBreadcrumbs() { + const whenInFolderNavigation = !this.showingSearchResults, + whenInSelectingSearchResult = this.showingSearchResults && this.chosenNode; + + return whenInFolderNavigation || whenInSelectingSearchResult; + } + + /** + * Returns the actually selected|entered folder node or null in case of searching for the breadcrumb + */ + get breadcrumbFolderNode(): MinimalNodeEntryEntity|null { + if (this.showingSearchResults && this.chosenNode) { + return this.chosenNode; + } else { + return this.documentList.folderNode; + } + } + /** * Clear the search input */ clear(): void { - this.searched = false; this.searchTerm = ''; this.nodes = []; this.chosenNode = null; + this.showingSearchResults = false; + this.folderIdToShow = this.currentFolderId; } /** @@ -100,39 +148,65 @@ export class ContentNodeSelectorComponent { */ private querySearch(): void { if (this.searchTerm.length > 3) { + this.chosenNode = null; + const searchTerm = this.searchTerm + '*'; let searchOpts: SearchOptions = { - include: ['path'], + include: ['path', 'allowableOperations'], skipCount: 0, rootNodeId: this.siteId, nodeType: 'cm:folder', - maxItems: 40, + maxItems: 200, orderBy: null }; this.searchService .getNodeQueryResults(searchTerm, searchOpts) .subscribe( results => { - this.searched = true; + this.showingSearchResults = true; + this.folderIdToShow = null; this.nodes = results; + this.highlight(); } ); } } + /** + * Hightlight the actual searchterm in the next frame + */ + highlight() { + setTimeout(() => { + this.highlighter.highlight(this.searchTerm); + }, 0); + } + /** * Invoked when user selects a node * * @param event CustomEvent for node-select */ onNodeSelect(event: any): void { - this.chosenNode = event.detail.node.entry; + const entry: MinimalNodeEntryEntity = event.detail.node.entry; + if (this.contentService.hasPermission(entry, 'update')) { + this.chosenNode = entry; + } else { + this.resetChosenNode(); + } } /** - * * Invoked when user unselects a node + * Sets showingSearchResults state to be able to differentiate between search results or folder results */ - onNodeUnselect(): void { + onFolderChange() { + this.showingSearchResults = false; + this.chosenNode = null; + } + + /** + * Clears the chosen node + */ + resetChosenNode(): void { this.chosenNode = null; } @@ -140,7 +214,8 @@ export class ContentNodeSelectorComponent { * Emit event with the chosen node */ choose(): void { - this.select.next(this.chosenNode); + // Multiple selections to be implemented... + this.select.next([this.chosenNode]); } /** diff --git a/ng2-components/ng2-alfresco-documentlist/src/components/document-list.component.spec.ts b/ng2-components/ng2-alfresco-documentlist/src/components/document-list.component.spec.ts index c89a00c220..973aeda04e 100644 --- a/ng2-components/ng2-alfresco-documentlist/src/components/document-list.component.spec.ts +++ b/ng2-components/ng2-alfresco-documentlist/src/components/document-list.component.spec.ts @@ -728,20 +728,33 @@ describe('DocumentList', () => { expect(element.querySelector('alfresco-pagination')).toBe(null); }); - it('should set row filter for underlying adapter', () => { + it('should set row filter and reload contents if currentFolderId is set when setting rowFilter', () => { let filter = {}; documentList.currentFolderId = 'id'; spyOn(documentList.data, 'setFilter').and.callThrough(); + spyOn(documentListService, 'getFolder'); + + documentList.ngOnChanges({rowFilter: new SimpleChange(null, filter, true)}); - documentList.rowFilter = filter; expect(documentList.data.setFilter).toHaveBeenCalledWith(filter); + expect(documentListService.getFolder).toHaveBeenCalled(); + }); + + it('should NOT reload contents if currentFolderId is NOT set when setting rowFilter', () => { + documentList.currentFolderId = null; + spyOn(documentListService, 'getFolder'); + + documentList.ngOnChanges({rowFilter: new SimpleChange(null, {}, true)}); + + expect(documentListService.getFolder).not.toHaveBeenCalled(); }); it('should set image resolver for underlying adapter', () => { let resolver = {}; spyOn(documentList.data, 'setImageResolver').and.callThrough(); - documentList.imageResolver = resolver; + documentList.ngOnChanges({imageResolver: new SimpleChange(null, resolver, true)}); + expect(documentList.data.setImageResolver).toHaveBeenCalledWith(resolver); }); diff --git a/ng2-components/ng2-alfresco-documentlist/src/components/document-list.component.ts b/ng2-components/ng2-alfresco-documentlist/src/components/document-list.component.ts index b570a89932..ee562d7a06 100644 --- a/ng2-components/ng2-alfresco-documentlist/src/components/document-list.component.ts +++ b/ng2-components/ng2-alfresco-documentlist/src/components/document-list.component.ts @@ -103,19 +103,10 @@ export class DocumentListComponent implements OnInit, OnChanges, AfterContentIni pagination: Pagination; @Input() - set rowFilter(value: RowFilter) { - if (this.data && value && this.currentFolderId) { - this.data.setFilter(value); - this.loadFolderNodesByFolderNodeId(this.currentFolderId, this.pageSize, this.skipCount); - } - } + rowFilter: RowFilter|null = null; @Input() - set imageResolver(value: ImageResolver) { - if (this.data) { - this.data.setImageResolver(value); - } - } + imageResolver: ImageResolver|null = null; // The identifier of a node. You can also use one of these well-known aliases: -my- | -shared- | -root- @Input() @@ -198,8 +189,16 @@ export class DocumentListComponent implements OnInit, OnChanges, AfterContentIni ngOnInit() { this.data = new ShareDataTableAdapter(this.documentListService, null, this.getDefaultSorting()); this.data.thumbnails = this.thumbnails; - this.data.permissionsStyle = this.permissionsStyle; + + if (this.rowFilter) { + this.data.setFilter(this.rowFilter); + } + + if (this.imageResolver) { + this.data.setImageResolver(this.imageResolver); + } + this.contextActionHandler.subscribe(val => this.contextActionCallback(val)); this.enforceSingleClickNavigationForMobile(); @@ -229,9 +228,16 @@ export class DocumentListComponent implements OnInit, OnChanges, AfterContentIni this.loadFolder(); } else if (changes['currentFolderId'] && changes['currentFolderId'].currentValue) { this.loadFolderByNodeId(changes['currentFolderId'].currentValue); - } else if (changes['node'] && changes['node'].currentValue) { - if (this.data) { + } else if (this.data) { + if (changes['node'] && changes['node'].currentValue) { this.data.loadPage(changes['node'].currentValue); + } else if (changes['rowFilter']) { + this.data.setFilter(changes['rowFilter'].currentValue); + if (this.currentFolderId) { + this.loadFolderNodesByFolderNodeId(this.currentFolderId, this.pageSize, this.skipCount); + } + } else if (changes['imageResolver']) { + this.data.setImageResolver(changes['imageResolver'].currentValue); } } } diff --git a/ng2-components/ng2-alfresco-documentlist/src/i18n/en.json b/ng2-components/ng2-alfresco-documentlist/src/i18n/en.json index 736148e672..fac5f0c09a 100644 --- a/ng2-components/ng2-alfresco-documentlist/src/i18n/en.json +++ b/ng2-components/ng2-alfresco-documentlist/src/i18n/en.json @@ -34,7 +34,8 @@ }, "ERROR": { "CONFLICT": "Name already exists in target location.", - "UNKNOWN": "Unknown error happened." + "UNKNOWN": "Unknown error happened.", + "PERMISSION": "You don't have the permission to perform this action." } } } diff --git a/ng2-components/ng2-alfresco-documentlist/src/services/document-actions.service.spec.ts b/ng2-components/ng2-alfresco-documentlist/src/services/document-actions.service.spec.ts index 3ef791bd3f..2711423e4c 100644 --- a/ng2-components/ng2-alfresco-documentlist/src/services/document-actions.service.spec.ts +++ b/ng2-components/ng2-alfresco-documentlist/src/services/document-actions.service.spec.ts @@ -36,9 +36,9 @@ describe('DocumentActionsService', () => { documentListService = new DocumentListServiceMock(); contentService = new AlfrescoContentService(null, null, null); translateService = { addTranslationFolder: () => {}}; - nodeActionsService = new NodeActionsService(null, translateService, null, null); + nodeActionsService = new NodeActionsService(null, null, null); notificationService = new NotificationService(null); - service = new DocumentActionsService(translateService, notificationService, nodeActionsService, documentListService, contentService); + service = new DocumentActionsService(nodeActionsService, documentListService, contentService); }); it('should register default download action', () => { @@ -70,7 +70,7 @@ describe('DocumentActionsService', () => { let file = new FileNode(); expect(service.canExecuteAction(file)).toBeTruthy(); - service = new DocumentActionsService(translateService, notificationService, nodeActionsService); + service = new DocumentActionsService(nodeActionsService); expect(service.canExecuteAction(file)).toBeFalsy(); }); @@ -191,7 +191,7 @@ describe('DocumentActionsService', () => { }); it('should require internal service for download action', () => { - let actionService = new DocumentActionsService(translateService, notificationService, nodeActionsService, null, contentService); + let actionService = new DocumentActionsService(nodeActionsService, null, contentService); let file = new FileNode(); let result = actionService.getHandler('download')(file); result.subscribe((value) => { @@ -200,7 +200,7 @@ describe('DocumentActionsService', () => { }); it('should require content service for download action', () => { - let actionService = new DocumentActionsService(translateService, notificationService, nodeActionsService, documentListService, null); + let actionService = new DocumentActionsService(nodeActionsService, documentListService, null); let file = new FileNode(); let result = actionService.getHandler('download')(file); result.subscribe((value) => { diff --git a/ng2-components/ng2-alfresco-documentlist/src/services/document-actions.service.ts b/ng2-components/ng2-alfresco-documentlist/src/services/document-actions.service.ts index 57100cb957..7b7236747d 100644 --- a/ng2-components/ng2-alfresco-documentlist/src/services/document-actions.service.ts +++ b/ng2-components/ng2-alfresco-documentlist/src/services/document-actions.service.ts @@ -17,7 +17,7 @@ import { Injectable } from '@angular/core'; import { MinimalNodeEntity } from 'alfresco-js-api'; -import { AlfrescoContentService, AlfrescoTranslationService, NotificationService } from 'ng2-alfresco-core'; +import { AlfrescoContentService } from 'ng2-alfresco-core'; import { Observable } from 'rxjs/Observable'; import { Subject } from 'rxjs/Rx'; import { ContentActionHandler } from '../models/content-action.model'; @@ -29,18 +29,15 @@ import { NodeActionsService } from './node-actions.service'; export class DocumentActionsService { permissionEvent: Subject = new Subject(); + error: Subject = new Subject(); + success: Subject = new Subject(); private handlers: { [id: string]: ContentActionHandler; } = {}; - constructor(private translateService: AlfrescoTranslationService, - private notificationService: NotificationService, - private nodeActionsService: NodeActionsService, + constructor(private nodeActionsService: NodeActionsService, private documentListService?: DocumentListService, private contentService?: AlfrescoContentService) { this.setupActionHandlers(); - if (translateService) { - translateService.addTranslationFolder('ng2-alfresco-documentlist', 'assets/ng2-alfresco-documentlist'); - } } getHandler(key: string): ContentActionHandler { @@ -99,25 +96,12 @@ export class DocumentActionsService { private prepareHandlers(actionObservable, type: string, action: string, target?: any, permission?: string): void { actionObservable.subscribe( (fileOperationMessage) => { - this.notificationService.openSnackMessage(fileOperationMessage, 3000); if (target && typeof target.reload === 'function') { target.reload(); } + this.success.next(fileOperationMessage); }, - (errorStatusCode) => { - switch (errorStatusCode) { - case 403: - this.permissionEvent.next(new PermissionModel({type, action, permission})); - break; - case 409: - let conflictError: any = this.translateService.get('OPERATION.ERROR.CONFLICT'); - this.notificationService.openSnackMessage(conflictError.value, 3000); - break; - default: - let unknownError: any = this.translateService.get('OPERATION.ERROR.UNKNOWN'); - this.notificationService.openSnackMessage(unknownError.value, 3000); - } - } + this.error.next.bind(this.error) ); } diff --git a/ng2-components/ng2-alfresco-documentlist/src/services/folder-actions.service.ts b/ng2-components/ng2-alfresco-documentlist/src/services/folder-actions.service.ts index a376da6d3c..6aa7d76392 100644 --- a/ng2-components/ng2-alfresco-documentlist/src/services/folder-actions.service.ts +++ b/ng2-components/ng2-alfresco-documentlist/src/services/folder-actions.service.ts @@ -17,7 +17,7 @@ import { Injectable } from '@angular/core'; import { MinimalNodeEntity } from 'alfresco-js-api'; -import { AlfrescoContentService, AlfrescoTranslationService, NotificationService } from 'ng2-alfresco-core'; +import { AlfrescoContentService } from 'ng2-alfresco-core'; import { Observable, Subject } from 'rxjs/Rx'; import { ContentActionHandler } from '../models/content-action.model'; import { PermissionModel } from '../models/permissions.model'; @@ -28,12 +28,12 @@ import { NodeActionsService } from './node-actions.service'; export class FolderActionsService { permissionEvent: Subject = new Subject(); + error: Subject = new Subject(); + success: Subject = new Subject(); private handlers: { [id: string]: ContentActionHandler; } = {}; - constructor(private translateService: AlfrescoTranslationService, - private notificationService: NotificationService, - private nodeActionsService: NodeActionsService, + constructor(private nodeActionsService: NodeActionsService, private documentListService: DocumentListService, private contentService: AlfrescoContentService) { this.setupActionHandlers(); @@ -81,25 +81,12 @@ export class FolderActionsService { private prepareHandlers(actionObservable, type: string, action: string, target?: any, permission?: string): void { actionObservable.subscribe( (fileOperationMessage) => { - this.notificationService.openSnackMessage(fileOperationMessage, 3000); if (target && typeof target.reload === 'function') { target.reload(); } + this.success.next(fileOperationMessage); }, - (errorStatusCode) => { - switch (errorStatusCode) { - case 403: - this.permissionEvent.next(new PermissionModel({type, action, permission})); - break; - case 409: - let conflictError: any = this.translateService.get('OPERATION.ERROR.CONFLICT'); - this.notificationService.openSnackMessage(conflictError.value, 3000); - break; - default: - let unknownError: any = this.translateService.get('OPERATION.ERROR.UNKNOWN'); - this.notificationService.openSnackMessage(unknownError.value, 3000); - } - } + this.error.next.bind(this.error) ); } diff --git a/ng2-components/ng2-alfresco-documentlist/src/services/node-actions.service.ts b/ng2-components/ng2-alfresco-documentlist/src/services/node-actions.service.ts index 3c25dc40bf..8874cae7a3 100644 --- a/ng2-components/ng2-alfresco-documentlist/src/services/node-actions.service.ts +++ b/ng2-components/ng2-alfresco-documentlist/src/services/node-actions.service.ts @@ -18,22 +18,19 @@ import { EventEmitter, Injectable } from '@angular/core'; import { MdDialog } from '@angular/material'; import { MinimalNodeEntryEntity } from 'alfresco-js-api'; -import { AlfrescoContentService, AlfrescoTranslationService } from 'ng2-alfresco-core'; +import { AlfrescoContentService } from 'ng2-alfresco-core'; +import { DataColumn } from 'ng2-alfresco-datatable'; import { Subject } from 'rxjs/Rx'; -import { ContentNodeSelectorComponent } from '../components/content-node-selector/content-node-selector.component'; +import { ContentNodeSelectorComponent, ContentNodeSelectorComponentData } from '../components/content-node-selector/content-node-selector.component'; +import { ShareDataRow } from '../data/share-datatable-adapter'; import { DocumentListService } from './document-list.service'; @Injectable() export class NodeActionsService { constructor(private dialog: MdDialog, - private translateService: AlfrescoTranslationService, private documentListService?: DocumentListService, - private contentService?: AlfrescoContentService) { - if (translateService) { - translateService.addTranslationFolder('ng2-alfresco-documentlist', 'assets/ng2-alfresco-documentlist'); - } - } + private contentService?: AlfrescoContentService) {} /** * Copy content node @@ -87,34 +84,49 @@ export class NodeActionsService { const observable: Subject = new Subject(); if (this.contentService.hasPermission(contentEntry, permission)) { - const title = `${action} ${contentEntry.name} to ...`, - select: EventEmitter = new EventEmitter(); + const data: ContentNodeSelectorComponentData = { + title: `${action} ${contentEntry.name} to ...`, + currentFolderId: contentEntry.parentId, + rowFilter: this.rowFilter.bind(this, contentEntry.id), + imageResolver: this.imageResolver.bind(this), + select: new EventEmitter() + }; - this.dialog.open(ContentNodeSelectorComponent, { - data: { title, select }, - panelClass: 'adf-content-node-selector-dialog', - width: '576px' - }); + this.dialog.open(ContentNodeSelectorComponent, { data, panelClass: 'adf-content-node-selector-dialog', width: '576px' }); - select.subscribe((parent: MinimalNodeEntryEntity) => { - this.documentListService[`${action}Node`].call(this.documentListService, contentEntry.id, parent.id) + data.select.subscribe((selections: MinimalNodeEntryEntity[]) => { + const selection = selections[0]; + this.documentListService[`${action}Node`].call(this.documentListService, contentEntry.id, selection.id) .subscribe( - () => { - let fileOperationMessage: any = this.translateService.get(`OPERATION.SUCCES.${type.toUpperCase()}.${action.toUpperCase()}`); - observable.next(fileOperationMessage.value); - }, - (errors) => { - const errorStatusCode = JSON.parse(errors.message).error.statusCode; - observable.error(errorStatusCode); - } + observable.next.bind(observable, `OPERATION.SUCCES.${type.toUpperCase()}.${action.toUpperCase()}`), + observable.error.bind(observable) ); this.dialog.closeAll(); }); return observable; } else { - observable.error(403); + observable.error(new Error(JSON.stringify({ error: { statusCode: 403 } }))); return observable; } } + + private rowFilter(currentNodeId, row: ShareDataRow): boolean { + const node: MinimalNodeEntryEntity = row.node.entry; + + if (node.id === currentNodeId || node.isFile) { + return false; + } else { + return true; + } + } + + private imageResolver(row: ShareDataRow, col: DataColumn): string|null { + const entry: MinimalNodeEntryEntity = row.node.entry; + if (!this.contentService.hasPermission(entry, 'update')) { + return this.documentListService.getMimeTypeIcon('disable/folder'); + } + + return null; + } }