@yoozsoft/yoozsoft-ng 6.2.0 → 7.1.1
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.
- package/README.md +206 -94
- package/fesm2022/yoozsoft-yoozsoft-ng-autocomplete.mjs +70 -38
- package/fesm2022/yoozsoft-yoozsoft-ng-autocomplete.mjs.map +1 -1
- package/fesm2022/yoozsoft-yoozsoft-ng-datepicker.mjs +194 -109
- package/fesm2022/yoozsoft-yoozsoft-ng-datepicker.mjs.map +1 -1
- package/fesm2022/yoozsoft-yoozsoft-ng-dropdown.mjs +70 -55
- package/fesm2022/yoozsoft-yoozsoft-ng-dropdown.mjs.map +1 -1
- package/fesm2022/yoozsoft-yoozsoft-ng-file-upload.mjs +55 -33
- package/fesm2022/yoozsoft-yoozsoft-ng-file-upload.mjs.map +1 -1
- package/fesm2022/yoozsoft-yoozsoft-ng-footer.mjs +13 -11
- package/fesm2022/yoozsoft-yoozsoft-ng-footer.mjs.map +1 -1
- package/fesm2022/yoozsoft-yoozsoft-ng-loading.mjs +17 -11
- package/fesm2022/yoozsoft-yoozsoft-ng-loading.mjs.map +1 -1
- package/fesm2022/yoozsoft-yoozsoft-ng-navbar.mjs +37 -28
- package/fesm2022/yoozsoft-yoozsoft-ng-navbar.mjs.map +1 -1
- package/fesm2022/yoozsoft-yoozsoft-ng-overlay.mjs +7 -6
- package/fesm2022/yoozsoft-yoozsoft-ng-overlay.mjs.map +1 -1
- package/fesm2022/yoozsoft-yoozsoft-ng-pagination.mjs +39 -28
- package/fesm2022/yoozsoft-yoozsoft-ng-pagination.mjs.map +1 -1
- package/fesm2022/yoozsoft-yoozsoft-ng-password-strength.mjs +65 -39
- package/fesm2022/yoozsoft-yoozsoft-ng-password-strength.mjs.map +1 -1
- package/fesm2022/yoozsoft-yoozsoft-ng-pipes.mjs +3 -3
- package/fesm2022/yoozsoft-yoozsoft-ng-pipes.mjs.map +1 -1
- package/fesm2022/yoozsoft-yoozsoft-ng-progress.mjs +26 -17
- package/fesm2022/yoozsoft-yoozsoft-ng-progress.mjs.map +1 -1
- package/fesm2022/yoozsoft-yoozsoft-ng-rating.mjs +155 -0
- package/fesm2022/yoozsoft-yoozsoft-ng-rating.mjs.map +1 -0
- package/fesm2022/yoozsoft-yoozsoft-ng-select.mjs +47 -33
- package/fesm2022/yoozsoft-yoozsoft-ng-select.mjs.map +1 -1
- package/fesm2022/yoozsoft-yoozsoft-ng-sidebar.mjs +30 -29
- package/fesm2022/yoozsoft-yoozsoft-ng-sidebar.mjs.map +1 -1
- package/fesm2022/yoozsoft-yoozsoft-ng-table.mjs +93 -84
- package/fesm2022/yoozsoft-yoozsoft-ng-table.mjs.map +1 -1
- package/fesm2022/yoozsoft-yoozsoft-ng-tiff-viewer.mjs +41 -27
- package/fesm2022/yoozsoft-yoozsoft-ng-tiff-viewer.mjs.map +1 -1
- package/fesm2022/yoozsoft-yoozsoft-ng-toast.mjs +20 -18
- package/fesm2022/yoozsoft-yoozsoft-ng-toast.mjs.map +1 -1
- package/package.json +12 -4
- package/rating/package.json +4 -0
- package/types/yoozsoft-yoozsoft-ng-rating.d.ts +56 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"yoozsoft-yoozsoft-ng-dropdown.mjs","sources":["../../../../projects/yoozsoft/yoozsoft-ng/dropdown/src/ys-dropdown/ys-dropdown.ts","../../../../projects/yoozsoft/yoozsoft-ng/dropdown/src/ys-dropdown/ys-dropdown.html","../../../../projects/yoozsoft/yoozsoft-ng/dropdown/public-api.ts","../../../../projects/yoozsoft/yoozsoft-ng/dropdown/yoozsoft-yoozsoft-ng-dropdown.ts"],"sourcesContent":["import { isPlatformBrowser, NgClass, NgTemplateOutlet } from '@angular/common';\nimport { Component, computed, effect, ElementRef, forwardRef, HostListener, inject, input, output, PLATFORM_ID, signal, TemplateRef } from '@angular/core';\nimport { ControlValueAccessor, FormsModule, NG_VALUE_ACCESSOR } from '@angular/forms';\n\ninterface ItemTemplate {\n raw: unknown;\n label: string;\n value: unknown;\n disabled: boolean;\n}\n\n@Component({\n selector: 'ys-dropdown',\n imports: [\n NgTemplateOutlet,\n FormsModule,\n NgClass\n ],\n templateUrl: './ys-dropdown.html',\n styleUrl: './ys-dropdown.scss',\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => YsDropdown),\n multi: true,\n },\n ],\n})\nexport class YsDropdown implements ControlValueAccessor {\n\n private elRef = inject(ElementRef)\n private platformId = inject(PLATFORM_ID);\n\n /** List of options */\n options = input<any[]>([]);\n /** Field of object that display as label */\n optionLabel = input<string>('label');\n placeholder = input<string>('');\n searchPlaceholder = input<string>('');\n selectedMaxLength = input<number>(3);\n selectedMaxLengthTemplate = input<string>('{length} items selected');\n selectionSeparator = input<string>(\", \");\n dropDownToggleIconClass = input<string>(\"fa fa-chevron-down\");\n clearIconClass = input<string>(\"fa fa-times\");\n multipleCheckIconClass = input<string>(\"fa fa-check\");\n\n /** Multiple choice mode */\n multiple = input<boolean>(false);\n showClear = input<boolean>(false);\n\n /** Search capability */\n searchable = input<boolean>(false);\n\n disabled = input<boolean>(false);\n\n /** Custom template for items */\n itemTemplate = input<TemplateRef<any>>();\n\n\n /** Output event when selection changes */\n selectionChange = output<unknown | unknown[] | null>();\n\n searchTerm = signal<string>('');\n isOpen = signal<boolean>(false);\n highlightedIndex = signal<number>(-1);\n /** Selected value */\n selected = signal<any[] | any>(null);\n\n private disabledState = signal(false);\n readonly isDisabled = computed(() => this.disabled() || this.disabledState());\n\n readonly filteredOptions = computed<ItemTemplate[]>(() => {\n\n if (!this.searchable() || !this.searchTerm().trim()) {\n return this.normalizedOptions();\n }\n\n const term = this.searchTerm().toLowerCase();\n\n return this.normalizedOptions().filter(opt =>\n opt.label.toLowerCase().includes(term)\n );\n\n });\n\n readonly normalizedOptions = computed(() =>\n this.normalizeOptions(this.options())\n );\n\n readonly hasSelection = computed(() =>\n this.multiple()\n ? Array.isArray(this.selected()) && this.selected().length > 0\n : !!this.selected()\n );\n\n readonly selectedLabels = computed(() => {\n\n if (this.multiple()) {\n if (!Array.isArray(this.selected())) return '';\n\n // لیست object های انتخابی را پیدا میکنیم\n const selectedItems = this.normalizedOptions().filter(o =>\n this.selected().includes(o.value)\n );\n\n const count = selectedItems.length;\n\n // اگر بیشتر از حد مجاز باشد → متن سفارشی\n if (count > this.selectedMaxLength()) {\n return this.selectedMaxLengthTemplate().replace('{length}', count + '');\n }\n\n // در غیر اینصورت لیبلها را نمایش بده\n return selectedItems.map(o => o.label).join(this.selectionSeparator());\n }\n\n const item = this.normalizedOptions().find(o => o.value === this.selected());\n return item?.label ?? '';\n\n });\n\n private _onChange = (_: unknown) => { };\n private _onTouched: () => void = () => { };\n\n constructor() {\n effect(() =>\n this.selected.set(this.multiple() ? [] : null)\n );\n }\n\n writeValue(obj: any): void {\n this.selected.set(this.multiple()\n ? Array.isArray(obj) ? obj : []\n : obj);\n }\n registerOnChange(fn: any): void {\n this._onChange = fn;\n }\n registerOnTouched(fn: any): void {\n this._onTouched = fn;\n }\n setDisabledState?(isDisabled: boolean): void {\n this.disabledState.set(isDisabled);\n }\n\n private normalizeOptions(list: any[]): ItemTemplate[] {\n if (!Array.isArray(list)) return [];\n\n return list.map(item => {\n\n // 1. اگر primitive بود\n if (['string', 'number', 'boolean'].includes(typeof item)) {\n return <ItemTemplate>{\n raw: item,\n label: String(item),\n value: item,\n disabled: false\n };\n }\n\n // 2. اگر OptionItem<T> بود\n if (item && typeof item === 'object' && 'value' in item) {\n return <ItemTemplate>{\n raw: item,\n label: item.label ?? String(item.value),\n value: item.value,\n disabled: item.disabled,\n ...item\n };\n }\n\n // 3. object معمولی\n return <ItemTemplate>{\n raw: item,\n label: item[this.optionLabel()] ?? JSON.stringify(item),\n value: item,\n disabled: false\n };\n });\n }\n\n toggleDropdown() {\n this.isOpen.update(v => !v);\n this.highlightedIndex.set(-1);\n }\n\n selectOption(option: ItemTemplate) {\n if (option.disabled) return;\n\n const value = option.value;\n\n if (this.multiple()) {\n this.selected.update((list: any[]) =>\n list?.includes(value)\n ? list.filter(x => x !== value)\n : [...(list || []), value]\n );\n } else {\n this.selected.set(value);\n this.isOpen.set(false);\n }\n\n this._onChange(this.selected());\n this.selectionChange.emit(this.selected());\n this._onTouched();\n }\n\n isSelected(option: any): boolean {\n if (this.multiple()) {\n return Array.isArray(this.selected())\n ? this.selected().includes(option.value)\n : false;\n }\n\n return this.selected() === option.value;\n }\n\n clearSelection() {\n this.selected.set(this.multiple() ? [] : null);\n this._onChange(this.selected());\n this.selectionChange.emit(this.selected());\n this._onTouched();\n }\n\n onKeyDown(event: KeyboardEvent) {\n const list = this.filteredOptions();\n if (!list.length) return;\n\n switch (event.key) {\n case 'ArrowDown':\n event.preventDefault();\n this.highlightedIndex.update(i => (i + 1) % list.length);\n this.scrollToHighlighted();\n break;\n\n case 'ArrowUp':\n event.preventDefault();\n this.highlightedIndex.update(i =>\n i > 0 ? i - 1 : list.length - 1\n );\n this.scrollToHighlighted();\n break;\n\n case 'Enter':\n event.preventDefault();\n\n if (!this.isOpen()) {\n this.isOpen.set(true);\n return;\n }\n\n const idx = this.highlightedIndex();\n if (idx >= 0) this.selectOption(list[idx]);\n break;\n\n case 'Tab':\n this.isOpen.set(false);\n break;\n\n case 'Escape':\n this.isOpen.set(false);\n break;\n }\n }\n\n scrollToHighlighted() {\n if (!isPlatformBrowser(this.platformId)) return;\n\n queueMicrotask(() => {\n const dropdown = this.elRef.nativeElement.querySelector('.dropdown-menu');\n const items = dropdown?.querySelectorAll('.dropdown-item');\n const activeItem = items?.[this.highlightedIndex()] as HTMLElement;\n\n if (!activeItem || !dropdown) return;\n\n const itemTop = activeItem.offsetTop;\n const itemBottom = itemTop + activeItem.offsetHeight;\n const dropdownScrollTop = dropdown.scrollTop;\n const dropdownHeight = dropdown.clientHeight;\n\n if (itemBottom > dropdownScrollTop + dropdownHeight) {\n dropdown.scrollTop = itemBottom - dropdownHeight;\n } else if (itemTop < dropdownScrollTop) {\n dropdown.scrollTop = itemTop;\n }\n });\n }\n\n /** Close by clicking outside */\n @HostListener('document:click', ['$event'])\n onClickOutside(event: MouseEvent) {\n if (!isPlatformBrowser(this.platformId)) return;\n\n if (!this.isOpen()) return;\n\n const clickedInside = this.elRef.nativeElement.contains(event.target);\n if (!clickedInside) {\n this.isOpen.set(false);\n }\n }\n\n}\n","<div class=\"dropdown ys-dropdown\">\n <div class=\"input-group w-100\">\n <input #inputRef type=\"text\" class=\"form-control\" [value]=\"selectedLabels()\" [placeholder]=\"placeholder()\"\n readonly (click)=\"isOpen.set(true)\" (keydown)=\"onKeyDown($event)\" [disabled]=\"isDisabled()\" />\n <!-- (focus)=\"isOpen.set(true)\" replace with (click)=\"isOpen.set(true)\" (keydown.enter)=\"isOpen.set(true)\" -->\n\n @if(showClear() && hasSelection()){\n <button class=\"btn btn-outline-secondary\" type=\"button\" (click)=\"clearSelection()\" [disabled]=\"isDisabled()\">\n <i [ngClass]=\"clearIconClass()\"></i>\n </button>\n }\n\n <button class=\"btn btn-outline-secondary dropdown-toggle\" type=\"button\" (click)=\"toggleDropdown()\"\n [disabled]=\"isDisabled()\">\n <i [ngClass]=\"dropDownToggleIconClass()\"></i>\n </button>\n </div>\n <div class=\"dropdown-menu w-100 overflow-auto\" [class.show]=\"isOpen()\">\n\n @if(searchable()){\n <div class=\"px-2\">\n <input type=\"text\" class=\"form-control mb-2\" [placeholder]=\"searchPlaceholder()\" [ngModel]=\"searchTerm()\"\n (ngModelChange)=\"searchTerm.set($event)\" (keydown)=\"onKeyDown($event)\">\n </div>\n }\n\n @for (option of filteredOptions(); track option.value) {\n <div class=\"dropdown-item\" (click)=\"selectOption(option)\" [class.active]=\"isSelected(option)\"\n [class.highlighted]=\"$index === highlightedIndex()\">\n\n @if(itemTemplate()){\n <ng-container [ngTemplateOutlet]=\"itemTemplate()\" [ngTemplateOutletContext]=\"{ option: option }\">\n </ng-container>\n } @else {\n @if(multiple()){\n <i class=\"{{multipleCheckIconClass()}} text-success me-1\" [class.invisible]=\"!isSelected(option)\"></i>\n }\n <!-- <span>{{option[optionLabel]}}</span> -->\n <span>{{option.label}}</span>\n }\n </div>\n }\n </div>\n</div>","/*\r\n * Public API Surface of ys-dropdown\r\n */\r\n\r\nexport * from './src/models';\r\nexport * from './src/ys-dropdown/ys-dropdown';\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"yoozsoft-yoozsoft-ng-dropdown.mjs","sources":["../../../../projects/yoozsoft/yoozsoft-ng/dropdown/src/ys-dropdown/ys-dropdown.ts","../../../../projects/yoozsoft/yoozsoft-ng/dropdown/src/ys-dropdown/ys-dropdown.html","../../../../projects/yoozsoft/yoozsoft-ng/dropdown/public-api.ts","../../../../projects/yoozsoft/yoozsoft-ng/dropdown/yoozsoft-yoozsoft-ng-dropdown.ts"],"sourcesContent":["import { isPlatformBrowser, NgClass, NgTemplateOutlet } from '@angular/common';\r\nimport {\r\n Component,\r\n computed,\r\n effect,\r\n ElementRef,\r\n forwardRef,\r\n HostListener,\r\n inject,\r\n input,\r\n output,\r\n PLATFORM_ID,\r\n signal,\r\n TemplateRef,\r\n ChangeDetectionStrategy,\r\n} from '@angular/core';\r\nimport { ControlValueAccessor, FormsModule, NG_VALUE_ACCESSOR } from '@angular/forms';\r\n\r\ninterface ItemTemplate {\r\n raw: unknown;\r\n label: string;\r\n value: unknown;\r\n disabled: boolean;\r\n}\r\n\r\n@Component({\r\n selector: 'ys-dropdown',\r\n imports: [NgTemplateOutlet, FormsModule, NgClass],\r\n templateUrl: './ys-dropdown.html',\r\n styleUrl: './ys-dropdown.scss',\r\n changeDetection: ChangeDetectionStrategy.Eager,\r\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => YsDropdown),\r\n multi: true,\r\n },\r\n ],\r\n})\r\nexport class YsDropdown implements ControlValueAccessor {\r\n private elRef = inject(ElementRef);\r\n private platformId = inject(PLATFORM_ID);\r\n\r\n /** List of options */\r\n options = input<any[]>([]);\r\n /** Field of object that display as label */\r\n optionLabel = input<string>('label');\r\n placeholder = input<string>('');\r\n searchPlaceholder = input<string>('');\r\n selectedMaxLength = input<number>(3);\r\n selectedMaxLengthTemplate = input<string>('{length} items selected');\r\n selectionSeparator = input<string>(', ');\r\n dropDownToggleIconClass = input<string>('fa fa-chevron-down');\r\n clearIconClass = input<string>('fa fa-times');\r\n multipleCheckIconClass = input<string>('fa fa-check');\r\n\r\n /** Multiple choice mode */\r\n multiple = input<boolean>(false);\r\n showClear = input<boolean>(false);\r\n\r\n /** Search capability */\r\n searchable = input<boolean>(false);\r\n\r\n disabled = input<boolean>(false);\r\n\r\n /** Custom template for items */\r\n itemTemplate = input<TemplateRef<any>>();\r\n\r\n /** Output event when selection changes */\r\n selectionChange = output<unknown | unknown[] | null>();\r\n\r\n searchTerm = signal<string>('');\r\n isOpen = signal<boolean>(false);\r\n highlightedIndex = signal<number>(-1);\r\n /** Selected value */\r\n selected = signal<any[] | any>(null);\r\n\r\n private disabledState = signal(false);\r\n readonly isDisabled = computed(() => this.disabled() || this.disabledState());\r\n\r\n readonly filteredOptions = computed<ItemTemplate[]>(() => {\r\n if (!this.searchable() || !this.searchTerm().trim()) {\r\n return this.normalizedOptions();\r\n }\r\n\r\n const term = this.searchTerm().toLowerCase();\r\n\r\n return this.normalizedOptions().filter((opt) => opt.label.toLowerCase().includes(term));\r\n });\r\n\r\n readonly normalizedOptions = computed(() => this.normalizeOptions(this.options()));\r\n\r\n readonly hasSelection = computed(() =>\r\n this.multiple()\r\n ? Array.isArray(this.selected()) && this.selected().length > 0\r\n : !!this.selected(),\r\n );\r\n\r\n readonly selectedLabels = computed(() => {\r\n if (this.multiple()) {\r\n if (!Array.isArray(this.selected())) return '';\r\n\r\n // لیست object های انتخابی را پیدا میکنیم\r\n const selectedItems = this.normalizedOptions().filter((o) =>\r\n this.selected().includes(o.value),\r\n );\r\n\r\n const count = selectedItems.length;\r\n\r\n // اگر بیشتر از حد مجاز باشد → متن سفارشی\r\n if (count > this.selectedMaxLength()) {\r\n return this.selectedMaxLengthTemplate().replace('{length}', count + '');\r\n }\r\n\r\n // در غیر اینصورت لیبلها را نمایش بده\r\n return selectedItems.map((o) => o.label).join(this.selectionSeparator());\r\n }\r\n\r\n const item = this.normalizedOptions().find((o) => o.value === this.selected());\r\n return item?.label ?? '';\r\n });\r\n\r\n private _onChange = (_: unknown) => {};\r\n private _onTouched: () => void = () => {};\r\n\r\n constructor() {\r\n effect(() => this.selected.set(this.multiple() ? [] : null));\r\n }\r\n\r\n writeValue(obj: any): void {\r\n this.selected.set(this.multiple() ? (Array.isArray(obj) ? obj : []) : obj);\r\n }\r\n registerOnChange(fn: any): void {\r\n this._onChange = fn;\r\n }\r\n registerOnTouched(fn: any): void {\r\n this._onTouched = fn;\r\n }\r\n setDisabledState?(isDisabled: boolean): void {\r\n this.disabledState.set(isDisabled);\r\n }\r\n\r\n private normalizeOptions(list: any[]): ItemTemplate[] {\r\n if (!Array.isArray(list)) return [];\r\n\r\n return list.map((item) => {\r\n // 1. اگر primitive بود\r\n if (['string', 'number', 'boolean'].includes(typeof item)) {\r\n return <ItemTemplate>{\r\n raw: item,\r\n label: String(item),\r\n value: item,\r\n disabled: false,\r\n };\r\n }\r\n\r\n // 2. اگر OptionItem<T> بود\r\n if (item && typeof item === 'object' && 'value' in item) {\r\n return <ItemTemplate>{\r\n raw: item,\r\n label: item.label ?? String(item.value),\r\n value: item.value,\r\n disabled: item.disabled,\r\n ...item,\r\n };\r\n }\r\n\r\n // 3. object معمولی\r\n return <ItemTemplate>{\r\n raw: item,\r\n label: item[this.optionLabel()] ?? JSON.stringify(item),\r\n value: item,\r\n disabled: false,\r\n };\r\n });\r\n }\r\n\r\n toggleDropdown() {\r\n this.isOpen.update((v) => !v);\r\n this.highlightedIndex.set(-1);\r\n }\r\n\r\n selectOption(option: ItemTemplate) {\r\n if (option.disabled) return;\r\n\r\n const value = option.value;\r\n\r\n if (this.multiple()) {\r\n this.selected.update((list: any[]) =>\r\n list?.includes(value) ? list.filter((x) => x !== value) : [...(list || []), value],\r\n );\r\n } else {\r\n this.selected.set(value);\r\n this.isOpen.set(false);\r\n }\r\n\r\n this._onChange(this.selected());\r\n this.selectionChange.emit(this.selected());\r\n this._onTouched();\r\n }\r\n\r\n isSelected(option: any): boolean {\r\n if (this.multiple()) {\r\n return Array.isArray(this.selected()) ? this.selected().includes(option.value) : false;\r\n }\r\n\r\n return this.selected() === option.value;\r\n }\r\n\r\n clearSelection() {\r\n this.selected.set(this.multiple() ? [] : null);\r\n this._onChange(this.selected());\r\n this.selectionChange.emit(this.selected());\r\n this._onTouched();\r\n }\r\n\r\n onKeyDown(event: KeyboardEvent) {\r\n const list = this.filteredOptions();\r\n if (!list.length) return;\r\n\r\n switch (event.key) {\r\n case 'ArrowDown':\r\n event.preventDefault();\r\n this.highlightedIndex.update((i) => (i + 1) % list.length);\r\n this.scrollToHighlighted();\r\n break;\r\n\r\n case 'ArrowUp':\r\n event.preventDefault();\r\n this.highlightedIndex.update((i) => (i > 0 ? i - 1 : list.length - 1));\r\n this.scrollToHighlighted();\r\n break;\r\n\r\n case 'Enter':\r\n event.preventDefault();\r\n\r\n if (!this.isOpen()) {\r\n this.isOpen.set(true);\r\n return;\r\n }\r\n\r\n const idx = this.highlightedIndex();\r\n if (idx >= 0) this.selectOption(list[idx]);\r\n break;\r\n\r\n case 'Tab':\r\n this.isOpen.set(false);\r\n break;\r\n\r\n case 'Escape':\r\n this.isOpen.set(false);\r\n break;\r\n }\r\n }\r\n\r\n scrollToHighlighted() {\r\n if (!isPlatformBrowser(this.platformId)) return;\r\n\r\n queueMicrotask(() => {\r\n const dropdown = this.elRef.nativeElement.querySelector('.dropdown-menu');\r\n const items = dropdown?.querySelectorAll('.dropdown-item');\r\n const activeItem = items?.[this.highlightedIndex()] as HTMLElement;\r\n\r\n if (!activeItem || !dropdown) return;\r\n\r\n const itemTop = activeItem.offsetTop;\r\n const itemBottom = itemTop + activeItem.offsetHeight;\r\n const dropdownScrollTop = dropdown.scrollTop;\r\n const dropdownHeight = dropdown.clientHeight;\r\n\r\n if (itemBottom > dropdownScrollTop + dropdownHeight) {\r\n dropdown.scrollTop = itemBottom - dropdownHeight;\r\n } else if (itemTop < dropdownScrollTop) {\r\n dropdown.scrollTop = itemTop;\r\n }\r\n });\r\n }\r\n\r\n /** Close by clicking outside */\r\n @HostListener('document:click', ['$event'])\r\n onClickOutside(event: MouseEvent) {\r\n if (!isPlatformBrowser(this.platformId)) return;\r\n\r\n if (!this.isOpen()) return;\r\n\r\n const clickedInside = this.elRef.nativeElement.contains(event.target);\r\n if (!clickedInside) {\r\n this.isOpen.set(false);\r\n }\r\n }\r\n}\r\n","<div class=\"dropdown ys-dropdown\">\n <div class=\"input-group w-100\">\n <input #inputRef type=\"text\" class=\"form-control\" [value]=\"selectedLabels()\" [placeholder]=\"placeholder()\"\n readonly (click)=\"isOpen.set(true)\" (keydown)=\"onKeyDown($event)\" [disabled]=\"isDisabled()\" />\n <!-- (focus)=\"isOpen.set(true)\" replace with (click)=\"isOpen.set(true)\" (keydown.enter)=\"isOpen.set(true)\" -->\n\n @if(showClear() && hasSelection()){\n <button class=\"btn btn-outline-secondary\" type=\"button\" (click)=\"clearSelection()\" [disabled]=\"isDisabled()\">\n <i [ngClass]=\"clearIconClass()\"></i>\n </button>\n }\n\n <button class=\"btn btn-outline-secondary dropdown-toggle\" type=\"button\" (click)=\"toggleDropdown()\"\n [disabled]=\"isDisabled()\">\n <i [ngClass]=\"dropDownToggleIconClass()\"></i>\n </button>\n </div>\n <div class=\"dropdown-menu w-100 overflow-auto\" [class.show]=\"isOpen()\">\n\n @if(searchable()){\n <div class=\"px-2\">\n <input type=\"text\" class=\"form-control mb-2\" [placeholder]=\"searchPlaceholder()\" [ngModel]=\"searchTerm()\"\n (ngModelChange)=\"searchTerm.set($event)\" (keydown)=\"onKeyDown($event)\">\n </div>\n }\n\n @for (option of filteredOptions(); track option.value) {\n <div class=\"dropdown-item\" (click)=\"selectOption(option)\" [class.active]=\"isSelected(option)\"\n [class.highlighted]=\"$index === highlightedIndex()\">\n\n @if(itemTemplate()){\n <ng-container [ngTemplateOutlet]=\"itemTemplate()\" [ngTemplateOutletContext]=\"{ option: option }\">\n </ng-container>\n } @else {\n @if(multiple()){\n <i class=\"{{multipleCheckIconClass()}} text-success me-1\" [class.invisible]=\"!isSelected(option)\"></i>\n }\n <!-- <span>{{option[optionLabel]}}</span> -->\n <span>{{option.label}}</span>\n }\n </div>\n }\n </div>\n</div>","/*\r\n * Public API Surface of ys-dropdown\r\n */\r\n\r\nexport * from './src/models';\r\nexport * from './src/ys-dropdown/ys-dropdown';\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
|
|
@@ -1,49 +1,65 @@
|
|
|
1
1
|
import { NgClass } from '@angular/common';
|
|
2
2
|
import * as i0 from '@angular/core';
|
|
3
|
-
import { input, output, signal, computed, forwardRef, Component } from '@angular/core';
|
|
3
|
+
import { input, output, signal, computed, forwardRef, ChangeDetectionStrategy, Component } from '@angular/core';
|
|
4
4
|
import { NG_VALUE_ACCESSOR } from '@angular/forms';
|
|
5
5
|
|
|
6
6
|
class YsFileUpload {
|
|
7
|
-
id = input(
|
|
8
|
-
|
|
7
|
+
id = input(/* @ts-ignore */
|
|
8
|
+
...(ngDevMode ? [undefined, { debugName: "id" }] : /* istanbul ignore next */ []));
|
|
9
|
+
styleClass = input(/* @ts-ignore */
|
|
10
|
+
...(ngDevMode ? [undefined, { debugName: "styleClass" }] : /* istanbul ignore next */ []));
|
|
9
11
|
/**
|
|
10
12
|
* Allowing upload multiple files
|
|
11
13
|
* Default is false
|
|
12
14
|
*/
|
|
13
|
-
multiple = input(false,
|
|
15
|
+
multiple = input(false, /* @ts-ignore */
|
|
16
|
+
...(ngDevMode ? [{ debugName: "multiple" }] : /* istanbul ignore next */ []));
|
|
14
17
|
/**
|
|
15
18
|
* Acceptable type of files
|
|
16
19
|
* Default is all file type
|
|
17
20
|
*/
|
|
18
|
-
accept = input('*/*',
|
|
21
|
+
accept = input('*/*', /* @ts-ignore */
|
|
22
|
+
...(ngDevMode ? [{ debugName: "accept" }] : /* istanbul ignore next */ []));
|
|
19
23
|
/**
|
|
20
24
|
* Upload button label
|
|
21
25
|
* Default is Choose File
|
|
22
26
|
*/
|
|
23
|
-
uploadLabel = input('Choose File',
|
|
27
|
+
uploadLabel = input('Choose File', /* @ts-ignore */
|
|
28
|
+
...(ngDevMode ? [{ debugName: "uploadLabel" }] : /* istanbul ignore next */ []));
|
|
24
29
|
/**Style class of upload button */
|
|
25
|
-
uploadStyleClass = input('btn-primary',
|
|
30
|
+
uploadStyleClass = input('btn-primary', /* @ts-ignore */
|
|
31
|
+
...(ngDevMode ? [{ debugName: "uploadStyleClass" }] : /* istanbul ignore next */ []));
|
|
26
32
|
/**Icon class of upload button */
|
|
27
|
-
uploadIconClass = input('fa fa-paperclip',
|
|
33
|
+
uploadIconClass = input('fa fa-paperclip', /* @ts-ignore */
|
|
34
|
+
...(ngDevMode ? [{ debugName: "uploadIconClass" }] : /* istanbul ignore next */ []));
|
|
28
35
|
/**Display choosed file remove button */
|
|
29
|
-
showRemove = input(true,
|
|
36
|
+
showRemove = input(true, /* @ts-ignore */
|
|
37
|
+
...(ngDevMode ? [{ debugName: "showRemove" }] : /* istanbul ignore next */ []));
|
|
30
38
|
/**Icon of remove item button */
|
|
31
|
-
removeIconClass = input('fa fa-times',
|
|
32
|
-
|
|
39
|
+
removeIconClass = input('fa fa-times', /* @ts-ignore */
|
|
40
|
+
...(ngDevMode ? [{ debugName: "removeIconClass" }] : /* istanbul ignore next */ []));
|
|
41
|
+
cancelIconClass = input('fa fa-times', /* @ts-ignore */
|
|
42
|
+
...(ngDevMode ? [{ debugName: "cancelIconClass" }] : /* istanbul ignore next */ []));
|
|
33
43
|
/**
|
|
34
44
|
* Files list display direction
|
|
35
45
|
* Default is vertical (false)
|
|
36
46
|
*/
|
|
37
|
-
horizontal = input(false,
|
|
47
|
+
horizontal = input(false, /* @ts-ignore */
|
|
48
|
+
...(ngDevMode ? [{ debugName: "horizontal" }] : /* istanbul ignore next */ []));
|
|
38
49
|
/**Message displayed before choosing file */
|
|
39
|
-
noFileMessage = input(
|
|
40
|
-
|
|
50
|
+
noFileMessage = input('No file chosen', /* @ts-ignore */
|
|
51
|
+
...(ngDevMode ? [{ debugName: "noFileMessage" }] : /* istanbul ignore next */ []));
|
|
52
|
+
progressStyleClass = input(/* @ts-ignore */
|
|
53
|
+
...(ngDevMode ? [undefined, { debugName: "progressStyleClass" }] : /* istanbul ignore next */ []));
|
|
41
54
|
/**Value of progress element */
|
|
42
|
-
progressValue = input(null,
|
|
55
|
+
progressValue = input(null, /* @ts-ignore */
|
|
56
|
+
...(ngDevMode ? [{ debugName: "progressValue" }] : /* istanbul ignore next */ []));
|
|
43
57
|
/**Max value of progress element */
|
|
44
|
-
progressValueMax = input(100,
|
|
58
|
+
progressValueMax = input(100, /* @ts-ignore */
|
|
59
|
+
...(ngDevMode ? [{ debugName: "progressValueMax" }] : /* istanbul ignore next */ []));
|
|
45
60
|
/**Display cancel upload button */
|
|
46
|
-
showCancel = input(false,
|
|
61
|
+
showCancel = input(false, /* @ts-ignore */
|
|
62
|
+
...(ngDevMode ? [{ debugName: "showCancel" }] : /* istanbul ignore next */ []));
|
|
47
63
|
/**Event to get selected files */
|
|
48
64
|
filesSelected = output();
|
|
49
65
|
/**Event of selected file in the list of choosed file*/
|
|
@@ -53,12 +69,18 @@ class YsFileUpload {
|
|
|
53
69
|
/**Event of cancel upload button */
|
|
54
70
|
cancel = output();
|
|
55
71
|
/**Disable elements */
|
|
56
|
-
disabled = input(false,
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
72
|
+
disabled = input(false, /* @ts-ignore */
|
|
73
|
+
...(ngDevMode ? [{ debugName: "disabled" }] : /* istanbul ignore next */ []));
|
|
74
|
+
files = signal([], /* @ts-ignore */
|
|
75
|
+
...(ngDevMode ? [{ debugName: "files" }] : /* istanbul ignore next */ []));
|
|
76
|
+
selectedFile = signal(null, /* @ts-ignore */
|
|
77
|
+
...(ngDevMode ? [{ debugName: "selectedFile" }] : /* istanbul ignore next */ []));
|
|
78
|
+
disabledState = signal(false, /* @ts-ignore */
|
|
79
|
+
...(ngDevMode ? [{ debugName: "disabledState" }] : /* istanbul ignore next */ []));
|
|
80
|
+
isDisabled = computed(() => this.disabled() || this.disabledState(), /* @ts-ignore */
|
|
81
|
+
...(ngDevMode ? [{ debugName: "isDisabled" }] : /* istanbul ignore next */ []));
|
|
82
|
+
inputId = computed(() => this.id() ?? `ys-file-upload-${crypto.randomUUID()}`, /* @ts-ignore */
|
|
83
|
+
...(ngDevMode ? [{ debugName: "inputId" }] : /* istanbul ignore next */ []));
|
|
62
84
|
onChange = () => { };
|
|
63
85
|
onTouched = () => { };
|
|
64
86
|
constructor() { }
|
|
@@ -106,7 +128,7 @@ class YsFileUpload {
|
|
|
106
128
|
input.value = '';
|
|
107
129
|
}
|
|
108
130
|
removeFile(file) {
|
|
109
|
-
this.files.set(this.files().filter(f => f !== file));
|
|
131
|
+
this.files.set(this.files().filter((f) => f !== file));
|
|
110
132
|
// this.onChange(this.multiple ? this.files : this.files[0]);
|
|
111
133
|
this.onChange(this.files());
|
|
112
134
|
this.onTouched();
|
|
@@ -124,23 +146,23 @@ class YsFileUpload {
|
|
|
124
146
|
cancelUpload() {
|
|
125
147
|
this.cancel.emit();
|
|
126
148
|
}
|
|
127
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
128
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "
|
|
149
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: YsFileUpload, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
150
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.7", type: YsFileUpload, isStandalone: true, selector: "ys-file-upload", inputs: { id: { classPropertyName: "id", publicName: "id", isSignal: true, isRequired: false, transformFunction: null }, styleClass: { classPropertyName: "styleClass", publicName: "styleClass", isSignal: true, isRequired: false, transformFunction: null }, multiple: { classPropertyName: "multiple", publicName: "multiple", isSignal: true, isRequired: false, transformFunction: null }, accept: { classPropertyName: "accept", publicName: "accept", isSignal: true, isRequired: false, transformFunction: null }, uploadLabel: { classPropertyName: "uploadLabel", publicName: "uploadLabel", isSignal: true, isRequired: false, transformFunction: null }, uploadStyleClass: { classPropertyName: "uploadStyleClass", publicName: "uploadStyleClass", isSignal: true, isRequired: false, transformFunction: null }, uploadIconClass: { classPropertyName: "uploadIconClass", publicName: "uploadIconClass", isSignal: true, isRequired: false, transformFunction: null }, showRemove: { classPropertyName: "showRemove", publicName: "showRemove", isSignal: true, isRequired: false, transformFunction: null }, removeIconClass: { classPropertyName: "removeIconClass", publicName: "removeIconClass", isSignal: true, isRequired: false, transformFunction: null }, cancelIconClass: { classPropertyName: "cancelIconClass", publicName: "cancelIconClass", isSignal: true, isRequired: false, transformFunction: null }, horizontal: { classPropertyName: "horizontal", publicName: "horizontal", isSignal: true, isRequired: false, transformFunction: null }, noFileMessage: { classPropertyName: "noFileMessage", publicName: "noFileMessage", isSignal: true, isRequired: false, transformFunction: null }, progressStyleClass: { classPropertyName: "progressStyleClass", publicName: "progressStyleClass", isSignal: true, isRequired: false, transformFunction: null }, progressValue: { classPropertyName: "progressValue", publicName: "progressValue", isSignal: true, isRequired: false, transformFunction: null }, progressValueMax: { classPropertyName: "progressValueMax", publicName: "progressValueMax", isSignal: true, isRequired: false, transformFunction: null }, showCancel: { classPropertyName: "showCancel", publicName: "showCancel", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { filesSelected: "filesSelected", select: "select", removed: "removed", cancel: "cancel" }, providers: [
|
|
129
151
|
{
|
|
130
152
|
provide: NG_VALUE_ACCESSOR,
|
|
131
153
|
useExisting: forwardRef(() => YsFileUpload),
|
|
132
|
-
multi: true
|
|
133
|
-
}
|
|
134
|
-
], ngImport: i0, template: "<input class=\"form-control d-none file-upload\" type=\"file\" [id]=\"inputId()\" #ysFileUpload [multiple]=\"multiple()\"\n [accept]=\"accept()\" [disabled]=\"isDisabled()\" (change)=\"onChangeFiles($event)\">\n\n<div class=\"file-upload\" [class]=\"styleClass()\">\n <div class=\"row\">\n <div class=\"col\">\n <button class=\"btn btn-upload\" [class]=\"uploadStyleClass()\" (click)=\"ysFileUpload.click()\"\n [disabled]=\"isDisabled()\">\n <i [class]=\"uploadIconClass()\"></i>\n @if (uploadLabel()) {\n <span class=\"ms-2\">{{uploadLabel()}}</span>\n }\n </button>\n\n @if (noFileMessage()) {\n <span class=\"ms-2\">{{files().length ? '' : noFileMessage()}}</span>\n }\n\n @if (files().length) {\n <ul class=\"file-upload-list list-group mt-2\" [ngClass]=\"{'list-group-horizontal overflow-auto': horizontal()}\">\n @for (file of files(); track file) {\n <a class=\"file-upload-item list-group-item d-flex align-items-center text-wrap text-break\" role=\"button\"\n (click)=\"onSelectFile(file)\" [ngClass]=\"{'active': file == selectedFile(), 'disabled': isDisabled()}\">\n <span class=\"me-2\">{{file.name}}</span>\n @if (showRemove()) {\n <button class=\"btn btn-outline-danger btn-sm ms-auto\" type=\"button\" id=\"removeFileButton\"\n (click)=\"removeFile(file); $event.stopPropagation();\" [disabled]=\"isDisabled()\">\n <i [class]=\"removeIconClass()\"></i>\n </button>\n }\n </a>\n }\n </ul>\n }\n\n </div>\n </div>\n</div>\n\n@if (progressValue() != null) {\n<div class=\"progress mt-2\" [class]=\"progressStyleClass()\">\n <div class=\"progress-bar\" role=\"progressbar\" [style.width.%]=\"progressValue()\" [attr.aria-valuenow]=\"progressValue()\"\n aria-valuemin=\"0\" [attr.aria-valuemax]=\"progressValueMax()\"></div>\n\n @if (showCancel() && (progressValue()! < progressValueMax())) { <button\n class=\"btn btn-danger btn-sm btn-upload-cancel d-flex\" (click)=\"cancelUpload()\">\n <i [ngClass]=\"cancelIconClass()\"></i>\n </button>\n }\n\n</div>\n}", styles: [".progress{height:20px}\n"], dependencies: [{ kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }] });
|
|
154
|
+
multi: true,
|
|
155
|
+
},
|
|
156
|
+
], ngImport: i0, template: "<input class=\"form-control d-none file-upload\" type=\"file\" [id]=\"inputId()\" #ysFileUpload [multiple]=\"multiple()\"\n [accept]=\"accept()\" [disabled]=\"isDisabled()\" (change)=\"onChangeFiles($event)\">\n\n<div class=\"file-upload\" [class]=\"styleClass()\">\n <div class=\"row\">\n <div class=\"col\">\n <button class=\"btn btn-upload\" [class]=\"uploadStyleClass()\" (click)=\"ysFileUpload.click()\"\n [disabled]=\"isDisabled()\">\n <i [class]=\"uploadIconClass()\"></i>\n @if (uploadLabel()) {\n <span class=\"ms-2\">{{uploadLabel()}}</span>\n }\n </button>\n\n @if (noFileMessage()) {\n <span class=\"ms-2\">{{files().length ? '' : noFileMessage()}}</span>\n }\n\n @if (files().length) {\n <ul class=\"file-upload-list list-group mt-2\" [ngClass]=\"{'list-group-horizontal overflow-auto': horizontal()}\">\n @for (file of files(); track file) {\n <a class=\"file-upload-item list-group-item d-flex align-items-center text-wrap text-break\" role=\"button\"\n (click)=\"onSelectFile(file)\" [ngClass]=\"{'active': file == selectedFile(), 'disabled': isDisabled()}\">\n <span class=\"me-2\">{{file.name}}</span>\n @if (showRemove()) {\n <button class=\"btn btn-outline-danger btn-sm ms-auto\" type=\"button\" id=\"removeFileButton\"\n (click)=\"removeFile(file); $event.stopPropagation();\" [disabled]=\"isDisabled()\">\n <i [class]=\"removeIconClass()\"></i>\n </button>\n }\n </a>\n }\n </ul>\n }\n\n </div>\n </div>\n</div>\n\n@if (progressValue() != null) {\n<div class=\"progress mt-2\" [class]=\"progressStyleClass()\">\n <div class=\"progress-bar\" role=\"progressbar\" [style.width.%]=\"progressValue()\" [attr.aria-valuenow]=\"progressValue()\"\n aria-valuemin=\"0\" [attr.aria-valuemax]=\"progressValueMax()\"></div>\n\n @if (showCancel() && (progressValue()! < progressValueMax())) { <button\n class=\"btn btn-danger btn-sm btn-upload-cancel d-flex\" (click)=\"cancelUpload()\">\n <i [ngClass]=\"cancelIconClass()\"></i>\n </button>\n }\n\n</div>\n}", styles: [".progress{height:20px}\n"], dependencies: [{ kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }], changeDetection: i0.ChangeDetectionStrategy.Eager });
|
|
135
157
|
}
|
|
136
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
158
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: YsFileUpload, decorators: [{
|
|
137
159
|
type: Component,
|
|
138
|
-
args: [{ selector: 'ys-file-upload', imports: [NgClass], providers: [
|
|
160
|
+
args: [{ selector: 'ys-file-upload', imports: [NgClass], changeDetection: ChangeDetectionStrategy.Eager, providers: [
|
|
139
161
|
{
|
|
140
162
|
provide: NG_VALUE_ACCESSOR,
|
|
141
163
|
useExisting: forwardRef(() => YsFileUpload),
|
|
142
|
-
multi: true
|
|
143
|
-
}
|
|
164
|
+
multi: true,
|
|
165
|
+
},
|
|
144
166
|
], template: "<input class=\"form-control d-none file-upload\" type=\"file\" [id]=\"inputId()\" #ysFileUpload [multiple]=\"multiple()\"\n [accept]=\"accept()\" [disabled]=\"isDisabled()\" (change)=\"onChangeFiles($event)\">\n\n<div class=\"file-upload\" [class]=\"styleClass()\">\n <div class=\"row\">\n <div class=\"col\">\n <button class=\"btn btn-upload\" [class]=\"uploadStyleClass()\" (click)=\"ysFileUpload.click()\"\n [disabled]=\"isDisabled()\">\n <i [class]=\"uploadIconClass()\"></i>\n @if (uploadLabel()) {\n <span class=\"ms-2\">{{uploadLabel()}}</span>\n }\n </button>\n\n @if (noFileMessage()) {\n <span class=\"ms-2\">{{files().length ? '' : noFileMessage()}}</span>\n }\n\n @if (files().length) {\n <ul class=\"file-upload-list list-group mt-2\" [ngClass]=\"{'list-group-horizontal overflow-auto': horizontal()}\">\n @for (file of files(); track file) {\n <a class=\"file-upload-item list-group-item d-flex align-items-center text-wrap text-break\" role=\"button\"\n (click)=\"onSelectFile(file)\" [ngClass]=\"{'active': file == selectedFile(), 'disabled': isDisabled()}\">\n <span class=\"me-2\">{{file.name}}</span>\n @if (showRemove()) {\n <button class=\"btn btn-outline-danger btn-sm ms-auto\" type=\"button\" id=\"removeFileButton\"\n (click)=\"removeFile(file); $event.stopPropagation();\" [disabled]=\"isDisabled()\">\n <i [class]=\"removeIconClass()\"></i>\n </button>\n }\n </a>\n }\n </ul>\n }\n\n </div>\n </div>\n</div>\n\n@if (progressValue() != null) {\n<div class=\"progress mt-2\" [class]=\"progressStyleClass()\">\n <div class=\"progress-bar\" role=\"progressbar\" [style.width.%]=\"progressValue()\" [attr.aria-valuenow]=\"progressValue()\"\n aria-valuemin=\"0\" [attr.aria-valuemax]=\"progressValueMax()\"></div>\n\n @if (showCancel() && (progressValue()! < progressValueMax())) { <button\n class=\"btn btn-danger btn-sm btn-upload-cancel d-flex\" (click)=\"cancelUpload()\">\n <i [ngClass]=\"cancelIconClass()\"></i>\n </button>\n }\n\n</div>\n}", styles: [".progress{height:20px}\n"] }]
|
|
145
167
|
}], ctorParameters: () => [], propDecorators: { id: [{ type: i0.Input, args: [{ isSignal: true, alias: "id", required: false }] }], styleClass: [{ type: i0.Input, args: [{ isSignal: true, alias: "styleClass", required: false }] }], multiple: [{ type: i0.Input, args: [{ isSignal: true, alias: "multiple", required: false }] }], accept: [{ type: i0.Input, args: [{ isSignal: true, alias: "accept", required: false }] }], uploadLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "uploadLabel", required: false }] }], uploadStyleClass: [{ type: i0.Input, args: [{ isSignal: true, alias: "uploadStyleClass", required: false }] }], uploadIconClass: [{ type: i0.Input, args: [{ isSignal: true, alias: "uploadIconClass", required: false }] }], showRemove: [{ type: i0.Input, args: [{ isSignal: true, alias: "showRemove", required: false }] }], removeIconClass: [{ type: i0.Input, args: [{ isSignal: true, alias: "removeIconClass", required: false }] }], cancelIconClass: [{ type: i0.Input, args: [{ isSignal: true, alias: "cancelIconClass", required: false }] }], horizontal: [{ type: i0.Input, args: [{ isSignal: true, alias: "horizontal", required: false }] }], noFileMessage: [{ type: i0.Input, args: [{ isSignal: true, alias: "noFileMessage", required: false }] }], progressStyleClass: [{ type: i0.Input, args: [{ isSignal: true, alias: "progressStyleClass", required: false }] }], progressValue: [{ type: i0.Input, args: [{ isSignal: true, alias: "progressValue", required: false }] }], progressValueMax: [{ type: i0.Input, args: [{ isSignal: true, alias: "progressValueMax", required: false }] }], showCancel: [{ type: i0.Input, args: [{ isSignal: true, alias: "showCancel", required: false }] }], filesSelected: [{ type: i0.Output, args: ["filesSelected"] }], select: [{ type: i0.Output, args: ["select"] }], removed: [{ type: i0.Output, args: ["removed"] }], cancel: [{ type: i0.Output, args: ["cancel"] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }] } });
|
|
146
168
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"yoozsoft-yoozsoft-ng-file-upload.mjs","sources":["../../../../projects/yoozsoft/yoozsoft-ng/file-upload/src/ys-file-upload/ys-file-upload.ts","../../../../projects/yoozsoft/yoozsoft-ng/file-upload/src/ys-file-upload/ys-file-upload.html","../../../../projects/yoozsoft/yoozsoft-ng/file-upload/public-api.ts","../../../../projects/yoozsoft/yoozsoft-ng/file-upload/yoozsoft-yoozsoft-ng-file-upload.ts"],"sourcesContent":["import { NgClass } from '@angular/common';\nimport { Component, computed, forwardRef, input, output, signal } from '@angular/core';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\n\n@Component({\n selector: 'ys-file-upload',\n imports: [NgClass],\n templateUrl: './ys-file-upload.html',\n styleUrl: './ys-file-upload.scss',\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => YsFileUpload),\n multi: true\n }\n ]\n})\nexport class YsFileUpload implements ControlValueAccessor {\n\n id = input<string>();\n\n styleClass = input<string>();\n /**\n * Allowing upload multiple files\n * Default is false\n */\n multiple = input<boolean>(false);\n /**\n * Acceptable type of files\n * Default is all file type\n */\n accept = input<string>('*/*');\n /**\n * Upload button label\n * Default is Choose File\n */\n uploadLabel = input<string>('Choose File');\n /**Style class of upload button */\n uploadStyleClass = input<string>('btn-primary');\n /**Icon class of upload button */\n uploadIconClass = input<string>('fa fa-paperclip');\n\n /**Display choosed file remove button */\n showRemove = input<boolean>(true);\n /**Icon of remove item button */\n removeIconClass = input<string>('fa fa-times');\n cancelIconClass = input<string>('fa fa-times');\n\n /**\n * Files list display direction\n * Default is vertical (false)\n */\n horizontal = input<boolean>(false);\n\n /**Message displayed before choosing file */\n noFileMessage = input<string>(\"No file chosen\");\n\n progressStyleClass = input<string>();\n /**Value of progress element */\n progressValue = input<number | null>(null);\n /**Max value of progress element */\n progressValueMax = input<number>(100);\n /**Display cancel upload button */\n showCancel = input<boolean>(false);\n\n /**Event to get selected files */\n filesSelected = output<File[]>();\n /**Event of selected file in the list of choosed file*/\n select = output<File | null>();\n /**Event of removed file in the list of choosed file*/\n removed = output<File>();\n /**Event of cancel upload button */\n cancel = output<void>();\n\n /**Disable elements */\n disabled = input<boolean>(false);\n\n files = signal<File[]>([]);\n selectedFile = signal<File | null>(null);\n\n private disabledState = signal(false);\n readonly isDisabled = computed(() => this.disabled() || this.disabledState());\n readonly inputId = computed(() => this.id() ?? `ys-file-upload-${crypto.randomUUID()}`);\n\n private onChange: (files: File[]) => void = () => { };\n private onTouched: () => void = () => { };\n\n constructor() { }\n\n writeValue(obj: File | File[] | null): void {\n if (!obj) {\n this.files.set([]);\n return;\n }\n\n if (!Array.isArray(obj)) {\n this.files.set([obj]);\n return;\n }\n\n this.files.set(obj);\n }\n registerOnChange(fn: (files: File[]) => void): void {\n this.onChange = fn;\n }\n registerOnTouched(fn: () => void): void {\n this.onTouched = fn;\n }\n setDisabledState?(isDisabled: boolean): void {\n this.disabledState.set(isDisabled);\n }\n\n onChangeFiles(event: Event) {\n const input = (event.target as HTMLInputElement);\n const files = input.files;\n\n if (files?.length) {\n\n if (!this.multiple()) {\n this.files.set([]);\n }\n\n for (let i = 0; i < files.length; i++) {\n const file: File = files.item(i)!;\n const currentFiles = [...this.files()];\n\n currentFiles.push(file);\n\n this.files.set(currentFiles);\n }\n\n this.files().sort((a, b) => b.name.localeCompare(a.name));\n\n } else {\n this.files.set([]);\n }\n\n this.onChange(this.files());\n this.onTouched();\n\n this.filesSelected.emit(this.files());\n\n input.value = '';\n\n }\n\n removeFile(file: File) {\n this.files.set(\n this.files().filter(f => f !== file)\n );\n\n // this.onChange(this.multiple ? this.files : this.files[0]);\n this.onChange(this.files());\n this.onTouched();\n\n // this.choosed.emit(this.files);\n\n if (this.selectedFile() == file) {\n this.selectedFile.set(null);\n this.select.emit(null);\n }\n\n this.removed.emit(file);\n }\n\n onSelectFile(file: File) {\n this.selectedFile.set(file);\n this.select.emit(this.selectedFile());\n }\n\n cancelUpload() {\n this.cancel.emit();\n }\n\n}\n","<input class=\"form-control d-none file-upload\" type=\"file\" [id]=\"inputId()\" #ysFileUpload [multiple]=\"multiple()\"\n [accept]=\"accept()\" [disabled]=\"isDisabled()\" (change)=\"onChangeFiles($event)\">\n\n<div class=\"file-upload\" [class]=\"styleClass()\">\n <div class=\"row\">\n <div class=\"col\">\n <button class=\"btn btn-upload\" [class]=\"uploadStyleClass()\" (click)=\"ysFileUpload.click()\"\n [disabled]=\"isDisabled()\">\n <i [class]=\"uploadIconClass()\"></i>\n @if (uploadLabel()) {\n <span class=\"ms-2\">{{uploadLabel()}}</span>\n }\n </button>\n\n @if (noFileMessage()) {\n <span class=\"ms-2\">{{files().length ? '' : noFileMessage()}}</span>\n }\n\n @if (files().length) {\n <ul class=\"file-upload-list list-group mt-2\" [ngClass]=\"{'list-group-horizontal overflow-auto': horizontal()}\">\n @for (file of files(); track file) {\n <a class=\"file-upload-item list-group-item d-flex align-items-center text-wrap text-break\" role=\"button\"\n (click)=\"onSelectFile(file)\" [ngClass]=\"{'active': file == selectedFile(), 'disabled': isDisabled()}\">\n <span class=\"me-2\">{{file.name}}</span>\n @if (showRemove()) {\n <button class=\"btn btn-outline-danger btn-sm ms-auto\" type=\"button\" id=\"removeFileButton\"\n (click)=\"removeFile(file); $event.stopPropagation();\" [disabled]=\"isDisabled()\">\n <i [class]=\"removeIconClass()\"></i>\n </button>\n }\n </a>\n }\n </ul>\n }\n\n </div>\n </div>\n</div>\n\n@if (progressValue() != null) {\n<div class=\"progress mt-2\" [class]=\"progressStyleClass()\">\n <div class=\"progress-bar\" role=\"progressbar\" [style.width.%]=\"progressValue()\" [attr.aria-valuenow]=\"progressValue()\"\n aria-valuemin=\"0\" [attr.aria-valuemax]=\"progressValueMax()\"></div>\n\n @if (showCancel() && (progressValue()! < progressValueMax())) { <button\n class=\"btn btn-danger btn-sm btn-upload-cancel d-flex\" (click)=\"cancelUpload()\">\n <i [ngClass]=\"cancelIconClass()\"></i>\n </button>\n }\n\n</div>\n}","/*\r\n * Public API Surface of ys-file-upload\r\n */\r\n\r\nexport * from './src/ys-file-upload/ys-file-upload';\r\n\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"yoozsoft-yoozsoft-ng-file-upload.mjs","sources":["../../../../projects/yoozsoft/yoozsoft-ng/file-upload/src/ys-file-upload/ys-file-upload.ts","../../../../projects/yoozsoft/yoozsoft-ng/file-upload/src/ys-file-upload/ys-file-upload.html","../../../../projects/yoozsoft/yoozsoft-ng/file-upload/public-api.ts","../../../../projects/yoozsoft/yoozsoft-ng/file-upload/yoozsoft-yoozsoft-ng-file-upload.ts"],"sourcesContent":["import { NgClass } from '@angular/common';\r\nimport {\r\n Component,\r\n computed,\r\n forwardRef,\r\n input,\r\n output,\r\n signal,\r\n ChangeDetectionStrategy,\r\n} from '@angular/core';\r\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\r\n\r\n@Component({\r\n selector: 'ys-file-upload',\r\n imports: [NgClass],\r\n templateUrl: './ys-file-upload.html',\r\n styleUrl: './ys-file-upload.scss',\r\n changeDetection: ChangeDetectionStrategy.Eager,\r\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => YsFileUpload),\r\n multi: true,\r\n },\r\n ],\r\n})\r\nexport class YsFileUpload implements ControlValueAccessor {\r\n id = input<string>();\r\n\r\n styleClass = input<string>();\r\n /**\r\n * Allowing upload multiple files\r\n * Default is false\r\n */\r\n multiple = input<boolean>(false);\r\n /**\r\n * Acceptable type of files\r\n * Default is all file type\r\n */\r\n accept = input<string>('*/*');\r\n /**\r\n * Upload button label\r\n * Default is Choose File\r\n */\r\n uploadLabel = input<string>('Choose File');\r\n /**Style class of upload button */\r\n uploadStyleClass = input<string>('btn-primary');\r\n /**Icon class of upload button */\r\n uploadIconClass = input<string>('fa fa-paperclip');\r\n\r\n /**Display choosed file remove button */\r\n showRemove = input<boolean>(true);\r\n /**Icon of remove item button */\r\n removeIconClass = input<string>('fa fa-times');\r\n cancelIconClass = input<string>('fa fa-times');\r\n\r\n /**\r\n * Files list display direction\r\n * Default is vertical (false)\r\n */\r\n horizontal = input<boolean>(false);\r\n\r\n /**Message displayed before choosing file */\r\n noFileMessage = input<string>('No file chosen');\r\n\r\n progressStyleClass = input<string>();\r\n /**Value of progress element */\r\n progressValue = input<number | null>(null);\r\n /**Max value of progress element */\r\n progressValueMax = input<number>(100);\r\n /**Display cancel upload button */\r\n showCancel = input<boolean>(false);\r\n\r\n /**Event to get selected files */\r\n filesSelected = output<File[]>();\r\n /**Event of selected file in the list of choosed file*/\r\n select = output<File | null>();\r\n /**Event of removed file in the list of choosed file*/\r\n removed = output<File>();\r\n /**Event of cancel upload button */\r\n cancel = output<void>();\r\n\r\n /**Disable elements */\r\n disabled = input<boolean>(false);\r\n\r\n files = signal<File[]>([]);\r\n selectedFile = signal<File | null>(null);\r\n\r\n private disabledState = signal(false);\r\n readonly isDisabled = computed(() => this.disabled() || this.disabledState());\r\n readonly inputId = computed(() => this.id() ?? `ys-file-upload-${crypto.randomUUID()}`);\r\n\r\n private onChange: (files: File[]) => void = () => {};\r\n private onTouched: () => void = () => {};\r\n\r\n constructor() {}\r\n\r\n writeValue(obj: File | File[] | null): void {\r\n if (!obj) {\r\n this.files.set([]);\r\n return;\r\n }\r\n\r\n if (!Array.isArray(obj)) {\r\n this.files.set([obj]);\r\n return;\r\n }\r\n\r\n this.files.set(obj);\r\n }\r\n registerOnChange(fn: (files: File[]) => void): void {\r\n this.onChange = fn;\r\n }\r\n registerOnTouched(fn: () => void): void {\r\n this.onTouched = fn;\r\n }\r\n setDisabledState?(isDisabled: boolean): void {\r\n this.disabledState.set(isDisabled);\r\n }\r\n\r\n onChangeFiles(event: Event) {\r\n const input = event.target as HTMLInputElement;\r\n const files = input.files;\r\n\r\n if (files?.length) {\r\n if (!this.multiple()) {\r\n this.files.set([]);\r\n }\r\n\r\n for (let i = 0; i < files.length; i++) {\r\n const file: File = files.item(i)!;\r\n const currentFiles = [...this.files()];\r\n\r\n currentFiles.push(file);\r\n\r\n this.files.set(currentFiles);\r\n }\r\n\r\n this.files().sort((a, b) => b.name.localeCompare(a.name));\r\n } else {\r\n this.files.set([]);\r\n }\r\n\r\n this.onChange(this.files());\r\n this.onTouched();\r\n\r\n this.filesSelected.emit(this.files());\r\n\r\n input.value = '';\r\n }\r\n\r\n removeFile(file: File) {\r\n this.files.set(this.files().filter((f) => f !== file));\r\n\r\n // this.onChange(this.multiple ? this.files : this.files[0]);\r\n this.onChange(this.files());\r\n this.onTouched();\r\n\r\n // this.choosed.emit(this.files);\r\n\r\n if (this.selectedFile() == file) {\r\n this.selectedFile.set(null);\r\n this.select.emit(null);\r\n }\r\n\r\n this.removed.emit(file);\r\n }\r\n\r\n onSelectFile(file: File) {\r\n this.selectedFile.set(file);\r\n this.select.emit(this.selectedFile());\r\n }\r\n\r\n cancelUpload() {\r\n this.cancel.emit();\r\n }\r\n}\r\n","<input class=\"form-control d-none file-upload\" type=\"file\" [id]=\"inputId()\" #ysFileUpload [multiple]=\"multiple()\"\n [accept]=\"accept()\" [disabled]=\"isDisabled()\" (change)=\"onChangeFiles($event)\">\n\n<div class=\"file-upload\" [class]=\"styleClass()\">\n <div class=\"row\">\n <div class=\"col\">\n <button class=\"btn btn-upload\" [class]=\"uploadStyleClass()\" (click)=\"ysFileUpload.click()\"\n [disabled]=\"isDisabled()\">\n <i [class]=\"uploadIconClass()\"></i>\n @if (uploadLabel()) {\n <span class=\"ms-2\">{{uploadLabel()}}</span>\n }\n </button>\n\n @if (noFileMessage()) {\n <span class=\"ms-2\">{{files().length ? '' : noFileMessage()}}</span>\n }\n\n @if (files().length) {\n <ul class=\"file-upload-list list-group mt-2\" [ngClass]=\"{'list-group-horizontal overflow-auto': horizontal()}\">\n @for (file of files(); track file) {\n <a class=\"file-upload-item list-group-item d-flex align-items-center text-wrap text-break\" role=\"button\"\n (click)=\"onSelectFile(file)\" [ngClass]=\"{'active': file == selectedFile(), 'disabled': isDisabled()}\">\n <span class=\"me-2\">{{file.name}}</span>\n @if (showRemove()) {\n <button class=\"btn btn-outline-danger btn-sm ms-auto\" type=\"button\" id=\"removeFileButton\"\n (click)=\"removeFile(file); $event.stopPropagation();\" [disabled]=\"isDisabled()\">\n <i [class]=\"removeIconClass()\"></i>\n </button>\n }\n </a>\n }\n </ul>\n }\n\n </div>\n </div>\n</div>\n\n@if (progressValue() != null) {\n<div class=\"progress mt-2\" [class]=\"progressStyleClass()\">\n <div class=\"progress-bar\" role=\"progressbar\" [style.width.%]=\"progressValue()\" [attr.aria-valuenow]=\"progressValue()\"\n aria-valuemin=\"0\" [attr.aria-valuemax]=\"progressValueMax()\"></div>\n\n @if (showCancel() && (progressValue()! < progressValueMax())) { <button\n class=\"btn btn-danger btn-sm btn-upload-cancel d-flex\" (click)=\"cancelUpload()\">\n <i [ngClass]=\"cancelIconClass()\"></i>\n </button>\n }\n\n</div>\n}","/*\r\n * Public API Surface of ys-file-upload\r\n */\r\n\r\nexport * from './src/ys-file-upload/ys-file-upload';\r\n\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
|
|
@@ -1,20 +1,22 @@
|
|
|
1
1
|
import * as i0 from '@angular/core';
|
|
2
|
-
import { input, Component } from '@angular/core';
|
|
2
|
+
import { input, ChangeDetectionStrategy, Component } from '@angular/core';
|
|
3
3
|
import { NgbTooltip } from '@ng-bootstrap/ng-bootstrap';
|
|
4
4
|
|
|
5
5
|
class YsFooter {
|
|
6
|
-
styleClass = input(
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
6
|
+
styleClass = input(/* @ts-ignore */
|
|
7
|
+
...(ngDevMode ? [undefined, { debugName: "styleClass" }] : /* istanbul ignore next */ []));
|
|
8
|
+
brand = input(/* @ts-ignore */
|
|
9
|
+
...(ngDevMode ? [undefined, { debugName: "brand" }] : /* istanbul ignore next */ []));
|
|
10
|
+
copyright = input('', /* @ts-ignore */
|
|
11
|
+
...(ngDevMode ? [{ debugName: "copyright" }] : /* istanbul ignore next */ []));
|
|
12
|
+
socialNetworks = input([], /* @ts-ignore */
|
|
13
|
+
...(ngDevMode ? [{ debugName: "socialNetworks" }] : /* istanbul ignore next */ []));
|
|
14
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: YsFooter, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
15
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.7", type: YsFooter, isStandalone: true, selector: "ys-footer", inputs: { styleClass: { classPropertyName: "styleClass", publicName: "styleClass", isSignal: true, isRequired: false, transformFunction: null }, brand: { classPropertyName: "brand", publicName: "brand", isSignal: true, isRequired: false, transformFunction: null }, copyright: { classPropertyName: "copyright", publicName: "copyright", isSignal: true, isRequired: false, transformFunction: null }, socialNetworks: { classPropertyName: "socialNetworks", publicName: "socialNetworks", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: "<!-- https://colorlib.com/wp/template/bootstrap-footer-19/ -->\r\n<footer [class]=\"styleClass()\">\r\n <!-- <div class=\"row\">\r\n <div class=\"col-md-6 col-lg-3 mb-md-0 mb-4\">\r\n <h2 class=\"footer-heading d-flex\">\r\n <span class=\"icon d-flex align-items-center justify-content-center\"><i class=\"ion-logo-ionic\"></i></span>\r\n About\r\n </h2>\r\n <div class=\"block-23 mb-3\">\r\n <ul>\r\n <li><span class=\"icon ion-ios-pin\"></span><span class=\"text\">203 Fake St. Mountain View, San\r\n Francisco, California, USA</span></li>\r\n <li><a href=\"#\"><span class=\"icon ion-ios-call\"></span><span class=\"text\">+2 392 3929 210</span></a>\r\n </li>\r\n <li><a href=\"#\"><span class=\"icon ion-ios-send\"></span><span\r\n class=\"text\">support@yourdomain.com</span></a></li>\r\n </ul>\r\n </div>\r\n\r\n <form action=\"#\" class=\"subscribe-form\">\r\n <div class=\"input-group d-flex\">\r\n <input type=\"text\" class=\"form-control\" placeholder=\"Enter email address\">\r\n <button type=\"submit\" class=\"btn btn-info\">\r\n <span class=\"sr-only\">Submit</span>\r\n <i class=\"fa fa-paper-plane\"></i></button>\r\n </div>\r\n </form>\r\n </div>\r\n\r\n </div> -->\r\n <div class=\"row\">\r\n <div class=\"col\">\r\n <div class=\"d-flex justify-content-between align-items-center py-3 my-4 border-top\">\r\n @if (brand() || copyright()) {\r\n <div class=\"d-flex align-items-center\">\r\n @if (brand()?.href) {\r\n <a [href]=\"brand()?.href\" class=\"px-2 text-muted text-decoration-none\">\r\n <img [src]=\"brand()?.src\" [alt]=\"brand()?.alt || 'logo'\" [class]=\"brand()?.styleClass\"\r\n class=\"brand-logo d-inline-block align-text-top\" />\r\n </a>\r\n } @else {\r\n <img [src]=\"brand()?.src\" [alt]=\"brand()?.alt || 'logo'\" [class]=\"brand()?.styleClass\"\r\n class=\"brand-logo d-inline-block align-text-top\" />\r\n }\r\n\r\n @if (copyright()) {\r\n <span class=\"text-muted\">{{ copyright() }}</span>\r\n }\r\n </div>\r\n }\r\n\r\n @if (socialNetworks().length) {\r\n <ul class=\"nav\">\r\n @for (social of socialNetworks(); track social.href) {\r\n <li class=\"px-2\">\r\n <a class=\"text-muted social-icon\" [href]=\"social.href\" [ngbTooltip]=\"social.tooltip\" target=\"_blank\"\r\n rel=\"noopener noreferrer\">\r\n <em [class]=\"social.iconClass\"></em>\r\n </a>\r\n </li>\r\n }\r\n </ul>\r\n }\r\n </div>\r\n </div>\r\n </div>\r\n</footer>", styles: [".social-icon:hover{color:rgba(var(--bs-link-color-rgb),var(--bs-link-opacity, 1))!important}.brand-logo{width:30px;height:30px}\n"], dependencies: [{ kind: "directive", type: NgbTooltip, selector: "[ngbTooltip]", inputs: ["animation", "autoClose", "placement", "popperOptions", "triggers", "positionTarget", "container", "disableTooltip", "tooltipClass", "tooltipContext", "openDelay", "closeDelay", "ngbTooltip"], outputs: ["shown", "hidden"], exportAs: ["ngbTooltip"] }], changeDetection: i0.ChangeDetectionStrategy.Eager });
|
|
12
16
|
}
|
|
13
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
17
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: YsFooter, decorators: [{
|
|
14
18
|
type: Component,
|
|
15
|
-
args: [{ selector: 'ys-footer', imports: [
|
|
16
|
-
NgbTooltip
|
|
17
|
-
], template: "<!-- https://colorlib.com/wp/template/bootstrap-footer-19/ -->\n<footer [class]=\"styleClass()\">\n <!-- <div class=\"row\">\n <div class=\"col-md-6 col-lg-3 mb-md-0 mb-4\">\n <h2 class=\"footer-heading d-flex\">\n <span class=\"icon d-flex align-items-center justify-content-center\"><i class=\"ion-logo-ionic\"></i></span>\n About\n </h2>\n <div class=\"block-23 mb-3\">\n <ul>\n <li><span class=\"icon ion-ios-pin\"></span><span class=\"text\">203 Fake St. Mountain View, San\n Francisco, California, USA</span></li>\n <li><a href=\"#\"><span class=\"icon ion-ios-call\"></span><span class=\"text\">+2 392 3929 210</span></a>\n </li>\n <li><a href=\"#\"><span class=\"icon ion-ios-send\"></span><span\n class=\"text\">support@yourdomain.com</span></a></li>\n </ul>\n </div>\n\n <form action=\"#\" class=\"subscribe-form\">\n <div class=\"input-group d-flex\">\n <input type=\"text\" class=\"form-control\" placeholder=\"Enter email address\">\n <button type=\"submit\" class=\"btn btn-info\">\n <span class=\"sr-only\">Submit</span>\n <i class=\"fa fa-paper-plane\"></i></button>\n </div>\n </form>\n </div>\n\n </div> -->\n <div class=\"row\">\n <div class=\"col\">\n <div class=\"d-flex justify-content-between align-items-center py-3 my-4 border-top\">\n\n @if (brand() || copyright()) {\n <div class=\"d-flex align-items-center\">\n\n @if (brand()?.href) {\n <a [href]=\"brand()?.href\" class=\"px-2 text-muted text-decoration-none\">\n <img [src]=\"brand()?.src\" [alt]=\"brand()?.alt || 'logo'\" [class]=\"brand()?.styleClass\"\n class=\"brand-logo d-inline-block align-text-top\">\n </a>\n }@else {\n <img [src]=\"brand()?.src\" [alt]=\"brand()?.alt || 'logo'\" [class]=\"brand()?.styleClass\"\n class=\"brand-logo d-inline-block align-text-top\">\n }\n\n @if (copyright()) {\n <span class=\"text-muted\">{{copyright()}}</span>\n }\n\n </div>\n\n }\n\n @if (socialNetworks().length) {\n <ul class=\"nav\">\n @for (social of socialNetworks(); track social.href) {\n <li class=\"px-2\">\n <a class=\"text-muted social-icon\" [href]=\"social.href\" [ngbTooltip]=\"social.tooltip\"\n target=\"_blank\" rel=\"noopener noreferrer\">\n <em [class]=\"social.iconClass\"></em>\n </a>\n </li>\n }\n </ul>\n }\n </div>\n </div>\n </div>\n</footer>", styles: [".social-icon:hover{color:rgba(var(--bs-link-color-rgb),var(--bs-link-opacity, 1))!important}.brand-logo{width:30px;height:30px}\n"] }]
|
|
19
|
+
args: [{ selector: 'ys-footer', imports: [NgbTooltip], changeDetection: ChangeDetectionStrategy.Eager, template: "<!-- https://colorlib.com/wp/template/bootstrap-footer-19/ -->\r\n<footer [class]=\"styleClass()\">\r\n <!-- <div class=\"row\">\r\n <div class=\"col-md-6 col-lg-3 mb-md-0 mb-4\">\r\n <h2 class=\"footer-heading d-flex\">\r\n <span class=\"icon d-flex align-items-center justify-content-center\"><i class=\"ion-logo-ionic\"></i></span>\r\n About\r\n </h2>\r\n <div class=\"block-23 mb-3\">\r\n <ul>\r\n <li><span class=\"icon ion-ios-pin\"></span><span class=\"text\">203 Fake St. Mountain View, San\r\n Francisco, California, USA</span></li>\r\n <li><a href=\"#\"><span class=\"icon ion-ios-call\"></span><span class=\"text\">+2 392 3929 210</span></a>\r\n </li>\r\n <li><a href=\"#\"><span class=\"icon ion-ios-send\"></span><span\r\n class=\"text\">support@yourdomain.com</span></a></li>\r\n </ul>\r\n </div>\r\n\r\n <form action=\"#\" class=\"subscribe-form\">\r\n <div class=\"input-group d-flex\">\r\n <input type=\"text\" class=\"form-control\" placeholder=\"Enter email address\">\r\n <button type=\"submit\" class=\"btn btn-info\">\r\n <span class=\"sr-only\">Submit</span>\r\n <i class=\"fa fa-paper-plane\"></i></button>\r\n </div>\r\n </form>\r\n </div>\r\n\r\n </div> -->\r\n <div class=\"row\">\r\n <div class=\"col\">\r\n <div class=\"d-flex justify-content-between align-items-center py-3 my-4 border-top\">\r\n @if (brand() || copyright()) {\r\n <div class=\"d-flex align-items-center\">\r\n @if (brand()?.href) {\r\n <a [href]=\"brand()?.href\" class=\"px-2 text-muted text-decoration-none\">\r\n <img [src]=\"brand()?.src\" [alt]=\"brand()?.alt || 'logo'\" [class]=\"brand()?.styleClass\"\r\n class=\"brand-logo d-inline-block align-text-top\" />\r\n </a>\r\n } @else {\r\n <img [src]=\"brand()?.src\" [alt]=\"brand()?.alt || 'logo'\" [class]=\"brand()?.styleClass\"\r\n class=\"brand-logo d-inline-block align-text-top\" />\r\n }\r\n\r\n @if (copyright()) {\r\n <span class=\"text-muted\">{{ copyright() }}</span>\r\n }\r\n </div>\r\n }\r\n\r\n @if (socialNetworks().length) {\r\n <ul class=\"nav\">\r\n @for (social of socialNetworks(); track social.href) {\r\n <li class=\"px-2\">\r\n <a class=\"text-muted social-icon\" [href]=\"social.href\" [ngbTooltip]=\"social.tooltip\" target=\"_blank\"\r\n rel=\"noopener noreferrer\">\r\n <em [class]=\"social.iconClass\"></em>\r\n </a>\r\n </li>\r\n }\r\n </ul>\r\n }\r\n </div>\r\n </div>\r\n </div>\r\n</footer>", styles: [".social-icon:hover{color:rgba(var(--bs-link-color-rgb),var(--bs-link-opacity, 1))!important}.brand-logo{width:30px;height:30px}\n"] }]
|
|
18
20
|
}], propDecorators: { styleClass: [{ type: i0.Input, args: [{ isSignal: true, alias: "styleClass", required: false }] }], brand: [{ type: i0.Input, args: [{ isSignal: true, alias: "brand", required: false }] }], copyright: [{ type: i0.Input, args: [{ isSignal: true, alias: "copyright", required: false }] }], socialNetworks: [{ type: i0.Input, args: [{ isSignal: true, alias: "socialNetworks", required: false }] }] } });
|
|
19
21
|
|
|
20
22
|
/*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"yoozsoft-yoozsoft-ng-footer.mjs","sources":["../../../../projects/yoozsoft/yoozsoft-ng/footer/src/ys-footer/ys-footer.ts","../../../../projects/yoozsoft/yoozsoft-ng/footer/src/ys-footer/ys-footer.html","../../../../projects/yoozsoft/yoozsoft-ng/footer/public-api.ts","../../../../projects/yoozsoft/yoozsoft-ng/footer/yoozsoft-yoozsoft-ng-footer.ts"],"sourcesContent":["import { Component, input } from '@angular/core';\nimport { NgbTooltip } from '@ng-bootstrap/ng-bootstrap';\nimport { FooterBrand, SocialNetwork } from '../models';\n\n@Component({\n selector: 'ys-footer',\n imports: [
|
|
1
|
+
{"version":3,"file":"yoozsoft-yoozsoft-ng-footer.mjs","sources":["../../../../projects/yoozsoft/yoozsoft-ng/footer/src/ys-footer/ys-footer.ts","../../../../projects/yoozsoft/yoozsoft-ng/footer/src/ys-footer/ys-footer.html","../../../../projects/yoozsoft/yoozsoft-ng/footer/public-api.ts","../../../../projects/yoozsoft/yoozsoft-ng/footer/yoozsoft-yoozsoft-ng-footer.ts"],"sourcesContent":["import { Component, input, ChangeDetectionStrategy } from '@angular/core';\r\nimport { NgbTooltip } from '@ng-bootstrap/ng-bootstrap';\r\nimport { FooterBrand, SocialNetwork } from '../models';\r\n\r\n@Component({\r\n selector: 'ys-footer',\r\n imports: [NgbTooltip],\r\n templateUrl: './ys-footer.html',\r\n changeDetection: ChangeDetectionStrategy.Eager,\r\n styleUrl: './ys-footer.scss',\r\n})\r\nexport class YsFooter {\r\n styleClass = input<string>();\r\n brand = input<FooterBrand>();\r\n copyright = input('');\r\n socialNetworks = input<readonly SocialNetwork[]>([]);\r\n}\r\n","<!-- https://colorlib.com/wp/template/bootstrap-footer-19/ -->\r\n<footer [class]=\"styleClass()\">\r\n <!-- <div class=\"row\">\r\n <div class=\"col-md-6 col-lg-3 mb-md-0 mb-4\">\r\n <h2 class=\"footer-heading d-flex\">\r\n <span class=\"icon d-flex align-items-center justify-content-center\"><i class=\"ion-logo-ionic\"></i></span>\r\n About\r\n </h2>\r\n <div class=\"block-23 mb-3\">\r\n <ul>\r\n <li><span class=\"icon ion-ios-pin\"></span><span class=\"text\">203 Fake St. Mountain View, San\r\n Francisco, California, USA</span></li>\r\n <li><a href=\"#\"><span class=\"icon ion-ios-call\"></span><span class=\"text\">+2 392 3929 210</span></a>\r\n </li>\r\n <li><a href=\"#\"><span class=\"icon ion-ios-send\"></span><span\r\n class=\"text\">support@yourdomain.com</span></a></li>\r\n </ul>\r\n </div>\r\n\r\n <form action=\"#\" class=\"subscribe-form\">\r\n <div class=\"input-group d-flex\">\r\n <input type=\"text\" class=\"form-control\" placeholder=\"Enter email address\">\r\n <button type=\"submit\" class=\"btn btn-info\">\r\n <span class=\"sr-only\">Submit</span>\r\n <i class=\"fa fa-paper-plane\"></i></button>\r\n </div>\r\n </form>\r\n </div>\r\n\r\n </div> -->\r\n <div class=\"row\">\r\n <div class=\"col\">\r\n <div class=\"d-flex justify-content-between align-items-center py-3 my-4 border-top\">\r\n @if (brand() || copyright()) {\r\n <div class=\"d-flex align-items-center\">\r\n @if (brand()?.href) {\r\n <a [href]=\"brand()?.href\" class=\"px-2 text-muted text-decoration-none\">\r\n <img [src]=\"brand()?.src\" [alt]=\"brand()?.alt || 'logo'\" [class]=\"brand()?.styleClass\"\r\n class=\"brand-logo d-inline-block align-text-top\" />\r\n </a>\r\n } @else {\r\n <img [src]=\"brand()?.src\" [alt]=\"brand()?.alt || 'logo'\" [class]=\"brand()?.styleClass\"\r\n class=\"brand-logo d-inline-block align-text-top\" />\r\n }\r\n\r\n @if (copyright()) {\r\n <span class=\"text-muted\">{{ copyright() }}</span>\r\n }\r\n </div>\r\n }\r\n\r\n @if (socialNetworks().length) {\r\n <ul class=\"nav\">\r\n @for (social of socialNetworks(); track social.href) {\r\n <li class=\"px-2\">\r\n <a class=\"text-muted social-icon\" [href]=\"social.href\" [ngbTooltip]=\"social.tooltip\" target=\"_blank\"\r\n rel=\"noopener noreferrer\">\r\n <em [class]=\"social.iconClass\"></em>\r\n </a>\r\n </li>\r\n }\r\n </ul>\r\n }\r\n </div>\r\n </div>\r\n </div>\r\n</footer>","/*\r\n * Public API Surface of ys-footer\r\n */\r\n\r\nexport * from './src/models';\r\nexport * from './src/ys-footer/ys-footer';\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":";;;;MAWa,QAAQ,CAAA;AACnB,IAAA,UAAU,GAAG,KAAK;8FAAU;AAC5B,IAAA,KAAK,GAAG,KAAK;yFAAe;IAC5B,SAAS,GAAG,KAAK,CAAC,EAAE;kFAAC;IACrB,cAAc,GAAG,KAAK,CAA2B,EAAE;uFAAC;uGAJzC,QAAQ,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;2FAAR,QAAQ,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,EAAA,UAAA,EAAA,EAAA,iBAAA,EAAA,YAAA,EAAA,UAAA,EAAA,YAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,KAAA,EAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,UAAA,EAAA,WAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,cAAA,EAAA,EAAA,iBAAA,EAAA,gBAAA,EAAA,UAAA,EAAA,gBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECXrB,yxFAkES,EAAA,MAAA,EAAA,CAAA,mIAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,ED5DG,UAAU,EAAA,QAAA,EAAA,cAAA,EAAA,MAAA,EAAA,CAAA,WAAA,EAAA,WAAA,EAAA,WAAA,EAAA,eAAA,EAAA,UAAA,EAAA,gBAAA,EAAA,WAAA,EAAA,gBAAA,EAAA,cAAA,EAAA,gBAAA,EAAA,WAAA,EAAA,YAAA,EAAA,YAAA,CAAA,EAAA,OAAA,EAAA,CAAA,OAAA,EAAA,QAAA,CAAA,EAAA,QAAA,EAAA,CAAA,YAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,KAAA,EAAA,CAAA;;2FAKT,QAAQ,EAAA,UAAA,EAAA,CAAA;kBAPpB,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,WAAW,WACZ,CAAC,UAAU,CAAC,EAAA,eAAA,EAEJ,uBAAuB,CAAC,KAAK,EAAA,QAAA,EAAA,yxFAAA,EAAA,MAAA,EAAA,CAAA,mIAAA,CAAA,EAAA;;;AERhD;;AAEG;;ACFH;;AAEG;;;;"}
|
|
@@ -1,19 +1,25 @@
|
|
|
1
1
|
import * as i0 from '@angular/core';
|
|
2
|
-
import { input, Component } from '@angular/core';
|
|
2
|
+
import { input, ChangeDetectionStrategy, Component } from '@angular/core';
|
|
3
3
|
|
|
4
4
|
class YsLoadingMask {
|
|
5
|
-
loading = input(false,
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
5
|
+
loading = input(false, /* @ts-ignore */
|
|
6
|
+
...(ngDevMode ? [{ debugName: "loading" }] : /* istanbul ignore next */ []));
|
|
7
|
+
message = input('Loading ...', /* @ts-ignore */
|
|
8
|
+
...(ngDevMode ? [{ debugName: "message" }] : /* istanbul ignore next */ []));
|
|
9
|
+
backgroundStyleClass = input(/* @ts-ignore */
|
|
10
|
+
...(ngDevMode ? [undefined, { debugName: "backgroundStyleClass" }] : /* istanbul ignore next */ []));
|
|
11
|
+
spinnerStyleClass = input(/* @ts-ignore */
|
|
12
|
+
...(ngDevMode ? [undefined, { debugName: "spinnerStyleClass" }] : /* istanbul ignore next */ []));
|
|
13
|
+
messageStyleClass = input(/* @ts-ignore */
|
|
14
|
+
...(ngDevMode ? [undefined, { debugName: "messageStyleClass" }] : /* istanbul ignore next */ []));
|
|
15
|
+
fullScreen = input(false, /* @ts-ignore */
|
|
16
|
+
...(ngDevMode ? [{ debugName: "fullScreen" }] : /* istanbul ignore next */ []));
|
|
17
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: YsLoadingMask, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
18
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.7", type: YsLoadingMask, isStandalone: true, selector: "ys-loading-mask", inputs: { loading: { classPropertyName: "loading", publicName: "loading", isSignal: true, isRequired: false, transformFunction: null }, message: { classPropertyName: "message", publicName: "message", isSignal: true, isRequired: false, transformFunction: null }, backgroundStyleClass: { classPropertyName: "backgroundStyleClass", publicName: "backgroundStyleClass", isSignal: true, isRequired: false, transformFunction: null }, spinnerStyleClass: { classPropertyName: "spinnerStyleClass", publicName: "spinnerStyleClass", isSignal: true, isRequired: false, transformFunction: null }, messageStyleClass: { classPropertyName: "messageStyleClass", publicName: "messageStyleClass", isSignal: true, isRequired: false, transformFunction: null }, fullScreen: { classPropertyName: "fullScreen", publicName: "fullScreen", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: "@if (loading()) {\n<div class=\"ys-loading-wrapper d-flex flex-column align-items-center justify-content-center\"\n [class.position-fixed]=\"fullScreen()\" [class.position-absolute]=\"!fullScreen()\">\n <div class=\"ys-loading-mask bg-secondary position-absolute\" [class]=\"backgroundStyleClass()\">\n </div>\n <div class=\"ys-loading-content d-flex flex-column align-items-center justify-content-center\">\n <div class=\"loading-spinner spinner-border text-primary\" [class]=\"spinnerStyleClass()\" role=\"status\"></div>\n\n @if (message()) {\n <strong class=\"badge text-primary mt-4 p-3\" [class]=\"messageStyleClass()\">\n {{message()}}\n </strong>\n }\n\n </div>\n</div>\n}", styles: ["@keyframes fade-in{0%{opacity:0}to{opacity:1}}.ys-loading-wrapper{inset:0;z-index:1001;animation:fade-in .15s ease}.ys-loading-wrapper .ys-loading-mask{inset:0;opacity:.3}.ys-loading-wrapper .ys-loading-content .loading-spinner{width:3rem;height:3rem}\n"], changeDetection: i0.ChangeDetectionStrategy.Eager });
|
|
13
19
|
}
|
|
14
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
20
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: YsLoadingMask, decorators: [{
|
|
15
21
|
type: Component,
|
|
16
|
-
args: [{ selector: 'ys-loading-mask', imports: [], template: "@if (loading()) {\n<div class=\"ys-loading-wrapper d-flex flex-column align-items-center justify-content-center\"\n [class.position-fixed]=\"fullScreen()\" [class.position-absolute]=\"!fullScreen()\">\n <div class=\"ys-loading-mask bg-secondary position-absolute\" [class]=\"backgroundStyleClass()\">\n </div>\n <div class=\"ys-loading-content d-flex flex-column align-items-center justify-content-center\">\n <div class=\"loading-spinner spinner-border text-primary\" [class]=\"spinnerStyleClass()\" role=\"status\"></div>\n\n @if (message()) {\n <strong class=\"badge text-primary mt-4 p-3\" [class]=\"messageStyleClass()\">\n {{message()}}\n </strong>\n }\n\n </div>\n</div>\n}", styles: ["@keyframes fade-in{0%{opacity:0}to{opacity:1}}.ys-loading-wrapper{inset:0;z-index:1001;animation:fade-in .15s ease}.ys-loading-wrapper .ys-loading-mask{inset:0;opacity:.3}.ys-loading-wrapper .ys-loading-content .loading-spinner{width:3rem;height:3rem}\n"] }]
|
|
22
|
+
args: [{ selector: 'ys-loading-mask', imports: [], changeDetection: ChangeDetectionStrategy.Eager, template: "@if (loading()) {\n<div class=\"ys-loading-wrapper d-flex flex-column align-items-center justify-content-center\"\n [class.position-fixed]=\"fullScreen()\" [class.position-absolute]=\"!fullScreen()\">\n <div class=\"ys-loading-mask bg-secondary position-absolute\" [class]=\"backgroundStyleClass()\">\n </div>\n <div class=\"ys-loading-content d-flex flex-column align-items-center justify-content-center\">\n <div class=\"loading-spinner spinner-border text-primary\" [class]=\"spinnerStyleClass()\" role=\"status\"></div>\n\n @if (message()) {\n <strong class=\"badge text-primary mt-4 p-3\" [class]=\"messageStyleClass()\">\n {{message()}}\n </strong>\n }\n\n </div>\n</div>\n}", styles: ["@keyframes fade-in{0%{opacity:0}to{opacity:1}}.ys-loading-wrapper{inset:0;z-index:1001;animation:fade-in .15s ease}.ys-loading-wrapper .ys-loading-mask{inset:0;opacity:.3}.ys-loading-wrapper .ys-loading-content .loading-spinner{width:3rem;height:3rem}\n"] }]
|
|
17
23
|
}], propDecorators: { loading: [{ type: i0.Input, args: [{ isSignal: true, alias: "loading", required: false }] }], message: [{ type: i0.Input, args: [{ isSignal: true, alias: "message", required: false }] }], backgroundStyleClass: [{ type: i0.Input, args: [{ isSignal: true, alias: "backgroundStyleClass", required: false }] }], spinnerStyleClass: [{ type: i0.Input, args: [{ isSignal: true, alias: "spinnerStyleClass", required: false }] }], messageStyleClass: [{ type: i0.Input, args: [{ isSignal: true, alias: "messageStyleClass", required: false }] }], fullScreen: [{ type: i0.Input, args: [{ isSignal: true, alias: "fullScreen", required: false }] }] } });
|
|
18
24
|
|
|
19
25
|
/*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"yoozsoft-yoozsoft-ng-loading.mjs","sources":["../../../../projects/yoozsoft/yoozsoft-ng/loading/src/ys-loading-mask/ys-loading-mask.ts","../../../../projects/yoozsoft/yoozsoft-ng/loading/src/ys-loading-mask/ys-loading-mask.html","../../../../projects/yoozsoft/yoozsoft-ng/loading/public-api.ts","../../../../projects/yoozsoft/yoozsoft-ng/loading/yoozsoft-yoozsoft-ng-loading.ts"],"sourcesContent":["import { Component, input } from '@angular/core';\n\n@Component({\n selector: 'ys-loading-mask',\n imports: [],\n templateUrl: './ys-loading-mask.html',\n styleUrl: './ys-loading-mask.scss',\n})\nexport class YsLoadingMask {\
|
|
1
|
+
{"version":3,"file":"yoozsoft-yoozsoft-ng-loading.mjs","sources":["../../../../projects/yoozsoft/yoozsoft-ng/loading/src/ys-loading-mask/ys-loading-mask.ts","../../../../projects/yoozsoft/yoozsoft-ng/loading/src/ys-loading-mask/ys-loading-mask.html","../../../../projects/yoozsoft/yoozsoft-ng/loading/public-api.ts","../../../../projects/yoozsoft/yoozsoft-ng/loading/yoozsoft-yoozsoft-ng-loading.ts"],"sourcesContent":["import { Component, input, ChangeDetectionStrategy } from '@angular/core';\r\n\r\n@Component({\r\n selector: 'ys-loading-mask',\r\n imports: [],\r\n templateUrl: './ys-loading-mask.html',\r\n changeDetection: ChangeDetectionStrategy.Eager,\r\n styleUrl: './ys-loading-mask.scss',\r\n})\r\nexport class YsLoadingMask {\r\n loading = input<boolean>(false);\r\n message = input<string>('Loading ...');\r\n backgroundStyleClass = input<string>();\r\n spinnerStyleClass = input<string>();\r\n messageStyleClass = input<string>();\r\n fullScreen = input(false);\r\n}\r\n","@if (loading()) {\n<div class=\"ys-loading-wrapper d-flex flex-column align-items-center justify-content-center\"\n [class.position-fixed]=\"fullScreen()\" [class.position-absolute]=\"!fullScreen()\">\n <div class=\"ys-loading-mask bg-secondary position-absolute\" [class]=\"backgroundStyleClass()\">\n </div>\n <div class=\"ys-loading-content d-flex flex-column align-items-center justify-content-center\">\n <div class=\"loading-spinner spinner-border text-primary\" [class]=\"spinnerStyleClass()\" role=\"status\"></div>\n\n @if (message()) {\n <strong class=\"badge text-primary mt-4 p-3\" [class]=\"messageStyleClass()\">\n {{message()}}\n </strong>\n }\n\n </div>\n</div>\n}","/*\r\n * Public API Surface of ys-loading-mask\r\n */\r\n\r\nexport * from './src/ys-loading-mask/ys-loading-mask';\r\n\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":";;;MASa,aAAa,CAAA;IACxB,OAAO,GAAG,KAAK,CAAU,KAAK;gFAAC;IAC/B,OAAO,GAAG,KAAK,CAAS,aAAa;gFAAC;AACtC,IAAA,oBAAoB,GAAG,KAAK;wGAAU;AACtC,IAAA,iBAAiB,GAAG,KAAK;qGAAU;AACnC,IAAA,iBAAiB,GAAG,KAAK;qGAAU;IACnC,UAAU,GAAG,KAAK,CAAC,KAAK;mFAAC;uGANd,aAAa,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAb,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,aAAa,u7BCT1B,uuBAgBC,EAAA,MAAA,EAAA,CAAA,+PAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,KAAA,EAAA,CAAA;;2FDPY,aAAa,EAAA,UAAA,EAAA,CAAA;kBAPzB,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,iBAAiB,EAAA,OAAA,EAClB,EAAE,EAAA,eAAA,EAEM,uBAAuB,CAAC,KAAK,EAAA,QAAA,EAAA,uuBAAA,EAAA,MAAA,EAAA,CAAA,+PAAA,CAAA,EAAA;;;AENhD;;AAEG;;ACFH;;AAEG;;;;"}
|