ng-primitives 0.91.1 → 0.92.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,8 +1,10 @@
1
1
  import { coerceStringArray } from '@angular/cdk/coercion';
2
2
  import * as i0 from '@angular/core';
3
- import { inject, ElementRef, input, booleanAttribute, output, signal, HostListener, Directive, DOCUMENT } from '@angular/core';
3
+ import { signal, input, booleanAttribute, output, Directive, inject, DOCUMENT } from '@angular/core';
4
4
  import { ngpHoverInteraction, ngpInteractions } from 'ng-primitives/interactions';
5
- import { createStateToken, createStateProvider, createStateInjector, createState } from 'ng-primitives/state';
5
+ import { injectElementRef } from 'ng-primitives/internal';
6
+ import { createPrimitive, dataBinding, listener } from 'ng-primitives/state';
7
+ import { Subject } from 'rxjs';
6
8
 
7
9
  function fileDropFilter(fileList, acceptedTypes, multiple) {
8
10
  const validFiles = Array.from(fileList).filter(file => isFileTypeAccepted(file, acceptedTypes));
@@ -33,32 +35,91 @@ function filesToFileList(files) {
33
35
  return dataTransfer.files;
34
36
  }
35
37
 
36
- /**
37
- * The state token for the FileDropzone primitive.
38
- */
39
- const NgpFileDropzoneStateToken = createStateToken('FileDropzone');
40
- /**
41
- * Provides the FileDropzone state.
42
- */
43
- const provideFileDropzoneState = createStateProvider(NgpFileDropzoneStateToken);
44
- /**
45
- * Injects the FileDropzone state.
46
- */
47
- const injectFileDropzoneState = createStateInjector(NgpFileDropzoneStateToken);
48
- /**
49
- * The FileDropzone state registration function.
50
- */
51
- const fileDropzoneState = createState(NgpFileDropzoneStateToken);
38
+ const [NgpFileDropzoneStateToken, ngpFileDropzone, injectFileDropzoneState, provideFileDropzoneState,] = createPrimitive('NgpFileDropzone', ({ fileTypes, multiple, directory, disabled, onSelected, onRejected, onDragOver, }) => {
39
+ const element = injectElementRef();
40
+ const isDragOverState = signal(false, ...(ngDevMode ? [{ debugName: "isDragOverState" }] : []));
41
+ // Create observables
42
+ const selectedSubject = new Subject();
43
+ const rejectedSubject = new Subject();
44
+ const dragOverSubject = new Subject();
45
+ // Host bindings
46
+ dataBinding(element, 'data-dragover', () => (isDragOverState() ? '' : null));
47
+ dataBinding(element, 'data-disabled', () => (disabled?.() ? '' : null));
48
+ function onDragEnter(event) {
49
+ if (disabled?.()) {
50
+ return;
51
+ }
52
+ event.preventDefault();
53
+ event.stopPropagation();
54
+ isDragOverState.set(true);
55
+ dragOverSubject.next(true);
56
+ onDragOver?.(true);
57
+ }
58
+ function onDragOverHandler(event) {
59
+ if (disabled?.()) {
60
+ return;
61
+ }
62
+ event.stopPropagation();
63
+ event.preventDefault();
64
+ isDragOverState.set(true);
65
+ }
66
+ function onDragLeave(event) {
67
+ if (disabled?.() || !isDragOverState()) {
68
+ return;
69
+ }
70
+ // if the element we are dragging over is a child of the file dropzone, ignore the event
71
+ if (element.nativeElement.contains(event.relatedTarget)) {
72
+ return;
73
+ }
74
+ event.preventDefault();
75
+ event.stopPropagation();
76
+ isDragOverState.set(false);
77
+ dragOverSubject.next(false);
78
+ onDragOver?.(false);
79
+ }
80
+ function onDrop(event) {
81
+ if (disabled?.()) {
82
+ return;
83
+ }
84
+ event.preventDefault();
85
+ isDragOverState.set(false);
86
+ dragOverSubject.next(false);
87
+ onDragOver?.(false);
88
+ const fileList = event.dataTransfer?.files;
89
+ if (fileList) {
90
+ const filteredFiles = fileDropFilter(fileList, fileTypes?.(), multiple?.() ?? false);
91
+ if (filteredFiles) {
92
+ selectedSubject.next(filteredFiles);
93
+ onSelected?.(filteredFiles);
94
+ }
95
+ else {
96
+ rejectedSubject.next();
97
+ onRejected?.();
98
+ }
99
+ }
100
+ }
101
+ // Event listeners
102
+ listener(element, 'dragenter', onDragEnter);
103
+ listener(element, 'dragover', onDragOverHandler);
104
+ listener(element, 'dragleave', onDragLeave);
105
+ listener(element, 'drop', onDrop);
106
+ return {
107
+ disabled,
108
+ fileTypes,
109
+ multiple,
110
+ directory,
111
+ isDragOver: isDragOverState,
112
+ selected: selectedSubject.asObservable(),
113
+ rejected: rejectedSubject.asObservable(),
114
+ dragOverChanged: dragOverSubject.asObservable(),
115
+ };
116
+ });
52
117
 
53
118
  /**
54
119
  * Capture files dropped on the element.
55
120
  */
56
121
  class NgpFileDropzone {
57
122
  constructor() {
58
- /**
59
- * Access the host element.
60
- */
61
- this.elementRef = inject(ElementRef);
62
123
  /**
63
124
  * The accepted file types. This can be an array of strings or a comma-separated string.
64
125
  * Accepted types can either be file extensions (e.g. `.jpg`) or MIME types (e.g. `image/jpeg`).
@@ -110,122 +171,145 @@ class NgpFileDropzone {
110
171
  this.dragOver = output({
111
172
  alias: 'ngpFileDropzoneDragOver',
112
173
  });
174
+ this.state = ngpFileDropzone({
175
+ fileTypes: this.fileTypes,
176
+ multiple: this.multiple,
177
+ directory: this.directory,
178
+ disabled: this.disabled,
179
+ onSelected: files => this.selected.emit(files),
180
+ onRejected: () => this.rejected.emit(),
181
+ onDragOver: isDragOver => this.dragOver.emit(isDragOver),
182
+ });
113
183
  /**
114
184
  * Whether the user is currently dragging a file over the file upload.
115
185
  */
116
- this.isDragOver = signal(false, ...(ngDevMode ? [{ debugName: "isDragOver" }] : []));
117
- /**
118
- * The file upload state.
119
- */
120
- this.state = fileDropzoneState(this);
121
- ngpHoverInteraction({ disabled: this.state.disabled });
186
+ this.isDragOver = this.state.isDragOver;
187
+ ngpHoverInteraction({ disabled: this.disabled });
122
188
  }
123
- onDragEnter(event) {
124
- if (this.state.disabled()) {
189
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.9", ngImport: i0, type: NgpFileDropzone, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
190
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "20.3.9", type: NgpFileDropzone, isStandalone: true, selector: "[ngpFileDropzone]", inputs: { fileTypes: { classPropertyName: "fileTypes", publicName: "ngpFileDropzoneFileTypes", isSignal: true, isRequired: false, transformFunction: null }, multiple: { classPropertyName: "multiple", publicName: "ngpFileDropzoneMultiple", isSignal: true, isRequired: false, transformFunction: null }, directory: { classPropertyName: "directory", publicName: "ngpFileDropzoneDirectory", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "ngpFileDropzoneDisabled", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { selected: "ngpFileDropzoneSelected", rejected: "ngpFileDropzoneRejected", dragOver: "ngpFileDropzoneDragOver" }, providers: [provideFileDropzoneState()], exportAs: ["ngpFileDropzone"], ngImport: i0 }); }
191
+ }
192
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.9", ngImport: i0, type: NgpFileDropzone, decorators: [{
193
+ type: Directive,
194
+ args: [{
195
+ selector: '[ngpFileDropzone]',
196
+ exportAs: 'ngpFileDropzone',
197
+ providers: [provideFileDropzoneState()],
198
+ }]
199
+ }], ctorParameters: () => [], propDecorators: { fileTypes: [{ type: i0.Input, args: [{ isSignal: true, alias: "ngpFileDropzoneFileTypes", required: false }] }], multiple: [{ type: i0.Input, args: [{ isSignal: true, alias: "ngpFileDropzoneMultiple", required: false }] }], directory: [{ type: i0.Input, args: [{ isSignal: true, alias: "ngpFileDropzoneDirectory", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "ngpFileDropzoneDisabled", required: false }] }], selected: [{ type: i0.Output, args: ["ngpFileDropzoneSelected"] }], rejected: [{ type: i0.Output, args: ["ngpFileDropzoneRejected"] }], dragOver: [{ type: i0.Output, args: ["ngpFileDropzoneDragOver"] }] } });
200
+
201
+ const [NgpFileUploadStateToken, ngpFileUpload, injectFileUploadState, provideFileUploadState,] = createPrimitive('NgpFileUpload', ({ fileTypes, multiple, directory, dragAndDrop, disabled, onSelected, onCanceled, onRejected, onDragOver, }) => {
202
+ const element = injectElementRef();
203
+ const document = inject(DOCUMENT);
204
+ const isDragOver = signal(false, ...(ngDevMode ? [{ debugName: "isDragOver" }] : []));
205
+ // Create observables
206
+ const selectedSubject = new Subject();
207
+ const canceledSubject = new Subject();
208
+ const rejectedSubject = new Subject();
209
+ const dragOverSubject = new Subject();
210
+ // Host bindings
211
+ dataBinding(element, 'data-disabled', () => (disabled?.() ? '' : null));
212
+ dataBinding(element, 'data-dragover', () => (isDragOver() ? '' : null));
213
+ // Create file input
214
+ const input = document.createElement('input');
215
+ input.type = 'file';
216
+ input.style.display = 'none';
217
+ input.addEventListener('change', () => {
218
+ const files = input.files;
219
+ selectedSubject.next(files);
220
+ onSelected?.(files);
221
+ input.value = '';
222
+ });
223
+ input.addEventListener('cancel', () => {
224
+ canceledSubject.next();
225
+ onCanceled?.();
226
+ });
227
+ function showFileDialog() {
228
+ if (disabled?.()) {
229
+ return;
230
+ }
231
+ const fileTypesValue = fileTypes?.()?.join(',');
232
+ if (fileTypesValue) {
233
+ input.accept = fileTypesValue;
234
+ }
235
+ input.multiple = multiple?.() ?? false;
236
+ input.webkitdirectory = directory?.() ?? false;
237
+ input.click();
238
+ }
239
+ function onDragEnter(event) {
240
+ if (disabled?.() || !dragAndDrop?.()) {
125
241
  return;
126
242
  }
127
243
  event.preventDefault();
128
244
  event.stopPropagation();
129
- this.isDragOver.set(true);
130
- this.dragOver.emit(true);
245
+ isDragOver.set(true);
246
+ dragOverSubject.next(true);
247
+ onDragOver?.(true);
131
248
  }
132
- onDragOver(event) {
133
- if (this.state.disabled()) {
249
+ function onDragOverHandler(event) {
250
+ if (disabled?.() || !dragAndDrop?.()) {
134
251
  return;
135
252
  }
136
253
  event.stopPropagation();
137
254
  event.preventDefault();
138
- this.isDragOver.set(true);
255
+ isDragOver.set(true);
139
256
  }
140
- onDragLeave(event) {
141
- if (this.state.disabled() || !this.isDragOver()) {
257
+ function onDragLeave(event) {
258
+ if (disabled?.() || !dragAndDrop?.() || !isDragOver()) {
142
259
  return;
143
260
  }
144
261
  // if the element we are dragging over is a child of the file upload, ignore the event
145
- if (this.elementRef.nativeElement.contains(event.relatedTarget)) {
262
+ if (element.nativeElement.contains(event.relatedTarget)) {
146
263
  return;
147
264
  }
148
265
  event.preventDefault();
149
266
  event.stopPropagation();
150
- this.isDragOver.set(false);
151
- this.dragOver.emit(false);
267
+ isDragOver.set(false);
268
+ dragOverSubject.next(false);
269
+ onDragOver?.(false);
152
270
  }
153
- onDrop(event) {
154
- if (this.state.disabled()) {
271
+ function onDrop(event) {
272
+ if (disabled?.() || !dragAndDrop?.()) {
155
273
  return;
156
274
  }
157
275
  event.preventDefault();
158
- this.isDragOver.set(false);
159
- this.dragOver.emit(false);
276
+ isDragOver.set(false);
277
+ dragOverSubject.next(false);
278
+ onDragOver?.(false);
160
279
  const fileList = event.dataTransfer?.files;
161
280
  if (fileList) {
162
- const filteredFiles = fileDropFilter(fileList, this.state.fileTypes(), this.state.multiple());
281
+ const filteredFiles = fileDropFilter(fileList, fileTypes?.(), multiple?.() ?? false);
163
282
  if (filteredFiles) {
164
- this.selected.emit(filteredFiles);
283
+ selectedSubject.next(filteredFiles);
284
+ onSelected?.(filteredFiles);
165
285
  }
166
286
  else {
167
- this.rejected.emit();
287
+ rejectedSubject.next();
288
+ onRejected?.();
168
289
  }
169
290
  }
170
291
  }
171
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.9", ngImport: i0, type: NgpFileDropzone, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
172
- static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "20.3.9", type: NgpFileDropzone, isStandalone: true, selector: "[ngpFileDropzone]", inputs: { fileTypes: { classPropertyName: "fileTypes", publicName: "ngpFileDropzoneFileTypes", isSignal: true, isRequired: false, transformFunction: null }, multiple: { classPropertyName: "multiple", publicName: "ngpFileDropzoneMultiple", isSignal: true, isRequired: false, transformFunction: null }, directory: { classPropertyName: "directory", publicName: "ngpFileDropzoneDirectory", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "ngpFileDropzoneDisabled", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { selected: "ngpFileDropzoneSelected", rejected: "ngpFileDropzoneRejected", dragOver: "ngpFileDropzoneDragOver" }, host: { listeners: { "dragenter": "onDragEnter($event)", "dragover": "onDragOver($event)", "dragleave": "onDragLeave($event)", "drop": "onDrop($event)" }, properties: { "attr.data-dragover": "isDragOver() ? \"\" : null", "attr.data-disabled": "disabled() ? \"\" : null" } }, providers: [provideFileDropzoneState()], exportAs: ["ngpFileDropzone"], ngImport: i0 }); }
173
- }
174
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.9", ngImport: i0, type: NgpFileDropzone, decorators: [{
175
- type: Directive,
176
- args: [{
177
- selector: '[ngpFileDropzone]',
178
- exportAs: 'ngpFileDropzone',
179
- providers: [provideFileDropzoneState()],
180
- host: {
181
- '[attr.data-dragover]': 'isDragOver() ? "" : null',
182
- '[attr.data-disabled]': 'disabled() ? "" : null',
183
- },
184
- }]
185
- }], ctorParameters: () => [], propDecorators: { fileTypes: [{ type: i0.Input, args: [{ isSignal: true, alias: "ngpFileDropzoneFileTypes", required: false }] }], multiple: [{ type: i0.Input, args: [{ isSignal: true, alias: "ngpFileDropzoneMultiple", required: false }] }], directory: [{ type: i0.Input, args: [{ isSignal: true, alias: "ngpFileDropzoneDirectory", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "ngpFileDropzoneDisabled", required: false }] }], selected: [{ type: i0.Output, args: ["ngpFileDropzoneSelected"] }], rejected: [{ type: i0.Output, args: ["ngpFileDropzoneRejected"] }], dragOver: [{ type: i0.Output, args: ["ngpFileDropzoneDragOver"] }], onDragEnter: [{
186
- type: HostListener,
187
- args: ['dragenter', ['$event']]
188
- }], onDragOver: [{
189
- type: HostListener,
190
- args: ['dragover', ['$event']]
191
- }], onDragLeave: [{
192
- type: HostListener,
193
- args: ['dragleave', ['$event']]
194
- }], onDrop: [{
195
- type: HostListener,
196
- args: ['drop', ['$event']]
197
- }] } });
198
-
199
- /**
200
- * The state token for the FileUpload primitive.
201
- */
202
- const NgpFileUploadStateToken = createStateToken('FileUpload');
203
- /**
204
- * Provides the FileUpload state.
205
- */
206
- const provideFileUploadState = createStateProvider(NgpFileUploadStateToken);
207
- /**
208
- * Injects the FileUpload state.
209
- */
210
- const injectFileUploadState = createStateInjector(NgpFileUploadStateToken);
211
- /**
212
- * The FileUpload state registration function.
213
- */
214
- const fileUploadState = createState(NgpFileUploadStateToken);
292
+ // Event listeners
293
+ listener(element, 'click', showFileDialog);
294
+ listener(element, 'dragenter', onDragEnter);
295
+ listener(element, 'dragover', onDragOverHandler);
296
+ listener(element, 'dragleave', onDragLeave);
297
+ listener(element, 'drop', onDrop);
298
+ return {
299
+ isDragOver,
300
+ selected: selectedSubject.asObservable(),
301
+ canceled: canceledSubject.asObservable(),
302
+ rejected: rejectedSubject.asObservable(),
303
+ dragOverChanged: dragOverSubject.asObservable(),
304
+ showFileDialog,
305
+ };
306
+ });
215
307
 
216
308
  /**
217
309
  * A directive that allows you to turn any element into a file upload trigger.
218
310
  */
219
311
  class NgpFileUpload {
220
312
  constructor() {
221
- /**
222
- * Access the document
223
- */
224
- this.document = inject(DOCUMENT);
225
- /**
226
- * Access the host element.
227
- */
228
- this.elementRef = inject(ElementRef);
229
313
  /**
230
314
  * The accepted file types. This can be an array of strings or a comma-separated string.
231
315
  * Accepted types can either be file extensions (e.g. `.jpg`) or MIME types (e.g. `image/jpeg`).
@@ -291,95 +375,36 @@ class NgpFileUpload {
291
375
  this.dragOver = output({
292
376
  alias: 'ngpFileUploadDragOver',
293
377
  });
378
+ this.state = ngpFileUpload({
379
+ fileTypes: this.fileTypes,
380
+ multiple: this.multiple,
381
+ directory: this.directory,
382
+ dragAndDrop: this.dragAndDrop,
383
+ disabled: this.disabled,
384
+ onSelected: files => this.selected.emit(files),
385
+ onCanceled: () => this.canceled.emit(),
386
+ onRejected: () => this.rejected.emit(),
387
+ onDragOver: isDragOver => this.dragOver.emit(isDragOver),
388
+ });
294
389
  /**
295
390
  * Whether the user is currently dragging a file over the file upload.
296
391
  */
297
- this.isDragOver = signal(false, ...(ngDevMode ? [{ debugName: "isDragOver" }] : []));
298
- /**
299
- * Store the file input element.
300
- */
301
- this.input = this.document.createElement('input');
302
- /**
303
- * The file upload state.
304
- */
305
- this.state = fileUploadState(this);
392
+ this.isDragOver = this.state.isDragOver;
306
393
  ngpInteractions({
307
394
  hover: true,
308
395
  press: true,
309
396
  focusVisible: true,
310
- disabled: this.state.disabled,
311
- });
312
- this.input.type = 'file';
313
- this.input.style.display = 'none';
314
- this.input.addEventListener('change', () => {
315
- this.selected.emit(this.input.files);
316
- // clear the input value to allow re-uploading the same file
317
- this.input.value = '';
397
+ disabled: this.disabled,
318
398
  });
319
- this.input.addEventListener('cancel', () => this.canceled.emit());
320
399
  }
400
+ /**
401
+ * Show the file dialog.
402
+ */
321
403
  showFileDialog() {
322
- if (this.state.disabled()) {
323
- return;
324
- }
325
- const fileTypes = this.state.fileTypes()?.join(',');
326
- if (fileTypes) {
327
- this.input.accept = fileTypes;
328
- }
329
- this.input.multiple = this.state.multiple();
330
- this.input.webkitdirectory = this.state.directory();
331
- this.input.click();
332
- }
333
- onDragEnter(event) {
334
- if (this.state.disabled() || !this.state.dragAndDrop()) {
335
- return;
336
- }
337
- event.preventDefault();
338
- event.stopPropagation();
339
- this.isDragOver.set(true);
340
- this.dragOver.emit(true);
341
- }
342
- onDragOver(event) {
343
- if (this.state.disabled() || !this.state.dragAndDrop()) {
344
- return;
345
- }
346
- event.stopPropagation();
347
- event.preventDefault();
348
- this.isDragOver.set(true);
349
- }
350
- onDragLeave(event) {
351
- if (this.state.disabled() || !this.state.dragAndDrop() || !this.isDragOver()) {
352
- return;
353
- }
354
- // if the element we are dragging over is a child of the file upload, ignore the event
355
- if (this.elementRef.nativeElement.contains(event.relatedTarget)) {
356
- return;
357
- }
358
- event.preventDefault();
359
- event.stopPropagation();
360
- this.isDragOver.set(false);
361
- this.dragOver.emit(false);
362
- }
363
- onDrop(event) {
364
- if (this.state.disabled() || !this.state.dragAndDrop()) {
365
- return;
366
- }
367
- event.preventDefault();
368
- this.isDragOver.set(false);
369
- this.dragOver.emit(false);
370
- const fileList = event.dataTransfer?.files;
371
- if (fileList) {
372
- const filteredFiles = fileDropFilter(fileList, this.state.fileTypes(), this.state.multiple());
373
- if (filteredFiles) {
374
- this.selected.emit(filteredFiles);
375
- }
376
- else {
377
- this.rejected.emit();
378
- }
379
- }
404
+ this.state.showFileDialog();
380
405
  }
381
406
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.9", ngImport: i0, type: NgpFileUpload, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
382
- static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "20.3.9", type: NgpFileUpload, isStandalone: true, selector: "[ngpFileUpload]", inputs: { fileTypes: { classPropertyName: "fileTypes", publicName: "ngpFileUploadFileTypes", isSignal: true, isRequired: false, transformFunction: null }, multiple: { classPropertyName: "multiple", publicName: "ngpFileUploadMultiple", isSignal: true, isRequired: false, transformFunction: null }, directory: { classPropertyName: "directory", publicName: "ngpFileUploadDirectory", isSignal: true, isRequired: false, transformFunction: null }, dragAndDrop: { classPropertyName: "dragAndDrop", publicName: "ngpFileUploadDragDrop", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "ngpFileUploadDisabled", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { selected: "ngpFileUploadSelected", canceled: "ngpFileUploadCanceled", rejected: "ngpFileUploadRejected", dragOver: "ngpFileUploadDragOver" }, host: { listeners: { "click": "showFileDialog()", "dragenter": "onDragEnter($event)", "dragover": "onDragOver($event)", "dragleave": "onDragLeave($event)", "drop": "onDrop($event)" }, properties: { "attr.data-disabled": "state.disabled() ? \"\" : null", "attr.data-dragover": "isDragOver() ? \"\" : null" } }, providers: [provideFileUploadState()], exportAs: ["ngpFileUpload"], ngImport: i0 }); }
407
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "20.3.9", type: NgpFileUpload, isStandalone: true, selector: "[ngpFileUpload]", inputs: { fileTypes: { classPropertyName: "fileTypes", publicName: "ngpFileUploadFileTypes", isSignal: true, isRequired: false, transformFunction: null }, multiple: { classPropertyName: "multiple", publicName: "ngpFileUploadMultiple", isSignal: true, isRequired: false, transformFunction: null }, directory: { classPropertyName: "directory", publicName: "ngpFileUploadDirectory", isSignal: true, isRequired: false, transformFunction: null }, dragAndDrop: { classPropertyName: "dragAndDrop", publicName: "ngpFileUploadDragDrop", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "ngpFileUploadDisabled", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { selected: "ngpFileUploadSelected", canceled: "ngpFileUploadCanceled", rejected: "ngpFileUploadRejected", dragOver: "ngpFileUploadDragOver" }, providers: [provideFileUploadState()], exportAs: ["ngpFileUpload"], ngImport: i0 }); }
383
408
  }
