@mintplayer/ng-bootstrap 21.15.0 → 21.17.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.
@@ -35,6 +35,7 @@ class BsFileUploadComponent {
35
35
  this.placeholder = input('Drop files to upload', ...(ngDevMode ? [{ debugName: "placeholder" }] : []));
36
36
  this.colors = Color;
37
37
  this.isDraggingFile = signal(false, ...(ngDevMode ? [{ debugName: "isDraggingFile" }] : []));
38
+ this.fileTemplate = signal(undefined, ...(ngDevMode ? [{ debugName: "fileTemplate" }] : []));
38
39
  this.files = model([], ...(ngDevMode ? [{ debugName: "files" }] : []));
39
40
  this.filesDropped = output();
40
41
  }
@@ -80,7 +81,7 @@ class BsFileUploadComponent {
80
81
  this.filesDropped.emit(newFiles);
81
82
  }
82
83
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.6", ngImport: i0, type: BsFileUploadComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
83
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.1.6", type: BsFileUploadComponent, isStandalone: true, selector: "bs-file-upload", inputs: { dropFilesCaption: { classPropertyName: "dropFilesCaption", publicName: "dropFilesCaption", isSignal: true, isRequired: false, transformFunction: null }, browseFilesCaption: { classPropertyName: "browseFilesCaption", publicName: "browseFilesCaption", isSignal: true, isRequired: false, transformFunction: null }, placeholder: { classPropertyName: "placeholder", publicName: "placeholder", isSignal: true, isRequired: false, transformFunction: null }, files: { classPropertyName: "files", publicName: "files", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { files: "filesChange", filesDropped: "filesDropped" }, host: { listeners: { "dragover": "onDragOver($event)", "dragleave": "onDragLeave($event)", "drop": "onDrop($event)" } }, ngImport: i0, template: "<div class=\"dropzone border position-relative p-5\" [class.dragging]=\"isDraggingFile()\">\n <input type=\"file\" multiple #fileUpload (change)=\"onChange($event)\" [title]=\"placeholder()\" [placeholder]=\"placeholder()\" class=\"position-absolute w-100 h-100\">\n <!-- <img src=\"/assets/ic-file-upload.svg\" [alt]=\"placeholder()\"> -->\n <span class=\"h3 d-block\">{{ dropFilesCaption() }}</span>\n <label class=\"btn btn-primary position-relative\" [bsFor]=\"fileUpload\">{{ browseFilesCaption() }}</label>\n</div>\n<bs-list-group class=\"files-list\">\n @for (upload of files(); track upload.index) {\n <bs-list-group-item>\n <ng-container *ngTemplateOutlet=\"fileTemplate ?? defaultFileTemplate; context: { $implicit: upload }\"></ng-container>\n </bs-list-group-item>\n }\n</bs-list-group>\n\n<ng-template #defaultFileTemplate let-upload>\n <div class=\"d-flex flex-row mx-auto\">\n <div class=\"file-img\"></div>\n <div class=\"flex-grow-1 text-start px-2\">\n <span class=\"d-block text-truncate text-secondary\">{{ upload.file.name }}</span>\n <span class=\"d-block text-grey mb-0\">{{ upload.file.size | bsFormatBytes }}</span>\n <bs-progress [height]=\"4\">\n <bs-progress-bar [minimum]=\"0\" [maximum]=\"upload.file.size\" [value]=\"upload.progress\"></bs-progress-bar>\n </bs-progress>\n </div>\n </div>\n</ng-template>", styles: [".dropzone{z-index:1}.dropzone.dragging{border:4px solid #CB1535!important;background:#dc88a8;margin:-3px -3px -4px}.dropzone input{opacity:0;z-index:2;top:0;left:0}.dropzone .btn{z-index:5}.files-list{margin-top:-1px}.files-list .d-flex{max-width:400px}.text-grey{color:#999}.list-group span{margin:-5px auto}\n"], dependencies: [{ kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: BsForDirective, selector: "label[bsFor]", inputs: ["bsFor"] }, { kind: "component", type: BsListGroupComponent, selector: "bs-list-group" }, { kind: "component", type: BsListGroupItemComponent, selector: "bs-list-group-item" }, { kind: "component", type: BsProgressComponent, selector: "bs-progress", inputs: ["height", "isIndeterminate"] }, { kind: "component", type: BsProgressBarComponent, selector: "bs-progress-bar", inputs: ["minimum", "maximum", "value", "color", "striped", "animated"] }, { kind: "pipe", type: BsFormatBytesPipe, name: "bsFormatBytes" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
84
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.1.6", type: BsFileUploadComponent, isStandalone: true, selector: "bs-file-upload", inputs: { dropFilesCaption: { classPropertyName: "dropFilesCaption", publicName: "dropFilesCaption", isSignal: true, isRequired: false, transformFunction: null }, browseFilesCaption: { classPropertyName: "browseFilesCaption", publicName: "browseFilesCaption", isSignal: true, isRequired: false, transformFunction: null }, placeholder: { classPropertyName: "placeholder", publicName: "placeholder", isSignal: true, isRequired: false, transformFunction: null }, files: { classPropertyName: "files", publicName: "files", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { files: "filesChange", filesDropped: "filesDropped" }, host: { listeners: { "dragover": "onDragOver($event)", "dragleave": "onDragLeave($event)", "drop": "onDrop($event)" } }, ngImport: i0, template: "<div class=\"dropzone border position-relative p-5\" [class.dragging]=\"isDraggingFile()\">\n <input type=\"file\" multiple #fileUpload (change)=\"onChange($event)\" [title]=\"placeholder()\" [placeholder]=\"placeholder()\" class=\"position-absolute w-100 h-100\">\n <!-- <img src=\"/assets/ic-file-upload.svg\" [alt]=\"placeholder()\"> -->\n <span class=\"h3 d-block\">{{ dropFilesCaption() }}</span>\n <label class=\"btn btn-primary position-relative\" [bsFor]=\"fileUpload\">{{ browseFilesCaption() }}</label>\n</div>\n<bs-list-group class=\"files-list\">\n @for (upload of files(); track upload.index) {\n <bs-list-group-item>\n <ng-container *ngTemplateOutlet=\"fileTemplate() ?? defaultFileTemplate; context: { $implicit: upload }\"></ng-container>\n </bs-list-group-item>\n }\n</bs-list-group>\n\n<ng-template #defaultFileTemplate let-upload>\n <div class=\"d-flex flex-row mx-auto\">\n <div class=\"file-img\"></div>\n <div class=\"flex-grow-1 text-start px-2\">\n <span class=\"d-block text-truncate text-secondary\">{{ upload.file.name }}</span>\n <span class=\"d-block text-grey mb-0\">{{ upload.file.size | bsFormatBytes }}</span>\n <bs-progress [height]=\"4\">\n <bs-progress-bar [minimum]=\"0\" [maximum]=\"upload.file.size\" [value]=\"upload.progress\"></bs-progress-bar>\n </bs-progress>\n </div>\n </div>\n</ng-template>", styles: [".dropzone{z-index:1}.dropzone.dragging{border:4px solid #CB1535!important;background:#dc88a8;margin:-3px -3px -4px}.dropzone input{opacity:0;z-index:2;top:0;left:0}.dropzone .btn{z-index:5}.files-list{margin-top:-1px}.files-list .d-flex{max-width:400px}.text-grey{color:#999}.list-group span{margin:-5px auto}\n"], dependencies: [{ kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: BsForDirective, selector: "label[bsFor]", inputs: ["bsFor"] }, { kind: "component", type: BsListGroupComponent, selector: "bs-list-group" }, { kind: "component", type: BsListGroupItemComponent, selector: "bs-list-group-item" }, { kind: "component", type: BsProgressComponent, selector: "bs-progress", inputs: ["height", "isIndeterminate"] }, { kind: "component", type: BsProgressBarComponent, selector: "bs-progress-bar", inputs: ["minimum", "maximum", "value", "color", "striped", "animated"] }, { kind: "pipe", type: BsFormatBytesPipe, name: "bsFormatBytes" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
84
85
  }
85
86
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.6", ngImport: i0, type: BsFileUploadComponent, decorators: [{
86
87
  type: Component,
@@ -88,7 +89,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.6", ngImpor
88
89
  '(dragover)': 'onDragOver($event)',
89
90
  '(dragleave)': 'onDragLeave($event)',
90
91
  '(drop)': 'onDrop($event)',
91
- }, template: "<div class=\"dropzone border position-relative p-5\" [class.dragging]=\"isDraggingFile()\">\n <input type=\"file\" multiple #fileUpload (change)=\"onChange($event)\" [title]=\"placeholder()\" [placeholder]=\"placeholder()\" class=\"position-absolute w-100 h-100\">\n <!-- <img src=\"/assets/ic-file-upload.svg\" [alt]=\"placeholder()\"> -->\n <span class=\"h3 d-block\">{{ dropFilesCaption() }}</span>\n <label class=\"btn btn-primary position-relative\" [bsFor]=\"fileUpload\">{{ browseFilesCaption() }}</label>\n</div>\n<bs-list-group class=\"files-list\">\n @for (upload of files(); track upload.index) {\n <bs-list-group-item>\n <ng-container *ngTemplateOutlet=\"fileTemplate ?? defaultFileTemplate; context: { $implicit: upload }\"></ng-container>\n </bs-list-group-item>\n }\n</bs-list-group>\n\n<ng-template #defaultFileTemplate let-upload>\n <div class=\"d-flex flex-row mx-auto\">\n <div class=\"file-img\"></div>\n <div class=\"flex-grow-1 text-start px-2\">\n <span class=\"d-block text-truncate text-secondary\">{{ upload.file.name }}</span>\n <span class=\"d-block text-grey mb-0\">{{ upload.file.size | bsFormatBytes }}</span>\n <bs-progress [height]=\"4\">\n <bs-progress-bar [minimum]=\"0\" [maximum]=\"upload.file.size\" [value]=\"upload.progress\"></bs-progress-bar>\n </bs-progress>\n </div>\n </div>\n</ng-template>", styles: [".dropzone{z-index:1}.dropzone.dragging{border:4px solid #CB1535!important;background:#dc88a8;margin:-3px -3px -4px}.dropzone input{opacity:0;z-index:2;top:0;left:0}.dropzone .btn{z-index:5}.files-list{margin-top:-1px}.files-list .d-flex{max-width:400px}.text-grey{color:#999}.list-group span{margin:-5px auto}\n"] }]
92
+ }, template: "<div class=\"dropzone border position-relative p-5\" [class.dragging]=\"isDraggingFile()\">\n <input type=\"file\" multiple #fileUpload (change)=\"onChange($event)\" [title]=\"placeholder()\" [placeholder]=\"placeholder()\" class=\"position-absolute w-100 h-100\">\n <!-- <img src=\"/assets/ic-file-upload.svg\" [alt]=\"placeholder()\"> -->\n <span class=\"h3 d-block\">{{ dropFilesCaption() }}</span>\n <label class=\"btn btn-primary position-relative\" [bsFor]=\"fileUpload\">{{ browseFilesCaption() }}</label>\n</div>\n<bs-list-group class=\"files-list\">\n @for (upload of files(); track upload.index) {\n <bs-list-group-item>\n <ng-container *ngTemplateOutlet=\"fileTemplate() ?? defaultFileTemplate; context: { $implicit: upload }\"></ng-container>\n </bs-list-group-item>\n }\n</bs-list-group>\n\n<ng-template #defaultFileTemplate let-upload>\n <div class=\"d-flex flex-row mx-auto\">\n <div class=\"file-img\"></div>\n <div class=\"flex-grow-1 text-start px-2\">\n <span class=\"d-block text-truncate text-secondary\">{{ upload.file.name }}</span>\n <span class=\"d-block text-grey mb-0\">{{ upload.file.size | bsFormatBytes }}</span>\n <bs-progress [height]=\"4\">\n <bs-progress-bar [minimum]=\"0\" [maximum]=\"upload.file.size\" [value]=\"upload.progress\"></bs-progress-bar>\n </bs-progress>\n </div>\n </div>\n</ng-template>", styles: [".dropzone{z-index:1}.dropzone.dragging{border:4px solid #CB1535!important;background:#dc88a8;margin:-3px -3px -4px}.dropzone input{opacity:0;z-index:2;top:0;left:0}.dropzone .btn{z-index:5}.files-list{margin-top:-1px}.files-list .d-flex{max-width:400px}.text-grey{color:#999}.list-group span{margin:-5px auto}\n"] }]
92
93
  }], propDecorators: { dropFilesCaption: [{ type: i0.Input, args: [{ isSignal: true, alias: "dropFilesCaption", required: false }] }], browseFilesCaption: [{ type: i0.Input, args: [{ isSignal: true, alias: "browseFilesCaption", required: false }] }], placeholder: [{ type: i0.Input, args: [{ isSignal: true, alias: "placeholder", required: false }] }], files: [{ type: i0.Input, args: [{ isSignal: true, alias: "files", required: false }] }, { type: i0.Output, args: ["filesChange"] }], filesDropped: [{ type: i0.Output, args: ["filesDropped"] }] } });
