From 2761626f5534639ac6501e2acd40b5713053fb58 Mon Sep 17 00:00:00 2001 From: Eugenio Romano Date: Tue, 20 Mar 2018 22:32:56 +0000 Subject: [PATCH] [ADF-ADF-2528] share directive (#3102) * share file directive * share link phase 2 * share dialog * share dialog test * more documentation * add more meaningfully specification * Add description in the dialog --- .../app/components/files/files.component.html | 8 ++ .../app/components/files/files.component.ts | 5 +- demo-shell/src/custom-style.scss | 2 - demo-shell/tslint.json | 1 - docs/content-services/README.md | 1 + docs/content-services/share.directive.md | 49 ++++++++ docs/docassets/images/share-directive.png | Bin 0 -> 65734 bytes lib/content-services/content.module.ts | 10 +- lib/content-services/dialogs/dialog.module.ts | 10 +- lib/content-services/dialogs/public-api.ts | 1 + .../dialogs/share.dialog.html | 32 +++++ .../dialogs/share.dialog.scss | 14 +++ .../dialogs/share.dialog.spec.ts | 109 ++++++++++++++++ lib/content-services/dialogs/share.dialog.ts | 97 ++++++++++++++ .../directives/content-directive.module.ts | 40 ++++++ lib/content-services/directives/index.ts | 18 +++ .../directives/node-share.directive.spec.ts | 118 ++++++++++++++++++ .../directives/node-share.directive.ts | 74 +++++++++++ lib/content-services/directives/public-api.ts | 19 +++ lib/content-services/i18n/en.json | 34 +++-- lib/content-services/index.ts | 3 +- lib/content-services/material.module.ts | 6 +- lib/core/services/shared-links-api.service.ts | 41 +++++- lib/tslint.json | 3 +- 24 files changed, 660 insertions(+), 35 deletions(-) create mode 100644 docs/content-services/share.directive.md create mode 100644 docs/docassets/images/share-directive.png create mode 100644 lib/content-services/dialogs/share.dialog.html create mode 100644 lib/content-services/dialogs/share.dialog.scss create mode 100644 lib/content-services/dialogs/share.dialog.spec.ts create mode 100644 lib/content-services/dialogs/share.dialog.ts create mode 100644 lib/content-services/directives/content-directive.module.ts create mode 100644 lib/content-services/directives/index.ts create mode 100644 lib/content-services/directives/node-share.directive.spec.ts create mode 100644 lib/content-services/directives/node-share.directive.ts create mode 100644 lib/content-services/directives/public-api.ts diff --git a/demo-shell/src/app/components/files/files.component.html b/demo-shell/src/app/components/files/files.component.html index f3f7301218..bd12d5899f 100644 --- a/demo-shell/src/app/components/files/files.component.html +++ b/demo-shell/src/app/components/files/files.component.html @@ -106,6 +106,14 @@ {{ favorite.hasFavorites() ? 'star' :'star_border' }} + + + + + ... + +``` + +### Properties + +| Name | Type | Default value | Description | +| ---- | ---- | ------------- | ----------- | +| node | `MinimalNodeEntity` | | Nodes to share. | +| baseShareUrl | `string` | | baseShareUrl to add as prefix to the generated link | + + diff --git a/docs/docassets/images/share-directive.png b/docs/docassets/images/share-directive.png new file mode 100644 index 0000000000000000000000000000000000000000..c09ce503f3f02fa356066b92f859e83da074a989 GIT binary patch literal 65734 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 lWf8vwzMCCe57lOZ1X66eg52q*yMTYU)U{{ 'SHARE.TITLE' | translate }} {{fileName}} + + + + + + {{ 'SHARE.ACTIONS.SHARE' | translate }} + + + + + . + +

{{ 'SHARE.DESCRIPTION' | translate }}

+
{{ 'SHARE.ALERT' | translate }}
+ +
+ + + link + +
+ +

{{ 'SHARE.UNSHARED' | translate }}

+ +
+ + + + diff --git a/lib/content-services/dialogs/share.dialog.scss b/lib/content-services/dialogs/share.dialog.scss new file mode 100644 index 0000000000..4a2bde0edf --- /dev/null +++ b/lib/content-services/dialogs/share.dialog.scss @@ -0,0 +1,14 @@ +.spacer { flex: 1 1 auto; } + +.adf-share-dialog .mat-dialog-actions .mat-button-wrapper { + text-transform: uppercase; +} + +.full-width { + width: 100%; +} + +.adf-share-link { + margin-left: 10px; + font-size: 18px !important; +} diff --git a/lib/content-services/dialogs/share.dialog.spec.ts b/lib/content-services/dialogs/share.dialog.spec.ts new file mode 100644 index 0000000000..a1b12d4a86 --- /dev/null +++ b/lib/content-services/dialogs/share.dialog.spec.ts @@ -0,0 +1,109 @@ +/*! + * @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 { async, TestBed } from '@angular/core/testing'; +import { ComponentFixture } from '@angular/core/testing'; +import { FormsModule, ReactiveFormsModule } from '@angular/forms'; +import { MatDialogRef, MAT_DIALOG_DATA } from '@angular/material'; +import { BrowserDynamicTestingModule } from '@angular/platform-browser-dynamic/testing'; +import { Observable } from 'rxjs/Observable'; + +import { ShareDialogComponent } from './share.dialog'; + +describe('ShareDialogComponent', () => { + + let fixture: ComponentFixture; + let component: ShareDialogComponent; + let dialogRef; + + let data: any = { + node: { entry: { properties: { 'qshare:sharedId': 'example-link' }, name: 'example-name' } } + baseShareUrl: 'baseShareUrl-example' + }; + + beforeEach(async(() => { + dialogRef = { + close: jasmine.createSpy('close') + }; + + TestBed.configureTestingModule({ + imports: [ + FormsModule, + ReactiveFormsModule, + BrowserDynamicTestingModule + ], + declarations: [ + ShareDialogComponent + ], + providers: [ + { provide: MatDialogRef, useValue: dialogRef }, + { + provide: MAT_DIALOG_DATA, + useValue: data + } + ] + }); + + TestBed.overrideModule(BrowserDynamicTestingModule, { + set: { entryComponents: [ShareDialogComponent] } + }); + + TestBed.compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(ShareDialogComponent); + component = fixture.componentInstance; + + fixture.detectChanges(); + }); + + it('should init the dialog with the file name and baseShareUrl', () => { + expect(component.fileName).toBe('example-name'); + expect(component.baseShareUrl).toBe('baseShareUrl-example'); + }); + + describe('public link creation', () => { + + it('should not create the public link if it alredy present in the node', () => { + let spyCreate = spyOn(component, 'createSharedLinks').and.returnValue(Observable.of('')); + + component.ngOnInit(); + + expect(spyCreate).not.toHaveBeenCalled(); + }); + + it('should not create the public link if it alredy present in the node', () => { + component.data = { + node: { entry: { name: 'example-name' } } + baseShareUrl: 'baseShareUrl-example' + }; + + let spyCreate = spyOn(component, 'createSharedLinks').and.returnValue(Observable.of('')); + + data = { + node: { entry: { name: 'example-name' } } + baseShareUrl: 'baseShareUrl-example' + }; + + component.ngOnInit(); + + expect(spyCreate).toHaveBeenCalled(); + }); + }); + +}); diff --git a/lib/content-services/dialogs/share.dialog.ts b/lib/content-services/dialogs/share.dialog.ts new file mode 100644 index 0000000000..3b43a79726 --- /dev/null +++ b/lib/content-services/dialogs/share.dialog.ts @@ -0,0 +1,97 @@ +/*! + * @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, Inject, OnInit, ViewEncapsulation } from '@angular/core'; +import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material'; +import { SharedLinksApiService } from '@alfresco/adf-core'; +import { SharedLinkEntry } from 'alfresco-js-api'; + +@Component({ + selector: 'adf-share-dialog', + templateUrl: './share.dialog.html', + styleUrls: ['./share.dialog.scss'], + host: { 'class': 'adf-share-dialog' }, + encapsulation: ViewEncapsulation.None +}) +export class ShareDialogComponent implements OnInit { + + sharedId: string; + + fileName: string; + baseShareUrl: string; + + isFileShared: boolean = false; + isDisabled: boolean = false; + + constructor(private sharedLinksApiService: SharedLinksApiService, + private dialogRef: MatDialogRef, + @Inject(MAT_DIALOG_DATA) + public data: any) { + } + + ngOnInit() { + if (this.data.node && this.data.node.entry) { + this.fileName = this.data.node.entry.name; + this.baseShareUrl = this.data.baseShareUrl; + + if (this.data.node.entry.properties && this.data.node.entry.properties['qshare:sharedId']) { + this.sharedId = this.data.node.entry.properties['qshare:sharedId']; + this.isFileShared = true; + } else { + this.createSharedLinks(this.data.node.entry.id); + } + } + } + + cancelShare() { + this.dialogRef.close(false); + } + + onSlideShareChange(event: any) { + this.isDisabled = true; + if (event.checked) { + this.createSharedLinks(this.data.node.entry.id); + } else { + this.deleteSharedLink(this.sharedId); + } + } + + createSharedLinks(nodeId: string) { + this.sharedLinksApiService.createSharedLinks(nodeId).subscribe((sharedLink: SharedLinkEntry) => { + if (sharedLink.entry) { + this.sharedId = sharedLink.entry.id; + this.isFileShared = true; + this.isDisabled = false; + } + }, + () => { + this.isFileShared = false; + this.isDisabled = false; + }); + } + + deleteSharedLink(sharedId: string) { + this.sharedLinksApiService.deleteSharedLink(sharedId).subscribe(() => { + this.isFileShared = false; + this.isDisabled = false; + }, + () => { + this.isFileShared = true; + this.isDisabled = false; + }); + } +} diff --git a/lib/content-services/directives/content-directive.module.ts b/lib/content-services/directives/content-directive.module.ts new file mode 100644 index 0000000000..8041afb301 --- /dev/null +++ b/lib/content-services/directives/content-directive.module.ts @@ -0,0 +1,40 @@ +/*! + * @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 { CommonModule } from '@angular/common'; +import { NgModule } from '@angular/core'; +import { MaterialModule } from '../material.module'; + +import { NodeDownloadDirective } from './node-download.directive'; +import { NodeSharedDirective } from './node-share.directive'; + +@NgModule({ + imports: [ + CommonModule, + MaterialModule + ], + declarations: [ + NodeDownloadDirective, + NodeSharedDirective + ], + exports: [ + NodeDownloadDirective, + NodeSharedDirective + ] +}) +export class ContentDirectiveModule { +} diff --git a/lib/content-services/directives/index.ts b/lib/content-services/directives/index.ts new file mode 100644 index 0000000000..4c6ac1d58f --- /dev/null +++ b/lib/content-services/directives/index.ts @@ -0,0 +1,18 @@ +/*! + * @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 * from './public-api'; diff --git a/lib/content-services/directives/node-share.directive.spec.ts b/lib/content-services/directives/node-share.directive.spec.ts new file mode 100644 index 0000000000..4c681a67ef --- /dev/null +++ b/lib/content-services/directives/node-share.directive.spec.ts @@ -0,0 +1,118 @@ +/*! + * @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, DebugElement } from '@angular/core'; +import { fakeAsync, async, ComponentFixture, TestBed } from '@angular/core/testing'; +import { By } from '@angular/platform-browser'; +import { NodeSharedDirective } from './node-share.directive'; +import { DialogModule } from '../dialogs/dialog.module'; +import { MatDialog } from '@angular/material'; + +@Component({ + template: ` +
+
` +}) +class TestComponent { + node = null; + + done = jasmine.createSpy('done'); +} + +describe('NodeSharedDirective', () => { + let fixture: ComponentFixture; + let element: DebugElement; + let component: TestComponent; + let dialog: MatDialog; + let dialogSpy; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + imports: [ + DialogModule + ], + declarations: [ + TestComponent, + NodeSharedDirective + ] + }) + .compileComponents() + .then(() => { + fixture = TestBed.createComponent(TestComponent); + component = fixture.componentInstance; + dialog = TestBed.get(MatDialog); + element = fixture.debugElement.query(By.directive(NodeSharedDirective)); + dialogSpy = spyOn(dialog, 'open'); + }); + })); + + describe('Share', () => { + + it('should not share when selection has no nodes', () => { + component.node = null; + + fixture.detectChanges(); + element.triggerEventHandler('click', null); + + expect(dialogSpy).not.toHaveBeenCalled(); + }); + + it('should not share when the selection node is a folder', () => { + component.node = { + entry: { + isFolder: true + } + }; + + fixture.detectChanges(); + element.triggerEventHandler('click', null); + + expect(dialogSpy).not.toHaveBeenCalled(); + }); + + it('should share when the selection node is a file', () => { + component.node = { + entry: { + isFolder: false, + isFile: true + } + }; + + fixture.detectChanges(); + element.triggerEventHandler('click', null); + + expect(dialogSpy).toHaveBeenCalled(); + }); + + it('should disable the button if no node is selected', fakeAsync(() => { + component.node = null; + + fixture.detectChanges(); + + expect(element.nativeElement.disabled).toEqual(true); + })); + + it('should enable the button if nodes is selected and is a file', fakeAsync(() => { + component.node = { entry: { id: '1', name: 'name1' isFolder: false, isFile: true } }; + + fixture.detectChanges(); + + expect(element.nativeElement.disabled).toEqual(false); + })); + + }); +}); diff --git a/lib/content-services/directives/node-share.directive.ts b/lib/content-services/directives/node-share.directive.ts new file mode 100644 index 0000000000..7ae5e55fe9 --- /dev/null +++ b/lib/content-services/directives/node-share.directive.ts @@ -0,0 +1,74 @@ +/*! + * @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, Input, HostListener, ElementRef, OnChanges } from '@angular/core'; +import { MatDialog } from '@angular/material'; +import { MinimalNodeEntity } from 'alfresco-js-api'; + +import { ShareDialogComponent } from '../dialogs/share.dialog'; + +@Directive({ + selector: '[adf-share]' +}) +export class NodeSharedDirective implements OnChanges { + + /** Node to share. */ + // tslint:disable-next-line:no-input-rename + @Input('adf-share') + node: MinimalNodeEntity; + + @Input() + baseShareUrl: string; + + @HostListener('click') + onClick() { + this.shareNode(this.node); + } + + constructor(private dialog: MatDialog, + private elementRef: ElementRef) { + } + + shareNode(node: MinimalNodeEntity) { + if (node.entry && node.entry.isFile) { + this.setDisableAttribute(true); + this.dialog.open(ShareDialogComponent, { + width: '600px', + disableClose: true, + data: { + node: node, + baseShareUrl: this.baseShareUrl + } + }); + } else { + this.setDisableAttribute(true); + } + } + + ngOnChanges() { + if (!this.node || this.node.entry.isFolder) { + this.setDisableAttribute(true); + } else { + this.setDisableAttribute(false); + } + } + + private setDisableAttribute(disable: boolean) { + this.elementRef.nativeElement.disabled = disable; + } + +} diff --git a/lib/content-services/directives/public-api.ts b/lib/content-services/directives/public-api.ts new file mode 100644 index 0000000000..a8f2d374a4 --- /dev/null +++ b/lib/content-services/directives/public-api.ts @@ -0,0 +1,19 @@ +/*! + * @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 * from './node-download.directive'; +export * from './node-share.directive'; diff --git a/lib/content-services/i18n/en.json b/lib/content-services/i18n/en.json index 2f4de676ac..da1c7bb068 100644 --- a/lib/content-services/i18n/en.json +++ b/lib/content-services/i18n/en.json @@ -182,17 +182,29 @@ }, "METADATA": { "BASIC": { - "HEADER": "Properties", - "NAME": "Name", - "TITLE": "Title", - "DESCRIPTION": "Description", - "AUTHOR": "Author", - "MIMETYPE": "Mimetype", - "SIZE": "Size", - "CREATOR": "Creator", - "CREATED_DATE": "Created Date", - "MODIFIER": "Modifier", - "MODIFIED_DATE": "Modified Date" + "HEADER": "Properties", + "NAME": "Name", + "TITLE": "Title", + "DESCRIPTION": "Description", + "AUTHOR": "Author", + "MIMETYPE": "Mimetype", + "SIZE": "Size", + "CREATOR": "Creator", + "CREATED_DATE": "Created Date", + "MODIFIER": "Modifier", + "MODIFIED_DATE": "Modified Date" + } + }, + "SHARE": { + "TITLE": "Share", + "PUBLIC-LINK": "Public link", + "UNSHARED": "File not shared", + "DESCRIPTION": "This is a link to your file", + "ALERT": "Anyone with this link can acces to it", + "ACTIONS": { + "SHARE": "SHARE", + "CLOSE": "CLOSE", + "COPY-LINK": "COPY LINK" } } } diff --git a/lib/content-services/index.ts b/lib/content-services/index.ts index ae5b1320d0..454cd8b0dc 100644 --- a/lib/content-services/index.ts +++ b/lib/content-services/index.ts @@ -30,8 +30,9 @@ export * from './content-node-selector/content-node-selector.module'; export * from './dialogs/dialog.module'; export * from './folder-directive/folder-directive.module'; export * from './content-metadata/content-metadata.module'; -export { NodeDownloadDirective } from './directives/node-download.directive'; +export * from './directives/content-directive.module'; +export * from './directives'; export * from './social'; export * from './tag'; export * from './webscript'; diff --git a/lib/content-services/material.module.ts b/lib/content-services/material.module.ts index 4eb6c5c1f4..488f82a6ec 100644 --- a/lib/content-services/material.module.ts +++ b/lib/content-services/material.module.ts @@ -30,7 +30,8 @@ import { MatProgressSpinnerModule, MatRippleModule, MatExpansionModule, - MatSelectModule + MatSelectModule, + MatSlideToggleModule } from '@angular/material'; export function modules() { @@ -48,7 +49,8 @@ export function modules() { MatMenuModule, MatOptionModule, MatExpansionModule, - MatSelectModule + MatSelectModule, + MatSlideToggleModule ]; } diff --git a/lib/core/services/shared-links-api.service.ts b/lib/core/services/shared-links-api.service.ts index 5dca85cfb6..d0679f9e65 100644 --- a/lib/core/services/shared-links-api.service.ts +++ b/lib/core/services/shared-links-api.service.ts @@ -16,7 +16,7 @@ */ import { Injectable } from '@angular/core'; -import { NodePaging } from 'alfresco-js-api'; +import { NodePaging, SharedLinkEntry } from 'alfresco-js-api'; import { Observable } from 'rxjs/Observable'; import { AlfrescoApiService } from './alfresco-api.service'; import { UserPreferencesService } from './user-preferences.service'; @@ -25,12 +25,12 @@ import 'rxjs/add/observable/fromPromise'; @Injectable() export class SharedLinksApiService { - constructor( - private apiService: AlfrescoApiService, - private preferences: UserPreferencesService) {} + constructor(private apiService: AlfrescoApiService, + private preferences: UserPreferencesService) { + } private get sharedLinksApi() { - return this.apiService.getInstance().core.sharedlinksApi; + return this.apiService.getInstance().core.sharedlinksApi; } /** @@ -42,7 +42,7 @@ export class SharedLinksApiService { const defaultOptions = { maxItems: this.preferences.paginationSize, skipCount: 0, - include: [ 'properties', 'allowableOperations' ] + include: ['properties', 'allowableOperations'] }; const queryOptions = Object.assign({}, defaultOptions, options); const promise = sharedLinksApi @@ -53,6 +53,35 @@ export class SharedLinksApiService { .catch(handleError); } + /** + * Create a shared links available to the current user. + * @param nodeId + * @param options Options supported by JSAPI + */ + createSharedLinks(nodeId: string, options: any = {}): Observable { + const { sharedLinksApi, handleError } = this; + + const promise = sharedLinksApi.addSharedLink({ nodeId: nodeId }); + + return Observable + .fromPromise(promise) + .catch(handleError); + } + + /** + * delete shared links + * @param sharedId to delete + */ + deleteSharedLink(sharedId: string): Observable { + const { sharedLinksApi, handleError } = this; + + const promise = sharedLinksApi.deleteSharedLink(sharedId); + + return Observable + .fromPromise(promise) + .catch(handleError); + } + private handleError(error: any): Observable { return Observable.of(error); } diff --git a/lib/tslint.json b/lib/tslint.json index 6c7d87e6a2..b96ad69c93 100644 --- a/lib/tslint.json +++ b/lib/tslint.json @@ -11,8 +11,7 @@ ], "ban": [ true, - "eval", - "fdescribe" + "eval" ], "class-name": true, "comment-format": [