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 | [](https://ackerapple.github.io/resume/)
6 | [](http://badge.fury.io/js/angular-file)
7 | [](https://npmjs.org/angular-file)
8 | [](https://david-dm.org/ackerapple/angular-file)
9 | [](https://ci.appveyor.com/project/AckerApple/angular-file/branch/development)
10 | [](https://travis-ci.org/AckerApple/angular-file)
11 | [](https://bundlephobia.com/result?p=angular-file)
12 | [](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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmdmLmRpcmVjdGl2ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9maWxlLXVwbG9hZC9uZ2YuZGlyZWN0aXZlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFjLEtBQUssRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFpQixNQUFNLGVBQWUsQ0FBQztBQUNoSCxPQUFPLEVBQUUsNEJBQTRCLEVBQUUsV0FBVyxFQUFFLFdBQVcsRUFBRSxNQUFNLDRCQUE0QixDQUFBO0FBQ25HLE9BQU8sRUFDTCxVQUFVLEVBQ1YsaUJBQWlCLEVBQUUsT0FBTyxFQUMzQixNQUFNLGFBQWEsQ0FBQTs7QUFPcEI7O0VBRUU7QUFLRixNQUFNLE9BQU8sR0FBRztJQWdDZCxZQUFtQixPQUFrQjtRQUFsQixZQUFPLEdBQVAsT0FBTyxDQUFXO1FBOUJyQyxZQUFPLEdBQStDLEVBQUUsQ0FBQTtRQUN4RCxrQkFBYSxHQUFXLENBQUMsQ0FBQTtRQUtoQixzQkFBaUIsR0FBWSxJQUFJLENBQUE7UUFFakMscUJBQWdCLEdBQVksS0FBSyxDQUFBO1FBQ2pDLGVBQVUsR0FBcUIsS0FBSyxDQUFBO1FBQzdCLGtCQUFhLEdBQXFCLElBQUksWUFBWSxFQUFFLENBQUE7UUFFM0QsaUJBQVksR0FBcUIsRUFBRSxDQUFBO1FBQ2xDLHVCQUFrQixHQUEyQyxJQUFJLFlBQVksRUFBRSxDQUFBO1FBRy9FLHNCQUFpQixHQUF3QixJQUFJLFlBQVksRUFBRSxDQUFBO1FBRzNELGVBQVUsR0FBdUIsSUFBSSxZQUFZLEVBQUUsQ0FBQTtRQUVwRCxVQUFLLEdBQVUsRUFBRSxDQUFBO1FBQ2hCLGdCQUFXLEdBQXdCLElBQUksWUFBWSxFQUFVLENBQUM7UUFFOUQsb0JBQWUsR0FBdUIsSUFBSSxZQUFZLEVBQUUsQ0FBQTtRQU9oRSxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUE7SUFDcEIsQ0FBQztJQUVELFdBQVc7UUFDVCx5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SUFBSSxDQUFDO1lBQ2IsSUFBSSxFQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJO1lBQ2xCLElBQUksRUFBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDO1NBQ3RCLENBQUMsQ0FBQTtLQUNIO0lBQ0QsT0FBTyxTQUFTLENBQUE7QUFDbEIsQ0FBQztBQUVELE1BQU0sVUFBVSxlQUFlLENBQUMsS0FBVTtJQUN4QyxJQUFHLEtBQUssQ0FBQyxZQUFZO1FBQUMsT0FBTyxLQUFLLENBQUMsWUFBWSxDQUFBO0lBQy9DLE9BQVEsS0FBSyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQTtBQUN2RSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRGlyZWN0aXZlLCBFdmVudEVtaXR0ZXIsIEVsZW1lbnRSZWYsIElucHV0LCBPdXRwdXQsIEhvc3RMaXN0ZW5lciwgU2ltcGxlQ2hhbmdlcyB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgY3JlYXRlSW52aXNpYmxlRmlsZUlucHV0V3JhcCwgaXNGaWxlSW5wdXQsIGRldGVjdFN3aXBlIH0gZnJvbSBcIi4vZG9jLWV2ZW50LWhlbHAuZnVuY3Rpb25zXCJcbmltcG9ydCB7XG4gIGFjY2VwdFR5cGUsIEludmFsaWRGaWxlSXRlbSxcbiAgYXBwbHlFeGlmUm90YXRpb24sIGRhdGFVcmxcbn0gZnJvbSBcIi4vZmlsZVRvb2xzXCJcblxuZXhwb3J0IGludGVyZmFjZSBkcmFnTWV0YXtcbiAgdHlwZTpzdHJpbmdcbiAga2luZDpzdHJpbmdcbn1cblxuLyoqIEEgbWFzdGVyIGJhc2Ugc2V0IG9mIGxvZ2ljIGludGVuZGVkIHRvIHN1cHBvcnQgZmlsZSBzZWxlY3QvZHJhZy9kcm9wIG9wZXJhdGlvbnNcbiBOT1RFOiBVc2UgbmdmRHJvcCBmb3IgZnVsbCBkcmFnL2Ryb3AuIFVzZSBuZ2ZTZWxlY3QgZm9yIHNlbGVjdGluZ1xuKi9cbkBEaXJlY3RpdmUoe1xuICBzZWxlY3RvcjogXCJbbmdmXVwiLFxuICBleHBvcnRBczpcIm5nZlwiXG59KVxuZXhwb3J0IGNsYXNzIG5nZiB7XG4gIGZpbGVFbG06IGFueVxuICBmaWx0ZXJzOiB7bmFtZTogc3RyaW5nLCBmbjogKGZpbGU6RmlsZSk9PmJvb2xlYW59W10gPSBbXVxuICBsYXN0RmlsZUNvdW50OiBudW1iZXIgPSAwXG5cbiAgQElucHV0KCkgbXVsdGlwbGUgITpzdHJpbmdcbiAgQElucHV0KCkgYWNjZXB0ICAgITpzdHJpbmdcbiAgQElucHV0KCkgbWF4U2l6ZSAgITpudW1iZXJcbiAgQElucHV0KCkgbmdmRml4T3JpZW50YXRpb246IGJvb2xlYW4gPSB0cnVlXG5cbiAgQElucHV0KCkgZmlsZURyb3BEaXNhYmxlZDogYm9vbGVhbiA9IGZhbHNlXG4gIEBJbnB1dCgpIHNlbGVjdGFibGU6IGJvb2xlYW4gfCBzdHJpbmcgPSBmYWxzZVxuICBAT3V0cHV0KCdpbml0JykgZGlyZWN0aXZlSW5pdDpFdmVudEVtaXR0ZXI8bmdmPiA9IG5ldyBFdmVudEVtaXR0ZXIoKVxuXG4gIEBJbnB1dCgpIGxhc3RJbnZhbGlkczpJbnZhbGlkRmlsZUl0ZW1bXSA9IFtdXG4gIEBPdXRwdXQoKSBsYXN0SW52YWxpZHNDaGFuZ2U6RXZlbnRFbWl0dGVyPHtmaWxlOkZpbGUsdHlwZTpzdHJpbmd9W10+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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmdmLmRpcmVjdGl2ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9maWxlLXVwbG9hZC9uZ2YuZGlyZWN0aXZlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFjLEtBQUssRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFpQixNQUFNLGVBQWUsQ0FBQztBQUNoSCxPQUFPLEVBQUUsNEJBQTRCLEVBQUUsV0FBVyxFQUFFLFdBQVcsRUFBRSxNQUFNLDRCQUE0QixDQUFBO0FBQ25HLE9BQU8sRUFDTCxVQUFVLEVBQ1YsaUJBQWlCLEVBQUUsT0FBTyxFQUMzQixNQUFNLGFBQWEsQ0FBQTs7QUFPcEI7O0VBRUU7QUFLRixNQUFNLE9BQU8sR0FBRztJQWdDZCxZQUFtQixPQUFrQjtRQUFsQixZQUFPLEdBQVAsT0FBTyxDQUFXO1FBOUJyQyxZQUFPLEdBQStDLEVBQUUsQ0FBQTtRQUN4RCxrQkFBYSxHQUFXLENBQUMsQ0FBQTtRQUtoQixzQkFBaUIsR0FBWSxJQUFJLENBQUE7UUFFakMscUJBQWdCLEdBQVksS0FBSyxDQUFBO1FBQ2pDLGVBQVUsR0FBcUIsS0FBSyxDQUFBO1FBQzdCLGtCQUFhLEdBQXFCLElBQUksWUFBWSxFQUFFLENBQUE7UUFFM0QsaUJBQVksR0FBcUIsRUFBRSxDQUFBO1FBQ2xDLHVCQUFrQixHQUEyQyxJQUFJLFlBQVksRUFBRSxDQUFBO1FBRy9FLHNCQUFpQixHQUF3QixJQUFJLFlBQVksRUFBRSxDQUFBO1FBRzNELGVBQVUsR0FBdUIsSUFBSSxZQUFZLEVBQUUsQ0FBQTtRQUVwRCxVQUFLLEdBQVUsRUFBRSxDQUFBO1FBQ2hCLGdCQUFXLEdBQXdCLElBQUksWUFBWSxFQUFVLENBQUM7UUFFOUQsb0JBQWUsR0FBdUIsSUFBSSxZQUFZLEVBQUUsQ0FBQTtRQU9oRSxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUE7SUFDcEIsQ0FBQztJQUVELFdBQVc7UUFDVCx5QkFBeUI7UUFDekIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFBQyxJQUFJLEVBQUUsUUFBUSxFQUFFLEVBQUUsRUFBRSxJQUFJLENBQUMsYUFBYSxFQUFDLENBQUMsQ0FBQTtRQUMzRCxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFDLElBQUksRUFBRSxVQUFVLEVBQUUsRUFBRSxFQUFFLElBQUksQ0FBQyxlQUFlLEVBQUMsQ0FBQyxDQUFBO1FBRS9ELGlFQUFpRTtRQUNqRSxxRUFBcUU7UUFDckUsaUVBQWlFO0lBQ25FLENBQUM7SUFFRCxXQUFXO1FBQ1QsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFBLENBQUEsc0NBQXNDO1FBQ3pELElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO0lBQzlCLENBQUM7SUFFRCxRQUFRO1FBQ04sTUFBTSxVQUFVLEdBQUcsQ0FBQyxJQUFJLENBQUMsVUFBVSxJQUFJLElBQUksQ0FBQyxVQUFVLEtBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxVQUFvQixDQUFDLENBQUM7UUFDNUgsSUFBSSxVQUFVLEVBQUU7WUFDZCxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUE7U0FDdkI7UUFFRCxJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUU7WUFDakIsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDLFlBQVksQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFBO1NBQzVEO1FBRUQsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7UUFFeEIsMkdBQTJHO1FBQzNHLFVBQVUsQ0FBQyxHQUFFLEVBQUU7WUFDYixJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQTtRQUMvQixDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUE7SUFDUCxDQUFDO0lBRUQsV0FBVyxDQUFFLE9BQXNCO1FBQ2pDLElBQUksT0FBTyxDQUFDLE1BQU0sRUFBRTtZQUNsQixJQUFJLENBQUMsWUFBWSxFQUFFLENBQUMsWUFBWSxDQUFDLFFBQVEsRUFBRSxPQUFPLENBQUMsTUFBTSxDQUFDLFlBQVksSUFBSSxHQUFHLENBQUMsQ0FBQTtTQUMvRTtRQUVELElBQUksT0FBTyxDQUFDLFlBQVksRUFBRTtZQUN4QixJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztTQUN6QjtRQUVELDZFQUE2RTtRQUM3RSxJQUFJLE9BQU8sQ0FBQyxJQUFJLElBQUksT0FBTyxDQUFDLElBQUksQ0FBQyxhQUFhLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRTtZQUM1RSxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQTtTQUN6QjtRQUVELDJFQUEyRTtRQUMzRSxJQUFJLE9BQU8sQ0FBQyxLQUFLLEVBQUU7WUFDakIsTUFBTSxlQUFlLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQyxhQUFhLEVBQUUsTUFBTSxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxZQUFZLEVBQUUsTUFBTSxDQUFBO1lBRWxHLElBQUksZUFBZSxFQUFFO2dCQUNuQixJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQTthQUN6QjtTQUNGO0lBQ0gsQ0FBQztJQUVELGdCQUFnQjtRQUNkLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxZQUFZLElBQUssSUFBSSxDQUFDLFlBQW9CLEtBQUcsRUFBRSxJQUFJLENBQUMsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLENBQUMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFlBQW1CLENBQUMsQ0FBQztRQUVuSSxJQUFJLFFBQVEsRUFBRTtZQUNaLElBQUksSUFBSSxDQUFDLGFBQWEsRUFBRTtnQkFDdEIsT0FBTyxDQUFDLG9CQUFvQjthQUM3QjtZQUVELElBQUksQ0FBQyxhQUFhLEdBQUcsQ0FBQyxDQUFRLEVBQUUsRUFBRTtnQkFDaEMsTUFBTSxJQUFJLEdBQUksQ0FBUyxDQUFDLGFBQWEsQ0FBQztnQkFDdEMsSUFBSSxJQUFJLElBQUksSUFBSSxDQUFDLEtBQUssSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRTtvQkFDM0MsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7b0JBQzdCLENBQUMsQ0FBQyxjQUFjLEVBQUUsQ0FBQztpQkFDcEI7WUFDSCxDQUFDLENBQUE7WUFFRCxNQUFNLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQztZQUVyRCxPQUFPO1NBQ1I7UUFFRCxJQUFJLENBQUMsb0JBQW9CLEVBQUUsQ0FBQztJQUM5QixDQUFDO0lBRUQsb0JBQW9CO1FBQ2xCLElBQUksSUFBSSxDQUFDLGFBQWEsRUFBRTtZQUN0QixNQUFNLENBQUMsbUJBQW1CLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQztZQUN4RCxPQUFPLElBQUksQ0FBQyxhQUFhLENBQUM7U0FDM0I7SUFDSCxDQUFDO0lBRUQsWUFBWTtRQUNWLElBQUksSUFBSSxDQUFDLE9BQU87WUFBRSxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUEsQ0FBQyxrQkFBa0I7UUFFeEQsOEJBQThCO1FBQzlCLE1BQU0sTUFBTSxHQUFHLFdBQVcsQ0FBRSxJQUFJLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBRSxDQUFBO1FBQ3hELElBQUcsTUFBTSxFQUFDO1lBQ1IsT0FBTyxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFBO1NBQ2pEO1FBRUQsbUNBQW1DO1FBQ25DLE9BQU8sSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDO1lBQ3ZDLE1BQU0sRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUM7U0FDakMsQ0FBQyxDQUFBO0lBQ0osQ0FBQztJQUVELDBFQUEwRTtJQUMxRSxhQUFhLENBQUMsRUFBQyxNQUFNLEVBQXFCO1FBQ3hDLHFEQUFxRDtRQUNyRCxNQUFNLEtBQUssR0FBRyw0QkFBNEIsRUFBRSxDQUFBO1FBQzVDLE1BQU0sT0FBTyxHQUFHLEtBQUssQ0FBQyxvQkFBb0IsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQTtRQUV0RCxPQUFPLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQzNDLElBQUksQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLFdBQVcsQ0FBRSxLQUFLLENBQUUsQ0FBQSxDQUFDLG9CQUFvQjtRQUVwRSxPQUFPLE9BQU8sQ0FBQTtJQUNoQixDQUFDO0lBRUQsZUFBZTtRQUNiLElBQUksR0FBRyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFBO1FBRXBDLElBQUksV0FBVyxDQUFDLEdBQUcsQ0FBQyxFQUFFO1lBQ3BCLE1BQU0sYUFBYSxHQUFHLEtBQUssQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQTtZQUN2RCxHQUFHLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxFQUFFLGFBQWEsQ0FBQyxDQUFBO1lBQzVDLEdBQUcsQ0FBQyxnQkFBZ0IsQ0FBQyxZQUFZLEVBQUUsYUFBYSxDQUFDLENBQUE7WUFDakQsT0FBTTtTQUNQO1FBRUQsTUFBTSxhQUFhLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLEVBQUUsQ0FBQyxDQUFBO1FBQ2pELEdBQUcsQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLEVBQUUsYUFBYSxDQUFDLENBQUE7UUFDNUMsR0FBRyxDQUFDLGdCQUFnQixDQUFDLFlBQVksRUFBRSxhQUFhLENBQUMsQ0FBQTtRQUNqRCxHQUFHLENBQUMsZ0JBQWdCLENBQUMsVUFBVSxFQUFFLGFBQWEsQ0FBQyxDQUFBO0lBQ2pELENBQUM7SUFFRCxhQUFhLENBQUUsS0FBWTtRQUN6QixNQUFNLEdBQUcsR0FBVSxFQUFFLENBQUE7UUFDckIsS0FBSSxJQUFJLENBQUMsR0FBQyxLQUFLLENBQUMsTUFBTSxHQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFDO1lBQ3BDLElBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRTtnQkFDOUIsR0FBRyxDQUFDLElBQUksQ0FBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUUsQ0FBQTthQUNyQjtTQUNGO1FBQ0QsT0FBTyxHQUFHLENBQUE7SUFDWixDQUFDO0lBRUQsZUFBZSxDQUFDLEtBQVk7UUFDMUIsTUFBTSxHQUFHLEdBQXFCLEVBQUUsQ0FBQTtRQUNoQyxLQUFJLElBQUksQ0FBQyxHQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUM7WUFDcEMsSUFBSSxVQUFVLEdBQUcsSUFBSSxDQUFDLHFCQUFxQixDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFBO1lBQ3JELElBQUksVUFBVSxFQUFFO2dCQUNkLEdBQUcsQ0FBQyxJQUFJLENBQUM7b0JBQ1AsSUFBSSxFQUFHLEtBQUssQ0FBQyxDQUFDLENBQUM7b0JBQ2YsSUFBSSxFQUFHLFVBQVU7aUJBQ2xCLENBQUMsQ0FBQTthQUNIO1NBQ0Y7UUFDRCxPQUFPLEdBQUcsQ0FBQTtJQUNaLENBQUM7SUFFRCxxQ0FBcUM7SUFDckMsV0FBVyxDQUFDLEtBQVk7UUFDdEIsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQTtRQUV4QyxJQUFHLEtBQUssQ0FBQyxNQUFNLElBQUUsTUFBTSxDQUFDLE1BQU0sRUFBQztZQUM3QixJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsS0FBSyxDQUFDLENBQUE7U0FDaEQ7YUFBSTtZQUNILE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQTtTQUN6QjtRQUVELElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFBO1FBRS9DLElBQUksTUFBTSxDQUFDLE1BQU0sRUFBRTtZQUNqQixJQUFJLElBQUksQ0FBQyxpQkFBaUIsRUFBRTtnQkFDMUIsSUFBSSxDQUFDLGtCQUFrQixDQUFDLE1BQU0sQ0FBQztxQkFDOUIsSUFBSSxDQUFFLFVBQVUsQ0FBQSxFQUFFLENBQUEsSUFBSSxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsQ0FBRSxDQUFBO2FBQzFDO2lCQUFJO2dCQUNILElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUE7YUFDakI7U0FDRjtRQUVELElBQUksSUFBSSxDQUFDLHFCQUFxQixFQUFFLEVBQUU7WUFDaEMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsS0FBSyxHQUFHLEVBQUUsQ0FBQTtTQUN0QztJQUNILENBQUM7SUFFRCxHQUFHLENBQUUsS0FBWTtRQUNmLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssSUFBSSxFQUFFLENBQUE7UUFDN0IsS0FBSyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUE7UUFFN0Msa0RBQWtEO1FBQ2xELG1IQUFtSDtRQUVuSCxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBRSxJQUFJLENBQUMsS0FBSyxDQUFFLENBQUE7UUFFbkMsSUFBRyxLQUFLLENBQUMsTUFBTSxFQUFDO1lBQ2QsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUUsSUFBSSxDQUFDLElBQUksR0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUUsQ0FBQTtZQUUxQyxJQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxTQUFTLENBQUMsTUFBTSxFQUFDO2dCQUN6QyxPQUFPLENBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFFO3FCQUNsQixJQUFJLENBQUUsR0FBRyxDQUFBLEVBQUUsQ0FBQSxJQUFJLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFFLENBQUE7YUFDL0M7U0FDRjtRQUVELDBDQUEwQztRQUMxQyxJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFBO0lBQ3hDLENBQUM7SUFFRCxrQ0FBa0M7SUFDbEMsUUFBUSxDQUFDLEtBQVM7UUFDaEIsSUFBSSxRQUFRLEdBQUcsS0FBSyxDQUFDLFFBQVEsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLElBQUksS0FBSyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQTtRQUVyRSxJQUFJLENBQUMsUUFBUTtZQUFFLE9BQU87UUFFdEIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN0QixJQUFJLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxDQUFBO0lBQzVCLENBQUM7SUFFRCxZQUFZLENBQUMsR0FBVTtRQUNyQixNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQTtRQUN0QyxJQUFJLEdBQUcsQ0FBQyxZQUFZLENBQUMsVUFBVSxDQUFDLElBQUksSUFBSSxDQUFDLGdCQUFnQixFQUFDO1lBQ3hELE9BQU8sS0FBSyxDQUFDO1NBQ2Q7UUFFRCxJQUFJLENBQUMsR0FBRyxXQUFXLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDekIscUNBQXFDO1FBQ3JDLElBQUssQ0FBQyxLQUFHLEtBQUs7WUFBRyxPQUFPLENBQUMsQ0FBQztRQUUxQixNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUE7UUFDbkMsT0FBTyxDQUFDLEtBQUssRUFBRSxDQUFBO1FBQ2YsOENBQThDO1FBQzlDLElBQUksQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLENBQUE7UUFFdEIsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0lBRUQsWUFBWSxDQUFDLEtBQVk7UUFDdkIsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUE7UUFFaEMsSUFBSSxJQUFJLENBQUMsS0FBSyxJQUFJLElBQUksQ0FBQyxhQUFhLEtBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNO1lBQUUsT0FBTTtRQUVoRSxxR0FBcUc7UUFDckcsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUE7SUFDMUIsQ0FBQztJQUVELGlCQUFpQjtRQUNmLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTztZQUFFLE9BQU07UUFFekIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFBO0lBQzNCLENBQUM7SUFFRCxxQkFBcUI7UUFDbkIsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQztJQUMxRCxDQUFDO0lBRUQsU0FBUyxDQUFDLEtBQVM7UUFDakIsS0FBSyxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBQ3ZCLEtBQUssQ0FBQyxlQUFlLEVBQUUsQ0FBQztJQUMxQixDQUFDO0lBRUQsZ0JBQWdCLENBQUMsUUFBWTtRQUMzQixJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssRUFBRTtZQUNuQixPQUFPLEtBQUssQ0FBQztTQUNkO1FBRUQsSUFBSSxRQUFRLENBQUMsS0FBSyxDQUFDLE9BQU8sRUFBRTtZQUMxQixPQUFPLFFBQVEsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1NBQy9DO2FBQU0sSUFBSSxRQUFRLENBQUMsS0FBSyxDQUFDLFFBQVEsRUFBRTtZQUNsQyxPQUFPLFFBQVEsQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1NBQ3pDO2FBQU07WUFDTCxPQUFPLEtBQUssQ0FBQztTQUNkO0lBQ0gsQ0FBQztJQUVELFlBQVksQ0FBQyxLQUFXO1FBQ3RCLE1BQU0sUUFBUSxHQUFHLGVBQWUsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN4QyxJQUFJLFFBQVEsRUFBRTtZQUNaLElBQUcsUUFBUSxDQUFDLEtBQUssSUFBSSxRQUFRLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBQztnQkFDekMsT0FBTyxRQUFRLENBQUMsS0FBSyxDQUFBO2FBQ3RCO1lBQ0QsSUFBRyxRQUFRLENBQUMsS0FBSyxJQUFJLFFBQVEsQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUFDO2dCQUN6QyxPQUFPLFFBQVEsQ0FBQyxLQUFLLENBQUE7YUFDdEI7U0FDRjtRQUNELE9BQU8sRUFBRSxDQUFBO0lBQ1gsQ0FBQztJQUVELGtCQUFrQixDQUNoQixLQUFZO1FBRVosTUFBTSxNQUFNLEdBQUcsQ0FDYixJQUFTLEVBQUMsS0FBWSxFQUNWLEVBQUU7WUFDZCxPQUFPLGlCQUFpQixDQUFDLElBQUksQ0FBQztpQkFDN0IsSUFBSSxDQUFFLFNBQVMsQ0FBQSxFQUFFLENBQUEsS0FBSyxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxDQUFFLENBQUE7UUFDdkQsQ0FBQyxDQUFBO1FBRUQsTUFBTSxLQUFLLEdBQWtCLEVBQUUsQ0FBQTtRQUMvQixLQUFJLElBQUksQ0FBQyxHQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUM7WUFDcEMsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFFLENBQUE7U0FDakM7UUFDRCxPQUFPLE9BQU8sQ0FBQyxHQUFHLENBQUUsS0FBSyxDQUFFLENBQUMsSUFBSSxDQUFFLEdBQUUsRUFBRSxDQUFBLEtBQUssQ0FBRSxDQUFBO0lBQy9DLENBQUM7SUFHRCxRQUFRLENBQUMsS0FBVztRQUNsQixJQUFJLEtBQUssR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxLQUFLLElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQTtRQUV4RSxJQUFHLENBQUMsS0FBSyxDQUFDLE1BQU07WUFBQyxPQUFNO1FBRXZCLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDdEIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQTtJQUN6QixDQUFDO0lBRUQscUJBQXFCLENBQ25CLElBQVM7UUFFVCxLQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUM7WUFDMUMsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLEVBQUU7Z0JBQ3hDLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUE7YUFDNUI7U0FDRjtRQUNELE9BQU8sU0FBUyxDQUFBO0lBQ2xCLENBQUM7SUFFRCxXQUFXLENBQUMsSUFBUztRQUNuQixNQUFNLFNBQVMsR0FBRyxDQUFDLElBQUksQ0FBQyxNQUFNLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFBO1FBQ3pFLElBQUksU0FBUyxFQUFFO1lBQ2IsT0FBTyxJQUFJLENBQUEsQ0FBQSwyQ0FBMkM7U0FDdkQ7UUFFRCxPQUFPLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUE7SUFDeEQsQ0FBQztJQUVELFlBQVksQ0FBQyxLQUFZO1FBQ3ZCLEtBQUksSUFBSSxDQUFDLEdBQUMsS0FBSyxDQUFDLE1BQU0sR0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBQztZQUNwQyxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRTtnQkFDL0IsT0FBTyxLQUFLLENBQUE7YUFDYjtTQUNGO1FBQ0QsT0FBTyxJQUFJLENBQUE7SUFDYixDQUFDO0lBRVMsYUFBYSxDQUFDLElBQVM7UUFDL0IsT0FBTyxVQUFVLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQTtJQUN0RCxDQUFDO0lBRVMsZUFBZSxDQUFDLElBQVM7UUFDakMsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sSUFBSSxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUNyRCxDQUFDOztnR0E1WFUsR0FBRztvRkFBSCxHQUFHOzJGQUFILEdBQUc7a0JBSmYsU0FBUzttQkFBQztvQkFDVCxRQUFRLEVBQUUsT0FBTztvQkFDakIsUUFBUSxFQUFDLEtBQUs7aUJBQ2Y7aUdBTVUsUUFBUTtzQkFBaEIsS0FBSztnQkFDRyxNQUFNO3NCQUFkLEtBQUs7Z0JBQ0csT0FBTztzQkFBZixLQUFLO2dCQUNHLGlCQUFpQjtzQkFBekIsS0FBSztnQkFFRyxnQkFBZ0I7c0JBQXhCLEtBQUs7Z0JBQ0csVUFBVTtzQkFBbEIsS0FBSztnQkFDVSxhQUFhO3NCQUE1QixNQUFNO3VCQUFDLE1BQU07Z0JBRUwsWUFBWTtzQkFBcEIsS0FBSztnQkFDSSxrQkFBa0I7c0JBQTNCLE1BQU07Z0JBRUUsV0FBVztzQkFBbkIsS0FBSztnQkFDSSxpQkFBaUI7c0JBQTFCLE1BQU07Z0JBRUUsSUFBSTtzQkFBWixLQUFLO2dCQUNJLFVBQVU7c0JBQW5CLE1BQU07Z0JBRUUsS0FBSztzQkFBYixLQUFLO2dCQUNJLFdBQVc7c0JBQXBCLE1BQU07Z0JBRUcsZUFBZTtzQkFBeEIsTUFBTTtnQkFFRSxZQUFZO3NCQUFwQixLQUFLO2dCQW9UTixRQUFRO3NCQURQLFlBQVk7dUJBQUMsUUFBUSxFQUFFLENBQUMsUUFBUSxDQUFDOztBQWlEcEMsa0ZBQWtGO0FBQ2xGLE1BQU0sVUFBVSxzQkFBc0IsQ0FBRSxLQUFZO0lBQ2xELE1BQU0sU0FBUyxHQUFjLEVBQUUsQ0FBQTtJQUMvQixLQUFJLElBQUksQ0FBQyxHQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsS0FBSyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsRUFBQztRQUNqQyxTQUFTLENBQUMsSUFBSSxDQUFDO1lBQ2IsSUFBSSxFQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJO1lBQ2xCLElBQUksRUFBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDO1NBQ3RCLENBQUMsQ0FBQTtLQUNIO0lBQ0QsT0FBTyxTQUFTLENBQUE7QUFDbEIsQ0FBQztBQUVELE1BQU0sVUFBVSxlQUFlLENBQUMsS0FBVTtJQUN4QyxJQUFHLEtBQUssQ0FBQyxZQUFZO1FBQUMsT0FBTyxLQUFLLENBQUMsWUFBWSxDQUFBO0lBQy9DLE9BQVEsS0FBSyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQTtBQUN2RSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRGlyZWN0aXZlLCBFdmVudEVtaXR0ZXIsIEVsZW1lbnRSZWYsIElucHV0LCBPdXRwdXQsIEhvc3RMaXN0ZW5lciwgU2ltcGxlQ2hhbmdlcyB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgY3JlYXRlSW52aXNpYmxlRmlsZUlucHV0V3JhcCwgaXNGaWxlSW5wdXQsIGRldGVjdFN3aXBlIH0gZnJvbSBcIi4vZG9jLWV2ZW50LWhlbHAuZnVuY3Rpb25zXCJcbmltcG9ydCB7XG4gIGFjY2VwdFR5cGUsIEludmFsaWRGaWxlSXRlbSxcbiAgYXBwbHlFeGlmUm90YXRpb24sIGRhdGFVcmxcbn0gZnJvbSBcIi4vZmlsZVRvb2xzXCJcblxuZXhwb3J0IGludGVyZmFjZSBkcmFnTWV0YXtcbiAgdHlwZTpzdHJpbmdcbiAga2luZDpzdHJpbmdcbn1cblxuLyoqIEEgbWFzdGVyIGJhc2Ugc2V0IG9mIGxvZ2ljIGludGVuZGVkIHRvIHN1cHBvcnQgZmlsZSBzZWxlY3QvZHJhZy9kcm9wIG9wZXJhdGlvbnNcbiBOT1RFOiBVc2UgbmdmRHJvcCBmb3IgZnVsbCBkcmFnL2Ryb3AuIFVzZSBuZ2ZTZWxlY3QgZm9yIHNlbGVjdGluZ1xuKi9cbkBEaXJlY3RpdmUoe1xuICBzZWxlY3RvcjogXCJbbmdmXVwiLFxuICBleHBvcnRBczpcIm5nZlwiXG59KVxuZXhwb3J0IGNsYXNzIG5nZiB7XG4gIGZpbGVFbG06IGFueVxuICBmaWx0ZXJzOiB7bmFtZTogc3RyaW5nLCBmbjogKGZpbGU6RmlsZSk9PmJvb2xlYW59W10gPSBbXVxuICBsYXN0RmlsZUNvdW50OiBudW1iZXIgPSAwXG5cbiAgQElucHV0KCkgbXVsdGlwbGUgITpzdHJpbmdcbiAgQElucHV0KCkgYWNjZXB0ICAgITpzdHJpbmdcbiAgQElucHV0KCkgbWF4U2l6ZSAgITpudW1iZXJcbiAgQElucHV0KCkgbmdmRml4T3JpZW50YXRpb246IGJvb2xlYW4gPSB0cnVlXG5cbiAgQElucHV0KCkgZmlsZURyb3BEaXNhYmxlZDogYm9vbGVhbiA9IGZhbHNlXG4gIEBJbnB1dCgpIHNlbGVjdGFibGU6IGJvb2xlYW4gfCBzdHJpbmcgPSBmYWxzZVxuICBAT3V0cHV0KCdpbml0JykgZGlyZWN0aXZlSW5pdDpFdmVudEVtaXR0ZXI8bmdmPiA9IG5ldyBFdmVudEVtaXR0ZXIoKVxuXG4gIEBJbnB1dCgpIGxhc3RJbnZhbGlkczpJbnZhbGlkRmlsZUl0ZW1bXSA9IFtdXG4gIEBPdXRwdXQoKSBsYXN0SW52YWxpZHNDaGFuZ2U6RXZlbnRFbWl0dGVyPHtmaWxlOkZpbGUsdHlwZTpzdHJpbmd9W10+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 |
--------------------------------------------------------------------------------