384
409
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.9", ngImport: i0, type: NgpFileUpload, decorators: [{
385
410
  type: Directive,
@@ -387,27 +412,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.9", ngImpor
387
412
  selector: '[ngpFileUpload]',
388
413
  exportAs: 'ngpFileUpload',
389
414
  providers: [provideFileUploadState()],
390
- host: {
391
- '[attr.data-disabled]': 'state.disabled() ? "" : null',
392
- '[attr.data-dragover]': 'isDragOver() ? "" : null',
393
- },
394
415
  }]
395
- }], ctorParameters: () => [], propDecorators: { fileTypes: [{ type: i0.Input, args: [{ isSignal: true, alias: "ngpFileUploadFileTypes", required: false }] }], multiple: [{ type: i0.Input, args: [{ isSignal: true, alias: "ngpFileUploadMultiple", required: false }] }], directory: [{ type: i0.Input, args: [{ isSignal: true, alias: "ngpFileUploadDirectory", required: false }] }], dragAndDrop: [{ type: i0.Input, args: [{ isSignal: true, alias: "ngpFileUploadDragDrop", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "ngpFileUploadDisabled", required: false }] }], selected: [{ type: i0.Output, args: ["ngpFileUploadSelected"] }], canceled: [{ type: i0.Output, args: ["ngpFileUploadCanceled"] }], rejected: [{ type: i0.Output, args: ["ngpFileUploadRejected"] }], dragOver: [{ type: i0.Output, args: ["ngpFileUploadDragOver"] }], showFileDialog: [{
396
- type: HostListener,
397
- args: ['click']
398
- }], onDragEnter: [{
399
- type: HostListener,
400
- args: ['dragenter', ['$event']]
401
- }], onDragOver: [{
402
- type: HostListener,
403
- args: ['dragover', ['$event']]
404
- }], onDragLeave: [{
405
- type: HostListener,
406
- args: ['dragleave', ['$event']]
407
- }], onDrop: [{
408
- type: HostListener,
409
- args: ['drop', ['$event']]
410
- }] } });
416
+ }], ctorParameters: () => [], propDecorators: { fileTypes: [{ type: i0.Input, args: [{ isSignal: true, alias: "ngpFileUploadFileTypes", required: false }] }], multiple: [{ type: i0.Input, args: [{ isSignal: true, alias: "ngpFileUploadMultiple", required: false }] }], directory: [{ type: i0.Input, args: [{ isSignal: true, alias: "ngpFileUploadDirectory", required: false }] }], dragAndDrop: [{ type: i0.Input, args: [{ isSignal: true, alias: "ngpFileUploadDragDrop", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "ngpFileUploadDisabled", required: false }] }], selected: [{ type: i0.Output, args: ["ngpFileUploadSelected"] }], canceled: [{ type: i0.Output, args: ["ngpFileUploadCanceled"] }], rejected: [{ type: i0.Output, args: ["ngpFileUploadRejected"] }], dragOver: [{ type: i0.Output, args: ["ngpFileUploadDragOver"] }] } });
411
417
 