93
94
 
94
95
  class BsFileUploadTemplateDirective {
@@ -96,9 +97,7 @@ class BsFileUploadTemplateDirective {
96
97
  this.fileUploadComponent = inject(BsFileUploadComponent);
97
98
  this.bsFileUploadTemplateOf = input(undefined, ...(ngDevMode ? [{ debugName: "bsFileUploadTemplateOf" }] : []));
98
99
  const templateRef = inject(TemplateRef);
99
- this.fileUploadComponent.fileTemplate = templateRef;
100
- // TODO: fileUploadComponent.files is now an input() signal and cannot be assigned from the directive.
101
- // Consider converting files to model() on BsFileUploadComponent to restore this functionality.
100
+ this.fileUploadComponent.fileTemplate.set(templateRef);
102
101
  }
103
102
  static ngTemplateContextGuard(dir, ctx) {
104
103
  return true;
@@ -1 +1 @@
1
- {"version":3,"file":"mintplayer-ng-bootstrap-file-upload.mjs","sources":["../../../../libs/mintplayer-ng-bootstrap/file-upload/src/pipes/format-bytes/format-bytes.pipe.ts","../../../../libs/mintplayer-ng-bootstrap/file-upload/src/component/file-upload.component.ts","../../../../libs/mintplayer-ng-bootstrap/file-upload/src/component/file-upload.component.html","../../../../libs/mintplayer-ng-bootstrap/file-upload/src/directive/file-upload-template.directive.ts","../../../../libs/mintplayer-ng-bootstrap/file-upload/mintplayer-ng-bootstrap-file-upload.ts"],"sourcesContent":["import { Pipe, PipeTransform } from '@angular/core';\n\n@Pipe({\n name: 'bsFormatBytes',\n pure: true,\n})\nexport class BsFormatBytesPipe implements PipeTransform {\n\n transform(value: number, decimals = 2) {\n if (value === 0) {\n return \"0 Bytes\";\n }\n\n const k = 1024;\n const dm = decimals <= 0 ? 0 : decimals;\n const sizes = [\"Bytes\", \"KB\", \"MB\", \"GB\", \"TB\", \"PB\", \"EB\", \"ZB\", \"YB\"];\n const i = Math.floor(Math.log(value) / Math.log(k));\n\n return parseFloat((value / Math.pow(k, i)).toFixed(dm)) + \" \" + sizes[i];\n }\n\n}\n","import { Component, input, model, output, signal, TemplateRef, ChangeDetectionStrategy} from '@angular/core';\nimport { NgTemplateOutlet } from '@angular/common';\nimport { BsForDirective } from '@mintplayer/ng-bootstrap/for';\nimport { BsListGroupComponent } from '@mintplayer/ng-bootstrap/list-group';\nimport { BsListGroupItemComponent } from '@mintplayer/ng-bootstrap/list-group';\nimport { BsProgressComponent, BsProgressBarComponent } from '@mintplayer/ng-bootstrap/progress-bar';\nimport { Color } from '@mintplayer/ng-bootstrap';\nimport { FileUpload } from '../file-upload';\nimport { BsFormatBytesPipe } from '../pipes/format-bytes/format-bytes.pipe';\n\n@Component({\n selector: 'bs-file-upload',\n templateUrl: './file-upload.component.html',\n styleUrls: ['./file-upload.component.scss'],\n imports: [NgTemplateOutlet, BsForDirective, BsListGroupComponent, BsListGroupItemComponent, BsProgressComponent, BsProgressBarComponent, BsFormatBytesPipe],\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n '(dragover)': 'onDragOver($event)',\n '(dragleave)': 'onDragLeave($event)',\n '(drop)': 'onDrop($event)',\n },\n})\nexport class BsFileUploadComponent {\n\n readonly dropFilesCaption = input('Drop your files here');\n readonly browseFilesCaption = input('Browse for files');\n readonly placeholder = input('Drop files to upload');\n\n readonly colors = Color;\n isDraggingFile = signal(false);\n fileTemplate?: TemplateRef<FileUpload>;\n readonly files = model<FileUpload[]>([]);\n readonly filesDropped = output<FileUpload[]>();\n\n onChange(event: Event) {\n if (!event.target) return;\n if (!('files' in event.target)) return;\n if (!event.target['files']) return;\n\n const files = (<HTMLInputElement>event.target).files;\n if (!files) return;\n\n this.processDroppedFiles(files);\n }\n\n onDragOver(event: DragEvent) {\n event.preventDefault();\n event.stopPropagation();\n\n if (event.dataTransfer) {\n this.isDraggingFile.set(true);\n event.dataTransfer.effectAllowed = \"copy\";\n }\n }\n\n onDragLeave(event: DragEvent) {\n event.preventDefault();\n event.stopPropagation();\n this.isDraggingFile.set(false);\n }\n\n onDrop(event: DragEvent) {\n event.preventDefault();\n event.stopPropagation();\n this.isDraggingFile.set(false);\n if (event.dataTransfer && event.dataTransfer.files) {\n this.processDroppedFiles(event.dataTransfer.files);\n }\n }\n\n private processDroppedFiles(fileList: FileList) {\n const newFiles = [...Array(fileList.length).keys()]\n .map(i => fileList.item(i))\n .filter(f => !!f)\n .map((file, index) => <FileUpload>{ file, progress: 0, index: this.files().length + index });\n\n this.files.update(f => [...f, ...newFiles]);\n this.filesDropped.emit(newFiles);\n }\n}\n","<div class=\"dropzone border position-relative p-5\" [class.dragging]=\"isDraggingFile()\">\n <input type=\"file\" multiple #fileUpload (change)=\"onChange($event)\" [title]=\"placeholder()\" [placeholder]=\"placeholder()\" class=\"position-absolute w-100 h-100\">\n <!-- <img src=\"/assets/ic-file-upload.svg\" [alt]=\"placeholder()\"> -->\n <span class=\"h3 d-block\">{{ dropFilesCaption() }}</span>\n <label class=\"btn btn-primary position-relative\" [bsFor]=\"fileUpload\">{{ browseFilesCaption() }}</label>\n</div>\n<bs-list-group class=\"files-list\">\n @for (upload of files(); track upload.index) {\n <bs-list-group-item>\n <ng-container *ngTemplateOutlet=\"fileTemplate ?? defaultFileTemplate; context: { $implicit: upload }\"></ng-container>\n </bs-list-group-item>\n }\n</bs-list-group>\n\n<ng-template #defaultFileTemplate let-upload>\n <div class=\"d-flex flex-row mx-auto\">\n <div class=\"file-img\"></div>\n <div class=\"flex-grow-1 text-start px-2\">\n <span class=\"d-block text-truncate text-secondary\">{{ upload.file.name }}</span>\n <span class=\"d-block text-grey mb-0\">{{ upload.file.size | bsFormatBytes }}</span>\n <bs-progress [height]=\"4\">\n <bs-progress-bar [minimum]=\"0\" [maximum]=\"upload.file.size\" [value]=\"upload.progress\"></bs-progress-bar>\n </bs-progress>\n </div>\n </div>\n</ng-template>","import { Directive, inject, input, TemplateRef } from '@angular/core';\nimport { BsFileUploadComponent } from '../component/file-upload.component';\nimport { FileUpload } from '../file-upload';\n\n@Directive({\n selector: '[bsFileUploadTemplate]',\n})\nexport class BsFileUploadTemplateDirective {\n private fileUploadComponent = inject(BsFileUploadComponent);\n\n constructor() {\n const templateRef = inject(TemplateRef);\n this.fileUploadComponent.fileTemplate = templateRef;\n\n // TODO: fileUploadComponent.files is now an input() signal and cannot be assigned from the directive.\n // Consider converting files to model() on BsFileUploadComponent to restore this functionality.\n }\n\n readonly bsFileUploadTemplateOf = input<FileUpload[] | undefined>(undefined);\n\n static ngTemplateContextGuard(dir: BsFileUploadTemplateDirective, ctx: any): ctx is BsFileUploadTemplateContext {\n return true;\n }\n\n}\n\nexport class BsFileUploadTemplateContext {\n $implicit: FileUpload = null!;\n}","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"mintplayer-ng-bootstrap-file-upload.mjs","sources":["../../../../libs/mintplayer-ng-bootstrap/file-upload/src/pipes/format-bytes/format-bytes.pipe.ts","../../../../libs/mintplayer-ng-bootstrap/file-upload/src/component/file-upload.component.ts","../../../../libs/mintplayer-ng-bootstrap/file-upload/src/component/file-upload.component.html","../../../../libs/mintplayer-ng-bootstrap/file-upload/src/directive/file-upload-template.directive.ts","../../../../libs/mintplayer-ng-bootstrap/file-upload/mintplayer-ng-bootstrap-file-upload.ts"],"sourcesContent":["import { Pipe, PipeTransform } from '@angular/core';\n\n@Pipe({\n name: 'bsFormatBytes',\n pure: true,\n})\nexport class BsFormatBytesPipe implements PipeTransform {\n\n transform(value: number, decimals = 2) {\n if (value === 0) {\n return \"0 Bytes\";\n }\n\n const k = 1024;\n const dm = decimals <= 0 ? 0 : decimals;\n const sizes = [\"Bytes\", \"KB\", \"MB\", \"GB\", \"TB\", \"PB\", \"EB\", \"ZB\", \"YB\"];\n const i = Math.floor(Math.log(value) / Math.log(k));\n\n return parseFloat((value / Math.pow(k, i)).toFixed(dm)) + \" \" + sizes[i];\n }\n\n}\n","import { Component, input, model, output, signal, TemplateRef, ChangeDetectionStrategy} from '@angular/core';\nimport { NgTemplateOutlet } from '@angular/common';\nimport { BsForDirective } from '@mintplayer/ng-bootstrap/for';\nimport { BsListGroupComponent } from '@mintplayer/ng-bootstrap/list-group';\nimport { BsListGroupItemComponent } from '@mintplayer/ng-bootstrap/list-group';\nimport { BsProgressComponent, BsProgressBarComponent } from '@mintplayer/ng-bootstrap/progress-bar';\nimport { Color } from '@mintplayer/ng-bootstrap';\nimport { FileUpload } from '../file-upload';\nimport { BsFormatBytesPipe } from '../pipes/format-bytes/format-bytes.pipe';\n\n@Component({\n selector: 'bs-file-upload',\n templateUrl: './file-upload.component.html',\n styleUrls: ['./file-upload.component.scss'],\n imports: [NgTemplateOutlet, BsForDirective, BsListGroupComponent, BsListGroupItemComponent, BsProgressComponent, BsProgressBarComponent, BsFormatBytesPipe],\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n '(dragover)': 'onDragOver($event)',\n '(dragleave)': 'onDragLeave($event)',\n '(drop)': 'onDrop($event)',\n },\n})\nexport class BsFileUploadComponent {\n\n readonly dropFilesCaption = input('Drop your files here');\n readonly browseFilesCaption = input('Browse for files');\n readonly placeholder = input('Drop files to upload');\n\n readonly colors = Color;\n isDraggingFile = signal(false);\n readonly fileTemplate = signal<TemplateRef<FileUpload> | undefined>(undefined);\n readonly files = model<FileUpload[]>([]);\n readonly filesDropped = output<FileUpload[]>();\n\n onChange(event: Event) {\n if (!event.target) return;\n if (!('files' in event.target)) return;\n if (!event.target['files']) return;\n\n const files = (<HTMLInputElement>event.target).files;\n if (!files) return;\n\n this.processDroppedFiles(files);\n }\n\n onDragOver(event: DragEvent) {\n event.preventDefault();\n event.stopPropagation();\n\n if (event.dataTransfer) {\n this.isDraggingFile.set(true);\n event.dataTransfer.effectAllowed = \"copy\";\n }\n }\n\n onDragLeave(event: DragEvent) {\n event.preventDefault();\n event.stopPropagation();\n this.isDraggingFile.set(false);\n }\n\n onDrop(event: DragEvent) {\n event.preventDefault();\n event.stopPropagation();\n this.isDraggingFile.set(false);\n if (event.dataTransfer && event.dataTransfer.files) {\n this.processDroppedFiles(event.dataTransfer.files);\n }\n }\n\n private processDroppedFiles(fileList: FileList) {\n const newFiles = [...Array(fileList.length).keys()]\n .map(i => fileList.item(i))\n .filter(f => !!f)\n .map((file, index) => <FileUpload>{ file, progress: 0, index: this.files().length + index });\n\n this.files.update(f => [...f, ...newFiles]);\n this.filesDropped.emit(newFiles);\n }\n}\n","<div class=\"dropzone border position-relative p-5\" [class.dragging]=\"isDraggingFile()\">\n <input type=\"file\" multiple #fileUpload (change)=\"onChange($event)\" [title]=\"placeholder()\" [placeholder]=\"placeholder()\" class=\"position-absolute w-100 h-100\">\n <!-- <img src=\"/assets/ic-file-upload.svg\" [alt]=\"placeholder()\"> -->\n <span class=\"h3 d-block\">{{ dropFilesCaption() }}</span>\n <label class=\"btn btn-primary position-relative\" [bsFor]=\"fileUpload\">{{ browseFilesCaption() }}</label>\n</div>\n<bs-list-group class=\"files-list\">\n @for (upload of files(); track upload.index) {\n <bs-list-group-item>\n <ng-container *ngTemplateOutlet=\"fileTemplate() ?? defaultFileTemplate; context: { $implicit: upload }\"></ng-container>\n </bs-list-group-item>\n }\n</bs-list-group>\n\n<ng-template #defaultFileTemplate let-upload>\n <div class=\"d-flex flex-row mx-auto\">\n <div class=\"file-img\"></div>\n <div class=\"flex-grow-1 text-start px-2\">\n <span class=\"d-block text-truncate text-secondary\">{{ upload.file.name }}</span>\n <span class=\"d-block text-grey mb-0\">{{ upload.file.size | bsFormatBytes }}</span>\n <bs-progress [height]=\"4\">\n <bs-progress-bar [minimum]=\"0\" [maximum]=\"upload.file.size\" [value]=\"upload.progress\"></bs-progress-bar>\n </bs-progress>\n </div>\n </div>\n</ng-template>","import { Directive, inject, input, TemplateRef } from '@angular/core';\nimport { BsFileUploadComponent } from '../component/file-upload.component';\nimport { FileUpload } from '../file-upload';\n\n@Directive({\n selector: '[bsFileUploadTemplate]',\n})\nexport class BsFileUploadTemplateDirective {\n private fileUploadComponent = inject(BsFileUploadComponent);\n\n constructor() {\n const templateRef = inject(TemplateRef);\n this.fileUploadComponent.fileTemplate.set(templateRef);\n }\n\n readonly bsFileUploadTemplateOf = input<FileUpload[] | undefined>(undefined);\n\n static ngTemplateContextGuard(dir: BsFileUploadTemplateDirective, ctx: any): ctx is BsFileUploadTemplateContext {\n return true;\n }\n\n}\n\nexport class BsFileUploadTemplateContext {\n $implicit: FileUpload = null!;\n}","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
@@ -22,6 +22,8 @@ class BsSelect2Component {
22
22
  this.selectedItems = model([], ...(ngDevMode ? [{ debugName: "selectedItems" }] : []));
23
23
  this.charWidth = 10;
24
24
  this.searchWidth = signal(20, ...(ngDevMode ? [{ debugName: "searchWidth" }] : []));
25
+ this.itemTemplate = signal(undefined, ...(ngDevMode ? [{ debugName: "itemTemplate" }] : []));
26
+ this.suggestionTemplate = signal(undefined, ...(ngDevMode ? [{ debugName: "suggestionTemplate" }] : []));
25
27
  effect(() => {
26
28
  const suggestions = this.suggestions();
27
29
  if (suggestions) {
@@ -64,7 +66,7 @@ class BsSelect2Component {
64
66
  this.searchBox().nativeElement.focus();
65
67
  }
66
68
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.6", ngImport: i0, type: BsSelect2Component, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
67
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.1.6", type: BsSelect2Component, isStandalone: true, selector: "bs-select2", inputs: { isOpen: { classPropertyName: "isOpen", publicName: "isOpen", isSignal: true, isRequired: false, transformFunction: null }, suggestions: { classPropertyName: "suggestions", publicName: "suggestions", isSignal: true, isRequired: false, transformFunction: null }, searchterm: { classPropertyName: "searchterm", publicName: "searchterm", isSignal: true, isRequired: false, transformFunction: null }, selectedItems: { classPropertyName: "selectedItems", publicName: "selectedItems", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { isOpen: "isOpenChange", suggestions: "suggestionsChange", searchterm: "searchtermChange", provideSuggestions: "provideSuggestions", selectedItems: "selectedItemsChange" }, host: { listeners: { "click": "focus()" }, properties: { "class.focus": "isFocused()" } }, viewQueries: [{ propertyName: "defaultItemTemplate", first: true, predicate: ["defaultItemTemplate"], descendants: true, isSignal: true }, { propertyName: "searchBox", first: true, predicate: ["searchBox"], descendants: true, isSignal: true }, { propertyName: "itemsBox", first: true, predicate: ["itemsBox"], descendants: true, isSignal: true }], ngImport: i0, template: "<bs-has-overlay></bs-has-overlay>\n<div bsDropdown [(isOpen)]=\"isOpen\" [hasBackdrop]=\"false\" [sameDropdownWidth]=\"true\" #itemsBox class=\"items-box text-wrap\" role=\"combobox\" [attr.aria-expanded]=\"isOpen()\">\n @for (item of selectedItems(); track item) {\n <ng-container *ngTemplateOutlet=\"itemTemplate ?? defaultItemTemplate; context: { $implicit: item, select2: this }\"></ng-container>\n }\n\n <input type=\"text\" autocomplete=\"off\"\n [ngModel]=\"searchterm()\"\n (ngModelChange)=\"onProvideSuggestions($event)\"\n (focus)=\"isFocused.set(true)\"\n (blur)=\"isFocused.set(false)\"\n [style.width.px]=\"searchWidth()\"\n aria-autocomplete=\"list\"\n aria-haspopup=\"listbox\"\n #searchBox />\n <bs-dropdown-menu *bsDropdownMenu [maxHeight]=\"200\" role=\"listbox\">\n @for (suggestion of suggestions(); track $index) {\n <bs-dropdown-item (click)=\"onSuggestionClicked(suggestion)\" [isSelected]=\"selectedItems() | bsInList:suggestion.id\" role=\"option\" [attr.aria-selected]=\"(selectedItems() | bsInList:suggestion.id) || null\">\n <ng-container *ngTemplateOutlet=\"suggestionTemplate ?? defaultSuggestionTemplate; context: { $implicit: suggestion, select2: this }\"></ng-container>\n </bs-dropdown-item>\n }\n </bs-dropdown-menu>\n</div>\n\n<ng-template #defaultItemTemplate let-item let-select2=\"select2\">\n <span class=\"select2-item\">\n <button type=\"button\" (click)=\"select2.onRemoveItem(item,$event)\" aria-label=\"Remove item\" class=\"btn-close-inline\">\u00D7</button>\n {{ item.text }}\n </span>\n</ng-template>\n\n<ng-template #defaultSuggestionTemplate let-suggestion let-select2=\"select2\">\n {{ suggestion.text }}\n</ng-template>\n", styles: [".items-box{min-height:38px;padding:0 5px 3px;cursor:text;border:1px solid #ccc}.items-box .select2-item{display:inline-block;background-color:#e4e4e4;color:#1a1a1a;border:1px solid #aaa;border-radius:4px;margin-top:5px;margin-right:5px;padding:0 5px;cursor:default;user-select:none;-webkit-user-select:none}.items-box .select2-item>span{cursor:pointer;color:#999}.items-box .select2-item>span:hover{color:#333}.items-box .select2-item>button{background:none;border:none;padding:0;cursor:pointer;color:#999}.items-box .select2-item>button:hover{color:#333}.items-box input{border:none;outline:0;margin:5px 0 2px;background:none}:host{display:block;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out}:host.focus{color:#495057;background-color:#fff;border-color:#80bdff!important;outline:0;box-shadow:0 0 0 .2rem #007bff40}ul{max-height:200px;overflow-y:auto}ul>li{padding:10px;cursor:pointer}ul>li.selected{background:#ddd}ul>li:hover{color:#fff;background-color:#5897fb}\n"], dependencies: [{ kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: BsHasOverlayComponent, selector: "bs-has-overlay" }, { kind: "directive", type: BsDropdownDirective, selector: "[bsDropdown]", inputs: ["hasBackdrop", "sameWidth", "closeOnClickOutside", "sameDropdownWidth", "isOpen"], outputs: ["isOpenChange"] }, { kind: "directive", type: BsDropdownMenuDirective, selector: "[bsDropdownMenu]" }, { kind: "component", type: BsDropdownMenuComponent, selector: "bs-dropdown-menu", inputs: ["maxHeight"] }, { kind: "component", type: BsDropdownItemComponent, selector: "bs-dropdown-item", inputs: ["isSelected", "disabled"] }, { kind: "pipe", type: BsInListPipe, name: "bsInList" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
69
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.1.6", type: BsSelect2Component, isStandalone: true, selector: "bs-select2", inputs: { isOpen: { classPropertyName: "isOpen", publicName: "isOpen", isSignal: true, isRequired: false, transformFunction: null }, suggestions: { classPropertyName: "suggestions", publicName: "suggestions", isSignal: true, isRequired: false, transformFunction: null }, searchterm: { classPropertyName: "searchterm", publicName: "searchterm", isSignal: true, isRequired: false, transformFunction: null }, selectedItems: { classPropertyName: "selectedItems", publicName: "selectedItems", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { isOpen: "isOpenChange", suggestions: "suggestionsChange", searchterm: "searchtermChange", provideSuggestions: "provideSuggestions", selectedItems: "selectedItemsChange" }, host: { listeners: { "click": "focus()" }, properties: { "class.focus": "isFocused()" } }, viewQueries: [{ propertyName: "defaultItemTemplate", first: true, predicate: ["defaultItemTemplate"], descendants: true, isSignal: true }, { propertyName: "searchBox", first: true, predicate: ["searchBox"], descendants: true, isSignal: true }, { propertyName: "itemsBox", first: true, predicate: ["itemsBox"], descendants: true, isSignal: true }], ngImport: i0, template: "<bs-has-overlay></bs-has-overlay>\n<div bsDropdown [(isOpen)]=\"isOpen\" [hasBackdrop]=\"false\" [sameDropdownWidth]=\"true\" #itemsBox class=\"items-box text-wrap\" role=\"combobox\" [attr.aria-expanded]=\"isOpen()\">\n @for (item of selectedItems(); track item) {\n <ng-container *ngTemplateOutlet=\"itemTemplate() ?? defaultItemTemplate; context: { $implicit: item, select2: this }\"></ng-container>\n }\n\n <input type=\"text\" autocomplete=\"off\"\n [ngModel]=\"searchterm()\"\n (ngModelChange)=\"onProvideSuggestions($event)\"\n (focus)=\"isFocused.set(true)\"\n (blur)=\"isFocused.set(false)\"\n [style.width.px]=\"searchWidth()\"\n aria-autocomplete=\"list\"\n aria-haspopup=\"listbox\"\n #searchBox />\n <bs-dropdown-menu *bsDropdownMenu [maxHeight]=\"200\" role=\"listbox\">\n @for (suggestion of suggestions(); track $index) {\n <bs-dropdown-item (click)=\"onSuggestionClicked(suggestion)\" [isSelected]=\"selectedItems() | bsInList:suggestion.id\" role=\"option\" [attr.aria-selected]=\"(selectedItems() | bsInList:suggestion.id) || null\">\n <ng-container *ngTemplateOutlet=\"suggestionTemplate() ?? defaultSuggestionTemplate; context: { $implicit: suggestion, select2: this }\"></ng-container>\n </bs-dropdown-item>\n }\n </bs-dropdown-menu>\n</div>\n\n<ng-template #defaultItemTemplate let-item let-select2=\"select2\">\n <span class=\"select2-item\">\n <button type=\"button\" (click)=\"select2.onRemoveItem(item,$event)\" aria-label=\"Remove item\" class=\"btn-close-inline\">\u00D7</button>\n {{ item.text }}\n </span>\n</ng-template>\n\n<ng-template #defaultSuggestionTemplate let-suggestion let-select2=\"select2\">\n {{ suggestion.text }}\n</ng-template>\n", styles: [".items-box{min-height:38px;padding:0 5px 3px;cursor:text;border:1px solid #ccc}.items-box .select2-item{display:inline-block;background-color:#e4e4e4;color:#1a1a1a;border:1px solid #aaa;border-radius:4px;margin-top:5px;margin-right:5px;padding:0 5px;cursor:default;user-select:none;-webkit-user-select:none}.items-box .select2-item>span{cursor:pointer;color:#999}.items-box .select2-item>span:hover{color:#333}.items-box .select2-item>button{background:none;border:none;padding:0;cursor:pointer;color:#999}.items-box .select2-item>button:hover{color:#333}.items-box input{border:none;outline:0;margin:5px 0 2px;background:none}:host{display:block;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out}:host.focus{color:#495057;background-color:#fff;border-color:#80bdff!important;outline:0;box-shadow:0 0 0 .2rem #007bff40}ul{max-height:200px;overflow-y:auto}ul>li{padding:10px;cursor:pointer}ul>li.selected{background:#ddd}ul>li:hover{color:#fff;background-color:#5897fb}\n"], dependencies: [{ kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: BsHasOverlayComponent, selector: "bs-has-overlay" }, { kind: "directive", type: BsDropdownDirective, selector: "[bsDropdown]", inputs: ["hasBackdrop", "sameWidth", "closeOnClickOutside", "sameDropdownWidth", "isOpen"], outputs: ["isOpenChange"] }, { kind: "directive", type: BsDropdownMenuDirective, selector: "[bsDropdownMenu]" }, { kind: "component", type: BsDropdownMenuComponent, selector: "bs-dropdown-menu", inputs: ["maxHeight"] }, { kind: "component", type: BsDropdownItemComponent, selector: "bs-dropdown-item", inputs: ["isSelected", "disabled"] }, { kind: "pipe", type: BsInListPipe, name: "bsInList" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
68
70
  }
69
71
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.6", ngImport: i0, type: BsSelect2Component, decorators: [{
70
72
  type: Component,
@@ -80,7 +82,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.6", ngImpor
80
82
  ], changeDetection: ChangeDetectionStrategy.OnPush, host: {
81
83
  '[class.focus]': 'isFocused()',
82
84
  '(click)': 'focus()',
83
- }, template: "<bs-has-overlay></bs-has-overlay>\n<div bsDropdown [(isOpen)]=\"isOpen\" [hasBackdrop]=\"false\" [sameDropdownWidth]=\"true\" #itemsBox class=\"items-box text-wrap\" role=\"combobox\" [attr.aria-expanded]=\"isOpen()\">\n @for (item of selectedItems(); track item) {\n <ng-container *ngTemplateOutlet=\"itemTemplate ?? defaultItemTemplate; context: { $implicit: item, select2: this }\"></ng-container>\n }\n\n <input type=\"text\" autocomplete=\"off\"\n [ngModel]=\"searchterm()\"\n (ngModelChange)=\"onProvideSuggestions($event)\"\n (focus)=\"isFocused.set(true)\"\n (blur)=\"isFocused.set(false)\"\n [style.width.px]=\"searchWidth()\"\n aria-autocomplete=\"list\"\n aria-haspopup=\"listbox\"\n #searchBox />\n <bs-dropdown-menu *bsDropdownMenu [maxHeight]=\"200\" role=\"listbox\">\n @for (suggestion of suggestions(); track $index) {\n <bs-dropdown-item (click)=\"onSuggestionClicked(suggestion)\" [isSelected]=\"selectedItems() | bsInList:suggestion.id\" role=\"option\" [attr.aria-selected]=\"(selectedItems() | bsInList:suggestion.id) || null\">\n <ng-container *ngTemplateOutlet=\"suggestionTemplate ?? defaultSuggestionTemplate; context: { $implicit: suggestion, select2: this }\"></ng-container>\n </bs-dropdown-item>\n }\n </bs-dropdown-menu>\n</div>\n\n<ng-template #defaultItemTemplate let-item let-select2=\"select2\">\n <span class=\"select2-item\">\n <button type=\"button\" (click)=\"select2.onRemoveItem(item,$event)\" aria-label=\"Remove item\" class=\"btn-close-inline\">\u00D7</button>\n {{ item.text }}\n </span>\n</ng-template>\n\n<ng-template #defaultSuggestionTemplate let-suggestion let-select2=\"select2\">\n {{ suggestion.text }}\n</ng-template>\n", styles: [".items-box{min-height:38px;padding:0 5px 3px;cursor:text;border:1px solid #ccc}.items-box .select2-item{display:inline-block;background-color:#e4e4e4;color:#1a1a1a;border:1px solid #aaa;border-radius:4px;margin-top:5px;margin-right:5px;padding:0 5px;cursor:default;user-select:none;-webkit-user-select:none}.items-box .select2-item>span{cursor:pointer;color:#999}.items-box .select2-item>span:hover{color:#333}.items-box .select2-item>button{background:none;border:none;padding:0;cursor:pointer;color:#999}.items-box .select2-item>button:hover{color:#333}.items-box input{border:none;outline:0;margin:5px 0 2px;background:none}:host{display:block;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out}:host.focus{color:#495057;background-color:#fff;border-color:#80bdff!important;outline:0;box-shadow:0 0 0 .2rem #007bff40}ul{max-height:200px;overflow-y:auto}ul>li{padding:10px;cursor:pointer}ul>li.selected{background:#ddd}ul>li:hover{color:#fff;background-color:#5897fb}\n"] }]
85
+ }, template: "<bs-has-overlay></bs-has-overlay>\n<div bsDropdown [(isOpen)]=\"isOpen\" [hasBackdrop]=\"false\" [sameDropdownWidth]=\"true\" #itemsBox class=\"items-box text-wrap\" role=\"combobox\" [attr.aria-expanded]=\"isOpen()\">\n @for (item of selectedItems(); track item) {\n <ng-container *ngTemplateOutlet=\"itemTemplate() ?? defaultItemTemplate; context: { $implicit: item, select2: this }\"></ng-container>\n }\n\n <input type=\"text\" autocomplete=\"off\"\n [ngModel]=\"searchterm()\"\n (ngModelChange)=\"onProvideSuggestions($event)\"\n (focus)=\"isFocused.set(true)\"\n (blur)=\"isFocused.set(false)\"\n [style.width.px]=\"searchWidth()\"\n aria-autocomplete=\"list\"\n aria-haspopup=\"listbox\"\n #searchBox />\n <bs-dropdown-menu *bsDropdownMenu [maxHeight]=\"200\" role=\"listbox\">\n @for (suggestion of suggestions(); track $index) {\n <bs-dropdown-item (click)=\"onSuggestionClicked(suggestion)\" [isSelected]=\"selectedItems() | bsInList:suggestion.id\" role=\"option\" [attr.aria-selected]=\"(selectedItems() | bsInList:suggestion.id) || null\">\n <ng-container *ngTemplateOutlet=\"suggestionTemplate() ?? defaultSuggestionTemplate; context: { $implicit: suggestion, select2: this }\"></ng-container>\n </bs-dropdown-item>\n }\n </bs-dropdown-menu>\n</div>\n\n<ng-template #defaultItemTemplate let-item let-select2=\"select2\">\n <span class=\"select2-item\">\n <button type=\"button\" (click)=\"select2.onRemoveItem(item,$event)\" aria-label=\"Remove item\" class=\"btn-close-inline\">\u00D7</button>\n {{ item.text }}\n </span>\n</ng-template>\n\n<ng-template #defaultSuggestionTemplate let-suggestion let-select2=\"select2\">\n {{ suggestion.text }}\n</ng-template>\n", styles: [".items-box{min-height:38px;padding:0 5px 3px;cursor:text;border:1px solid #ccc}.items-box .select2-item{display:inline-block;background-color:#e4e4e4;color:#1a1a1a;border:1px solid #aaa;border-radius:4px;margin-top:5px;margin-right:5px;padding:0 5px;cursor:default;user-select:none;-webkit-user-select:none}.items-box .select2-item>span{cursor:pointer;color:#999}.items-box .select2-item>span:hover{color:#333}.items-box .select2-item>button{background:none;border:none;padding:0;cursor:pointer;color:#999}.items-box .select2-item>button:hover{color:#333}.items-box input{border:none;outline:0;margin:5px 0 2px;background:none}:host{display:block;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out}:host.focus{color:#495057;background-color:#fff;border-color:#80bdff!important;outline:0;box-shadow:0 0 0 .2rem #007bff40}ul{max-height:200px;overflow-y:auto}ul>li{padding:10px;cursor:pointer}ul>li.selected{background:#ddd}ul>li:hover{color:#fff;background-color:#5897fb}\n"] }]
84
86
  }], ctorParameters: () => [], propDecorators: { isOpen: [{ type: i0.Input, args: [{ isSignal: true, alias: "isOpen", required: false }] }, { type: i0.Output, args: ["isOpenChange"] }], suggestions: [{ type: i0.Input, args: [{ isSignal: true, alias: "suggestions", required: false }] }, { type: i0.Output, args: ["suggestionsChange"] }], defaultItemTemplate: [{ type: i0.ViewChild, args: ['defaultItemTemplate', { isSignal: true }] }], searchBox: [{ type: i0.ViewChild, args: ['searchBox', { isSignal: true }] }], itemsBox: [{ type: i0.ViewChild, args: ['itemsBox', { isSignal: true }] }], searchterm: [{ type: i0.Input, args: [{ isSignal: true, alias: "searchterm", required: false }] }, { type: i0.Output, args: ["searchtermChange"] }], provideSuggestions: [{ type: i0.Output, args: ["provideSuggestions"] }], selectedItems: [{ type: i0.Input, args: [{ isSignal: true, alias: "selectedItems", required: false }] }, { type: i0.Output, args: ["selectedItemsChange"] }] } });
85
87
 
86
88
  class BsItemTemplateDirective {
@@ -88,7 +90,7 @@ class BsItemTemplateDirective {
88
90
  this.select2component = inject(BsSelect2Component);
89
91
  this.templateRef = inject(TemplateRef);
90
92
  this.bsItemTemplateOf = input(undefined, ...(ngDevMode ? [{ debugName: "bsItemTemplateOf" }] : []));
91
- this.select2component.itemTemplate = this.templateRef;
93
+ this.select2component.itemTemplate.set(this.templateRef);
92
94
  // Sync input value to component
93
95
  effect(() => {
94
96
  const value = this.bsItemTemplateOf();
@@ -154,7 +156,7 @@ class BsSuggestionTemplateDirective {
154
156
  this.select2component = inject(BsSelect2Component);
155
157
  this.bsSuggestionTemplateOf = input(undefined, ...(ngDevMode ? [{ debugName: "bsSuggestionTemplateOf" }] : []));
156
158
  const templateRef = inject(TemplateRef);
157
- this.select2component.suggestionTemplate = templateRef;
159
+ this.select2component.suggestionTemplate.set(templateRef);
158
160
  effect(() => {
159
161
  const value = this.bsSuggestionTemplateOf();
160
162
  if (value) {
@@ -1 +1 @@
1
- {"version":3,"file":"mintplayer-ng-bootstrap-select2.mjs","sources":["../../../../libs/mintplayer-ng-bootstrap/select2/src/component/select2.component.ts","../../../../libs/mintplayer-ng-bootstrap/select2/src/component/select2.component.html","../../../../libs/mintplayer-ng-bootstrap/select2/src/directive/item-template/item-template.directive.ts","../../../../libs/mintplayer-ng-bootstrap/select2/src/directive/suggestion-template/suggestion-template.directive.ts","../../../../libs/mintplayer-ng-bootstrap/select2/mintplayer-ng-bootstrap-select2.ts"],"sourcesContent":["import { NgTemplateOutlet } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, effect, ElementRef, input, model, output, signal, TemplateRef, viewChild } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { HasId } from '@mintplayer/ng-bootstrap/has-id';\nimport { BsHasOverlayComponent } from '@mintplayer/ng-bootstrap/has-overlay';\nimport { BsDropdownDirective, BsDropdownMenuDirective } from '@mintplayer/ng-bootstrap/dropdown';\nimport { BsDropdownMenuComponent, BsDropdownItemComponent } from '@mintplayer/ng-bootstrap/dropdown-menu';\nimport { BsInListPipe } from '@mintplayer/ng-bootstrap/in-list';\n\n@Component({\n selector: 'bs-select2',\n templateUrl: './select2.component.html',\n styleUrls: ['./select2.component.scss'],\n imports: [\n NgTemplateOutlet,\n FormsModule,\n BsHasOverlayComponent,\n BsDropdownDirective,\n BsDropdownMenuDirective,\n BsDropdownMenuComponent,\n BsDropdownItemComponent,\n BsInListPipe,\n ],\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n '[class.focus]': 'isFocused()',\n '(click)': 'focus()',\n },\n})\nexport class BsSelect2Component<T extends HasId<U>, U> {\n\n isOpen = model(false);\n isLoading = signal<boolean>(false);\n\n suggestions = model<T[]>([]);\n\n readonly defaultItemTemplate = viewChild.required<TemplateRef<any>>('defaultItemTemplate');\n readonly searchBox = viewChild.required<ElementRef<HTMLInputElement>>('searchBox');\n readonly itemsBox = viewChild.required<ElementRef<HTMLDivElement>>('itemsBox');\n searchterm = model('');\n provideSuggestions = output<string>();\n isFocused = signal(false);\n\n selectedItems = model<T[]>([]);\n\n private readonly charWidth = 10;\n searchWidth = signal(20);\n itemTemplate?: TemplateRef<T>;\n suggestionTemplate?: TemplateRef<T>;\n\n constructor() {\n effect(() => {\n const suggestions = this.suggestions();\n if (suggestions) {\n this.isLoading.set(false);\n }\n });\n }\n\n onProvideSuggestions(value: string) {\n this.searchterm.set(value);\n this.searchWidth.set(this.charWidth * (value.length + 2));\n if (value === '') {\n this.isOpen.set(false);\n } else {\n this.isLoading.set(true);\n this.isOpen.set(true);\n this.provideSuggestions.emit(value);\n }\n }\n\n onSuggestionClicked(suggestion: T) {\n this.searchterm.set('');\n this.isOpen.set(false);\n\n const currentItems = this.selectedItems();\n const existing = currentItems.find((value, index) => value.id === suggestion.id);\n if (existing === undefined) {\n this.selectedItems.set([...currentItems, suggestion]);\n } else {\n this.selectedItems.set(currentItems.filter(item => item.id !== suggestion.id));\n }\n\n this.searchBox().nativeElement.focus();\n }\n\n onRemoveItem(item: T, event: MouseEvent) {\n event.stopPropagation();\n const currentItems = this.selectedItems();\n this.selectedItems.set(currentItems.filter(i => i.id !== item.id));\n this.focus();\n }\n\n public focus() {\n this.searchBox().nativeElement.focus();\n }\n}\n","<bs-has-overlay></bs-has-overlay>\n<div bsDropdown [(isOpen)]=\"isOpen\" [hasBackdrop]=\"false\" [sameDropdownWidth]=\"true\" #itemsBox class=\"items-box text-wrap\" role=\"combobox\" [attr.aria-expanded]=\"isOpen()\">\n @for (item of selectedItems(); track item) {\n <ng-container *ngTemplateOutlet=\"itemTemplate ?? defaultItemTemplate; context: { $implicit: item, select2: this }\"></ng-container>\n }\n\n <input type=\"text\" autocomplete=\"off\"\n [ngModel]=\"searchterm()\"\n (ngModelChange)=\"onProvideSuggestions($event)\"\n (focus)=\"isFocused.set(true)\"\n (blur)=\"isFocused.set(false)\"\n [style.width.px]=\"searchWidth()\"\n aria-autocomplete=\"list\"\n aria-haspopup=\"listbox\"\n #searchBox />\n <bs-dropdown-menu *bsDropdownMenu [maxHeight]=\"200\" role=\"listbox\">\n @for (suggestion of suggestions(); track $index) {\n <bs-dropdown-item (click)=\"onSuggestionClicked(suggestion)\" [isSelected]=\"selectedItems() | bsInList:suggestion.id\" role=\"option\" [attr.aria-selected]=\"(selectedItems() | bsInList:suggestion.id) || null\">\n <ng-container *ngTemplateOutlet=\"suggestionTemplate ?? defaultSuggestionTemplate; context: { $implicit: suggestion, select2: this }\"></ng-container>\n </bs-dropdown-item>\n }\n </bs-dropdown-menu>\n</div>\n\n<ng-template #defaultItemTemplate let-item let-select2=\"select2\">\n <span class=\"select2-item\">\n <button type=\"button\" (click)=\"select2.onRemoveItem(item,$event)\" aria-label=\"Remove item\" class=\"btn-close-inline\">×</button>\n {{ item.text }}\n </span>\n</ng-template>\n\n<ng-template #defaultSuggestionTemplate let-suggestion let-select2=\"select2\">\n {{ suggestion.text }}\n</ng-template>\n","import { Directive, effect, inject, input, isSignal, TemplateRef, untracked, WritableSignal } from '@angular/core';\nimport { BsSelect2Component } from '../../component/select2.component';\nimport { HasId } from '@mintplayer/ng-bootstrap/has-id';\n\n@Directive({\n selector: '[bsItemTemplate]',\n})\nexport class BsItemTemplateDirective<T extends HasId<U>, U> {\n private select2component = inject<BsSelect2Component<T, U>>(BsSelect2Component);\n private templateRef = inject<TemplateRef<T>>(TemplateRef);\n private sourceSignal?: WritableSignal<T[]>;\n private lastSourceValue?: T[];\n\n constructor() {\n this.select2component.itemTemplate = this.templateRef;\n\n // Sync input value to component\n effect(() => {\n const value = this.bsItemTemplateOf();\n if (value) {\n if (isSignal(value)) {\n // Store the signal reference for two-way binding\n this.sourceSignal = value as WritableSignal<T[]>;\n this.lastSourceValue = value();\n this.select2component.selectedItems.set(value());\n } else {\n // Plain array - one-way binding (backward compatible)\n this.sourceSignal = undefined;\n this.select2component.selectedItems.set(value as T[]);\n }\n }\n });\n\n // Sync changes from component back to source signal\n effect(() => {\n const componentValue = this.select2component.selectedItems();\n if (this.sourceSignal) {\n const sourceValue = untracked(() => this.sourceSignal!());\n if (componentValue !== sourceValue) {\n this.sourceSignal.set(componentValue);\n }\n }\n });\n\n // Sync changes from source signal to component\n effect(() => {\n if (this.sourceSignal) {\n const sourceValue = this.sourceSignal();\n if (sourceValue !== this.lastSourceValue) {\n this.lastSourceValue = sourceValue;\n const componentValue = untracked(() => this.select2component.selectedItems());\n if (sourceValue !== componentValue) {\n this.select2component.selectedItems.set(sourceValue);\n }\n }\n }\n });\n }\n\n public static ngTemplateContextGuard<T extends HasId<U>, U>(dir: BsItemTemplateDirective<T, U>, ctx: any): ctx is BsItemTemplateContext<Exclude<T, false | 0 | '' | null | undefined>, U> {\n return true;\n }\n\n readonly bsItemTemplateOf = input<T[] | WritableSignal<T[]> | undefined>(undefined);\n}\n\nexport class BsItemTemplateContext<T extends HasId<U>, U> {\n $implicit: T = null!;\n select2: BsSelect2Component<T, U> = null!;\n}","import { Directive, effect, inject, input, TemplateRef } from '@angular/core';\nimport { BsSelect2Component } from '../../component/select2.component';\nimport { HasId } from '@mintplayer/ng-bootstrap/has-id';\n\n@Directive({\n selector: '[bsSuggestionTemplate]',\n})\nexport class BsSuggestionTemplateDirective<T extends HasId<U>, U> {\n private select2component = inject<BsSelect2Component<T, U>>(BsSelect2Component);\n\n constructor() {\n const templateRef = inject<TemplateRef<T>>(TemplateRef);\n this.select2component.suggestionTemplate = templateRef;\n\n effect(() => {\n const value = this.bsSuggestionTemplateOf();\n if (value) {\n this.select2component.suggestions.set(value);\n }\n });\n }\n\n public static ngTemplateContextGuard<T extends HasId<U>, U>(dir: BsSuggestionTemplateDirective<T, U>, ctx: any): ctx is BsSuggestionTemplateContext<Exclude<T, false | 0 | '' | null | undefined>, U> {\n return true;\n }\n\n readonly bsSuggestionTemplateOf = input<T[] | undefined>(undefined);\n}\n\nexport class BsSuggestionTemplateContext<T extends HasId<U>, U> {\n $implicit: T = null!;\n select2: BsSelect2Component<T, U> = null!;\n}","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"mintplayer-ng-bootstrap-select2.mjs","sources":["../../../../libs/mintplayer-ng-bootstrap/select2/src/component/select2.component.ts","../../../../libs/mintplayer-ng-bootstrap/select2/src/component/select2.component.html","../../../../libs/mintplayer-ng-bootstrap/select2/src/directive/item-template/item-template.directive.ts","../../../../libs/mintplayer-ng-bootstrap/select2/src/directive/suggestion-template/suggestion-template.directive.ts","../../../../libs/mintplayer-ng-bootstrap/select2/mintplayer-ng-bootstrap-select2.ts"],"sourcesContent":["import { NgTemplateOutlet } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, effect, ElementRef, input, model, output, signal, TemplateRef, viewChild } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { HasId } from '@mintplayer/ng-bootstrap/has-id';\nimport { BsHasOverlayComponent } from '@mintplayer/ng-bootstrap/has-overlay';\nimport { BsDropdownDirective, BsDropdownMenuDirective } from '@mintplayer/ng-bootstrap/dropdown';\nimport { BsDropdownMenuComponent, BsDropdownItemComponent } from '@mintplayer/ng-bootstrap/dropdown-menu';\nimport { BsInListPipe } from '@mintplayer/ng-bootstrap/in-list';\n\n@Component({\n selector: 'bs-select2',\n templateUrl: './select2.component.html',\n styleUrls: ['./select2.component.scss'],\n imports: [\n NgTemplateOutlet,\n FormsModule,\n BsHasOverlayComponent,\n BsDropdownDirective,\n BsDropdownMenuDirective,\n BsDropdownMenuComponent,\n BsDropdownItemComponent,\n BsInListPipe,\n ],\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n '[class.focus]': 'isFocused()',\n '(click)': 'focus()',\n },\n})\nexport class BsSelect2Component<T extends HasId<U>, U> {\n\n isOpen = model(false);\n isLoading = signal<boolean>(false);\n\n suggestions = model<T[]>([]);\n\n readonly defaultItemTemplate = viewChild.required<TemplateRef<any>>('defaultItemTemplate');\n readonly searchBox = viewChild.required<ElementRef<HTMLInputElement>>('searchBox');\n readonly itemsBox = viewChild.required<ElementRef<HTMLDivElement>>('itemsBox');\n searchterm = model('');\n provideSuggestions = output<string>();\n isFocused = signal(false);\n\n selectedItems = model<T[]>([]);\n\n private readonly charWidth = 10;\n searchWidth = signal(20);\n readonly itemTemplate = signal<TemplateRef<T> | undefined>(undefined);\n readonly suggestionTemplate = signal<TemplateRef<T> | undefined>(undefined);\n\n constructor() {\n effect(() => {\n const suggestions = this.suggestions();\n if (suggestions) {\n this.isLoading.set(false);\n }\n });\n }\n\n onProvideSuggestions(value: string) {\n this.searchterm.set(value);\n this.searchWidth.set(this.charWidth * (value.length + 2));\n if (value === '') {\n this.isOpen.set(false);\n } else {\n this.isLoading.set(true);\n this.isOpen.set(true);\n this.provideSuggestions.emit(value);\n }\n }\n\n onSuggestionClicked(suggestion: T) {\n this.searchterm.set('');\n this.isOpen.set(false);\n\n const currentItems = this.selectedItems();\n const existing = currentItems.find((value, index) => value.id === suggestion.id);\n if (existing === undefined) {\n this.selectedItems.set([...currentItems, suggestion]);\n } else {\n this.selectedItems.set(currentItems.filter(item => item.id !== suggestion.id));\n }\n\n this.searchBox().nativeElement.focus();\n }\n\n onRemoveItem(item: T, event: MouseEvent) {\n event.stopPropagation();\n const currentItems = this.selectedItems();\n this.selectedItems.set(currentItems.filter(i => i.id !== item.id));\n this.focus();\n }\n\n public focus() {\n this.searchBox().nativeElement.focus();\n }\n}\n","<bs-has-overlay></bs-has-overlay>\n<div bsDropdown [(isOpen)]=\"isOpen\" [hasBackdrop]=\"false\" [sameDropdownWidth]=\"true\" #itemsBox class=\"items-box text-wrap\" role=\"combobox\" [attr.aria-expanded]=\"isOpen()\">\n @for (item of selectedItems(); track item) {\n <ng-container *ngTemplateOutlet=\"itemTemplate() ?? defaultItemTemplate; context: { $implicit: item, select2: this }\"></ng-container>\n }\n\n <input type=\"text\" autocomplete=\"off\"\n [ngModel]=\"searchterm()\"\n (ngModelChange)=\"onProvideSuggestions($event)\"\n (focus)=\"isFocused.set(true)\"\n (blur)=\"isFocused.set(false)\"\n [style.width.px]=\"searchWidth()\"\n aria-autocomplete=\"list\"\n aria-haspopup=\"listbox\"\n #searchBox />\n <bs-dropdown-menu *bsDropdownMenu [maxHeight]=\"200\" role=\"listbox\">\n @for (suggestion of suggestions(); track $index) {\n <bs-dropdown-item (click)=\"onSuggestionClicked(suggestion)\" [isSelected]=\"selectedItems() | bsInList:suggestion.id\" role=\"option\" [attr.aria-selected]=\"(selectedItems() | bsInList:suggestion.id) || null\">\n <ng-container *ngTemplateOutlet=\"suggestionTemplate() ?? defaultSuggestionTemplate; context: { $implicit: suggestion, select2: this }\"></ng-container>\n </bs-dropdown-item>\n }\n </bs-dropdown-menu>\n</div>\n\n<ng-template #defaultItemTemplate let-item let-select2=\"select2\">\n <span class=\"select2-item\">\n <button type=\"button\" (click)=\"select2.onRemoveItem(item,$event)\" aria-label=\"Remove item\" class=\"btn-close-inline\">×</button>\n {{ item.text }}\n </span>\n</ng-template>\n\n<ng-template #defaultSuggestionTemplate let-suggestion let-select2=\"select2\">\n {{ suggestion.text }}\n</ng-template>\n","import { Directive, effect, inject, input, isSignal, TemplateRef, untracked, WritableSignal } from '@angular/core';\nimport { BsSelect2Component } from '../../component/select2.component';\nimport { HasId } from '@mintplayer/ng-bootstrap/has-id';\n\n@Directive({\n selector: '[bsItemTemplate]',\n})\nexport class BsItemTemplateDirective<T extends HasId<U>, U> {\n private select2component = inject<BsSelect2Component<T, U>>(BsSelect2Component);\n private templateRef = inject<TemplateRef<T>>(TemplateRef);\n private sourceSignal?: WritableSignal<T[]>;\n private lastSourceValue?: T[];\n\n constructor() {\n this.select2component.itemTemplate.set(this.templateRef);\n\n // Sync input value to component\n effect(() => {\n const value = this.bsItemTemplateOf();\n if (value) {\n if (isSignal(value)) {\n // Store the signal reference for two-way binding\n this.sourceSignal = value as WritableSignal<T[]>;\n this.lastSourceValue = value();\n this.select2component.selectedItems.set(value());\n } else {\n // Plain array - one-way binding (backward compatible)\n this.sourceSignal = undefined;\n this.select2component.selectedItems.set(value as T[]);\n }\n }\n });\n\n // Sync changes from component back to source signal\n effect(() => {\n const componentValue = this.select2component.selectedItems();\n if (this.sourceSignal) {\n const sourceValue = untracked(() => this.sourceSignal!());\n if (componentValue !== sourceValue) {\n this.sourceSignal.set(componentValue);\n }\n }\n });\n\n // Sync changes from source signal to component\n effect(() => {\n if (this.sourceSignal) {\n const sourceValue = this.sourceSignal();\n if (sourceValue !== this.lastSourceValue) {\n this.lastSourceValue = sourceValue;\n const componentValue = untracked(() => this.select2component.selectedItems());\n if (sourceValue !== componentValue) {\n this.select2component.selectedItems.set(sourceValue);\n }\n }\n }\n });\n }\n\n public static ngTemplateContextGuard<T extends HasId<U>, U>(dir: BsItemTemplateDirective<T, U>, ctx: any): ctx is BsItemTemplateContext<Exclude<T, false | 0 | '' | null | undefined>, U> {\n return true;\n }\n\n readonly bsItemTemplateOf = input<T[] | WritableSignal<T[]> | undefined>(undefined);\n}\n\nexport class BsItemTemplateContext<T extends HasId<U>, U> {\n $implicit: T = null!;\n select2: BsSelect2Component<T, U> = null!;\n}","import { Directive, effect, inject, input, TemplateRef } from '@angular/core';\nimport { BsSelect2Component } from '../../component/select2.component';\nimport { HasId } from '@mintplayer/ng-bootstrap/has-id';\n\n@Directive({\n selector: '[bsSuggestionTemplate]',\n})\nexport class BsSuggestionTemplateDirective<T extends HasId<U>, U> {\n private select2component = inject<BsSelect2Component<T, U>>(BsSelect2Component);\n\n constructor() {\n const templateRef = inject<TemplateRef<T>>(TemplateRef);\n this.select2component.suggestionTemplate.set(templateRef);\n\n effect(() => {\n const value = this.bsSuggestionTemplateOf();\n if (value) {\n this.select2component.suggestions.set(value);\n }\n });\n }\n\n public static ngTemplateContextGuard<T extends HasId<U>, U>(dir: BsSuggestionTemplateDirective<T, U>, ctx: any): ctx is BsSuggestionTemplateContext<Exclude<T, false | 0 | '' | null | undefined>, U> {\n return true;\n }\n\n readonly bsSuggestionTemplateOf = input<T[] | undefined>(undefined);\n}\n\nexport class BsSuggestionTemplateContext<T extends HasId<U>, U> {\n $implicit: T = null!;\n select2: BsSelect2Component<T, U> = null!;\n}","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@mintplayer/ng-bootstrap",
3
3
  "private": false,
4
- "version": "21.15.0",
4
+ "version": "21.17.0",
5
5
  "repository": {
6
6
  "type": "git",
7
7
  "url": "https://github.com/MintPlayer/mintplayer-ng-bootstrap",
@@ -14,7 +14,7 @@ declare class BsFileUploadComponent {
14
14
  readonly placeholder: _angular_core.InputSignal<string>;
15
15
  readonly colors: typeof Color;
16
16
  isDraggingFile: _angular_core.WritableSignal<boolean>;
17
- fileTemplate?: TemplateRef<FileUpload>;
17
+ readonly fileTemplate: _angular_core.WritableSignal<TemplateRef<FileUpload> | undefined>;
18
18
  readonly files: _angular_core.ModelSignal<FileUpload[]>;
19
19
  readonly filesDropped: _angular_core.OutputEmitterRef<FileUpload[]>;
20
20
  onChange(event: Event): void;
@@ -15,8 +15,8 @@ declare class BsSelect2Component<T extends HasId<U>, U> {
15
15
  selectedItems: _angular_core.ModelSignal<T[]>;
16
16
  private readonly charWidth;
17
17
  searchWidth: _angular_core.WritableSignal<number>;
18
- itemTemplate?: TemplateRef<T>;
19
- suggestionTemplate?: TemplateRef<T>;
18
+ readonly itemTemplate: _angular_core.WritableSignal<TemplateRef<T> | undefined>;
19
+ readonly suggestionTemplate: _angular_core.WritableSignal<TemplateRef<T> | undefined>;
20
20
  constructor();
21
21
  onProvideSuggestions(value: string): void;
22
22
  onSuggestionClicked(suggestion: T): void;