UNPKG

ngx-ui-hero

Version:

Simple, fast and reliable utilities for Angular.

1 lines 740 kB
{"version":3,"file":"ngx-ui-hero.mjs","sources":["../../../projects/ngx-ui-hero/src/lib/ui/components/modal/modal.component.ts","../../../projects/ngx-ui-hero/src/lib/ui/components/modal/modal.component.html","../../../projects/ngx-ui-hero/src/lib/ui/components/report/report.component.ts","../../../projects/ngx-ui-hero/src/lib/ui/components/report/report.component.html","../../../projects/ngx-ui-hero/src/lib/ui/components/spinner/spinner.component.ts","../../../projects/ngx-ui-hero/src/lib/ui/components/spinner/spinner.component.html","../../../projects/ngx-ui-hero/src/lib/ui/directives/auto-focus.directive.ts","../../../projects/ngx-ui-hero/src/lib/ui/directives/auto-select-on-focus.directive.ts","../../../projects/ngx-ui-hero/src/lib/ui/directives/click-outside.directive.ts","../../../projects/ngx-ui-hero/src/lib/ui/directives/debounce.directive.ts","../../../projects/ngx-ui-hero/src/lib/ui/services/tutorial.service.ts","../../../projects/ngx-ui-hero/src/lib/ui/directives/tutorial.directive.ts","../../../projects/ngx-ui-hero/src/lib/ui/pipes/search-by.pipe.ts","../../../projects/ngx-ui-hero/src/lib/ui/services/alert.service.ts","../../../projects/ngx-ui-hero/src/lib/ui/classes/tutorial-action.ts","../../../projects/ngx-ui-hero/src/lib/ui/ui.module.ts","../../../projects/ngx-ui-hero/src/lib/ngx-ui-hero.module.ts","../../../projects/ngx-ui-hero/src/lib/api/api.settings.constants.ts","../../../projects/ngx-ui-hero/src/lib/api/services/storage/local-storage.service.ts","../../../projects/ngx-ui-hero/src/lib/api/interceptors/base-api-url.interceptor.ts","../../../projects/ngx-ui-hero/src/lib/api/interceptors/common-headers.interceptor.ts","../../../projects/ngx-ui-hero/src/lib/api/interceptors/jwt-auth.interceptor.ts","../../../projects/ngx-ui-hero/src/lib/api/interceptors/error-handler.interceptor.ts","../../../projects/ngx-ui-hero/src/lib/api/interceptors/response-data.interceptor.ts","../../../projects/ngx-ui-hero/src/lib/api/interceptors/win-auth.interceptor.ts","../../../projects/ngx-ui-hero/src/lib/api/api.module.ts","../../../projects/ngx-ui-hero/src/lib/data-grid/models/column-filter.model.ts","../../../projects/ngx-ui-hero/src/lib/data-grid/components/column-filter/column-filter.component.ts","../../../projects/ngx-ui-hero/src/lib/data-grid/components/column-filter/column-filter.component.html","../../../projects/ngx-ui-hero/src/lib/data-grid/config/data-grid-config.constants.ts","../../../projects/ngx-ui-hero/src/lib/data-grid/config/data-grid-config.ts","../../../projects/ngx-ui-hero/src/lib/data-grid/datagrid-exporting-modal/loading-image.ts","../../../projects/ngx-ui-hero/src/lib/data-grid/services/excel.service.ts","../../../projects/ngx-ui-hero/src/lib/data-grid/datagrid-exporting-modal/datagrid-exporting-modal.component.ts","../../../projects/ngx-ui-hero/src/lib/data-grid/datagrid-exporting-modal/datagrid-exporting-modal.component.html","../../../projects/ngx-ui-hero/src/lib/data-grid/directives/data-grid-templates.directive.ts","../../../projects/ngx-ui-hero/src/lib/data-grid/models/data-grid-column.model.ts","../../../projects/ngx-ui-hero/src/lib/data-grid/data-grid.component.ts","../../../projects/ngx-ui-hero/src/lib/data-grid/data-grid.component.html","../../../projects/ngx-ui-hero/src/lib/data-grid/models/column-reordering-definitions.model.ts","../../../projects/ngx-ui-hero/src/lib/data-grid/data-grid.module.ts","../../../projects/ngx-ui-hero/src/lib/input-forms/base/currency-symbol.pipe.ts","../../../projects/ngx-ui-hero/src/lib/input-forms/components/block-ui/block-ui.component.ts","../../../projects/ngx-ui-hero/src/lib/input-forms/components/block-ui/block-ui.component.html","../../../projects/ngx-ui-hero/src/lib/input-forms/input-forms-config.constants.ts","../../../projects/ngx-ui-hero/src/lib/input-forms/base/validate.ts","../../../projects/ngx-ui-hero/src/lib/input-forms/base/value-accessor-base.ts","../../../projects/ngx-ui-hero/src/lib/input-forms/base/element-base.ts","../../../projects/ngx-ui-hero/src/lib/input-forms/components/filter-date/filter-date.component.ts","../../../projects/ngx-ui-hero/src/lib/input-forms/components/filter-date/filter-date.component.html","../../../projects/ngx-ui-hero/src/lib/input-forms/components/filter-dropdown-search/filter-dropdown-search.component.ts","../../../projects/ngx-ui-hero/src/lib/input-forms/components/filter-dropdown-search/filter-dropdown-search.component.html","../../../projects/ngx-ui-hero/src/lib/input-forms/components/filter-multiselect/filter-multiselect.component.ts","../../../projects/ngx-ui-hero/src/lib/input-forms/components/filter-multiselect/filter-multiselect.component.html","../../../projects/ngx-ui-hero/src/lib/input-forms/components/input-checkbox/input-checkbox.component.ts","../../../projects/ngx-ui-hero/src/lib/input-forms/components/input-checkbox/input-checkbox.component.html","../../../projects/ngx-ui-hero/src/lib/input-forms/components/input-validations/input-validations.component.ts","../../../projects/ngx-ui-hero/src/lib/input-forms/components/input-validations/input-validations.component.html","../../../projects/ngx-ui-hero/src/lib/input-forms/directives/currency/currency-mask.config.ts","../../../projects/ngx-ui-hero/src/lib/input-forms/directives/currency/input.manager.ts","../../../projects/ngx-ui-hero/src/lib/input-forms/directives/currency/input.service.ts","../../../projects/ngx-ui-hero/src/lib/input-forms/directives/currency/input.handler.ts","../../../projects/ngx-ui-hero/src/lib/input-forms/directives/currency/currency-mask.directive.ts","../../../projects/ngx-ui-hero/src/lib/input-forms/components/input-currency/input-currency.component.ts","../../../projects/ngx-ui-hero/src/lib/input-forms/components/input-currency/input-currency.component.html","../../../projects/ngx-ui-hero/src/lib/input-forms/components/input-date/input-date.component.ts","../../../projects/ngx-ui-hero/src/lib/input-forms/components/input-date/input-date.component.html","../../../projects/ngx-ui-hero/src/lib/input-forms/components/input-dropdown-grid/input-dropdown-grid.component.ts","../../../projects/ngx-ui-hero/src/lib/input-forms/components/input-dropdown-grid/input-dropdown-grid.component.html","../../../projects/ngx-ui-hero/src/lib/input-forms/components/input-dropdown-search/input-dropdown-search.component.ts","../../../projects/ngx-ui-hero/src/lib/input-forms/components/input-dropdown-search/input-dropdown-search.component.html","../../../projects/ngx-ui-hero/src/lib/input-forms/components/input-email/input-email.component.ts","../../../projects/ngx-ui-hero/src/lib/input-forms/components/input-email/input-email.component.html","../../../projects/ngx-ui-hero/src/lib/input-forms/components/input-month-year/input-month-year.language.ts","../../../projects/ngx-ui-hero/src/lib/input-forms/components/input-month-year/input-month-year.constants.ts","../../../projects/ngx-ui-hero/src/lib/input-forms/components/input-month-year/input-month-year.component.ts","../../../projects/ngx-ui-hero/src/lib/input-forms/components/input-month-year/input-month-year.component.html","../../../projects/ngx-ui-hero/src/lib/input-forms/components/input-multiselect/input-multiselect.component.ts","../../../projects/ngx-ui-hero/src/lib/input-forms/components/input-multiselect/input-multiselect.component.html","../../../projects/ngx-ui-hero/src/lib/input-forms/directives/max-value-validator.directive.ts","../../../projects/ngx-ui-hero/src/lib/input-forms/directives/min-value-validator.directive.ts","../../../projects/ngx-ui-hero/src/lib/input-forms/components/input-number/input-number.component.ts","../../../projects/ngx-ui-hero/src/lib/input-forms/components/input-number/input-number.component.html","../../../projects/ngx-ui-hero/src/lib/input-forms/components/input-percent/input-percent.component.ts","../../../projects/ngx-ui-hero/src/lib/input-forms/components/input-percent/input-percent.component.html","../../../projects/ngx-ui-hero/src/lib/input-forms/components/input-radio/input-radio.component.ts","../../../projects/ngx-ui-hero/src/lib/input-forms/components/input-radio/input-radio.component.html","../../../projects/ngx-ui-hero/src/lib/input-forms/components/input-select/input-select.component.ts","../../../projects/ngx-ui-hero/src/lib/input-forms/components/input-select/input-select.component.html","../../../projects/ngx-ui-hero/src/lib/input-forms/components/input-switch/input-switch.component.ts","../../../projects/ngx-ui-hero/src/lib/input-forms/components/input-switch/input-switch.component.html","../../../projects/ngx-ui-hero/src/lib/input-forms/masking/mask-helper.ts","../../../projects/ngx-ui-hero/src/lib/input-forms/masking/utils.ts","../../../projects/ngx-ui-hero/src/lib/input-forms/masking/mask.directive.ts","../../../projects/ngx-ui-hero/src/lib/input-forms/components/input-text-mask/input-text-mask.component.ts","../../../projects/ngx-ui-hero/src/lib/input-forms/components/input-text-mask/input-text-mask.component.html","../../../projects/ngx-ui-hero/src/lib/input-forms/components/input-text/input-text.component.ts","../../../projects/ngx-ui-hero/src/lib/input-forms/components/input-text/input-text.component.html","../../../projects/ngx-ui-hero/src/lib/input-forms/components/input-textarea/input-textarea.component.ts","../../../projects/ngx-ui-hero/src/lib/input-forms/components/input-textarea/input-textarea.component.html","../../../projects/ngx-ui-hero/src/lib/input-forms/components/input-upload/input-upload.component.ts","../../../projects/ngx-ui-hero/src/lib/input-forms/components/input-upload/input-upload.component.html","../../../projects/ngx-ui-hero/src/lib/input-forms/components/radial-button/radial-button.component.ts","../../../projects/ngx-ui-hero/src/lib/input-forms/components/radial-button/radial-button.component.html","../../../projects/ngx-ui-hero/src/lib/input-forms/components/input-date/input-date-config.ts","../../../projects/ngx-ui-hero/src/lib/input-forms/classes/block-ui.ts","../../../projects/ngx-ui-hero/src/lib/input-forms/input-forms.module.ts","../../../projects/ngx-ui-hero/src/lib/tree-view/config/tree-view-config.contants.ts","../../../projects/ngx-ui-hero/src/lib/tree-view/tree-view.service.ts","../../../projects/ngx-ui-hero/src/lib/tree-view/tree-view-item/tree-view-item.component.ts","../../../projects/ngx-ui-hero/src/lib/tree-view/tree-view-item/tree-view-item.component.html","../../../projects/ngx-ui-hero/src/lib/tree-view/tree-view.component.ts","../../../projects/ngx-ui-hero/src/lib/tree-view/tree-view.component.html","../../../projects/ngx-ui-hero/src/lib/tree-view/config/tree-view-config.ts","../../../projects/ngx-ui-hero/src/lib/tree-view/models/tree-view-column.model.ts","../../../projects/ngx-ui-hero/src/lib/tree-view/tree-view.module.ts","../../../projects/ngx-ui-hero/src/lib/charts/config/charts-config.contants.ts","../../../projects/ngx-ui-hero/src/lib/charts/directives/gantt-templates.directive.ts","../../../projects/ngx-ui-hero/src/lib/charts/components/gantt-chart/gantt-chart.component.ts","../../../projects/ngx-ui-hero/src/lib/charts/components/gantt-chart/gantt-chart.component.html","../../../projects/ngx-ui-hero/src/lib/charts/chart.module.ts","../../../projects/ngx-ui-hero/src/index.ts","../../../projects/ngx-ui-hero/src/ngx-ui-hero.ts"],"sourcesContent":["import { BsModalRef } from 'ngx-bootstrap/modal';\n\nimport { Component, EventEmitter, Input, OnInit, Output } from '@angular/core';\n\n@Component({\n selector: 'ui-modal',\n templateUrl: './modal.component.html',\n styleUrls: ['./modal.component.scss']\n})\nexport class ModalComponent implements OnInit {\n @Input() modalTitle?: string = '';\n @Input() hideActions?: boolean = false;\n @Input() noPaddings?: boolean = false;\n @Input() cancelButtonLabel?: string = 'Cancel';\n @Output() onClose = new EventEmitter();\n\n constructor(\n private modalRef: BsModalRef\n ) { }\n\n ngOnInit() {\n }\n\n Fechar(): void {\n this.onClose.emit();\n this.modalRef.hide();\n }\n\n}\n","<div class=\"modal-header\" *ngIf=\"modalTitle\">\n <h5 class=\"modal-title\">{{modalTitle}}</h5>\n <button type=\"button\" class=\"close\" (click)=\"Fechar()\" aria-label=\"Close\">\n <span aria-hidden=\"true\">&times;</span>\n </button>\n</div>\n<div class=\"modal-body\" [ngClass]=\"{'p-0': noPaddings}\">\n <ng-content select=\".body\"></ng-content>\n</div>\n<div class=\"modal-footer\" *ngIf=\"!hideActions\">\n <button type=\"button\" class=\"btn btn-outline-secondary\" (click)=\"Fechar()\"><i class=\"fa fa-times\"></i> {{cancelButtonLabel}}</button>\n <ng-content select=\".actions\"></ng-content>\n</div>","import { Component, Input } from '@angular/core';\n\ndeclare var $: any;\n\nlet identifier = 0;\n\n@Component({\n selector: 'ui-report',\n templateUrl: './report.component.html',\n styleUrls: ['./report.component.scss']\n})\nexport class ReportComponent {\n @Input() reportTitle: string = ' ';\n public identifier = `ui-report-${identifier++}`;\n\n constructor() { }\n\n Print(): void {\n $(`#${this.identifier}`).printThis({\n debug: false, // show the iframe for debugging\n importCSS: true, // import parent page css\n importStyle: true, // import style tags\n printContainer: true, // print outer container/$.selector\n loadCSS: \"\", // path to additional css file - use an array [] for multiple\n pageTitle: this.reportTitle, // add title to print page\n removeInline: false, // remove inline styles from print elements\n removeInlineSelector: \"*\", // custom selectors to filter inline styles. removeInline must be true\n printDelay: 333, // variable print delay\n header: '', // prefix to html\n footer: '', // postfix to html\n base: false, // preserve the BASE tag or accept a string for the URL\n formValues: true, // preserve input/form values\n canvas: false, // copy canvas content\n //doctypeString: '...', // enter a different doctype for older markup\n removeScripts: false, // remove script tags from print content\n copyTagClasses: false, // copy classes from the html & body tag\n beforePrintEvent: null, // function for printEvent in iframe\n beforePrint: null, // function called before iframe is filled\n afterPrint: null // function called before iframe is removed\n });\n }\n\n}\n","<div id=\"{{identifier}}\" class=\"report\">\n <ng-content select=\".page-header\"></ng-content>\n <ng-content select=\".report-body\"></ng-content>\n <ng-content select=\".page-footer\"></ng-content>\n</div>\n","import { Component, Input, OnInit } from '@angular/core';\n\n@Component({\n selector: 'spinner',\n templateUrl: 'spinner.component.html',\n styleUrls: ['spinner.component.scss'],\n})\n\nexport class SpinnerComponent implements OnInit {\n @Input() noMargins: boolean = false;\n\n constructor() { }\n\n ngOnInit() { }\n}","<div class=\"spinner\" [ngClass]=\"{'m-0': noMargins}\">\n <div class=\"bounce1\"></div>\n <div class=\"bounce2\"></div>\n <div class=\"bounce3\"></div>\n</div>","import { Directive, ElementRef, OnInit } from '@angular/core';\n\n@Directive({ selector: '[auto-focus]' })\nexport class AutoFocusDirective implements OnInit {\n constructor(\n private el: ElementRef\n ) { }\n\n ngOnInit() {\n this.el.nativeElement.focus();\n }\n}","import { Directive, OnInit, ElementRef, Renderer2 } from '@angular/core';\n\ndeclare var jQuery: any;\n\n@Directive({\n // tslint:disable-next-line:directive-selector\n selector: 'input[autoSelectOnFocus]'\n})\nexport class AutoSelectOnFocusDirective implements OnInit {\n constructor(\n private elementRef: ElementRef,\n private renderer: Renderer2\n ) {}\n\n ngOnInit() {\n this.renderer.listen(this.elementRef.nativeElement, 'focus', (event: any) => {\n jQuery(this.elementRef.nativeElement).select();\n });\n }\n}\n","import { isPlatformBrowser } from '@angular/common';\nimport { Directive, ElementRef, EventEmitter, Inject, Injectable, Input, NgZone, OnChanges, OnDestroy, OnInit, Output, PLATFORM_ID, SimpleChanges } from '@angular/core';\n\n@Injectable()\n@Directive({ selector: '[clickOutside]' })\nexport class ClickOutsideDirective implements OnInit, OnChanges, OnDestroy {\n\n @Input() clickOutsideEnabled: boolean = true;\n\n @Input() attachOutsideOnClick: boolean = false;\n @Input() delayClickOutsideInit: boolean = true;\n @Input() emitOnBlur: boolean = false;\n\n @Input() exclude: string = '';\n @Input() excludeBeforeClick: boolean = false;\n\n @Input() clickOutsideEvents: string = '';\n\n @Output() clickOutside: EventEmitter<Event> = new EventEmitter<Event>();\n\n private _nodesExcluded: Array<HTMLElement> = [];\n private _events: Array<string> = ['click'];\n\n constructor(\n private _el: ElementRef,\n private _ngZone: NgZone,\n @Inject(PLATFORM_ID) private platformId: Object) {\n this._initOnClickBody = this._initOnClickBody.bind(this);\n this._onClickBody = this._onClickBody.bind(this);\n this._onWindowBlur = this._onWindowBlur.bind(this);\n }\n\n ngOnInit() {\n if (!isPlatformBrowser(this.platformId)) { return; }\n\n this._init();\n }\n\n ngOnDestroy() {\n if (!isPlatformBrowser(this.platformId)) { return; }\n\n this._removeClickOutsideListener();\n this._removeAttachOutsideOnClickListener();\n this._removeWindowBlurListener();\n }\n\n ngOnChanges(changes: SimpleChanges) {\n if (!isPlatformBrowser(this.platformId)) { return; }\n\n if (changes['attachOutsideOnClick'] || changes['exclude'] || changes['emitOnBlur']) {\n this._init();\n }\n }\n\n private _init() {\n if (this.clickOutsideEvents !== '') {\n this._events = this.clickOutsideEvents.split(',').map(e => e.trim());\n }\n\n this._excludeCheck();\n\n if (this.attachOutsideOnClick) {\n this._initAttachOutsideOnClickListener();\n } else {\n this._initOnClickBody();\n }\n\n if (this.emitOnBlur) {\n this._initWindowBlurListener();\n }\n }\n\n private _initOnClickBody() {\n if (this.delayClickOutsideInit) {\n setTimeout(this._initClickOutsideListener.bind(this));\n } else {\n this._initClickOutsideListener();\n }\n }\n\n private _excludeCheck() {\n if (this.exclude) {\n try {\n const nodes = Array.from(document.querySelectorAll(this.exclude)) as Array<HTMLElement>;\n if (nodes) {\n this._nodesExcluded = nodes;\n }\n } catch (err) {\n console.error('[ng-click-outside] Check your exclude selector syntax.', err);\n }\n }\n }\n\n private _onClickBody(ev: Event) {\n if (!this.clickOutsideEnabled) { return; }\n\n if (this.excludeBeforeClick) {\n this._excludeCheck();\n }\n\n if (!this._el.nativeElement.contains(ev.target) && !this._shouldExclude(ev.target)) {\n this._emit(ev);\n\n if (this.attachOutsideOnClick) {\n this._removeClickOutsideListener();\n }\n }\n }\n\n private _onWindowBlur(ev: Event) {\n setTimeout(() => {\n if (!document.hidden) {\n this._emit(ev);\n }\n });\n }\n\n private _emit(ev: Event) {\n if (!this.clickOutsideEnabled) { return; }\n\n this._ngZone.run(() => this.clickOutside.emit(ev));\n }\n\n private _shouldExclude(target): boolean {\n for (let excludedNode of this._nodesExcluded) {\n if (excludedNode.contains(target)) {\n return true;\n }\n }\n\n return false;\n }\n\n private _initClickOutsideListener() {\n this._ngZone.runOutsideAngular(() => {\n this._events.forEach(e => document.body.addEventListener(e, this._onClickBody));\n });\n }\n\n private _removeClickOutsideListener() {\n this._ngZone.runOutsideAngular(() => {\n this._events.forEach(e => document.body.removeEventListener(e, this._onClickBody));\n });\n }\n\n private _initAttachOutsideOnClickListener() {\n this._ngZone.runOutsideAngular(() => {\n this._events.forEach(e => this._el.nativeElement.addEventListener(e, this._initOnClickBody));\n });\n }\n\n private _removeAttachOutsideOnClickListener() {\n this._ngZone.runOutsideAngular(() => {\n this._events.forEach(e => this._el.nativeElement.removeEventListener(e, this._initOnClickBody));\n });\n }\n\n private _initWindowBlurListener() {\n this._ngZone.runOutsideAngular(() => {\n window.addEventListener('blur', this._onWindowBlur);\n });\n }\n\n private _removeWindowBlurListener() {\n this._ngZone.runOutsideAngular(() => {\n window.removeEventListener('blur', this._onWindowBlur);\n });\n }\n\n}\n","import { fromEvent } from 'rxjs';\nimport { debounceTime } from 'rxjs/operators';\n\nimport { Directive, ElementRef, EventEmitter, Input, OnInit, Output } from '@angular/core';\n\n@Directive({\n selector: '[debounce]'\n})\nexport class DebounceDirective implements OnInit {\n @Input() delay = 500;\n @Output() callback = new EventEmitter();\n @Output() arrowsCallback = new EventEmitter<any>();\n\n private _arrowKeyCodes: number[] = [13,27,37,38,39,40];\n\n constructor(\n private elementRef: ElementRef\n ) {}\n\n ngOnInit() {\n const event1 = fromEvent(this.elementRef.nativeElement, 'keyup')\n .pipe(\n debounceTime(this.delay),\n )\n .subscribe((input: any) => {\n if (this._arrowKeyCodes.indexOf(input.keyCode) < 0) {\n this.callback.emit(input);\n } \n });\n\n const event2 = fromEvent(this.elementRef.nativeElement, 'keyup')\n .subscribe((input: any) => {\n if (this._arrowKeyCodes.indexOf(input.keyCode) >= 0) {\n this.arrowsCallback.emit(input);\n } \n });\n }\n\n}\n","import { orderBy } from 'lodash-es';\n\nimport { ElementRef, EventEmitter, Injectable, Renderer2, RendererFactory2 } from '@angular/core';\nimport { NavigationStart, Router } from '@angular/router';\n\nimport { TutorialAction } from '../classes/tutorial-action';\nimport { TutorialTask } from '../classes/tutorial-task';\n\ndeclare var $: any;\ndeclare var localStorage: any;\n\n@Injectable()\nexport class TutorialService {\n onStepChanged = new EventEmitter<TutorialTask>();\n onStart = new EventEmitter();\n onExit = new EventEmitter();\n\n private _tasks: Array<TutorialTask>;\n private _runningTasks: Array<TutorialTask>;\n private _currentTaskIndex: number = -1;\n private _render: Renderer2;\n private colorPlaceholder: string;\n private unlistenKeyboardArrows: Function;\n\n private OVERLAY_ID = 'tutorial-orverlay';\n private BLOCKER_ID = 'element-blocker';\n private BLOCK_ID = 'element-tutorial-block';\n private BLOCK_ARROW_ID = 'element-tutorial-block-arrow';\n private BLOCK_TITLE_ID = 'element-tutorial-block-title';\n private BLOCK_BODY_ID = 'element-tutorial-block-body';\n private BLOCK_CONTROLS_ID = 'element-tutorial-block-controls';\n private BLOCK_CONTROL_PREV_ID = 'element-tutorial-block-prev-control';\n private BLOCK_CONTROL_NEXT_ID = 'element-tutorial-block-next-control';\n private BLOCK_CONTROL_INFO_ID = 'element-tutorial-block-info-control';\n private BLOCK_CONTROL_EXIT_ID = 'element-tutorial-block-exit-control';\n\n constructor(\n private rendererFactory: RendererFactory2,\n private router: Router\n ) {\n this._render = rendererFactory.createRenderer(null, null);\n\n this.router.events.subscribe((event) => {\n if (event instanceof NavigationStart) {\n this.resetTasks();\n }\n });\n }\n\n addAction(action: TutorialAction, element: ElementRef): void {\n let index: number = -1;\n\n if (!this._tasks) {\n this._tasks = new Array<TutorialTask>();\n } else {\n for (let i = 0; i < this._tasks.length; i++) {\n if (this._tasks[i].element.nativeElement.tagName == element.nativeElement.tagName\n && this._tasks[i].action.title == action.title \n && this._tasks[i].action.text == action.text) {\n \n index = i;\n break;\n }\n }\n }\n\n let task = { \n action: action, \n element: element\n };\n\n if (index >= 0) {\n this._tasks[index] = task;\n } else {\n this._tasks.push(task);\n }\n }\n\n playAll(): void {\n if (this._currentTaskIndex >= 0) return;\n\n setTimeout(() => {\n let tasks = this._tasks.filter(x => x.element && x.element.nativeElement && x.element.nativeElement.isConnected);\n if (!tasks || tasks.length == 0) return;\n\n tasks = orderBy(tasks, ['action.order'], ['asc']);\n\n this.play(tasks);\n });\n }\n playByKey(key: string, onlyOnce?: boolean): void {\n if (this._currentTaskIndex >= 0) return;\n \n setTimeout(() => {\n if (onlyOnce && this.getLocalStorage(key)) return;\n\n let tasks = this._tasks.filter(x => x.element && x.element.nativeElement && x.element.nativeElement.isConnected && x.action.key == key);\n if (!tasks || tasks.length == 0) return;\n\n tasks = orderBy(tasks, ['action.order'], ['asc']);\n\n this.play(tasks);\n\n if (onlyOnce) {\n this.setLocalStorage(key, key);\n }\n });\n }\n moveNext(): void {\n if (this._currentTaskIndex >= this._runningTasks.length - 1) {\n this.exit();\n return;\n }\n\n this.destroyCurrentTask();\n this._currentTaskIndex += 1;\n this.renderCurrentTask();\n this.notifyStepHasChanged();\n }\n movePrev(): void {\n if (this._currentTaskIndex == 0) return;\n\n this.destroyCurrentTask();\n this._currentTaskIndex -= 1;\n this.renderCurrentTask();\n this.notifyStepHasChanged();\n }\n exit(): void {\n this.destroyCurrentTask();\n this.destroyOverlay();\n this.stopListeningKeyboardArrows();\n\n this._currentTaskIndex = -1;\n this._runningTasks = null;\n\n this.onExit.emit();\n }\n resetTasks(): void {\n this._tasks = new Array<TutorialTask>();\n }\n\n private play(tasks: Array<TutorialTask>): void {\n this.onStart.emit();\n\n this._currentTaskIndex = 0;\n this._runningTasks = tasks;\n this.renderOverlay();\n this.renderCurrentTask();\n this.notifyStepHasChanged();\n this.startListeningKeyboardArrows();\n }\n\n //rendering\n private renderCurrentTask(): void {\n if (this._currentTaskIndex < 0) return;\n\n let task = this._runningTasks[this._currentTaskIndex];\n\n this.renderElement(task);\n this.scrollToCurrentElementBlock();\n }\n private renderElement(task: TutorialTask): void {\n this._render.setStyle(task.element.nativeElement, 'position', 'relative');\n this._render.setStyle(task.element.nativeElement, 'zIndex', '9001');\n\n this.renderElementBlocker(task.element);\n this.renderElementColorWhiteIfText(task.element);\n this.renderElementTutorialBlock(task);\n }\n private renderElementBlocker(el: ElementRef): void {\n let blocker = this.createElementBlocker();\n\n this._render.insertBefore(el.nativeElement.parentNode, blocker, el.nativeElement);\n }\n private renderElementTutorialBlock(task: TutorialTask): void {\n let block = this.createTutorialBlockElement(task);\n this.handleTutorialBlockPosition(block, task.element);\n\n this._render.insertBefore(task.element.nativeElement.parentNode, block, task.element.nativeElement);\n }\n private renderElementColorWhiteIfText(el: ElementRef): void {\n if (this.isCurrentElementText()) {\n this.colorPlaceholder = getComputedStyle(el.nativeElement, null).getPropertyValue('color');\n\n this._render.setStyle(el.nativeElement, 'color', '#FFF');\n } \n }\n private renderOverlay(): void {\n let overlay = this.createOverLay();\n\n this._render.appendChild(document.body, overlay);\n }\n \n //element creations\n private createOverLay(): any {\n let overlay = this._render.createElement('div');\n this._render.setAttribute(overlay, 'id', this.OVERLAY_ID);\n this._render.setStyle(overlay, 'position', 'fixed');\n this._render.setStyle(overlay, 'width', '100%');\n this._render.setStyle(overlay, 'height', '100%');\n this._render.setStyle(overlay, 'backgroundColor', 'rgba(41, 41, 41, 0.89)');\n this._render.setStyle(overlay, 'top', '0');\n this._render.setStyle(overlay, 'zIndex', '9000');\n this._render.setStyle(document.body, 'overflow', 'hidden');\n\n return overlay;\n }\n private createElementBlocker(): any {\n let blocker = this._render.createElement('div');\n this._render.setAttribute(blocker, 'id', this.BLOCKER_ID);\n this._render.setStyle(blocker, 'background-color', '#00000024');\n this._render.setStyle(blocker, 'position', 'fixed');\n this._render.setStyle(blocker, 'top', '0');\n this._render.setStyle(blocker, 'left', '0');\n this._render.setStyle(blocker, 'bottom', '0');\n this._render.setStyle(blocker, 'right', '0');\n this._render.setStyle(blocker, 'zIndex', '9002');\n\n return blocker;\n }\n private createTutorialBlockElement(task: TutorialTask): any {\n let block = this._render.createElement('div');\n this._render.setAttribute(block, 'id', this.BLOCK_ID);\n this._render.setStyle(block, 'position', 'fixed');\n this._render.setStyle(block, 'zIndex', '9003');\n this._render.setStyle(block, 'border', '3px solid #FFF');\n this._render.setStyle(block, 'borderRadius', '5px');\n this._render.setStyle(block, 'minWidth', '200px');\n this._render.setStyle(block, 'maxWidth', '350px'); \n this._render.setStyle(block, 'transition', 'opacity .3s ease-in-out');\n\n this.hideTutorialBlockElement(block);\n \n this._render.appendChild(block, this.createTutorialBlockArrow());\n\n if (task.action.title) {\n this._render.appendChild(block, this.createTutorialBlockTitleElement(task.action.title));\n }\n \n this._render.appendChild(block, this.createTutorialBlockBodyElement(task.action.text));\n this._render.appendChild(block, this.createTutorialBlockControls());\n\n return block;\n }\n private createTutorialBlockArrow(): any {\n let arrow = this._render.createElement('div');\n\n this._render.setAttribute(arrow, 'id', this.BLOCK_ARROW_ID);\n this._render.setStyle(arrow, 'position', 'absolute');\n this._render.setStyle(arrow, 'zIndex', '9003');\n this._render.setStyle(arrow, 'width', '0');\n this._render.setStyle(arrow, 'height', '0');\n this._render.setStyle(arrow, 'border-top', '12px solid transparent');\n this._render.setStyle(arrow, 'border-bottom', '12px solid transparent'); \n\n return arrow;\n }\n private createTutorialBlockTitleElement(title: string): any {\n let blockTitle = this._render.createElement('div');\n let blockTitleText = this._render.createText(title);\n let btnExit = this.createTutorialBlockExitControl();\n\n this._render.setAttribute(blockTitle, 'id', this.BLOCK_TITLE_ID);\n this._render.setStyle(blockTitle, 'display', 'flex');\n this._render.setStyle(blockTitle, 'align-items', 'center');\n this._render.setStyle(blockTitle, 'backgroundColor', '#EEEEEE');\n this._render.setStyle(blockTitle, 'color', 'rgb(84, 84, 84)');\n this._render.setStyle(blockTitle, 'padding', '10px 12px');\n this._render.setStyle(blockTitle, 'borderRadius', '5px 5px 0px 0px');\n this._render.setStyle(blockTitle, 'borderBottom', '1px solid rgb(214, 214, 214)');\n this._render.setStyle(blockTitle, 'font-size', '16px');\n this._render.setStyle(blockTitle, 'font-weight', '600');\n this._render.setStyle(blockTitle, 'text-transform', 'uppercase');\n this._render.setStyle(blockTitle, 'margin', '-2px -2px 0px -2px'); \n\n if (blockTitleText) {\n this._render.setStyle(blockTitle, 'fontSize', '16px');\n this._render.setStyle(blockTitle, 'fontWeight', '600');\n this._render.appendChild(blockTitle, blockTitleText);\n }\n \n this._render.appendChild(blockTitle, btnExit);\n\n return blockTitle;\n }\n private createTutorialBlockBodyElement(text: string): any {\n let blockBody = this._render.createElement('div');\n let blockBodyText = this._render.createText(text);\n\n this._render.setAttribute(blockBody, 'id', this.BLOCK_BODY_ID);\n this._render.setStyle(blockBody, 'backgroundColor', '#FFF');\n this._render.setStyle(blockBody, 'padding', '10px 10px 20px 10px');\n\n if (blockBodyText) {\n this._render.setStyle(blockBody, 'fontSize', '14px');\n this._render.setStyle(blockBody, 'fontWeight', 'normal');\n this._render.appendChild(blockBody, blockBodyText);\n }\n\n return blockBody;\n }\n private createTutorialBlockControls(): any {\n let controls = this._render.createElement('div');\n\n this._render.setAttribute(controls, 'id', this.BLOCK_CONTROLS_ID);\n this._render.setStyle(controls, 'backgroundColor', '#FFF');\n this._render.setStyle(controls, 'padding', '10px 12px');\n this._render.setStyle(controls, 'borderRadius', '0px 0px 5px 5px');\n this._render.setStyle(controls, 'margin', '0 -2px -2px -2px');\n this._render.setStyle(controls, 'display', 'flex');\n this._render.setStyle(controls, 'align-items', 'center');\n this._render.setStyle(controls, 'justify-content', 'flex-end');\n\n this._render.appendChild(controls, this.createTutorialBlockInfoControl()); \n this._render.appendChild(controls, this.createTutorialBlockPrevControl());\n this._render.appendChild(controls, this.createTutorialBlockNextControl()); \n\n return controls;\n }\n private createTutorialBlockPrevControl(): any {\n let button = this._render.createElement('button');\n let icone = this._render.createElement('i');\n \n this._render.setAttribute(button, 'id', this.BLOCK_CONTROL_PREV_ID);\n this._render.addClass(button, 'btn');\n this._render.addClass(button, 'btn-sm');\n this._render.addClass(button, 'btn-primary');\n this._render.addClass(button, 'mr-1');\n this._render.addClass(icone, 'fa');\n this._render.addClass(icone, 'fa-arrow-left');\n this._render.appendChild(button, icone);\n\n if (this._currentTaskIndex == 0) {\n this._render.setAttribute(button, 'disabled', 'disabled');\n } else {\n this._render.listen(button, 'click', () => {\n this.movePrev();\n });\n }\n\n return button;\n }\n private createTutorialBlockNextControl(): any {\n let button = this._render.createElement('button');\n let icone = this._render.createElement('i');\n \n this._render.setAttribute(button, 'id', this.BLOCK_CONTROL_NEXT_ID);\n this._render.addClass(button, 'btn');\n this._render.addClass(button, 'btn-sm');\n this._render.addClass(button, 'mr-1');\n this._render.addClass(icone, 'fa'); \n this._render.appendChild(button, icone);\n\n if (this._currentTaskIndex >= this._runningTasks.length - 1) {\n this._render.addClass(icone, 'fa-times');\n this._render.addClass(button, 'btn-outline-primary');\n } else {\n this._render.addClass(icone, 'fa-arrow-right');\n this._render.addClass(button, 'btn-primary');\n }\n\n this._render.listen(button, 'click', () => {\n this.moveNext();\n });\n\n return button;\n }\n private createTutorialBlockExitControl(): any {\n let icone = this._render.createElement('i');\n \n this._render.setAttribute(icone, 'id', this.BLOCK_CONTROL_EXIT_ID);\n this._render.addClass(icone, 'ml-auto');\n this._render.addClass(icone, 'fa');\n this._render.addClass(icone, 'fa-times');\n this._render.setStyle(icone, 'cursor', 'pointer');\n\n this._render.listen(icone, 'click', () => {\n this.exit();\n });\n\n return icone;\n }\n private createTutorialBlockInfoControl(): any {\n let span = this._render.createElement('small');\n \n this._render.setAttribute(span, 'id', this.BLOCK_CONTROL_INFO_ID);\n this._render.addClass(span, 'mr-auto');\n this._render.setStyle(span, 'fontSize', '12px');\n this._render.setStyle(span, 'fontWeight', 'normal');\n this._render.appendChild(span, this._render.createText(`${this._currentTaskIndex + 1}/${this._runningTasks.length}`));\n\n return span;\n }\n\n //element destroy\n private destroyCurrentTask(): void {\n this.destroyElementById(this.BLOCKER_ID);\n this.destroyElementById(this.BLOCK_ID);\n\n let currentElement = this._runningTasks[this._currentTaskIndex].element;\n\n if (this.isCurrentElementText() && this.colorPlaceholder) {\n this._render.setStyle(currentElement.nativeElement, 'color', this.colorPlaceholder);\n this.colorPlaceholder = null;\n } \n\n this._render.removeStyle(currentElement.nativeElement, 'position');\n this._render.removeStyle(currentElement.nativeElement, 'zIndex');\n }\n private destroyOverlay(): void {\n this.destroyElementById(this.OVERLAY_ID);\n\n this._render.removeStyle(document.body, 'overflow');\n }\n private destroyElementById(id: string): void {\n let el = document.getElementById(id);\n \n this._render.removeChild(el.parentNode, el);\n }\n\n //aux\n private handleTutorialBlockPosition(block: any, el: ElementRef): void {\n setTimeout(() => {\n this.setTutorialBlockPosition(block, el);\n }, 0);\n\n this._render.listen(window, 'resize', () => {\n this.setTutorialBlockPosition(block, el);\n });\n }\n private setTutorialBlockPosition(block: any, el: ElementRef): void {\n let arrow = document.getElementById(this.BLOCK_ARROW_ID);\n let elementRect = el.nativeElement.getBoundingClientRect();\n let top: number = elementRect.top;\n let left: number = elementRect.left + elementRect.width + 20;\n let blockHeight = $(block).height();\n let blockWidth = $(block).width();\n let isCurrentBlockOnBottomOfScreen = this.isCurrentBlockOnBottomOfScreen();\n let isCurrentBlockOnRightOfScreen = this.isCurrentBlockOnRightOfScreen();\n let arrowBorder: string = isCurrentBlockOnRightOfScreen ? 'border-left' : 'border-right';\n let arrowPositionX: string = isCurrentBlockOnRightOfScreen ? 'right' : 'left';\n let arrowPositionY: string = isCurrentBlockOnBottomOfScreen ? 'bottom' : 'top';\n let arrowColor: string = isCurrentBlockOnBottomOfScreen ? '#FFF' : '#EEE';\n\n if (isCurrentBlockOnBottomOfScreen) {\n top -= blockHeight - 32; \n }\n if (isCurrentBlockOnRightOfScreen) {\n left -= blockWidth + elementRect.width + 45; \n }\n\n if ((left + blockWidth) >= document.body.clientWidth) {\n left -= blockWidth + 45; \n }\n\n if (arrow) {\n this._render.setStyle(arrow, arrowBorder, `15px solid ${arrowColor}`);\n this._render.setStyle(arrow, arrowPositionX, `-17px`);\n this._render.setStyle(arrow, arrowPositionY, `8px`);\n }\n \n this._render.setStyle(block, 'top', this.getNumberInPx(top));\n this._render.setStyle(block, 'left', this.getNumberInPx(left));\n }\n private getNumberInPx(value: number): string {\n return value + 'px';\n }\n private scrollToCurrentElementBlock() { \n setTimeout(() => {\n let block = document.getElementById(this.BLOCK_ID);\n let el = this._runningTasks[this._currentTaskIndex].element;\n let offsetTopFromBody: number = $(el.nativeElement).offset().top;\n let elementY: number = offsetTopFromBody - 150;\n\n $('html').animate({\n scrollTop: elementY,\n duration: 0\n }, () => {\n this.setTutorialBlockPosition(block, el);\n this.fadeInTutorialBlockElement(block);\n });\n });\n }\n private hideTutorialBlockElement(block: any): void {\n this._render.setStyle(block, 'opacity', '0');\n }\n private fadeInTutorialBlockElement(block: any): void {\n this._render.setStyle(block, 'opacity', '1');\n }\n private isCurrentBlockOnBottomOfScreen(): boolean {\n if (this._currentTaskIndex < 0) return false;\n\n let el = this._runningTasks[this._currentTaskIndex].element;\n let elementRect = el.nativeElement.getBoundingClientRect();\n let top: number = elementRect.top;\n let offsetTopFromBody: number = $(el.nativeElement).offset().top;\n\n return top > document.body.scrollHeight - offsetTopFromBody;\n }\n private isCurrentBlockOnRightOfScreen(): boolean {\n if (this._currentTaskIndex < 0) return false;\n \n let el = this._runningTasks[this._currentTaskIndex].element;\n let offsetLeftFromBody: number = $(el.nativeElement).offset().left;\n\n return offsetLeftFromBody >= document.body.clientWidth / 2;\n }\n private isCurrentElementText(): boolean {\n if (this._currentTaskIndex < 0) return false;\n \n const allowedTags = ['h1', 'h2', 'h3', 'h4', 'h5', 'span', 'small', 'p'];\n let el = this._runningTasks[this._currentTaskIndex].element;\n \n return allowedTags.filter(x => x.toUpperCase() == el.nativeElement.tagName).length == 1;\n }\n private notifyStepHasChanged(): void {\n this.onStepChanged.emit(this._runningTasks[this._currentTaskIndex]);\n }\n private startListeningKeyboardArrows(): void {\n this.unlistenKeyboardArrows = this._render.listen(document.body, 'keyup', (event: KeyboardEvent) => {\n switch (event.keyCode) {\n case 27:\n this.exit();\n break;\n case 37:\n this.movePrev();\n break;\n case 13:\n case 39:\n this.moveNext();\n break;\n }\n\n event.stopImmediatePropagation();\n });\n }\n private stopListeningKeyboardArrows(): void {\n this.unlistenKeyboardArrows();\n }\n\n //localstorage\n private getLocalStorage(key: string): any {\n const result = localStorage.getItem(`Ui-Hero-Turorial-${key}`);\n\n if (typeof result === 'string') {\n return result;\n } else {\n return JSON.parse(result);\n }\n }\n private setLocalStorage(key: string, value: any): void {\n if (typeof value === 'string') {\n localStorage.setItem(`Ui-Hero-Turorial-${key}`, value);\n } else {\n localStorage.setItem(`Ui-Hero-Turorial-${key}`, JSON.stringify(value));\n }\n }\n}\n","import { Directive, ElementRef, Input, OnInit } from '@angular/core';\n\nimport { TutorialAction } from '../classes/tutorial-action';\nimport { TutorialService } from '../services/tutorial.service';\n\n@Directive({ selector: '[tutorial]' })\nexport class TutorialDirective implements OnInit {\n @Input() tutorial: TutorialAction;\n\n constructor(\n private tutorialService: TutorialService,\n private el: ElementRef,\n ) { }\n \n ngOnInit(): void {\n this.tutorialService.addAction(this.tutorial, this.el);\n }\n}","import { Pipe, PipeTransform } from '@angular/core';\n\n@Pipe({\n name: 'searchBy'\n})\nexport class SearchByPipe implements PipeTransform {\n transform(items: any[], property: string, searchText: string): any[] {\n if(!items) return [];\n if(!searchText) return items;\n searchText = searchText.toLowerCase();\n\n return items.filter( it => {\n return it[property].toLowerCase().includes(searchText);\n });\n }\n}\n","import Swal, { SweetAlertIcon } from \"sweetalert2\";\n\nimport { Injectable } from \"@angular/core\";\n\n@Injectable()\nexport class AlertService {\n constructor() {}\n\n private show(\n title: string,\n text: string,\n type: SweetAlertIcon,\n confirmButtonText?: string,\n callback?: Function\n ): any {\n Swal.fire({\n title: title,\n html: text,\n icon: type,\n confirmButtonText: confirmButtonText || \"Ok\",\n }).then((result) => {\n if (result.value && callback) {\n callback();\n }\n });\n }\n\n info(\n title: string,\n text: string,\n confirmButtonText?: string,\n callback?: Function\n ): any {\n this.show(title, text, \"info\", confirmButtonText, callback);\n }\n success(\n title: string,\n text: string,\n confirmButtonText?: string,\n callback?: Function\n ): any {\n this.show(title, text, \"success\", confirmButtonText, callback);\n }\n error(\n title: string,\n text: string,\n confirmButtonText?: string,\n callback?: Function\n ): any {\n this.show(title, text, \"error\", confirmButtonText, callback);\n }\n warning(\n title: string,\n text: string,\n confirmButtonText?: string,\n callback?: Function\n ): any {\n this.show(title, text, \"warning\", confirmButtonText, callback);\n }\n question(\n title: string,\n text: string,\n successCallback: Function,\n confirmButtonText?: string,\n cancelButtonText?: string,\n cancelCallback?: Function\n ): any {\n Swal.fire({\n title: title,\n text: text,\n icon: \"question\",\n confirmButtonText: confirmButtonText || \"Ok\",\n cancelButtonText: cancelButtonText || \"Cancel\",\n showCancelButton: true,\n }).then((result) => {\n if (result.value && successCallback) {\n successCallback();\n } else if (!result.value && cancelCallback) {\n cancelCallback();\n }\n });\n }\n}\n","export class TutorialAction {\n key: string;\n title: string;\n text: string;\n order: number;\n}\n","import { BsDatepickerModule } from 'ngx-bootstrap/datepicker';\nimport { BsDropdownModule } from 'ngx-bootstrap/dropdown';\nimport { ModalModule } from 'ngx-bootstrap/modal';\nimport { PaginationModule } from 'ngx-bootstrap/pagination';\nimport { PopoverModule } from 'ngx-bootstrap/popover';\nimport { ProgressbarModule } from 'ngx-bootstrap/progressbar';\nimport { TabsModule } from 'ngx-bootstrap/tabs';\nimport { TooltipModule } from 'ngx-bootstrap/tooltip';\n\nimport { CommonModule } from '@angular/common';\nimport { NgModule } from '@angular/core';\n\nimport { ModalComponent } from './components/modal/modal.component';\nimport { ReportComponent } from './components/report/report.component';\nimport { SpinnerComponent } from './components/spinner/spinner.component';\nimport { AutoFocusDirective } from './directives/auto-focus.directive';\nimport { AutoSelectOnFocusDirective } from './directives/auto-select-on-focus.directive';\nimport { ClickOutsideDirective } from './directives/click-outside.directive';\nimport { DebounceDirective } from './directives/debounce.directive';\nimport { TutorialDirective } from './directives/tutorial.directive';\nimport { SearchByPipe } from './pipes/search-by.pipe';\nimport { AlertService } from './services/alert.service';\nimport { TutorialService } from './services/tutorial.service';\n\nexport { SearchByPipe } from './pipes/search-by.pipe';\nexport { ClickOutsideDirective } from './directives/click-outside.directive';\nexport { AutoFocusDirective } from './directives/auto-focus.directive';\nexport { SpinnerComponent } from './components/spinner/spinner.component';\nexport { ModalComponent } from './components/modal/modal.component';\nexport { ReportComponent } from './components/report/report.component';\nexport { TutorialDirective } from './directives/tutorial.directive';\nexport { TutorialService } from './services/tutorial.service';\nexport { TutorialAction } from './classes/tutorial-action';\nexport { AutoSelectOnFocusDirective } from './directives/auto-select-on-focus.directive';\nexport { DebounceDirective } from './directives/debounce.directive';\n\nexport * from './services/alert.service';\n\n@NgModule({\n imports: [\n CommonModule,\n PaginationModule.forRoot(),\n BsDropdownModule.forRoot(),\n ModalModule.forRoot(),\n BsDatepickerModule.forRoot(),\n ProgressbarModule.forRoot(),\n TooltipModule.forRoot(),\n PopoverModule.forRoot(),\n TabsModule.forRoot(),\n ],\n declarations: [\n AutoSelectOnFocusDirective,\n DebounceDirective,\n ClickOutsideDirective,\n AutoFocusDirective,\n TutorialDirective,\n SearchByPipe,\n SpinnerComponent,\n ModalComponent,\n ReportComponent,\n ],\n exports: [\n