Compare commits
3 Commits
koenvander
...
ravinderpa
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
36ebe449b0 | ||
|
|
f72aa05e4e | ||
|
|
5b26793662 |
25
CHANGELOG.md
25
CHANGELOG.md
@@ -1,28 +1,3 @@
|
|||||||
<a name="1.3.0"></a>
|
|
||||||
# [1.3.0](https://github.com/valor-software/ng2-file-upload/compare/v1.2.0...v1.3.0) (2017-11-25)
|
|
||||||
|
|
||||||
|
|
||||||
### Features
|
|
||||||
|
|
||||||
* **file-upload:** Add response and function to modify the request body ([#901](https://github.com/valor-software/ng2-file-upload/pull/901))
|
|
||||||
* **file-upload** add file type .zip ([#911](https://github.com/valor-software/ng2-file-upload/pull/911))
|
|
||||||
|
|
||||||
### Bug Fixes
|
|
||||||
* **file-uploader** Update: setOptions ([#904](https://github.com/valor-software/ng2-file-upload/pull/904))
|
|
||||||
* **docs** Fix correct path for isHTML5 option ([#844](https://github.com/valor-software/ng2-file-upload/pull/844))
|
|
||||||
* **docs** Added onFileDrop() event to documentation ([#857](https://github.com/valor-software/ng2-file-upload/pull/857))
|
|
||||||
|
|
||||||
|
|
||||||
<a name="1.2.1"></a>
|
|
||||||
## [1.2.1](https://github.com/valor-software/ng2-file-upload/compare/v1.2.0...v1.2.1) (2017-04-10)
|
|
||||||
|
|
||||||
|
|
||||||
### Features
|
|
||||||
|
|
||||||
* **package:** relaxed peer dependencies to allow ng v4 ([#713](https://github.com/valor-software/ng2-file-upload/issues/713)) ([7704e0e](https://github.com/valor-software/ng2-file-upload/commit/7704e0e))
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<a name="1.2.0"></a>
|
<a name="1.2.0"></a>
|
||||||
# [1.2.0](https://github.com/valor-software/ng2-file-upload/compare/v1.1.3-0...v1.2.0) (2017-01-17)
|
# [1.2.0](https://github.com/valor-software/ng2-file-upload/compare/v1.1.3-0...v1.2.0) (2017-01-17)
|
||||||
|
|
||||||
|
|||||||
31
README.md
31
README.md
@@ -19,39 +19,12 @@ Easy to use Angular2 directives for files upload ([demo](http://valor-software.g
|
|||||||
3. More information regarding using of ***ng2-file-upload*** is located in
|
3. More information regarding using of ***ng2-file-upload*** is located in
|
||||||
[demo](http://valor-software.github.io/ng2-file-upload/) and [demo sources](https://github.com/valor-software/ng2-file-upload/tree/master/demo).
|
[demo](http://valor-software.github.io/ng2-file-upload/) and [demo sources](https://github.com/valor-software/ng2-file-upload/tree/master/demo).
|
||||||
|
|
||||||
## Using ***ng2-file-upload*** in a project
|
|
||||||
|
|
||||||
1. Install as shown in the above section.
|
|
||||||
|
|
||||||
2. Import `FileUploadModule` into the module that declares the component using ***ng2-file-upload***:
|
|
||||||
|
|
||||||
```import { FileUploadModule } from 'ng2-file-upload';```
|
|
||||||
|
|
||||||
3. Add it to `[imports]` under `@NgModule`:
|
|
||||||
|
|
||||||
```imports: [ ... FileUploadModule, ... ]```
|
|
||||||
|
|
||||||
4. Import `FileUploader` into the component:
|
|
||||||
|
|
||||||
```import { FileUploader } from 'ng2-file-upload';```
|
|
||||||
|
|
||||||
5. Create a variable for the API url:
|
|
||||||
|
|
||||||
```const URL = 'path_to_api';```
|
|
||||||
|
|
||||||
6. Initialize it:
|
|
||||||
|
|
||||||
```public uploader:FileUploader = new FileUploader({url: URL}); ```
|
|
||||||
|
|
||||||
## API for `ng2FileSelect`
|
## API for `ng2FileSelect`
|
||||||
|
|
||||||
### Properties
|
### Properties
|
||||||
|
|
||||||
- `uploader` - (`FileUploader`) - uploader object. See using in [demo](https://github.com/valor-software/ng2-file-upload/blob/master/demo/components/file-upload/simple-demo.ts)
|
- `uploader` - (`FileUploader`) - uploader object. See using in [demo](https://github.com/valor-software/ng2-file-upload/blob/master/demo/components/file-upload/simple-demo.ts)
|
||||||
|
|
||||||
### Events
|
|
||||||
- `onFileSelected` - fires when files are selected and added to the uploader queue
|
|
||||||
|
|
||||||
## API for `ng2FileDrop`
|
## API for `ng2FileDrop`
|
||||||
|
|
||||||
### Properties
|
### Properties
|
||||||
@@ -64,16 +37,12 @@ Easy to use Angular2 directives for files upload ([demo](http://valor-software.g
|
|||||||
2. `authToken` - Auth token that will be applied as 'Authorization' header during file send.
|
2. `authToken` - Auth token that will be applied as 'Authorization' header during file send.
|
||||||
3. `disableMultipart` - If 'true', disable using a multipart form for file upload and instead stream the file. Some APIs (e.g. Amazon S3) may expect the file to be streamed rather than sent via a form. Defaults to false.
|
3. `disableMultipart` - If 'true', disable using a multipart form for file upload and instead stream the file. Some APIs (e.g. Amazon S3) may expect the file to be streamed rather than sent via a form. Defaults to false.
|
||||||
4. `itemAlias` - item alias (form name redefenition)
|
4. `itemAlias` - item alias (form name redefenition)
|
||||||
5. `formatDataFunction` - Function to modify the request body. 'DisableMultipart' must be 'true' for this function to be called.
|
|
||||||
6. `formatDataFunctionIsAsync` - Informs if the function sent in 'formatDataFunction' is asynchronous. Defaults to false.
|
|
||||||
7. `parametersBeforeFiles` - States if additional parameters should be appended before or after the file. Defaults to false.
|
|
||||||
|
|
||||||
### Events
|
### Events
|
||||||
|
|
||||||
- `fileOver` - it fires during 'over' and 'out' events for Drop Area; returns `boolean`: `true` if file is over Drop Area, `false` in case of out.
|
- `fileOver` - it fires during 'over' and 'out' events for Drop Area; returns `boolean`: `true` if file is over Drop Area, `false` in case of out.
|
||||||
See using in [ts demo](https://github.com/valor-software/ng2-file-upload/blob/master/demo/components/file-upload/simple-demo.ts) and
|
See using in [ts demo](https://github.com/valor-software/ng2-file-upload/blob/master/demo/components/file-upload/simple-demo.ts) and
|
||||||
[html demo](https://github.com/valor-software/ng2-file-upload/blob/master/demo/components/file-upload/simple-demo.html)
|
[html demo](https://github.com/valor-software/ng2-file-upload/blob/master/demo/components/file-upload/simple-demo.html)
|
||||||
- `onFileDrop` - it fires after a file has been dropped on a Drop Area; you can pass in `$event` to get the list of files that were dropped. i.e. `(onFileDrop)="dropped($event)"`
|
|
||||||
|
|
||||||
# Troubleshooting
|
# Troubleshooting
|
||||||
|
|
||||||
|
|||||||
@@ -19,8 +19,8 @@
|
|||||||
],
|
],
|
||||||
"scripts": [
|
"scripts": [
|
||||||
],
|
],
|
||||||
"environmentSource": "environments/environment.ts",
|
|
||||||
"environments": {
|
"environments": {
|
||||||
|
"source": "environments/environment.ts",
|
||||||
"dev": "environments/environment.ts",
|
"dev": "environments/environment.ts",
|
||||||
"prod": "environments/environment.prod.ts"
|
"prod": "environments/environment.prod.ts"
|
||||||
}
|
}
|
||||||
@@ -3,7 +3,7 @@ import { NgModule } from '@angular/core';
|
|||||||
import { FormsModule } from '@angular/forms';
|
import { FormsModule } from '@angular/forms';
|
||||||
import { BrowserModule } from '@angular/platform-browser';
|
import { BrowserModule } from '@angular/platform-browser';
|
||||||
|
|
||||||
import { TabsModule } from 'ngx-bootstrap/tabs';
|
import { TabsModule } from 'ng2-bootstrap';
|
||||||
import { FileUploadModule } from 'ng2-file-upload';
|
import { FileUploadModule } from 'ng2-file-upload';
|
||||||
|
|
||||||
import { AppComponent } from './app.component';
|
import { AppComponent } from './app.component';
|
||||||
|
|||||||
@@ -61,8 +61,8 @@
|
|||||||
<tbody>
|
<tbody>
|
||||||
<tr *ngFor="let item of uploader.queue">
|
<tr *ngFor="let item of uploader.queue">
|
||||||
<td><strong>{{ item?.file?.name }}</strong></td>
|
<td><strong>{{ item?.file?.name }}</strong></td>
|
||||||
<td *ngIf="uploader.options.isHTML5" nowrap>{{ item?.file?.size/1024/1024 | number:'.2' }} MB</td>
|
<td *ngIf="uploader.isHTML5" nowrap>{{ item?.file?.size/1024/1024 | number:'.2' }} MB</td>
|
||||||
<td *ngIf="uploader.options.isHTML5">
|
<td *ngIf="uploader.isHTML5">
|
||||||
<div class="progress" style="margin-bottom: 0;">
|
<div class="progress" style="margin-bottom: 0;">
|
||||||
<div class="progress-bar" role="progressbar" [ngStyle]="{ 'width': item.progress + '%' }"></div>
|
<div class="progress-bar" role="progressbar" [ngStyle]="{ 'width': item.progress + '%' }"></div>
|
||||||
</div>
|
</div>
|
||||||
@@ -115,16 +115,4 @@
|
|||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<br><br>
|
|
||||||
|
|
||||||
<div class="row">
|
|
||||||
<div class="col-md-12">
|
|
||||||
<div class="panel panel-default">
|
|
||||||
<div class="panel-heading">Response</div>
|
|
||||||
<div class="panel-body">
|
|
||||||
{{ response }}
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -9,36 +9,9 @@ const URL = 'https://evening-anchorage-3159.herokuapp.com/api/';
|
|||||||
templateUrl: './simple-demo.html'
|
templateUrl: './simple-demo.html'
|
||||||
})
|
})
|
||||||
export class SimpleDemoComponent {
|
export class SimpleDemoComponent {
|
||||||
|
public uploader:FileUploader = new FileUploader({url: URL});
|
||||||
uploader:FileUploader;
|
public hasBaseDropZoneOver:boolean = false;
|
||||||
hasBaseDropZoneOver:boolean;
|
public hasAnotherDropZoneOver:boolean = false;
|
||||||
hasAnotherDropZoneOver:boolean;
|
|
||||||
response:string;
|
|
||||||
|
|
||||||
constructor (){
|
|
||||||
this.uploader = new FileUploader({
|
|
||||||
url: URL,
|
|
||||||
disableMultipart: true, // 'DisableMultipart' must be 'true' for formatDataFunction to be called.
|
|
||||||
formatDataFunctionIsAsync: true,
|
|
||||||
formatDataFunction: async (item) => {
|
|
||||||
return new Promise( (resolve, reject) => {
|
|
||||||
resolve({
|
|
||||||
name: item._file.name,
|
|
||||||
length: item._file.size,
|
|
||||||
contentType: item._file.type,
|
|
||||||
date: new Date()
|
|
||||||
});
|
|
||||||
});
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
this.hasBaseDropZoneOver = false;
|
|
||||||
this.hasAnotherDropZoneOver = false;
|
|
||||||
|
|
||||||
this.response = '';
|
|
||||||
|
|
||||||
this.uploader.response.subscribe( res => this.response = res );
|
|
||||||
}
|
|
||||||
|
|
||||||
public fileOverBase(e:any):void {
|
public fileOverBase(e:any):void {
|
||||||
this.hasBaseDropZoneOver = e;
|
this.hasBaseDropZoneOver = e;
|
||||||
|
|||||||
@@ -25,13 +25,6 @@ import { FileSelectDirective, FileDropDirective, FileUploader } from 'ng2-file-u
|
|||||||
1. `url` - URL of File Uploader's route
|
1. `url` - URL of File Uploader's route
|
||||||
2. `authToken` - auth token that will be applied as 'Authorization' header during file send.
|
2. `authToken` - auth token that will be applied as 'Authorization' header during file send.
|
||||||
3. `disableMultipart` - If 'true', disable using a multipart form for file upload and instead stream the file. Some APIs (e.g. Amazon S3) may expect the file to be streamed rather than sent via a form. Defaults to false.
|
3. `disableMultipart` - If 'true', disable using a multipart form for file upload and instead stream the file. Some APIs (e.g. Amazon S3) may expect the file to be streamed rather than sent via a form. Defaults to false.
|
||||||
4. `itemAlias` - item alias (form name redefenition)
|
|
||||||
5. `formatDataFunction` - Function to modify the request body. 'DisableMultipart' must be 'true' for this function to be called.
|
|
||||||
6. `formatDataFunctionIsAsync` - Informs if the function sent in 'formatDataFunction' is asynchronous. Defaults to false.
|
|
||||||
7. `parametersBeforeFiles` - States if additional parameters should be appended before or after the file. Defaults to false.
|
|
||||||
|
|
||||||
### Events
|
|
||||||
- `onFileSelected` - fires when files are selected and added to the uploader queue
|
|
||||||
|
|
||||||
## FileDrop API
|
## FileDrop API
|
||||||
|
|
||||||
@@ -44,4 +37,3 @@ import { FileSelectDirective, FileDropDirective, FileUploader } from 'ng2-file-u
|
|||||||
- `fileOver` - it fires during 'over' and 'out' events for Drop Area; returns `boolean`: `true` if file is over Drop Area, `false` in case of out.
|
- `fileOver` - it fires during 'over' and 'out' events for Drop Area; returns `boolean`: `true` if file is over Drop Area, `false` in case of out.
|
||||||
See using in [ts demo](https://github.com/valor-software/ng2-file-upload/blob/master/demo/components/file-upload/simple-demo.ts) and
|
See using in [ts demo](https://github.com/valor-software/ng2-file-upload/blob/master/demo/components/file-upload/simple-demo.ts) and
|
||||||
[html demo](https://github.com/valor-software/ng2-file-upload/blob/master/demo/components/file-upload/simple-demo.html)
|
[html demo](https://github.com/valor-software/ng2-file-upload/blob/master/demo/components/file-upload/simple-demo.html)
|
||||||
- `onFileDrop` - it fires after a file has been dropped on a Drop Area; you can pass in `$event` to get the list of files that were dropped. i.e. `(onFileDrop)="dropped($event)"`
|
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
"declaration": false,
|
"declaration": false,
|
||||||
"emitDecoratorMetadata": true,
|
"emitDecoratorMetadata": true,
|
||||||
"experimentalDecorators": true,
|
"experimentalDecorators": true,
|
||||||
"noEmitHelpers": false,
|
"noEmitHelpers" :true,
|
||||||
"lib": ["es6", "dom"],
|
"lib": ["es6", "dom"],
|
||||||
"types": [
|
"types": [
|
||||||
"jasmine",
|
"jasmine",
|
||||||
|
|||||||
4
demo/src/typings.d.ts
vendored
4
demo/src/typings.d.ts
vendored
@@ -6,8 +6,8 @@ declare const ENV:string;
|
|||||||
// google code-prettify
|
// google code-prettify
|
||||||
declare const PR:any;
|
declare const PR:any;
|
||||||
|
|
||||||
// declare const require:any;
|
declare const require:any;
|
||||||
// declare const global:any;
|
declare const global:any;
|
||||||
|
|
||||||
declare module jasmine {
|
declare module jasmine {
|
||||||
interface Matchers {
|
interface Matchers {
|
||||||
|
|||||||
@@ -6,29 +6,31 @@ const customLaunchers = require('./scripts/sauce-browsers').customLaunchers;
|
|||||||
module.exports = function (config) {
|
module.exports = function (config) {
|
||||||
const configuration = {
|
const configuration = {
|
||||||
basePath: '',
|
basePath: '',
|
||||||
frameworks: ['jasmine', '@angular/cli'],
|
frameworks: ['jasmine', 'angular-cli'],
|
||||||
plugins: [
|
plugins: [
|
||||||
require('karma-jasmine'),
|
require('karma-jasmine'),
|
||||||
require('karma-chrome-launcher'),
|
require('karma-chrome-launcher'),
|
||||||
require('karma-coverage-istanbul-reporter'),
|
require('karma-remap-istanbul'),
|
||||||
require('@angular/cli/plugins/karma')
|
require('angular-cli/plugins/karma')
|
||||||
],
|
],
|
||||||
files: [
|
files: [
|
||||||
{pattern: './scripts/test.ts', watched: false}
|
{pattern: './scripts/test.ts', watched: false}
|
||||||
],
|
],
|
||||||
preprocessors: {
|
preprocessors: {
|
||||||
'./scripts/test.ts': ['@angular/cli']
|
'./scripts/test.ts': ['angular-cli']
|
||||||
},
|
},
|
||||||
coverageIstanbulReporter: {
|
remapIstanbulReporter: {
|
||||||
reports: [ 'html', 'lcovonly' ],
|
reports: {
|
||||||
fixWebpackSourcePaths: false
|
html: 'coverage',
|
||||||
|
lcovonly: './coverage/coverage.lcov'
|
||||||
|
}
|
||||||
},
|
},
|
||||||
angularCli: {
|
angularCli: {
|
||||||
config: './angular-cli.json',
|
config: './angular-cli.json',
|
||||||
environment: 'dev'
|
environment: 'dev'
|
||||||
},
|
},
|
||||||
reporters: config.angularCli && config.angularCli.codeCoverage
|
reporters: config.angularCli && config.angularCli.codeCoverage
|
||||||
? ['dots', 'coverage-istanbul']
|
? ['dots', 'karma-remap-istanbul']
|
||||||
: ['dots'],
|
: ['dots'],
|
||||||
port: 9876,
|
port: 9876,
|
||||||
colors: true,
|
colors: true,
|
||||||
|
|||||||
12
package.json
12
package.json
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "ng2-file-upload-base",
|
"name": "ng2-file-upload-base",
|
||||||
"version": "1.3.0",
|
"version": "1.2.0",
|
||||||
"private": true,
|
"private": true,
|
||||||
"description": "Angular file upload directives",
|
"description": "Angular file upload directives",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
@@ -45,11 +45,10 @@
|
|||||||
"homepage": "https://github.com/valor-software/ng2-file-upload#readme",
|
"homepage": "https://github.com/valor-software/ng2-file-upload#readme",
|
||||||
"dependencies": {},
|
"dependencies": {},
|
||||||
"peerDependencies": {
|
"peerDependencies": {
|
||||||
"@angular/common": "^2.3.1 || >=4.0.0",
|
"@angular/common": "^2.3.0",
|
||||||
"@angular/core": "^2.3.1 || >=4.0.0"
|
"@angular/core": "^2.3.0"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@angular/cli": "1.0.0",
|
|
||||||
"@angular/common": "2.4.3",
|
"@angular/common": "2.4.3",
|
||||||
"@angular/compiler": "2.4.3",
|
"@angular/compiler": "2.4.3",
|
||||||
"@angular/compiler-cli": "2.4.3",
|
"@angular/compiler-cli": "2.4.3",
|
||||||
@@ -61,10 +60,12 @@
|
|||||||
"@angular/platform-browser-dynamic": "2.4.3",
|
"@angular/platform-browser-dynamic": "2.4.3",
|
||||||
"@angular/router": "3.4.3",
|
"@angular/router": "3.4.3",
|
||||||
"@angular/tsc-wrapped": "0.5.1",
|
"@angular/tsc-wrapped": "0.5.1",
|
||||||
|
"@ngtools/webpack": "1.2.3",
|
||||||
"@types/jasmine": "2.5.40",
|
"@types/jasmine": "2.5.40",
|
||||||
"@types/marked": "0.0.28",
|
"@types/marked": "0.0.28",
|
||||||
"@types/node": "7.0.0",
|
"@types/node": "7.0.0",
|
||||||
"@types/webpack": "^2.2.1",
|
"@types/webpack": "^2.2.1",
|
||||||
|
"angular-cli": "1.0.0-beta.25.5",
|
||||||
"bootstrap": "3.3.7",
|
"bootstrap": "3.3.7",
|
||||||
"chokidar-cli": "1.2.0",
|
"chokidar-cli": "1.2.0",
|
||||||
"classlist-polyfill": "1.0.3",
|
"classlist-polyfill": "1.0.3",
|
||||||
@@ -87,7 +88,6 @@
|
|||||||
"karma": "1.4.0",
|
"karma": "1.4.0",
|
||||||
"karma-chrome-launcher": "^2.0.0",
|
"karma-chrome-launcher": "^2.0.0",
|
||||||
"karma-cli": "^1.0.1",
|
"karma-cli": "^1.0.1",
|
||||||
"karma-coverage-istanbul-reporter": "^1.3.0",
|
|
||||||
"karma-jasmine": "^1.0.2",
|
"karma-jasmine": "^1.0.2",
|
||||||
"karma-remap-istanbul": "0.4.0",
|
"karma-remap-istanbul": "0.4.0",
|
||||||
"karma-sauce-launcher": "1.1.0",
|
"karma-sauce-launcher": "1.1.0",
|
||||||
@@ -95,9 +95,9 @@
|
|||||||
"lodash": "4.17.4",
|
"lodash": "4.17.4",
|
||||||
"markdown-loader": "^0.1.7",
|
"markdown-loader": "^0.1.7",
|
||||||
"marked": "0.3.6",
|
"marked": "0.3.6",
|
||||||
|
"ng2-bootstrap": "1.2.2",
|
||||||
"ng2-page-scroll": "4.0.0-beta.2",
|
"ng2-page-scroll": "4.0.0-beta.2",
|
||||||
"ngm-cli": "0.4.0",
|
"ngm-cli": "0.4.0",
|
||||||
"ngx-bootstrap": "1.6.6",
|
|
||||||
"npm-run-all": "^4.0.1",
|
"npm-run-all": "^4.0.1",
|
||||||
"pre-commit": "1.2.2",
|
"pre-commit": "1.2.2",
|
||||||
"protractor": "5.0.0",
|
"protractor": "5.0.0",
|
||||||
|
|||||||
2
scripts/typings.d.ts
vendored
2
scripts/typings.d.ts
vendored
@@ -8,7 +8,7 @@ declare const ENV:string;
|
|||||||
// google code-prettify
|
// google code-prettify
|
||||||
declare const PR:any;
|
declare const PR:any;
|
||||||
|
|
||||||
// declare const global:any;
|
declare const global:any;
|
||||||
|
|
||||||
declare module jasmine {
|
declare module jasmine {
|
||||||
interface Matchers {
|
interface Matchers {
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
import { Directive, EventEmitter, ElementRef, HostListener, Input, Output } from '@angular/core';
|
import { Directive, EventEmitter, ElementRef, HostListener, Input, Output } from '@angular/core';
|
||||||
|
|
||||||
import { FileUploader, FileUploaderOptions } from './file-uploader.class';
|
import { FileUploader } from './file-uploader.class';
|
||||||
|
|
||||||
@Directive({selector: '[ng2FileDrop]'})
|
@Directive({selector: '[ng2FileDrop]'})
|
||||||
export class FileDropDirective {
|
export class FileDropDirective {
|
||||||
@@ -14,7 +14,7 @@ export class FileDropDirective {
|
|||||||
this.element = element;
|
this.element = element;
|
||||||
}
|
}
|
||||||
|
|
||||||
public getOptions(): FileUploaderOptions {
|
public getOptions():any {
|
||||||
return this.uploader.options;
|
return this.uploader.options;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -83,4 +83,13 @@ export class FileDropDirective {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
_addOverClass(item:any):any {
|
||||||
|
item.addOverClass();
|
||||||
|
}
|
||||||
|
|
||||||
|
_removeOverClass(item:any):any {
|
||||||
|
item.removeOverClass();
|
||||||
|
}*/
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,7 +1,14 @@
|
|||||||
import { FileLikeObject } from './file-like-object.class';
|
import { FileLikeObject } from './file-like-object.class';
|
||||||
import { FileUploader, ParsedResponseHeaders, FileUploaderOptions } from './file-uploader.class';
|
import { FileUploader, ParsedResponseHeaders, FileUploaderOptions } from './file-uploader.class';
|
||||||
|
|
||||||
|
import {Observable} from "rxjs/Rx";
|
||||||
|
|
||||||
export class FileItem {
|
export class FileItem {
|
||||||
|
public observer:any;
|
||||||
|
/**
|
||||||
|
* Observable for subscribing the server result
|
||||||
|
*/
|
||||||
|
public resObservable:Observable;
|
||||||
public file:FileLikeObject;
|
public file:FileLikeObject;
|
||||||
public _file:File;
|
public _file:File;
|
||||||
public alias:string;
|
public alias:string;
|
||||||
@@ -36,6 +43,7 @@ export class FileItem {
|
|||||||
this.alias = uploader.options.itemAlias || 'file';
|
this.alias = uploader.options.itemAlias || 'file';
|
||||||
}
|
}
|
||||||
this.url = uploader.options.url;
|
this.url = uploader.options.url;
|
||||||
|
this.resObservable=new Observable.create(observer=>{this.observer=observer});
|
||||||
}
|
}
|
||||||
|
|
||||||
public upload():void {
|
public upload():void {
|
||||||
|
|||||||
@@ -7,10 +7,8 @@ export class FileLikeObject {
|
|||||||
public size:any;
|
public size:any;
|
||||||
public type:string;
|
public type:string;
|
||||||
public name:string;
|
public name:string;
|
||||||
public rawFile: string;
|
|
||||||
|
|
||||||
public constructor(fileOrInput:any) {
|
public constructor(fileOrInput:any) {
|
||||||
this.rawFile = fileOrInput;
|
|
||||||
let isInput = isElement(fileOrInput);
|
let isInput = isElement(fileOrInput);
|
||||||
let fakePathOrObject = isInput ? fileOrInput.value : fileOrInput;
|
let fakePathOrObject = isInput ? fileOrInput.value : fileOrInput;
|
||||||
let postfix = typeof fakePathOrObject === 'string' ? 'FakePath' : 'Object';
|
let postfix = typeof fakePathOrObject === 'string' ? 'FakePath' : 'Object';
|
||||||
@@ -26,6 +24,7 @@ export class FileLikeObject {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public _createFromObject(object:{size:number, type:string, name:string}):void {
|
public _createFromObject(object:{size:number, type:string, name:string}):void {
|
||||||
|
// this.lastModifiedDate = copy(object.lastModifiedDate);
|
||||||
this.size = object.size;
|
this.size = object.size;
|
||||||
this.type = object.type;
|
this.type = object.type;
|
||||||
this.name = object.name;
|
this.name = object.name;
|
||||||
|
|||||||
@@ -1,11 +1,12 @@
|
|||||||
import { Directive, EventEmitter, ElementRef, Input, HostListener, Output } from '@angular/core';
|
import { Directive, ElementRef, Input, HostListener } from '@angular/core';
|
||||||
|
|
||||||
import { FileUploader } from './file-uploader.class';
|
import { FileUploader } from './file-uploader.class';
|
||||||
|
|
||||||
|
// todo: filters
|
||||||
|
|
||||||
@Directive({selector: '[ng2FileSelect]'})
|
@Directive({selector: '[ng2FileSelect]'})
|
||||||
export class FileSelectDirective {
|
export class FileSelectDirective {
|
||||||
@Input() public uploader:FileUploader;
|
@Input() public uploader:FileUploader;
|
||||||
@Output() public onFileSelected: EventEmitter<File[]> = new EventEmitter<File[]>();
|
|
||||||
|
|
||||||
protected element:ElementRef;
|
protected element:ElementRef;
|
||||||
|
|
||||||
@@ -18,7 +19,7 @@ export class FileSelectDirective {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public getFilters():any {
|
public getFilters():any {
|
||||||
return {};
|
return void 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
public isEmptyAfterSelection():boolean {
|
public isEmptyAfterSelection():boolean {
|
||||||
@@ -27,15 +28,19 @@ export class FileSelectDirective {
|
|||||||
|
|
||||||
@HostListener('change')
|
@HostListener('change')
|
||||||
public onChange():any {
|
public onChange():any {
|
||||||
|
// let files = this.uploader.isHTML5 ? this.element.nativeElement[0].files : this.element.nativeElement[0];
|
||||||
let files = this.element.nativeElement.files;
|
let files = this.element.nativeElement.files;
|
||||||
let options = this.getOptions();
|
let options = this.getOptions();
|
||||||
let filters = this.getFilters();
|
let filters = this.getFilters();
|
||||||
|
|
||||||
this.uploader.addToQueue(files, options, filters);
|
// if(!this.uploader.isHTML5) this.destroy();
|
||||||
this.onFileSelected.emit(files);
|
|
||||||
|
|
||||||
|
this.uploader.addToQueue(files, options, filters);
|
||||||
if (this.isEmptyAfterSelection()) {
|
if (this.isEmptyAfterSelection()) {
|
||||||
|
// todo
|
||||||
this.element.nativeElement.value = '';
|
this.element.nativeElement.value = '';
|
||||||
|
/*this.element.nativeElement
|
||||||
|
.replaceWith(this.element = this.element.nativeElement.clone(true)); // IE fix*/
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,5 +1,3 @@
|
|||||||
import { FileLikeObject } from "../ng2-file-upload";
|
|
||||||
|
|
||||||
export class FileType {
|
export class FileType {
|
||||||
/* MS office */
|
/* MS office */
|
||||||
public static mime_doc:string[] = [
|
public static mime_doc:string[] = [
|
||||||
@@ -52,15 +50,10 @@ export class FileType {
|
|||||||
'application/compress',
|
'application/compress',
|
||||||
'application/x-tar',
|
'application/x-tar',
|
||||||
'application/x-rar-compressed',
|
'application/x-rar-compressed',
|
||||||
'application/octet-stream',
|
'application/octet-stream'
|
||||||
'application/x-zip-compressed',
|
|
||||||
'application/zip-compressed',
|
|
||||||
'application/x-7z-compressed',
|
|
||||||
'application/gzip',
|
|
||||||
'application/x-bzip2'
|
|
||||||
];
|
];
|
||||||
|
|
||||||
public static getMimeClass(file: FileLikeObject): string {
|
public static getMimeClass(file:any):string {
|
||||||
let mimeClass = 'application';
|
let mimeClass = 'application';
|
||||||
if (this.mime_psd.indexOf(file.type) !== -1) {
|
if (this.mime_psd.indexOf(file.type) !== -1) {
|
||||||
mimeClass = 'image';
|
mimeClass = 'image';
|
||||||
@@ -100,7 +93,6 @@ export class FileType {
|
|||||||
'tiff': 'image',
|
'tiff': 'image',
|
||||||
'cr2': 'image',
|
'cr2': 'image',
|
||||||
'dwg': 'image',
|
'dwg': 'image',
|
||||||
'dwf': 'image',
|
|
||||||
'cdr': 'image',
|
'cdr': 'image',
|
||||||
'ai': 'image',
|
'ai': 'image',
|
||||||
'indd': 'image',
|
'indd': 'image',
|
||||||
@@ -115,13 +107,10 @@ export class FileType {
|
|||||||
'mod': 'audio',
|
'mod': 'audio',
|
||||||
'm4a': 'audio',
|
'm4a': 'audio',
|
||||||
'compress': 'compress',
|
'compress': 'compress',
|
||||||
'zip': 'compress',
|
|
||||||
'rar': 'compress',
|
'rar': 'compress',
|
||||||
'7z': 'compress',
|
'7z': 'compress',
|
||||||
'lz': 'compress',
|
'lz': 'compress',
|
||||||
'z01': 'compress',
|
'z01': 'compress',
|
||||||
'bz2': 'compress',
|
|
||||||
'gz': 'compress',
|
|
||||||
'pdf': 'pdf',
|
'pdf': 'pdf',
|
||||||
'xls': 'xls',
|
'xls': 'xls',
|
||||||
'xlsx': 'xls',
|
'xlsx': 'xls',
|
||||||
|
|||||||
@@ -1,4 +1,3 @@
|
|||||||
import { EventEmitter } from '@angular/core';
|
|
||||||
import { FileLikeObject } from './file-like-object.class';
|
import { FileLikeObject } from './file-like-object.class';
|
||||||
import { FileItem } from './file-item.class';
|
import { FileItem } from './file-item.class';
|
||||||
import { FileType } from './file-type.class';
|
import { FileType } from './file-type.class';
|
||||||
@@ -6,7 +5,7 @@ import { FileType } from './file-type.class';
|
|||||||
function isFile(value:any):boolean {
|
function isFile(value:any):boolean {
|
||||||
return (File && value instanceof File);
|
return (File && value instanceof File);
|
||||||
}
|
}
|
||||||
|
// function isFileLikeObject(value:any) {
|
||||||
export interface Headers {
|
export interface Headers {
|
||||||
name:string;
|
name:string;
|
||||||
value:string;
|
value:string;
|
||||||
@@ -14,18 +13,15 @@ export interface Headers {
|
|||||||
|
|
||||||
export type ParsedResponseHeaders = {[headerFieldName:string]:string};
|
export type ParsedResponseHeaders = {[headerFieldName:string]:string};
|
||||||
|
|
||||||
export type FilterFunction = {
|
export type FilterFunction = {name:string, fn:(item?:FileLikeObject, options?:FileUploaderOptions)=>boolean};
|
||||||
name: string,
|
|
||||||
fn: (item?: FileLikeObject, options?: FileUploaderOptions) => boolean
|
|
||||||
};
|
|
||||||
|
|
||||||
export interface FileUploaderOptions {
|
export interface FileUploaderOptions {
|
||||||
allowedMimeType?: string[];
|
allowedMimeType?:Array<string>;
|
||||||
allowedFileType?: string[];
|
allowedFileType?:Array<string>;
|
||||||
autoUpload?:boolean;
|
autoUpload?:boolean;
|
||||||
isHTML5?:boolean;
|
isHTML5?:boolean;
|
||||||
filters?: FilterFunction[];
|
filters?:Array<FilterFunction>;
|
||||||
headers?: Headers[];
|
headers?:Array<Headers>;
|
||||||
method?:string;
|
method?:string;
|
||||||
authToken?:string;
|
authToken?:string;
|
||||||
maxFileSize?:number;
|
maxFileSize?:number;
|
||||||
@@ -36,45 +32,38 @@ export interface FileUploaderOptions {
|
|||||||
itemAlias?: string;
|
itemAlias?: string;
|
||||||
authTokenHeader?: string;
|
authTokenHeader?: string;
|
||||||
additionalParameter?:{[key: string]: any};
|
additionalParameter?:{[key: string]: any};
|
||||||
parametersBeforeFiles?: boolean;
|
|
||||||
formatDataFunction?: Function;
|
|
||||||
formatDataFunctionIsAsync?: boolean;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
export class FileUploader {
|
export class FileUploader {
|
||||||
|
|
||||||
public authToken:string;
|
public authToken:string;
|
||||||
public isUploading:boolean = false;
|
public isUploading:boolean = false;
|
||||||
public queue: FileItem[] = [];
|
public queue:Array<FileItem> = [];
|
||||||
public progress:number = 0;
|
public progress:number = 0;
|
||||||
public _nextIndex:number = 0;
|
public _nextIndex:number = 0;
|
||||||
public autoUpload:any;
|
public autoUpload:any;
|
||||||
public authTokenHeader: string;
|
public authTokenHeader: string;
|
||||||
public response: EventEmitter<any>;
|
|
||||||
|
|
||||||
public options:FileUploaderOptions = {
|
public options:FileUploaderOptions = {
|
||||||
autoUpload: false,
|
autoUpload: false,
|
||||||
isHTML5: true,
|
isHTML5: true,
|
||||||
filters: [],
|
filters: [],
|
||||||
removeAfterUpload: false,
|
removeAfterUpload: false,
|
||||||
disableMultipart: false,
|
disableMultipart: false
|
||||||
formatDataFunction: (item: FileItem) => item._file,
|
|
||||||
formatDataFunctionIsAsync: false
|
|
||||||
};
|
};
|
||||||
|
|
||||||
protected _failFilterIndex:number;
|
protected _failFilterIndex:number;
|
||||||
|
|
||||||
public constructor(options:FileUploaderOptions) {
|
public constructor(options:FileUploaderOptions) {
|
||||||
this.setOptions(options);
|
this.setOptions(options);
|
||||||
this.response = new EventEmitter<any>();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public setOptions(options:FileUploaderOptions):void {
|
public setOptions(options:FileUploaderOptions):void {
|
||||||
this.options = Object.assign(this.options, options);
|
this.options = Object.assign(this.options, options);
|
||||||
|
|
||||||
this.authToken = this.options.authToken;
|
this.authToken = options.authToken;
|
||||||
this.authTokenHeader = this.options.authTokenHeader || 'Authorization';
|
this.authTokenHeader = options.authTokenHeader || 'Authorization';
|
||||||
this.autoUpload = this.options.autoUpload;
|
this.autoUpload = options.autoUpload;
|
||||||
this.options.filters.unshift({name: 'queueLimit', fn: this._queueLimitFilter});
|
this.options.filters.unshift({name: 'queueLimit', fn: this._queueLimitFilter});
|
||||||
|
|
||||||
if (this.options.maxFileSize) {
|
if (this.options.maxFileSize) {
|
||||||
@@ -92,6 +81,7 @@ export class FileUploader {
|
|||||||
for(let i = 0; i < this.queue.length; i++) {
|
for(let i = 0; i < this.queue.length; i++) {
|
||||||
this.queue[i].url = this.options.url;
|
this.queue[i].url = this.options.url;
|
||||||
}
|
}
|
||||||
|
// this.options.filters.unshift({name: 'folder', fn: this._folderFilter});
|
||||||
}
|
}
|
||||||
|
|
||||||
public addToQueue(files:File[], options?:FileUploaderOptions, filters?:FilterFunction[]|string):void {
|
public addToQueue(files:File[], options?:FileUploaderOptions, filters?:FilterFunction[]|string):void {
|
||||||
@@ -106,7 +96,6 @@ export class FileUploader {
|
|||||||
if (!options) {
|
if (!options) {
|
||||||
options = this.options;
|
options = this.options;
|
||||||
}
|
}
|
||||||
|
|
||||||
let temp = new FileLikeObject(some);
|
let temp = new FileLikeObject(some);
|
||||||
if (this._isValidFile(temp, arrayOfFilters, options)) {
|
if (this._isValidFile(temp, arrayOfFilters, options)) {
|
||||||
let fileItem = new FileItem(this, some, options);
|
let fileItem = new FileItem(this, some, options);
|
||||||
@@ -192,11 +181,11 @@ export class FileUploader {
|
|||||||
return typeof value === 'number' ? value : this.queue.indexOf(value);
|
return typeof value === 'number' ? value : this.queue.indexOf(value);
|
||||||
}
|
}
|
||||||
|
|
||||||
public getNotUploadedItems(): any[] {
|
public getNotUploadedItems():Array<any> {
|
||||||
return this.queue.filter((item:FileItem) => !item.isUploaded);
|
return this.queue.filter((item:FileItem) => !item.isUploaded);
|
||||||
}
|
}
|
||||||
|
|
||||||
public getReadyItems(): any[] {
|
public getReadyItems():Array<any> {
|
||||||
return this.queue
|
return this.queue
|
||||||
.filter((item:FileItem) => (item.isReady && !item.isUploading))
|
.filter((item:FileItem) => (item.isReady && !item.isUploading))
|
||||||
.sort((item1:any, item2:any) => item1.index - item2.index);
|
.sort((item1:any, item2:any) => item1.index - item2.index);
|
||||||
@@ -204,6 +193,11 @@ export class FileUploader {
|
|||||||
|
|
||||||
public destroy():void {
|
public destroy():void {
|
||||||
return void 0;
|
return void 0;
|
||||||
|
/*forEach(this._directives, (key) => {
|
||||||
|
forEach(this._directives[key], (object) => {
|
||||||
|
object.destroy();
|
||||||
|
});
|
||||||
|
});*/
|
||||||
}
|
}
|
||||||
|
|
||||||
public onAfterAddingAll(fileItems:any):any {
|
public onAfterAddingAll(fileItems:any):any {
|
||||||
@@ -283,6 +277,7 @@ export class FileUploader {
|
|||||||
}
|
}
|
||||||
this.onCompleteAll();
|
this.onCompleteAll();
|
||||||
this.progress = this._getTotalProgress();
|
this.progress = this._getTotalProgress();
|
||||||
|
this.item.observer.next(response);
|
||||||
this._render();
|
this._render();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -296,11 +291,15 @@ export class FileUploader {
|
|||||||
}
|
}
|
||||||
|
|
||||||
protected _xhrTransport(item:FileItem):any {
|
protected _xhrTransport(item:FileItem):any {
|
||||||
let that = this;
|
|
||||||
let xhr = item._xhr = new XMLHttpRequest();
|
let xhr = item._xhr = new XMLHttpRequest();
|
||||||
let sendable:any;
|
let sendable:any;
|
||||||
this._onBeforeUploadItem(item);
|
this._onBeforeUploadItem(item);
|
||||||
|
// todo
|
||||||
|
/*item.formData.map(obj => {
|
||||||
|
obj.map((value, key) => {
|
||||||
|
form.append(key, value);
|
||||||
|
});
|
||||||
|
});*/
|
||||||
if (typeof item._file.size !== 'number') {
|
if (typeof item._file.size !== 'number') {
|
||||||
throw new TypeError('The file specified is no longer valid');
|
throw new TypeError('The file specified is no longer valid');
|
||||||
}
|
}
|
||||||
@@ -308,28 +307,15 @@ export class FileUploader {
|
|||||||
sendable = new FormData();
|
sendable = new FormData();
|
||||||
this._onBuildItemForm(item, sendable);
|
this._onBuildItemForm(item, sendable);
|
||||||
|
|
||||||
const appendFile = () => sendable.append(item.alias, item._file, item.file.name);
|
sendable.append(item.alias, item._file, item.file.name);
|
||||||
if (!this.options.parametersBeforeFiles) {
|
|
||||||
appendFile();
|
|
||||||
}
|
|
||||||
|
|
||||||
// For AWS, Additional Parameters must come BEFORE Files
|
|
||||||
if (this.options.additionalParameter !== undefined) {
|
if (this.options.additionalParameter !== undefined) {
|
||||||
Object.keys(this.options.additionalParameter).forEach((key:string) => {
|
Object.keys(this.options.additionalParameter).forEach((key:string) => {
|
||||||
let paramVal = this.options.additionalParameter[ key ];
|
sendable.append(key, this.options.additionalParameter[key]);
|
||||||
// Allow an additional parameter to include the filename
|
|
||||||
if (typeof paramVal === 'string' && paramVal.indexOf('{{file_name}}') >= 0) {
|
|
||||||
paramVal = paramVal.replace('{{file_name}}', item.file.name);
|
|
||||||
}
|
|
||||||
sendable.append(key, paramVal);
|
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
if (this.options.parametersBeforeFiles) {
|
|
||||||
appendFile();
|
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
sendable = this.options.formatDataFunction(item);
|
sendable = item._file;
|
||||||
}
|
}
|
||||||
|
|
||||||
xhr.upload.onprogress = (event:any) => {
|
xhr.upload.onprogress = (event:any) => {
|
||||||
@@ -342,7 +328,8 @@ export class FileUploader {
|
|||||||
let gist = this._isSuccessCode(xhr.status) ? 'Success' : 'Error';
|
let gist = this._isSuccessCode(xhr.status) ? 'Success' : 'Error';
|
||||||
let method = '_on' + gist + 'Item';
|
let method = '_on' + gist + 'Item';
|
||||||
(this as any)[method](item, response, xhr.status, headers);
|
(this as any)[method](item, response, xhr.status, headers);
|
||||||
this._onCompleteItem(item, response, xhr.status, headers);
|
this._
|
||||||
|
(item, response, xhr.status, headers);
|
||||||
};
|
};
|
||||||
xhr.onerror = () => {
|
xhr.onerror = () => {
|
||||||
let headers = this._parseHeaders(xhr.getAllResponseHeaders());
|
let headers = this._parseHeaders(xhr.getAllResponseHeaders());
|
||||||
@@ -371,18 +358,7 @@ export class FileUploader {
|
|||||||
if (this.authToken) {
|
if (this.authToken) {
|
||||||
xhr.setRequestHeader(this.authTokenHeader, this.authToken);
|
xhr.setRequestHeader(this.authTokenHeader, this.authToken);
|
||||||
}
|
}
|
||||||
xhr.onreadystatechange = function () {
|
|
||||||
if (xhr.readyState == XMLHttpRequest.DONE) {
|
|
||||||
that.response.emit(xhr.responseText)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (this.options.formatDataFunctionIsAsync) {
|
|
||||||
sendable.then(
|
|
||||||
(result: any) => xhr.send(JSON.stringify(result))
|
|
||||||
);
|
|
||||||
} else {
|
|
||||||
xhr.send(sendable);
|
xhr.send(sendable);
|
||||||
}
|
|
||||||
this._render();
|
this._render();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -414,8 +390,13 @@ export class FileUploader {
|
|||||||
|
|
||||||
protected _render():any {
|
protected _render():any {
|
||||||
return void 0;
|
return void 0;
|
||||||
|
// todo: ?
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// protected _folderFilter(item:FileItem):boolean {
|
||||||
|
// return !!(item.size || item.type);
|
||||||
|
// }
|
||||||
|
|
||||||
protected _queueLimitFilter():boolean {
|
protected _queueLimitFilter():boolean {
|
||||||
return this.options.queueLimit === undefined || this.queue.length < this.options.queueLimit;
|
return this.options.queueLimit === undefined || this.queue.length < this.options.queueLimit;
|
||||||
}
|
}
|
||||||
@@ -432,10 +413,17 @@ export class FileUploader {
|
|||||||
return (status >= 200 && status < 300) || status === 304;
|
return (status >= 200 && status < 300) || status === 304;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* tslint:disable */
|
||||||
protected _transformResponse(response:string, headers:ParsedResponseHeaders):string {
|
protected _transformResponse(response:string, headers:ParsedResponseHeaders):string {
|
||||||
|
// todo: ?
|
||||||
|
/*var headersGetter = this._headersGetter(headers);
|
||||||
|
forEach($http.defaults.transformResponse, (transformFn) => {
|
||||||
|
response = transformFn(response, headersGetter);
|
||||||
|
});*/
|
||||||
return response;
|
return response;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* tslint:enable */
|
||||||
protected _parseHeaders(headers:string):ParsedResponseHeaders {
|
protected _parseHeaders(headers:string):ParsedResponseHeaders {
|
||||||
let parsed:any = {};
|
let parsed:any = {};
|
||||||
let key:any;
|
let key:any;
|
||||||
@@ -455,6 +443,10 @@ export class FileUploader {
|
|||||||
return parsed;
|
return parsed;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*protected _iframeTransport(item:FileItem) {
|
||||||
|
// todo: implement it later
|
||||||
|
}*/
|
||||||
|
|
||||||
protected _onWhenAddingFileFailed(item:FileLikeObject, filter:any, options:any):void {
|
protected _onWhenAddingFileFailed(item:FileLikeObject, filter:any, options:any):void {
|
||||||
this.onWhenAddingFileFailed(item, filter, options);
|
this.onWhenAddingFileFailed(item, filter, options);
|
||||||
}
|
}
|
||||||
@@ -486,11 +478,13 @@ export class FileUploader {
|
|||||||
this._render();
|
this._render();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* tslint:disable */
|
||||||
protected _onSuccessItem(item:FileItem, response:string, status:number, headers:ParsedResponseHeaders):void {
|
protected _onSuccessItem(item:FileItem, response:string, status:number, headers:ParsedResponseHeaders):void {
|
||||||
item._onSuccess(response, status, headers);
|
item._onSuccess(response, status, headers);
|
||||||
this.onSuccessItem(item, response, status, headers);
|
this.onSuccessItem(item, response, status, headers);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* tslint:enable */
|
||||||
protected _onCancelItem(item:FileItem, response:string, status:number, headers:ParsedResponseHeaders):void {
|
protected _onCancelItem(item:FileItem, response:string, status:number, headers:ParsedResponseHeaders):void {
|
||||||
item._onCancel(response, status, headers);
|
item._onCancel(response, status, headers);
|
||||||
this.onCancelItem(item, response, status, headers);
|
this.onCancelItem(item, response, status, headers);
|
||||||
|
|||||||
6
src/file-upload/rxjs/operator.ts
Normal file
6
src/file-upload/rxjs/operator.ts
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
import 'rxjs/add/operator/catch';
|
||||||
|
import 'rxjs/add/operator/debounceTime';
|
||||||
|
import 'rxjs/add/operator/distinctUntilChanged';
|
||||||
|
import 'rxjs/add/operator/map';
|
||||||
|
import 'rxjs/add/operator/switchMap';
|
||||||
|
import 'rxjs/add/operator/toPromise';
|
||||||
@@ -2,6 +2,5 @@ export * from './file-upload/file-select.directive';
|
|||||||
export * from './file-upload/file-drop.directive';
|
export * from './file-upload/file-drop.directive';
|
||||||
export * from './file-upload/file-uploader.class';
|
export * from './file-upload/file-uploader.class';
|
||||||
export * from './file-upload/file-item.class';
|
export * from './file-upload/file-item.class';
|
||||||
export * from './file-upload/file-like-object.class';
|
|
||||||
|
|
||||||
export { FileUploadModule } from './file-upload/file-upload.module';
|
export { FileUploadModule } from './file-upload/file-upload.module';
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "ng2-file-upload",
|
"name": "ng2-file-upload",
|
||||||
"version": "1.3.0",
|
"version": "1.2.0",
|
||||||
"peerDependencies": {
|
"peerDependencies": {
|
||||||
"@angular/common": "*",
|
"@angular/common": "*",
|
||||||
"@angular/core": "*"
|
"@angular/core": "*"
|
||||||
|
|||||||
@@ -1,29 +1,18 @@
|
|||||||
import { Component, DebugElement } from '@angular/core';
|
import { Component } from '@angular/core';
|
||||||
import { By } from '@angular/platform-browser';
|
|
||||||
import { inject, ComponentFixture, TestBed } from '@angular/core/testing';
|
import { inject, ComponentFixture, TestBed } from '@angular/core/testing';
|
||||||
|
|
||||||
import { FileUploader } from '../file-upload/file-uploader.class';
|
import { FileUploader } from '../file-upload/file-uploader.class';
|
||||||
import { FileUploadModule } from '../file-upload/file-upload.module';
|
import { FileUploadModule } from '../file-upload/file-upload.module';
|
||||||
import { FileDropDirective } from '../file-upload/file-drop.directive';
|
|
||||||
|
|
||||||
@Component({
|
@Component({
|
||||||
selector: 'container',
|
selector: 'container',
|
||||||
template: `<div type="file"
|
template: `<input type="file" ng2FileSelect [uploader]="uploader" />`
|
||||||
ng2FileDrop
|
|
||||||
[uploader]="uploader"
|
|
||||||
></div>`
|
|
||||||
})
|
})
|
||||||
export class ContainerComponent {
|
export class ContainerComponent {
|
||||||
public get url(): string { return 'localhost:3000'; }
|
public uploader:FileUploader = new FileUploader({url: 'localhost:3000'});
|
||||||
public uploader: FileUploader = new FileUploader({ url: this.url });
|
|
||||||
}
|
}
|
||||||
|
|
||||||
describe('Directive: FileDropDirective', () => {
|
describe('Directive: FileSelectDirective', () => {
|
||||||
|
|
||||||
let fixture: ComponentFixture<ContainerComponent>;
|
|
||||||
let hostComponent: ContainerComponent;
|
|
||||||
let directiveElement: DebugElement;
|
|
||||||
let fileDropDirective: FileDropDirective;
|
|
||||||
|
|
||||||
beforeEach(() => {
|
beforeEach(() => {
|
||||||
TestBed.configureTestingModule({
|
TestBed.configureTestingModule({
|
||||||
@@ -33,115 +22,7 @@ describe('Directive: FileDropDirective', () => {
|
|||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
beforeEach(() => {
|
it('should be fine', inject([ContainerComponent], (fixture:ComponentFixture<ContainerComponent>) => {
|
||||||
fixture = TestBed.createComponent(ContainerComponent);
|
expect(fixture).not.toBeNull();
|
||||||
hostComponent = fixture.componentInstance;
|
}));
|
||||||
|
|
||||||
fixture.detectChanges();
|
|
||||||
|
|
||||||
directiveElement = fixture.debugElement.query(By.directive(FileDropDirective));
|
|
||||||
fileDropDirective = directiveElement.injector.get(FileDropDirective) as FileDropDirective;
|
|
||||||
});
|
});
|
||||||
|
|
||||||
it('can be initialized', () => {
|
|
||||||
expect(fixture).toBeDefined();
|
|
||||||
expect(hostComponent).toBeDefined();
|
|
||||||
expect(fileDropDirective).toBeDefined();
|
|
||||||
});
|
|
||||||
|
|
||||||
it('can set file uploader', () => {
|
|
||||||
expect(fileDropDirective.uploader).toBe(hostComponent.uploader);
|
|
||||||
});
|
|
||||||
|
|
||||||
it('can get uploader options', () => {
|
|
||||||
const options = fileDropDirective.getOptions();
|
|
||||||
|
|
||||||
// Check url set through binding
|
|
||||||
expect(options.url).toBe(hostComponent.url);
|
|
||||||
|
|
||||||
// Check default options
|
|
||||||
expect(options.autoUpload).toBeFalsy();
|
|
||||||
expect(options.isHTML5).toBeTruthy();
|
|
||||||
expect(options.removeAfterUpload).toBeFalsy();
|
|
||||||
expect(options.disableMultipart).toBeFalsy();
|
|
||||||
});
|
|
||||||
|
|
||||||
it('can get filters', () => {
|
|
||||||
const filters = fileDropDirective.getFilters();
|
|
||||||
|
|
||||||
// TODO: Update test once implemented
|
|
||||||
expect(filters).toEqual({});
|
|
||||||
});
|
|
||||||
|
|
||||||
it('handles drop event', () => {
|
|
||||||
spyOn(fileDropDirective, 'onDrop');
|
|
||||||
|
|
||||||
directiveElement.triggerEventHandler('drop', getFakeEventData());
|
|
||||||
|
|
||||||
expect(fileDropDirective.onDrop).toHaveBeenCalled();
|
|
||||||
});
|
|
||||||
|
|
||||||
it('adds file to upload', () => {
|
|
||||||
spyOn(fileDropDirective.uploader, 'addToQueue');
|
|
||||||
|
|
||||||
let fileOverData;
|
|
||||||
fileDropDirective.fileOver.subscribe((data: any) => fileOverData = data);
|
|
||||||
|
|
||||||
let fileDropData;
|
|
||||||
fileDropDirective.onFileDrop.subscribe((data: File[]) => fileDropData = data);
|
|
||||||
|
|
||||||
fileDropDirective.onDrop(getFakeEventData());
|
|
||||||
|
|
||||||
const uploadedFiles = getFakeEventData().dataTransfer.files;
|
|
||||||
const expectedArguments = [ uploadedFiles, fileDropDirective.getOptions(), fileDropDirective.getFilters() ];
|
|
||||||
|
|
||||||
expect(fileDropDirective.uploader.addToQueue).toHaveBeenCalledWith(...expectedArguments);
|
|
||||||
expect(fileOverData).toBeFalsy();
|
|
||||||
expect(fileDropData).toEqual(uploadedFiles);
|
|
||||||
});
|
|
||||||
|
|
||||||
it('handles dragover event', () => {
|
|
||||||
spyOn(fileDropDirective, 'onDragOver');
|
|
||||||
|
|
||||||
directiveElement.triggerEventHandler('dragover', getFakeEventData());
|
|
||||||
|
|
||||||
expect(fileDropDirective.onDragOver).toHaveBeenCalled();
|
|
||||||
});
|
|
||||||
|
|
||||||
it('handles file over', () => {
|
|
||||||
let fileOverData;
|
|
||||||
fileDropDirective.fileOver.subscribe((data: any) => fileOverData = data);
|
|
||||||
|
|
||||||
fileDropDirective.onDragOver(getFakeEventData());
|
|
||||||
|
|
||||||
expect(fileOverData).toBeTruthy();
|
|
||||||
});
|
|
||||||
|
|
||||||
it('handles dragleave event', () => {
|
|
||||||
spyOn(fileDropDirective, 'onDragLeave');
|
|
||||||
|
|
||||||
directiveElement.triggerEventHandler('dragleave', getFakeEventData());
|
|
||||||
|
|
||||||
expect(fileDropDirective.onDragLeave).toHaveBeenCalled();
|
|
||||||
});
|
|
||||||
|
|
||||||
it('handles file over leave', () => {
|
|
||||||
let fileOverData;
|
|
||||||
fileDropDirective.fileOver.subscribe((data: any) => fileOverData = data);
|
|
||||||
|
|
||||||
fileDropDirective.onDragLeave(getFakeEventData());
|
|
||||||
|
|
||||||
expect(fileOverData).toBeFalsy();
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
function getFakeEventData(): any {
|
|
||||||
return {
|
|
||||||
dataTransfer: {
|
|
||||||
files: [ 'foo.bar' ],
|
|
||||||
types: [ 'Files' ]
|
|
||||||
},
|
|
||||||
preventDefault: () => undefined,
|
|
||||||
stopPropagation: () => undefined
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|||||||
@@ -1,99 +0,0 @@
|
|||||||
import { TestBed, ComponentFixture } from '@angular/core/testing';
|
|
||||||
import { Component, DebugElement } from '@angular/core';
|
|
||||||
import { By } from '@angular/platform-browser';
|
|
||||||
|
|
||||||
import { FileUploadModule } from '../file-upload/file-upload.module';
|
|
||||||
import { FileSelectDirective } from '../file-upload/file-select.directive';
|
|
||||||
import { FileUploader } from '../file-upload/file-uploader.class';
|
|
||||||
|
|
||||||
@Component({
|
|
||||||
selector: 'container',
|
|
||||||
template: `<input type="file"
|
|
||||||
ng2FileSelect
|
|
||||||
[uploader]="uploader"
|
|
||||||
/>`
|
|
||||||
})
|
|
||||||
export class ContainerComponent {
|
|
||||||
public get url(): string { return 'localhost:3000'; }
|
|
||||||
public uploader: FileUploader = new FileUploader({ url: this.url });
|
|
||||||
}
|
|
||||||
|
|
||||||
describe('Directive: FileSelectDirective', () => {
|
|
||||||
let fixture: ComponentFixture<ContainerComponent>;
|
|
||||||
let hostComponent: ContainerComponent;
|
|
||||||
let directiveElement: DebugElement;
|
|
||||||
let fileSelectDirective: FileSelectDirective;
|
|
||||||
|
|
||||||
beforeEach(() => {
|
|
||||||
TestBed.configureTestingModule({
|
|
||||||
imports: [ FileUploadModule ],
|
|
||||||
declarations: [ ContainerComponent ],
|
|
||||||
providers: [ ContainerComponent ]
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
beforeEach(() => {
|
|
||||||
fixture = TestBed.createComponent(ContainerComponent);
|
|
||||||
hostComponent = fixture.componentInstance;
|
|
||||||
|
|
||||||
fixture.detectChanges();
|
|
||||||
|
|
||||||
directiveElement = fixture.debugElement.query(By.directive(FileSelectDirective));
|
|
||||||
fileSelectDirective = directiveElement.injector.get(FileSelectDirective) as FileSelectDirective;
|
|
||||||
});
|
|
||||||
|
|
||||||
it('can be initialized', () => {
|
|
||||||
expect(fixture).toBeDefined();
|
|
||||||
expect(hostComponent).toBeDefined();
|
|
||||||
expect(fileSelectDirective).toBeDefined();
|
|
||||||
});
|
|
||||||
|
|
||||||
it('can set file uploader', () => {
|
|
||||||
expect(fileSelectDirective.uploader).toBe(hostComponent.uploader);
|
|
||||||
});
|
|
||||||
|
|
||||||
it('can get uploader options', () => {
|
|
||||||
const options = fileSelectDirective.getOptions();
|
|
||||||
|
|
||||||
// Check url set through binding
|
|
||||||
expect(options.url).toBe(hostComponent.url);
|
|
||||||
|
|
||||||
// Check default options
|
|
||||||
expect(options.autoUpload).toBeFalsy();
|
|
||||||
expect(options.isHTML5).toBeTruthy();
|
|
||||||
expect(options.removeAfterUpload).toBeFalsy();
|
|
||||||
expect(options.disableMultipart).toBeFalsy();
|
|
||||||
});
|
|
||||||
|
|
||||||
it('can get filters', () => {
|
|
||||||
const filters = fileSelectDirective.getFilters();
|
|
||||||
|
|
||||||
// TODO: Update test once implemented
|
|
||||||
expect(filters).toEqual({});
|
|
||||||
});
|
|
||||||
|
|
||||||
it('can check if element is empty', () => {
|
|
||||||
const isElementEmpty = fileSelectDirective.isEmptyAfterSelection();
|
|
||||||
|
|
||||||
expect(isElementEmpty).toBeFalsy();
|
|
||||||
});
|
|
||||||
|
|
||||||
it('can listed on change event', () => {
|
|
||||||
spyOn(fileSelectDirective, 'onChange');
|
|
||||||
|
|
||||||
directiveElement.triggerEventHandler('change', {});
|
|
||||||
|
|
||||||
expect(fileSelectDirective.onChange).toHaveBeenCalled();
|
|
||||||
});
|
|
||||||
|
|
||||||
it('handles change event', () => {
|
|
||||||
spyOn(fileSelectDirective.uploader, 'addToQueue');
|
|
||||||
|
|
||||||
fileSelectDirective.onChange();
|
|
||||||
|
|
||||||
const expectedArguments = [ directiveElement.nativeElement.files,
|
|
||||||
fileSelectDirective.getOptions(),
|
|
||||||
fileSelectDirective.getFilters() ];
|
|
||||||
expect(fileSelectDirective.uploader.addToQueue).toHaveBeenCalledWith(...expectedArguments);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
Reference in New Issue
Block a user