├── .gitignore ├── .npmignore ├── CHANGELOG.md ├── LICENSE ├── README.md ├── angular-file.d.ts ├── esm2020 ├── angular-file.mjs ├── file-upload │ ├── doc-event-help.functions.mjs │ ├── fileTools.mjs │ ├── ngf.directive.mjs │ ├── ngf.module.mjs │ ├── ngfBackground.directive.mjs │ ├── ngfDrop.directive.mjs │ ├── ngfFormData.directive.mjs │ ├── ngfSelect.directive.mjs │ ├── ngfSrc.directive.mjs │ └── ngfUploadStatus.directive.mjs ├── index.mjs └── src │ ├── angular-file-src.mjs │ ├── file-upload │ ├── doc-event-help.functions.mjs │ ├── fileTools.mjs │ ├── ngf.directive.mjs │ ├── ngf.module.mjs │ ├── ngfBackground.directive.mjs │ ├── ngfDrop.directive.mjs │ ├── ngfFormData.directive.mjs │ ├── ngfSelect.directive.mjs │ ├── ngfSrc.directive.mjs │ └── ngfUploadStatus.directive.mjs │ └── public-api.mjs ├── fesm2015 ├── angular-file-src.mjs ├── angular-file-src.mjs.map ├── angular-file.mjs └── angular-file.mjs.map ├── fesm2020 ├── angular-file-src.mjs ├── angular-file-src.mjs.map ├── angular-file.mjs └── angular-file.mjs.map ├── file-upload ├── doc-event-help.functions.d.ts ├── fileTools.d.ts ├── ngf.directive.d.ts ├── ngf.module.d.ts ├── ngfBackground.directive.d.ts ├── ngfDrop.directive.d.ts ├── ngfFormData.directive.d.ts ├── ngfSelect.directive.d.ts ├── ngfSrc.directive.d.ts └── ngfUploadStatus.directive.d.ts ├── index.d.ts ├── package.json └── src ├── angular-file-src.d.ts ├── file-upload ├── doc-event-help.functions.d.ts ├── fileTools.d.ts ├── ngf.directive.d.ts ├── ngf.module.d.ts ├── ngfBackground.directive.d.ts ├── ngfDrop.directive.d.ts ├── ngfFormData.directive.d.ts ├── ngfSelect.directive.d.ts ├── ngfSrc.directive.d.ts └── ngfUploadStatus.directive.d.ts ├── package.json └── public-api.d.ts /.gitignore: -------------------------------------------------------------------------------- 1 | # Dependency directory 2 | # https://www.npmjs.org/doc/misc/npm-faq.html#should-i-check-my-node_modules-folder-into-git 3 | /node_modules 4 | /bower_components 5 | 6 | # IDEs and editors 7 | /.idea 8 | /.vscode 9 | .project 10 | .classpath 11 | *.launch 12 | .settings/ 13 | 14 | # misc 15 | /.sass-cache 16 | /connect.lock 17 | /coverage 18 | /libpeerconnection.log 19 | npm-debug.log 20 | 21 | # ignore build and dist for now 22 | #/dist 23 | /temp 24 | /demo/dist 25 | /demo/temp 26 | /logs 27 | 28 | #System Files 29 | .DS_Store 30 | Thumbs.db 31 | 32 | #Acker Apple common folder for double-click script executions 33 | /updaters 34 | 35 | /demo/e2e/*.js 36 | /demo/e2e/*.map 37 | src/**/*.js 38 | src/**/*.map 39 | scripts/**/*.js 40 | scripts/**/*.map 41 | -------------------------------------------------------------------------------- /.npmignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | 3 | www/index.js.map 4 | etc 5 | styles.css.map 6 | js_modules 7 | .ack-webpack-temp 8 | aot/ 9 | updaters/ 10 | example/ 11 | test/ 12 | .gitignore 13 | tsconfig.json 14 | .npmignore 15 | src/ -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | # angular-file - Change Log 2 | All notable changes to this project will be documented here. 3 | 4 | ## 4.0.0 - (2023-05-16) 5 | - Built on Angular 14 6 | 7 | ## 3.9.3 - (2023-05-03) 8 | - Built with altered tsconfig.json 9 | 10 | ## 3.9.0 - (2023-05-03) 11 | - Built on Angular 13 12 | 13 | ## 3.8.0 - (2023-05-03) 14 | - Built on Angular 12 15 | 16 | ## 3.7.0 - (2023-05-03) 17 | - Reflect more accurate typing of file not being defined by default 18 | 19 | ## 3.6.0 - (2021-05-10) 20 | - Issue #98 fixed by PR #99 for this.fileElm was actually targeting the label wrapper 21 | - angular-file places a label wrapping a file on html and when saved to memory label targeted and not file input 22 | 23 | ## 3.5.3 - (2021-04-26) 24 | - Fix 3.5.0 variable references and possible undefined error 25 | 26 | ## 3.5.0 - (2021-04-22) 27 | - Close #27 regarding click to upload same file twice 28 | - ngOnChanges is listened to for when files or file is dropped then file input elm cleared 29 | - Dependencies updated 30 | - Demo updated with clear buttons next to inputs 31 | - Added `(fileSelectStart)` output event 32 | 33 | ## 3.4.0 - (2021-01-05) 34 | - Restructure things done in 3.3.1 35 | 36 | ## 3.2.3 - (2020-11-11) 37 | - Built with ng10 38 | - new [capturePaste] window event listener for files (default off) 39 | - selectable attribute now reads string values of 'false', 'null', '0' as false 40 | 41 | ## 3.1.1 - (2020-06-10) 42 | - Published version to npm 43 | - Includes touch fix error for Chrome Mobile 44 | 45 | ## 3.1.0 - (2020-06-10) 46 | - Build using @angular/cli library 47 | 48 | ## 3.0.1 - (2019-03-17) 49 | - fix typo 50 | 51 | ## 3.0.0 - (2019-02-01) 52 | - Built on Angular 9 53 | 54 | ## 2.0.0 - (2019-11-04) 55 | - built for dist better 56 | - built for ivy 57 | 58 | ## 1.3.1 - (2019-06-27) 59 | - Built on ng8 60 | - NOTE: A report from another package on ng8 claims may not be compatible with ng7 61 | - Built with strict mode 62 | - Fixed demo upload url 63 | - Fixed testing enviroment 64 | - Docs have bundle sizes 65 | 66 | ## 1.2.4 - (2019-06-26) 67 | - updated docs 68 | - removed peer dependencies 69 | - moved some dependencies into devDependencies 70 | 71 | ## 1.2.3 - (2019-05-22) 72 | - kb to byte on demo page 73 | - https://github.com/AckerApple/angular-file/issues/55 74 | 75 | ## 1.2.1 - (2019-05-20) 76 | - Adjust processing events into files 77 | 78 | ## 1.2.0 - (2019-05-16) 79 | - Updated to latest Angular 80 | - Demo has bundle stats 81 | - Removed legacy build techniques 82 | - Updated from angular-cli.json to angular.json 83 | 84 | ## 1.1.1 - (2019-04-04) 85 | - Added ngfSrc 86 | 87 | ## 1.1.0 - (2019-02-13) 88 | - Fixed fileDropDisabled binding 89 | - Docs to clarify ngf versus ngfDrop versus ngfSelect 90 | 91 | ## 1.0.2 - (2019-02-13) 92 | - Fix click action as swipe check 93 | - [github issue](https://github.com/AckerApple/angular-file/issues/44) 94 | 95 | ## 1.0.0 - (2019-02-11) 96 | - strict mode on 97 | - check file type before file size 98 | - [(ref)] bindings have been removed from all components/directives 99 | - no more [(ngf)] 100 | - no more [(ngfSelect))] 101 | - use template references if needed: `` 102 | 103 | ## 0.5.9 - (2018-12-04) 104 | - documentation 105 | 106 | ## 0.5.4 - (2018-04-21) 107 | - Fix file check when no files defined 108 | 109 | ## 0.5.2 - (2018-04-21) 110 | - Fix single file reselect after item removed from files 111 | 112 | ## 0.5.0 - (2018-02-07) 113 | - Removed much unused code from original package that this is a fork from 114 | - Fixed and ensured accept attribute working correctly 115 | - Improved demo page in terms of the accept attribute and file drag metadata 116 | - BREAKING CHANGES 117 | - Removed directive ngfUploader 118 | - ngfUploader.directive.ts has been removed from this package 119 | - FileUploader.class.ts has been removed from this package 120 | - FileUploader.class has been removed from this package 121 | - FileItem.class has been removed from this package 122 | - FileLikeObject.class has been removed from this package 123 | - Files are always considered valid when dragged inside browsers that dont allow ANY drag file metadata 124 | - Input forceFilename has been removed from all ngf directives 125 | - Input forcePostname has been removed from all ngf directives 126 | 127 | ## [0.4.0] - (2017-12-05) 128 | - BREAKING CHANGES 129 | - Angular 4 updated to 5.0.5 130 | - Expected this package will require Angular5+ 131 | - Updated every dependency 132 | 133 | ## [0.3.8] - 2017-11-27 134 | - made accept and maxSize update on change 135 | 136 | ## [0.3.7] - 2017-11-03 137 | - added ngfFormData directive 138 | 139 | ## [0.3.6] - 2017-10-26 140 | - case-insensative accept filtering 141 | 142 | ## [0.3.5] - 2017-10-25 143 | - Ensured accept filters transmit file names when possible for better mime type checking 144 | 145 | ## [0.3.4] - 2017-10-24 146 | - enhanced acceptFilter filter checking 147 | 148 | ## [0.3.3] - 2017-10-02 149 | - fixed IE11 dragdrop issue 150 | 151 | ## [0.3.0] - 2017-10-02 152 | ### Breaking Changes 153 | - [(files)] is now a default blank array . May cause issues if you have *ngIf="files" instead of *ngIf="files.length" 154 | - removed useNgHttp from ngfUploader and no longer depend on angular/http 155 | - ngf, ngfSelect, and ngfDrop no longer reset the [(files)]. They always append new files 156 | ### Added 157 | - ngfUploadStatus 158 | 159 | ## [0.2.0] - 2017-10-02 160 | ### Breaking Changes 161 | - FileUploader isHtml5Mode has been removed 162 | ### Added 163 | - ngfUploader 164 | 165 | ## [0.1.0] - 2017-08-31 166 | ### Breaking Changes 167 | - fileUrl is now lastBaseUrl 168 | 169 | ## [0.0.0] - 2017-08-31 170 | ### Overhauled by Acker 171 | - Taken from an outdated barely usable package to an up-to-date slimmed down easier to develop version 172 | ## Added 173 | - uploader.getFormData() 174 | 175 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2015-2017 Dmitriy Shekhovtsov 4 | Copyright (c) 2015-1017 Valor Software 5 | 6 | Permission is hereby granted, free of charge, to any person obtaining a copy 7 | of this software and associated documentation files (the "Software"), to deal 8 | in the Software without restriction, including without limitation the rights 9 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 10 | copies of the Software, and to permit persons to whom the Software is 11 | furnished to do so, subject to the following conditions: 12 | 13 | The above copyright notice and this permission notice shall be included in all 14 | copies or substantial portions of the Software. 15 | 16 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 19 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 20 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 21 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 22 | SOFTWARE. 23 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # angular-file 2 | 3 | Easy to use Angular directives for user file selections ([DEMO PAGE](http://ackerapple.github.io/angular-file/)) 4 | 5 | [![hire me](https://ackerapple.github.io/resume/assets/images/hire-me-badge.svg)](https://ackerapple.github.io/resume/) 6 | [![npm version](https://badge.fury.io/js/angular-file.svg)](http://badge.fury.io/js/angular-file) 7 | [![npm downloads](https://img.shields.io/npm/dm/angular-file.svg)](https://npmjs.org/angular-file) 8 | [![Dependency Status](https://david-dm.org/ackerapple/angular-file.svg)](https://david-dm.org/ackerapple/angular-file) 9 | [![Build status](https://ci.appveyor.com/api/projects/status/sq815bogrtky29b8?svg=true)](https://ci.appveyor.com/project/AckerApple/angular-file/branch/development) 10 | [![Build Status](https://travis-ci.org/AckerApple/angular-file.svg?branch=development)](https://travis-ci.org/AckerApple/angular-file) 11 | [![min size](https://badgen.net/bundlephobia/min/angular-file)](https://bundlephobia.com/result?p=angular-file) 12 | [![minzip size](https://badgen.net/bundlephobia/minzip/angular-file)](https://bundlephobia.com/result?p=angular-file) 13 | 14 | > This package is to handle select/drag/drop of files. Once files are selected, for uploading, you then use Angular's `@angular/common/http` for uploading selected files ([see here for more on uploading](#uploading)). 15 | 16 |
17 | Table of Contents 18 | 19 | - [Quick Start](#quick-start) 20 | - [Examples](#examples) 21 | - [Practical Example](#practical-example) 22 | - [Select Files Examples](#select-files-examples) 23 | - [Drop Files Examples](#drop-files-examples) 24 | - [API](#api) 25 | - [ngf Directive](#ngf-directive) 26 | - [ngfDrop Directive](#ngfdrop-directive) 27 | - [ngfBackground Directive](#ngfbackground-directive) 28 | - [ngfSrc Directive](#ngfsrc-directive) 29 | - [ngfSelect Directive](#ngfselect-directive) 30 | - [ngfUploadStatus Directive](#ngfuploadstatus-directive) 31 | - [Uploading](#uploading) 32 | - [Troubleshooting](#troubleshooting) 33 | - [Development](#development) 34 | - [Credits](#credits) 35 | - [License](#license) 36 | 37 |
38 | 39 | ## Quick Start 40 | 41 | 1. A recommended way to install ***angular-file*** is through [npm](https://www.npmjs.com/search?q=angular-file) package manager using the following command: 42 | 43 | `npm install angular-file --save-dev` 44 | 45 | Alternatively, you can [download it in a ZIP file](https://github.com/ackerapple/angular-file/archive/master.zip). 46 | 47 | 2. Currently `angular-file` contains three directives: `ngf`, `ngfSelect`, and `ngfDrop`. `ngf` and `ngfSelect` are quite the same with just different defaults and they both utilize `` functionality. `ngfDrop` is used to designate an area that will be used for dropping of file(s). 48 | 49 | 3. More information regarding using of ***angular-file*** is located in [demo](http://ackerapple.github.io/angular-file/) and [demo sources](https://github.com/ackerapple/angular-file/tree/development/demo). 50 | 51 | ## Examples 52 | 53 | ### Practical Example 54 | An example intended to have every line needed to run an app with angular-file. To use this example, replace the contents of main.ts with this code, and add `` to the body of index.html 55 | 56 | ```typescript 57 | import { ngfModule, ngf } from "angular-file" 58 | import { Component, NgModule } from "@angular/core" 59 | import { 60 | HttpClient, HttpClientModule, HttpRequest, HttpResponse, HttpEvent 61 | } from "@angular/common/http" 62 | import { platformBrowserDynamic } from "@angular/platform-browser-dynamic" 63 | import { BrowserModule } from '@angular/platform-browser' 64 | import { Subscription } from 'rxjs' 65 | 66 | // two ways to upload files 67 | const template = ` 68 | 77 | 78 | 79 | 84 | 85 | 89 | 90 |
91 | Upload Progress: {{ uploadPercent }}% 92 |
93 | ` 94 | 95 | @Component({ 96 | selector: 'app', 97 | template: template 98 | }) 99 | export class AppComponent { 100 | postUrl = '...' 101 | myFormData:FormData//populated by ngfFormData directive 102 | httpEvent:HttpEvent<{}> 103 | 104 | constructor(public HttpClient:HttpClient){} 105 | 106 | uploadFiles(files:File[]) : Subscription { 107 | const config = new HttpRequest('POST', this.postUrl, this.myFormData, { 108 | reportProgress: true 109 | }) 110 | 111 | return this.HttpClient.request( config ) 112 | .subscribe(event=>{ 113 | this.httpEvent = event 114 | 115 | if (event instanceof HttpResponse) { 116 | alert('upload complete, old school alert used') 117 | } 118 | }, 119 | error=>{ 120 | alert('!failure beyond compare cause:' + error.toString()) 121 | }) 122 | } 123 | } 124 | 125 | @NgModule({ 126 | imports: [ 127 | BrowserModule, 128 | HttpClientModule, 129 | ngfModule 130 | ], 131 | declarations: [ 132 | AppComponent 133 | ], 134 | bootstrap: [AppComponent] 135 | }) 136 | export class AppModule {} 137 | 138 | platformBrowserDynamic().bootstrapModule(AppModule); 139 | ``` 140 | 141 | 142 | ### Select Files Examples 143 | Examples of how to allow file selection 144 | 145 | Multiple 146 | ```html 147 | 148 | ``` 149 | 150 | Single 151 | ```html 152 | 153 | ``` 154 | 155 | Element 156 | ```html 157 |
158 | Tap to Select 159 |
160 | ``` 161 | 162 | Image Backgrounds Only 163 | ```html 164 | 167 |
170 | ``` 171 | 172 | Images Only 173 | ```html 174 | 177 | 178 | ``` 179 | 180 | ### Drop Files Examples 181 | Examples of how to allow file drag/drop 182 | 183 | Basic 184 | ```html 185 |
192 | Drop Files Here 193 |
194 | ``` 195 | Combo Drop Select 196 | ```html 197 |
203 | Combo drop/select zone 204 |
205 | ``` 206 | 207 | ## API 208 | 209 | - [ngf Directive](#ngf-directive) 210 | - [ngfDrop Directive](#ngfdrop-directive) 211 | - [ngfSelect Directive](#ngfselect-directive) 212 | - [ngfBackground Directive](#ngfbackground-directive) 213 | - [ngfSrc Directive](#ngfsrc-directive) 214 | - [ngfUploadStatus Directive](#ngfuploadstatus-directive) 215 | 216 | ### ngf Directive 217 | 218 | A base directive that provides abilities of ngfDrop and ngfSelect. Does **not** auto default nor auto host element events like hover/drag/drop (see [ngfDrop](#ngfdrop-directive) and/or [ngfSelect](#ngfselect-directive)) 219 | 220 | ```typescript 221 | ngf : ngf // reference to directive class 222 | [multiple] : string 223 | [accept] : string 224 | [maxSize] : number // bytes . 1024 = 1k . 1048576 = 1mb 225 | [ngfFixOrientation] : boolean = true 226 | [fileDropDisabled] : any = false 227 | [selectable] : any = false 228 | [(lastInvalids)] : {file:File,type:string}[] = [] 229 | [(lastBaseUrl)] : string // Base64 od last file uploaded url 230 | [(file)] : File // last file uploaded 231 | [(files)] : File[] 232 | (init) : EventEmitter 233 | [capturePaste] : boolean // listen to window paste event for files 234 | (fileSelectStart) : EventEmitter // Event fired for user selecting files starting 235 | ``` 236 | 237 | ### ngfDrop Directive 238 | 239 | Extends [ngf](#ngf-directive) and then auto hosts element event watching of hover/drag/drop 240 | 241 | ```javascript 242 | [fileDropDisabled] : any = false 243 | (fileOver) :EventEmitter = new EventEmitter() 244 | [(validDrag)] :any = false 245 | [(invalidDrag)] :any = false 246 | ``` 247 | 248 | > Supporting Internet Explorer 11 or less? 249 | >> Only (fileOver) works accurately 250 | >> [(validDrag)] & [(invalidDrag)] should NOT be used as IE11 does not indicate the number of files NOR the types of files being dragged like other modern web browsers 251 | 252 | ### ngfSelect Directive 253 | Extends [ngf](#ngf-directive) and auto engages click base file selecting 254 | ```javascript 255 | [selectable]:any = true 256 | ``` 257 | 258 | ### ngfBackground Directive 259 | ```javascript 260 | [ngfBackground]:File 261 | ``` 262 | 263 | ### ngfSrc Directive 264 | ```javascript 265 | [ngfSrc]:File 266 | ``` 267 | 268 | ### ngfUploadStatus Directive 269 | 270 | Does calculations of an upload event and provideds percent of upload completed 271 | 272 | ```typescript 273 | [(percent)]:number 274 | [httpEvent]:Event 275 | ``` 276 | 277 | ### ngfFormData Directive 278 | 279 | Converts files to FormData 280 | 281 | ```typescript 282 | [files]:File[] 283 | [postName]:string = "file" 284 | [fileName]:string//optional force file name 285 | [(FormData)]:FormData 286 | ``` 287 | 288 | ## Uploading 289 | 290 | Angular, natively, makes uploading files so very easy! 291 | 292 | *Did you know?* 293 | - You do NOT and should NOT use a seperate package to upload files other than `@angular/common` 294 | - You do not need a package like ng2-file-upload which have outdated non-core-community driven file uploading scripts 295 | - Just can just use `@angular/common` to send files! Why add more unneccessary weight of dependency of another package? 296 | - Multi file uploading is so easy with `@angular/common` 297 | - You will have the most control seperating your file selecting from file uploading 298 | - You should use this package, angular-file, to select files and then give to Angular to upload 299 | 300 | *Uploading files is as easy as:* 301 | ``` 302 | import { Subscription } from "rxjs"//only included for data typing 303 | import { 304 | HttpClient, HttpRequest, HttpResponse 305 | } from "@angular/common/http" 306 | 307 | export const uploadFiles(files:File[]) : Subscription { 308 | const postUrl = "..." 309 | const myFormData:FormData = new FormData() 310 | 311 | files.forEach(file=>myFormData.append("file", file, "file-name.xyz")) 312 | 313 | const config = new HttpRequest("POST", postUrl, myFormData), { 314 | reportProgress: true 315 | }) 316 | 317 | return this.HttpClient.request( config ) 318 | .subscribe(event=>{ 319 | if (event instanceof HttpResponse) { 320 | alert('upload complete, old school alert used') 321 | } 322 | }, 323 | error=>{ 324 | alert('!failure cause:' + error.toString()) 325 | }) 326 | } 327 | ``` 328 | 329 | 330 | ## Troubleshooting 331 | Please follow this guidelines when reporting bugs and feature requests: 332 | 333 | 1. Use [GitHub Issues](https://github.com/ackerapple/angular-file/issues) board to report bugs and feature requests (not our email address) 334 | 2. Please **always** write steps to reproduce the error. That way we can focus on fixing the bug, not scratching our heads trying to reproduce it. 335 | 336 | Thanks for understanding! 337 | 338 | ## Development 339 | Work on this package 340 | 341 | > Source files are on not the default github branch 342 | 343 | - [source files here](https://github.com/AckerApple/angular-file.git) 344 | 345 | ``` 346 | git clone https://github.com/AckerApple/angular-file.git -b development 347 | ``` 348 | 349 | ## Credits 350 | - Current Author: Acker Apple 351 | - Forked from outdated package: [ng2-file-upload](https://www.npmjs.com/package/ng2-file-upload) 352 | 353 | ## License 354 | The MIT License (see the [LICENSE](https://github.com/ackerapple/angular-file/blob/master/LICENSE) file for the full text) 355 | -------------------------------------------------------------------------------- /angular-file.d.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * Generated bundle index. Do not edit. 3 | */ 4 | /// 5 | export * from './index'; 6 | -------------------------------------------------------------------------------- /esm2020/angular-file.mjs: -------------------------------------------------------------------------------- 1 | /** 2 | * Generated bundle index. Do not edit. 3 | */ 4 | export * from './index'; 5 | //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYW5ndWxhci1maWxlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2FuZ3VsYXItZmlsZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7R0FFRztBQUVILGNBQWMsU0FBUyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBHZW5lcmF0ZWQgYnVuZGxlIGluZGV4LiBEbyBub3QgZWRpdC5cbiAqL1xuXG5leHBvcnQgKiBmcm9tICcuL2luZGV4JztcbiJdfQ== -------------------------------------------------------------------------------- /esm2020/file-upload/doc-event-help.functions.mjs: -------------------------------------------------------------------------------- 1 | export const isFileInput = function (elm) { 2 | const ty = elm.getAttribute('type'); 3 | return elm.tagName.toLowerCase() === 'input' && ty && ty.toLowerCase() === 'file'; 4 | }; 5 | let initialTouchStartY = 0; 6 | let initialTouchStartX = 0; 7 | export const detectSwipe = function (evt) { 8 | var touches = evt.changedTouches || (evt.originalEvent && evt.originalEvent.changedTouches); 9 | if (touches) { 10 | if (evt.type === 'touchstart') { 11 | initialTouchStartX = touches[0].clientX; 12 | initialTouchStartY = touches[0].clientY; 13 | return true; // don't block event default 14 | } 15 | else { 16 | // prevent scroll from triggering event 17 | if (evt.type === 'touchend') { 18 | var currentX = touches[0].clientX; 19 | var currentY = touches[0].clientY; 20 | if ((Math.abs(currentX - initialTouchStartX) > 20) || 21 | (Math.abs(currentY - initialTouchStartY) > 20)) { 22 | evt.stopPropagation(); 23 | if (evt.cancelable) { 24 | evt.preventDefault(); 25 | } 26 | return false; 27 | } 28 | } 29 | return true; 30 | } 31 | } 32 | return false; 33 | }; 34 | export const createInvisibleFileInputWrap = function () { 35 | var fileElem = createFileInput(); 36 | var label = document.createElement('label'); 37 | label.innerHTML = 'upload'; 38 | label.style.visibility = 'hidden'; 39 | label.style.position = 'absolute'; 40 | label.style.overflow = 'hidden'; 41 | label.style.width = '0px'; 42 | label.style.height = '0px'; 43 | label.style.border = 'none'; 44 | label.style.margin = '0px'; 45 | label.style.padding = '0px'; 46 | label.setAttribute('tabindex', '-1'); 47 | //bindAttrToFileInput(fileElem, label); 48 | //generatedElems.push({el: elem, ref: label}); 49 | label.appendChild(fileElem); 50 | //document.body.appendChild( label ); 51 | return label; 52 | }; 53 | export const createFileInput = function () { 54 | var fileElem = document.createElement('input'); 55 | fileElem.type = "file"; 56 | return fileElem; 57 | }; 58 | //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZG9jLWV2ZW50LWhlbHAuZnVuY3Rpb25zLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2ZpbGUtdXBsb2FkL2RvYy1ldmVudC1oZWxwLmZ1bmN0aW9ucy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxNQUFNLENBQUMsTUFBTSxXQUFXLEdBQUcsVUFBUyxHQUFPO0lBQ3pDLE1BQU0sRUFBRSxHQUFHLEdBQUcsQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLENBQUE7SUFDbkMsT0FBTyxHQUFHLENBQUMsT0FBTyxDQUFDLFdBQVcsRUFBRSxLQUFLLE9BQU8sSUFBSSxFQUFFLElBQUksRUFBRSxDQUFDLFdBQVcsRUFBRSxLQUFLLE1BQU0sQ0FBQztBQUNwRixDQUFDLENBQUE7QUFFRCxJQUFJLGtCQUFrQixHQUFHLENBQUMsQ0FBQztBQUMzQixJQUFJLGtCQUFrQixHQUFHLENBQUMsQ0FBQztBQUMzQixNQUFNLENBQUMsTUFBTSxXQUFXLEdBQUcsVUFBUyxHQUFPO0lBQ3pDLElBQUksT0FBTyxHQUFHLEdBQUcsQ0FBQyxjQUFjLElBQUksQ0FBQyxHQUFHLENBQUMsYUFBYSxJQUFJLEdBQUcsQ0FBQyxhQUFhLENBQUMsY0FBYyxDQUFDLENBQUM7SUFDNUYsSUFBSSxPQUFPLEVBQUU7UUFDWCxJQUFJLEdBQUcsQ0FBQyxJQUFJLEtBQUssWUFBWSxFQUFFO1lBQzdCLGtCQUFrQixHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUM7WUFDeEMsa0JBQWtCLEdBQUcsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQztZQUN4QyxPQUFPLElBQUksQ0FBQyxDQUFDLDRCQUE0QjtTQUMxQzthQUFNO1lBQ0wsdUNBQXVDO1lBQ3ZDLElBQUksR0FBRyxDQUFDLElBQUksS0FBSyxVQUFVLEVBQUU7Z0JBQzNCLElBQUksUUFBUSxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUM7Z0JBQ2xDLElBQUksUUFBUSxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUM7Z0JBQ2xDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLFFBQVEsR0FBRyxrQkFBa0IsQ0FBQyxHQUFHLEVBQUUsQ0FBQztvQkFDaEQsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLFFBQVEsR0FBRyxrQkFBa0IsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFO29CQUNoRCxHQUFHLENBQUMsZUFBZSxFQUFFLENBQUM7b0JBQ3RCLElBQUksR0FBRyxDQUFDLFVBQVUsRUFBRTt3QkFDbEIsR0FBRyxDQUFDLGNBQWMsRUFBRSxDQUFDO3FCQUN0QjtvQkFDRCxPQUFPLEtBQUssQ0FBQztpQkFDZDthQUNGO1lBQ0QsT0FBTyxJQUFJLENBQUM7U0FDYjtLQUNGO0lBQ0QsT0FBTyxLQUFLLENBQUE7QUFDZCxDQUFDLENBQUE7QUFFRCxNQUFNLENBQUMsTUFBTSw0QkFBNEIsR0FBRztJQUMxQyxJQUFJLFFBQVEsR0FBRyxlQUFlLEVBQUUsQ0FBQTtJQUNoQyxJQUFJLEtBQUssR0FBRyxRQUFRLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQzVDLEtBQUssQ0FBQyxTQUFTLEdBQUcsUUFBUSxDQUFBO0lBQzFCLEtBQUssQ0FBQyxLQUFLLENBQUMsVUFBVSxHQUFHLFFBQVEsQ0FBQTtJQUNqQyxLQUFLLENBQUMsS0FBSyxDQUFDLFFBQVEsR0FBRyxVQUFVLENBQUE7SUFDakMsS0FBSyxDQUFDLEtBQUssQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFBO0lBQy9CLEtBQUssQ0FBQyxLQUFLLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQTtJQUN6QixLQUFLLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUE7SUFDMUIsS0FBSyxDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFBO0lBQzNCLEtBQUssQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQTtJQUMxQixLQUFLLENBQUMsS0FBSyxDQUFDLE9BQU8sR0FBRyxLQUFLLENBQUE7SUFDM0IsS0FBSyxDQUFDLFlBQVksQ0FBQyxVQUFVLEVBQUMsSUFBSSxDQUFDLENBQUE7SUFFbkMsdUNBQXVDO0lBQ3ZDLDhDQUE4QztJQUU5QyxLQUFLLENBQUMsV0FBVyxDQUFFLFFBQVEsQ0FBRSxDQUFBO0lBQzdCLHFDQUFxQztJQUVyQyxPQUFPLEtBQUssQ0FBQztBQUNmLENBQUMsQ0FBQTtBQUVELE1BQU0sQ0FBQyxNQUFNLGVBQWUsR0FBRztJQUM3QixJQUFJLFFBQVEsR0FBRyxRQUFRLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQy9DLFFBQVEsQ0FBQyxJQUFJLEdBQUMsTUFBTSxDQUFBO0lBQ3BCLE9BQU8sUUFBUSxDQUFDO0FBQ2xCLENBQUMsQ0FBQSIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBjb25zdCBpc0ZpbGVJbnB1dCA9IGZ1bmN0aW9uKGVsbTphbnkpe1xuICBjb25zdCB0eSA9IGVsbS5nZXRBdHRyaWJ1dGUoJ3R5cGUnKVxuICByZXR1cm4gZWxtLnRhZ05hbWUudG9Mb3dlckNhc2UoKSA9PT0gJ2lucHV0JyAmJiB0eSAmJiB0eS50b0xvd2VyQ2FzZSgpID09PSAnZmlsZSc7XG59XG5cbmxldCBpbml0aWFsVG91Y2hTdGFydFkgPSAwO1xubGV0IGluaXRpYWxUb3VjaFN0YXJ0WCA9IDA7XG5leHBvcnQgY29uc3QgZGV0ZWN0U3dpcGUgPSBmdW5jdGlvbihldnQ6YW55KTpib29sZWFuIHtcbiAgdmFyIHRvdWNoZXMgPSBldnQuY2hhbmdlZFRvdWNoZXMgfHwgKGV2dC5vcmlnaW5hbEV2ZW50ICYmIGV2dC5vcmlnaW5hbEV2ZW50LmNoYW5nZWRUb3VjaGVzKTtcbiAgaWYgKHRvdWNoZXMpIHtcbiAgICBpZiAoZXZ0LnR5cGUgPT09ICd0b3VjaHN0YXJ0Jykge1xuICAgICAgaW5pdGlhbFRvdWNoU3RhcnRYID0gdG91Y2hlc1swXS5jbGllbnRYO1xuICAgICAgaW5pdGlhbFRvdWNoU3RhcnRZID0gdG91Y2hlc1swXS5jbGllbnRZO1xuICAgICAgcmV0dXJuIHRydWU7IC8vIGRvbid0IGJsb2NrIGV2ZW50IGRlZmF1bHRcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gcHJldmVudCBzY3JvbGwgZnJvbSB0cmlnZ2VyaW5nIGV2ZW50XG4gICAgICBpZiAoZXZ0LnR5cGUgPT09ICd0b3VjaGVuZCcpIHtcbiAgICAgICAgdmFyIGN1cnJlbnRYID0gdG91Y2hlc1swXS5jbGllbnRYO1xuICAgICAgICB2YXIgY3VycmVudFkgPSB0b3VjaGVzWzBdLmNsaWVudFk7XG4gICAgICAgIGlmICgoTWF0aC5hYnMoY3VycmVudFggLSBpbml0aWFsVG91Y2hTdGFydFgpID4gMjApIHx8XG4gICAgICAgICAgKE1hdGguYWJzKGN1cnJlbnRZIC0gaW5pdGlhbFRvdWNoU3RhcnRZKSA+IDIwKSkge1xuICAgICAgICAgIGV2dC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgICBpZiAoZXZ0LmNhbmNlbGFibGUpIHtcbiAgICAgICAgICAgIGV2dC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZmFsc2Vcbn1cblxuZXhwb3J0IGNvbnN0IGNyZWF0ZUludmlzaWJsZUZpbGVJbnB1dFdyYXAgPSBmdW5jdGlvbigpIHtcbiAgdmFyIGZpbGVFbGVtID0gY3JlYXRlRmlsZUlucHV0KClcbiAgdmFyIGxhYmVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnbGFiZWwnKTtcbiAgbGFiZWwuaW5uZXJIVE1MID0gJ3VwbG9hZCdcbiAgbGFiZWwuc3R5bGUudmlzaWJpbGl0eSA9ICdoaWRkZW4nXG4gIGxhYmVsLnN0eWxlLnBvc2l0aW9uID0gJ2Fic29sdXRlJ1xuICBsYWJlbC5zdHlsZS5vdmVyZmxvdyA9ICdoaWRkZW4nXG4gIGxhYmVsLnN0eWxlLndpZHRoID0gJzBweCdcbiAgbGFiZWwuc3R5bGUuaGVpZ2h0ID0gJzBweCdcbiAgbGFiZWwuc3R5bGUuYm9yZGVyID0gJ25vbmUnXG4gIGxhYmVsLnN0eWxlLm1hcmdpbiA9ICcwcHgnXG4gIGxhYmVsLnN0eWxlLnBhZGRpbmcgPSAnMHB4J1xuICBsYWJlbC5zZXRBdHRyaWJ1dGUoJ3RhYmluZGV4JywnLTEnKVxuICBcbiAgLy9iaW5kQXR0clRvRmlsZUlucHV0KGZpbGVFbGVtLCBsYWJlbCk7XG4gIC8vZ2VuZXJhdGVkRWxlbXMucHVzaCh7ZWw6IGVsZW0sIHJlZjogbGFiZWx9KTtcblxuICBsYWJlbC5hcHBlbmRDaGlsZCggZmlsZUVsZW0gKVxuICAvL2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoIGxhYmVsICk7XG5cbiAgcmV0dXJuIGxhYmVsO1xufVxuXG5leHBvcnQgY29uc3QgY3JlYXRlRmlsZUlucHV0ID0gZnVuY3Rpb24oKSB7XG4gIHZhciBmaWxlRWxlbSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2lucHV0Jyk7XG4gIGZpbGVFbGVtLnR5cGU9XCJmaWxlXCJcbiAgcmV0dXJuIGZpbGVFbGVtO1xufVxuIl19 -------------------------------------------------------------------------------- /esm2020/file-upload/ngf.directive.mjs: -------------------------------------------------------------------------------- 1 | import { Directive, EventEmitter, Input, Output, HostListener } from '@angular/core'; 2 | import { createInvisibleFileInputWrap, isFileInput, detectSwipe } from "./doc-event-help.functions"; 3 | import { acceptType, applyExifRotation, dataUrl } from "./fileTools"; 4 | import * as i0 from "@angular/core"; 5 | /** A master base set of logic intended to support file select/drag/drop operations 6 | NOTE: Use ngfDrop for full drag/drop. Use ngfSelect for selecting 7 | */ 8 | export class ngf { 9 | constructor(element) { 10 | this.element = element; 11 | this.filters = []; 12 | this.lastFileCount = 0; 13 | this.ngfFixOrientation = true; 14 | this.fileDropDisabled = false; 15 | this.selectable = false; 16 | this.directiveInit = new EventEmitter(); 17 | this.lastInvalids = []; 18 | this.lastInvalidsChange = new EventEmitter(); 19 | this.lastBaseUrlChange = new EventEmitter(); 20 | this.fileChange = new EventEmitter(); 21 | this.files = []; 22 | this.filesChange = new EventEmitter(); 23 | this.fileSelectStart = new EventEmitter(); 24 | this.initFilters(); 25 | } 26 | initFilters() { 27 | // the order is important 28 | this.filters.push({ name: 'accept', fn: this._acceptFilter }); 29 | this.filters.push({ name: 'fileSize', fn: this._fileSizeFilter }); 30 | //this.filters.push({name: 'fileType', fn: this._fileTypeFilter}) 31 | //this.filters.push({name: 'queueLimit', fn: this._queueLimitFilter}) 32 | //this.filters.push({name: 'mimeType', fn: this._mimeTypeFilter}) 33 | } 34 | ngOnDestroy() { 35 | delete this.fileElm; //faster memory release of dom element 36 | this.destroyPasteListener(); 37 | } 38 | ngOnInit() { 39 | const selectable = (this.selectable || this.selectable === '') && !['false', 'null', '0'].includes(this.selectable); 40 | if (selectable) { 41 | this.enableSelecting(); 42 | } 43 | if (this.multiple) { 44 | this.paramFileElm().setAttribute('multiple', this.multiple); 45 | } 46 | this.evalCapturePaste(); 47 | // create reference to this class with one cycle delay to avoid ExpressionChangedAfterItHasBeenCheckedError 48 | setTimeout(() => { 49 | this.directiveInit.emit(this); 50 | }, 0); 51 | } 52 | ngOnChanges(changes) { 53 | if (changes.accept) { 54 | this.paramFileElm().setAttribute('accept', changes.accept.currentValue || '*'); 55 | } 56 | if (changes.capturePaste) { 57 | this.evalCapturePaste(); 58 | } 59 | // Did we go from having a file to not having a file? Clear file element then 60 | if (changes.file && changes.file.previousValue && !changes.file.currentValue) { 61 | this.clearFileElmValue(); 62 | } 63 | // Did we go from having files to not having files? Clear file element then 64 | if (changes.files) { 65 | const filesWentToZero = changes.files.previousValue?.length && !changes.files.currentValue?.length; 66 | if (filesWentToZero) { 67 | this.clearFileElmValue(); 68 | } 69 | } 70 | } 71 | evalCapturePaste() { 72 | const isActive = this.capturePaste || this.capturePaste === '' || ['false', '0', 'null'].includes(this.capturePaste); 73 | if (isActive) { 74 | if (this.pasteCapturer) { 75 | return; // already listening 76 | } 77 | this.pasteCapturer = (e) => { 78 | const clip = e.clipboardData; 79 | if (clip && clip.files && clip.files.length) { 80 | this.handleFiles(clip.files); 81 | e.preventDefault(); 82 | } 83 | }; 84 | window.addEventListener('paste', this.pasteCapturer); 85 | return; 86 | } 87 | this.destroyPasteListener(); 88 | } 89 | destroyPasteListener() { 90 | if (this.pasteCapturer) { 91 | window.removeEventListener('paste', this.pasteCapturer); 92 | delete this.pasteCapturer; 93 | } 94 | } 95 | paramFileElm() { 96 | if (this.fileElm) 97 | return this.fileElm; // already defined 98 | // elm already is a file input 99 | const isFile = isFileInput(this.element.nativeElement); 100 | if (isFile) { 101 | return this.fileElm = this.element.nativeElement; 102 | } 103 | // the host elm is NOT a file input 104 | return this.fileElm = this.createFileElm({ 105 | change: this.changeFn.bind(this) 106 | }); 107 | } 108 | /** Only used when host element we are attached to is NOT a fileElement */ 109 | createFileElm({ change }) { 110 | // use specific technique to hide file element within 111 | const label = createInvisibleFileInputWrap(); 112 | const fileElm = label.getElementsByTagName('input')[0]; 113 | fileElm.addEventListener('change', change); 114 | this.element.nativeElement.appendChild(label); // put on html stage 115 | return fileElm; 116 | } 117 | enableSelecting() { 118 | let elm = this.element.nativeElement; 119 | if (isFileInput(elm)) { 120 | const bindedHandler = event => this.beforeSelect(event); 121 | elm.addEventListener('click', bindedHandler); 122 | elm.addEventListener('touchstart', bindedHandler); 123 | return; 124 | } 125 | const bindedHandler = ev => this.clickHandler(ev); 126 | elm.addEventListener('click', bindedHandler); 127 | elm.addEventListener('touchstart', bindedHandler); 128 | elm.addEventListener('touchend', bindedHandler); 129 | } 130 | getValidFiles(files) { 131 | const rtn = []; 132 | for (let x = files.length - 1; x >= 0; --x) { 133 | if (this.isFileValid(files[x])) { 134 | rtn.push(files[x]); 135 | } 136 | } 137 | return rtn; 138 | } 139 | getInvalidFiles(files) { 140 | const rtn = []; 141 | for (let x = files.length - 1; x >= 0; --x) { 142 | let failReason = this.getFileFilterFailName(files[x]); 143 | if (failReason) { 144 | rtn.push({ 145 | file: files[x], 146 | type: failReason 147 | }); 148 | } 149 | } 150 | return rtn; 151 | } 152 | // Primary handler of files coming in 153 | handleFiles(files) { 154 | const valids = this.getValidFiles(files); 155 | if (files.length != valids.length) { 156 | this.lastInvalids = this.getInvalidFiles(files); 157 | } 158 | else { 159 | delete this.lastInvalids; 160 | } 161 | this.lastInvalidsChange.emit(this.lastInvalids); 162 | if (valids.length) { 163 | if (this.ngfFixOrientation) { 164 | this.applyExifRotations(valids) 165 | .then(fixedFiles => this.que(fixedFiles)); 166 | } 167 | else { 168 | this.que(valids); 169 | } 170 | } 171 | if (this.isEmptyAfterSelection()) { 172 | this.element.nativeElement.value = ''; 173 | } 174 | } 175 | que(files) { 176 | this.files = this.files || []; 177 | Array.prototype.push.apply(this.files, files); 178 | //below break memory ref and doesnt act like a que 179 | //this.files = files//causes memory change which triggers bindings like 180 | this.filesChange.emit(this.files); 181 | if (files.length) { 182 | this.fileChange.emit(this.file = files[0]); 183 | if (this.lastBaseUrlChange.observers.length) { 184 | dataUrl(files[0]) 185 | .then(url => this.lastBaseUrlChange.emit(url)); 186 | } 187 | } 188 | //will be checked for input value clearing 189 | this.lastFileCount = this.files.length; 190 | } 191 | /** called when input has files */ 192 | changeFn(event) { 193 | var fileList = event.__files_ || (event.target && event.target.files); 194 | if (!fileList) 195 | return; 196 | this.stopEvent(event); 197 | this.handleFiles(fileList); 198 | } 199 | clickHandler(evt) { 200 | const elm = this.element.nativeElement; 201 | if (elm.getAttribute('disabled') || this.fileDropDisabled) { 202 | return false; 203 | } 204 | var r = detectSwipe(evt); 205 | // prevent the click if it is a swipe 206 | if (r !== false) 207 | return r; 208 | const fileElm = this.paramFileElm(); 209 | fileElm.click(); 210 | //fileElm.dispatchEvent( new Event('click') ); 211 | this.beforeSelect(evt); 212 | return false; 213 | } 214 | beforeSelect(event) { 215 | this.fileSelectStart.emit(event); 216 | if (this.files && this.lastFileCount === this.files.length) 217 | return; 218 | // if no files in array, be sure browser does not prevent reselect of same file (see github issue 27) 219 | this.clearFileElmValue(); 220 | } 221 | clearFileElmValue() { 222 | if (!this.fileElm) 223 | return; 224 | this.fileElm.value = null; 225 | } 226 | isEmptyAfterSelection() { 227 | return !!this.element.nativeElement.attributes.multiple; 228 | } 229 | stopEvent(event) { 230 | event.preventDefault(); 231 | event.stopPropagation(); 232 | } 233 | transferHasFiles(transfer) { 234 | if (!transfer.types) { 235 | return false; 236 | } 237 | if (transfer.types.indexOf) { 238 | return transfer.types.indexOf('Files') !== -1; 239 | } 240 | else if (transfer.types.contains) { 241 | return transfer.types.contains('Files'); 242 | } 243 | else { 244 | return false; 245 | } 246 | } 247 | eventToFiles(event) { 248 | const transfer = eventToTransfer(event); 249 | if (transfer) { 250 | if (transfer.files && transfer.files.length) { 251 | return transfer.files; 252 | } 253 | if (transfer.items && transfer.items.length) { 254 | return transfer.items; 255 | } 256 | } 257 | return []; 258 | } 259 | applyExifRotations(files) { 260 | const mapper = (file, index) => { 261 | return applyExifRotation(file) 262 | .then(fixedFile => files.splice(index, 1, fixedFile)); 263 | }; 264 | const proms = []; 265 | for (let x = files.length - 1; x >= 0; --x) { 266 | proms[x] = mapper(files[x], x); 267 | } 268 | return Promise.all(proms).then(() => files); 269 | } 270 | onChange(event) { 271 | let files = this.element.nativeElement.files || this.eventToFiles(event); 272 | if (!files.length) 273 | return; 274 | this.stopEvent(event); 275 | this.handleFiles(files); 276 | } 277 | getFileFilterFailName(file) { 278 | for (let i = 0; i < this.filters.length; i++) { 279 | if (!this.filters[i].fn.call(this, file)) { 280 | return this.filters[i].name; 281 | } 282 | } 283 | return undefined; 284 | } 285 | isFileValid(file) { 286 | const noFilters = !this.accept && (!this.filters || !this.filters.length); 287 | if (noFilters) { 288 | return true; //we have no filters so all files are valid 289 | } 290 | return this.getFileFilterFailName(file) ? false : true; 291 | } 292 | isFilesValid(files) { 293 | for (let x = files.length - 1; x >= 0; --x) { 294 | if (!this.isFileValid(files[x])) { 295 | return false; 296 | } 297 | } 298 | return true; 299 | } 300 | _acceptFilter(item) { 301 | return acceptType(this.accept, item.type, item.name); 302 | } 303 | _fileSizeFilter(item) { 304 | return !(this.maxSize && item.size > this.maxSize); 305 | } 306 | } 307 | ngf.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: ngf, deps: [{ token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Directive }); 308 | ngf.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "14.3.0", type: ngf, selector: "[ngf]", inputs: { multiple: "multiple", accept: "accept", maxSize: "maxSize", ngfFixOrientation: "ngfFixOrientation", fileDropDisabled: "fileDropDisabled", selectable: "selectable", lastInvalids: "lastInvalids", lastBaseUrl: "lastBaseUrl", file: "file", files: "files", capturePaste: "capturePaste" }, outputs: { directiveInit: "init", lastInvalidsChange: "lastInvalidsChange", lastBaseUrlChange: "lastBaseUrlChange", fileChange: "fileChange", filesChange: "filesChange", fileSelectStart: "fileSelectStart" }, host: { listeners: { "change": "onChange($event)" } }, exportAs: ["ngf"], usesOnChanges: true, ngImport: i0 }); 309 | i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: ngf, decorators: [{ 310 | type: Directive, 311 | args: [{ 312 | selector: "[ngf]", 313 | exportAs: "ngf" 314 | }] 315 | }], ctorParameters: function () { return [{ type: i0.ElementRef }]; }, propDecorators: { multiple: [{ 316 | type: Input 317 | }], accept: [{ 318 | type: Input 319 | }], maxSize: [{ 320 | type: Input 321 | }], ngfFixOrientation: [{ 322 | type: Input 323 | }], fileDropDisabled: [{ 324 | type: Input 325 | }], selectable: [{ 326 | type: Input 327 | }], directiveInit: [{ 328 | type: Output, 329 | args: ['init'] 330 | }], lastInvalids: [{ 331 | type: Input 332 | }], lastInvalidsChange: [{ 333 | type: Output 334 | }], lastBaseUrl: [{ 335 | type: Input 336 | }], lastBaseUrlChange: [{ 337 | type: Output 338 | }], file: [{ 339 | type: Input 340 | }], fileChange: [{ 341 | type: Output 342 | }], files: [{ 343 | type: Input 344 | }], filesChange: [{ 345 | type: Output 346 | }], fileSelectStart: [{ 347 | type: Output 348 | }], capturePaste: [{ 349 | type: Input 350 | }], onChange: [{ 351 | type: HostListener, 352 | args: ['change', ['$event']] 353 | }] } }); 354 | /** browsers try hard to conceal data about file drags, this tends to undo that */ 355 | export function filesToWriteableObject(files) { 356 | const jsonFiles = []; 357 | for (let x = 0; x < files.length; ++x) { 358 | jsonFiles.push({ 359 | type: files[x].type, 360 | kind: files[x]["kind"] 361 | }); 362 | } 363 | return jsonFiles; 364 | } 365 | export function eventToTransfer(event) { 366 | if (event.dataTransfer) 367 | return event.dataTransfer; 368 | return event.originalEvent ? event.originalEvent.dataTransfer : null; 369 | } 370 | //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmdmLmRpcmVjdGl2ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9maWxlLXVwbG9hZC9uZ2YuZGlyZWN0aXZlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFjLEtBQUssRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFpQixNQUFNLGVBQWUsQ0FBQztBQUNoSCxPQUFPLEVBQUUsNEJBQTRCLEVBQUUsV0FBVyxFQUFFLFdBQVcsRUFBRSxNQUFNLDRCQUE0QixDQUFBO0FBQ25HLE9BQU8sRUFDTCxVQUFVLEVBQ1YsaUJBQWlCLEVBQUUsT0FBTyxFQUMzQixNQUFNLGFBQWEsQ0FBQTs7QUFPcEI7O0VBRUU7QUFLRixNQUFNLE9BQU8sR0FBRztJQWdDZCxZQUFtQixPQUFrQjtRQUFsQixZQUFPLEdBQVAsT0FBTyxDQUFXO1FBOUJyQyxZQUFPLEdBQStDLEVBQUUsQ0FBQTtRQUN4RCxrQkFBYSxHQUFXLENBQUMsQ0FBQTtRQUtoQixzQkFBaUIsR0FBWSxJQUFJLENBQUE7UUFFakMscUJBQWdCLEdBQVksS0FBSyxDQUFBO1FBQ2pDLGVBQVUsR0FBcUIsS0FBSyxDQUFBO1FBQzdCLGtCQUFhLEdBQXFCLElBQUksWUFBWSxFQUFFLENBQUE7UUFFM0QsaUJBQVksR0FBcUIsRUFBRSxDQUFBO1FBQ2xDLHVCQUFrQixHQUEyQyxJQUFJLFlBQVksRUFBRSxDQUFBO1FBRy9FLHNCQUFpQixHQUF3QixJQUFJLFlBQVksRUFBRSxDQUFBO1FBRzNELGVBQVUsR0FBdUIsSUFBSSxZQUFZLEVBQUUsQ0FBQTtRQUVwRCxVQUFLLEdBQVUsRUFBRSxDQUFBO1FBQ2hCLGdCQUFXLEdBQXdCLElBQUksWUFBWSxFQUFVLENBQUM7UUFFOUQsb0JBQWUsR0FBdUIsSUFBSSxZQUFZLEVBQUUsQ0FBQTtRQU9oRSxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUE7SUFDcEIsQ0FBQztJQUVELFdBQVc7UUFDVCx5QkFBeUI7UUFDekIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFBQyxJQUFJLEVBQUUsUUFBUSxFQUFFLEVBQUUsRUFBRSxJQUFJLENBQUMsYUFBYSxFQUFDLENBQUMsQ0FBQTtRQUMzRCxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFDLElBQUksRUFBRSxVQUFVLEVBQUUsRUFBRSxFQUFFLElBQUksQ0FBQyxlQUFlLEVBQUMsQ0FBQyxDQUFBO1FBRS9ELGlFQUFpRTtRQUNqRSxxRUFBcUU7UUFDckUsaUVBQWlFO0lBQ25FLENBQUM7SUFFRCxXQUFXO1FBQ1QsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFBLENBQUEsc0NBQXNDO1FBQ3pELElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO0lBQzlCLENBQUM7SUFFRCxRQUFRO1FBQ04sTUFBTSxVQUFVLEdBQUcsQ0FBQyxJQUFJLENBQUMsVUFBVSxJQUFJLElBQUksQ0FBQyxVQUFVLEtBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxVQUFvQixDQUFDLENBQUM7UUFDNUgsSUFBSSxVQUFVLEVBQUU7WUFDZCxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUE7U0FDdkI7UUFFRCxJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUU7WUFDakIsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDLFlBQVksQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFBO1NBQzVEO1FBRUQsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7UUFFeEIsMkdBQTJHO1FBQzNHLFVBQVUsQ0FBQyxHQUFFLEVBQUU7WUFDYixJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQTtRQUMvQixDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUE7SUFDUCxDQUFDO0lBRUQsV0FBVyxDQUFFLE9BQXNCO1FBQ2pDLElBQUksT0FBTyxDQUFDLE1BQU0sRUFBRTtZQUNsQixJQUFJLENBQUMsWUFBWSxFQUFFLENBQUMsWUFBWSxDQUFDLFFBQVEsRUFBRSxPQUFPLENBQUMsTUFBTSxDQUFDLFlBQVksSUFBSSxHQUFHLENBQUMsQ0FBQTtTQUMvRTtRQUVELElBQUksT0FBTyxDQUFDLFlBQVksRUFBRTtZQUN4QixJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztTQUN6QjtRQUVELDZFQUE2RTtRQUM3RSxJQUFJLE9BQU8sQ0FBQyxJQUFJLElBQUksT0FBTyxDQUFDLElBQUksQ0FBQyxhQUFhLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRTtZQUM1RSxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQTtTQUN6QjtRQUVELDJFQUEyRTtRQUMzRSxJQUFJLE9BQU8sQ0FBQyxLQUFLLEVBQUU7WUFDakIsTUFBTSxlQUFlLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQyxhQUFhLEVBQUUsTUFBTSxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxZQUFZLEVBQUUsTUFBTSxDQUFBO1lBRWxHLElBQUksZUFBZSxFQUFFO2dCQUNuQixJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQTthQUN6QjtTQUNGO0lBQ0gsQ0FBQztJQUVELGdCQUFnQjtRQUNkLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxZQUFZLElBQUssSUFBSSxDQUFDLFlBQW9CLEtBQUcsRUFBRSxJQUFJLENBQUMsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLENBQUMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFlBQW1CLENBQUMsQ0FBQztRQUVuSSxJQUFJLFFBQVEsRUFBRTtZQUNaLElBQUksSUFBSSxDQUFDLGFBQWEsRUFBRTtnQkFDdEIsT0FBTyxDQUFDLG9CQUFvQjthQUM3QjtZQUVELElBQUksQ0FBQyxhQUFhLEdBQUcsQ0FBQyxDQUFRLEVBQUUsRUFBRTtnQkFDaEMsTUFBTSxJQUFJLEdBQUksQ0FBUyxDQUFDLGFBQWEsQ0FBQztnQkFDdEMsSUFBSSxJQUFJLElBQUksSUFBSSxDQUFDLEtBQUssSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRTtvQkFDM0MsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7b0JBQzdCLENBQUMsQ0FBQyxjQUFjLEVBQUUsQ0FBQztpQkFDcEI7WUFDSCxDQUFDLENBQUE7WUFFRCxNQUFNLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQztZQUVyRCxPQUFPO1NBQ1I7UUFFRCxJQUFJLENBQUMsb0JBQW9CLEVBQUUsQ0FBQztJQUM5QixDQUFDO0lBRUQsb0JBQW9CO1FBQ2xCLElBQUksSUFBSSxDQUFDLGFBQWEsRUFBRTtZQUN0QixNQUFNLENBQUMsbUJBQW1CLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQztZQUN4RCxPQUFPLElBQUksQ0FBQyxhQUFhLENBQUM7U0FDM0I7SUFDSCxDQUFDO0lBRUQsWUFBWTtRQUNWLElBQUksSUFBSSxDQUFDLE9BQU87WUFBRSxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUEsQ0FBQyxrQkFBa0I7UUFFeEQsOEJBQThCO1FBQzlCLE1BQU0sTUFBTSxHQUFHLFdBQVcsQ0FBRSxJQUFJLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBRSxDQUFBO1FBQ3hELElBQUcsTUFBTSxFQUFDO1lBQ1IsT0FBTyxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFBO1NBQ2pEO1FBRUQsbUNBQW1DO1FBQ25DLE9BQU8sSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDO1lBQ3ZDLE1BQU0sRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUM7U0FDakMsQ0FBQyxDQUFBO0lBQ0osQ0FBQztJQUVELDBFQUEwRTtJQUMxRSxhQUFhLENBQUMsRUFBQyxNQUFNLEVBQXFCO1FBQ3hDLHFEQUFxRDtRQUNyRCxNQUFNLEtBQUssR0FBRyw0QkFBNEIsRUFBRSxDQUFBO1FBQzVDLE1BQU0sT0FBTyxHQUFHLEtBQUssQ0FBQyxvQkFBb0IsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQTtRQUV0RCxPQUFPLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQzNDLElBQUksQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLFdBQVcsQ0FBRSxLQUFLLENBQUUsQ0FBQSxDQUFDLG9CQUFvQjtRQUVwRSxPQUFPLE9BQU8sQ0FBQTtJQUNoQixDQUFDO0lBRUQsZUFBZTtRQUNiLElBQUksR0FBRyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFBO1FBRXBDLElBQUksV0FBVyxDQUFDLEdBQUcsQ0FBQyxFQUFFO1lBQ3BCLE1BQU0sYUFBYSxHQUFHLEtBQUssQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQTtZQUN2RCxHQUFHLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxFQUFFLGFBQWEsQ0FBQyxDQUFBO1lBQzVDLEdBQUcsQ0FBQyxnQkFBZ0IsQ0FBQyxZQUFZLEVBQUUsYUFBYSxDQUFDLENBQUE7WUFDakQsT0FBTTtTQUNQO1FBRUQsTUFBTSxhQUFhLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLEVBQUUsQ0FBQyxDQUFBO1FBQ2pELEdBQUcsQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLEVBQUUsYUFBYSxDQUFDLENBQUE7UUFDNUMsR0FBRyxDQUFDLGdCQUFnQixDQUFDLFlBQVksRUFBRSxhQUFhLENBQUMsQ0FBQTtRQUNqRCxHQUFHLENBQUMsZ0JBQWdCLENBQUMsVUFBVSxFQUFFLGFBQWEsQ0FBQyxDQUFBO0lBQ2pELENBQUM7SUFFRCxhQUFhLENBQUUsS0FBWTtRQUN6QixNQUFNLEdBQUcsR0FBVSxFQUFFLENBQUE7UUFDckIsS0FBSSxJQUFJLENBQUMsR0FBQyxLQUFLLENBQUMsTUFBTSxHQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFDO1lBQ3BDLElBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRTtnQkFDOUIsR0FBRyxDQUFDLElBQUksQ0FBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUUsQ0FBQTthQUNyQjtTQUNGO1FBQ0QsT0FBTyxHQUFHLENBQUE7SUFDWixDQUFDO0lBRUQsZUFBZSxDQUFDLEtBQVk7UUFDMUIsTUFBTSxHQUFHLEdBQXFCLEVBQUUsQ0FBQTtRQUNoQyxLQUFJLElBQUksQ0FBQyxHQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUM7WUFDcEMsSUFBSSxVQUFVLEdBQUcsSUFBSSxDQUFDLHFCQUFxQixDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFBO1lBQ3JELElBQUksVUFBVSxFQUFFO2dCQUNkLEdBQUcsQ0FBQyxJQUFJLENBQUM7b0JBQ1AsSUFBSSxFQUFHLEtBQUssQ0FBQyxDQUFDLENBQUM7b0JBQ2YsSUFBSSxFQUFHLFVBQVU7aUJBQ2xCLENBQUMsQ0FBQTthQUNIO1NBQ0Y7UUFDRCxPQUFPLEdBQUcsQ0FBQTtJQUNaLENBQUM7SUFFRCxxQ0FBcUM7SUFDckMsV0FBVyxDQUFDLEtBQVk7UUFDdEIsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQTtRQUV4QyxJQUFHLEtBQUssQ0FBQyxNQUFNLElBQUUsTUFBTSxDQUFDLE1BQU0sRUFBQztZQUM3QixJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsS0FBSyxDQUFDLENBQUE7U0FDaEQ7YUFBSTtZQUNILE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQTtTQUN6QjtRQUVELElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFBO1FBRS9DLElBQUksTUFBTSxDQUFDLE1BQU0sRUFBRTtZQUNqQixJQUFJLElBQUksQ0FBQyxpQkFBaUIsRUFBRTtnQkFDMUIsSUFBSSxDQUFDLGtCQUFrQixDQUFDLE1BQU0sQ0FBQztxQkFDOUIsSUFBSSxDQUFFLFVBQVUsQ0FBQSxFQUFFLENBQUEsSUFBSSxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsQ0FBRSxDQUFBO2FBQzFDO2lCQUFJO2dCQUNILElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUE7YUFDakI7U0FDRjtRQUVELElBQUksSUFBSSxDQUFDLHFCQUFxQixFQUFFLEVBQUU7WUFDaEMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsS0FBSyxHQUFHLEVBQUUsQ0FBQTtTQUN0QztJQUNILENBQUM7SUFFRCxHQUFHLENBQUUsS0FBWTtRQUNmLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssSUFBSSxFQUFFLENBQUE7UUFDN0IsS0FBSyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUE7UUFFN0Msa0RBQWtEO1FBQ2xELG1IQUFtSDtRQUVuSCxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBRSxJQUFJLENBQUMsS0FBSyxDQUFFLENBQUE7UUFFbkMsSUFBRyxLQUFLLENBQUMsTUFBTSxFQUFDO1lBQ2QsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUUsSUFBSSxDQUFDLElBQUksR0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUUsQ0FBQTtZQUUxQyxJQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxTQUFTLENBQUMsTUFBTSxFQUFDO2dCQUN6QyxPQUFPLENBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFFO3FCQUNsQixJQUFJLENBQUUsR0FBRyxDQUFBLEVBQUUsQ0FBQSxJQUFJLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFFLENBQUE7YUFDL0M7U0FDRjtRQUVELDBDQUEwQztRQUMxQyxJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFBO0lBQ3hDLENBQUM7SUFFRCxrQ0FBa0M7SUFDbEMsUUFBUSxDQUFDLEtBQVM7UUFDaEIsSUFBSSxRQUFRLEdBQUcsS0FBSyxDQUFDLFFBQVEsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLElBQUksS0FBSyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQTtRQUVyRSxJQUFJLENBQUMsUUFBUTtZQUFFLE9BQU87UUFFdEIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN0QixJQUFJLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxDQUFBO0lBQzVCLENBQUM7SUFFRCxZQUFZLENBQUMsR0FBVTtRQUNyQixNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQTtRQUN0QyxJQUFJLEdBQUcsQ0FBQyxZQUFZLENBQUMsVUFBVSxDQUFDLElBQUksSUFBSSxDQUFDLGdCQUFnQixFQUFDO1lBQ3hELE9BQU8sS0FBSyxDQUFDO1NBQ2Q7UUFFRCxJQUFJLENBQUMsR0FBRyxXQUFXLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDekIscUNBQXFDO1FBQ3JDLElBQUssQ0FBQyxLQUFHLEtBQUs7WUFBRyxPQUFPLENBQUMsQ0FBQztRQUUxQixNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUE7UUFDbkMsT0FBTyxDQUFDLEtBQUssRUFBRSxDQUFBO1FBQ2YsOENBQThDO1FBQzlDLElBQUksQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLENBQUE7UUFFdEIsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0lBRUQsWUFBWSxDQUFDLEtBQVk7UUFDdkIsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUE7UUFFaEMsSUFBSSxJQUFJLENBQUMsS0FBSyxJQUFJLElBQUksQ0FBQyxhQUFhLEtBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNO1lBQUUsT0FBTTtRQUVoRSxxR0FBcUc7UUFDckcsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUE7SUFDMUIsQ0FBQztJQUVELGlCQUFpQjtRQUNmLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTztZQUFFLE9BQU07UUFFekIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFBO0lBQzNCLENBQUM7SUFFRCxxQkFBcUI7UUFDbkIsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQztJQUMxRCxDQUFDO0lBRUQsU0FBUyxDQUFDLEtBQVM7UUFDakIsS0FBSyxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBQ3ZCLEtBQUssQ0FBQyxlQUFlLEVBQUUsQ0FBQztJQUMxQixDQUFDO0lBRUQsZ0JBQWdCLENBQUMsUUFBWTtRQUMzQixJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssRUFBRTtZQUNuQixPQUFPLEtBQUssQ0FBQztTQUNkO1FBRUQsSUFBSSxRQUFRLENBQUMsS0FBSyxDQUFDLE9BQU8sRUFBRTtZQUMxQixPQUFPLFFBQVEsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1NBQy9DO2FBQU0sSUFBSSxRQUFRLENBQUMsS0FBSyxDQUFDLFFBQVEsRUFBRTtZQUNsQyxPQUFPLFFBQVEsQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1NBQ3pDO2FBQU07WUFDTCxPQUFPLEtBQUssQ0FBQztTQUNkO0lBQ0gsQ0FBQztJQUVELFlBQVksQ0FBQyxLQUFXO1FBQ3RCLE1BQU0sUUFBUSxHQUFHLGVBQWUsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN4QyxJQUFJLFFBQVEsRUFBRTtZQUNaLElBQUcsUUFBUSxDQUFDLEtBQUssSUFBSSxRQUFRLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBQztnQkFDekMsT0FBTyxRQUFRLENBQUMsS0FBSyxDQUFBO2FBQ3RCO1lBQ0QsSUFBRyxRQUFRLENBQUMsS0FBSyxJQUFJLFFBQVEsQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUFDO2dCQUN6QyxPQUFPLFFBQVEsQ0FBQyxLQUFLLENBQUE7YUFDdEI7U0FDRjtRQUNELE9BQU8sRUFBRSxDQUFBO0lBQ1gsQ0FBQztJQUVELGtCQUFrQixDQUNoQixLQUFZO1FBRVosTUFBTSxNQUFNLEdBQUcsQ0FDYixJQUFTLEVBQUMsS0FBWSxFQUNWLEVBQUU7WUFDZCxPQUFPLGlCQUFpQixDQUFDLElBQUksQ0FBQztpQkFDN0IsSUFBSSxDQUFFLFNBQVMsQ0FBQSxFQUFFLENBQUEsS0FBSyxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxDQUFFLENBQUE7UUFDdkQsQ0FBQyxDQUFBO1FBRUQsTUFBTSxLQUFLLEdBQWtCLEVBQUUsQ0FBQTtRQUMvQixLQUFJLElBQUksQ0FBQyxHQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUM7WUFDcEMsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFFLENBQUE7U0FDakM7UUFDRCxPQUFPLE9BQU8sQ0FBQyxHQUFHLENBQUUsS0FBSyxDQUFFLENBQUMsSUFBSSxDQUFFLEdBQUUsRUFBRSxDQUFBLEtBQUssQ0FBRSxDQUFBO0lBQy9DLENBQUM7SUFHRCxRQUFRLENBQUMsS0FBVztRQUNsQixJQUFJLEtBQUssR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxLQUFLLElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQTtRQUV4RSxJQUFHLENBQUMsS0FBSyxDQUFDLE1BQU07WUFBQyxPQUFNO1FBRXZCLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDdEIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQTtJQUN6QixDQUFDO0lBRUQscUJBQXFCLENBQ25CLElBQVM7UUFFVCxLQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUM7WUFDMUMsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLEVBQUU7Z0JBQ3hDLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUE7YUFDNUI7U0FDRjtRQUNELE9BQU8sU0FBUyxDQUFBO0lBQ2xCLENBQUM7SUFFRCxXQUFXLENBQUMsSUFBUztRQUNuQixNQUFNLFNBQVMsR0FBRyxDQUFDLElBQUksQ0FBQyxNQUFNLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFBO1FBQ3pFLElBQUksU0FBUyxFQUFFO1lBQ2IsT0FBTyxJQUFJLENBQUEsQ0FBQSwyQ0FBMkM7U0FDdkQ7UUFFRCxPQUFPLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUE7SUFDeEQsQ0FBQztJQUVELFlBQVksQ0FBQyxLQUFZO1FBQ3ZCLEtBQUksSUFBSSxDQUFDLEdBQUMsS0FBSyxDQUFDLE1BQU0sR0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBQztZQUNwQyxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRTtnQkFDL0IsT0FBTyxLQUFLLENBQUE7YUFDYjtTQUNGO1FBQ0QsT0FBTyxJQUFJLENBQUE7SUFDYixDQUFDO0lBRVMsYUFBYSxDQUFDLElBQVM7UUFDL0IsT0FBTyxVQUFVLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQTtJQUN0RCxDQUFDO0lBRVMsZUFBZSxDQUFDLElBQVM7UUFDakMsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sSUFBSSxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUNyRCxDQUFDOztnR0E1WFUsR0FBRztvRkFBSCxHQUFHOzJGQUFILEdBQUc7a0JBSmYsU0FBUzttQkFBQztvQkFDVCxRQUFRLEVBQUUsT0FBTztvQkFDakIsUUFBUSxFQUFDLEtBQUs7aUJBQ2Y7aUdBTVUsUUFBUTtzQkFBaEIsS0FBSztnQkFDRyxNQUFNO3NCQUFkLEtBQUs7Z0JBQ0csT0FBTztzQkFBZixLQUFLO2dCQUNHLGlCQUFpQjtzQkFBekIsS0FBSztnQkFFRyxnQkFBZ0I7c0JBQXhCLEtBQUs7Z0JBQ0csVUFBVTtzQkFBbEIsS0FBSztnQkFDVSxhQUFhO3NCQUE1QixNQUFNO3VCQUFDLE1BQU07Z0JBRUwsWUFBWTtzQkFBcEIsS0FBSztnQkFDSSxrQkFBa0I7c0JBQTNCLE1BQU07Z0JBRUUsV0FBVztzQkFBbkIsS0FBSztnQkFDSSxpQkFBaUI7c0JBQTFCLE1BQU07Z0JBRUUsSUFBSTtzQkFBWixLQUFLO2dCQUNJLFVBQVU7c0JBQW5CLE1BQU07Z0JBRUUsS0FBSztzQkFBYixLQUFLO2dCQUNJLFdBQVc7c0JBQXBCLE1BQU07Z0JBRUcsZUFBZTtzQkFBeEIsTUFBTTtnQkFFRSxZQUFZO3NCQUFwQixLQUFLO2dCQW9UTixRQUFRO3NCQURQLFlBQVk7dUJBQUMsUUFBUSxFQUFFLENBQUMsUUFBUSxDQUFDOztBQWlEcEMsa0ZBQWtGO0FBQ2xGLE1BQU0sVUFBVSxzQkFBc0IsQ0FBRSxLQUFZO0lBQ2xELE1BQU0sU0FBUyxHQUFjLEVBQUUsQ0FBQTtJQUMvQixLQUFJLElBQUksQ0FBQyxHQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsS0FBSyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsRUFBQztRQUNqQyxTQUFTLENBQUMsSUFBSSxDQUFDO1lBQ2IsSUFBSSxFQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJO1lBQ2xCLElBQUksRUFBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDO1NBQ3RCLENBQUMsQ0FBQTtLQUNIO0lBQ0QsT0FBTyxTQUFTLENBQUE7QUFDbEIsQ0FBQztBQUVELE1BQU0sVUFBVSxlQUFlLENBQUMsS0FBVTtJQUN4QyxJQUFHLEtBQUssQ0FBQyxZQUFZO1FBQUMsT0FBTyxLQUFLLENBQUMsWUFBWSxDQUFBO0lBQy9DLE9BQVEsS0FBSyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQTtBQUN2RSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRGlyZWN0aXZlLCBFdmVudEVtaXR0ZXIsIEVsZW1lbnRSZWYsIElucHV0LCBPdXRwdXQsIEhvc3RMaXN0ZW5lciwgU2ltcGxlQ2hhbmdlcyB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgY3JlYXRlSW52aXNpYmxlRmlsZUlucHV0V3JhcCwgaXNGaWxlSW5wdXQsIGRldGVjdFN3aXBlIH0gZnJvbSBcIi4vZG9jLWV2ZW50LWhlbHAuZnVuY3Rpb25zXCJcbmltcG9ydCB7XG4gIGFjY2VwdFR5cGUsIEludmFsaWRGaWxlSXRlbSxcbiAgYXBwbHlFeGlmUm90YXRpb24sIGRhdGFVcmxcbn0gZnJvbSBcIi4vZmlsZVRvb2xzXCJcblxuZXhwb3J0IGludGVyZmFjZSBkcmFnTWV0YXtcbiAgdHlwZTpzdHJpbmdcbiAga2luZDpzdHJpbmdcbn1cblxuLyoqIEEgbWFzdGVyIGJhc2Ugc2V0IG9mIGxvZ2ljIGludGVuZGVkIHRvIHN1cHBvcnQgZmlsZSBzZWxlY3QvZHJhZy9kcm9wIG9wZXJhdGlvbnNcbiBOT1RFOiBVc2UgbmdmRHJvcCBmb3IgZnVsbCBkcmFnL2Ryb3AuIFVzZSBuZ2ZTZWxlY3QgZm9yIHNlbGVjdGluZ1xuKi9cbkBEaXJlY3RpdmUoe1xuICBzZWxlY3RvcjogXCJbbmdmXVwiLFxuICBleHBvcnRBczpcIm5nZlwiXG59KVxuZXhwb3J0IGNsYXNzIG5nZiB7XG4gIGZpbGVFbG06IGFueVxuICBmaWx0ZXJzOiB7bmFtZTogc3RyaW5nLCBmbjogKGZpbGU6RmlsZSk9PmJvb2xlYW59W10gPSBbXVxuICBsYXN0RmlsZUNvdW50OiBudW1iZXIgPSAwXG5cbiAgQElucHV0KCkgbXVsdGlwbGUgITpzdHJpbmdcbiAgQElucHV0KCkgYWNjZXB0ICAgITpzdHJpbmdcbiAgQElucHV0KCkgbWF4U2l6ZSAgITpudW1iZXJcbiAgQElucHV0KCkgbmdmRml4T3JpZW50YXRpb246IGJvb2xlYW4gPSB0cnVlXG5cbiAgQElucHV0KCkgZmlsZURyb3BEaXNhYmxlZDogYm9vbGVhbiA9IGZhbHNlXG4gIEBJbnB1dCgpIHNlbGVjdGFibGU6IGJvb2xlYW4gfCBzdHJpbmcgPSBmYWxzZVxuICBAT3V0cHV0KCdpbml0JykgZGlyZWN0aXZlSW5pdDpFdmVudEVtaXR0ZXI8bmdmPiA9IG5ldyBFdmVudEVtaXR0ZXIoKVxuXG4gIEBJbnB1dCgpIGxhc3RJbnZhbGlkczpJbnZhbGlkRmlsZUl0ZW1bXSA9IFtdXG4gIEBPdXRwdXQoKSBsYXN0SW52YWxpZHNDaGFuZ2U6RXZlbnRFbWl0dGVyPHtmaWxlOkZpbGUsdHlwZTpzdHJpbmd9W10+ID0gbmV3IEV2ZW50RW1pdHRlcigpXG5cbiAgQElucHV0KCkgbGFzdEJhc2VVcmwhOiBzdHJpbmcvL2Jhc2U2NCBsYXN0IGZpbGUgdXBsb2FkZWQgdXJsXG4gIEBPdXRwdXQoKSBsYXN0QmFzZVVybENoYW5nZTpFdmVudEVtaXR0ZXI8c3RyaW5nPiA9IG5ldyBFdmVudEVtaXR0ZXIoKVxuXG4gIEBJbnB1dCgpIGZpbGU/OiBGaWxlLy9sYXN0IGZpbGUgdXBsb2FkZWRcbiAgQE91dHB1dCgpIGZpbGVDaGFuZ2U6IEV2ZW50RW1pdHRlcjxGaWxlPiA9IG5ldyBFdmVudEVtaXR0ZXIoKVxuXG4gIEBJbnB1dCgpIGZpbGVzOkZpbGVbXSA9IFtdXG4gIEBPdXRwdXQoKSBmaWxlc0NoYW5nZTpFdmVudEVtaXR0ZXI8RmlsZVtdPiA9IG5ldyBFdmVudEVtaXR0ZXI8RmlsZVtdPigpO1xuXG4gIEBPdXRwdXQoKSBmaWxlU2VsZWN0U3RhcnQ6RXZlbnRFbWl0dGVyPEV2ZW50PiA9IG5ldyBFdmVudEVtaXR0ZXIoKVxuXG4gIEBJbnB1dCgpIGNhcHR1cmVQYXN0ZTogYm9vbGVhbiAvLyB3aW5kb3cgcGFzdGUgZmlsZSB3YXRjaGluZyAoZW1wdHkgc3RyaW5nIHR1cm5zIG9uKVxuXG4gIHBhc3RlQ2FwdHVyZXIhOiAoZTogRXZlbnQpID0+IHZvaWQgLy8gZ29lcyB3aXRoIGNhcHR1cmVQYXN0ZVxuXG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBlbGVtZW50OkVsZW1lbnRSZWYpe1xuICAgIHRoaXMuaW5pdEZpbHRlcnMoKVxuICB9XG5cbiAgaW5pdEZpbHRlcnMoKXtcbiAgICAvLyB0aGUgb3JkZXIgaXMgaW1wb3J0YW50XG4gICAgdGhpcy5maWx0ZXJzLnB1c2goe25hbWU6ICdhY2NlcHQnLCBmbjogdGhpcy5fYWNjZXB0RmlsdGVyfSlcbiAgICB0aGlzLmZpbHRlcnMucHVzaCh7bmFtZTogJ2ZpbGVTaXplJywgZm46IHRoaXMuX2ZpbGVTaXplRmlsdGVyfSlcblxuICAgIC8vdGhpcy5maWx0ZXJzLnB1c2goe25hbWU6ICdmaWxlVHlwZScsIGZuOiB0aGlzLl9maWxlVHlwZUZpbHRlcn0pXG4gICAgLy90aGlzLmZpbHRlcnMucHVzaCh7bmFtZTogJ3F1ZXVlTGltaXQnLCBmbjogdGhpcy5fcXVldWVMaW1pdEZpbHRlcn0pXG4gICAgLy90aGlzLmZpbHRlcnMucHVzaCh7bmFtZTogJ21pbWVUeXBlJywgZm46IHRoaXMuX21pbWVUeXBlRmlsdGVyfSlcbiAgfVxuXG4gIG5nT25EZXN0cm95KCl7XG4gICAgZGVsZXRlIHRoaXMuZmlsZUVsbS8vZmFzdGVyIG1lbW9yeSByZWxlYXNlIG9mIGRvbSBlbGVtZW50XG4gICAgdGhpcy5kZXN0cm95UGFzdGVMaXN0ZW5lcigpO1xuICB9XG5cbiAgbmdPbkluaXQoKXtcbiAgICBjb25zdCBzZWxlY3RhYmxlID0gKHRoaXMuc2VsZWN0YWJsZSB8fCB0aGlzLnNlbGVjdGFibGU9PT0nJykgJiYgIVsnZmFsc2UnLCAnbnVsbCcsICcwJ10uaW5jbHVkZXModGhpcy5zZWxlY3RhYmxlIGFzIHN0cmluZyk7XG4gICAgaWYoIHNlbGVjdGFibGUgKXtcbiAgICAgIHRoaXMuZW5hYmxlU2VsZWN0aW5nKClcbiAgICB9XG5cbiAgICBpZiggdGhpcy5tdWx0aXBsZSApe1xuICAgICAgdGhpcy5wYXJhbUZpbGVFbG0oKS5zZXRBdHRyaWJ1dGUoJ211bHRpcGxlJywgdGhpcy5tdWx0aXBsZSlcbiAgICB9XG5cbiAgICB0aGlzLmV2YWxDYXB0dXJlUGFzdGUoKTtcblxuICAgIC8vIGNyZWF0ZSByZWZlcmVuY2UgdG8gdGhpcyBjbGFzcyB3aXRoIG9uZSBjeWNsZSBkZWxheSB0byBhdm9pZCBFeHByZXNzaW9uQ2hhbmdlZEFmdGVySXRIYXNCZWVuQ2hlY2tlZEVycm9yXG4gICAgc2V0VGltZW91dCgoKT0+e1xuICAgICAgdGhpcy5kaXJlY3RpdmVJbml0LmVtaXQodGhpcylcbiAgICB9LCAwKVxuICB9XG5cbiAgbmdPbkNoYW5nZXMoIGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMgKXtcbiAgICBpZiggY2hhbmdlcy5hY2NlcHQgKXtcbiAgICAgIHRoaXMucGFyYW1GaWxlRWxtKCkuc2V0QXR0cmlidXRlKCdhY2NlcHQnLCBjaGFuZ2VzLmFjY2VwdC5jdXJyZW50VmFsdWUgfHwgJyonKVxuICAgIH1cblxuICAgIGlmIChjaGFuZ2VzLmNhcHR1cmVQYXN0ZSkge1xuICAgICAgdGhpcy5ldmFsQ2FwdHVyZVBhc3RlKCk7XG4gICAgfVxuXG4gICAgLy8gRGlkIHdlIGdvIGZyb20gaGF2aW5nIGEgZmlsZSB0byBub3QgaGF2aW5nIGEgZmlsZT8gQ2xlYXIgZmlsZSBlbGVtZW50IHRoZW5cbiAgICBpZiAoY2hhbmdlcy5maWxlICYmIGNoYW5nZXMuZmlsZS5wcmV2aW91c1ZhbHVlICYmICFjaGFuZ2VzLmZpbGUuY3VycmVudFZhbHVlKSB7XG4gICAgICB0aGlzLmNsZWFyRmlsZUVsbVZhbHVlKClcbiAgICB9XG5cbiAgICAvLyBEaWQgd2UgZ28gZnJvbSBoYXZpbmcgZmlsZXMgdG8gbm90IGhhdmluZyBmaWxlcz8gQ2xlYXIgZmlsZSBlbGVtZW50IHRoZW5cbiAgICBpZiAoY2hhbmdlcy5maWxlcykge1xuICAgICAgY29uc3QgZmlsZXNXZW50VG9aZXJvID0gY2hhbmdlcy5maWxlcy5wcmV2aW91c1ZhbHVlPy5sZW5ndGggJiYgIWNoYW5nZXMuZmlsZXMuY3VycmVudFZhbHVlPy5sZW5ndGhcblxuICAgICAgaWYgKGZpbGVzV2VudFRvWmVybykge1xuICAgICAgICB0aGlzLmNsZWFyRmlsZUVsbVZhbHVlKClcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBldmFsQ2FwdHVyZVBhc3RlKCkge1xuICAgIGNvbnN0IGlzQWN0aXZlID0gdGhpcy5jYXB0dXJlUGFzdGUgfHwgKHRoaXMuY2FwdHVyZVBhc3RlIGFzIGFueSk9PT0nJyB8fCBbJ2ZhbHNlJywgJzAnLCAnbnVsbCddLmluY2x1ZGVzKHRoaXMuY2FwdHVyZVBhc3RlIGFzIGFueSk7XG5cbiAgICBpZiAoaXNBY3RpdmUpIHtcbiAgICAgIGlmICh0aGlzLnBhc3RlQ2FwdHVyZXIpIHtcbiAgICAgICAgcmV0dXJuOyAvLyBhbHJlYWR5IGxpc3RlbmluZ1xuICAgICAgfVxuXG4gICAgICB0aGlzLnBhc3RlQ2FwdHVyZXIgPSAoZTogRXZlbnQpID0+IHtcbiAgICAgICAgY29uc3QgY2xpcCA9IChlIGFzIGFueSkuY2xpcGJvYXJkRGF0YTtcbiAgICAgICAgaWYgKGNsaXAgJiYgY2xpcC5maWxlcyAmJiBjbGlwLmZpbGVzLmxlbmd0aCkge1xuICAgICAgICAgIHRoaXMuaGFuZGxlRmlsZXMoY2xpcC5maWxlcyk7XG4gICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdwYXN0ZScsIHRoaXMucGFzdGVDYXB0dXJlcik7XG5cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmRlc3Ryb3lQYXN0ZUxpc3RlbmVyKCk7XG4gIH1cblxuICBkZXN0cm95UGFzdGVMaXN0ZW5lcigpIHtcbiAgICBpZiAodGhpcy5wYXN0ZUNhcHR1cmVyKSB7XG4gICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigncGFzdGUnLCB0aGlzLnBhc3RlQ2FwdHVyZXIpO1xuICAgICAgZGVsZXRlIHRoaXMucGFzdGVDYXB0dXJlcjtcbiAgICB9XG4gIH1cblxuICBwYXJhbUZpbGVFbG0oKXtcbiAgICBpZiggdGhpcy5maWxlRWxtIClyZXR1cm4gdGhpcy5maWxlRWxtIC8vIGFscmVhZHkgZGVmaW5lZFxuXG4gICAgLy8gZWxtIGFscmVhZHkgaXMgYSBmaWxlIGlucHV0XG4gICAgY29uc3QgaXNGaWxlID0gaXNGaWxlSW5wdXQoIHRoaXMuZWxlbWVudC5uYXRpdmVFbGVtZW50IClcbiAgICBpZihpc0ZpbGUpe1xuICAgICAgcmV0dXJuIHRoaXMuZmlsZUVsbSA9IHRoaXMuZWxlbWVudC5uYXRpdmVFbGVtZW50XG4gICAgfVxuXG4gICAgLy8gdGhlIGhvc3QgZWxtIGlzIE5PVCBhIGZpbGUgaW5wdXRcbiAgICByZXR1cm4gdGhpcy5maWxlRWxtID0gdGhpcy5jcmVhdGVGaWxlRWxtKHtcbiAgICAgIGNoYW5nZTogdGhpcy5jaGFuZ2VGbi5iaW5kKHRoaXMpXG4gICAgfSlcbiAgfVxuXG4gIC8qKiBPbmx5IHVzZWQgd2hlbiBob3N0IGVsZW1lbnQgd2UgYXJlIGF0dGFjaGVkIHRvIGlzIE5PVCBhIGZpbGVFbGVtZW50ICovXG4gIGNyZWF0ZUZpbGVFbG0oe2NoYW5nZX06IHtjaGFuZ2U6KCkgPT4gYW55fSkge1xuICAgIC8vIHVzZSBzcGVjaWZpYyB0ZWNobmlxdWUgdG8gaGlkZSBmaWxlIGVsZW1lbnQgd2l0aGluXG4gICAgY29uc3QgbGFiZWwgPSBjcmVhdGVJbnZpc2libGVGaWxlSW5wdXRXcmFwKClcbiAgICBjb25zdCBmaWxlRWxtID0gbGFiZWwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2lucHV0JylbMF1cblxuICAgIGZpbGVFbG0uYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgY2hhbmdlKTtcbiAgICB0aGlzLmVsZW1lbnQubmF0aXZlRWxlbWVudC5hcHBlbmRDaGlsZCggbGFiZWwgKSAvLyBwdXQgb24gaHRtbCBzdGFnZVxuXG4gICAgcmV0dXJuIGZpbGVFbG1cbiAgfVxuXG4gIGVuYWJsZVNlbGVjdGluZygpe1xuICAgIGxldCBlbG0gPSB0aGlzLmVsZW1lbnQubmF0aXZlRWxlbWVudFxuXG4gICAgaWYoIGlzRmlsZUlucHV0KGVsbSkgKXtcbiAgICAgIGNvbnN0IGJpbmRlZEhhbmRsZXIgPSBldmVudCA9PiB0aGlzLmJlZm9yZVNlbGVjdChldmVudClcbiAgICAgIGVsbS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGJpbmRlZEhhbmRsZXIpXG4gICAgICBlbG0uYWRkRXZlbnRMaXN0ZW5lcigndG91Y2hzdGFydCcsIGJpbmRlZEhhbmRsZXIpXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCBiaW5kZWRIYW5kbGVyID0gZXYgPT4gdGhpcy5jbGlja0hhbmRsZXIoZXYpXG4gICAgZWxtLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgYmluZGVkSGFuZGxlcilcbiAgICBlbG0uYWRkRXZlbnRMaXN0ZW5lcigndG91Y2hzdGFydCcsIGJpbmRlZEhhbmRsZXIpXG4gICAgZWxtLmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNoZW5kJywgYmluZGVkSGFuZGxlcilcbiAgfVxuXG4gIGdldFZhbGlkRmlsZXMoIGZpbGVzOkZpbGVbXSApOkZpbGVbXXtcbiAgICBjb25zdCBydG46RmlsZVtdID0gW11cbiAgICBmb3IobGV0IHg9ZmlsZXMubGVuZ3RoLTE7IHggPj0gMDsgLS14KXtcbiAgICAgIGlmKCB0aGlzLmlzRmlsZVZhbGlkKGZpbGVzW3hdKSApe1xuICAgICAgICBydG4ucHVzaCggZmlsZXNbeF0gKVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcnRuXG4gIH1cblxuICBnZXRJbnZhbGlkRmlsZXMoZmlsZXM6RmlsZVtdKTpJbnZhbGlkRmlsZUl0ZW1bXXtcbiAgICBjb25zdCBydG46SW52YWxpZEZpbGVJdGVtW10gPSBbXVxuICAgIGZvcihsZXQgeD1maWxlcy5sZW5ndGgtMTsgeCA+PSAwOyAtLXgpe1xuICAgICAgbGV0IGZhaWxSZWFzb24gPSB0aGlzLmdldEZpbGVGaWx0ZXJGYWlsTmFtZShmaWxlc1t4XSlcbiAgICAgIGlmKCBmYWlsUmVhc29uICl7XG4gICAgICAgIHJ0bi5wdXNoKHtcbiAgICAgICAgICBmaWxlIDogZmlsZXNbeF0sXG4gICAgICAgICAgdHlwZSA6IGZhaWxSZWFzb25cbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJ0blxuICB9XG5cbiAgLy8gUHJpbWFyeSBoYW5kbGVyIG9mIGZpbGVzIGNvbWluZyBpblxuICBoYW5kbGVGaWxlcyhmaWxlczpGaWxlW10pe1xuICAgIGNvbnN0IHZhbGlkcyA9IHRoaXMuZ2V0VmFsaWRGaWxlcyhmaWxlcylcblxuICAgIGlmKGZpbGVzLmxlbmd0aCE9dmFsaWRzLmxlbmd0aCl7XG4gICAgICB0aGlzLmxhc3RJbnZhbGlkcyA9IHRoaXMuZ2V0SW52YWxpZEZpbGVzKGZpbGVzKVxuICAgIH1lbHNle1xuICAgICAgZGVsZXRlIHRoaXMubGFzdEludmFsaWRzXG4gICAgfVxuXG4gICAgdGhpcy5sYXN0SW52YWxpZHNDaGFuZ2UuZW1pdCh0aGlzLmxhc3RJbnZhbGlkcylcblxuICAgIGlmKCB2YWxpZHMubGVuZ3RoICl7XG4gICAgICBpZiggdGhpcy5uZ2ZGaXhPcmllbnRhdGlvbiApe1xuICAgICAgICB0aGlzLmFwcGx5RXhpZlJvdGF0aW9ucyh2YWxpZHMpXG4gICAgICAgIC50aGVuKCBmaXhlZEZpbGVzPT50aGlzLnF1ZShmaXhlZEZpbGVzKSApXG4gICAgICB9ZWxzZXtcbiAgICAgICAgdGhpcy5xdWUodmFsaWRzKVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0aGlzLmlzRW1wdHlBZnRlclNlbGVjdGlvbigpKSB7XG4gICAgICB0aGlzLmVsZW1lbnQubmF0aXZlRWxlbWVudC52YWx1ZSA9ICcnXG4gICAgfVxuICB9XG5cbiAgcXVlKCBmaWxlczpGaWxlW10gKXtcbiAgICB0aGlzLmZpbGVzID0gdGhpcy5maWxlcyB8fCBbXVxuICAgIEFycmF5LnByb3RvdHlwZS5wdXNoLmFwcGx5KHRoaXMuZmlsZXMsIGZpbGVzKVxuXG4gICAgLy9iZWxvdyBicmVhayBtZW1vcnkgcmVmIGFuZCBkb2VzbnQgYWN0IGxpa2UgYSBxdWVcbiAgICAvL3RoaXMuZmlsZXMgPSBmaWxlcy8vY2F1c2VzIG1lbW9yeSBjaGFuZ2Ugd2hpY2ggdHJpZ2dlcnMgYmluZGluZ3MgbGlrZSA8bmdmRm9ybURhdGEgW2ZpbGVzXT1cImZpbGVzXCI+PC9uZ2ZGb3JtRGF0YT5cblxuICAgIHRoaXMuZmlsZXNDaGFuZ2UuZW1pdCggdGhpcy5maWxlcyApXG5cbiAgICBpZihmaWxlcy5sZW5ndGgpe1xuICAgICAgdGhpcy5maWxlQ2hhbmdlLmVtaXQoIHRoaXMuZmlsZT1maWxlc1swXSApXG5cbiAgICAgIGlmKHRoaXMubGFzdEJhc2VVcmxDaGFuZ2Uub2JzZXJ2ZXJzLmxlbmd0aCl7XG4gICAgICAgIGRhdGFVcmwoIGZpbGVzWzBdIClcbiAgICAgICAgLnRoZW4oIHVybD0+dGhpcy5sYXN0QmFzZVVybENoYW5nZS5lbWl0KHVybCkgKVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vd2lsbCBiZSBjaGVja2VkIGZvciBpbnB1dCB2YWx1ZSBjbGVhcmluZ1xuICAgIHRoaXMubGFzdEZpbGVDb3VudCA9IHRoaXMuZmlsZXMubGVuZ3RoXG4gIH1cblxuICAvKiogY2FsbGVkIHdoZW4gaW5wdXQgaGFzIGZpbGVzICovXG4gIGNoYW5nZUZuKGV2ZW50OmFueSkge1xuICAgIHZhciBmaWxlTGlzdCA9IGV2ZW50Ll9fZmlsZXNfIHx8IChldmVudC50YXJnZXQgJiYgZXZlbnQudGFyZ2V0LmZpbGVzKVxuXG4gICAgaWYgKCFmaWxlTGlzdCkgcmV0dXJuO1xuXG4gICAgdGhpcy5zdG9wRXZlbnQoZXZlbnQpO1xuICAgIHRoaXMuaGFuZGxlRmlsZXMoZmlsZUxpc3QpXG4gIH1cblxuICBjbGlja0hhbmRsZXIoZXZ0OiBFdmVudCl7XG4gICAgY29uc3QgZWxtID0gdGhpcy5lbGVtZW50Lm5hdGl2ZUVsZW1lbnRcbiAgICBpZiAoZWxtLmdldEF0dHJpYnV0ZSgnZGlzYWJsZWQnKSB8fCB0aGlzLmZpbGVEcm9wRGlzYWJsZWQpe1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHZhciByID0gZGV0ZWN0U3dpcGUoZXZ0KTtcbiAgICAvLyBwcmV2ZW50IHRoZSBjbGljayBpZiBpdCBpcyBhIHN3aXBlXG4gICAgaWYgKCByIT09ZmFsc2UgKSByZXR1cm4gcjtcblxuICAgIGNvbnN0IGZpbGVFbG0gPSB0aGlzLnBhcmFtRmlsZUVsbSgpXG4gICAgZmlsZUVsbS5jbGljaygpXG4gICAgLy9maWxlRWxtLmRpc3BhdGNoRXZlbnQoIG5ldyBFdmVudCgnY2xpY2snKSApO1xuICAgIHRoaXMuYmVmb3JlU2VsZWN0KGV2dClcblxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGJlZm9yZVNlbGVjdChldmVudDogRXZlbnQpe1xuICAgIHRoaXMuZmlsZVNlbGVjdFN0YXJ0LmVtaXQoZXZlbnQpXG5cbiAgICBpZiggdGhpcy5maWxlcyAmJiB0aGlzLmxhc3RGaWxlQ291bnQ9PT10aGlzLmZpbGVzLmxlbmd0aCApcmV0dXJuXG5cbiAgICAvLyBpZiBubyBmaWxlcyBpbiBhcnJheSwgYmUgc3VyZSBicm93c2VyIGRvZXMgbm90IHByZXZlbnQgcmVzZWxlY3Qgb2Ygc2FtZSBmaWxlIChzZWUgZ2l0aHViIGlzc3VlIDI3KVxuICAgIHRoaXMuY2xlYXJGaWxlRWxtVmFsdWUoKVxuICB9XG5cbiAgY2xlYXJGaWxlRWxtVmFsdWUoKSB7XG4gICAgaWYgKCF0aGlzLmZpbGVFbG0pIHJldHVyblxuXG4gICAgdGhpcy5maWxlRWxtLnZhbHVlID0gbnVsbFxuICB9XG5cbiAgaXNFbXB0eUFmdGVyU2VsZWN0aW9uKCk6Ym9vbGVhbiB7XG4gICAgcmV0dXJuICEhdGhpcy5lbGVtZW50Lm5hdGl2ZUVsZW1lbnQuYXR0cmlidXRlcy5tdWx0aXBsZTtcbiAgfVxuXG4gIHN0b3BFdmVudChldmVudDphbnkpOmFueSB7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgfVxuXG4gIHRyYW5zZmVySGFzRmlsZXModHJhbnNmZXI6YW55KTphbnkge1xuICAgIGlmICghdHJhbnNmZXIudHlwZXMpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBpZiAodHJhbnNmZXIudHlwZXMuaW5kZXhPZikge1xuICAgICAgcmV0dXJuIHRyYW5zZmVyLnR5cGVzLmluZGV4T2YoJ0ZpbGVzJykgIT09IC0xO1xuICAgIH0gZWxzZSBpZiAodHJhbnNmZXIudHlwZXMuY29udGFpbnMpIHtcbiAgICAgIHJldHVybiB0cmFuc2Zlci50eXBlcy5jb250YWlucygnRmlsZXMnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIGV2ZW50VG9GaWxlcyhldmVudDpFdmVudCl7XG4gICAgY29uc3QgdHJhbnNmZXIgPSBldmVudFRvVHJhbnNmZXIoZXZlbnQpO1xuICAgIGlmKCB0cmFuc2ZlciApe1xuICAgICAgaWYodHJhbnNmZXIuZmlsZXMgJiYgdHJhbnNmZXIuZmlsZXMubGVuZ3RoKXtcbiAgICAgICAgcmV0dXJuIHRyYW5zZmVyLmZpbGVzXG4gICAgICB9XG4gICAgICBpZih0cmFuc2Zlci5pdGVtcyAmJiB0cmFuc2Zlci5pdGVtcy5sZW5ndGgpe1xuICAgICAgICByZXR1cm4gdHJhbnNmZXIuaXRlbXNcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIFtdXG4gIH1cblxuICBhcHBseUV4aWZSb3RhdGlvbnMoXG4gICAgZmlsZXM6RmlsZVtdXG4gICk6UHJvbWlzZTxGaWxlW10+e1xuICAgIGNvbnN0IG1hcHBlciA9IChcbiAgICAgIGZpbGU6RmlsZSxpbmRleDpudW1iZXJcbiAgICApOlByb21pc2U8YW55Pj0+e1xuICAgICAgcmV0dXJuIGFwcGx5RXhpZlJvdGF0aW9uKGZpbGUpXG4gICAgICAudGhlbiggZml4ZWRGaWxlPT5maWxlcy5zcGxpY2UoaW5kZXgsIDEsIGZpeGVkRmlsZSkgKVxuICAgIH1cblxuICAgIGNvbnN0IHByb21zOlByb21pc2U8YW55PltdID0gW11cbiAgICBmb3IobGV0IHg9ZmlsZXMubGVuZ3RoLTE7IHggPj0gMDsgLS14KXtcbiAgICAgIHByb21zW3hdID0gbWFwcGVyKCBmaWxlc1t4XSwgeCApXG4gICAgfVxuICAgIHJldHVybiBQcm9taXNlLmFsbCggcHJvbXMgKS50aGVuKCAoKT0+ZmlsZXMgKVxuICB9XG5cbiAgQEhvc3RMaXN0ZW5lcignY2hhbmdlJywgWyckZXZlbnQnXSlcbiAgb25DaGFuZ2UoZXZlbnQ6RXZlbnQpOnZvaWQge1xuICAgIGxldCBmaWxlcyA9IHRoaXMuZWxlbWVudC5uYXRpdmVFbGVtZW50LmZpbGVzIHx8IHRoaXMuZXZlbnRUb0ZpbGVzKGV2ZW50KVxuXG4gICAgaWYoIWZpbGVzLmxlbmd0aClyZXR1cm5cblxuICAgIHRoaXMuc3RvcEV2ZW50KGV2ZW50KTtcbiAgICB0aGlzLmhhbmRsZUZpbGVzKGZpbGVzKVxuICB9XG5cbiAgZ2V0RmlsZUZpbHRlckZhaWxOYW1lKFxuICAgIGZpbGU6RmlsZVxuICApOnN0cmluZyB8IHVuZGVmaW5lZHtcbiAgICBmb3IobGV0IGkgPSAwOyBpIDwgdGhpcy5maWx0ZXJzLmxlbmd0aDsgaSsrKXtcbiAgICAgIGlmKCAhdGhpcy5maWx0ZXJzW2ldLmZuLmNhbGwodGhpcywgZmlsZSkgKXtcbiAgICAgICAgcmV0dXJuIHRoaXMuZmlsdGVyc1tpXS5uYW1lXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB1bmRlZmluZWRcbiAgfVxuXG4gIGlzRmlsZVZhbGlkKGZpbGU6RmlsZSk6Ym9vbGVhbntcbiAgICBjb25zdCBub0ZpbHRlcnMgPSAhdGhpcy5hY2NlcHQgJiYgKCF0aGlzLmZpbHRlcnMgfHwgIXRoaXMuZmlsdGVycy5sZW5ndGgpXG4gICAgaWYoIG5vRmlsdGVycyApe1xuICAgICAgcmV0dXJuIHRydWUvL3dlIGhhdmUgbm8gZmlsdGVycyBzbyBhbGwgZmlsZXMgYXJlIHZhbGlkXG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuZ2V0RmlsZUZpbHRlckZhaWxOYW1lKGZpbGUpID8gZmFsc2UgOiB0cnVlXG4gIH1cblxuICBpc0ZpbGVzVmFsaWQoZmlsZXM6RmlsZVtdKXtcbiAgICBmb3IobGV0IHg9ZmlsZXMubGVuZ3RoLTE7IHggPj0gMDsgLS14KXtcbiAgICAgIGlmKCAhdGhpcy5pc0ZpbGVWYWxpZChmaWxlc1t4XSkgKXtcbiAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0cnVlXG4gIH1cblxuICBwcm90ZWN0ZWQgX2FjY2VwdEZpbHRlcihpdGVtOkZpbGUpOmJvb2xlYW4ge1xuICAgIHJldHVybiBhY2NlcHRUeXBlKHRoaXMuYWNjZXB0LCBpdGVtLnR5cGUsIGl0ZW0ubmFtZSlcbiAgfVxuXG4gIHByb3RlY3RlZCBfZmlsZVNpemVGaWx0ZXIoaXRlbTpGaWxlKTpib29sZWFuIHtcbiAgICByZXR1cm4gISh0aGlzLm1heFNpemUgJiYgaXRlbS5zaXplID4gdGhpcy5tYXhTaXplKTtcbiAgfVxufVxuXG5cbi8qKiBicm93c2VycyB0cnkgaGFyZCB0byBjb25jZWFsIGRhdGEgYWJvdXQgZmlsZSBkcmFncywgdGhpcyB0ZW5kcyB0byB1bmRvIHRoYXQgKi9cbmV4cG9ydCBmdW5jdGlvbiBmaWxlc1RvV3JpdGVhYmxlT2JqZWN0KCBmaWxlczpGaWxlW10gKTpkcmFnTWV0YVtde1xuICBjb25zdCBqc29uRmlsZXM6ZHJhZ01ldGFbXSA9IFtdXG4gIGZvcihsZXQgeD0wOyB4IDwgZmlsZXMubGVuZ3RoOyArK3gpe1xuICAgIGpzb25GaWxlcy5wdXNoKHtcbiAgICAgIHR5cGU6ZmlsZXNbeF0udHlwZSxcbiAgICAgIGtpbmQ6ZmlsZXNbeF1bXCJraW5kXCJdXG4gICAgfSlcbiAgfVxuICByZXR1cm4ganNvbkZpbGVzXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBldmVudFRvVHJhbnNmZXIoZXZlbnQ6IGFueSk6IFRyYW5zZmVyT2JqZWN0IHtcbiAgaWYoZXZlbnQuZGF0YVRyYW5zZmVyKXJldHVybiBldmVudC5kYXRhVHJhbnNmZXJcbiAgcmV0dXJuICBldmVudC5vcmlnaW5hbEV2ZW50ID8gZXZlbnQub3JpZ2luYWxFdmVudC5kYXRhVHJhbnNmZXIgOiBudWxsXG59XG5cblxuaW50ZXJmYWNlIFRyYW5zZmVyT2JqZWN0IHtcbiAgaXRlbXM/OiBhbnlbXVxuICBmaWxlcz86IGFueVtdXG4gIGRyb3BFZmZlY3Q/OiAnY29weScgLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0RhdGFUcmFuc2Zlci9kcm9wRWZmZWN0XG59XG4iXX0= -------------------------------------------------------------------------------- /esm2020/file-upload/ngf.module.mjs: -------------------------------------------------------------------------------- 1 | import { CommonModule } from '@angular/common'; 2 | import { NgModule } from '@angular/core'; 3 | import { ngfBackground } from './ngfBackground.directive'; 4 | import { ngfDrop } from './ngfDrop.directive'; 5 | import { ngf } from './ngf.directive'; 6 | import { ngfSelect } from './ngfSelect.directive'; 7 | import { ngfUploadStatus } from './ngfUploadStatus.directive'; 8 | import { ngfFormData } from './ngfFormData.directive'; 9 | import { ngfSrc } from './ngfSrc.directive'; 10 | import * as i0 from "@angular/core"; 11 | //import{ HttpModule } from '@angular/http'; 12 | const declarations = [ 13 | ngfDrop, 14 | ngfSelect, 15 | ngfBackground, 16 | ngfSrc, 17 | ngfUploadStatus, 18 | ngfFormData, 19 | ngf 20 | ]; 21 | export class ngfModule { 22 | } 23 | ngfModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: ngfModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); 24 | ngfModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "14.3.0", ngImport: i0, type: ngfModule, declarations: [ngfDrop, 25 | ngfSelect, 26 | ngfBackground, 27 | ngfSrc, 28 | ngfUploadStatus, 29 | ngfFormData, 30 | ngf], imports: [CommonModule 31 | //,HttpModule 32 | ], exports: [ngfDrop, 33 | ngfSelect, 34 | ngfBackground, 35 | ngfSrc, 36 | ngfUploadStatus, 37 | ngfFormData, 38 | ngf] }); 39 | ngfModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: ngfModule, imports: [CommonModule 40 | //,HttpModule 41 | ] }); 42 | i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: ngfModule, decorators: [{ 43 | type: NgModule, 44 | args: [{ 45 | imports: [ 46 | CommonModule 47 | //,HttpModule 48 | ], 49 | declarations: declarations, 50 | exports: declarations //[HttpModule, ...declarations] 51 | }] 52 | }] }); 53 | //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmdmLm1vZHVsZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9maWxlLXVwbG9hZC9uZ2YubW9kdWxlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRXpDLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUMxRCxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDOUMsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3RDLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUNsRCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDOUQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ3RELE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQzs7QUFDNUMsNENBQTRDO0FBRTVDLE1BQU0sWUFBWSxHQUFHO0lBQ25CLE9BQU87SUFDUCxTQUFTO0lBQ1QsYUFBYTtJQUNiLE1BQU07SUFDTixlQUFlO0lBQ2YsV0FBVztJQUNYLEdBQUc7Q0FDSixDQUFBO0FBU0UsTUFBTSxPQUFPLFNBQVM7O3NHQUFULFNBQVM7dUdBQVQsU0FBUyxpQkFoQnZCLE9BQU87UUFDUCxTQUFTO1FBQ1QsYUFBYTtRQUNiLE1BQU07UUFDTixlQUFlO1FBQ2YsV0FBVztRQUNYLEdBQUcsYUFLRCxZQUFZO1FBQ1osYUFBYTtpQkFaZixPQUFPO1FBQ1AsU0FBUztRQUNULGFBQWE7UUFDYixNQUFNO1FBQ04sZUFBZTtRQUNmLFdBQVc7UUFDWCxHQUFHO3VHQVVXLFNBQVMsWUFMckIsWUFBWTtRQUNaLGFBQWE7OzJGQUlELFNBQVM7a0JBUHhCLFFBQVE7bUJBQUM7b0JBQ1IsT0FBTyxFQUFFO3dCQUNQLFlBQVk7d0JBQ1osYUFBYTtxQkFDZDtvQkFDRCxZQUFZLEVBQUUsWUFBWTtvQkFDMUIsT0FBTyxFQUFFLFlBQVksQ0FBQSwrQkFBK0I7aUJBQ3JEIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IE5nTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCB7IG5nZkJhY2tncm91bmQgfSBmcm9tICcuL25nZkJhY2tncm91bmQuZGlyZWN0aXZlJztcbmltcG9ydCB7IG5nZkRyb3AgfSBmcm9tICcuL25nZkRyb3AuZGlyZWN0aXZlJztcbmltcG9ydCB7IG5nZiB9IGZyb20gJy4vbmdmLmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBuZ2ZTZWxlY3QgfSBmcm9tICcuL25nZlNlbGVjdC5kaXJlY3RpdmUnO1xuaW1wb3J0IHsgbmdmVXBsb2FkU3RhdHVzIH0gZnJvbSAnLi9uZ2ZVcGxvYWRTdGF0dXMuZGlyZWN0aXZlJztcbmltcG9ydCB7IG5nZkZvcm1EYXRhIH0gZnJvbSAnLi9uZ2ZGb3JtRGF0YS5kaXJlY3RpdmUnO1xuaW1wb3J0IHsgbmdmU3JjIH0gZnJvbSAnLi9uZ2ZTcmMuZGlyZWN0aXZlJztcbi8vaW1wb3J0eyBIdHRwTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvaHR0cCc7XG5cbmNvbnN0IGRlY2xhcmF0aW9ucyA9IFtcbiAgbmdmRHJvcCxcbiAgbmdmU2VsZWN0LFxuICBuZ2ZCYWNrZ3JvdW5kLFxuICBuZ2ZTcmMsXG4gIG5nZlVwbG9hZFN0YXR1cyxcbiAgbmdmRm9ybURhdGEsXG4gIG5nZlxuXVxuXG5ATmdNb2R1bGUoe1xuICBpbXBvcnRzOiBbXG4gICAgQ29tbW9uTW9kdWxlXG4gICAgLy8sSHR0cE1vZHVsZVxuICBdLFxuICBkZWNsYXJhdGlvbnM6IGRlY2xhcmF0aW9ucyxcbiAgZXhwb3J0czogZGVjbGFyYXRpb25zLy9bSHR0cE1vZHVsZSwgLi4uZGVjbGFyYXRpb25zXVxufSkgZXhwb3J0IGNsYXNzIG5nZk1vZHVsZSB7fSJdfQ== -------------------------------------------------------------------------------- /esm2020/file-upload/ngfBackground.directive.mjs: -------------------------------------------------------------------------------- 1 | import { Directive, Input } from '@angular/core'; 2 | import { dataUrl } from './fileTools'; 3 | import * as i0 from "@angular/core"; 4 | export class ngfBackground { 5 | constructor(ElementRef) { 6 | this.ElementRef = ElementRef; 7 | } 8 | ngOnChanges(_changes) { 9 | dataUrl(this.file) 10 | .then(src => { 11 | const urlString = 'url(\'' + (src || '') + '\')'; 12 | this.ElementRef.nativeElement.style.backgroundImage = urlString; 13 | }); 14 | } 15 | } 16 | ngfBackground.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: ngfBackground, deps: [{ token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Directive }); 17 | ngfBackground.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "14.3.0", type: ngfBackground, selector: "[ngfBackground]", inputs: { file: ["ngfBackground", "file"] }, usesOnChanges: true, ngImport: i0 }); 18 | i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: ngfBackground, decorators: [{ 19 | type: Directive, 20 | args: [{ selector: '[ngfBackground]' }] 21 | }], ctorParameters: function () { return [{ type: i0.ElementRef }]; }, propDecorators: { file: [{ 22 | type: Input, 23 | args: ['ngfBackground'] 24 | }] } }); 25 | //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmdmQmFja2dyb3VuZC5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvZmlsZS11cGxvYWQvbmdmQmFja2dyb3VuZC5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBYyxLQUFLLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDN0QsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLGFBQWEsQ0FBQzs7QUFHdEMsTUFBTSxPQUFPLGFBQWE7SUFHeEIsWUFBbUIsVUFBcUI7UUFBckIsZUFBVSxHQUFWLFVBQVUsQ0FBVztJQUFFLENBQUM7SUFFM0MsV0FBVyxDQUFFLFFBQVk7UUFDdkIsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUM7YUFDakIsSUFBSSxDQUFDLEdBQUcsQ0FBQSxFQUFFO1lBQ1QsTUFBTSxTQUFTLEdBQUcsUUFBUSxHQUFHLENBQUMsR0FBRyxJQUFJLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQTtZQUNoRCxJQUFJLENBQUMsVUFBVSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsZUFBZSxHQUFHLFNBQVMsQ0FBQTtRQUNqRSxDQUFDLENBQUMsQ0FBQTtJQUNKLENBQUM7OzBHQVhVLGFBQWE7OEZBQWIsYUFBYTsyRkFBYixhQUFhO2tCQUR6QixTQUFTO21CQUFDLEVBQUMsUUFBUSxFQUFFLGlCQUFpQixFQUFDO2lHQUVkLElBQUk7c0JBQTNCLEtBQUs7dUJBQUMsZUFBZSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IERpcmVjdGl2ZSwgRWxlbWVudFJlZiwgSW5wdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IGRhdGFVcmwgfSBmcm9tICcuL2ZpbGVUb29scyc7XG5cbkBEaXJlY3RpdmUoe3NlbGVjdG9yOiAnW25nZkJhY2tncm91bmRdJ30pXG5leHBvcnQgY2xhc3MgbmdmQmFja2dyb3VuZCB7XG4gIEBJbnB1dCgnbmdmQmFja2dyb3VuZCcpIGZpbGU6YW55XG5cbiAgY29uc3RydWN0b3IocHVibGljIEVsZW1lbnRSZWY6RWxlbWVudFJlZil7fVxuXG4gIG5nT25DaGFuZ2VzKCBfY2hhbmdlczphbnkgKXtcbiAgICBkYXRhVXJsKHRoaXMuZmlsZSlcbiAgICAudGhlbihzcmM9PntcbiAgICAgIGNvbnN0IHVybFN0cmluZyA9ICd1cmwoXFwnJyArIChzcmMgfHwgJycpICsgJ1xcJyknXG4gICAgICB0aGlzLkVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5zdHlsZS5iYWNrZ3JvdW5kSW1hZ2UgPSB1cmxTdHJpbmdcbiAgICB9KVxuICB9XG59XG4iXX0= -------------------------------------------------------------------------------- /esm2020/file-upload/ngfDrop.directive.mjs: -------------------------------------------------------------------------------- 1 | import { Directive, EventEmitter, HostListener, Input, Output } from '@angular/core'; 2 | import { ngf, eventToTransfer, filesToWriteableObject } from "./ngf.directive"; 3 | import * as i0 from "@angular/core"; 4 | export class ngfDrop extends ngf { 5 | constructor() { 6 | super(...arguments); 7 | this.fileOver = new EventEmitter(); 8 | this.validDrag = false; 9 | this.validDragChange = new EventEmitter(); 10 | this.invalidDrag = false; 11 | this.invalidDragChange = new EventEmitter(); 12 | this.dragFilesChange = new EventEmitter(); 13 | } 14 | onDrop(event) { 15 | if (this.fileDropDisabled) { 16 | this.stopEvent(event); 17 | return; 18 | } 19 | this.closeDrags(); 20 | let files = this.eventToFiles(event); 21 | if (!files.length) 22 | return; 23 | this.stopEvent(event); 24 | this.handleFiles(files); 25 | } 26 | handleFiles(files) { 27 | this.fileOver.emit(false); //turn-off dragover 28 | super.handleFiles(files); 29 | } 30 | onDragOver(event) { 31 | if (this.fileDropDisabled) { 32 | this.stopEvent(event); 33 | return; 34 | } 35 | const transfer = eventToTransfer(event); 36 | let files = this.eventToFiles(event); 37 | let jsonFiles = filesToWriteableObject(files); 38 | this.dragFilesChange.emit(this.dragFiles = jsonFiles); 39 | if (files.length) { 40 | this.validDrag = this.isFilesValid(files); 41 | } 42 | else { 43 | //Safari, IE11 & some browsers do NOT tell you about dragged files until dropped. Always consider a valid drag 44 | this.validDrag = true; 45 | } 46 | this.validDragChange.emit(this.validDrag); 47 | this.invalidDrag = !this.validDrag; 48 | this.invalidDragChange.emit(this.invalidDrag); 49 | transfer.dropEffect = 'copy'; // change cursor and visual display 50 | this.stopEvent(event); 51 | this.fileOver.emit(true); 52 | } 53 | closeDrags() { 54 | delete this.validDrag; 55 | this.validDragChange.emit(this.validDrag); 56 | this.invalidDrag = false; 57 | this.invalidDragChange.emit(this.invalidDrag); 58 | delete this.dragFiles; 59 | this.dragFilesChange.emit(this.dragFiles); 60 | } 61 | onDragLeave(event) { 62 | if (this.fileDropDisabled) { 63 | this.stopEvent(event); 64 | return; 65 | } 66 | this.closeDrags(); 67 | if (this.element) { 68 | if (event.currentTarget === this.element[0]) { 69 | return; 70 | } 71 | } 72 | this.stopEvent(event); 73 | this.fileOver.emit(false); 74 | } 75 | } 76 | ngfDrop.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: ngfDrop, deps: null, target: i0.ɵɵFactoryTarget.Directive }); 77 | ngfDrop.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "14.3.0", type: ngfDrop, selector: "[ngfDrop]", inputs: { validDrag: "validDrag", invalidDrag: "invalidDrag", dragFiles: "dragFiles" }, outputs: { fileOver: "fileOver", validDragChange: "validDragChange", invalidDragChange: "invalidDragChange", dragFilesChange: "dragFilesChange" }, host: { listeners: { "drop": "onDrop($event)", "dragover": "onDragOver($event)", "dragleave": "onDragLeave($event)" } }, exportAs: ["ngfDrop"], usesInheritance: true, ngImport: i0 }); 78 | i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: ngfDrop, decorators: [{ 79 | type: Directive, 80 | args: [{ 81 | selector: "[ngfDrop]", 82 | exportAs: "ngfDrop" 83 | }] 84 | }], propDecorators: { fileOver: [{ 85 | type: Output 86 | }], validDrag: [{ 87 | type: Input 88 | }], validDragChange: [{ 89 | type: Output 90 | }], invalidDrag: [{ 91 | type: Input 92 | }], invalidDragChange: [{ 93 | type: Output 94 | }], dragFiles: [{ 95 | type: Input 96 | }], dragFilesChange: [{ 97 | type: Output 98 | }], onDrop: [{ 99 | type: HostListener, 100 | args: ['drop', ['$event']] 101 | }], onDragOver: [{ 102 | type: HostListener, 103 | args: ['dragover', ['$event']] 104 | }], onDragLeave: [{ 105 | type: HostListener, 106 | args: ['dragleave', ['$event']] 107 | }] } }); 108 | //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmdmRHJvcC5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvZmlsZS11cGxvYWQvbmdmRHJvcC5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLFNBQVMsRUFBRSxZQUFZLEVBQ3ZCLFlBQVksRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUM1QixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsR0FBRyxFQUFZLGVBQWUsRUFBRSxzQkFBc0IsRUFBRSxNQUFNLGlCQUFpQixDQUFBOztBQU14RixNQUFNLE9BQU8sT0FBUSxTQUFRLEdBQUc7SUFKaEM7O1FBS1ksYUFBUSxHQUFxQixJQUFJLFlBQVksRUFBRSxDQUFDO1FBRWpELGNBQVMsR0FBVyxLQUFLLENBQUE7UUFDeEIsb0JBQWUsR0FBeUIsSUFBSSxZQUFZLEVBQUUsQ0FBQTtRQUUzRCxnQkFBVyxHQUFHLEtBQUssQ0FBQTtRQUNsQixzQkFBaUIsR0FBeUIsSUFBSSxZQUFZLEVBQUUsQ0FBQTtRQUc1RCxvQkFBZSxHQUE0QixJQUFJLFlBQVksRUFBRSxDQUFBO0tBaUZ4RTtJQTlFQyxNQUFNLENBQUMsS0FBVztRQUNoQixJQUFHLElBQUksQ0FBQyxnQkFBZ0IsRUFBQztZQUN2QixJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ3RCLE9BQU07U0FDUDtRQUVELElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQTtRQUNqQixJQUFJLEtBQUssR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFBO1FBRXBDLElBQUcsQ0FBQyxLQUFLLENBQUMsTUFBTTtZQUFDLE9BQU07UUFFdkIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN0QixJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFBO0lBQ3pCLENBQUM7SUFFRCxXQUFXLENBQUMsS0FBWTtRQUN0QixJQUFJ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O2dCQUVFLFNBQVM7c0JBQWpCLEtBQUs7Z0JBQ0ksZUFBZTtzQkFBeEIsTUFBTTtnQkFHUCxNQUFNO3NCQURMLFlBQVk7dUJBQUMsTUFBTSxFQUFFLENBQUMsUUFBUSxDQUFDO2dCQXNCaEMsVUFBVTtzQkFEVCxZQUFZO3VCQUFDLFVBQVUsRUFBRSxDQUFDLFFBQVEsQ0FBQztnQkF5Q3BDLFdBQVc7c0JBRFYsWUFBWTt1QkFBQyxXQUFXLEVBQUUsQ0FBQyxRQUFRLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBEaXJlY3RpdmUsIEV2ZW50RW1pdHRlcixcbiAgSG9zdExpc3RlbmVyLCBJbnB1dCwgT3V0cHV0XG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgbmdmLCBkcmFnTWV0YSwgZXZlbnRUb1RyYW5zZmVyLCBmaWxlc1RvV3JpdGVhYmxlT2JqZWN0IH0gZnJvbSBcIi4vbmdmLmRpcmVjdGl2ZVwiXG5cbkBEaXJlY3RpdmUoe1xuICBzZWxlY3RvcjogXCJbbmdmRHJvcF1cIixcbiAgZXhwb3J0QXM6IFwibmdmRHJvcFwiXG59KVxuZXhwb3J0IGNsYXNzIG5nZkRyb3AgZXh0ZW5kcyBuZ2Yge1xuICBAT3V0cHV0KCkgZmlsZU92ZXI6RXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbiAgQElucHV0KCkgdmFsaWREcmFnOmJvb2xlYW4gPSBmYWxzZVxuICBAT3V0cHV0KCkgdmFsaWREcmFnQ2hhbmdlOkV2ZW50RW1pdHRlcjxib29sZWFuPiA9IG5ldyBFdmVudEVtaXR0ZXIoKVxuXG4gIEBJbnB1dCgpIGludmFsaWREcmFnID0gZmFsc2VcbiAgQE91dHB1dCgpIGludmFsaWREcmFnQ2hhbmdlOkV2ZW50RW1pdHRlcjxib29sZWFuPiA9IG5ldyBFdmVudEVtaXR0ZXIoKVxuXG4gIEBJbnB1dCgpIGRyYWdGaWxlcyAhOiBkcmFnTWV0YVtdXG4gIEBPdXRwdXQoKSBkcmFnRmlsZXNDaGFuZ2U6RXZlbnRFbWl0dGVyPGRyYWdNZXRhW10+ID0gbmV3IEV2ZW50RW1pdHRlcigpXG5cbiAgQEhvc3RMaXN0ZW5lcignZHJvcCcsIFsnJGV2ZW50J10pXG4gIG9uRHJvcChldmVudDpFdmVudCk6dm9pZCB7XG4gICAgaWYodGhpcy5maWxlRHJvcERpc2FibGVkKXtcbiAgICAgIHRoaXMuc3RvcEV2ZW50KGV2ZW50KTtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIHRoaXMuY2xvc2VEcmFncygpXG4gICAgbGV0IGZpbGVzID0gdGhpcy5ldmVudFRvRmlsZXMoZXZlbnQpXG5cbiAgICBpZighZmlsZXMubGVuZ3RoKXJldHVyblxuXG4gICAgdGhpcy5zdG9wRXZlbnQoZXZlbnQpO1xuICAgIHRoaXMuaGFuZGxlRmlsZXMoZmlsZXMpXG4gIH1cblxuICBoYW5kbGVGaWxlcyhmaWxlczpGaWxlW10pe1xuICAgIHRoaXMuZmlsZU92ZXIuZW1pdChmYWxzZSkvL3R1cm4tb2ZmIGRyYWdvdmVyXG4gICAgc3VwZXIuaGFuZGxlRmlsZXMoZmlsZXMpXG4gIH1cblxuICBASG9zdExpc3RlbmVyKCdkcmFnb3ZlcicsIFsnJGV2ZW50J10pXG4gIG9uRHJhZ092ZXIoZXZlbnQ6RXZlbnQpOnZvaWQge1xuICAgIGlmKHRoaXMuZmlsZURyb3BEaXNhYmxlZCl7XG4gICAgICB0aGlzLnN0b3BFdmVudChldmVudCk7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCB0cmFuc2ZlciA9IGV2ZW50VG9UcmFuc2ZlcihldmVudClcblxuICAgIGxldCBmaWxlcyA9IHRoaXMuZXZlbnRUb0ZpbGVzKGV2ZW50KVxuXG4gICAgbGV0IGpzb25GaWxlcyA9IGZpbGVzVG9Xcml0ZWFibGVPYmplY3QoZmlsZXMpXG4gICAgdGhpcy5kcmFnRmlsZXNDaGFuZ2UuZW1pdCggdGhpcy5kcmFnRmlsZXM9anNvbkZpbGVzIClcblxuICAgIGlmKCBmaWxlcy5sZW5ndGggKXtcbiAgICAgIHRoaXMudmFsaWREcmFnID0gdGhpcy5pc0ZpbGVzVmFsaWQoZmlsZXMpXG4gICAgfWVsc2V7XG4gICAgICAvL1NhZmFyaSwgSUUxMSAmIHNvbWUgYnJvd3NlcnMgZG8gTk9UIHRlbGwgeW91IGFib3V0IGRyYWdnZWQgZmlsZXMgdW50aWwgZHJvcHBlZC4gQWx3YXlzIGNvbnNpZGVyIGEgdmFsaWQgZHJhZ1xuICAgICAgdGhpcy52YWxpZERyYWcgPSB0cnVlXG4gICAgfVxuXG4gICAgdGhpcy52YWxpZERyYWdDaGFuZ2UuZW1pdCh0aGlzLnZhbGlkRHJhZylcblxuICAgIHRoaXMuaW52YWxpZERyYWcgPSAhdGhpcy52YWxpZERyYWdcbiAgICB0aGlzLmludmFsaWREcmFnQ2hhbmdlLmVtaXQodGhpcy5pbnZhbGlkRHJhZylcblxuICAgIHRyYW5zZmVyLmRyb3BFZmZlY3QgPSAnY29weScgLy8gY2hhbmdlIGN1cnNvciBhbmQgdmlzdWFsIGRpc3BsYXlcbiAgICB0aGlzLnN0b3BFdmVudChldmVudClcbiAgICB0aGlzLmZpbGVPdmVyLmVtaXQodHJ1ZSlcbiAgfVxuXG4gIGNsb3NlRHJhZ3MoKXtcbiAgICBkZWxldGUgdGhpcy52YWxpZERyYWdcbiAgICB0aGlzLnZhbGlkRHJhZ0NoYW5nZS5lbWl0KHRoaXMudmFsaWREcmFnKVxuICAgIHRoaXMuaW52YWxpZERyYWcgPSBmYWxzZVxuICAgIHRoaXMuaW52YWxpZERyYWdDaGFuZ2UuZW1pdCh0aGlzLmludmFsaWREcmFnKVxuICAgIGRlbGV0ZSB0aGlzLmRyYWdGaWxlc1xuICAgIHRoaXMuZHJhZ0ZpbGVzQ2hhbmdlLmVtaXQoIHRoaXMuZHJhZ0ZpbGVzIClcbiAgfVxuXG4gIEBIb3N0TGlzdGVuZXIoJ2RyYWdsZWF2ZScsIFsnJGV2ZW50J10pXG4gIG9uRHJhZ0xlYXZlKGV2ZW50OkV2ZW50KTphbnkge1xuICAgIGlmKHRoaXMuZmlsZURyb3BEaXNhYmxlZCl7XG4gICAgICB0aGlzLnN0b3BFdmVudChldmVudCk7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICB0aGlzLmNsb3NlRHJhZ3MoKVxuXG4gICAgaWYgKCh0aGlzIGFzIGFueSkuZWxlbWVudCkge1xuICAgICAgaWYgKGV2ZW50LmN1cnJlbnRUYXJnZXQgPT09ICh0aGlzIGFzIGFueSkuZWxlbWVudFswXSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5zdG9wRXZlbnQoZXZlbnQpO1xuICAgIHRoaXMuZmlsZU92ZXIuZW1pdChmYWxzZSk7XG4gIH1cbn0iXX0= -------------------------------------------------------------------------------- /esm2020/file-upload/ngfFormData.directive.mjs: -------------------------------------------------------------------------------- 1 | import { Directive, EventEmitter, Output, Input } from '@angular/core'; 2 | import * as i0 from "@angular/core"; 3 | export class ngfFormData { 4 | constructor(IterableDiffers) { 5 | this.postName = "file"; 6 | this.FormData = new FormData(); 7 | this.FormDataChange = new EventEmitter(); 8 | this.differ = IterableDiffers.find([]).create(); 9 | } 10 | ngDoCheck() { 11 | var changes = this.differ.diff(this.files); 12 | if (changes) { 13 | setTimeout(() => this.buildFormData(), 0); 14 | } 15 | } 16 | buildFormData() { 17 | const isArray = typeof (this.files) === 'object' && this.files.constructor === Array; 18 | if (isArray) { 19 | this.FormData = new FormData(); 20 | const files = this.files || []; 21 | files.forEach(file => this.FormData.append(this.postName, file, this.fileName || file.name)); 22 | this.FormDataChange.emit(this.FormData); 23 | } 24 | else { 25 | delete this.FormData; 26 | } 27 | } 28 | } 29 | ngfFormData.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: ngfFormData, deps: [{ token: i0.IterableDiffers }], target: i0.ɵɵFactoryTarget.Directive }); 30 | ngfFormData.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "14.3.0", type: ngfFormData, selector: "ngfFormData", inputs: { files: "files", postName: "postName", fileName: "fileName", FormData: "FormData" }, outputs: { FormDataChange: "FormDataChange" }, ngImport: i0 }); 31 | i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: ngfFormData, decorators: [{ 32 | type: Directive, 33 | args: [{ selector: 'ngfFormData' }] 34 | }], ctorParameters: function () { return [{ type: i0.IterableDiffers }]; }, propDecorators: { files: [{ 35 | type: Input 36 | }], postName: [{ 37 | type: Input 38 | }], fileName: [{ 39 | type: Input 40 | }], FormData: [{ 41 | type: Input 42 | }], FormDataChange: [{ 43 | type: Output 44 | }] } }); 45 | //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmdmRm9ybURhdGEuZGlyZWN0aXZlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2ZpbGUtdXBsb2FkL25nZkZvcm1EYXRhLmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBR0wsU0FBUyxFQUFFLFlBQVksRUFDdkIsTUFBTSxFQUFFLEtBQUssRUFDZCxNQUFNLGVBQWUsQ0FBQzs7QUFHdkIsTUFBTSxPQUFPLFdBQVc7SUFVdEIsWUFBWSxlQUFnQztRQVJuQyxhQUFRLEdBQVUsTUFBTSxDQUFBO1FBR3hCLGFBQVEsR0FBWSxJQUFJLFFBQVEsRUFBRSxDQUFBO1FBQ2pDLG1CQUFjLEdBQTBCLElBQUksWUFBWSxFQUFFLENBQUE7UUFLbEUsSUFBSSxDQUFDLE1BQU0sR0FBRyxlQUFlLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFBO0lBQ2pELENBQUM7SUFFRCxTQUFTO1FBQ1AsSUFBSSxPQUFPLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUUsSUFBSSxDQUFDLEtBQUssQ0FBRSxDQUFDO1FBRTdDLElBQUksT0FBTyxFQUFFO1lBQ1gsVUFBVSxDQUFDLEdBQUUsRUFBRSxDQUFBLElBQUksQ0FBQyxhQUFhLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQTtTQUN4QztJQUNILENBQUM7SUFFRCxhQUFhO1FBQ1gsTUFBTSxPQUFPLEdBQUcsT0FBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBRyxRQUFRLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxXQUFXLEtBQUcsS0FBSyxDQUFBO1FBRS9FLElBQUksT0FBTyxFQUFFO1lBQ1gsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLFFBQVEsRUFBRSxDQUFBO1lBQzlCLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLElBQUksRUFBRSxDQUFBO1lBQzlCLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFBLEVBQUUsQ0FDbEIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLFFBQVEsSUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQ3BFLENBQUE7WUFDRCxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBRSxJQUFJLENBQUMsUUFBUSxDQUFFLENBQUE7U0FDMUM7YUFBSTtZQUNILE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQTtTQUNyQjtJQUNILENBQUM7O3dHQW5DVSxXQUFXOzRGQUFYLFdBQVc7MkZBQVgsV0FBVztrQkFEdkIsU0FBUzttQkFBQyxFQUFDLFFBQVEsRUFBRSxhQUFhLEVBQUM7c0dBRXpCLEtBQUs7c0JBQWIsS0FBSztnQkFDRyxRQUFRO3NCQUFoQixLQUFLO2dCQUNHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBRUcsUUFBUTtzQkFBaEIsS0FBSztnQkFDSSxjQUFjO3NCQUF2QixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgSXRlcmFibGVEaWZmZXIsXG4gIEl0ZXJhYmxlRGlmZmVycyxcbiAgRGlyZWN0aXZlLCBFdmVudEVtaXR0ZXIsXG4gIE91dHB1dCwgSW5wdXRcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbkBEaXJlY3RpdmUoe3NlbGVjdG9yOiAnbmdmRm9ybURhdGEnfSlcbmV4cG9ydCBjbGFzcyBuZ2ZGb3JtRGF0YSB7XG4gIEBJbnB1dCgpIGZpbGVzICE6IEZpbGVbXVxuICBASW5wdXQoKSBwb3N0TmFtZTpzdHJpbmcgPSBcImZpbGVcIlxuICBASW5wdXQoKSBmaWxlTmFtZSAhOiBzdHJpbmcvL2ZvcmNlIGZpbGUgbmFtZVxuXG4gIEBJbnB1dCgpIEZvcm1EYXRhOkZvcm1EYXRhID0gbmV3IEZvcm1EYXRhKClcbiAgQE91dHB1dCgpIEZvcm1EYXRhQ2hhbmdlOkV2ZW50RW1pdHRlcjxGb3JtRGF0YT4gPSBuZXcgRXZlbnRFbWl0dGVyKClcblxuICBkaWZmZXI6SXRlcmFibGVEaWZmZXI8e30+XG5cbiAgY29uc3RydWN0b3IoSXRlcmFibGVEaWZmZXJzOiBJdGVyYWJsZURpZmZlcnMpe1xuICAgIHRoaXMuZGlmZmVyID0gSXRlcmFibGVEaWZmZXJzLmZpbmQoW10pLmNyZWF0ZSgpXG4gIH1cblxuICBuZ0RvQ2hlY2soKXtcbiAgICB2YXIgY2hhbmdlcyA9IHRoaXMuZGlmZmVyLmRpZmYoIHRoaXMuZmlsZXMgKTtcblxuICAgIGlmIChjaGFuZ2VzKSB7XG4gICAgICBzZXRUaW1lb3V0KCgpPT50aGlzLmJ1aWxkRm9ybURhdGEoKSwgMClcbiAgICB9XG4gIH1cblxuICBidWlsZEZvcm1EYXRhKCl7XG4gICAgY29uc3QgaXNBcnJheSA9IHR5cGVvZih0aGlzLmZpbGVzKT09PSdvYmplY3QnICYmIHRoaXMuZmlsZXMuY29uc3RydWN0b3I9PT1BcnJheVxuXG4gICAgaWYoIGlzQXJyYXkgKXtcbiAgICAgIHRoaXMuRm9ybURhdGEgPSBuZXcgRm9ybURhdGEoKVxuICAgICAgY29uc3QgZmlsZXMgPSB0aGlzLmZpbGVzIHx8IFtdXG4gICAgICBmaWxlcy5mb3JFYWNoKGZpbGU9PlxuICAgICAgICB0aGlzLkZvcm1EYXRhLmFwcGVuZCh0aGlzLnBvc3ROYW1lLCBmaWxlLCB0aGlzLmZpbGVOYW1lfHxmaWxlLm5hbWUpXG4gICAgICApXG4gICAgICB0aGlzLkZvcm1EYXRhQ2hhbmdlLmVtaXQoIHRoaXMuRm9ybURhdGEgKVxuICAgIH1lbHNle1xuICAgICAgZGVsZXRlIHRoaXMuRm9ybURhdGFcbiAgICB9XG4gIH1cbn0iXX0= -------------------------------------------------------------------------------- /esm2020/file-upload/ngfSelect.directive.mjs: -------------------------------------------------------------------------------- 1 | import { Directive, Input } from "@angular/core"; 2 | import { ngf } from "./ngf.directive"; 3 | import * as i0 from "@angular/core"; 4 | export class ngfSelect extends ngf { 5 | constructor() { 6 | super(...arguments); 7 | this.selectable = true; 8 | } 9 | } 10 | ngfSelect.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: ngfSelect, deps: null, target: i0.ɵɵFactoryTarget.Directive }); 11 | ngfSelect.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "14.3.0", type: ngfSelect, selector: "[ngfSelect]", inputs: { selectable: "selectable" }, exportAs: ["ngfSelect"], usesInheritance: true, ngImport: i0 }); 12 | i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: ngfSelect, decorators: [{ 13 | type: Directive, 14 | args: [{ 15 | selector: "[ngfSelect]", 16 | exportAs: "ngfSelect" 17 | }] 18 | }], propDecorators: { selectable: [{ 19 | type: Input 20 | }] } }); 21 | //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmdmU2VsZWN0LmRpcmVjdGl2ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9maWxlLXVwbG9hZC9uZ2ZTZWxlY3QuZGlyZWN0aXZlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLE1BQU0sZUFBZSxDQUFBO0FBQ2hELE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQTs7QUFNckMsTUFBTSxPQUFPLFNBQVUsU0FBUSxHQUFHO0lBSmxDOztRQUtXLGVBQVUsR0FBTyxJQUFJLENBQUE7S0FDL0I7O3NHQUZZLFNBQVM7MEZBQVQsU0FBUzsyRkFBVCxTQUFTO2tCQUpyQixTQUFTO21CQUFDO29CQUNULFFBQVEsRUFBRSxhQUFhO29CQUN2QixRQUFRLEVBQUUsV0FBVztpQkFDdEI7OEJBRVUsVUFBVTtzQkFBbEIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IERpcmVjdGl2ZSwgSW5wdXQgfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiXG5pbXBvcnQgeyBuZ2YgfSBmcm9tIFwiLi9uZ2YuZGlyZWN0aXZlXCJcblxuQERpcmVjdGl2ZSh7XG4gIHNlbGVjdG9yOiBcIltuZ2ZTZWxlY3RdXCIsXG4gIGV4cG9ydEFzOiBcIm5nZlNlbGVjdFwiXG59KVxuZXhwb3J0IGNsYXNzIG5nZlNlbGVjdCBleHRlbmRzIG5nZiB7XG4gIEBJbnB1dCgpIHNlbGVjdGFibGU6YW55ID0gdHJ1ZVxufSJdfQ== -------------------------------------------------------------------------------- /esm2020/file-upload/ngfSrc.directive.mjs: -------------------------------------------------------------------------------- 1 | import { Directive, Input } from '@angular/core'; 2 | import { dataUrl } from './fileTools'; 3 | import * as i0 from "@angular/core"; 4 | export class ngfSrc { 5 | constructor(ElementRef) { 6 | this.ElementRef = ElementRef; 7 | } 8 | ngOnChanges(_changes) { 9 | dataUrl(this.file) 10 | .then(src => this.ElementRef.nativeElement.src = src); 11 | } 12 | } 13 | ngfSrc.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: ngfSrc, deps: [{ token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Directive }); 14 | ngfSrc.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "14.3.0", type: ngfSrc, selector: "[ngfSrc]", inputs: { file: ["ngfSrc", "file"] }, usesOnChanges: true, ngImport: i0 }); 15 | i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: ngfSrc, decorators: [{ 16 | type: Directive, 17 | args: [{ selector: '[ngfSrc]' }] 18 | }], ctorParameters: function () { return [{ type: i0.ElementRef }]; }, propDecorators: { file: [{ 19 | type: Input, 20 | args: ['ngfSrc'] 21 | }] } }); 22 | //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmdmU3JjLmRpcmVjdGl2ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9maWxlLXVwbG9hZC9uZ2ZTcmMuZGlyZWN0aXZlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQWMsS0FBSyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzdELE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxhQUFhLENBQUM7O0FBR3RDLE1BQU0sT0FBTyxNQUFNO0lBR2pCLFlBQW1CLFVBQXNCO1FBQXRCLGVBQVUsR0FBVixVQUFVLENBQVk7SUFBSSxDQUFDO0lBRTlDLFdBQVcsQ0FBQyxRQUFhO1FBQ3ZCLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDO2FBQ2pCLElBQUksQ0FBQyxHQUFHLENBQUEsRUFBRSxDQUNULElBQUksQ0FBQyxVQUFVLENBQUMsYUFBYSxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQ3hDLENBQUE7SUFDSCxDQUFDOzttR0FWVSxNQUFNO3VGQUFOLE1BQU07MkZBQU4sTUFBTTtrQkFEbEIsU0FBUzttQkFBQyxFQUFFLFFBQVEsRUFBRSxVQUFVLEVBQUU7aUdBRWhCLElBQUk7c0JBQXBCLEtBQUs7dUJBQUMsUUFBUSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IERpcmVjdGl2ZSwgRWxlbWVudFJlZiwgSW5wdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IGRhdGFVcmwgfSBmcm9tICcuL2ZpbGVUb29scyc7XG5cbkBEaXJlY3RpdmUoeyBzZWxlY3RvcjogJ1tuZ2ZTcmNdJyB9KVxuZXhwb3J0IGNsYXNzIG5nZlNyYyB7XG4gIEBJbnB1dCgnbmdmU3JjJykgZmlsZTogYW55XG5cbiAgY29uc3RydWN0b3IocHVibGljIEVsZW1lbnRSZWY6IEVsZW1lbnRSZWYpIHsgfVxuXG4gIG5nT25DaGFuZ2VzKF9jaGFuZ2VzOiBhbnkpIHtcbiAgICBkYXRhVXJsKHRoaXMuZmlsZSlcbiAgICAudGhlbihzcmM9PlxuICAgICAgdGhpcy5FbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQuc3JjID0gc3JjXG4gICAgKVxuICB9XG59XG4iXX0= -------------------------------------------------------------------------------- /esm2020/file-upload/ngfUploadStatus.directive.mjs: -------------------------------------------------------------------------------- 1 | import { Directive, EventEmitter, Output, Input } from '@angular/core'; 2 | import * as i0 from "@angular/core"; 3 | export class ngfUploadStatus { 4 | constructor() { 5 | this.percent = 0; 6 | this.percentChange = new EventEmitter(); 7 | } 8 | ngOnChanges(changes) { 9 | if (changes.httpEvent && changes.httpEvent.currentValue) { 10 | const event = changes.httpEvent.currentValue; 11 | if (event.loaded && event.total) { 12 | setTimeout(() => { 13 | this.percent = Math.round(100 * event.loaded / event.total); 14 | this.percentChange.emit(this.percent); 15 | }, 0); 16 | } 17 | } 18 | } 19 | } 20 | ngfUploadStatus.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: ngfUploadStatus, deps: [], target: i0.ɵɵFactoryTarget.Directive }); 21 | ngfUploadStatus.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "14.3.0", type: ngfUploadStatus, selector: "ngfUploadStatus", inputs: { percent: "percent", httpEvent: "httpEvent" }, outputs: { percentChange: "percentChange" }, usesOnChanges: true, ngImport: i0 }); 22 | i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: ngfUploadStatus, decorators: [{ 23 | type: Directive, 24 | args: [{ selector: 'ngfUploadStatus' }] 25 | }], propDecorators: { percent: [{ 26 | type: Input 27 | }], percentChange: [{ 28 | type: Output 29 | }], httpEvent: [{ 30 | type: Input 31 | }] } }); 32 | //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmdmVXBsb2FkU3RhdHVzLmRpcmVjdGl2ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9maWxlLXVwbG9hZC9uZ2ZVcGxvYWRTdGF0dXMuZGlyZWN0aXZlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsTUFBTSxlQUFlLENBQUM7O0FBR3ZFLE1BQU0sT0FBTyxlQUFlO0lBRDVCO1FBRVcsWUFBTyxHQUFVLENBQUMsQ0FBQTtRQUNqQixrQkFBYSxHQUF3QixJQUFJLFlBQVksRUFBRSxDQUFBO0tBY2xFO0lBWEMsV0FBVyxDQUFFLE9BQU87UUFDbEIsSUFBSSxPQUFPLENBQUMsU0FBUyxJQUFJLE9BQU8sQ0FBQyxTQUFTLENBQUMsWUFBWSxFQUFFO1lBQ3ZELE1BQU0sS0FBSyxHQUFHLE9BQU8sQ0FBQyxTQUFTLENBQUMsWUFBWSxDQUFBO1lBQzVDLElBQUksS0FBSyxDQUFDLE1BQU0sSUFBSSxLQUFLLENBQUMsS0FBSyxFQUFFO2dCQUMvQixVQUFVLENBQUMsR0FBRSxFQUFFO29CQUNiLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLEdBQUcsS0FBSyxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7b0JBQzVELElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFFLElBQUksQ0FBQyxPQUFPLENBQUUsQ0FBQTtnQkFDekMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFBO2FBQ047U0FDRjtJQUNILENBQUM7OzRHQWZVLGVBQWU7Z0dBQWYsZUFBZTsyRkFBZixlQUFlO2tCQUQzQixTQUFTO21CQUFDLEVBQUMsUUFBUSxFQUFFLGlCQUFpQixFQUFDOzhCQUU3QixPQUFPO3NCQUFmLEtBQUs7Z0JBQ0ksYUFBYTtzQkFBdEIsTUFBTTtnQkFDRSxTQUFTO3NCQUFqQixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRGlyZWN0aXZlLCBFdmVudEVtaXR0ZXIsIE91dHB1dCwgSW5wdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuQERpcmVjdGl2ZSh7c2VsZWN0b3I6ICduZ2ZVcGxvYWRTdGF0dXMnfSlcbmV4cG9ydCBjbGFzcyBuZ2ZVcGxvYWRTdGF0dXMge1xuICBASW5wdXQoKSBwZXJjZW50Om51bWJlciA9IDBcbiAgQE91dHB1dCgpIHBlcmNlbnRDaGFuZ2U6RXZlbnRFbWl0dGVyPG51bWJlcj4gPSBuZXcgRXZlbnRFbWl0dGVyKClcbiAgQElucHV0KCkgaHR0cEV2ZW50ICE6IEV2ZW50XG5cbiAgbmdPbkNoYW5nZXMoIGNoYW5nZXMgKXtcbiAgICBpZiggY2hhbmdlcy5odHRwRXZlbnQgJiYgY2hhbmdlcy5odHRwRXZlbnQuY3VycmVudFZhbHVlICl7XG4gICAgICBjb25zdCBldmVudCA9IGNoYW5nZXMuaHR0cEV2ZW50LmN1cnJlbnRWYWx1ZVxuICAgICAgaWYgKGV2ZW50LmxvYWRlZCAmJiBldmVudC50b3RhbCkge1xuICAgICAgICBzZXRUaW1lb3V0KCgpPT57XG4gICAgICAgICAgdGhpcy5wZXJjZW50ID0gTWF0aC5yb3VuZCgxMDAgKiBldmVudC5sb2FkZWQgLyBldmVudC50b3RhbCk7XG4gICAgICAgICAgdGhpcy5wZXJjZW50Q2hhbmdlLmVtaXQoIHRoaXMucGVyY2VudCApXG4gICAgICAgIH0sIDApXG4gICAgICB9XG4gICAgfVxuICB9XG59Il19 -------------------------------------------------------------------------------- /esm2020/index.mjs: -------------------------------------------------------------------------------- 1 | export * from './file-upload/ngf.module'; 2 | export { ngfSrc } from './file-upload/ngfSrc.directive'; 3 | export { ngfFormData } from './file-upload/ngfFormData.directive'; 4 | export { ngfSelect } from './file-upload/ngfSelect.directive'; 5 | export { ngfUploadStatus } from './file-upload/ngfUploadStatus.directive'; 6 | export { ngfDrop } from './file-upload/ngfDrop.directive'; 7 | export { ngf } from './file-upload/ngf.directive'; 8 | export { ngfBackground } from './file-upload/ngfBackground.directive'; 9 | //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsY0FBYywwQkFBMEIsQ0FBQTtBQUN4QyxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sZ0NBQWdDLENBQUE7QUFDdkQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLHFDQUFxQyxDQUFBO0FBQ2pFLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQTtBQUM3RCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0seUNBQXlDLENBQUE7QUFDekUsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLGlDQUFpQyxDQUFBO0FBQ3pELE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQTtBQUNqRCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sdUNBQXVDLENBQUEiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgKiBmcm9tICcuL2ZpbGUtdXBsb2FkL25nZi5tb2R1bGUnXG5leHBvcnQgeyBuZ2ZTcmMgfSBmcm9tICcuL2ZpbGUtdXBsb2FkL25nZlNyYy5kaXJlY3RpdmUnXG5leHBvcnQgeyBuZ2ZGb3JtRGF0YSB9IGZyb20gJy4vZmlsZS11cGxvYWQvbmdmRm9ybURhdGEuZGlyZWN0aXZlJ1xuZXhwb3J0IHsgbmdmU2VsZWN0IH0gZnJvbSAnLi9maWxlLXVwbG9hZC9uZ2ZTZWxlY3QuZGlyZWN0aXZlJ1xuZXhwb3J0IHsgbmdmVXBsb2FkU3RhdHVzIH0gZnJvbSAnLi9maWxlLXVwbG9hZC9uZ2ZVcGxvYWRTdGF0dXMuZGlyZWN0aXZlJ1xuZXhwb3J0IHsgbmdmRHJvcCB9IGZyb20gJy4vZmlsZS11cGxvYWQvbmdmRHJvcC5kaXJlY3RpdmUnXG5leHBvcnQgeyBuZ2YgfSBmcm9tICcuL2ZpbGUtdXBsb2FkL25nZi5kaXJlY3RpdmUnXG5leHBvcnQgeyBuZ2ZCYWNrZ3JvdW5kIH0gZnJvbSAnLi9maWxlLXVwbG9hZC9uZ2ZCYWNrZ3JvdW5kLmRpcmVjdGl2ZSciXX0= -------------------------------------------------------------------------------- /esm2020/src/angular-file-src.mjs: -------------------------------------------------------------------------------- 1 | /** 2 | * Generated bundle index. Do not edit. 3 | */ 4 | export * from './public-api'; 5 | //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYW5ndWxhci1maWxlLXNyYy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9hbmd1bGFyLWZpbGUtc3JjLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHO0FBRUgsY0FBYyxjQUFjLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEdlbmVyYXRlZCBidW5kbGUgaW5kZXguIERvIG5vdCBlZGl0LlxuICovXG5cbmV4cG9ydCAqIGZyb20gJy4vcHVibGljLWFwaSc7XG4iXX0= -------------------------------------------------------------------------------- /esm2020/src/file-upload/doc-event-help.functions.mjs: -------------------------------------------------------------------------------- 1 | export const isFileInput = function (elm) { 2 | const ty = elm.getAttribute('type'); 3 | return elm.tagName.toLowerCase() === 'input' && ty && ty.toLowerCase() === 'file'; 4 | }; 5 | let initialTouchStartY = 0; 6 | let initialTouchStartX = 0; 7 | export const detectSwipe = function (evt) { 8 | var touches = evt.changedTouches || (evt.originalEvent && evt.originalEvent.changedTouches); 9 | if (touches) { 10 | if (evt.type === 'touchstart') { 11 | initialTouchStartX = touches[0].clientX; 12 | initialTouchStartY = touches[0].clientY; 13 | return true; // don't block event default 14 | } 15 | else { 16 | // prevent scroll from triggering event 17 | if (evt.type === 'touchend') { 18 | var currentX = touches[0].clientX; 19 | var currentY = touches[0].clientY; 20 | if ((Math.abs(currentX - initialTouchStartX) > 20) || 21 | (Math.abs(currentY - initialTouchStartY) > 20)) { 22 | evt.stopPropagation(); 23 | if (evt.cancelable) { 24 | evt.preventDefault(); 25 | } 26 | return false; 27 | } 28 | } 29 | return true; 30 | } 31 | } 32 | return false; 33 | }; 34 | export const createInvisibleFileInputWrap = function () { 35 | var fileElem = createFileInput(); 36 | var label = document.createElement('label'); 37 | label.innerHTML = 'upload'; 38 | label.style.visibility = 'hidden'; 39 | label.style.position = 'absolute'; 40 | label.style.overflow = 'hidden'; 41 | label.style.width = '0px'; 42 | label.style.height = '0px'; 43 | label.style.border = 'none'; 44 | label.style.margin = '0px'; 45 | label.style.padding = '0px'; 46 | label.setAttribute('tabindex', '-1'); 47 | //bindAttrToFileInput(fileElem, label); 48 | //generatedElems.push({el: elem, ref: label}); 49 | label.appendChild(fileElem); 50 | //document.body.appendChild( label ); 51 | return label; 52 | }; 53 | export const createFileInput = function () { 54 | var fileElem = document.createElement('input'); 55 | fileElem.type = "file"; 56 | return fileElem; 57 | }; 58 | //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZG9jLWV2ZW50LWhlbHAuZnVuY3Rpb25zLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2ZpbGUtdXBsb2FkL2RvYy1ldmVudC1oZWxwLmZ1bmN0aW9ucy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxNQUFNLENBQUMsTUFBTSxXQUFXLEdBQUcsVUFBUyxHQUFPO0lBQ3pDLE1BQU0sRUFBRSxHQUFHLEdBQUcsQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLENBQUE7SUFDbkMsT0FBTyxHQUFHLENBQUMsT0FBTyxDQUFDLFdBQVcsRUFBRSxLQUFLLE9BQU8sSUFBSSxFQUFFLElBQUksRUFBRSxDQUFDLFdBQVcsRUFBRSxLQUFLLE1BQU0sQ0FBQztBQUNwRixDQUFDLENBQUE7QUFFRCxJQUFJLGtCQUFrQixHQUFHLENBQUMsQ0FBQztBQUMzQixJQUFJLGtCQUFrQixHQUFHLENBQUMsQ0FBQztBQUMzQixNQUFNLENBQUMsTUFBTSxXQUFXLEdBQUcsVUFBUyxHQUFPO0lBQ3pDLElBQUksT0FBTyxHQUFHLEdBQUcsQ0FBQyxjQUFjLElBQUksQ0FBQyxHQUFHLENBQUMsYUFBYSxJQUFJLEdBQUcsQ0FBQyxhQUFhLENBQUMsY0FBYyxDQUFDLENBQUM7SUFDNUYsSUFBSSxPQUFPLEVBQUU7UUFDWCxJQUFJLEdBQUcsQ0FBQyxJQUFJLEtBQUssWUFBWSxFQUFFO1lBQzdCLGtCQUFrQixHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUM7WUFDeEMsa0JBQWtCLEdBQUcsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQztZQUN4QyxPQUFPLElBQUksQ0FBQyxDQUFDLDRCQUE0QjtTQUMxQzthQUFNO1lBQ0wsdUNBQXVDO1lBQ3ZDLElBQUksR0FBRyxDQUFDLElBQUksS0FBSyxVQUFVLEVBQUU7Z0JBQzNCLElBQUksUUFBUSxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUM7Z0JBQ2xDLElBQUksUUFBUSxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUM7Z0JBQ2xDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLFFBQVEsR0FBRyxrQkFBa0IsQ0FBQyxHQUFHLEVBQUUsQ0FBQztvQkFDaEQsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLFFBQVEsR0FBRyxrQkFBa0IsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFO29CQUNoRCxHQUFHLENBQUMsZUFBZSxFQUFFLENBQUM7b0JBQ3RCLElBQUksR0FBRyxDQUFDLFVBQVUsRUFBRTt3QkFDbEIsR0FBRyxDQUFDLGNBQWMsRUFBRSxDQUFDO3FCQUN0QjtvQkFDRCxPQUFPLEtBQUssQ0FBQztpQkFDZDthQUNGO1lBQ0QsT0FBTyxJQUFJLENBQUM7U0FDYjtLQUNGO0lBQ0QsT0FBTyxLQUFLLENBQUE7QUFDZCxDQUFDLENBQUE7QUFFRCxNQUFNLENBQUMsTUFBTSw0QkFBNEIsR0FBRztJQUMxQyxJQUFJLFFBQVEsR0FBRyxlQUFlLEVBQUUsQ0FBQTtJQUNoQyxJQUFJLEtBQUssR0FBRyxRQUFRLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQzVDLEtBQUssQ0FBQyxTQUFTLEdBQUcsUUFBUSxDQUFBO0lBQzFCLEtBQUssQ0FBQyxLQUFLLENBQUMsVUFBVSxHQUFHLFFBQVEsQ0FBQTtJQUNqQyxLQUFLLENBQUMsS0FBSyxDQUFDLFFBQVEsR0FBRyxVQUFVLENBQUE7SUFDakMsS0FBSyxDQUFDLEtBQUssQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFBO0lBQy9CLEtBQUssQ0FBQyxLQUFLLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQTtJQUN6QixLQUFLLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUE7SUFDMUIsS0FBSyxDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFBO0lBQzNCLEtBQUssQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQTtJQUMxQixLQUFLLENBQUMsS0FBSyxDQUFDLE9BQU8sR0FBRyxLQUFLLENBQUE7SUFDM0IsS0FBSyxDQUFDLFlBQVksQ0FBQyxVQUFVLEVBQUMsSUFBSSxDQUFDLENBQUE7SUFFbkMsdUNBQXVDO0lBQ3ZDLDhDQUE4QztJQUU5QyxLQUFLLENBQUMsV0FBVyxDQUFFLFFBQVEsQ0FBRSxDQUFBO0lBQzdCLHFDQUFxQztJQUVyQyxPQUFPLEtBQUssQ0FBQztBQUNmLENBQUMsQ0FBQTtBQUVELE1BQU0sQ0FBQyxNQUFNLGVBQWUsR0FBRztJQUM3QixJQUFJLFFBQVEsR0FBRyxRQUFRLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQy9DLFFBQVEsQ0FBQyxJQUFJLEdBQUMsTUFBTSxDQUFBO0lBQ3BCLE9BQU8sUUFBUSxDQUFDO0FBQ2xCLENBQUMsQ0FBQSIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBjb25zdCBpc0ZpbGVJbnB1dCA9IGZ1bmN0aW9uKGVsbTphbnkpe1xuICBjb25zdCB0eSA9IGVsbS5nZXRBdHRyaWJ1dGUoJ3R5cGUnKVxuICByZXR1cm4gZWxtLnRhZ05hbWUudG9Mb3dlckNhc2UoKSA9PT0gJ2lucHV0JyAmJiB0eSAmJiB0eS50b0xvd2VyQ2FzZSgpID09PSAnZmlsZSc7XG59XG5cbmxldCBpbml0aWFsVG91Y2hTdGFydFkgPSAwO1xubGV0IGluaXRpYWxUb3VjaFN0YXJ0WCA9IDA7XG5leHBvcnQgY29uc3QgZGV0ZWN0U3dpcGUgPSBmdW5jdGlvbihldnQ6YW55KTpib29sZWFuIHtcbiAgdmFyIHRvdWNoZXMgPSBldnQuY2hhbmdlZFRvdWNoZXMgfHwgKGV2dC5vcmlnaW5hbEV2ZW50ICYmIGV2dC5vcmlnaW5hbEV2ZW50LmNoYW5nZWRUb3VjaGVzKTtcbiAgaWYgKHRvdWNoZXMpIHtcbiAgICBpZiAoZXZ0LnR5cGUgPT09ICd0b3VjaHN0YXJ0Jykge1xuICAgICAgaW5pdGlhbFRvdWNoU3RhcnRYID0gdG91Y2hlc1swXS5jbGllbnRYO1xuICAgICAgaW5pdGlhbFRvdWNoU3RhcnRZID0gdG91Y2hlc1swXS5jbGllbnRZO1xuICAgICAgcmV0dXJuIHRydWU7IC8vIGRvbid0IGJsb2NrIGV2ZW50IGRlZmF1bHRcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gcHJldmVudCBzY3JvbGwgZnJvbSB0cmlnZ2VyaW5nIGV2ZW50XG4gICAgICBpZiAoZXZ0LnR5cGUgPT09ICd0b3VjaGVuZCcpIHtcbiAgICAgICAgdmFyIGN1cnJlbnRYID0gdG91Y2hlc1swXS5jbGllbnRYO1xuICAgICAgICB2YXIgY3VycmVudFkgPSB0b3VjaGVzWzBdLmNsaWVudFk7XG4gICAgICAgIGlmICgoTWF0aC5hYnMoY3VycmVudFggLSBpbml0aWFsVG91Y2hTdGFydFgpID4gMjApIHx8XG4gICAgICAgICAgKE1hdGguYWJzKGN1cnJlbnRZIC0gaW5pdGlhbFRvdWNoU3RhcnRZKSA+IDIwKSkge1xuICAgICAgICAgIGV2dC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgICBpZiAoZXZ0LmNhbmNlbGFibGUpIHtcbiAgICAgICAgICAgIGV2dC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZmFsc2Vcbn1cblxuZXhwb3J0IGNvbnN0IGNyZWF0ZUludmlzaWJsZUZpbGVJbnB1dFdyYXAgPSBmdW5jdGlvbigpIHtcbiAgdmFyIGZpbGVFbGVtID0gY3JlYXRlRmlsZUlucHV0KClcbiAgdmFyIGxhYmVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnbGFiZWwnKTtcbiAgbGFiZWwuaW5uZXJIVE1MID0gJ3VwbG9hZCdcbiAgbGFiZWwuc3R5bGUudmlzaWJpbGl0eSA9ICdoaWRkZW4nXG4gIGxhYmVsLnN0eWxlLnBvc2l0aW9uID0gJ2Fic29sdXRlJ1xuICBsYWJlbC5zdHlsZS5vdmVyZmxvdyA9ICdoaWRkZW4nXG4gIGxhYmVsLnN0eWxlLndpZHRoID0gJzBweCdcbiAgbGFiZWwuc3R5bGUuaGVpZ2h0ID0gJzBweCdcbiAgbGFiZWwuc3R5bGUuYm9yZGVyID0gJ25vbmUnXG4gIGxhYmVsLnN0eWxlLm1hcmdpbiA9ICcwcHgnXG4gIGxhYmVsLnN0eWxlLnBhZGRpbmcgPSAnMHB4J1xuICBsYWJlbC5zZXRBdHRyaWJ1dGUoJ3RhYmluZGV4JywnLTEnKVxuICBcbiAgLy9iaW5kQXR0clRvRmlsZUlucHV0KGZpbGVFbGVtLCBsYWJlbCk7XG4gIC8vZ2VuZXJhdGVkRWxlbXMucHVzaCh7ZWw6IGVsZW0sIHJlZjogbGFiZWx9KTtcblxuICBsYWJlbC5hcHBlbmRDaGlsZCggZmlsZUVsZW0gKVxuICAvL2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoIGxhYmVsICk7XG5cbiAgcmV0dXJuIGxhYmVsO1xufVxuXG5leHBvcnQgY29uc3QgY3JlYXRlRmlsZUlucHV0ID0gZnVuY3Rpb24oKSB7XG4gIHZhciBmaWxlRWxlbSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2lucHV0Jyk7XG4gIGZpbGVFbGVtLnR5cGU9XCJmaWxlXCJcbiAgcmV0dXJuIGZpbGVFbGVtO1xufVxuIl19 -------------------------------------------------------------------------------- /esm2020/src/file-upload/ngf.directive.mjs: -------------------------------------------------------------------------------- 1 | import { Directive, EventEmitter, Input, Output, HostListener } from '@angular/core'; 2 | import { createInvisibleFileInputWrap, isFileInput, detectSwipe } from "./doc-event-help.functions"; 3 | import { acceptType, applyExifRotation, dataUrl } from "./fileTools"; 4 | import * as i0 from "@angular/core"; 5 | /** A master base set of logic intended to support file select/drag/drop operations 6 | NOTE: Use ngfDrop for full drag/drop. Use ngfSelect for selecting 7 | */ 8 | export class ngf { 9 | constructor(element) { 10 | this.element = element; 11 | this.filters = []; 12 | this.lastFileCount = 0; 13 | this.ngfFixOrientation = true; 14 | this.fileDropDisabled = false; 15 | this.selectable = false; 16 | this.directiveInit = new EventEmitter(); 17 | this.lastInvalids = []; 18 | this.lastInvalidsChange = new EventEmitter(); 19 | this.lastBaseUrlChange = new EventEmitter(); 20 | this.fileChange = new EventEmitter(); 21 | this.files = []; 22 | this.filesChange = new EventEmitter(); 23 | this.fileSelectStart = new EventEmitter(); 24 | this.initFilters(); 25 | } 26 | initFilters() { 27 | // the order is important 28 | this.filters.push({ name: 'accept', fn: this._acceptFilter }); 29 | this.filters.push({ name: 'fileSize', fn: this._fileSizeFilter }); 30 | //this.filters.push({name: 'fileType', fn: this._fileTypeFilter}) 31 | //this.filters.push({name: 'queueLimit', fn: this._queueLimitFilter}) 32 | //this.filters.push({name: 'mimeType', fn: this._mimeTypeFilter}) 33 | } 34 | ngOnDestroy() { 35 | delete this.fileElm; //faster memory release of dom element 36 | this.destroyPasteListener(); 37 | } 38 | ngOnInit() { 39 | const selectable = (this.selectable || this.selectable === '') && !['false', 'null', '0'].includes(this.selectable); 40 | if (selectable) { 41 | this.enableSelecting(); 42 | } 43 | if (this.multiple) { 44 | this.paramFileElm().setAttribute('multiple', this.multiple); 45 | } 46 | this.evalCapturePaste(); 47 | // create reference to this class with one cycle delay to avoid ExpressionChangedAfterItHasBeenCheckedError 48 | setTimeout(() => { 49 | this.directiveInit.emit(this); 50 | }, 0); 51 | } 52 | ngOnChanges(changes) { 53 | if (changes.accept) { 54 | this.paramFileElm().setAttribute('accept', changes.accept.currentValue || '*'); 55 | } 56 | if (changes.capturePaste) { 57 | this.evalCapturePaste(); 58 | } 59 | // Did we go from having a file to not having a file? Clear file element then 60 | if (changes.file && changes.file.previousValue && !changes.file.currentValue) { 61 | this.clearFileElmValue(); 62 | } 63 | // Did we go from having files to not having files? Clear file element then 64 | if (changes.files) { 65 | const filesWentToZero = changes.files.previousValue?.length && !changes.files.currentValue?.length; 66 | if (filesWentToZero) { 67 | this.clearFileElmValue(); 68 | } 69 | } 70 | } 71 | evalCapturePaste() { 72 | const isActive = this.capturePaste || this.capturePaste === '' || ['false', '0', 'null'].includes(this.capturePaste); 73 | if (isActive) { 74 | if (this.pasteCapturer) { 75 | return; // already listening 76 | } 77 | this.pasteCapturer = (e) => { 78 | const clip = e.clipboardData; 79 | if (clip && clip.files && clip.files.length) { 80 | this.handleFiles(clip.files); 81 | e.preventDefault(); 82 | } 83 | }; 84 | window.addEventListener('paste', this.pasteCapturer); 85 | return; 86 | } 87 | this.destroyPasteListener(); 88 | } 89 | destroyPasteListener() { 90 | if (this.pasteCapturer) { 91 | window.removeEventListener('paste', this.pasteCapturer); 92 | delete this.pasteCapturer; 93 | } 94 | } 95 | paramFileElm() { 96 | if (this.fileElm) 97 | return this.fileElm; // already defined 98 | // elm already is a file input 99 | const isFile = isFileInput(this.element.nativeElement); 100 | if (isFile) { 101 | return this.fileElm = this.element.nativeElement; 102 | } 103 | // the host elm is NOT a file input 104 | return this.fileElm = this.createFileElm({ 105 | change: this.changeFn.bind(this) 106 | }); 107 | } 108 | /** Only used when host element we are attached to is NOT a fileElement */ 109 | createFileElm({ change }) { 110 | // use specific technique to hide file element within 111 | const label = createInvisibleFileInputWrap(); 112 | const fileElm = label.getElementsByTagName('input')[0]; 113 | fileElm.addEventListener('change', change); 114 | this.element.nativeElement.appendChild(label); // put on html stage 115 | return fileElm; 116 | } 117 | enableSelecting() { 118 | let elm = this.element.nativeElement; 119 | if (isFileInput(elm)) { 120 | const bindedHandler = event => this.beforeSelect(event); 121 | elm.addEventListener('click', bindedHandler); 122 | elm.addEventListener('touchstart', bindedHandler); 123 | return; 124 | } 125 | const bindedHandler = ev => this.clickHandler(ev); 126 | elm.addEventListener('click', bindedHandler); 127 | elm.addEventListener('touchstart', bindedHandler); 128 | elm.addEventListener('touchend', bindedHandler); 129 | } 130 | getValidFiles(files) { 131 | const rtn = []; 132 | for (let x = files.length - 1; x >= 0; --x) { 133 | if (this.isFileValid(files[x])) { 134 | rtn.push(files[x]); 135 | } 136 | } 137 | return rtn; 138 | } 139 | getInvalidFiles(files) { 140 | const rtn = []; 141 | for (let x = files.length - 1; x >= 0; --x) { 142 | let failReason = this.getFileFilterFailName(files[x]); 143 | if (failReason) { 144 | rtn.push({ 145 | file: files[x], 146 | type: failReason 147 | }); 148 | } 149 | } 150 | return rtn; 151 | } 152 | // Primary handler of files coming in 153 | handleFiles(files) { 154 | const valids = this.getValidFiles(files); 155 | if (files.length != valids.length) { 156 | this.lastInvalids = this.getInvalidFiles(files); 157 | } 158 | else { 159 | delete this.lastInvalids; 160 | } 161 | this.lastInvalidsChange.emit(this.lastInvalids); 162 | if (valids.length) { 163 | if (this.ngfFixOrientation) { 164 | this.applyExifRotations(valids) 165 | .then(fixedFiles => this.que(fixedFiles)); 166 | } 167 | else { 168 | this.que(valids); 169 | } 170 | } 171 | if (this.isEmptyAfterSelection()) { 172 | this.element.nativeElement.value = ''; 173 | } 174 | } 175 | que(files) { 176 | this.files = this.files || []; 177 | Array.prototype.push.apply(this.files, files); 178 | //below break memory ref and doesnt act like a que 179 | //this.files = files//causes memory change which triggers bindings like 180 | this.filesChange.emit(this.files); 181 | if (files.length) { 182 | this.fileChange.emit(this.file = files[0]); 183 | if (this.lastBaseUrlChange.observers.length) { 184 | dataUrl(files[0]) 185 | .then(url => this.lastBaseUrlChange.emit(url)); 186 | } 187 | } 188 | //will be checked for input value clearing 189 | this.lastFileCount = this.files.length; 190 | } 191 | /** called when input has files */ 192 | changeFn(event) { 193 | var fileList = event.__files_ || (event.target && event.target.files); 194 | if (!fileList) 195 | return; 196 | this.stopEvent(event); 197 | this.handleFiles(fileList); 198 | } 199 | clickHandler(evt) { 200 | const elm = this.element.nativeElement; 201 | if (elm.getAttribute('disabled') || this.fileDropDisabled) { 202 | return false; 203 | } 204 | var r = detectSwipe(evt); 205 | // prevent the click if it is a swipe 206 | if (r !== false) 207 | return r; 208 | const fileElm = this.paramFileElm(); 209 | fileElm.click(); 210 | //fileElm.dispatchEvent( new Event('click') ); 211 | this.beforeSelect(evt); 212 | return false; 213 | } 214 | beforeSelect(event) { 215 | this.fileSelectStart.emit(event); 216 | if (this.files && this.lastFileCount === this.files.length) 217 | return; 218 | // if no files in array, be sure browser does not prevent reselect of same file (see github issue 27) 219 | this.clearFileElmValue(); 220 | } 221 | clearFileElmValue() { 222 | if (!this.fileElm) 223 | return; 224 | this.fileElm.value = null; 225 | } 226 | isEmptyAfterSelection() { 227 | return !!this.element.nativeElement.attributes.multiple; 228 | } 229 | stopEvent(event) { 230 | event.preventDefault(); 231 | event.stopPropagation(); 232 | } 233 | transferHasFiles(transfer) { 234 | if (!transfer.types) { 235 | return false; 236 | } 237 | if (transfer.types.indexOf) { 238 | return transfer.types.indexOf('Files') !== -1; 239 | } 240 | else if (transfer.types.contains) { 241 | return transfer.types.contains('Files'); 242 | } 243 | else { 244 | return false; 245 | } 246 | } 247 | eventToFiles(event) { 248 | const transfer = eventToTransfer(event); 249 | if (transfer) { 250 | if (transfer.files && transfer.files.length) { 251 | return transfer.files; 252 | } 253 | if (transfer.items && transfer.items.length) { 254 | return transfer.items; 255 | } 256 | } 257 | return []; 258 | } 259 | applyExifRotations(files) { 260 | const mapper = (file, index) => { 261 | return applyExifRotation(file) 262 | .then(fixedFile => files.splice(index, 1, fixedFile)); 263 | }; 264 | const proms = []; 265 | for (let x = files.length - 1; x >= 0; --x) { 266 | proms[x] = mapper(files[x], x); 267 | } 268 | return Promise.all(proms).then(() => files); 269 | } 270 | onChange(event) { 271 | let files = this.element.nativeElement.files || this.eventToFiles(event); 272 | if (!files.length) 273 | return; 274 | this.stopEvent(event); 275 | this.handleFiles(files); 276 | } 277 | getFileFilterFailName(file) { 278 | for (let i = 0; i < this.filters.length; i++) { 279 | if (!this.filters[i].fn.call(this, file)) { 280 | return this.filters[i].name; 281 | } 282 | } 283 | return undefined; 284 | } 285 | isFileValid(file) { 286 | const noFilters = !this.accept && (!this.filters || !this.filters.length); 287 | if (noFilters) { 288 | return true; //we have no filters so all files are valid 289 | } 290 | return this.getFileFilterFailName(file) ? false : true; 291 | } 292 | isFilesValid(files) { 293 | for (let x = files.length - 1; x >= 0; --x) { 294 | if (!this.isFileValid(files[x])) { 295 | return false; 296 | } 297 | } 298 | return true; 299 | } 300 | _acceptFilter(item) { 301 | return acceptType(this.accept, item.type, item.name); 302 | } 303 | _fileSizeFilter(item) { 304 | return !(this.maxSize && item.size > this.maxSize); 305 | } 306 | } 307 | ngf.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: ngf, deps: [{ token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Directive }); 308 | ngf.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "14.3.0", type: ngf, selector: "[ngf]", inputs: { multiple: "multiple", accept: "accept", maxSize: "maxSize", ngfFixOrientation: "ngfFixOrientation", fileDropDisabled: "fileDropDisabled", selectable: "selectable", lastInvalids: "lastInvalids", lastBaseUrl: "lastBaseUrl", file: "file", files: "files", capturePaste: "capturePaste" }, outputs: { directiveInit: "init", lastInvalidsChange: "lastInvalidsChange", lastBaseUrlChange: "lastBaseUrlChange", fileChange: "fileChange", filesChange: "filesChange", fileSelectStart: "fileSelectStart" }, host: { listeners: { "change": "onChange($event)" } }, exportAs: ["ngf"], usesOnChanges: true, ngImport: i0 }); 309 | i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: ngf, decorators: [{ 310 | type: Directive, 311 | args: [{ 312 | selector: "[ngf]", 313 | exportAs: "ngf" 314 | }] 315 | }], ctorParameters: function () { return [{ type: i0.ElementRef }]; }, propDecorators: { multiple: [{ 316 | type: Input 317 | }], accept: [{ 318 | type: Input 319 | }], maxSize: [{ 320 | type: Input 321 | }], ngfFixOrientation: [{ 322 | type: Input 323 | }], fileDropDisabled: [{ 324 | type: Input 325 | }], selectable: [{ 326 | type: Input 327 | }], directiveInit: [{ 328 | type: Output, 329 | args: ['init'] 330 | }], lastInvalids: [{ 331 | type: Input 332 | }], lastInvalidsChange: [{ 333 | type: Output 334 | }], lastBaseUrl: [{ 335 | type: Input 336 | }], lastBaseUrlChange: [{ 337 | type: Output 338 | }], file: [{ 339 | type: Input 340 | }], fileChange: [{ 341 | type: Output 342 | }], files: [{ 343 | type: Input 344 | }], filesChange: [{ 345 | type: Output 346 | }], fileSelectStart: [{ 347 | type: Output 348 | }], capturePaste: [{ 349 | type: Input 350 | }], onChange: [{ 351 | type: HostListener, 352 | args: ['change', ['$event']] 353 | }] } }); 354 | /** browsers try hard to conceal data about file drags, this tends to undo that */ 355 | export function filesToWriteableObject(files) { 356 | const jsonFiles = []; 357 | for (let x = 0; x < files.length; ++x) { 358 | jsonFiles.push({ 359 | type: files[x].type, 360 | kind: files[x]["kind"] 361 | }); 362 | } 363 | return jsonFiles; 364 | } 365 | export function eventToTransfer(event) { 366 | if (event.dataTransfer) 367 | return event.dataTransfer; 368 | return event.originalEvent ? event.originalEvent.dataTransfer : null; 369 | } 370 | //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmdmLmRpcmVjdGl2ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9maWxlLXVwbG9hZC9uZ2YuZGlyZWN0aXZlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFjLEtBQUssRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFpQixNQUFNLGVBQWUsQ0FBQztBQUNoSCxPQUFPLEVBQUUsNEJBQTRCLEVBQUUsV0FBVyxFQUFFLFdBQVcsRUFBRSxNQUFNLDRCQUE0QixDQUFBO0FBQ25HLE9BQU8sRUFDTCxVQUFVLEVBQ1YsaUJBQWlCLEVBQUUsT0FBTyxFQUMzQixNQUFNLGFBQWEsQ0FBQTs7QUFPcEI7O0VBRUU7QUFLRixNQUFNLE9BQU8sR0FBRztJQWdDZCxZQUFtQixPQUFrQjtRQUFsQixZQUFPLEdBQVAsT0FBTyxDQUFXO1FBOUJyQyxZQUFPLEdBQStDLEVBQUUsQ0FBQTtRQUN4RCxrQkFBYSxHQUFXLENBQUMsQ0FBQTtRQUtoQixzQkFBaUIsR0FBWSxJQUFJLENBQUE7UUFFakMscUJBQWdCLEdBQVksS0FBSyxDQUFBO1FBQ2pDLGVBQVUsR0FBcUIsS0FBSyxDQUFBO1FBQzdCLGtCQUFhLEdBQXFCLElBQUksWUFBWSxFQUFFLENBQUE7UUFFM0QsaUJBQVksR0FBcUIsRUFBRSxDQUFBO1FBQ2xDLHVCQUFrQixHQUEyQyxJQUFJLFlBQVksRUFBRSxDQUFBO1FBRy9FLHNCQUFpQixHQUF3QixJQUFJLFlBQVksRUFBRSxDQUFBO1FBRzNELGVBQVUsR0FBdUIsSUFBSSxZQUFZLEVBQUUsQ0FBQTtRQUVwRCxVQUFLLEdBQVUsRUFBRSxDQUFBO1FBQ2hCLGdCQUFXLEdBQXdCLElBQUksWUFBWSxFQUFVLENBQUM7UUFFOUQsb0JBQWUsR0FBdUIsSUFBSSxZQUFZLEVBQUUsQ0FBQTtRQU9oRSxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUE7SUFDcEIsQ0FBQztJQUVELFdBQVc7UUFD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QUMsSUFBSSxDQUFDO1lBQ2IsSUFBSSxFQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJO1lBQ2xCLElBQUksRUFBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDO1NBQ3RCLENBQUMsQ0FBQTtLQUNIO0lBQ0QsT0FBTyxTQUFTLENBQUE7QUFDbEIsQ0FBQztBQUVELE1BQU0sVUFBVSxlQUFlLENBQUMsS0FBVTtJQUN4QyxJQUFHLEtBQUssQ0FBQyxZQUFZO1FBQUMsT0FBTyxLQUFLLENBQUMsWUFBWSxDQUFBO0lBQy9DLE9BQVEsS0FBSyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQTtBQUN2RSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRGlyZWN0aXZlLCBFdmVudEVtaXR0ZXIsIEVsZW1lbnRSZWYsIElucHV0LCBPdXRwdXQsIEhvc3RMaXN0ZW5lciwgU2ltcGxlQ2hhbmdlcyB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgY3JlYXRlSW52aXNpYmxlRmlsZUlucHV0V3JhcCwgaXNGaWxlSW5wdXQsIGRldGVjdFN3aXBlIH0gZnJvbSBcIi4vZG9jLWV2ZW50LWhlbHAuZnVuY3Rpb25zXCJcbmltcG9ydCB7XG4gIGFjY2VwdFR5cGUsIEludmFsaWRGaWxlSXRlbSxcbiAgYXBwbHlFeGlmUm90YXRpb24sIGRhdGFVcmxcbn0gZnJvbSBcIi4vZmlsZVRvb2xzXCJcblxuZXhwb3J0IGludGVyZmFjZSBkcmFnTWV0YXtcbiAgdHlwZTpzdHJpbmdcbiAga2luZDpzdHJpbmdcbn1cblxuLyoqIEEgbWFzdGVyIGJhc2Ugc2V0IG9mIGxvZ2ljIGludGVuZGVkIHRvIHN1cHBvcnQgZmlsZSBzZWxlY3QvZHJhZy9kcm9wIG9wZXJhdGlvbnNcbiBOT1RFOiBVc2UgbmdmRHJvcCBmb3IgZnVsbCBkcmFnL2Ryb3AuIFVzZSBuZ2ZTZWxlY3QgZm9yIHNlbGVjdGluZ1xuKi9cbkBEaXJlY3RpdmUoe1xuICBzZWxlY3RvcjogXCJbbmdmXVwiLFxuICBleHBvcnRBczpcIm5nZlwiXG59KVxuZXhwb3J0IGNsYXNzIG5nZiB7XG4gIGZpbGVFbG06IGFueVxuICBmaWx0ZXJzOiB7bmFtZTogc3RyaW5nLCBmbjogKGZpbGU6RmlsZSk9PmJvb2xlYW59W10gPSBbXVxuICBsYXN0RmlsZUNvdW50OiBudW1iZXIgPSAwXG5cbiAgQElucHV0KCkgbXVsdGlwbGUgITpzdHJpbmdcbiAgQElucHV0KCkgYWNjZXB0ICAgITpzdHJpbmdcbiAgQElucHV0KCkgbWF4U2l6ZSAgITpudW1iZXJcbiAgQElucHV0KCkgbmdmRml4T3JpZW50YXRpb246IGJvb2xlYW4gPSB0cnVlXG5cbiAgQElucHV0KCkgZmlsZURyb3BEaXNhYmxlZDogYm9vbGVhbiA9IGZhbHNlXG4gIEBJbnB1dCgpIHNlbGVjdGFibGU6IGJvb2xlYW4gfCBzdHJpbmcgPSBmYWxzZVxuICBAT3V0cHV0KCdpbml0JykgZGlyZWN0aXZlSW5pdDpFdmVudEVtaXR0ZXI8bmdmPiA9IG5ldyBFdmVudEVtaXR0ZXIoKVxuXG4gIEBJbnB1dCgpIGxhc3RJbnZhbGlkczpJbnZhbGlkRmlsZUl0ZW1bXSA9IFtdXG4gIEBPdXRwdXQoKSBsYXN0SW52YWxpZHNDaGFuZ2U6RXZlbnRFbWl0dGVyPHtmaWxlOkZpbGUsdHlwZTpzdHJpbmd9W10+ID0gbmV3IEV2ZW50RW1pdHRlcigpXG5cbiAgQElucHV0KCkgbGFzdEJhc2VVcmwhOiBzdHJpbmcvL2Jhc2U2NCBsYXN0IGZpbGUgdXBsb2FkZWQgdXJsXG4gIEBPdXRwdXQoKSBsYXN0QmFzZVVybENoYW5nZTpFdmVudEVtaXR0ZXI8c3RyaW5nPiA9IG5ldyBFdmVudEVtaXR0ZXIoKVxuXG4gIEBJbnB1dCgpIGZpbGU/OiBGaWxlLy9sYXN0IGZpbGUgdXBsb2FkZWRcbiAgQE91dHB1dCgpIGZpbGVDaGFuZ2U6IEV2ZW50RW1pdHRlcjxGaWxlPiA9IG5ldyBFdmVudEVtaXR0ZXIoKVxuXG4gIEBJbnB1dCgpIGZpbGVzOkZpbGVbXSA9IFtdXG4gIEBPdXRwdXQoKSBmaWxlc0NoYW5nZTpFdmVudEVtaXR0ZXI8RmlsZVtdPiA9IG5ldyBFdmVudEVtaXR0ZXI8RmlsZVtdPigpO1xuXG4gIEBPdXRwdXQoKSBmaWxlU2VsZWN0U3RhcnQ6RXZlbnRFbWl0dGVyPEV2ZW50PiA9IG5ldyBFdmVudEVtaXR0ZXIoKVxuXG4gIEBJbnB1dCgpIGNhcHR1cmVQYXN0ZTogYm9vbGVhbiAvLyB3aW5kb3cgcGFzdGUgZmlsZSB3YXRjaGluZyAoZW1wdHkgc3RyaW5nIHR1cm5zIG9uKVxuXG4gIHBhc3RlQ2FwdHVyZXIhOiAoZTogRXZlbnQpID0+IHZvaWQgLy8gZ29lcyB3aXRoIGNhcHR1cmVQYXN0ZVxuXG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBlbGVtZW50OkVsZW1lbnRSZWYpe1xuICAgIHRoaXMuaW5pdEZpbHRlcnMoKVxuICB9XG5cbiAgaW5pdEZpbHRlcnMoKXtcbiAgICAvLyB0aGUgb3JkZXIgaXMgaW1wb3J0YW50XG4gICAgdGhpcy5maWx0ZXJzLnB1c2goe25hbWU6ICdhY2NlcHQnLCBmbjogdGhpcy5fYWNjZXB0RmlsdGVyfSlcbiAgICB0aGlzLmZpbHRlcnMucHVzaCh7bmFtZTogJ2ZpbGVTaXplJywgZm46IHRoaXMuX2ZpbGVTaXplRmlsdGVyfSlcblxuICAgIC8vdGhpcy5maWx0ZXJzLnB1c2goe25hbWU6ICdmaWxlVHlwZScsIGZuOiB0aGlzLl9maWxlVHlwZUZpbHRlcn0pXG4gICAgLy90aGlzLmZpbHRlcnMucHVzaCh7bmFtZTogJ3F1ZXVlTGltaXQnLCBmbjogdGhpcy5fcXVldWVMaW1pdEZpbHRlcn0pXG4gICAgLy90aGlzLmZpbHRlcnMucHVzaCh7bmFtZTogJ21pbWVUeXBlJywgZm46IHRoaXMuX21pbWVUeXBlRmlsdGVyfSlcbiAgfVxuXG4gIG5nT25EZXN0cm95KCl7XG4gICAgZGVsZXRlIHRoaXMuZmlsZUVsbS8vZmFzdGVyIG1lbW9yeSByZWxlYXNlIG9mIGRvbSBlbGVtZW50XG4gICAgdGhpcy5kZXN0cm95UGFzdGVMaXN0ZW5lcigpO1xuICB9XG5cbiAgbmdPbkluaXQoKXtcbiAgICBjb25zdCBzZWxlY3RhYmxlID0gKHRoaXMuc2VsZWN0YWJsZSB8fCB0aGlzLnNlbGVjdGFibGU9PT0nJykgJiYgIVsnZmFsc2UnLCAnbnVsbCcsICcwJ10uaW5jbHVkZXModGhpcy5zZWxlY3RhYmxlIGFzIHN0cmluZyk7XG4gICAgaWYoIHNlbGVjdGFibGUgKXtcbiAgICAgIHRoaXMuZW5hYmxlU2VsZWN0aW5nKClcbiAgICB9XG5cbiAgICBpZiggdGhpcy5tdWx0aXBsZSApe1xuICAgICAgdGhpcy5wYXJhbUZpbGVFbG0oKS5zZXRBdHRyaWJ1dGUoJ211bHRpcGxlJywgdGhpcy5tdWx0aXBsZSlcbiAgICB9XG5cbiAgICB0aGlzLmV2YWxDYXB0dXJlUGFzdGUoKTtcblxuICAgIC8vIGNyZWF0ZSByZWZlcmVuY2UgdG8gdGhpcyBjbGFzcyB3aXRoIG9uZSBjeWNsZSBkZWxheSB0byBhdm9pZCBFeHByZXNzaW9uQ2hhbmdlZEFmdGVySXRIYXNCZWVuQ2hlY2tlZEVycm9yXG4gICAgc2V0VGltZW91dCgoKT0+e1xuICAgICAgdGhpcy5kaXJlY3RpdmVJbml0LmVtaXQodGhpcylcbiAgICB9LCAwKVxuICB9XG5cbiAgbmdPbkNoYW5nZXMoIGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMgKXtcbiAgICBpZiggY2hhbmdlcy5hY2NlcHQgKXtcbiAgICAgIHRoaXMucGFyYW1GaWxlRWxtKCkuc2V0QXR0cmlidXRlKCdhY2NlcHQnLCBjaGFuZ2VzLmFjY2VwdC5jdXJyZW50VmFsdWUgfHwgJyonKVxuICAgIH1cblxuICAgIGlmIChjaGFuZ2VzLmNhcHR1cmVQYXN0ZSkge1xuICAgICAgdGhpcy5ldmFsQ2FwdHVyZVBhc3RlKCk7XG4gICAgfVxuXG4gICAgLy8gRGlkIHdlIGdvIGZyb20gaGF2aW5nIGEgZmlsZSB0byBub3QgaGF2aW5nIGEgZmlsZT8gQ2xlYXIgZmlsZSBlbGVtZW50IHRoZW5cbiAgICBpZiAoY2hhbmdlcy5maWxlICYmIGNoYW5nZXMuZmlsZS5wcmV2aW91c1ZhbHVlICYmICFjaGFuZ2VzLmZpbGUuY3VycmVudFZhbHVlKSB7XG4gICAgICB0aGlzLmNsZWFyRmlsZUVsbVZhbHVlKClcbiAgICB9XG5cbiAgICAvLyBEaWQgd2UgZ28gZnJvbSBoYXZpbmcgZmlsZXMgdG8gbm90IGhhdmluZyBmaWxlcz8gQ2xlYXIgZmlsZSBlbGVtZW50IHRoZW5cbiAgICBpZiAoY2hhbmdlcy5maWxlcykge1xuICAgICAgY29uc3QgZmlsZXNXZW50VG9aZXJvID0gY2hhbmdlcy5maWxlcy5wcmV2aW91c1ZhbHVlPy5sZW5ndGggJiYgIWNoYW5nZXMuZmlsZXMuY3VycmVudFZhbHVlPy5sZW5ndGhcblxuICAgICAgaWYgKGZpbGVzV2VudFRvWmVybykge1xuICAgICAgICB0aGlzLmNsZWFyRmlsZUVsbVZhbHVlKClcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBldmFsQ2FwdHVyZVBhc3RlKCkge1xuICAgIGNvbnN0IGlzQWN0aXZlID0gdGhpcy5jYXB0dXJlUGFzdGUgfHwgKHRoaXMuY2FwdHVyZVBhc3RlIGFzIGFueSk9PT0nJyB8fCBbJ2ZhbHNlJywgJzAnLCAnbnVsbCddLmluY2x1ZGVzKHRoaXMuY2FwdHVyZVBhc3RlIGFzIGFueSk7XG5cbiAgICBpZiAoaXNBY3RpdmUpIHtcbiAgICAgIGlmICh0aGlzLnBhc3RlQ2FwdHVyZXIpIHtcbiAgICAgICAgcmV0dXJuOyAvLyBhbHJlYWR5IGxpc3RlbmluZ1xuICAgICAgfVxuXG4gICAgICB0aGlzLnBhc3RlQ2FwdHVyZXIgPSAoZTogRXZlbnQpID0+IHtcbiAgICAgICAgY29uc3QgY2xpcCA9IChlIGFzIGFueSkuY2xpcGJvYXJkRGF0YTtcbiAgICAgICAgaWYgKGNsaXAgJiYgY2xpcC5maWxlcyAmJiBjbGlwLmZpbGVzLmxlbmd0aCkge1xuICAgICAgICAgIHRoaXMuaGFuZGxlRmlsZXMoY2xpcC5maWxlcyk7XG4gICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdwYXN0ZScsIHRoaXMucGFzdGVDYXB0dXJlcik7XG5cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmRlc3Ryb3lQYXN0ZUxpc3RlbmVyKCk7XG4gIH1cblxuICBkZXN0cm95UGFzdGVMaXN0ZW5lcigpIHtcbiAgICBpZiAodGhpcy5wYXN0ZUNhcHR1cmVyKSB7XG4gICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigncGFzdGUnLCB0aGlzLnBhc3RlQ2FwdHVyZXIpO1xuICAgICAgZGVsZXRlIHRoaXMucGFzdGVDYXB0dXJlcjtcbiAgICB9XG4gIH1cblxuICBwYXJhbUZpbGVFbG0oKXtcbiAgICBpZiggdGhpcy5maWxlRWxtIClyZXR1cm4gdGhpcy5maWxlRWxtIC8vIGFscmVhZHkgZGVmaW5lZFxuXG4gICAgLy8gZWxtIGFscmVhZHkgaXMgYSBmaWxlIGlucHV0XG4gICAgY29uc3QgaXNGaWxlID0gaXNGaWxlSW5wdXQoIHRoaXMuZWxlbWVudC5uYXRpdmVFbGVtZW50IClcbiAgICBpZihpc0ZpbGUpe1xuICAgICAgcmV0dXJuIHRoaXMuZmlsZUVsbSA9IHRoaXMuZWxlbWVudC5uYXRpdmVFbGVtZW50XG4gICAgfVxuXG4gICAgLy8gdGhlIGhvc3QgZWxtIGlzIE5PVCBhIGZpbGUgaW5wdXRcbiAgICByZXR1cm4gdGhpcy5maWxlRWxtID0gdGhpcy5jcmVhdGVGaWxlRWxtKHtcbiAgICAgIGNoYW5nZTogdGhpcy5jaGFuZ2VGbi5iaW5kKHRoaXMpXG4gICAgfSlcbiAgfVxuXG4gIC8qKiBPbmx5IHVzZWQgd2hlbiBob3N0IGVsZW1lbnQgd2UgYXJlIGF0dGFjaGVkIHRvIGlzIE5PVCBhIGZpbGVFbGVtZW50ICovXG4gIGNyZWF0ZUZpbGVFbG0oe2NoYW5nZX06IHtjaGFuZ2U6KCkgPT4gYW55fSkge1xuICAgIC8vIHVzZSBzcGVjaWZpYyB0ZWNobmlxdWUgdG8gaGlkZSBmaWxlIGVsZW1lbnQgd2l0aGluXG4gICAgY29uc3QgbGFiZWwgPSBjcmVhdGVJbnZpc2libGVGaWxlSW5wdXRXcmFwKClcbiAgICBjb25zdCBmaWxlRWxtID0gbGFiZWwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2lucHV0JylbMF1cblxuICAgIGZpbGVFbG0uYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgY2hhbmdlKTtcbiAgICB0aGlzLmVsZW1lbnQubmF0aXZlRWxlbWVudC5hcHBlbmRDaGlsZCggbGFiZWwgKSAvLyBwdXQgb24gaHRtbCBzdGFnZVxuXG4gICAgcmV0dXJuIGZpbGVFbG1cbiAgfVxuXG4gIGVuYWJsZVNlbGVjdGluZygpe1xuICAgIGxldCBlbG0gPSB0aGlzLmVsZW1lbnQubmF0aXZlRWxlbWVudFxuXG4gICAgaWYoIGlzRmlsZUlucHV0KGVsbSkgKXtcbiAgICAgIGNvbnN0IGJpbmRlZEhhbmRsZXIgPSBldmVudCA9PiB0aGlzLmJlZm9yZVNlbGVjdChldmVudClcbiAgICAgIGVsbS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGJpbmRlZEhhbmRsZXIpXG4gICAgICBlbG0uYWRkRXZlbnRMaXN0ZW5lcigndG91Y2hzdGFydCcsIGJpbmRlZEhhbmRsZXIpXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCBiaW5kZWRIYW5kbGVyID0gZXYgPT4gdGhpcy5jbGlja0hhbmRsZXIoZXYpXG4gICAgZWxtLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgYmluZGVkSGFuZGxlcilcbiAgICBlbG0uYWRkRXZlbnRMaXN0ZW5lcigndG91Y2hzdGFydCcsIGJpbmRlZEhhbmRsZXIpXG4gICAgZWxtLmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNoZW5kJywgYmluZGVkSGFuZGxlcilcbiAgfVxuXG4gIGdldFZhbGlkRmlsZXMoIGZpbGVzOkZpbGVbXSApOkZpbGVbXXtcbiAgICBjb25zdCBydG46RmlsZVtdID0gW11cbiAgICBmb3IobGV0IHg9ZmlsZXMubGVuZ3RoLTE7IHggPj0gMDsgLS14KXtcbiAgICAgIGlmKCB0aGlzLmlzRmlsZVZhbGlkKGZpbGVzW3hdKSApe1xuICAgICAgICBydG4ucHVzaCggZmlsZXNbeF0gKVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcnRuXG4gIH1cblxuICBnZXRJbnZhbGlkRmlsZXMoZmlsZXM6RmlsZVtdKTpJbnZhbGlkRmlsZUl0ZW1bXXtcbiAgICBjb25zdCBydG46SW52YWxpZEZpbGVJdGVtW10gPSBbXVxuICAgIGZvcihsZXQgeD1maWxlcy5sZW5ndGgtMTsgeCA+PSAwOyAtLXgpe1xuICAgICAgbGV0IGZhaWxSZWFzb24gPSB0aGlzLmdldEZpbGVGaWx0ZXJGYWlsTmFtZShmaWxlc1t4XSlcbiAgICAgIGlmKCBmYWlsUmVhc29uICl7XG4gICAgICAgIHJ0bi5wdXNoKHtcbiAgICAgICAgICBmaWxlIDogZmlsZXNbeF0sXG4gICAgICAgICAgdHlwZSA6IGZhaWxSZWFzb25cbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJ0blxuICB9XG5cbiAgLy8gUHJpbWFyeSBoYW5kbGVyIG9mIGZpbGVzIGNvbWluZyBpblxuICBoYW5kbGVGaWxlcyhmaWxlczpGaWxlW10pe1xuICAgIGNvbnN0IHZhbGlkcyA9IHRoaXMuZ2V0VmFsaWRGaWxlcyhmaWxlcylcblxuICAgIGlmKGZpbGVzLmxlbmd0aCE9dmFsaWRzLmxlbmd0aCl7XG4gICAgICB0aGlzLmxhc3RJbnZhbGlkcyA9IHRoaXMuZ2V0SW52YWxpZEZpbGVzKGZpbGVzKVxuICAgIH1lbHNle1xuICAgICAgZGVsZXRlIHRoaXMubGFzdEludmFsaWRzXG4gICAgfVxuXG4gICAgdGhpcy5sYXN0SW52YWxpZHNDaGFuZ2UuZW1pdCh0aGlzLmxhc3RJbnZhbGlkcylcblxuICAgIGlmKCB2YWxpZHMubGVuZ3RoICl7XG4gICAgICBpZiggdGhpcy5uZ2ZGaXhPcmllbnRhdGlvbiApe1xuICAgICAgICB0aGlzLmFwcGx5RXhpZlJvdGF0aW9ucyh2YWxpZHMpXG4gICAgICAgIC50aGVuKCBmaXhlZEZpbGVzPT50aGlzLnF1ZShmaXhlZEZpbGVzKSApXG4gICAgICB9ZWxzZXtcbiAgICAgICAgdGhpcy5xdWUodmFsaWRzKVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0aGlzLmlzRW1wdHlBZnRlclNlbGVjdGlvbigpKSB7XG4gICAgICB0aGlzLmVsZW1lbnQubmF0aXZlRWxlbWVudC52YWx1ZSA9ICcnXG4gICAgfVxuICB9XG5cbiAgcXVlKCBmaWxlczpGaWxlW10gKXtcbiAgICB0aGlzLmZpbGVzID0gdGhpcy5maWxlcyB8fCBbXVxuICAgIEFycmF5LnByb3RvdHlwZS5wdXNoLmFwcGx5KHRoaXMuZmlsZXMsIGZpbGVzKVxuXG4gICAgLy9iZWxvdyBicmVhayBtZW1vcnkgcmVmIGFuZCBkb2VzbnQgYWN0IGxpa2UgYSBxdWVcbiAgICAvL3RoaXMuZmlsZXMgPSBmaWxlcy8vY2F1c2VzIG1lbW9yeSBjaGFuZ2Ugd2hpY2ggdHJpZ2dlcnMgYmluZGluZ3MgbGlrZSA8bmdmRm9ybURhdGEgW2ZpbGVzXT1cImZpbGVzXCI+PC9uZ2ZGb3JtRGF0YT5cblxuICAgIHRoaXMuZmlsZXNDaGFuZ2UuZW1pdCggdGhpcy5maWxlcyApXG5cbiAgICBpZihmaWxlcy5sZW5ndGgpe1xuICAgICAgdGhpcy5maWxlQ2hhbmdlLmVtaXQoIHRoaXMuZmlsZT1maWxlc1swXSApXG5cbiAgICAgIGlmKHRoaXMubGFzdEJhc2VVcmxDaGFuZ2Uub2JzZXJ2ZXJzLmxlbmd0aCl7XG4gICAgICAgIGRhdGFVcmwoIGZpbGVzWzBdIClcbiAgICAgICAgLnRoZW4oIHVybD0+dGhpcy5sYXN0QmFzZVVybENoYW5nZS5lbWl0KHVybCkgKVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vd2lsbCBiZSBjaGVja2VkIGZvciBpbnB1dCB2YWx1ZSBjbGVhcmluZ1xuICAgIHRoaXMubGFzdEZpbGVDb3VudCA9IHRoaXMuZmlsZXMubGVuZ3RoXG4gIH1cblxuICAvKiogY2FsbGVkIHdoZW4gaW5wdXQgaGFzIGZpbGVzICovXG4gIGNoYW5nZUZuKGV2ZW50OmFueSkge1xuICAgIHZhciBmaWxlTGlzdCA9IGV2ZW50Ll9fZmlsZXNfIHx8IChldmVudC50YXJnZXQgJiYgZXZlbnQudGFyZ2V0LmZpbGVzKVxuXG4gICAgaWYgKCFmaWxlTGlzdCkgcmV0dXJuO1xuXG4gICAgdGhpcy5zdG9wRXZlbnQoZXZlbnQpO1xuICAgIHRoaXMuaGFuZGxlRmlsZXMoZmlsZUxpc3QpXG4gIH1cblxuICBjbGlja0hhbmRsZXIoZXZ0OiBFdmVudCl7XG4gICAgY29uc3QgZWxtID0gdGhpcy5lbGVtZW50Lm5hdGl2ZUVsZW1lbnRcbiAgICBpZiAoZWxtLmdldEF0dHJpYnV0ZSgnZGlzYWJsZWQnKSB8fCB0aGlzLmZpbGVEcm9wRGlzYWJsZWQpe1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHZhciByID0gZGV0ZWN0U3dpcGUoZXZ0KTtcbiAgICAvLyBwcmV2ZW50IHRoZSBjbGljayBpZiBpdCBpcyBhIHN3aXBlXG4gICAgaWYgKCByIT09ZmFsc2UgKSByZXR1cm4gcjtcblxuICAgIGNvbnN0IGZpbGVFbG0gPSB0aGlzLnBhcmFtRmlsZUVsbSgpXG4gICAgZmlsZUVsbS5jbGljaygpXG4gICAgLy9maWxlRWxtLmRpc3BhdGNoRXZlbnQoIG5ldyBFdmVudCgnY2xpY2snKSApO1xuICAgIHRoaXMuYmVmb3JlU2VsZWN0KGV2dClcblxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGJlZm9yZVNlbGVjdChldmVudDogRXZlbnQpe1xuICAgIHRoaXMuZmlsZVNlbGVjdFN0YXJ0LmVtaXQoZXZlbnQpXG5cbiAgICBpZiggdGhpcy5maWxlcyAmJiB0aGlzLmxhc3RGaWxlQ291bnQ9PT10aGlzLmZpbGVzLmxlbmd0aCApcmV0dXJuXG5cbiAgICAvLyBpZiBubyBmaWxlcyBpbiBhcnJheSwgYmUgc3VyZSBicm93c2VyIGRvZXMgbm90IHByZXZlbnQgcmVzZWxlY3Qgb2Ygc2FtZSBmaWxlIChzZWUgZ2l0aHViIGlzc3VlIDI3KVxuICAgIHRoaXMuY2xlYXJGaWxlRWxtVmFsdWUoKVxuICB9XG5cbiAgY2xlYXJGaWxlRWxtVmFsdWUoKSB7XG4gICAgaWYgKCF0aGlzLmZpbGVFbG0pIHJldHVyblxuXG4gICAgdGhpcy5maWxlRWxtLnZhbHVlID0gbnVsbFxuICB9XG5cbiAgaXNFbXB0eUFmdGVyU2VsZWN0aW9uKCk6Ym9vbGVhbiB7XG4gICAgcmV0dXJuICEhdGhpcy5lbGVtZW50Lm5hdGl2ZUVsZW1lbnQuYXR0cmlidXRlcy5tdWx0aXBsZTtcbiAgfVxuXG4gIHN0b3BFdmVudChldmVudDphbnkpOmFueSB7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgfVxuXG4gIHRyYW5zZmVySGFzRmlsZXModHJhbnNmZXI6YW55KTphbnkge1xuICAgIGlmICghdHJhbnNmZXIudHlwZXMpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBpZiAodHJhbnNmZXIudHlwZXMuaW5kZXhPZikge1xuICAgICAgcmV0dXJuIHRyYW5zZmVyLnR5cGVzLmluZGV4T2YoJ0ZpbGVzJykgIT09IC0xO1xuICAgIH0gZWxzZSBpZiAodHJhbnNmZXIudHlwZXMuY29udGFpbnMpIHtcbiAgICAgIHJldHVybiB0cmFuc2Zlci50eXBlcy5jb250YWlucygnRmlsZXMnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIGV2ZW50VG9GaWxlcyhldmVudDpFdmVudCl7XG4gICAgY29uc3QgdHJhbnNmZXIgPSBldmVudFRvVHJhbnNmZXIoZXZlbnQpO1xuICAgIGlmKCB0cmFuc2ZlciApe1xuICAgICAgaWYodHJhbnNmZXIuZmlsZXMgJiYgdHJhbnNmZXIuZmlsZXMubGVuZ3RoKXtcbiAgICAgICAgcmV0dXJuIHRyYW5zZmVyLmZpbGVzXG4gICAgICB9XG4gICAgICBpZih0cmFuc2Zlci5pdGVtcyAmJiB0cmFuc2Zlci5pdGVtcy5sZW5ndGgpe1xuICAgICAgICByZXR1cm4gdHJhbnNmZXIuaXRlbXNcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIFtdXG4gIH1cblxuICBhcHBseUV4aWZSb3RhdGlvbnMoXG4gICAgZmlsZXM6RmlsZVtdXG4gICk6UHJvbWlzZTxGaWxlW10+e1xuICAgIGNvbnN0IG1hcHBlciA9IChcbiAgICAgIGZpbGU6RmlsZSxpbmRleDpudW1iZXJcbiAgICApOlByb21pc2U8YW55Pj0+e1xuICAgICAgcmV0dXJuIGFwcGx5RXhpZlJvdGF0aW9uKGZpbGUpXG4gICAgICAudGhlbiggZml4ZWRGaWxlPT5maWxlcy5zcGxpY2UoaW5kZXgsIDEsIGZpeGVkRmlsZSkgKVxuICAgIH1cblxuICAgIGNvbnN0IHByb21zOlByb21pc2U8YW55PltdID0gW11cbiAgICBmb3IobGV0IHg9ZmlsZXMubGVuZ3RoLTE7IHggPj0gMDsgLS14KXtcbiAgICAgIHByb21zW3hdID0gbWFwcGVyKCBmaWxlc1t4XSwgeCApXG4gICAgfVxuICAgIHJldHVybiBQcm9taXNlLmFsbCggcHJvbXMgKS50aGVuKCAoKT0+ZmlsZXMgKVxuICB9XG5cbiAgQEhvc3RMaXN0ZW5lcignY2hhbmdlJywgWyckZXZlbnQnXSlcbiAgb25DaGFuZ2UoZXZlbnQ6RXZlbnQpOnZvaWQge1xuICAgIGxldCBmaWxlcyA9IHRoaXMuZWxlbWVudC5uYXRpdmVFbGVtZW50LmZpbGVzIHx8IHRoaXMuZXZlbnRUb0ZpbGVzKGV2ZW50KVxuXG4gICAgaWYoIWZpbGVzLmxlbmd0aClyZXR1cm5cblxuICAgIHRoaXMuc3RvcEV2ZW50KGV2ZW50KTtcbiAgICB0aGlzLmhhbmRsZUZpbGVzKGZpbGVzKVxuICB9XG5cbiAgZ2V0RmlsZUZpbHRlckZhaWxOYW1lKFxuICAgIGZpbGU6RmlsZVxuICApOnN0cmluZyB8IHVuZGVmaW5lZHtcbiAgICBmb3IobGV0IGkgPSAwOyBpIDwgdGhpcy5maWx0ZXJzLmxlbmd0aDsgaSsrKXtcbiAgICAgIGlmKCAhdGhpcy5maWx0ZXJzW2ldLmZuLmNhbGwodGhpcywgZmlsZSkgKXtcbiAgICAgICAgcmV0dXJuIHRoaXMuZmlsdGVyc1tpXS5uYW1lXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB1bmRlZmluZWRcbiAgfVxuXG4gIGlzRmlsZVZhbGlkKGZpbGU6RmlsZSk6Ym9vbGVhbntcbiAgICBjb25zdCBub0ZpbHRlcnMgPSAhdGhpcy5hY2NlcHQgJiYgKCF0aGlzLmZpbHRlcnMgfHwgIXRoaXMuZmlsdGVycy5sZW5ndGgpXG4gICAgaWYoIG5vRmlsdGVycyApe1xuICAgICAgcmV0dXJuIHRydWUvL3dlIGhhdmUgbm8gZmlsdGVycyBzbyBhbGwgZmlsZXMgYXJlIHZhbGlkXG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuZ2V0RmlsZUZpbHRlckZhaWxOYW1lKGZpbGUpID8gZmFsc2UgOiB0cnVlXG4gIH1cblxuICBpc0ZpbGVzVmFsaWQoZmlsZXM6RmlsZVtdKXtcbiAgICBmb3IobGV0IHg9ZmlsZXMubGVuZ3RoLTE7IHggPj0gMDsgLS14KXtcbiAgICAgIGlmKCAhdGhpcy5pc0ZpbGVWYWxpZChmaWxlc1t4XSkgKXtcbiAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0cnVlXG4gIH1cblxuICBwcm90ZWN0ZWQgX2FjY2VwdEZpbHRlcihpdGVtOkZpbGUpOmJvb2xlYW4ge1xuICAgIHJldHVybiBhY2NlcHRUeXBlKHRoaXMuYWNjZXB0LCBpdGVtLnR5cGUsIGl0ZW0ubmFtZSlcbiAgfVxuXG4gIHByb3RlY3RlZCBfZmlsZVNpemVGaWx0ZXIoaXRlbTpGaWxlKTpib29sZWFuIHtcbiAgICByZXR1cm4gISh0aGlzLm1heFNpemUgJiYgaXRlbS5zaXplID4gdGhpcy5tYXhTaXplKTtcbiAgfVxufVxuXG5cbi8qKiBicm93c2VycyB0cnkgaGFyZCB0byBjb25jZWFsIGRhdGEgYWJvdXQgZmlsZSBkcmFncywgdGhpcyB0ZW5kcyB0byB1bmRvIHRoYXQgKi9cbmV4cG9ydCBmdW5jdGlvbiBmaWxlc1RvV3JpdGVhYmxlT2JqZWN0KCBmaWxlczpGaWxlW10gKTpkcmFnTWV0YVtde1xuICBjb25zdCBqc29uRmlsZXM6ZHJhZ01ldGFbXSA9IFtdXG4gIGZvcihsZXQgeD0wOyB4IDwgZmlsZXMubGVuZ3RoOyArK3gpe1xuICAgIGpzb25GaWxlcy5wdXNoKHtcbiAgICAgIHR5cGU6ZmlsZXNbeF0udHlwZSxcbiAgICAgIGtpbmQ6ZmlsZXNbeF1bXCJraW5kXCJdXG4gICAgfSlcbiAgfVxuICByZXR1cm4ganNvbkZpbGVzXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBldmVudFRvVHJhbnNmZXIoZXZlbnQ6IGFueSk6IFRyYW5zZmVyT2JqZWN0IHtcbiAgaWYoZXZlbnQuZGF0YVRyYW5zZmVyKXJldHVybiBldmVudC5kYXRhVHJhbnNmZXJcbiAgcmV0dXJuICBldmVudC5vcmlnaW5hbEV2ZW50ID8gZXZlbnQub3JpZ2luYWxFdmVudC5kYXRhVHJhbnNmZXIgOiBudWxsXG59XG5cblxuaW50ZXJmYWNlIFRyYW5zZmVyT2JqZWN0IHtcbiAgaXRlbXM/OiBhbnlbXVxuICBmaWxlcz86IGFueVtdXG4gIGRyb3BFZmZlY3Q/OiAnY29weScgLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0RhdGFUcmFuc2Zlci9kcm9wRWZmZWN0XG59XG4iXX0= -------------------------------------------------------------------------------- /esm2020/src/file-upload/ngf.module.mjs: -------------------------------------------------------------------------------- 1 | import { CommonModule } from '@angular/common'; 2 | import { NgModule } from '@angular/core'; 3 | import { ngfBackground } from './ngfBackground.directive'; 4 | import { ngfDrop } from './ngfDrop.directive'; 5 | import { ngf } from './ngf.directive'; 6 | import { ngfSelect } from './ngfSelect.directive'; 7 | import { ngfUploadStatus } from './ngfUploadStatus.directive'; 8 | import { ngfFormData } from './ngfFormData.directive'; 9 | import { ngfSrc } from './ngfSrc.directive'; 10 | import * as i0 from "@angular/core"; 11 | //import{ HttpModule } from '@angular/http'; 12 | const declarations = [ 13 | ngfDrop, 14 | ngfSelect, 15 | ngfBackground, 16 | ngfSrc, 17 | ngfUploadStatus, 18 | ngfFormData, 19 | ngf 20 | ]; 21 | export class ngfModule { 22 | } 23 | ngfModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: ngfModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); 24 | ngfModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "14.3.0", ngImport: i0, type: ngfModule, declarations: [ngfDrop, 25 | ngfSelect, 26 | ngfBackground, 27 | ngfSrc, 28 | ngfUploadStatus, 29 | ngfFormData, 30 | ngf], imports: [CommonModule 31 | //,HttpModule 32 | ], exports: [ngfDrop, 33 | ngfSelect, 34 | ngfBackground, 35 | ngfSrc, 36 | ngfUploadStatus, 37 | ngfFormData, 38 | ngf] }); 39 | ngfModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: ngfModule, imports: [CommonModule 40 | //,HttpModule 41 | ] }); 42 | i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: ngfModule, decorators: [{ 43 | type: NgModule, 44 | args: [{ 45 | imports: [ 46 | CommonModule 47 | //,HttpModule 48 | ], 49 | declarations: declarations, 50 | exports: declarations //[HttpModule, ...declarations] 51 | }] 52 | }] }); 53 | //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmdmLm1vZHVsZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9maWxlLXVwbG9hZC9uZ2YubW9kdWxlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRXpDLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUMxRCxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDOUMsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3RDLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUNsRCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDOUQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ3RELE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQzs7QUFDNUMsNENBQTRDO0FBRTVDLE1BQU0sWUFBWSxHQUFHO0lBQ25CLE9BQU87SUFDUCxTQUFTO0lBQ1QsYUFBYTtJQUNiLE1BQU07SUFDTixlQUFlO0lBQ2YsV0FBVztJQUNYLEdBQUc7Q0FDSixDQUFBO0FBU0UsTUFBTSxPQUFPLFNBQVM7O3NHQUFULFNBQVM7dUdBQVQsU0FBUyxpQkFoQnZCLE9BQU87UUFDUCxTQUFTO1FBQ1QsYUFBYTtRQUNiLE1BQU07UUFDTixlQUFlO1FBQ2YsV0FBVztRQUNYLEdBQUcsYUFLRCxZQUFZO1FBQ1osYUFBYTtpQkFaZixPQUFPO1FBQ1AsU0FBUztRQUNULGFBQWE7UUFDYixNQUFNO1FBQ04sZUFBZTtRQUNmLFdBQVc7UUFDWCxHQUFHO3VHQVVXLFNBQVMsWUFMckIsWUFBWTtRQUNaLGFBQWE7OzJGQUlELFNBQVM7a0JBUHhCLFFBQVE7bUJBQUM7b0JBQ1IsT0FBTyxFQUFFO3dCQUNQLFlBQVk7d0JBQ1osYUFBYTtxQkFDZDtvQkFDRCxZQUFZLEVBQUUsWUFBWTtvQkFDMUIsT0FBTyxFQUFFLFlBQVksQ0FBQSwrQkFBK0I7aUJBQ3JEIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IE5nTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCB7IG5nZkJhY2tncm91bmQgfSBmcm9tICcuL25nZkJhY2tncm91bmQuZGlyZWN0aXZlJztcbmltcG9ydCB7IG5nZkRyb3AgfSBmcm9tICcuL25nZkRyb3AuZGlyZWN0aXZlJztcbmltcG9ydCB7IG5nZiB9IGZyb20gJy4vbmdmLmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBuZ2ZTZWxlY3QgfSBmcm9tICcuL25nZlNlbGVjdC5kaXJlY3RpdmUnO1xuaW1wb3J0IHsgbmdmVXBsb2FkU3RhdHVzIH0gZnJvbSAnLi9uZ2ZVcGxvYWRTdGF0dXMuZGlyZWN0aXZlJztcbmltcG9ydCB7IG5nZkZvcm1EYXRhIH0gZnJvbSAnLi9uZ2ZGb3JtRGF0YS5kaXJlY3RpdmUnO1xuaW1wb3J0IHsgbmdmU3JjIH0gZnJvbSAnLi9uZ2ZTcmMuZGlyZWN0aXZlJztcbi8vaW1wb3J0eyBIdHRwTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvaHR0cCc7XG5cbmNvbnN0IGRlY2xhcmF0aW9ucyA9IFtcbiAgbmdmRHJvcCxcbiAgbmdmU2VsZWN0LFxuICBuZ2ZCYWNrZ3JvdW5kLFxuICBuZ2ZTcmMsXG4gIG5nZlVwbG9hZFN0YXR1cyxcbiAgbmdmRm9ybURhdGEsXG4gIG5nZlxuXVxuXG5ATmdNb2R1bGUoe1xuICBpbXBvcnRzOiBbXG4gICAgQ29tbW9uTW9kdWxlXG4gICAgLy8sSHR0cE1vZHVsZVxuICBdLFxuICBkZWNsYXJhdGlvbnM6IGRlY2xhcmF0aW9ucyxcbiAgZXhwb3J0czogZGVjbGFyYXRpb25zLy9bSHR0cE1vZHVsZSwgLi4uZGVjbGFyYXRpb25zXVxufSkgZXhwb3J0IGNsYXNzIG5nZk1vZHVsZSB7fSJdfQ== -------------------------------------------------------------------------------- /esm2020/src/file-upload/ngfBackground.directive.mjs: -------------------------------------------------------------------------------- 1 | import { Directive, Input } from '@angular/core'; 2 | import { dataUrl } from './fileTools'; 3 | import * as i0 from "@angular/core"; 4 | export class ngfBackground { 5 | constructor(ElementRef) { 6 | this.ElementRef = ElementRef; 7 | } 8 | ngOnChanges(_changes) { 9 | dataUrl(this.file) 10 | .then(src => { 11 | const urlString = 'url(\'' + (src || '') + '\')'; 12 | this.ElementRef.nativeElement.style.backgroundImage = urlString; 13 | }); 14 | } 15 | } 16 | ngfBackground.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: ngfBackground, deps: [{ token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Directive }); 17 | ngfBackground.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "14.3.0", type: ngfBackground, selector: "[ngfBackground]", inputs: { file: ["ngfBackground", "file"] }, usesOnChanges: true, ngImport: i0 }); 18 | i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: ngfBackground, decorators: [{ 19 | type: Directive, 20 | args: [{ selector: '[ngfBackground]' }] 21 | }], ctorParameters: function () { return [{ type: i0.ElementRef }]; }, propDecorators: { file: [{ 22 | type: Input, 23 | args: ['ngfBackground'] 24 | }] } }); 25 | //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmdmQmFja2dyb3VuZC5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvZmlsZS11cGxvYWQvbmdmQmFja2dyb3VuZC5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBYyxLQUFLLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDN0QsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLGFBQWEsQ0FBQzs7QUFHdEMsTUFBTSxPQUFPLGFBQWE7SUFHeEIsWUFBbUIsVUFBcUI7UUFBckIsZUFBVSxHQUFWLFVBQVUsQ0FBVztJQUFFLENBQUM7SUFFM0MsV0FBVyxDQUFFLFFBQVk7UUFDdkIsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUM7YUFDakIsSUFBSSxDQUFDLEdBQUcsQ0FBQSxFQUFFO1lBQ1QsTUFBTSxTQUFTLEdBQUcsUUFBUSxHQUFHLENBQUMsR0FBRyxJQUFJLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQTtZQUNoRCxJQUFJLENBQUMsVUFBVSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsZUFBZSxHQUFHLFNBQVMsQ0FBQTtRQUNqRSxDQUFDLENBQUMsQ0FBQTtJQUNKLENBQUM7OzBHQVhVLGFBQWE7OEZBQWIsYUFBYTsyRkFBYixhQUFhO2tCQUR6QixTQUFTO21CQUFDLEVBQUMsUUFBUSxFQUFFLGlCQUFpQixFQUFDO2lHQUVkLElBQUk7c0JBQTNCLEtBQUs7dUJBQUMsZUFBZSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IERpcmVjdGl2ZSwgRWxlbWVudFJlZiwgSW5wdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IGRhdGFVcmwgfSBmcm9tICcuL2ZpbGVUb29scyc7XG5cbkBEaXJlY3RpdmUoe3NlbGVjdG9yOiAnW25nZkJhY2tncm91bmRdJ30pXG5leHBvcnQgY2xhc3MgbmdmQmFja2dyb3VuZCB7XG4gIEBJbnB1dCgnbmdmQmFja2dyb3VuZCcpIGZpbGU6YW55XG5cbiAgY29uc3RydWN0b3IocHVibGljIEVsZW1lbnRSZWY6RWxlbWVudFJlZil7fVxuXG4gIG5nT25DaGFuZ2VzKCBfY2hhbmdlczphbnkgKXtcbiAgICBkYXRhVXJsKHRoaXMuZmlsZSlcbiAgICAudGhlbihzcmM9PntcbiAgICAgIGNvbnN0IHVybFN0cmluZyA9ICd1cmwoXFwnJyArIChzcmMgfHwgJycpICsgJ1xcJyknXG4gICAgICB0aGlzLkVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5zdHlsZS5iYWNrZ3JvdW5kSW1hZ2UgPSB1cmxTdHJpbmdcbiAgICB9KVxuICB9XG59XG4iXX0= -------------------------------------------------------------------------------- /esm2020/src/file-upload/ngfDrop.directive.mjs: -------------------------------------------------------------------------------- 1 | import { Directive, EventEmitter, HostListener, Input, Output } from '@angular/core'; 2 | import { ngf, eventToTransfer, filesToWriteableObject } from "./ngf.directive"; 3 | import * as i0 from "@angular/core"; 4 | export class ngfDrop extends ngf { 5 | constructor() { 6 | super(...arguments); 7 | this.fileOver = new EventEmitter(); 8 | this.validDrag = false; 9 | this.validDragChange = new EventEmitter(); 10 | this.invalidDrag = false; 11 | this.invalidDragChange = new EventEmitter(); 12 | this.dragFilesChange = new EventEmitter(); 13 | } 14 | onDrop(event) { 15 | if (this.fileDropDisabled) { 16 | this.stopEvent(event); 17 | return; 18 | } 19 | this.closeDrags(); 20 | let files = this.eventToFiles(event); 21 | if (!files.length) 22 | return; 23 | this.stopEvent(event); 24 | this.handleFiles(files); 25 | } 26 | handleFiles(files) { 27 | this.fileOver.emit(false); //turn-off dragover 28 | super.handleFiles(files); 29 | } 30 | onDragOver(event) { 31 | if (this.fileDropDisabled) { 32 | this.stopEvent(event); 33 | return; 34 | } 35 | const transfer = eventToTransfer(event); 36 | let files = this.eventToFiles(event); 37 | let jsonFiles = filesToWriteableObject(files); 38 | this.dragFilesChange.emit(this.dragFiles = jsonFiles); 39 | if (files.length) { 40 | this.validDrag = this.isFilesValid(files); 41 | } 42 | else { 43 | //Safari, IE11 & some browsers do NOT tell you about dragged files until dropped. Always consider a valid drag 44 | this.validDrag = true; 45 | } 46 | this.validDragChange.emit(this.validDrag); 47 | this.invalidDrag = !this.validDrag; 48 | this.invalidDragChange.emit(this.invalidDrag); 49 | transfer.dropEffect = 'copy'; // change cursor and visual display 50 | this.stopEvent(event); 51 | this.fileOver.emit(true); 52 | } 53 | closeDrags() { 54 | delete this.validDrag; 55 | this.validDragChange.emit(this.validDrag); 56 | this.invalidDrag = false; 57 | this.invalidDragChange.emit(this.invalidDrag); 58 | delete this.dragFiles; 59 | this.dragFilesChange.emit(this.dragFiles); 60 | } 61 | onDragLeave(event) { 62 | if (this.fileDropDisabled) { 63 | this.stopEvent(event); 64 | return; 65 | } 66 | this.closeDrags(); 67 | if (this.element) { 68 | if (event.currentTarget === this.element[0]) { 69 | return; 70 | } 71 | } 72 | this.stopEvent(event); 73 | this.fileOver.emit(false); 74 | } 75 | } 76 | ngfDrop.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: ngfDrop, deps: null, target: i0.ɵɵFactoryTarget.Directive }); 77 | ngfDrop.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "14.3.0", type: ngfDrop, selector: "[ngfDrop]", inputs: { validDrag: "validDrag", invalidDrag: "invalidDrag", dragFiles: "dragFiles" }, outputs: { fileOver: "fileOver", validDragChange: "validDragChange", invalidDragChange: "invalidDragChange", dragFilesChange: "dragFilesChange" }, host: { listeners: { "drop": "onDrop($event)", "dragover": "onDragOver($event)", "dragleave": "onDragLeave($event)" } }, exportAs: ["ngfDrop"], usesInheritance: true, ngImport: i0 }); 78 | i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: ngfDrop, decorators: [{ 79 | type: Directive, 80 | args: [{ 81 | selector: "[ngfDrop]", 82 | exportAs: "ngfDrop" 83 | }] 84 | }], propDecorators: { fileOver: [{ 85 | type: Output 86 | }], validDrag: [{ 87 | type: Input 88 | }], validDragChange: [{ 89 | type: Output 90 | }], invalidDrag: [{ 91 | type: Input 92 | }], invalidDragChange: [{ 93 | type: Output 94 | }], dragFiles: [{ 95 | type: Input 96 | }], dragFilesChange: [{ 97 | type: Output 98 | }], onDrop: [{ 99 | type: HostListener, 100 | args: ['drop', ['$event']] 101 | }], onDragOver: [{ 102 | type: HostListener, 103 | args: ['dragover', ['$event']] 104 | }], onDragLeave: [{ 105 | type: HostListener, 106 | args: ['dragleave', ['$event']] 107 | }] } }); 108 | //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmdmRHJvcC5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvZmlsZS11cGxvYWQvbmdmRHJvcC5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLFNBQVMsRUFBRSxZQUFZLEVBQ3ZCLFlBQVksRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUM1QixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsR0FBRyxFQUFZLGVBQWUsRUFBRSxzQkFBc0IsRUFBRSxNQUFNLGlCQUFpQixDQUFBOztBQU14RixNQUFNLE9BQU8sT0FBUSxTQUFRLEdBQUc7SUFKaEM7O1FBS1ksYUFBUSxHQUFxQixJQUFJLFlBQVksRUFBRSxDQUFDO1FBRWpELGNBQVMsR0FBVyxLQUFLLENBQUE7UUFDeEIsb0JBQWUsR0FBeUIsSUFBSSxZQUFZLEVBQUUsQ0FBQTtRQUUzRCxnQkFBVyxHQUFHLEtBQUssQ0FBQTtRQUNsQixzQkFBaUIsR0FBeUIsSUFBSSxZQUFZLEVBQUUsQ0FBQTtRQUc1RCxvQkFBZSxHQUE0QixJQUFJLFlBQVksRUFBRSxDQUFBO0tBaUZ4RTtJQTlFQyxNQUFNLENBQUMsS0FBVztRQUNoQixJQUFHLElBQUksQ0FBQyxnQkFBZ0IsRUFBQztZQUN2QixJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ3RCLE9BQU07U0FDUDtRQUVELElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQTtRQUNqQixJQUFJLEtBQUssR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFBO1FBRXBDLElBQUcsQ0FBQyxLQUFLLENBQUMsTUFBTTtZQUFDLE9BQU07UUFFdkIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN0QixJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFBO0lBQ3pCLENBQUM7SUFFRCxXQUFXLENBQUMsS0FBWTtRQUN0QixJ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QUFNO2dCQUVFLFNBQVM7c0JBQWpCLEtBQUs7Z0JBQ0ksZUFBZTtzQkFBeEIsTUFBTTtnQkFHUCxNQUFNO3NCQURMLFlBQVk7dUJBQUMsTUFBTSxFQUFFLENBQUMsUUFBUSxDQUFDO2dCQXNCaEMsVUFBVTtzQkFEVCxZQUFZO3VCQUFDLFVBQVUsRUFBRSxDQUFDLFFBQVEsQ0FBQztnQkF5Q3BDLFdBQVc7c0JBRFYsWUFBWTt1QkFBQyxXQUFXLEVBQUUsQ0FBQyxRQUFRLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBEaXJlY3RpdmUsIEV2ZW50RW1pdHRlcixcbiAgSG9zdExpc3RlbmVyLCBJbnB1dCwgT3V0cHV0XG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgbmdmLCBkcmFnTWV0YSwgZXZlbnRUb1RyYW5zZmVyLCBmaWxlc1RvV3JpdGVhYmxlT2JqZWN0IH0gZnJvbSBcIi4vbmdmLmRpcmVjdGl2ZVwiXG5cbkBEaXJlY3RpdmUoe1xuICBzZWxlY3RvcjogXCJbbmdmRHJvcF1cIixcbiAgZXhwb3J0QXM6IFwibmdmRHJvcFwiXG59KVxuZXhwb3J0IGNsYXNzIG5nZkRyb3AgZXh0ZW5kcyBuZ2Yge1xuICBAT3V0cHV0KCkgZmlsZU92ZXI6RXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbiAgQElucHV0KCkgdmFsaWREcmFnOmJvb2xlYW4gPSBmYWxzZVxuICBAT3V0cHV0KCkgdmFsaWREcmFnQ2hhbmdlOkV2ZW50RW1pdHRlcjxib29sZWFuPiA9IG5ldyBFdmVudEVtaXR0ZXIoKVxuXG4gIEBJbnB1dCgpIGludmFsaWREcmFnID0gZmFsc2VcbiAgQE91dHB1dCgpIGludmFsaWREcmFnQ2hhbmdlOkV2ZW50RW1pdHRlcjxib29sZWFuPiA9IG5ldyBFdmVudEVtaXR0ZXIoKVxuXG4gIEBJbnB1dCgpIGRyYWdGaWxlcyAhOiBkcmFnTWV0YVtdXG4gIEBPdXRwdXQoKSBkcmFnRmlsZXNDaGFuZ2U6RXZlbnRFbWl0dGVyPGRyYWdNZXRhW10+ID0gbmV3IEV2ZW50RW1pdHRlcigpXG5cbiAgQEhvc3RMaXN0ZW5lcignZHJvcCcsIFsnJGV2ZW50J10pXG4gIG9uRHJvcChldmVudDpFdmVudCk6dm9pZCB7XG4gICAgaWYodGhpcy5maWxlRHJvcERpc2FibGVkKXtcbiAgICAgIHRoaXMuc3RvcEV2ZW50KGV2ZW50KTtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIHRoaXMuY2xvc2VEcmFncygpXG4gICAgbGV0IGZpbGVzID0gdGhpcy5ldmVudFRvRmlsZXMoZXZlbnQpXG5cbiAgICBpZighZmlsZXMubGVuZ3RoKXJldHVyblxuXG4gICAgdGhpcy5zdG9wRXZlbnQoZXZlbnQpO1xuICAgIHRoaXMuaGFuZGxlRmlsZXMoZmlsZXMpXG4gIH1cblxuICBoYW5kbGVGaWxlcyhmaWxlczpGaWxlW10pe1xuICAgIHRoaXMuZmlsZU92ZXIuZW1pdChmYWxzZSkvL3R1cm4tb2ZmIGRyYWdvdmVyXG4gICAgc3VwZXIuaGFuZGxlRmlsZXMoZmlsZXMpXG4gIH1cblxuICBASG9zdExpc3RlbmVyKCdkcmFnb3ZlcicsIFsnJGV2ZW50J10pXG4gIG9uRHJhZ092ZXIoZXZlbnQ6RXZlbnQpOnZvaWQge1xuICAgIGlmKHRoaXMuZmlsZURyb3BEaXNhYmxlZCl7XG4gICAgICB0aGlzLnN0b3BFdmVudChldmVudCk7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCB0cmFuc2ZlciA9IGV2ZW50VG9UcmFuc2ZlcihldmVudClcblxuICAgIGxldCBmaWxlcyA9IHRoaXMuZXZlbnRUb0ZpbGVzKGV2ZW50KVxuXG4gICAgbGV0IGpzb25GaWxlcyA9IGZpbGVzVG9Xcml0ZWFibGVPYmplY3QoZmlsZXMpXG4gICAgdGhpcy5kcmFnRmlsZXNDaGFuZ2UuZW1pdCggdGhpcy5kcmFnRmlsZXM9anNvbkZpbGVzIClcblxuICAgIGlmKCBmaWxlcy5sZW5ndGggKXtcbiAgICAgIHRoaXMudmFsaWREcmFnID0gdGhpcy5pc0ZpbGVzVmFsaWQoZmlsZXMpXG4gICAgfWVsc2V7XG4gICAgICAvL1NhZmFyaSwgSUUxMSAmIHNvbWUgYnJvd3NlcnMgZG8gTk9UIHRlbGwgeW91IGFib3V0IGRyYWdnZWQgZmlsZXMgdW50aWwgZHJvcHBlZC4gQWx3YXlzIGNvbnNpZGVyIGEgdmFsaWQgZHJhZ1xuICAgICAgdGhpcy52YWxpZERyYWcgPSB0cnVlXG4gICAgfVxuXG4gICAgdGhpcy52YWxpZERyYWdDaGFuZ2UuZW1pdCh0aGlzLnZhbGlkRHJhZylcblxuICAgIHRoaXMuaW52YWxpZERyYWcgPSAhdGhpcy52YWxpZERyYWdcbiAgICB0aGlzLmludmFsaWREcmFnQ2hhbmdlLmVtaXQodGhpcy5pbnZhbGlkRHJhZylcblxuICAgIHRyYW5zZmVyLmRyb3BFZmZlY3QgPSAnY29weScgLy8gY2hhbmdlIGN1cnNvciBhbmQgdmlzdWFsIGRpc3BsYXlcbiAgICB0aGlzLnN0b3BFdmVudChldmVudClcbiAgICB0aGlzLmZpbGVPdmVyLmVtaXQodHJ1ZSlcbiAgfVxuXG4gIGNsb3NlRHJhZ3MoKXtcbiAgICBkZWxldGUgdGhpcy52YWxpZERyYWdcbiAgICB0aGlzLnZhbGlkRHJhZ0NoYW5nZS5lbWl0KHRoaXMudmFsaWREcmFnKVxuICAgIHRoaXMuaW52YWxpZERyYWcgPSBmYWxzZVxuICAgIHRoaXMuaW52YWxpZERyYWdDaGFuZ2UuZW1pdCh0aGlzLmludmFsaWREcmFnKVxuICAgIGRlbGV0ZSB0aGlzLmRyYWdGaWxlc1xuICAgIHRoaXMuZHJhZ0ZpbGVzQ2hhbmdlLmVtaXQoIHRoaXMuZHJhZ0ZpbGVzIClcbiAgfVxuXG4gIEBIb3N0TGlzdGVuZXIoJ2RyYWdsZWF2ZScsIFsnJGV2ZW50J10pXG4gIG9uRHJhZ0xlYXZlKGV2ZW50OkV2ZW50KTphbnkge1xuICAgIGlmKHRoaXMuZmlsZURyb3BEaXNhYmxlZCl7XG4gICAgICB0aGlzLnN0b3BFdmVudChldmVudCk7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICB0aGlzLmNsb3NlRHJhZ3MoKVxuXG4gICAgaWYgKCh0aGlzIGFzIGFueSkuZWxlbWVudCkge1xuICAgICAgaWYgKGV2ZW50LmN1cnJlbnRUYXJnZXQgPT09ICh0aGlzIGFzIGFueSkuZWxlbWVudFswXSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5zdG9wRXZlbnQoZXZlbnQpO1xuICAgIHRoaXMuZmlsZU92ZXIuZW1pdChmYWxzZSk7XG4gIH1cbn0iXX0= -------------------------------------------------------------------------------- /esm2020/src/file-upload/ngfFormData.directive.mjs: -------------------------------------------------------------------------------- 1 | import { Directive, EventEmitter, Output, Input } from '@angular/core'; 2 | import * as i0 from "@angular/core"; 3 | export class ngfFormData { 4 | constructor(IterableDiffers) { 5 | this.postName = "file"; 6 | this.FormData = new FormData(); 7 | this.FormDataChange = new EventEmitter(); 8 | this.differ = IterableDiffers.find([]).create(); 9 | } 10 | ngDoCheck() { 11 | var changes = this.differ.diff(this.files); 12 | if (changes) { 13 | setTimeout(() => this.buildFormData(), 0); 14 | } 15 | } 16 | buildFormData() { 17 | const isArray = typeof (this.files) === 'object' && this.files.constructor === Array; 18 | if (isArray) { 19 | this.FormData = new FormData(); 20 | const files = this.files || []; 21 | files.forEach(file => this.FormData.append(this.postName, file, this.fileName || file.name)); 22 | this.FormDataChange.emit(this.FormData); 23 | } 24 | else { 25 | delete this.FormData; 26 | } 27 | } 28 | } 29 | ngfFormData.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: ngfFormData, deps: [{ token: i0.IterableDiffers }], target: i0.ɵɵFactoryTarget.Directive }); 30 | ngfFormData.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "14.3.0", type: ngfFormData, selector: "ngfFormData", inputs: { files: "files", postName: "postName", fileName: "fileName", FormData: "FormData" }, outputs: { FormDataChange: "FormDataChange" }, ngImport: i0 }); 31 | i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: ngfFormData, decorators: [{ 32 | type: Directive, 33 | args: [{ selector: 'ngfFormData' }] 34 | }], ctorParameters: function () { return [{ type: i0.IterableDiffers }]; }, propDecorators: { files: [{ 35 | type: Input 36 | }], postName: [{ 37 | type: Input 38 | }], fileName: [{ 39 | type: Input 40 | }], FormData: [{ 41 | type: Input 42 | }], FormDataChange: [{ 43 | type: Output 44 | }] } }); 45 | //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmdmRm9ybURhdGEuZGlyZWN0aXZlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2ZpbGUtdXBsb2FkL25nZkZvcm1EYXRhLmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBR0wsU0FBUyxFQUFFLFlBQVksRUFDdkIsTUFBTSxFQUFFLEtBQUssRUFDZCxNQUFNLGVBQWUsQ0FBQzs7QUFHdkIsTUFBTSxPQUFPLFdBQVc7SUFVdEIsWUFBWSxlQUFnQztRQVJuQyxhQUFRLEdBQVUsTUFBTSxDQUFBO1FBR3hCLGFBQVEsR0FBWSxJQUFJLFFBQVEsRUFBRSxDQUFBO1FBQ2pDLG1CQUFjLEdBQTBCLElBQUksWUFBWSxFQUFFLENBQUE7UUFLbEUsSUFBSSxDQUFDLE1BQU0sR0FBRyxlQUFlLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFBO0lBQ2pELENBQUM7SUFFRCxTQUFTO1FBQ1AsSUFBSSxPQUFPLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUUsSUFBSSxDQUFDLEtBQUssQ0FBRSxDQUFDO1FBRTdDLElBQUksT0FBTyxFQUFFO1lBQ1gsVUFBVSxDQUFDLEdBQUUsRUFBRSxDQUFBLElBQUksQ0FBQyxhQUFhLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQTtTQUN4QztJQUNILENBQUM7SUFFRCxhQUFhO1FBQ1gsTUFBTSxPQUFPLEdBQUcsT0FBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBRyxRQUFRLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxXQUFXLEtBQUcsS0FBSyxDQUFBO1FBRS9FLElBQUksT0FBTyxFQUFFO1lBQ1gsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLFFBQVEsRUFBRSxDQUFBO1lBQzlCLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLElBQUksRUFBRSxDQUFBO1lBQzlCLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFBLEVBQUUsQ0FDbEIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLFFBQVEsSUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQ3BFLENBQUE7WUFDRCxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBRSxJQUFJLENBQUMsUUFBUSxDQUFFLENBQUE7U0FDMUM7YUFBSTtZQUNILE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQTtTQUNyQjtJQUNILENBQUM7O3dHQW5DVSxXQUFXOzRGQUFYLFdBQVc7MkZBQVgsV0FBVztrQkFEdkIsU0FBUzttQkFBQyxFQUFDLFFBQVEsRUFBRSxhQUFhLEVBQUM7c0dBRXpCLEtBQUs7c0JBQWIsS0FBSztnQkFDRyxRQUFRO3NCQUFoQixLQUFLO2dCQUNHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBRUcsUUFBUTtzQkFBaEIsS0FBSztnQkFDSSxjQUFjO3NCQUF2QixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgSXRlcmFibGVEaWZmZXIsXG4gIEl0ZXJhYmxlRGlmZmVycyxcbiAgRGlyZWN0aXZlLCBFdmVudEVtaXR0ZXIsXG4gIE91dHB1dCwgSW5wdXRcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbkBEaXJlY3RpdmUoe3NlbGVjdG9yOiAnbmdmRm9ybURhdGEnfSlcbmV4cG9ydCBjbGFzcyBuZ2ZGb3JtRGF0YSB7XG4gIEBJbnB1dCgpIGZpbGVzICE6IEZpbGVbXVxuICBASW5wdXQoKSBwb3N0TmFtZTpzdHJpbmcgPSBcImZpbGVcIlxuICBASW5wdXQoKSBmaWxlTmFtZSAhOiBzdHJpbmcvL2ZvcmNlIGZpbGUgbmFtZVxuXG4gIEBJbnB1dCgpIEZvcm1EYXRhOkZvcm1EYXRhID0gbmV3IEZvcm1EYXRhKClcbiAgQE91dHB1dCgpIEZvcm1EYXRhQ2hhbmdlOkV2ZW50RW1pdHRlcjxGb3JtRGF0YT4gPSBuZXcgRXZlbnRFbWl0dGVyKClcblxuICBkaWZmZXI6SXRlcmFibGVEaWZmZXI8e30+XG5cbiAgY29uc3RydWN0b3IoSXRlcmFibGVEaWZmZXJzOiBJdGVyYWJsZURpZmZlcnMpe1xuICAgIHRoaXMuZGlmZmVyID0gSXRlcmFibGVEaWZmZXJzLmZpbmQoW10pLmNyZWF0ZSgpXG4gIH1cblxuICBuZ0RvQ2hlY2soKXtcbiAgICB2YXIgY2hhbmdlcyA9IHRoaXMuZGlmZmVyLmRpZmYoIHRoaXMuZmlsZXMgKTtcblxuICAgIGlmIChjaGFuZ2VzKSB7XG4gICAgICBzZXRUaW1lb3V0KCgpPT50aGlzLmJ1aWxkRm9ybURhdGEoKSwgMClcbiAgICB9XG4gIH1cblxuICBidWlsZEZvcm1EYXRhKCl7XG4gICAgY29uc3QgaXNBcnJheSA9IHR5cGVvZih0aGlzLmZpbGVzKT09PSdvYmplY3QnICYmIHRoaXMuZmlsZXMuY29uc3RydWN0b3I9PT1BcnJheVxuXG4gICAgaWYoIGlzQXJyYXkgKXtcbiAgICAgIHRoaXMuRm9ybURhdGEgPSBuZXcgRm9ybURhdGEoKVxuICAgICAgY29uc3QgZmlsZXMgPSB0aGlzLmZpbGVzIHx8IFtdXG4gICAgICBmaWxlcy5mb3JFYWNoKGZpbGU9PlxuICAgICAgICB0aGlzLkZvcm1EYXRhLmFwcGVuZCh0aGlzLnBvc3ROYW1lLCBmaWxlLCB0aGlzLmZpbGVOYW1lfHxmaWxlLm5hbWUpXG4gICAgICApXG4gICAgICB0aGlzLkZvcm1EYXRhQ2hhbmdlLmVtaXQoIHRoaXMuRm9ybURhdGEgKVxuICAgIH1lbHNle1xuICAgICAgZGVsZXRlIHRoaXMuRm9ybURhdGFcbiAgICB9XG4gIH1cbn0iXX0= -------------------------------------------------------------------------------- /esm2020/src/file-upload/ngfSelect.directive.mjs: -------------------------------------------------------------------------------- 1 | import { Directive, Input } from "@angular/core"; 2 | import { ngf } from "./ngf.directive"; 3 | import * as i0 from "@angular/core"; 4 | export class ngfSelect extends ngf { 5 | constructor() { 6 | super(...arguments); 7 | this.selectable = true; 8 | } 9 | } 10 | ngfSelect.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: ngfSelect, deps: null, target: i0.ɵɵFactoryTarget.Directive }); 11 | ngfSelect.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "14.3.0", type: ngfSelect, selector: "[ngfSelect]", inputs: { selectable: "selectable" }, exportAs: ["ngfSelect"], usesInheritance: true, ngImport: i0 }); 12 | i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: ngfSelect, decorators: [{ 13 | type: Directive, 14 | args: [{ 15 | selector: "[ngfSelect]", 16 | exportAs: "ngfSelect" 17 | }] 18 | }], propDecorators: { selectable: [{ 19 | type: Input 20 | }] } }); 21 | //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmdmU2VsZWN0LmRpcmVjdGl2ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9maWxlLXVwbG9hZC9uZ2ZTZWxlY3QuZGlyZWN0aXZlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLE1BQU0sZUFBZSxDQUFBO0FBQ2hELE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQTs7QUFNckMsTUFBTSxPQUFPLFNBQVUsU0FBUSxHQUFHO0lBSmxDOztRQUtXLGVBQVUsR0FBTyxJQUFJLENBQUE7S0FDL0I7O3NHQUZZLFNBQVM7MEZBQVQsU0FBUzsyRkFBVCxTQUFTO2tCQUpyQixTQUFTO21CQUFDO29CQUNULFFBQVEsRUFBRSxhQUFhO29CQUN2QixRQUFRLEVBQUUsV0FBVztpQkFDdEI7OEJBRVUsVUFBVTtzQkFBbEIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IERpcmVjdGl2ZSwgSW5wdXQgfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiXG5pbXBvcnQgeyBuZ2YgfSBmcm9tIFwiLi9uZ2YuZGlyZWN0aXZlXCJcblxuQERpcmVjdGl2ZSh7XG4gIHNlbGVjdG9yOiBcIltuZ2ZTZWxlY3RdXCIsXG4gIGV4cG9ydEFzOiBcIm5nZlNlbGVjdFwiXG59KVxuZXhwb3J0IGNsYXNzIG5nZlNlbGVjdCBleHRlbmRzIG5nZiB7XG4gIEBJbnB1dCgpIHNlbGVjdGFibGU6YW55ID0gdHJ1ZVxufSJdfQ== -------------------------------------------------------------------------------- /esm2020/src/file-upload/ngfSrc.directive.mjs: -------------------------------------------------------------------------------- 1 | import { Directive, Input } from '@angular/core'; 2 | import { dataUrl } from './fileTools'; 3 | import * as i0 from "@angular/core"; 4 | export class ngfSrc { 5 | constructor(ElementRef) { 6 | this.ElementRef = ElementRef; 7 | } 8 | ngOnChanges(_changes) { 9 | dataUrl(this.file) 10 | .then(src => this.ElementRef.nativeElement.src = src); 11 | } 12 | } 13 | ngfSrc.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: ngfSrc, deps: [{ token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Directive }); 14 | ngfSrc.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "14.3.0", type: ngfSrc, selector: "[ngfSrc]", inputs: { file: ["ngfSrc", "file"] }, usesOnChanges: true, ngImport: i0 }); 15 | i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: ngfSrc, decorators: [{ 16 | type: Directive, 17 | args: [{ selector: '[ngfSrc]' }] 18 | }], ctorParameters: function () { return [{ type: i0.ElementRef }]; }, propDecorators: { file: [{ 19 | type: Input, 20 | args: ['ngfSrc'] 21 | }] } }); 22 | //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmdmU3JjLmRpcmVjdGl2ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9maWxlLXVwbG9hZC9uZ2ZTcmMuZGlyZWN0aXZlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQWMsS0FBSyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzdELE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxhQUFhLENBQUM7O0FBR3RDLE1BQU0sT0FBTyxNQUFNO0lBR2pCLFlBQW1CLFVBQXNCO1FBQXRCLGVBQVUsR0FBVixVQUFVLENBQVk7SUFBSSxDQUFDO0lBRTlDLFdBQVcsQ0FBQyxRQUFhO1FBQ3ZCLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDO2FBQ2pCLElBQUksQ0FBQyxHQUFHLENBQUEsRUFBRSxDQUNULElBQUksQ0FBQyxVQUFVLENBQUMsYUFBYSxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQ3hDLENBQUE7SUFDSCxDQUFDOzttR0FWVSxNQUFNO3VGQUFOLE1BQU07MkZBQU4sTUFBTTtrQkFEbEIsU0FBUzttQkFBQyxFQUFFLFFBQVEsRUFBRSxVQUFVLEVBQUU7aUdBRWhCLElBQUk7c0JBQXBCLEtBQUs7dUJBQUMsUUFBUSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IERpcmVjdGl2ZSwgRWxlbWVudFJlZiwgSW5wdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IGRhdGFVcmwgfSBmcm9tICcuL2ZpbGVUb29scyc7XG5cbkBEaXJlY3RpdmUoeyBzZWxlY3RvcjogJ1tuZ2ZTcmNdJyB9KVxuZXhwb3J0IGNsYXNzIG5nZlNyYyB7XG4gIEBJbnB1dCgnbmdmU3JjJykgZmlsZTogYW55XG5cbiAgY29uc3RydWN0b3IocHVibGljIEVsZW1lbnRSZWY6IEVsZW1lbnRSZWYpIHsgfVxuXG4gIG5nT25DaGFuZ2VzKF9jaGFuZ2VzOiBhbnkpIHtcbiAgICBkYXRhVXJsKHRoaXMuZmlsZSlcbiAgICAudGhlbihzcmM9PlxuICAgICAgdGhpcy5FbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQuc3JjID0gc3JjXG4gICAgKVxuICB9XG59XG4iXX0= -------------------------------------------------------------------------------- /esm2020/src/file-upload/ngfUploadStatus.directive.mjs: -------------------------------------------------------------------------------- 1 | import { Directive, EventEmitter, Output, Input } from '@angular/core'; 2 | import * as i0 from "@angular/core"; 3 | export class ngfUploadStatus { 4 | constructor() { 5 | this.percent = 0; 6 | this.percentChange = new EventEmitter(); 7 | } 8 | ngOnChanges(changes) { 9 | if (changes.httpEvent && changes.httpEvent.currentValue) { 10 | const event = changes.httpEvent.currentValue; 11 | if (event.loaded && event.total) { 12 | setTimeout(() => { 13 | this.percent = Math.round(100 * event.loaded / event.total); 14 | this.percentChange.emit(this.percent); 15 | }, 0); 16 | } 17 | } 18 | } 19 | } 20 | ngfUploadStatus.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: ngfUploadStatus, deps: [], target: i0.ɵɵFactoryTarget.Directive }); 21 | ngfUploadStatus.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "14.3.0", type: ngfUploadStatus, selector: "ngfUploadStatus", inputs: { percent: "percent", httpEvent: "httpEvent" }, outputs: { percentChange: "percentChange" }, usesOnChanges: true, ngImport: i0 }); 22 | i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: ngfUploadStatus, decorators: [{ 23 | type: Directive, 24 | args: [{ selector: 'ngfUploadStatus' }] 25 | }], propDecorators: { percent: [{ 26 | type: Input 27 | }], percentChange: [{ 28 | type: Output 29 | }], httpEvent: [{ 30 | type: Input 31 | }] } }); 32 | //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmdmVXBsb2FkU3RhdHVzLmRpcmVjdGl2ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9maWxlLXVwbG9hZC9uZ2ZVcGxvYWRTdGF0dXMuZGlyZWN0aXZlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsTUFBTSxlQUFlLENBQUM7O0FBR3ZFLE1BQU0sT0FBTyxlQUFlO0lBRDVCO1FBRVcsWUFBTyxHQUFVLENBQUMsQ0FBQTtRQUNqQixrQkFBYSxHQUF3QixJQUFJLFlBQVksRUFBRSxDQUFBO0tBY2xFO0lBWEMsV0FBVyxDQUFFLE9BQU87UUFDbEIsSUFBSSxPQUFPLENBQUMsU0FBUyxJQUFJLE9BQU8sQ0FBQyxTQUFTLENBQUMsWUFBWSxFQUFFO1lBQ3ZELE1BQU0sS0FBSyxHQUFHLE9BQU8sQ0FBQyxTQUFTLENBQUMsWUFBWSxDQUFBO1lBQzVDLElBQUksS0FBSyxDQUFDLE1BQU0sSUFBSSxLQUFLLENBQUMsS0FBSyxFQUFFO2dCQUMvQixVQUFVLENBQUMsR0FBRSxFQUFFO29CQUNiLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLEdBQUcsS0FBSyxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7b0JBQzVELElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFFLElBQUksQ0FBQyxPQUFPLENBQUUsQ0FBQTtnQkFDekMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFBO2FBQ047U0FDRjtJQUNILENBQUM7OzRHQWZVLGVBQWU7Z0dBQWYsZUFBZTsyRkFBZixlQUFlO2tCQUQzQixTQUFTO21CQUFDLEVBQUMsUUFBUSxFQUFFLGlCQUFpQixFQUFDOzhCQUU3QixPQUFPO3NCQUFmLEtBQUs7Z0JBQ0ksYUFBYTtzQkFBdEIsTUFBTTtnQkFDRSxTQUFTO3NCQUFqQixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRGlyZWN0aXZlLCBFdmVudEVtaXR0ZXIsIE91dHB1dCwgSW5wdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuQERpcmVjdGl2ZSh7c2VsZWN0b3I6ICduZ2ZVcGxvYWRTdGF0dXMnfSlcbmV4cG9ydCBjbGFzcyBuZ2ZVcGxvYWRTdGF0dXMge1xuICBASW5wdXQoKSBwZXJjZW50Om51bWJlciA9IDBcbiAgQE91dHB1dCgpIHBlcmNlbnRDaGFuZ2U6RXZlbnRFbWl0dGVyPG51bWJlcj4gPSBuZXcgRXZlbnRFbWl0dGVyKClcbiAgQElucHV0KCkgaHR0cEV2ZW50ICE6IEV2ZW50XG5cbiAgbmdPbkNoYW5nZXMoIGNoYW5nZXMgKXtcbiAgICBpZiggY2hhbmdlcy5odHRwRXZlbnQgJiYgY2hhbmdlcy5odHRwRXZlbnQuY3VycmVudFZhbHVlICl7XG4gICAgICBjb25zdCBldmVudCA9IGNoYW5nZXMuaHR0cEV2ZW50LmN1cnJlbnRWYWx1ZVxuICAgICAgaWYgKGV2ZW50LmxvYWRlZCAmJiBldmVudC50b3RhbCkge1xuICAgICAgICBzZXRUaW1lb3V0KCgpPT57XG4gICAgICAgICAgdGhpcy5wZXJjZW50ID0gTWF0aC5yb3VuZCgxMDAgKiBldmVudC5sb2FkZWQgLyBldmVudC50b3RhbCk7XG4gICAgICAgICAgdGhpcy5wZXJjZW50Q2hhbmdlLmVtaXQoIHRoaXMucGVyY2VudCApXG4gICAgICAgIH0sIDApXG4gICAgICB9XG4gICAgfVxuICB9XG59Il19 -------------------------------------------------------------------------------- /esm2020/src/public-api.mjs: -------------------------------------------------------------------------------- 1 | /* 2 | * Public API Surface of angular-file 3 | */ 4 | export * from './file-upload/ngfSelect.directive'; 5 | export * from './file-upload/ngfDrop.directive'; 6 | export * from './file-upload/ngf.directive'; 7 | export * from './file-upload/ngf.module'; 8 | export { ngfBackground } from './file-upload/ngfBackground.directive'; 9 | export { ngfSrc } from './file-upload/ngfSrc.directive'; 10 | export { ngfUploadStatus } from './file-upload/ngfUploadStatus.directive'; 11 | export { ngfFormData } from './file-upload/ngfFormData.directive'; 12 | //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVibGljLWFwaS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9wdWJsaWMtYXBpLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHO0FBRUgsY0FBYyxtQ0FBbUMsQ0FBQztBQUNsRCxjQUFjLGlDQUFpQyxDQUFDO0FBQ2hELGNBQWMsNkJBQTZCLENBQUM7QUFDNUMsY0FBYywwQkFBMEIsQ0FBQztBQUN6QyxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sdUNBQXVDLENBQUM7QUFDdEUsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQ3hELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSx5Q0FBeUMsQ0FBQztBQUMxRSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0scUNBQXFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuICogUHVibGljIEFQSSBTdXJmYWNlIG9mIGFuZ3VsYXItZmlsZVxuICovXG5cbmV4cG9ydCAqIGZyb20gJy4vZmlsZS11cGxvYWQvbmdmU2VsZWN0LmRpcmVjdGl2ZSc7XG5leHBvcnQgKiBmcm9tICcuL2ZpbGUtdXBsb2FkL25nZkRyb3AuZGlyZWN0aXZlJztcbmV4cG9ydCAqIGZyb20gJy4vZmlsZS11cGxvYWQvbmdmLmRpcmVjdGl2ZSc7XG5leHBvcnQgKiBmcm9tICcuL2ZpbGUtdXBsb2FkL25nZi5tb2R1bGUnO1xuZXhwb3J0IHsgbmdmQmFja2dyb3VuZCB9IGZyb20gJy4vZmlsZS11cGxvYWQvbmdmQmFja2dyb3VuZC5kaXJlY3RpdmUnO1xuZXhwb3J0IHsgbmdmU3JjIH0gZnJvbSAnLi9maWxlLXVwbG9hZC9uZ2ZTcmMuZGlyZWN0aXZlJztcbmV4cG9ydCB7IG5nZlVwbG9hZFN0YXR1cyB9IGZyb20gJy4vZmlsZS11cGxvYWQvbmdmVXBsb2FkU3RhdHVzLmRpcmVjdGl2ZSc7XG5leHBvcnQgeyBuZ2ZGb3JtRGF0YSB9IGZyb20gJy4vZmlsZS11cGxvYWQvbmdmRm9ybURhdGEuZGlyZWN0aXZlJzsiXX0= -------------------------------------------------------------------------------- /file-upload/doc-event-help.functions.d.ts: -------------------------------------------------------------------------------- 1 | export declare const isFileInput: (elm: any) => boolean; 2 | export declare const detectSwipe: (evt: any) => boolean; 3 | export declare const createInvisibleFileInputWrap: () => HTMLLabelElement; 4 | export declare const createFileInput: () => HTMLInputElement; 5 | -------------------------------------------------------------------------------- /file-upload/fileTools.d.ts: -------------------------------------------------------------------------------- 1 | export declare function getWindow(): any; 2 | export declare function acceptType(accept: string, type: string, name?: string): boolean; 3 | export interface InvalidFileItem { 4 | file: File; 5 | type: string; 6 | } 7 | export declare function arrayBufferToBase64(buffer: any): string; 8 | export declare function dataUrltoBlob(dataurl: string, name: string, origSize?: any): Blob; 9 | export interface orientationMeta { 10 | orientation: number; 11 | fixedArrayBuffer?: any[]; 12 | } 13 | export declare function applyTransform(ctx: CanvasRenderingContext2D, orientation: number, width: number, height: number): void; 14 | export declare function fixFileOrientationByMeta(file: File, result: orientationMeta): Promise; 15 | export declare function applyExifRotation(file: File): Promise; 16 | export declare function readOrientation(file: File): Promise; 17 | /** converts file-input file into base64 dataUri */ 18 | export declare function dataUrl(file: any, disallowObjectUrl?: any): Promise; 19 | export declare function restoreExif(orig: any, resized: any): any; 20 | -------------------------------------------------------------------------------- /file-upload/ngf.directive.d.ts: -------------------------------------------------------------------------------- 1 | import { EventEmitter, ElementRef, SimpleChanges } from '@angular/core'; 2 | import { InvalidFileItem } from "./fileTools"; 3 | import * as i0 from "@angular/core"; 4 | export interface dragMeta { 5 | type: string; 6 | kind: string; 7 | } 8 | /** A master base set of logic intended to support file select/drag/drop operations 9 | NOTE: Use ngfDrop for full drag/drop. Use ngfSelect for selecting 10 | */ 11 | export declare class ngf { 12 | element: ElementRef; 13 | fileElm: any; 14 | filters: { 15 | name: string; 16 | fn: (file: File) => boolean; 17 | }[]; 18 | lastFileCount: number; 19 | multiple: string; 20 | accept: string; 21 | maxSize: number; 22 | ngfFixOrientation: boolean; 23 | fileDropDisabled: boolean; 24 | selectable: boolean | string; 25 | directiveInit: EventEmitter; 26 | lastInvalids: InvalidFileItem[]; 27 | lastInvalidsChange: EventEmitter<{ 28 | file: File; 29 | type: string; 30 | }[]>; 31 | lastBaseUrl: string; 32 | lastBaseUrlChange: EventEmitter; 33 | file?: File; 34 | fileChange: EventEmitter; 35 | files: File[]; 36 | filesChange: EventEmitter; 37 | fileSelectStart: EventEmitter; 38 | capturePaste: boolean; 39 | pasteCapturer: (e: Event) => void; 40 | constructor(element: ElementRef); 41 | initFilters(): void; 42 | ngOnDestroy(): void; 43 | ngOnInit(): void; 44 | ngOnChanges(changes: SimpleChanges): void; 45 | evalCapturePaste(): void; 46 | destroyPasteListener(): void; 47 | paramFileElm(): any; 48 | /** Only used when host element we are attached to is NOT a fileElement */ 49 | createFileElm({ change }: { 50 | change: () => any; 51 | }): HTMLInputElement; 52 | enableSelecting(): void; 53 | getValidFiles(files: File[]): File[]; 54 | getInvalidFiles(files: File[]): InvalidFileItem[]; 55 | handleFiles(files: File[]): void; 56 | que(files: File[]): void; 57 | /** called when input has files */ 58 | changeFn(event: any): void; 59 | clickHandler(evt: Event): boolean; 60 | beforeSelect(event: Event): void; 61 | clearFileElmValue(): void; 62 | isEmptyAfterSelection(): boolean; 63 | stopEvent(event: any): any; 64 | transferHasFiles(transfer: any): any; 65 | eventToFiles(event: Event): any[]; 66 | applyExifRotations(files: File[]): Promise; 67 | onChange(event: Event): void; 68 | getFileFilterFailName(file: File): string | undefined; 69 | isFileValid(file: File): boolean; 70 | isFilesValid(files: File[]): boolean; 71 | protected _acceptFilter(item: File): boolean; 72 | protected _fileSizeFilter(item: File): boolean; 73 | static ɵfac: i0.ɵɵFactoryDeclaration; 74 | static ɵdir: i0.ɵɵDirectiveDeclaration; 75 | } 76 | /** browsers try hard to conceal data about file drags, this tends to undo that */ 77 | export declare function filesToWriteableObject(files: File[]): dragMeta[]; 78 | export declare function eventToTransfer(event: any): TransferObject; 79 | interface TransferObject { 80 | items?: any[]; 81 | files?: any[]; 82 | dropEffect?: 'copy'; 83 | } 84 | export {}; 85 | -------------------------------------------------------------------------------- /file-upload/ngf.module.d.ts: -------------------------------------------------------------------------------- 1 | import * as i0 from "@angular/core"; 2 | import * as i1 from "./ngfDrop.directive"; 3 | import * as i2 from "./ngfSelect.directive"; 4 | import * as i3 from "./ngfBackground.directive"; 5 | import * as i4 from "./ngfSrc.directive"; 6 | import * as i5 from "./ngfUploadStatus.directive"; 7 | import * as i6 from "./ngfFormData.directive"; 8 | import * as i7 from "./ngf.directive"; 9 | import * as i8 from "@angular/common"; 10 | export declare class ngfModule { 11 | static ɵfac: i0.ɵɵFactoryDeclaration; 12 | static ɵmod: i0.ɵɵNgModuleDeclaration; 13 | static ɵinj: i0.ɵɵInjectorDeclaration; 14 | } 15 | -------------------------------------------------------------------------------- /file-upload/ngfBackground.directive.d.ts: -------------------------------------------------------------------------------- 1 | import { ElementRef } from '@angular/core'; 2 | import * as i0 from "@angular/core"; 3 | export declare class ngfBackground { 4 | ElementRef: ElementRef; 5 | file: any; 6 | constructor(ElementRef: ElementRef); 7 | ngOnChanges(_changes: any): void; 8 | static ɵfac: i0.ɵɵFactoryDeclaration; 9 | static ɵdir: i0.ɵɵDirectiveDeclaration; 10 | } 11 | -------------------------------------------------------------------------------- /file-upload/ngfDrop.directive.d.ts: -------------------------------------------------------------------------------- 1 | import { EventEmitter } from '@angular/core'; 2 | import { ngf, dragMeta } from "./ngf.directive"; 3 | import * as i0 from "@angular/core"; 4 | export declare class ngfDrop extends ngf { 5 | fileOver: EventEmitter; 6 | validDrag: boolean; 7 | validDragChange: EventEmitter; 8 | invalidDrag: boolean; 9 | invalidDragChange: EventEmitter; 10 | dragFiles: dragMeta[]; 11 | dragFilesChange: EventEmitter; 12 | onDrop(event: Event): void; 13 | handleFiles(files: File[]): void; 14 | onDragOver(event: Event): void; 15 | closeDrags(): void; 16 | onDragLeave(event: Event): any; 17 | static ɵfac: i0.ɵɵFactoryDeclaration; 18 | static ɵdir: i0.ɵɵDirectiveDeclaration; 19 | } 20 | -------------------------------------------------------------------------------- /file-upload/ngfFormData.directive.d.ts: -------------------------------------------------------------------------------- 1 | import { IterableDiffer, IterableDiffers, EventEmitter } from '@angular/core'; 2 | import * as i0 from "@angular/core"; 3 | export declare class ngfFormData { 4 | files: File[]; 5 | postName: string; 6 | fileName: string; 7 | FormData: FormData; 8 | FormDataChange: EventEmitter; 9 | differ: IterableDiffer<{}>; 10 | constructor(IterableDiffers: IterableDiffers); 11 | ngDoCheck(): void; 12 | buildFormData(): void; 13 | static ɵfac: i0.ɵɵFactoryDeclaration; 14 | static ɵdir: i0.ɵɵDirectiveDeclaration; 15 | } 16 | -------------------------------------------------------------------------------- /file-upload/ngfSelect.directive.d.ts: -------------------------------------------------------------------------------- 1 | import { ngf } from "./ngf.directive"; 2 | import * as i0 from "@angular/core"; 3 | export declare class ngfSelect extends ngf { 4 | selectable: any; 5 | static ɵfac: i0.ɵɵFactoryDeclaration; 6 | static ɵdir: i0.ɵɵDirectiveDeclaration; 7 | } 8 | -------------------------------------------------------------------------------- /file-upload/ngfSrc.directive.d.ts: -------------------------------------------------------------------------------- 1 | import { ElementRef } from '@angular/core'; 2 | import * as i0 from "@angular/core"; 3 | export declare class ngfSrc { 4 | ElementRef: ElementRef; 5 | file: any; 6 | constructor(ElementRef: ElementRef); 7 | ngOnChanges(_changes: any): void; 8 | static ɵfac: i0.ɵɵFactoryDeclaration; 9 | static ɵdir: i0.ɵɵDirectiveDeclaration; 10 | } 11 | -------------------------------------------------------------------------------- /file-upload/ngfUploadStatus.directive.d.ts: -------------------------------------------------------------------------------- 1 | import { EventEmitter } from '@angular/core'; 2 | import * as i0 from "@angular/core"; 3 | export declare class ngfUploadStatus { 4 | percent: number; 5 | percentChange: EventEmitter; 6 | httpEvent: Event; 7 | ngOnChanges(changes: any): void; 8 | static ɵfac: i0.ɵɵFactoryDeclaration; 9 | static ɵdir: i0.ɵɵDirectiveDeclaration; 10 | } 11 | -------------------------------------------------------------------------------- /index.d.ts: -------------------------------------------------------------------------------- 1 | export * from './file-upload/ngf.module'; 2 | export { ngfSrc } from './file-upload/ngfSrc.directive'; 3 | export { ngfFormData } from './file-upload/ngfFormData.directive'; 4 | export { ngfSelect } from './file-upload/ngfSelect.directive'; 5 | export { ngfUploadStatus } from './file-upload/ngfUploadStatus.directive'; 6 | export { ngfDrop } from './file-upload/ngfDrop.directive'; 7 | export { ngf } from './file-upload/ngf.directive'; 8 | export { ngfBackground } from './file-upload/ngfBackground.directive'; 9 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "angular-file", 3 | "version": "4.0.2", 4 | "description": "Easy to use Angular directives for user file selections", 5 | "main": "dist/index.js", 6 | "module": "fesm2015/angular-file.mjs", 7 | "typings": "angular-file.d.ts", 8 | "keywords": [ 9 | "Angular", 10 | "ng files", 11 | "file-upload", 12 | "ng-file-upload", 13 | "ng2-file-upload", 14 | "angular-file-upload" 15 | ], 16 | "author": "Acker Apple", 17 | "license": "MIT", 18 | "repository": { 19 | "type": "git", 20 | "url": "git+ssh://git@github.com/ackerapple/angular-file.git" 21 | }, 22 | "bugs": { 23 | "url": "https://github.com/ackerapple/angular-file/issues" 24 | }, 25 | "homepage": "https://github.com/ackerapple/angular-file#readme", 26 | "contributors": [ 27 | { 28 | "name": "Vyacheslav Chub", 29 | "email": "vyacheslav.chub@valor-software.com", 30 | "url": "https://github.com/buchslava" 31 | }, 32 | { 33 | "name": "Dmitriy Shekhovtsov", 34 | "email": "valorkin@gmail.com", 35 | "url": "https://github.com/valorkin" 36 | }, 37 | { 38 | "name": "Adrian Faciu", 39 | "email": "adrian.faciu@gmail.com", 40 | "url": "https://github.com/adrianfaciu" 41 | }, 42 | { 43 | "name": "Oleksandr Telnov", 44 | "email": "otelnov@gmail.com", 45 | "url": "https://github.com/otelnov" 46 | }, 47 | { 48 | "name": "Acker Apple", 49 | "url": "https://github.com/ackerapple" 50 | } 51 | ], 52 | "es2020": "fesm2020/angular-file.mjs", 53 | "esm2020": "esm2020/angular-file.mjs", 54 | "fesm2020": "fesm2020/angular-file.mjs", 55 | "fesm2015": "fesm2015/angular-file.mjs", 56 | "exports": { 57 | "./package.json": { 58 | "default": "./package.json" 59 | }, 60 | ".": { 61 | "types": "./angular-file.d.ts", 62 | "esm2020": "./esm2020/angular-file.mjs", 63 | "es2020": "./fesm2020/angular-file.mjs", 64 | "es2015": "./fesm2015/angular-file.mjs", 65 | "node": "./fesm2015/angular-file.mjs", 66 | "default": "./fesm2020/angular-file.mjs" 67 | }, 68 | "./src": { 69 | "types": "./src/angular-file-src.d.ts", 70 | "esm2020": "./esm2020/src/angular-file-src.mjs", 71 | "es2020": "./fesm2020/angular-file-src.mjs", 72 | "es2015": "./fesm2015/angular-file-src.mjs", 73 | "node": "./fesm2015/angular-file-src.mjs", 74 | "default": "./fesm2020/angular-file-src.mjs" 75 | } 76 | }, 77 | "sideEffects": false, 78 | "dependencies": { 79 | "tslib": "^2.3.0" 80 | } 81 | } -------------------------------------------------------------------------------- /src/angular-file-src.d.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * Generated bundle index. Do not edit. 3 | */ 4 | /// 5 | export * from './public-api'; 6 | -------------------------------------------------------------------------------- /src/file-upload/doc-event-help.functions.d.ts: -------------------------------------------------------------------------------- 1 | export declare const isFileInput: (elm: any) => boolean; 2 | export declare const detectSwipe: (evt: any) => boolean; 3 | export declare const createInvisibleFileInputWrap: () => HTMLLabelElement; 4 | export declare const createFileInput: () => HTMLInputElement; 5 | -------------------------------------------------------------------------------- /src/file-upload/fileTools.d.ts: -------------------------------------------------------------------------------- 1 | export declare function getWindow(): any; 2 | export declare function acceptType(accept: string, type: string, name?: string): boolean; 3 | export interface InvalidFileItem { 4 | file: File; 5 | type: string; 6 | } 7 | export declare function arrayBufferToBase64(buffer: any): string; 8 | export declare function dataUrltoBlob(dataurl: string, name: string, origSize?: any): Blob; 9 | export interface orientationMeta { 10 | orientation: number; 11 | fixedArrayBuffer?: any[]; 12 | } 13 | export declare function applyTransform(ctx: CanvasRenderingContext2D, orientation: number, width: number, height: number): void; 14 | export declare function fixFileOrientationByMeta(file: File, result: orientationMeta): Promise; 15 | export declare function applyExifRotation(file: File): Promise; 16 | export declare function readOrientation(file: File): Promise; 17 | /** converts file-input file into base64 dataUri */ 18 | export declare function dataUrl(file: any, disallowObjectUrl?: any): Promise; 19 | export declare function restoreExif(orig: any, resized: any): any; 20 | -------------------------------------------------------------------------------- /src/file-upload/ngf.directive.d.ts: -------------------------------------------------------------------------------- 1 | import { EventEmitter, ElementRef, SimpleChanges } from '@angular/core'; 2 | import { InvalidFileItem } from "./fileTools"; 3 | import * as i0 from "@angular/core"; 4 | export interface dragMeta { 5 | type: string; 6 | kind: string; 7 | } 8 | /** A master base set of logic intended to support file select/drag/drop operations 9 | NOTE: Use ngfDrop for full drag/drop. Use ngfSelect for selecting 10 | */ 11 | export declare class ngf { 12 | element: ElementRef; 13 | fileElm: any; 14 | filters: { 15 | name: string; 16 | fn: (file: File) => boolean; 17 | }[]; 18 | lastFileCount: number; 19 | multiple: string; 20 | accept: string; 21 | maxSize: number; 22 | ngfFixOrientation: boolean; 23 | fileDropDisabled: boolean; 24 | selectable: boolean | string; 25 | directiveInit: EventEmitter; 26 | lastInvalids: InvalidFileItem[]; 27 | lastInvalidsChange: EventEmitter<{ 28 | file: File; 29 | type: string; 30 | }[]>; 31 | lastBaseUrl: string; 32 | lastBaseUrlChange: EventEmitter; 33 | file?: File; 34 | fileChange: EventEmitter; 35 | files: File[]; 36 | filesChange: EventEmitter; 37 | fileSelectStart: EventEmitter; 38 | capturePaste: boolean; 39 | pasteCapturer: (e: Event) => void; 40 | constructor(element: ElementRef); 41 | initFilters(): void; 42 | ngOnDestroy(): void; 43 | ngOnInit(): void; 44 | ngOnChanges(changes: SimpleChanges): void; 45 | evalCapturePaste(): void; 46 | destroyPasteListener(): void; 47 | paramFileElm(): any; 48 | /** Only used when host element we are attached to is NOT a fileElement */ 49 | createFileElm({ change }: { 50 | change: () => any; 51 | }): HTMLInputElement; 52 | enableSelecting(): void; 53 | getValidFiles(files: File[]): File[]; 54 | getInvalidFiles(files: File[]): InvalidFileItem[]; 55 | handleFiles(files: File[]): void; 56 | que(files: File[]): void; 57 | /** called when input has files */ 58 | changeFn(event: any): void; 59 | clickHandler(evt: Event): boolean; 60 | beforeSelect(event: Event): void; 61 | clearFileElmValue(): void; 62 | isEmptyAfterSelection(): boolean; 63 | stopEvent(event: any): any; 64 | transferHasFiles(transfer: any): any; 65 | eventToFiles(event: Event): any[]; 66 | applyExifRotations(files: File[]): Promise; 67 | onChange(event: Event): void; 68 | getFileFilterFailName(file: File): string | undefined; 69 | isFileValid(file: File): boolean; 70 | isFilesValid(files: File[]): boolean; 71 | protected _acceptFilter(item: File): boolean; 72 | protected _fileSizeFilter(item: File): boolean; 73 | static ɵfac: i0.ɵɵFactoryDeclaration; 74 | static ɵdir: i0.ɵɵDirectiveDeclaration; 75 | } 76 | /** browsers try hard to conceal data about file drags, this tends to undo that */ 77 | export declare function filesToWriteableObject(files: File[]): dragMeta[]; 78 | export declare function eventToTransfer(event: any): TransferObject; 79 | interface TransferObject { 80 | items?: any[]; 81 | files?: any[]; 82 | dropEffect?: 'copy'; 83 | } 84 | export {}; 85 | -------------------------------------------------------------------------------- /src/file-upload/ngf.module.d.ts: -------------------------------------------------------------------------------- 1 | import * as i0 from "@angular/core"; 2 | import * as i1 from "./ngfDrop.directive"; 3 | import * as i2 from "./ngfSelect.directive"; 4 | import * as i3 from "./ngfBackground.directive"; 5 | import * as i4 from "./ngfSrc.directive"; 6 | import * as i5 from "./ngfUploadStatus.directive"; 7 | import * as i6 from "./ngfFormData.directive"; 8 | import * as i7 from "./ngf.directive"; 9 | import * as i8 from "@angular/common"; 10 | export declare class ngfModule { 11 | static ɵfac: i0.ɵɵFactoryDeclaration; 12 | static ɵmod: i0.ɵɵNgModuleDeclaration; 13 | static ɵinj: i0.ɵɵInjectorDeclaration; 14 | } 15 | -------------------------------------------------------------------------------- /src/file-upload/ngfBackground.directive.d.ts: -------------------------------------------------------------------------------- 1 | import { ElementRef } from '@angular/core'; 2 | import * as i0 from "@angular/core"; 3 | export declare class ngfBackground { 4 | ElementRef: ElementRef; 5 | file: any; 6 | constructor(ElementRef: ElementRef); 7 | ngOnChanges(_changes: any): void; 8 | static ɵfac: i0.ɵɵFactoryDeclaration; 9 | static ɵdir: i0.ɵɵDirectiveDeclaration; 10 | } 11 | -------------------------------------------------------------------------------- /src/file-upload/ngfDrop.directive.d.ts: -------------------------------------------------------------------------------- 1 | import { EventEmitter } from '@angular/core'; 2 | import { ngf, dragMeta } from "./ngf.directive"; 3 | import * as i0 from "@angular/core"; 4 | export declare class ngfDrop extends ngf { 5 | fileOver: EventEmitter; 6 | validDrag: boolean; 7 | validDragChange: EventEmitter; 8 | invalidDrag: boolean; 9 | invalidDragChange: EventEmitter; 10 | dragFiles: dragMeta[]; 11 | dragFilesChange: EventEmitter; 12 | onDrop(event: Event): void; 13 | handleFiles(files: File[]): void; 14 | onDragOver(event: Event): void; 15 | closeDrags(): void; 16 | onDragLeave(event: Event): any; 17 | static ɵfac: i0.ɵɵFactoryDeclaration; 18 | static ɵdir: i0.ɵɵDirectiveDeclaration; 19 | } 20 | -------------------------------------------------------------------------------- /src/file-upload/ngfFormData.directive.d.ts: -------------------------------------------------------------------------------- 1 | import { IterableDiffer, IterableDiffers, EventEmitter } from '@angular/core'; 2 | import * as i0 from "@angular/core"; 3 | export declare class ngfFormData { 4 | files: File[]; 5 | postName: string; 6 | fileName: string; 7 | FormData: FormData; 8 | FormDataChange: EventEmitter; 9 | differ: IterableDiffer<{}>; 10 | constructor(IterableDiffers: IterableDiffers); 11 | ngDoCheck(): void; 12 | buildFormData(): void; 13 | static ɵfac: i0.ɵɵFactoryDeclaration; 14 | static ɵdir: i0.ɵɵDirectiveDeclaration; 15 | } 16 | -------------------------------------------------------------------------------- /src/file-upload/ngfSelect.directive.d.ts: -------------------------------------------------------------------------------- 1 | import { ngf } from "./ngf.directive"; 2 | import * as i0 from "@angular/core"; 3 | export declare class ngfSelect extends ngf { 4 | selectable: any; 5 | static ɵfac: i0.ɵɵFactoryDeclaration; 6 | static ɵdir: i0.ɵɵDirectiveDeclaration; 7 | } 8 | -------------------------------------------------------------------------------- /src/file-upload/ngfSrc.directive.d.ts: -------------------------------------------------------------------------------- 1 | import { ElementRef } from '@angular/core'; 2 | import * as i0 from "@angular/core"; 3 | export declare class ngfSrc { 4 | ElementRef: ElementRef; 5 | file: any; 6 | constructor(ElementRef: ElementRef); 7 | ngOnChanges(_changes: any): void; 8 | static ɵfac: i0.ɵɵFactoryDeclaration; 9 | static ɵdir: i0.ɵɵDirectiveDeclaration; 10 | } 11 | -------------------------------------------------------------------------------- /src/file-upload/ngfUploadStatus.directive.d.ts: -------------------------------------------------------------------------------- 1 | import { EventEmitter } from '@angular/core'; 2 | import * as i0 from "@angular/core"; 3 | export declare class ngfUploadStatus { 4 | percent: number; 5 | percentChange: EventEmitter; 6 | httpEvent: Event; 7 | ngOnChanges(changes: any): void; 8 | static ɵfac: i0.ɵɵFactoryDeclaration; 9 | static ɵdir: i0.ɵɵDirectiveDeclaration; 10 | } 11 | -------------------------------------------------------------------------------- /src/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "module": "../fesm2015/angular-file-src.mjs", 3 | "es2020": "../fesm2020/angular-file-src.mjs", 4 | "esm2020": "../esm2020/src/angular-file-src.mjs", 5 | "fesm2020": "../fesm2020/angular-file-src.mjs", 6 | "fesm2015": "../fesm2015/angular-file-src.mjs", 7 | "typings": "angular-file-src.d.ts", 8 | "sideEffects": false, 9 | "name": "angular-file/src" 10 | } -------------------------------------------------------------------------------- /src/public-api.d.ts: -------------------------------------------------------------------------------- 1 | export * from './file-upload/ngfSelect.directive'; 2 | export * from './file-upload/ngfDrop.directive'; 3 | export * from './file-upload/ngf.directive'; 4 | export * from './file-upload/ngf.module'; 5 | export { ngfBackground } from './file-upload/ngfBackground.directive'; 6 | export { ngfSrc } from './file-upload/ngfSrc.directive'; 7 | export { ngfUploadStatus } from './file-upload/ngfUploadStatus.directive'; 8 | export { ngfFormData } from './file-upload/ngfFormData.directive'; 9 | --------------------------------------------------------------------------------