412
418
  /**
413
419
  * Generated bundle index. Do not edit.
@@ -1 +1 @@
1
- {"version":3,"file":"ng-primitives-file-upload.mjs","sources":["../../../../packages/ng-primitives/file-upload/src/file-dropzone/file-drop-filter.ts","../../../../packages/ng-primitives/file-upload/src/file-dropzone/file-dropzone-state.ts","../../../../packages/ng-primitives/file-upload/src/file-dropzone/file-dropzone.ts","../../../../packages/ng-primitives/file-upload/src/file-upload/file-upload-state.ts","../../../../packages/ng-primitives/file-upload/src/file-upload/file-upload.ts","../../../../packages/ng-primitives/file-upload/src/ng-primitives-file-upload.ts"],"sourcesContent":["export function fileDropFilter(\n fileList: FileList,\n acceptedTypes: string[] | undefined,\n multiple: boolean,\n) {\n const validFiles = Array.from(fileList).filter(file => isFileTypeAccepted(file, acceptedTypes));\n\n const limitedFiles = multiple ? validFiles : validFiles.slice(0, 1);\n\n return limitedFiles.length > 0 ? filesToFileList(limitedFiles) : null;\n}\n\nexport function isFileTypeAccepted(file: File, acceptedTypes: string[] | undefined) {\n // allow all file types if no types are specified\n if (!acceptedTypes || acceptedTypes.length === 0) return true;\n\n const mimeType = file.type;\n const fileName = file.name.toLowerCase();\n\n return acceptedTypes.some(type => {\n type = type.toLowerCase();\n\n if (type.startsWith('.')) {\n return fileName.endsWith(type);\n }\n\n if (type.endsWith('/*')) {\n const baseType = type.replace('/*', '');\n return mimeType.startsWith(baseType);\n }\n\n return mimeType === type;\n });\n}\n\nfunction filesToFileList(files: File[]): FileList {\n const dataTransfer = new DataTransfer();\n files.forEach(file => dataTransfer.items.add(file));\n return dataTransfer.files;\n}\n","import {\n createState,\n createStateInjector,\n createStateProvider,\n createStateToken,\n} from 'ng-primitives/state';\nimport type { NgpFileDropzone } from './file-dropzone';\n\n/**\n * The state token for the FileDropzone primitive.\n */\nexport const NgpFileDropzoneStateToken = createStateToken<NgpFileDropzone>('FileDropzone');\n\n/**\n * Provides the FileDropzone state.\n */\nexport const provideFileDropzoneState = createStateProvider(NgpFileDropzoneStateToken);\n\n/**\n * Injects the FileDropzone state.\n */\nexport const injectFileDropzoneState =\n createStateInjector<NgpFileDropzone>(NgpFileDropzoneStateToken);\n\n/**\n * The FileDropzone state registration function.\n */\nexport const fileDropzoneState = createState(NgpFileDropzoneStateToken);\n","import { BooleanInput, coerceStringArray } from '@angular/cdk/coercion';\nimport {\n booleanAttribute,\n Directive,\n ElementRef,\n HostListener,\n inject,\n input,\n output,\n signal,\n} from '@angular/core';\nimport { ngpHoverInteraction } from 'ng-primitives/interactions';\nimport { fileDropFilter } from './file-drop-filter';\nimport { fileDropzoneState, provideFileDropzoneState } from './file-dropzone-state';\n\n/**\n * Capture files dropped on the element.\n */\n@Directive({\n selector: '[ngpFileDropzone]',\n exportAs: 'ngpFileDropzone',\n providers: [provideFileDropzoneState()],\n host: {\n '[attr.data-dragover]': 'isDragOver() ? \"\" : null',\n '[attr.data-disabled]': 'disabled() ? \"\" : null',\n },\n})\nexport class NgpFileDropzone {\n /**\n * Access the host element.\n */\n private readonly elementRef = inject<ElementRef<HTMLElement>>(ElementRef);\n\n /**\n * The accepted file types. This can be an array of strings or a comma-separated string.\n * Accepted types can either be file extensions (e.g. `.jpg`) or MIME types (e.g. `image/jpeg`).\n */\n readonly fileTypes = input<string[], string | string[]>(undefined, {\n alias: 'ngpFileDropzoneFileTypes',\n transform: types => coerceStringArray(types, ','),\n });\n\n /**\n * Whether to allow multiple files to be selected.\n */\n readonly multiple = input<boolean, BooleanInput>(false, {\n alias: 'ngpFileDropzoneMultiple',\n transform: booleanAttribute,\n });\n\n /**\n * Whether to allow the user to select directories.\n */\n readonly directory = input<boolean, BooleanInput>(false, {\n alias: 'ngpFileDropzoneDirectory',\n transform: booleanAttribute,\n });\n\n /**\n * Whether the file upload is disabled.\n */\n readonly disabled = input<boolean, BooleanInput>(false, {\n alias: 'ngpFileDropzoneDisabled',\n transform: booleanAttribute,\n });\n\n /**\n * Emits when the user selects files.\n */\n readonly selected = output<FileList | null>({\n alias: 'ngpFileDropzoneSelected',\n });\n\n /**\n * Emits when uploaded files are rejected because they do not match the allowed {@link fileTypes}.\n */\n readonly rejected = output<void>({\n alias: 'ngpFileDropzoneRejected',\n });\n\n /**\n * Emits when the user drags a file over the file upload.\n */\n readonly dragOver = output<boolean>({\n alias: 'ngpFileDropzoneDragOver',\n });\n\n /**\n * Whether the user is currently dragging a file over the file upload.\n */\n protected readonly isDragOver = signal<boolean>(false);\n\n /**\n * The file upload state.\n */\n private readonly state = fileDropzoneState<NgpFileDropzone>(this);\n\n constructor() {\n ngpHoverInteraction({ disabled: this.state.disabled });\n }\n\n @HostListener('dragenter', ['$event'])\n protected onDragEnter(event: DragEvent): void {\n if (this.state.disabled()) {\n return;\n }\n\n event.preventDefault();\n event.stopPropagation();\n this.isDragOver.set(true);\n this.dragOver.emit(true);\n }\n\n @HostListener('dragover', ['$event'])\n protected onDragOver(event: DragEvent): void {\n if (this.state.disabled()) {\n return;\n }\n\n event.stopPropagation();\n event.preventDefault();\n this.isDragOver.set(true);\n }\n\n @HostListener('dragleave', ['$event'])\n protected onDragLeave(event: DragEvent): void {\n if (this.state.disabled() || !this.isDragOver()) {\n return;\n }\n\n // if the element we are dragging over is a child of the file upload, ignore the event\n if (this.elementRef.nativeElement.contains(event.relatedTarget as Node)) {\n return;\n }\n\n event.preventDefault();\n event.stopPropagation();\n this.isDragOver.set(false);\n this.dragOver.emit(false);\n }\n\n @HostListener('drop', ['$event'])\n protected onDrop(event: DragEvent): void {\n if (this.state.disabled()) {\n return;\n }\n\n event.preventDefault();\n this.isDragOver.set(false);\n this.dragOver.emit(false);\n\n const fileList = event.dataTransfer?.files;\n if (fileList) {\n const filteredFiles = fileDropFilter(fileList, this.state.fileTypes(), this.state.multiple());\n\n if (filteredFiles) {\n this.selected.emit(filteredFiles);\n } else {\n this.rejected.emit();\n }\n }\n }\n}\n","import {\n createState,\n createStateInjector,\n createStateProvider,\n createStateToken,\n} from 'ng-primitives/state';\nimport type { NgpFileUpload } from './file-upload';\n\n/**\n * The state token for the FileUpload primitive.\n */\nexport const NgpFileUploadStateToken = createStateToken<NgpFileUpload>('FileUpload');\n\n/**\n * Provides the FileUpload state.\n */\nexport const provideFileUploadState = createStateProvider(NgpFileUploadStateToken);\n\n/**\n * Injects the FileUpload state.\n */\nexport const injectFileUploadState = createStateInjector<NgpFileUpload>(NgpFileUploadStateToken);\n\n/**\n * The FileUpload state registration function.\n */\nexport const fileUploadState = createState(NgpFileUploadStateToken);\n","import { BooleanInput, coerceStringArray } from '@angular/cdk/coercion';\nimport {\n booleanAttribute,\n Directive,\n ElementRef,\n HostListener,\n inject,\n input,\n output,\n signal,\n DOCUMENT,\n} from '@angular/core';\nimport { ngpInteractions } from 'ng-primitives/interactions';\nimport { fileDropFilter } from '../file-dropzone/file-drop-filter';\nimport { fileUploadState, provideFileUploadState } from './file-upload-state';\n\n/**\n * A directive that allows you to turn any element into a file upload trigger.\n */\n@Directive({\n selector: '[ngpFileUpload]',\n exportAs: 'ngpFileUpload',\n providers: [provideFileUploadState()],\n host: {\n '[attr.data-disabled]': 'state.disabled() ? \"\" : null',\n '[attr.data-dragover]': 'isDragOver() ? \"\" : null',\n },\n})\nexport class NgpFileUpload {\n /**\n * Access the document\n */\n private readonly document = inject<Document>(DOCUMENT);\n\n /**\n * Access the host element.\n */\n private readonly elementRef = inject<ElementRef<HTMLElement>>(ElementRef);\n\n /**\n * The accepted file types. This can be an array of strings or a comma-separated string.\n * Accepted types can either be file extensions (e.g. `.jpg`) or MIME types (e.g. `image/jpeg`).\n */\n readonly fileTypes = input<string[], string | string[]>(undefined, {\n alias: 'ngpFileUploadFileTypes',\n transform: types => coerceStringArray(types, ','),\n });\n\n /**\n * Whether to allow multiple files to be selected.\n */\n readonly multiple = input<boolean, BooleanInput>(false, {\n alias: 'ngpFileUploadMultiple',\n transform: booleanAttribute,\n });\n\n /**\n * Whether to allow the user to select directories.\n */\n readonly directory = input<boolean, BooleanInput>(false, {\n alias: 'ngpFileUploadDirectory',\n transform: booleanAttribute,\n });\n\n /**\n * Whether drag-and-drop is enabled.\n */\n readonly dragAndDrop = input<boolean, BooleanInput>(true, {\n alias: 'ngpFileUploadDragDrop',\n transform: booleanAttribute,\n });\n\n /**\n * Whether the file upload is disabled.\n */\n readonly disabled = input<boolean, BooleanInput>(false, {\n alias: 'ngpFileUploadDisabled',\n transform: booleanAttribute,\n });\n\n /**\n * Emits when the user selects files.\n */\n readonly selected = output<FileList | null>({\n alias: 'ngpFileUploadSelected',\n });\n\n /**\n * Emits when the user cancel the file selection.\n */\n readonly canceled = output<void>({\n alias: 'ngpFileUploadCanceled',\n });\n\n /**\n * Emits when uploaded files are rejected because they do not match the allowed {@link fileTypes}.\n */\n readonly rejected = output<void>({\n alias: 'ngpFileUploadRejected',\n });\n\n /**\n * Emits when the user drags a file over the file upload.\n */\n readonly dragOver = output<boolean>({\n alias: 'ngpFileUploadDragOver',\n });\n\n /**\n * Whether the user is currently dragging a file over the file upload.\n */\n protected readonly isDragOver = signal<boolean>(false);\n\n /**\n * Store the file input element.\n */\n private input: HTMLInputElement = this.document.createElement('input');\n\n /**\n * The file upload state.\n */\n protected readonly state = fileUploadState<NgpFileUpload>(this);\n\n constructor() {\n ngpInteractions({\n hover: true,\n press: true,\n focusVisible: true,\n disabled: this.state.disabled,\n });\n this.input.type = 'file';\n this.input.style.display = 'none';\n this.input.addEventListener('change', () => {\n this.selected.emit(this.input.files);\n // clear the input value to allow re-uploading the same file\n this.input.value = '';\n });\n this.input.addEventListener('cancel', () => this.canceled.emit());\n }\n\n @HostListener('click')\n protected showFileDialog(): void {\n if (this.state.disabled()) {\n return;\n }\n\n const fileTypes = this.state.fileTypes()?.join(',');\n\n if (fileTypes) {\n this.input.accept = fileTypes;\n }\n\n this.input.multiple = this.state.multiple();\n this.input.webkitdirectory = this.state.directory();\n this.input.click();\n }\n\n @HostListener('dragenter', ['$event'])\n protected onDragEnter(event: DragEvent): void {\n if (this.state.disabled() || !this.state.dragAndDrop()) {\n return;\n }\n\n event.preventDefault();\n event.stopPropagation();\n this.isDragOver.set(true);\n this.dragOver.emit(true);\n }\n\n @HostListener('dragover', ['$event'])\n protected onDragOver(event: DragEvent): void {\n if (this.state.disabled() || !this.state.dragAndDrop()) {\n return;\n }\n\n event.stopPropagation();\n event.preventDefault();\n this.isDragOver.set(true);\n }\n\n @HostListener('dragleave', ['$event'])\n protected onDragLeave(event: DragEvent): void {\n if (this.state.disabled() || !this.state.dragAndDrop() || !this.isDragOver()) {\n return;\n }\n\n // if the element we are dragging over is a child of the file upload, ignore the event\n if (this.elementRef.nativeElement.contains(event.relatedTarget as Node)) {\n return;\n }\n\n event.preventDefault();\n event.stopPropagation();\n this.isDragOver.set(false);\n this.dragOver.emit(false);\n }\n\n @HostListener('drop', ['$event'])\n protected onDrop(event: DragEvent): void {\n if (this.state.disabled() || !this.state.dragAndDrop()) {\n return;\n }\n\n event.preventDefault();\n this.isDragOver.set(false);\n this.dragOver.emit(false);\n\n const fileList = event.dataTransfer?.files;\n if (fileList) {\n const filteredFiles = fileDropFilter(fileList, this.state.fileTypes(), this.state.multiple());\n\n if (filteredFiles) {\n this.selected.emit(filteredFiles);\n } else {\n this.rejected.emit();\n }\n }\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ng-primitives-file-upload.mjs","sources":["../../../../packages/ng-primitives/file-upload/src/file-dropzone/file-drop-filter.ts","../../../../packages/ng-primitives/file-upload/src/file-dropzone/file-dropzone-state.ts","../../../../packages/ng-primitives/file-upload/src/file-dropzone/file-dropzone.ts","../../../../packages/ng-primitives/file-upload/src/file-upload/file-upload-state.ts","../../../../packages/ng-primitives/file-upload/src/file-upload/file-upload.ts","../../../../packages/ng-primitives/file-upload/src/ng-primitives-file-upload.ts"],"sourcesContent":["export function fileDropFilter(\n fileList: FileList,\n acceptedTypes: string[] | undefined,\n multiple: boolean,\n) {\n const validFiles = Array.from(fileList).filter(file => isFileTypeAccepted(file, acceptedTypes));\n\n const limitedFiles = multiple ? validFiles : validFiles.slice(0, 1);\n\n return limitedFiles.length > 0 ? filesToFileList(limitedFiles) : null;\n}\n\nexport function isFileTypeAccepted(file: File, acceptedTypes: string[] | undefined) {\n // allow all file types if no types are specified\n if (!acceptedTypes || acceptedTypes.length === 0) return true;\n\n const mimeType = file.type;\n const fileName = file.name.toLowerCase();\n\n return acceptedTypes.some(type => {\n type = type.toLowerCase();\n\n if (type.startsWith('.')) {\n return fileName.endsWith(type);\n }\n\n if (type.endsWith('/*')) {\n const baseType = type.replace('/*', '');\n return mimeType.startsWith(baseType);\n }\n\n return mimeType === type;\n });\n}\n\nfunction filesToFileList(files: File[]): FileList {\n const dataTransfer = new DataTransfer();\n files.forEach(file => dataTransfer.items.add(file));\n return dataTransfer.files;\n}\n","import { Signal, signal } from '@angular/core';\nimport { injectElementRef } from 'ng-primitives/internal';\nimport { createPrimitive, dataBinding, listener } from 'ng-primitives/state';\nimport { Observable, Subject } from 'rxjs';\nimport { fileDropFilter } from './file-drop-filter';\n\n/**\n * The state for the NgpFileDropzone directive.\n */\nexport interface NgpFileDropzoneState {\n /**\n * Whether the user is currently dragging over the element.\n */\n readonly isDragOver: Signal<boolean>;\n /**\n * Observable that emits when files are selected.\n */\n readonly selected: Observable<FileList | null>;\n /**\n * Observable that emits when files are rejected.\n */\n readonly rejected: Observable<void>;\n /**\n * Observable that emits when drag over state changes.\n */\n readonly dragOverChanged: Observable<boolean>;\n}\n\n/**\n * The props for the NgpFileDropzone state.\n */\nexport interface NgpFileDropzoneProps {\n /**\n * The accepted file types.\n */\n readonly fileTypes?: Signal<string[] | undefined>;\n /**\n * Whether multiple files can be selected.\n */\n readonly multiple?: Signal<boolean>;\n /**\n * Whether directories can be selected.\n */\n readonly directory?: Signal<boolean>;\n /**\n * Whether the file dropzone is disabled.\n */\n readonly disabled?: Signal<boolean>;\n /**\n * Callback when files are selected.\n */\n readonly onSelected?: (files: FileList | null) => void;\n /**\n * Callback when files are rejected.\n */\n readonly onRejected?: () => void;\n /**\n * Callback when drag over state changes.\n */\n readonly onDragOver?: (isDragOver: boolean) => void;\n}\n\nexport const [\n NgpFileDropzoneStateToken,\n ngpFileDropzone,\n injectFileDropzoneState,\n provideFileDropzoneState,\n] = createPrimitive(\n 'NgpFileDropzone',\n ({\n fileTypes,\n multiple,\n directory,\n disabled,\n onSelected,\n onRejected,\n onDragOver,\n }: NgpFileDropzoneProps) => {\n const element = injectElementRef();\n const isDragOverState = signal(false);\n\n // Create observables\n const selectedSubject = new Subject<FileList | null>();\n const rejectedSubject = new Subject<void>();\n const dragOverSubject = new Subject<boolean>();\n\n // Host bindings\n dataBinding(element, 'data-dragover', () => (isDragOverState() ? '' : null));\n dataBinding(element, 'data-disabled', () => (disabled?.() ? '' : null));\n\n function onDragEnter(event: DragEvent): void {\n if (disabled?.()) {\n return;\n }\n\n event.preventDefault();\n event.stopPropagation();\n isDragOverState.set(true);\n dragOverSubject.next(true);\n onDragOver?.(true);\n }\n\n function onDragOverHandler(event: DragEvent): void {\n if (disabled?.()) {\n return;\n }\n\n event.stopPropagation();\n event.preventDefault();\n isDragOverState.set(true);\n }\n\n function onDragLeave(event: DragEvent): void {\n if (disabled?.() || !isDragOverState()) {\n return;\n }\n\n // if the element we are dragging over is a child of the file dropzone, ignore the event\n if (element.nativeElement.contains(event.relatedTarget as Node)) {\n return;\n }\n\n event.preventDefault();\n event.stopPropagation();\n isDragOverState.set(false);\n dragOverSubject.next(false);\n onDragOver?.(false);\n }\n\n function onDrop(event: DragEvent): void {\n if (disabled?.()) {\n return;\n }\n\n event.preventDefault();\n isDragOverState.set(false);\n dragOverSubject.next(false);\n onDragOver?.(false);\n\n const fileList = event.dataTransfer?.files;\n if (fileList) {\n const filteredFiles = fileDropFilter(fileList, fileTypes?.(), multiple?.() ?? false);\n\n if (filteredFiles) {\n selectedSubject.next(filteredFiles);\n onSelected?.(filteredFiles);\n } else {\n rejectedSubject.next();\n onRejected?.();\n }\n }\n }\n\n // Event listeners\n listener(element, 'dragenter', onDragEnter);\n listener(element, 'dragover', onDragOverHandler);\n listener(element, 'dragleave', onDragLeave);\n listener(element, 'drop', onDrop);\n\n return {\n disabled,\n fileTypes,\n multiple,\n directory,\n isDragOver: isDragOverState,\n selected: selectedSubject.asObservable(),\n rejected: rejectedSubject.asObservable(),\n dragOverChanged: dragOverSubject.asObservable(),\n };\n },\n);\n","import { BooleanInput, coerceStringArray } from '@angular/cdk/coercion';\nimport { booleanAttribute, Directive, input, output } from '@angular/core';\nimport { ngpHoverInteraction } from 'ng-primitives/interactions';\nimport { ngpFileDropzone, provideFileDropzoneState } from './file-dropzone-state';\n\n/**\n * Capture files dropped on the element.\n */\n@Directive({\n selector: '[ngpFileDropzone]',\n exportAs: 'ngpFileDropzone',\n providers: [provideFileDropzoneState()],\n})\nexport class NgpFileDropzone {\n /**\n * The accepted file types. This can be an array of strings or a comma-separated string.\n * Accepted types can either be file extensions (e.g. `.jpg`) or MIME types (e.g. `image/jpeg`).\n */\n readonly fileTypes = input<string[], string | string[]>(undefined, {\n alias: 'ngpFileDropzoneFileTypes',\n transform: types => coerceStringArray(types, ','),\n });\n\n /**\n * Whether to allow multiple files to be selected.\n */\n readonly multiple = input<boolean, BooleanInput>(false, {\n alias: 'ngpFileDropzoneMultiple',\n transform: booleanAttribute,\n });\n\n /**\n * Whether to allow the user to select directories.\n */\n readonly directory = input<boolean, BooleanInput>(false, {\n alias: 'ngpFileDropzoneDirectory',\n transform: booleanAttribute,\n });\n\n /**\n * Whether the file upload is disabled.\n */\n readonly disabled = input<boolean, BooleanInput>(false, {\n alias: 'ngpFileDropzoneDisabled',\n transform: booleanAttribute,\n });\n\n /**\n * Emits when the user selects files.\n */\n readonly selected = output<FileList | null>({\n alias: 'ngpFileDropzoneSelected',\n });\n\n /**\n * Emits when uploaded files are rejected because they do not match the allowed {@link fileTypes}.\n */\n readonly rejected = output<void>({\n alias: 'ngpFileDropzoneRejected',\n });\n\n /**\n * Emits when the user drags a file over the file upload.\n */\n readonly dragOver = output<boolean>({\n alias: 'ngpFileDropzoneDragOver',\n });\n\n private readonly state = ngpFileDropzone({\n fileTypes: this.fileTypes,\n multiple: this.multiple,\n directory: this.directory,\n disabled: this.disabled,\n onSelected: files => this.selected.emit(files),\n onRejected: () => this.rejected.emit(),\n onDragOver: isDragOver => this.dragOver.emit(isDragOver),\n });\n\n constructor() {\n ngpHoverInteraction({ disabled: this.disabled });\n }\n\n /**\n * Whether the user is currently dragging a file over the file upload.\n */\n readonly isDragOver = this.state.isDragOver;\n}\n","import { DOCUMENT, inject, Signal, signal } from '@angular/core';\nimport { injectElementRef } from 'ng-primitives/internal';\nimport { createPrimitive, dataBinding, listener } from 'ng-primitives/state';\nimport { Observable, Subject } from 'rxjs';\nimport { fileDropFilter } from '../file-dropzone/file-drop-filter';\n\n/**\n * The state for the NgpFileUpload directive.\n */\nexport interface NgpFileUploadState {\n /**\n * Whether the user is currently dragging over the element.\n */\n readonly isDragOver: Signal<boolean>;\n /**\n * Observable that emits when files are selected.\n */\n readonly selected: Observable<FileList | null>;\n /**\n * Observable that emits when file selection is canceled.\n */\n readonly canceled: Observable<void>;\n /**\n * Observable that emits when files are rejected.\n */\n readonly rejected: Observable<void>;\n /**\n * Observable that emits when drag over state changes.\n */\n readonly dragOverChanged: Observable<boolean>;\n /**\n * Show the file dialog.\n */\n showFileDialog(): void;\n}\n\n/**\n * The props for the NgpFileUpload state.\n */\nexport interface NgpFileUploadProps {\n /**\n * The accepted file types.\n */\n readonly fileTypes?: Signal<string[] | undefined>;\n /**\n * Whether multiple files can be selected.\n */\n readonly multiple?: Signal<boolean>;\n /**\n * Whether directories can be selected.\n */\n readonly directory?: Signal<boolean>;\n /**\n * Whether drag and drop is enabled.\n */\n readonly dragAndDrop?: Signal<boolean>;\n /**\n * Whether the file upload is disabled.\n */\n readonly disabled?: Signal<boolean>;\n /**\n * Callback when files are selected.\n */\n readonly onSelected?: (files: FileList | null) => void;\n /**\n * Callback when file selection is canceled.\n */\n readonly onCanceled?: () => void;\n /**\n * Callback when files are rejected.\n */\n readonly onRejected?: () => void;\n /**\n * Callback when drag over state changes.\n */\n readonly onDragOver?: (isDragOver: boolean) => void;\n}\n\nexport const [\n NgpFileUploadStateToken,\n ngpFileUpload,\n injectFileUploadState,\n provideFileUploadState,\n] = createPrimitive(\n 'NgpFileUpload',\n ({\n fileTypes,\n multiple,\n directory,\n dragAndDrop,\n disabled,\n onSelected,\n onCanceled,\n onRejected,\n onDragOver,\n }: NgpFileUploadProps) => {\n const element = injectElementRef();\n const document = inject(DOCUMENT);\n\n const isDragOver = signal(false);\n\n // Create observables\n const selectedSubject = new Subject<FileList | null>();\n const canceledSubject = new Subject<void>();\n const rejectedSubject = new Subject<void>();\n const dragOverSubject = new Subject<boolean>();\n\n // Host bindings\n dataBinding(element, 'data-disabled', () => (disabled?.() ? '' : null));\n dataBinding(element, 'data-dragover', () => (isDragOver() ? '' : null));\n\n // Create file input\n const input: HTMLInputElement = document.createElement('input');\n input.type = 'file';\n input.style.display = 'none';\n\n input.addEventListener('change', () => {\n const files = input.files;\n selectedSubject.next(files);\n onSelected?.(files);\n input.value = '';\n });\n\n input.addEventListener('cancel', () => {\n canceledSubject.next();\n onCanceled?.();\n });\n\n function showFileDialog(): void {\n if (disabled?.()) {\n return;\n }\n\n const fileTypesValue = fileTypes?.()?.join(',');\n if (fileTypesValue) {\n input.accept = fileTypesValue;\n }\n\n input.multiple = multiple?.() ?? false;\n input.webkitdirectory = directory?.() ?? false;\n input.click();\n }\n\n function onDragEnter(event: DragEvent): void {\n if (disabled?.() || !dragAndDrop?.()) {\n return;\n }\n\n event.preventDefault();\n event.stopPropagation();\n isDragOver.set(true);\n dragOverSubject.next(true);\n onDragOver?.(true);\n }\n\n function onDragOverHandler(event: DragEvent): void {\n if (disabled?.() || !dragAndDrop?.()) {\n return;\n }\n\n event.stopPropagation();\n event.preventDefault();\n isDragOver.set(true);\n }\n\n function onDragLeave(event: DragEvent): void {\n if (disabled?.() || !dragAndDrop?.() || !isDragOver()) {\n return;\n }\n\n // if the element we are dragging over is a child of the file upload, ignore the event\n if (element.nativeElement.contains(event.relatedTarget as Node)) {\n return;\n }\n\n event.preventDefault();\n event.stopPropagation();\n isDragOver.set(false);\n dragOverSubject.next(false);\n onDragOver?.(false);\n }\n\n function onDrop(event: DragEvent): void {\n if (disabled?.() || !dragAndDrop?.()) {\n return;\n }\n\n event.preventDefault();\n isDragOver.set(false);\n dragOverSubject.next(false);\n onDragOver?.(false);\n\n const fileList = event.dataTransfer?.files;\n if (fileList) {\n const filteredFiles = fileDropFilter(fileList, fileTypes?.(), multiple?.() ?? false);\n\n if (filteredFiles) {\n selectedSubject.next(filteredFiles);\n onSelected?.(filteredFiles);\n } else {\n rejectedSubject.next();\n onRejected?.();\n }\n }\n }\n\n // Event listeners\n listener(element, 'click', showFileDialog);\n listener(element, 'dragenter', onDragEnter);\n listener(element, 'dragover', onDragOverHandler);\n listener(element, 'dragleave', onDragLeave);\n listener(element, 'drop', onDrop);\n\n return {\n isDragOver,\n selected: selectedSubject.asObservable(),\n canceled: canceledSubject.asObservable(),\n rejected: rejectedSubject.asObservable(),\n dragOverChanged: dragOverSubject.asObservable(),\n showFileDialog,\n };\n },\n);\n","import { BooleanInput, coerceStringArray } from '@angular/cdk/coercion';\nimport { booleanAttribute, Directive, input, output } from '@angular/core';\nimport { ngpInteractions } from 'ng-primitives/interactions';\nimport { ngpFileUpload, provideFileUploadState } from './file-upload-state';\n\n/**\n * A directive that allows you to turn any element into a file upload trigger.\n */\n@Directive({\n selector: '[ngpFileUpload]',\n exportAs: 'ngpFileUpload',\n providers: [provideFileUploadState()],\n})\nexport class NgpFileUpload {\n /**\n * The accepted file types. This can be an array of strings or a comma-separated string.\n * Accepted types can either be file extensions (e.g. `.jpg`) or MIME types (e.g. `image/jpeg`).\n */\n readonly fileTypes = input<string[], string | string[]>(undefined, {\n alias: 'ngpFileUploadFileTypes',\n transform: types => coerceStringArray(types, ','),\n });\n\n /**\n * Whether to allow multiple files to be selected.\n */\n readonly multiple = input<boolean, BooleanInput>(false, {\n alias: 'ngpFileUploadMultiple',\n transform: booleanAttribute,\n });\n\n /**\n * Whether to allow the user to select directories.\n */\n readonly directory = input<boolean, BooleanInput>(false, {\n alias: 'ngpFileUploadDirectory',\n transform: booleanAttribute,\n });\n\n /**\n * Whether drag-and-drop is enabled.\n */\n readonly dragAndDrop = input<boolean, BooleanInput>(true, {\n alias: 'ngpFileUploadDragDrop',\n transform: booleanAttribute,\n });\n\n /**\n * Whether the file upload is disabled.\n */\n readonly disabled = input<boolean, BooleanInput>(false, {\n alias: 'ngpFileUploadDisabled',\n transform: booleanAttribute,\n });\n\n /**\n * Emits when the user selects files.\n */\n readonly selected = output<FileList | null>({\n alias: 'ngpFileUploadSelected',\n });\n\n /**\n * Emits when the user cancel the file selection.\n */\n readonly canceled = output<void>({\n alias: 'ngpFileUploadCanceled',\n });\n\n /**\n * Emits when uploaded files are rejected because they do not match the allowed {@link fileTypes}.\n */\n readonly rejected = output<void>({\n alias: 'ngpFileUploadRejected',\n });\n\n /**\n * Emits when the user drags a file over the file upload.\n */\n readonly dragOver = output<boolean>({\n alias: 'ngpFileUploadDragOver',\n });\n\n private readonly state = ngpFileUpload({\n fileTypes: this.fileTypes,\n multiple: this.multiple,\n directory: this.directory,\n dragAndDrop: this.dragAndDrop,\n disabled: this.disabled,\n onSelected: files => this.selected.emit(files),\n onCanceled: () => this.canceled.emit(),\n onRejected: () => this.rejected.emit(),\n onDragOver: isDragOver => this.dragOver.emit(isDragOver),\n });\n\n constructor() {\n ngpInteractions({\n hover: true,\n press: true,\n focusVisible: true,\n disabled: this.disabled,\n });\n }\n\n /**\n * Whether the user is currently dragging a file over the file upload.\n */\n readonly isDragOver = this.state.isDragOver;\n\n /**\n * Show the file dialog.\n */\n showFileDialog(): void {\n this.state.showFileDialog();\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}