mirror of
https://github.com/Alfresco/alfresco-ng2-components.git
synced 2025-07-31 17:38:48 +00:00
Create a new activiti content component that provide the file preview (#1516)
* #1236 Add activiti content component * fix wrong name * Fix unit test import * Rollback api changes * #1236 fix preview using blob * Fix after review
This commit is contained in:
committed by
Mario Romano
parent
112d7a2d0e
commit
d3d67c5934
@@ -351,6 +351,32 @@ There are two additional functions that can be of a great value when controlling
|
|||||||
**Please note that if `event.preventDefault()` is not called then default outcome behaviour
|
**Please note that if `event.preventDefault()` is not called then default outcome behaviour
|
||||||
will also be executed after your custom code.**
|
will also be executed after your custom code.**
|
||||||
|
|
||||||
|
## Activiti Content Component
|
||||||
|
|
||||||
|
### Basic usage
|
||||||
|
|
||||||
|
The component shows the content preview.
|
||||||
|
|
||||||
|
```html
|
||||||
|
<activiti-content [contentId]="'1001'"></activiti-content>
|
||||||
|
```
|
||||||
|
|
||||||
|
### Configuration
|
||||||
|
|
||||||
|
#### Properties
|
||||||
|
|
||||||
|
The recommended set of properties can be found in the following table:
|
||||||
|
|
||||||
|
| Name | Type | Default | Description |
|
||||||
|
| --- | --- | --- | --- |
|
||||||
|
| `contentId` | string | | The content id to show. |
|
||||||
|
|
||||||
|
#### Events
|
||||||
|
|
||||||
|
| Name | Description |
|
||||||
|
| --- | --- |
|
||||||
|
| `contentClick` | Invoked when the content is clicked. |
|
||||||
|
|
||||||
## FormService
|
## FormService
|
||||||
|
|
||||||
```ts
|
```ts
|
||||||
|
@@ -19,6 +19,7 @@ import { NgModule, ModuleWithProviders } from '@angular/core';
|
|||||||
import { CoreModule } from 'ng2-alfresco-core';
|
import { CoreModule } from 'ng2-alfresco-core';
|
||||||
|
|
||||||
import { ActivitiForm } from './src/components/activiti-form.component';
|
import { ActivitiForm } from './src/components/activiti-form.component';
|
||||||
|
import { ActivitiContent } from './src/components/activiti-content.component';
|
||||||
import { FormFieldComponent } from './src/components/form-field/form-field.component';
|
import { FormFieldComponent } from './src/components/form-field/form-field.component';
|
||||||
import { ActivitiStartForm } from './src/components/activiti-start-form.component';
|
import { ActivitiStartForm } from './src/components/activiti-start-form.component';
|
||||||
import { FormService } from './src/services/form.service';
|
import { FormService } from './src/services/form.service';
|
||||||
@@ -31,6 +32,7 @@ import { HttpModule } from '@angular/http';
|
|||||||
import { WIDGET_DIRECTIVES } from './src/components/widgets/index';
|
import { WIDGET_DIRECTIVES } from './src/components/widgets/index';
|
||||||
|
|
||||||
export * from './src/components/activiti-form.component';
|
export * from './src/components/activiti-form.component';
|
||||||
|
export * from './src/components/activiti-content.component';
|
||||||
export * from './src/components/activiti-start-form.component';
|
export * from './src/components/activiti-start-form.component';
|
||||||
export * from './src/services/form.service';
|
export * from './src/services/form.service';
|
||||||
export * from './src/components/widgets/index';
|
export * from './src/components/widgets/index';
|
||||||
@@ -41,6 +43,7 @@ export * from './src/events/index';
|
|||||||
|
|
||||||
export const ACTIVITI_FORM_DIRECTIVES: any[] = [
|
export const ACTIVITI_FORM_DIRECTIVES: any[] = [
|
||||||
ActivitiForm,
|
ActivitiForm,
|
||||||
|
ActivitiContent,
|
||||||
ActivitiStartForm,
|
ActivitiStartForm,
|
||||||
FormFieldComponent,
|
FormFieldComponent,
|
||||||
...WIDGET_DIRECTIVES
|
...WIDGET_DIRECTIVES
|
||||||
|
@@ -0,0 +1,42 @@
|
|||||||
|
.upload-widget {
|
||||||
|
width: 100%;
|
||||||
|
word-break: break-all;
|
||||||
|
}
|
||||||
|
|
||||||
|
.upload-widget__icon {
|
||||||
|
float: left;
|
||||||
|
color: rgba(0, 0, 0, .26);
|
||||||
|
}
|
||||||
|
|
||||||
|
.upload-widget__file {
|
||||||
|
float: left;
|
||||||
|
margin-top: 4px;
|
||||||
|
color: rgba(0, 0, 0, .26);
|
||||||
|
}
|
||||||
|
|
||||||
|
.upload-widget__label {
|
||||||
|
color: rgba(0, 0, 0, .26);
|
||||||
|
}
|
||||||
|
|
||||||
|
.img-upload-widget {
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
border: 1px solid rgba(117, 117, 117, 0.57);
|
||||||
|
box-shadow: 1px 1px 2px #dddddd;
|
||||||
|
background-color: #ffffff;
|
||||||
|
}
|
||||||
|
|
||||||
|
.nothing-to-see {
|
||||||
|
box-shadow: 1px 1px 2px #dddddd;
|
||||||
|
background-color: #ffffff;
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
padding: 50px 0 50px 0;
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
.previewTxt {
|
||||||
|
word-wrap: break-word;
|
||||||
|
word-break: break-all;
|
||||||
|
text-align: center;
|
||||||
|
}
|
@@ -0,0 +1,22 @@
|
|||||||
|
<div class="upload-widget" *ngIf="content">
|
||||||
|
<div class="mdl-card mdl-shadow--2dp">
|
||||||
|
<div class="mdl-card__title mdl-card--expand">
|
||||||
|
<div *ngIf="content.isThumbnailSupported()">
|
||||||
|
<img class="img-upload-widget" [src]="sanitizeUrl(content.thumbnailUrl)">
|
||||||
|
</div>
|
||||||
|
<div *ngIf="!content.isThumbnailSupported()">
|
||||||
|
<i class="material-icons">image</i>
|
||||||
|
<div class="previewTxt">{{ 'FORM.PREVIEW.IMAGE_NOT_AVAILABLE' | translate }}</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="mdl-card__supporting-text">{{content.name}}</div>
|
||||||
|
<div class="mdl-card__actions mdl-card--border">
|
||||||
|
<button (click)="openViewer(content)" class="mdl-button mdl-js-button mdl-button--icon">
|
||||||
|
<i class="material-icons">zoom_in</i>
|
||||||
|
</button>
|
||||||
|
<a (click)="download($event)" [href]="content.contentRawUrl" target="_blank" [download]='content.name' class="mdl-button mdl-js-button mdl-button--icon">
|
||||||
|
<i class="material-icons">file_download</i>
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
@@ -0,0 +1,117 @@
|
|||||||
|
/*!
|
||||||
|
* @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,
|
||||||
|
OnChanges,
|
||||||
|
SimpleChanges,
|
||||||
|
Input,
|
||||||
|
Output,
|
||||||
|
EventEmitter
|
||||||
|
} from '@angular/core';
|
||||||
|
import { AlfrescoTranslationService, LogService } from 'ng2-alfresco-core';
|
||||||
|
import { FormService } from './../services/form.service';
|
||||||
|
import { ContentLinkModel } from './widgets/core/content-link.model';
|
||||||
|
import { DomSanitizer } from '@angular/platform-browser';
|
||||||
|
|
||||||
|
@Component({
|
||||||
|
moduleId: module.id,
|
||||||
|
selector: 'activiti-content',
|
||||||
|
templateUrl: './activiti-content.component.html',
|
||||||
|
styleUrls: ['./activiti-content.component.css']
|
||||||
|
})
|
||||||
|
export class ActivitiContent implements OnChanges {
|
||||||
|
|
||||||
|
@Input()
|
||||||
|
id: string;
|
||||||
|
|
||||||
|
@Output()
|
||||||
|
contentClick = new EventEmitter();
|
||||||
|
|
||||||
|
content: ContentLinkModel;
|
||||||
|
|
||||||
|
constructor(private translate: AlfrescoTranslationService,
|
||||||
|
protected formService: FormService,
|
||||||
|
private logService: LogService,
|
||||||
|
private sanitizer: DomSanitizer ) {
|
||||||
|
|
||||||
|
if (this.translate) {
|
||||||
|
this.translate.addTranslationFolder('ng2-activiti-form', 'node_modules/ng2-activiti-form/src');
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
ngOnChanges(changes: SimpleChanges) {
|
||||||
|
let contentId = changes['id'];
|
||||||
|
if (contentId && contentId.currentValue) {
|
||||||
|
this.loadContent(contentId.currentValue);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
loadContent(id: number) {
|
||||||
|
this.formService
|
||||||
|
.getFileContent(id)
|
||||||
|
.subscribe(
|
||||||
|
(response: ContentLinkModel) => {
|
||||||
|
this.content = new ContentLinkModel(response);
|
||||||
|
this.loadThumbnailUrl(this.content);
|
||||||
|
},
|
||||||
|
error => {
|
||||||
|
this.logService.error(error);
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
loadThumbnailUrl(content: ContentLinkModel) {
|
||||||
|
if (this.content.isTypeImage()) {
|
||||||
|
this.formService.getFileRawContent(content.id).subscribe(
|
||||||
|
(response: Blob) => {
|
||||||
|
this.content.thumbnailUrl = this.createUrlPreview(response);
|
||||||
|
},
|
||||||
|
error => {
|
||||||
|
this.logService.error(error);
|
||||||
|
}
|
||||||
|
);
|
||||||
|
} else if (this.content.isThumbnailSupported()) {
|
||||||
|
this.content.contentRawUrl = this.formService.getFileRawContentUrl(content.id);
|
||||||
|
this.content.thumbnailUrl = this.formService.getContentThumbnailUrl(content.id);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
openViewer(content: ContentLinkModel) {
|
||||||
|
this.contentClick.emit(content);
|
||||||
|
this.logService.info('Content clicked' + content.id);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Download file opening it in a new window
|
||||||
|
*/
|
||||||
|
download($event) {
|
||||||
|
$event.stopPropagation();
|
||||||
|
}
|
||||||
|
|
||||||
|
private sanitizeUrl(url: string) {
|
||||||
|
return this.sanitizer.bypassSecurityTrustUrl(url);
|
||||||
|
}
|
||||||
|
|
||||||
|
private createUrlPreview(blob: Blob) {
|
||||||
|
let imageUrl = window.URL.createObjectURL(blob);
|
||||||
|
let sanitize: any = this.sanitizeUrl(imageUrl);
|
||||||
|
return sanitize.changingThisBreaksApplicationSecurity;
|
||||||
|
}
|
||||||
|
}
|
@@ -21,6 +21,7 @@ import { Observable } from 'rxjs/Rx';
|
|||||||
|
|
||||||
import { ActivitiStartForm } from './activiti-start-form.component';
|
import { ActivitiStartForm } from './activiti-start-form.component';
|
||||||
import { FormFieldComponent } from './form-field/form-field.component';
|
import { FormFieldComponent } from './form-field/form-field.component';
|
||||||
|
import { ActivitiContent } from './activiti-content.component';
|
||||||
import { WIDGET_DIRECTIVES } from './widgets/index';
|
import { WIDGET_DIRECTIVES } from './widgets/index';
|
||||||
import { FormService } from './../services/form.service';
|
import { FormService } from './../services/form.service';
|
||||||
import { EcmModelService } from './../services/ecm-model.service';
|
import { EcmModelService } from './../services/ecm-model.service';
|
||||||
@@ -45,6 +46,7 @@ describe('ActivitiStartForm', () => {
|
|||||||
declarations: [
|
declarations: [
|
||||||
ActivitiStartForm,
|
ActivitiStartForm,
|
||||||
FormFieldComponent,
|
FormFieldComponent,
|
||||||
|
ActivitiContent,
|
||||||
...WIDGET_DIRECTIVES
|
...WIDGET_DIRECTIVES
|
||||||
],
|
],
|
||||||
providers: [
|
providers: [
|
||||||
|
@@ -24,6 +24,7 @@ import { ComponentFixture, TestBed, async } from '@angular/core/testing';
|
|||||||
import { CoreModule } from 'ng2-alfresco-core';
|
import { CoreModule } from 'ng2-alfresco-core';
|
||||||
import { WIDGET_DIRECTIVES } from '../index';
|
import { WIDGET_DIRECTIVES } from '../index';
|
||||||
import { FormFieldComponent } from './../../form-field/form-field.component';
|
import { FormFieldComponent } from './../../form-field/form-field.component';
|
||||||
|
import { ActivitiContent } from './../../activiti-content.component';
|
||||||
import { fakeFormJson } from '../../../services/assets/widget-visibility.service.mock';
|
import { fakeFormJson } from '../../../services/assets/widget-visibility.service.mock';
|
||||||
|
|
||||||
describe('ContainerWidget', () => {
|
describe('ContainerWidget', () => {
|
||||||
@@ -132,7 +133,7 @@ describe('ContainerWidget', () => {
|
|||||||
beforeEach(async(() => {
|
beforeEach(async(() => {
|
||||||
TestBed.configureTestingModule({
|
TestBed.configureTestingModule({
|
||||||
imports: [CoreModule],
|
imports: [CoreModule],
|
||||||
declarations: [FormFieldComponent, WIDGET_DIRECTIVES]
|
declarations: [FormFieldComponent, ActivitiContent, WIDGET_DIRECTIVES]
|
||||||
}).compileComponents().then(() => {
|
}).compileComponents().then(() => {
|
||||||
fixture = TestBed.createComponent(ContainerWidget);
|
fixture = TestBed.createComponent(ContainerWidget);
|
||||||
containerWidgetComponent = fixture.componentInstance;
|
containerWidgetComponent = fixture.componentInstance;
|
||||||
|
@@ -0,0 +1,71 @@
|
|||||||
|
/*!
|
||||||
|
* @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 class ContentLinkModel {
|
||||||
|
|
||||||
|
contentAvailable: boolean;
|
||||||
|
created: string;
|
||||||
|
createdBy: any;
|
||||||
|
id: number;
|
||||||
|
link: boolean;
|
||||||
|
mimeType: string;
|
||||||
|
name: string;
|
||||||
|
previewStatus: string;
|
||||||
|
relatedContent: boolean;
|
||||||
|
simpleType: string;
|
||||||
|
thumbnailUrl: string;
|
||||||
|
contentRawUrl: string;
|
||||||
|
thumbnailStatus: string;
|
||||||
|
|
||||||
|
constructor(obj?: any) {
|
||||||
|
this.contentAvailable = obj && obj.contentAvailable;
|
||||||
|
this.created = obj && obj.created;
|
||||||
|
this.createdBy = obj && obj.createdBy || {};
|
||||||
|
this.id = obj && obj.id;
|
||||||
|
this.link = obj && obj.link;
|
||||||
|
this.mimeType = obj && obj.mimeType;
|
||||||
|
this.name = obj && obj.name;
|
||||||
|
this.previewStatus = obj && obj.previewStatus;
|
||||||
|
this.relatedContent = obj && obj.relatedContent;
|
||||||
|
this.simpleType = obj && obj.simpleType;
|
||||||
|
this.thumbnailStatus = obj && obj.thumbnailStatus;
|
||||||
|
}
|
||||||
|
|
||||||
|
hasPreviewStatus(): boolean {
|
||||||
|
return this.previewStatus === 'supported' ? true : false;
|
||||||
|
}
|
||||||
|
|
||||||
|
isTypeImage(): boolean {
|
||||||
|
return this.simpleType === 'image' ? true : false;
|
||||||
|
}
|
||||||
|
|
||||||
|
isTypePdf(): boolean {
|
||||||
|
return this.simpleType === 'pdf' ? true : false;
|
||||||
|
}
|
||||||
|
|
||||||
|
isTypeDoc(): boolean {
|
||||||
|
return this.simpleType === 'word' || this.simpleType === 'content' ? true : false;
|
||||||
|
}
|
||||||
|
|
||||||
|
isThumbnailReady(): boolean {
|
||||||
|
return this.thumbnailStatus === 'created';
|
||||||
|
}
|
||||||
|
|
||||||
|
isThumbnailSupported(): boolean {
|
||||||
|
return this.isTypeImage() || ((this.isTypePdf() || this.isTypeDoc()) && this.isThumbnailReady());
|
||||||
|
}
|
||||||
|
}
|
@@ -29,3 +29,4 @@ export * from './tab.model';
|
|||||||
export * from './form-outcome.model';
|
export * from './form-outcome.model';
|
||||||
export * from './form-outcome-event.model';
|
export * from './form-outcome-event.model';
|
||||||
export * from './form-field-validator';
|
export * from './form-field-validator';
|
||||||
|
export * from './content-link.model';
|
||||||
|
@@ -21,32 +21,3 @@
|
|||||||
width: 100%;
|
width: 100%;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
.upload-widget {
|
|
||||||
width: 100%;
|
|
||||||
word-break: break-all;
|
|
||||||
}
|
|
||||||
|
|
||||||
.upload-widget__icon {
|
|
||||||
float: left;
|
|
||||||
color: rgba(0, 0, 0, .26);
|
|
||||||
}
|
|
||||||
|
|
||||||
.upload-widget__file {
|
|
||||||
float: left;
|
|
||||||
margin-top: 4px;
|
|
||||||
color: rgba(0, 0, 0, .26);
|
|
||||||
}
|
|
||||||
|
|
||||||
.upload-widget__label {
|
|
||||||
color: rgba(0, 0, 0, .26);
|
|
||||||
}
|
|
||||||
|
|
||||||
.img-upload-widget {
|
|
||||||
width: 100px;
|
|
||||||
height: 100px;
|
|
||||||
padding: 2px;
|
|
||||||
border: 1px solid rgba(117, 117, 117, 0.57);
|
|
||||||
box-shadow: 1px 1px 2px #dddddd;
|
|
||||||
background-color: #ffffff;
|
|
||||||
}
|
|
||||||
|
@@ -68,16 +68,9 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div *ngSwitchCase="'upload'">
|
<div *ngSwitchCase="'upload'">
|
||||||
<div class="upload-widget">
|
<div *ngIf="hasFile" class="mdl-grid">
|
||||||
<div>
|
<div *ngFor="let file of field.value" class="mdl-cell mdl-cell--6-col">
|
||||||
<label class="upload-widget__label" [attr.for]="field.id">{{field.name}}</label>
|
<activiti-content [id]="file.id"></activiti-content>
|
||||||
</div>
|
|
||||||
<div>
|
|
||||||
<img *ngIf="hasFile" class="img-upload-widget" src="{{settingsService.bpmHost}}/activiti-app/app/rest/content/{{id}}/raw">
|
|
||||||
</div>
|
|
||||||
<div>
|
|
||||||
<i *ngIf="hasFile" class="material-icons upload-widget__icon">attachment</i>
|
|
||||||
<span *ngIf="hasFile" class="upload-widget__file">{{value}}</span>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
@@ -20,6 +20,7 @@ import { CoreModule, LogServiceMock } from 'ng2-alfresco-core';
|
|||||||
import { Observable } from 'rxjs/Rx';
|
import { Observable } from 'rxjs/Rx';
|
||||||
import { DisplayValueWidget } from './display-value.widget';
|
import { DisplayValueWidget } from './display-value.widget';
|
||||||
import { FormService } from '../../../services/form.service';
|
import { FormService } from '../../../services/form.service';
|
||||||
|
import { ActivitiContent } from '../../activiti-content.component';
|
||||||
import { EcmModelService } from '../../../services/ecm-model.service';
|
import { EcmModelService } from '../../../services/ecm-model.service';
|
||||||
import { FormFieldModel } from './../core/form-field.model';
|
import { FormFieldModel } from './../core/form-field.model';
|
||||||
import { FormFieldTypes } from '../core/form-field-types';
|
import { FormFieldTypes } from '../core/form-field-types';
|
||||||
@@ -688,7 +689,7 @@ describe('DisplayValueWidget', () => {
|
|||||||
window['componentHandler'] = componentHandler;
|
window['componentHandler'] = componentHandler;
|
||||||
TestBed.configureTestingModule({
|
TestBed.configureTestingModule({
|
||||||
imports: [CoreModule],
|
imports: [CoreModule],
|
||||||
declarations: [DisplayValueWidget],
|
declarations: [DisplayValueWidget, ActivitiContent],
|
||||||
providers: [
|
providers: [
|
||||||
EcmModelService,
|
EcmModelService,
|
||||||
FormService,
|
FormService,
|
||||||
|
@@ -23,6 +23,7 @@ import { TabsWidget } from './tabs.widget';
|
|||||||
import { TabModel } from '../core/tab.model';
|
import { TabModel } from '../core/tab.model';
|
||||||
import { WIDGET_DIRECTIVES } from '../index';
|
import { WIDGET_DIRECTIVES } from '../index';
|
||||||
import { FormFieldComponent } from './../../form-field/form-field.component';
|
import { FormFieldComponent } from './../../form-field/form-field.component';
|
||||||
|
import { ActivitiContent } from './../../activiti-content.component';
|
||||||
import { CoreModule } from 'ng2-alfresco-core';
|
import { CoreModule } from 'ng2-alfresco-core';
|
||||||
|
|
||||||
describe('TabsWidget', () => {
|
describe('TabsWidget', () => {
|
||||||
@@ -103,7 +104,7 @@ describe('TabsWidget', () => {
|
|||||||
beforeEach(async(() => {
|
beforeEach(async(() => {
|
||||||
TestBed.configureTestingModule({
|
TestBed.configureTestingModule({
|
||||||
imports: [CoreModule],
|
imports: [CoreModule],
|
||||||
declarations: [FormFieldComponent, WIDGET_DIRECTIVES]
|
declarations: [FormFieldComponent, ActivitiContent, WIDGET_DIRECTIVES]
|
||||||
}).compileComponents().then(() => {
|
}).compileComponents().then(() => {
|
||||||
fixture = TestBed.createComponent(TabsWidget);
|
fixture = TestBed.createComponent(TabsWidget);
|
||||||
tabWidgetComponent = fixture.componentInstance;
|
tabWidgetComponent = fixture.componentInstance;
|
||||||
|
@@ -2,6 +2,9 @@
|
|||||||
"FORM": {
|
"FORM": {
|
||||||
"START_FORM": {
|
"START_FORM": {
|
||||||
"TITLE": "Start Form"
|
"TITLE": "Start Form"
|
||||||
|
},
|
||||||
|
"PREVIEW": {
|
||||||
|
"IMAGE_NOT_AVAILABLE": "The preview image is not available."
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
10
ng2-components/ng2-activiti-form/src/i18n/it.json
Normal file
10
ng2-components/ng2-activiti-form/src/i18n/it.json
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
{
|
||||||
|
"FORM": {
|
||||||
|
"START_FORM": {
|
||||||
|
"TITLE": "Inizia"
|
||||||
|
},
|
||||||
|
"PREVIEW": {
|
||||||
|
"IMAGE_NOT_AVAILABLE": "Anteprima immagine non disponibile."
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@@ -30,6 +30,7 @@ describe('FormService', () => {
|
|||||||
let service: FormService;
|
let service: FormService;
|
||||||
let apiService: AlfrescoApiService;
|
let apiService: AlfrescoApiService;
|
||||||
let logService: LogService;
|
let logService: LogService;
|
||||||
|
let bpmCli: any;
|
||||||
|
|
||||||
beforeEach(() => {
|
beforeEach(() => {
|
||||||
TestBed.configureTestingModule({
|
TestBed.configureTestingModule({
|
||||||
@@ -44,6 +45,7 @@ describe('FormService', () => {
|
|||||||
});
|
});
|
||||||
service = TestBed.get(FormService);
|
service = TestBed.get(FormService);
|
||||||
apiService = TestBed.get(AlfrescoApiService);
|
apiService = TestBed.get(AlfrescoApiService);
|
||||||
|
bpmCli = apiService.getInstance().bpmAuth;
|
||||||
logService = TestBed.get(LogService);
|
logService = TestBed.get(LogService);
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -374,6 +376,81 @@ describe('FormService', () => {
|
|||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it('should return the unsupported content when the file is an image', (done) => {
|
||||||
|
let contentId: number = 999;
|
||||||
|
responseBody = {
|
||||||
|
id: contentId,
|
||||||
|
name: 'fake-name.jpg',
|
||||||
|
created: '2017-01-23T12:12:53.219+0000',
|
||||||
|
createdBy: {id: 2, firstName: 'fake-admin', lastName: 'fake-last', 'email': 'fake-admin'},
|
||||||
|
relatedContent: false,
|
||||||
|
contentAvailable: true,
|
||||||
|
link: false,
|
||||||
|
mimeType: 'image/jpeg',
|
||||||
|
simpleType: 'image',
|
||||||
|
previewStatus: 'unsupported',
|
||||||
|
thumbnailStatus: 'unsupported'
|
||||||
|
};
|
||||||
|
|
||||||
|
service.getFileContent(contentId).subscribe(result => {
|
||||||
|
expect(result.id).toEqual(contentId);
|
||||||
|
expect(result.name).toEqual('fake-name.jpg');
|
||||||
|
expect(result.simpleType).toEqual('image');
|
||||||
|
expect(result.thumbnailStatus).toEqual('unsupported');
|
||||||
|
done();
|
||||||
|
});
|
||||||
|
|
||||||
|
jasmine.Ajax.requests.mostRecent().respondWith({
|
||||||
|
'status': 200,
|
||||||
|
contentType: 'application/json',
|
||||||
|
responseText: JSON.stringify(responseBody)
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should return the supported content when the file is a pdf', (done) => {
|
||||||
|
let contentId: number = 888;
|
||||||
|
responseBody = {
|
||||||
|
id: contentId,
|
||||||
|
name: 'fake-name.pdf',
|
||||||
|
created: '2017-01-23T12:12:53.219+0000',
|
||||||
|
createdBy: {id: 2, firstName: 'fake-admin', lastName: 'fake-last', 'email': 'fake-admin'},
|
||||||
|
relatedContent: false,
|
||||||
|
contentAvailable: true,
|
||||||
|
link: false,
|
||||||
|
mimeType: 'application/pdf',
|
||||||
|
simpleType: 'pdf',
|
||||||
|
previewStatus: 'created',
|
||||||
|
thumbnailStatus: 'created'
|
||||||
|
};
|
||||||
|
|
||||||
|
service.getFileContent(contentId).subscribe(result => {
|
||||||
|
expect(result.id).toEqual(contentId);
|
||||||
|
expect(result.name).toEqual('fake-name.pdf');
|
||||||
|
expect(result.simpleType).toEqual('pdf');
|
||||||
|
expect(result.thumbnailStatus).toEqual('created');
|
||||||
|
done();
|
||||||
|
});
|
||||||
|
|
||||||
|
jasmine.Ajax.requests.mostRecent().respondWith({
|
||||||
|
'status': 200,
|
||||||
|
contentType: 'application/json',
|
||||||
|
responseText: JSON.stringify(responseBody)
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should return the raw content URL', () => {
|
||||||
|
let contentId: number = 999;
|
||||||
|
let contentRawUrl = service.getFileRawContentUrl(contentId);
|
||||||
|
expect(contentRawUrl).toEqual(`${bpmCli.basePath}/api/enterprise/content/${contentId}/raw`);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should return the thumbnail URL', () => {
|
||||||
|
let contentId: number = 999;
|
||||||
|
|
||||||
|
let contentRawUrl = service.getContentThumbnailUrl(contentId);
|
||||||
|
expect(contentRawUrl).toEqual(`${bpmCli.basePath}/app/rest/content/${contentId}/rendition/thumbnail`);
|
||||||
|
});
|
||||||
|
|
||||||
it('should create a Form form a Node', (done) => {
|
it('should create a Form form a Node', (done) => {
|
||||||
|
|
||||||
let nameForm = 'testNode';
|
let nameForm = 'testNode';
|
||||||
|
@@ -252,6 +252,26 @@ export class FormService {
|
|||||||
return Observable.fromPromise(this.apiService.getInstance().activiti.contentApi.createTemporaryRawRelatedContent(file));
|
return Observable.fromPromise(this.apiService.getInstance().activiti.contentApi.createTemporaryRawRelatedContent(file));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
getFileContent(contentId: number): Observable<any> {
|
||||||
|
let alfrescoApi = this.apiService.getInstance();
|
||||||
|
return Observable.fromPromise(alfrescoApi.activiti.contentApi.getContent(contentId));
|
||||||
|
}
|
||||||
|
|
||||||
|
getFileRawContent(contentId: number): Observable<any> {
|
||||||
|
let alfrescoApi = this.apiService.getInstance();
|
||||||
|
return Observable.fromPromise(alfrescoApi.activiti.contentApi.getRawContent(contentId));
|
||||||
|
}
|
||||||
|
|
||||||
|
getFileRawContentUrl(contentId: number): string {
|
||||||
|
let alfrescoApi = this.apiService.getInstance();
|
||||||
|
return alfrescoApi.activiti.contentApi.getRawContentUrl(contentId);
|
||||||
|
}
|
||||||
|
|
||||||
|
getContentThumbnailUrl(contentId: number): string {
|
||||||
|
let alfrescoApi = this.apiService.getInstance();
|
||||||
|
return alfrescoApi.activiti.contentApi.getContentThumbnailUrl(contentId);
|
||||||
|
}
|
||||||
|
|
||||||
getRestFieldValues(taskId: string, field: string): Observable<any> {
|
getRestFieldValues(taskId: string, field: string): Observable<any> {
|
||||||
let alfrescoApi = this.apiService.getInstance();
|
let alfrescoApi = this.apiService.getInstance();
|
||||||
return Observable.fromPromise(alfrescoApi.activiti.taskApi.getRestFieldValues(taskId, field));
|
return Observable.fromPromise(alfrescoApi.activiti.taskApi.getRestFieldValues(taskId, field));
|
||||||
|
Reference in New Issue
Block a user