ionic-logging-viewer 18.0.0 → 21.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +15 -14
- package/fesm2022/ionic-logging-viewer.mjs +140 -260
- package/fesm2022/ionic-logging-viewer.mjs.map +1 -1
- package/package.json +12 -11
- package/types/ionic-logging-viewer.d.ts +244 -0
- package/esm2022/ionic-logging-viewer.mjs +0 -5
- package/esm2022/lib/logging-viewer/logging-viewer.component.mjs +0 -119
- package/esm2022/lib/logging-viewer-filter.service.mjs +0 -64
- package/esm2022/lib/logging-viewer-levels/logging-viewer-levels.component.mjs +0 -71
- package/esm2022/lib/logging-viewer-modal/logging-viewer-modal-properties.model.mjs +0 -2
- package/esm2022/lib/logging-viewer-modal/logging-viewer-modal.component.mjs +0 -141
- package/esm2022/lib/logging-viewer-search/logging-viewer-search.component.mjs +0 -73
- package/esm2022/lib/logging-viewer-translation.model.mjs +0 -2
- package/esm2022/lib/logging-viewer.module.mjs +0 -53
- package/esm2022/public_api.mjs +0 -11
- package/index.d.ts +0 -5
- package/lib/logging-viewer/logging-viewer.component.d.ts +0 -73
- package/lib/logging-viewer-filter.service.d.ts +0 -47
- package/lib/logging-viewer-levels/logging-viewer-levels.component.d.ts +0 -44
- package/lib/logging-viewer-modal/logging-viewer-modal-properties.model.d.ts +0 -25
- package/lib/logging-viewer-modal/logging-viewer-modal.component.d.ts +0 -75
- package/lib/logging-viewer-search/logging-viewer-search.component.d.ts +0 -44
- package/lib/logging-viewer-translation.model.d.ts +0 -27
- package/lib/logging-viewer.module.d.ts +0 -13
- package/public_api.d.ts +0 -7
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ionic-logging-viewer.mjs","sources":["../../../projects/ionic-logging-viewer/src/lib/logging-viewer-filter.service.ts","../../../projects/ionic-logging-viewer/src/lib/logging-viewer/logging-viewer.component.ts","../../../projects/ionic-logging-viewer/src/lib/logging-viewer/logging-viewer.component.html","../../../projects/ionic-logging-viewer/src/lib/logging-viewer-levels/logging-viewer-levels.component.ts","../../../projects/ionic-logging-viewer/src/lib/logging-viewer-levels/logging-viewer-levels.component.html","../../../projects/ionic-logging-viewer/src/lib/logging-viewer-search/logging-viewer-search.component.ts","../../../projects/ionic-logging-viewer/src/lib/logging-viewer-search/logging-viewer-search.component.html","../../../projects/ionic-logging-viewer/src/lib/logging-viewer-modal/logging-viewer-modal.component.ts","../../../projects/ionic-logging-viewer/src/lib/logging-viewer-modal/logging-viewer-modal.component.html","../../../projects/ionic-logging-viewer/src/lib/logging-viewer.module.ts","../../../projects/ionic-logging-viewer/src/public_api.ts","../../../projects/ionic-logging-viewer/src/ionic-logging-viewer.ts"],"sourcesContent":["import { EventEmitter, Injectable } from \"@angular/core\";\n\nimport { Logger, LoggingService } from \"ionic-logging-service\";\n\n/**\n * Service for storing filter settings for logging viewer.\n */\n@Injectable()\nexport class LoggingViewerFilterService {\n\n\t/**\n\t * Event triggered when the filter was changed.\n\t */\n\tpublic filterChanged: EventEmitter<void>;\n\n\tprivate logger: Logger;\n\tprivate levelValue: string;\n\tprivate searchValue: string;\n\n\t/**\n\t * Creates a new instance of the service.\n\t *\n\t * @param loggingService needed for internal logging.\n\t */\n\tconstructor(\n\t\tloggingService: LoggingService) {\n\n\t\tthis.logger = loggingService.getLogger(\"Ionic.Logging.Viewer.Filter.Service\");\n\t\tconst methodName = \"ctor\";\n\t\tthis.logger.entry(methodName);\n\n\t\tthis.levelValue = \"DEBUG\";\n\t\tthis.searchValue = \"\";\n\t\tthis.filterChanged = new EventEmitter<void>();\n\n\t\tthis.logger.exit(methodName);\n\t}\n\n\t/**\n\t * Gets the current log level.\n\t *\n\t * @return log level\n\t */\n\tpublic get level(): string {\n\t\treturn this.levelValue;\n\t}\n\n\t/**\n\t * Sets the new log level and emits a filterChanged event.\n\t *\n\t * @param value new slog level\n\t */\n\tpublic set level(value: string) {\n\t\tthis.levelValue = value;\n\t\tthis.filterChanged.emit();\n\t}\n\n\t/**\n\t * Gets the current search value.\n\t *\n\t * @return search value\n\t */\n\t// eslint-disable-next-line @typescript-eslint/member-ordering\n\tpublic get search(): string {\n\t\treturn this.searchValue;\n\t}\n\n\t/**\n\t * Sets the new search value and emits a filterChanged event.\n\t *\n\t * @param value new search value\n\t */\n\tpublic set search(value: string) {\n\t\tthis.searchValue = value;\n\t\tthis.filterChanged.emit();\n\t}\n}\n","import { Component, OnDestroy, OnInit, Input } from \"@angular/core\";\nimport { Subscription } from \"rxjs\";\n\nimport { Logger, LoggingService, LogLevelConverter, LogMessage } from \"ionic-logging-service\";\n\nimport { LoggingViewerFilterService } from \"../logging-viewer-filter.service\";\n\n/**\n * Component for displaying the current logs.\n *\n * The component can be embedded in any web page using:\n *\n * <ionic-logging-viewer></ionic-logging-viewer>\n */\n@Component({\n\tselector: \"ionic-logging-viewer\",\n\ttemplateUrl: \"./logging-viewer.component.html\",\n\tstyleUrls: [\"./logging-viewer.component.scss\"]\n})\nexport class LoggingViewerComponent implements OnInit, OnDestroy {\n\n\t/**\n\t * Comma-separated list of localStorageKeys. If set, the logs get loaded from localStorage instead of memory.\n\t */\n\t@Input()\n\tpublic localStorageKeys: string;\n\n\t/**\n\t * Log messages which fulfill the filter condition.\n\t */\n\tpublic logMessagesForDisplay: LogMessage[];\n\n\tprivate logger: Logger;\n\tprivate logMessages: LogMessage[];\n\tprivate logMessagesChangedSubscription: Subscription;\n\tprivate filterChangedSubscription: Subscription;\n\n\t/**\n\t * Creates a new instance of the component.\n\t */\n\tconstructor(\n\t\tprivate loggingService: LoggingService,\n\t\tprivate loggingViewerFilterService: LoggingViewerFilterService) {\n\n\t\tthis.logger = loggingService.getLogger(\"Ionic.Logging.Viewer.Component\");\n\t\tconst methodName = \"ctor\";\n\t\tthis.logger.entry(methodName);\n\n\t\tthis.logger.exit(methodName);\n\t}\n\n\t/**\n\t * Initialize the component.\n\t *\n\t * This is done by reading the filter data from [LoggingViewerFilterService](LoggingViewerFilterService.html)\n\t * and the log messages from [LoggingService](../../../ionic-logging-service/typedoc/index.html).\n\t * If the localStorageKeys property is set, the messages are read from local storage.\n\t */\n\tpublic ngOnInit(): void {\n\t\tconst methodName = \"ngOnInit\";\n\t\tthis.logger.entry(methodName);\n\n\t\tthis.loadLogMessages();\n\t\tthis.filterLogMessages();\n\n\t\t// subscribe to loggingService.logMessagesChanged event, to refresh, when new message is logged\n\t\tthis.logMessagesChangedSubscription = this.loggingService.logMessagesChanged.subscribe(async () => {\n\t\t\tthis.loadLogMessages();\n\t\t\tthis.filterLogMessages();\n\t\t});\n\n\t\t// subscribe to loggingViewerFilterService.filterChanged event, to refresh, when filter is modified\n\t\tthis.filterChangedSubscription = this.loggingViewerFilterService.filterChanged.subscribe(() => {\n\t\t\tthis.filterLogMessages();\n\t\t});\n\n\t\tthis.logger.exit(methodName);\n\t}\n\n\t/**\n\t * Clean up.\n\t */\n\tpublic ngOnDestroy(): void {\n\t\tconst methodName = \"ngOnDestroy\";\n\t\tthis.logger.entry(methodName);\n\n\t\tthis.logMessagesChangedSubscription.unsubscribe();\n\t\tthis.filterChangedSubscription.unsubscribe();\n\n\t\tthis.logger.exit(methodName);\n\t}\n\n\t/**\n\t * Filter the log messages.\n\t */\n\tpublic filterLogMessages(): void {\n\t\tthis.logMessagesForDisplay = this.logMessages.filter(\n\t\t\t(message) => this.filterLogMessagesByLevel(message) && this.filterLogMessagesBySearch(message));\n\t}\n\n\t/**\n\t * Check if the log message's level fulfills the level condition.\n\t *\n\t * @param message the log message to check\n\t * @returns true if check was successful\n\t */\n\tpublic filterLogMessagesByLevel(message: LogMessage): boolean {\n\t\tconst levelValue = this.loggingViewerFilterService.level;\n\t\treturn LogLevelConverter.levelFromString(message.level) >= LogLevelConverter.levelFromString(levelValue);\n\t}\n\n\t/**\n\t * Check if the log message fulfills the search condition.\n\t *\n\t * The search value gets searched in:\n\t * - logger name\n\t * - method name\n\t * - message\n\t *\n\t * @param message the log message to check\n\t * @returns true if check was successful\n\t */\n\tpublic filterLogMessagesBySearch(message: LogMessage): boolean {\n\t\tconst searchValue = new RegExp(this.loggingViewerFilterService.search, \"i\");\n\t\treturn message.logger.search(searchValue) >= 0 ||\n\t\t\tmessage.methodName.search(searchValue) >= 0 ||\n\t\t\tmessage.message.join(\"|\").search(searchValue) >= 0;\n\t}\n\n\t/**\n\t * Load the current log messages.\n\t * For unit test purposes mainly.\n\t */\n\tpublic loadLogMessages(): void {\n\t\tif (this.localStorageKeys) {\n\t\t\tthis.logMessages = [];\n\t\t\tfor (const localStorageKey of this.localStorageKeys.split(\",\")) {\n\t\t\t\tthis.logMessages = this.logMessages.concat(this.loggingService.getLogMessagesFromLocalStorage(localStorageKey));\n\t\t\t}\n\t\t\tthis.logMessages = this.logMessages.sort((a, b) => a.timeStamp.getTime() - b.timeStamp.getTime());\n\t\t} else {\n\t\t\tthis.logMessages = this.loggingService.getLogMessages();\n\t\t}\n\t}\n}\n","<ion-list>\n\t<ion-item *ngFor=\"let logMessage of logMessagesForDisplay\">\n\t\t<ion-label>\n\t\t\t<p>{{ logMessage.timeStamp | date:'dd.MM.yyyy HH:mm:ss' }} {{ logMessage.level }}</p>\n\t\t\t<p>{{ logMessage.logger }}</p>\n\t\t\t<p>\n\t\t\t\t{{ logMessage.methodName }}\n\t\t\t\t<span *ngFor=\"let messagePart of logMessage.message\"> {{ messagePart }} </span>\n\t\t\t</p>\n\t\t</ion-label>\n\t</ion-item>\n</ion-list>","import { Component, OnDestroy, OnInit } from \"@angular/core\";\nimport { Subscription } from \"rxjs\";\n\nimport { Logger, LoggingService } from \"ionic-logging-service\";\n\nimport { LoggingViewerFilterService } from \"../logging-viewer-filter.service\";\n\n/**\n * Component for displaying the log levels for filtering the current logs.\n *\n * The component can be embedded in any web page using:\n *\n * <ionic-logging-viewer-levels></ionic-logging-viewer-levels>\n */\n@Component({\n\tselector: \"ionic-logging-viewer-levels\",\n\ttemplateUrl: \"./logging-viewer-levels.component.html\",\n\tstyleUrls: [\"./logging-viewer-levels.component.scss\"]\n})\nexport class LoggingViewerLevelsComponent implements OnInit, OnDestroy {\n\n\t/**\n\t * Log levels used for filtering: DEBUG, INFO, WARN, ERROR\n\t */\n\tpublic logLevels: string[];\n\n\t/**\n\t * Selected level.\n\t */\n\tpublic selectedLevel: string;\n\n\tprivate logger: Logger;\n\tprivate filterChangedSubscription: Subscription;\n\n\t/**\n\t * Creates a new instance of the component.\n\t */\n\tconstructor(\n\t\tloggingService: LoggingService,\n\t\tprivate loggingViewerFilterService: LoggingViewerFilterService) {\n\n\t\tthis.logger = loggingService.getLogger(\"Ionic.Logging.Viewer.Levels.Component\");\n\t\tconst methodName = \"ctor\";\n\t\tthis.logger.entry(methodName);\n\n\t\tthis.logLevels = [];\n\t\tthis.logLevels.push(\n\t\t\t\"DEBUG\",\n\t\t\t\"INFO\",\n\t\t\t\"WARN\",\n\t\t\t\"ERROR\",\n\t\t);\n\n\t\tthis.logger.exit(methodName);\n\t}\n\n\t/**\n\t * Initialize the component.\n\t *\n\t * This is done by reading the filter data from [LoggingViewerFilterService](LoggingViewerFilterService.html).\n\t */\n\tpublic ngOnInit(): void {\n\t\tconst methodName = \"ngOnInit\";\n\t\tthis.logger.entry(methodName);\n\n\t\tthis.selectedLevel = this.loggingViewerFilterService.level;\n\n\t\t// subscribe to loggingViewerFilterService.filterChanged event, to refresh,\n\t\t// when someone else modifies the level\n\t\tthis.filterChangedSubscription = this.loggingViewerFilterService.filterChanged.subscribe(() => {\n\t\t\tthis.selectedLevel = this.loggingViewerFilterService.level;\n\t\t});\n\n\t\tthis.logger.exit(methodName);\n\t}\n\n\t/**\n\t * Clean up.\n\t */\n\tpublic ngOnDestroy(): void {\n\t\tconst methodName = \"ngOnDestroy\";\n\t\tthis.logger.entry(methodName);\n\n\t\tthis.filterChangedSubscription.unsubscribe();\n\n\t\tthis.logger.exit(methodName);\n\t}\n\n\t/**\n\t * Callback when the level was changed in the UI.\n\t */\n\tpublic onLevelChanged(): void {\n\t\tconst methodName = \"onLevelChanged\";\n\t\tthis.logger.entry(methodName, this.selectedLevel);\n\n\t\tthis.loggingViewerFilterService.level = this.selectedLevel;\n\n\t\tthis.logger.exit(methodName);\n\t}\n}\n","<ion-segment [(ngModel)]=\"selectedLevel\" (ionChange)=\"onLevelChanged()\">\n\t<ion-segment-button *ngFor=\"let logLevel of logLevels\" [value]=\"logLevel\">\n\t\t<ion-label>{{ logLevel }}</ion-label>\n\t</ion-segment-button>\n</ion-segment>","import { Component, OnInit, OnDestroy, Input } from \"@angular/core\";\n\nimport { Subscription } from \"rxjs\";\n\nimport { LoggingService, Logger } from \"ionic-logging-service\";\n\nimport { LoggingViewerFilterService } from \"../logging-viewer-filter.service\";\n\n/**\n * Component for displaying the search bar for filtering the current logs.\n *\n * The component can be embedded in any web page using:\n *\n * <ionic-logging-viewer-search placeholder=\"Search\"></ionic-logging-viewer-search>\n */\n@Component({\n\tselector: \"ionic-logging-viewer-search\",\n\ttemplateUrl: \"./logging-viewer-search.component.html\",\n\tstyleUrls: [\"./logging-viewer-search.component.scss\"]\n})\nexport class LoggingViewerSearchComponent implements OnInit, OnDestroy {\n\n\t/**\n\t * Placeholder to be shown in the empty search bar.\n\t */\n\t@Input()\n\tpublic placeholder: string;\n\n\t/**\n\t * Current search value.\n\t */\n\tpublic search: string;\n\n\tprivate logger: Logger;\n\tprivate filterChangedSubscription: Subscription;\n\n\t/**\n\t * Creates a new instance of the component.\n\t */\n\tconstructor(\n\t\tloggingService: LoggingService,\n\t\tprivate loggingViewerFilterService: LoggingViewerFilterService) {\n\n\t\tthis.logger = loggingService.getLogger(\"Ionic.Logging.Viewer.Search.Component\");\n\t\tconst methodName = \"ctor\";\n\t\tthis.logger.entry(methodName);\n\n\t\tthis.logger.exit(methodName);\n\t}\n\n\t/**\n\t * Initialize the component.\n\t *\n\t * This is done by reading the filter data from [LoggingViewerFilterService](LoggingViewerFilterService.html).\n\t */\n\tpublic ngOnInit(): void {\n\t\tconst methodName = \"ngOnInit\";\n\t\tthis.logger.entry(methodName);\n\n\t\tif (!this.placeholder) {\n\t\t\tthis.placeholder = \"Search\";\n\t\t}\n\t\tthis.search = this.loggingViewerFilterService.search;\n\n\t\t// subscribe to loggingViewerFilterService.filterChanged event, to refresh,\n\t\t// when someone else modifies the search value\n\t\tthis.filterChangedSubscription = this.loggingViewerFilterService.filterChanged.subscribe(() => {\n\t\t\tthis.search = this.loggingViewerFilterService.search;\n\t\t});\n\n\t\tthis.logger.exit(methodName);\n\t}\n\n\t/**\n\t * Clean up.\n\t */\n\tpublic ngOnDestroy(): void {\n\t\tconst methodName = \"ngOnDestroy\";\n\t\tthis.logger.entry(methodName);\n\n\t\tthis.filterChangedSubscription.unsubscribe();\n\n\t\tthis.logger.exit(methodName);\n\t}\n\n\t/**\n\t * Callback when the search value was changed in the UI.\n\t */\n\tpublic onSearchChanged(): void {\n\t\tconst methodName = \"onSearchChanged\";\n\t\tthis.logger.entry(methodName, this.search);\n\n\t\tthis.loggingViewerFilterService.search = this.search;\n\n\t\tthis.logger.exit(methodName);\n\t}\n}\n","<ion-searchbar placeholder=\"{{placeholder}}\" [(ngModel)]=\"search\" (ionChange)=\"onSearchChanged()\"></ion-searchbar>","import { Component, OnInit, Input } from \"@angular/core\";\n\nimport { ModalController, Platform, AlertController } from \"@ionic/angular\";\n\nimport { Logger, LoggingService } from \"ionic-logging-service\";\n\nimport { LoggingViewerTranslation } from \"../logging-viewer-translation.model\";\n\n/**\n * Ionic modal containing [LoggingViewerComponent](LoggingViewerComponent.html),\n * [LoggingViewerLevelsComponent](LoggingViewerLevelsComponent.html) and\n * [LoggingViewerSearchComponent](LoggingViewerSearchComponent.html).\n */\n@Component({\n\tselector: \"ionic-logging-viewer-modal\",\n\ttemplateUrl: \"./logging-viewer-modal.component.html\",\n\tstyleUrls: [\"./logging-viewer-modal.component.scss\"]\n})\nexport class LoggingViewerModalComponent implements OnInit {\n\n\tprivate static languageEn = \"en\";\n\tprivate static languageDe = \"de\";\n\n\t/**\n\t * Language to be used for the modal.\n\t * Currently supported: en, de\n\t */\n\t@Input()\n\tpublic language: string;\n\n\t/**\n\t * Translation to be used for the modal.\n\t * If specified, the language is ignored.\n\t */\n\t@Input()\n\tpublic translation: LoggingViewerTranslation;\n\n\t/**\n\t * Comma-separated list of localStorageKeys. If set, the logs get loaded from localStorage instead of memory.\n\t */\n\t@Input()\n\tpublic localStorageKeys: string;\n\n\t/**\n\t * Flag showing a delete button, which removes all existing log messages.\n\t */\n\t@Input()\n\tpublic allowClearLogs: boolean;\n\n\t/**\n\t * Flag controlling which close button will be shown.\n\t */\n\tpublic isAndroid: boolean;\n\n\tprivate logger: Logger;\n\n\tprivate translations: { [language: string]: LoggingViewerTranslation };\n\n\t/**\n\t * Creates a new instance of the component.\n\t */\n\tconstructor(\n\t\tplatform: Platform,\n\t\tprivate alertController: AlertController,\n\t\tprivate modalController: ModalController,\n\t\tprivate loggingService: LoggingService) {\n\n\t\tthis.logger = loggingService.getLogger(\"Ionic.Logging.Viewer.Modal.Component\");\n\t\tconst methodName = \"ctor\";\n\t\tthis.logger.entry(methodName);\n\n\t\tthis.isAndroid = platform.is(\"android\");\n\n\t\tthis.logger.exit(methodName);\n\t}\n\n\t/**\n\t * Initializes the LoggingViewerModalComponent.\n\t * It configures the supported translations.\n\t */\n\tpublic ngOnInit(): void {\n\t\t// prepare translations\n\t\tthis.translations = {};\n\t\tthis.translations[LoggingViewerModalComponent.languageEn] = {\n\t\t\tcancel: \"Cancel\",\n\t\t\tconfirmDelete: \"Delete all log messages?\",\n\t\t\tok: \"Ok\",\n\t\t\tsearchPlaceholder: \"Search\",\n\t\t\ttitle: \"Logging\",\n\t\t};\n\t\tthis.translations[LoggingViewerModalComponent.languageDe] = {\n\t\t\tcancel: \"Abbrechen\",\n\t\t\tconfirmDelete: \"Alle Logs löschen?\",\n\t\t\tok: \"Ok\",\n\t\t\tsearchPlaceholder: \"Suchen\",\n\t\t\ttitle: \"Logging\",\n\t\t};\n\t}\n\n\t/**\n\t * Eventhandler called by Ionic when the modal is opened.\n\t */\n\tpublic ionViewDidEnter(): void {\n\t\tconst methodName = \"ionViewDidEnter\";\n\t\tthis.logger.entry(methodName);\n\n\t\tthis.logger.exit(methodName);\n\t}\n\n\t/**\n\t * Eventhandler called when the cancel button is clicked.\n\t */\n\tpublic async onClose(): Promise<void> {\n\t\tconst methodName = \"onClose\";\n\t\tthis.logger.entry(methodName);\n\n\t\tawait this.modalController.dismiss();\n\n\t\tthis.logger.exit(methodName);\n\t}\n\n\t/**\n\t * Eventhandler called when the clear button is clicked.\n\t */\n\tpublic async onClearLogs(): Promise<void> {\n\t\tconst methodName = \"onClearLogs\";\n\t\tthis.logger.entry(methodName);\n\n\t\tconst alert = await this.alertController.create({\n\t\t\theader: this.getTranslation().confirmDelete,\n\t\t\tbuttons: [\n\t\t\t\t{\n\t\t\t\t\ttext: this.getTranslation().cancel,\n\t\t\t\t\trole: \"cancel\",\n\t\t\t\t\tcssClass: \"secondary\"\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\ttext: this.getTranslation().ok,\n\t\t\t\t\thandler: () => {\n\t\t\t\t\t\tthis.clearLogs();\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t]\n\t\t});\n\t\tawait alert.present();\n\n\t\tthis.logger.exit(methodName);\n\t}\n\n\t/**\n\t * Clear logs.\n\t */\n\tpublic clearLogs(): void {\n\t\tif (this.localStorageKeys) {\n\t\t\tfor (const localStorageKey of this.localStorageKeys.split(\",\")) {\n\t\t\t\tthis.loggingService.removeLogMessagesFromLocalStorage(localStorageKey);\n\t\t\t}\n\t\t} else {\n\t\t\tthis.loggingService.removeLogMessages();\n\t\t}\n\t}\n\n\t/**\n\t * Helper method returning the current translation:\n\t * - the property translation if defined\n\t * - the translation according property language if valid\n\t * - English translation, otherwise\n\t */\n\tpublic getTranslation(): LoggingViewerTranslation {\n\t\tif (typeof this.translation !== \"undefined\") {\n\t\t\treturn this.translation;\n\t\t} else if (typeof this.language !== \"undefined\" && typeof this.translations[this.language] === \"object\") {\n\t\t\treturn this.translations[this.language];\n\t\t} else {\n\t\t\treturn this.translations[LoggingViewerModalComponent.languageEn];\n\t\t}\n\t}\n}\n","<ion-header>\n\t<ion-toolbar color=primary>\n\t\t<ion-title>{{ getTranslation().title }}</ion-title>\n\t\t<ion-buttons slot=\"start\">\n\t\t\t<ion-button *ngIf=\"!isAndroid\" (click)=\"onClose()\">\n\t\t\t\t{{ getTranslation().cancel }}\n\t\t\t</ion-button>\n\t\t\t<ion-button *ngIf=\"isAndroid\" icon-only (click)=\"onClose()\">\n\t\t\t\t<ion-icon name=\"md-close\"></ion-icon>\n\t\t\t</ion-button>\n\t\t</ion-buttons>\n\t</ion-toolbar>\n\t<ion-toolbar>\n\t\t<ionic-logging-viewer-search [placeholder]=\"getTranslation().searchPlaceholder\"></ionic-logging-viewer-search>\n\t\t<ion-buttons slot=\"end\" *ngIf=\"allowClearLogs !== false\" class=\"clearLogs\">\n\t\t\t<ion-button (click)=\"onClearLogs()\">\n\t\t\t\t<ion-icon name=\"trash-outline\"></ion-icon>\n\t\t\t</ion-button>\n\t\t</ion-buttons>\n\t</ion-toolbar>\n\t<ion-toolbar>\n\t\t<ionic-logging-viewer-levels></ionic-logging-viewer-levels>\n\t</ion-toolbar>\n</ion-header>\n<ion-content>\n\t<ionic-logging-viewer [localStorageKeys]=\"localStorageKeys\"></ionic-logging-viewer>\n</ion-content>","import { NgModule } from \"@angular/core\";\nimport { CommonModule } from \"@angular/common\";\nimport { FormsModule } from \"@angular/forms\";\n\nimport { IonicModule } from \"@ionic/angular\";\n\nimport { LoggingViewerComponent } from \"./logging-viewer/logging-viewer.component\";\nimport { LoggingViewerFilterService } from \"./logging-viewer-filter.service\";\nimport { LoggingViewerLevelsComponent } from \"./logging-viewer-levels/logging-viewer-levels.component\";\nimport { LoggingViewerSearchComponent } from \"./logging-viewer-search/logging-viewer-search.component\";\nimport { LoggingViewerModalComponent } from \"./logging-viewer-modal/logging-viewer-modal.component\";\n\n@NgModule({\n imports: [\n CommonModule,\n FormsModule,\n IonicModule\n ],\n declarations: [\n LoggingViewerComponent,\n LoggingViewerSearchComponent,\n LoggingViewerLevelsComponent,\n LoggingViewerModalComponent\n ],\n exports: [\n LoggingViewerComponent,\n LoggingViewerSearchComponent,\n LoggingViewerLevelsComponent,\n LoggingViewerModalComponent\n ],\n providers: [\n LoggingViewerFilterService\n ]\n})\nexport class LoggingViewerModule { }\n","/*\n * Public API Surface of ionic-logging-viewer\n */\n\nexport * from \"./lib/logging-viewer.module\";\nexport * from \"./lib/logging-viewer/logging-viewer.component\";\nexport * from \"./lib/logging-viewer-levels/logging-viewer-levels.component\";\nexport * from \"./lib/logging-viewer-search/logging-viewer-search.component\";\nexport * from \"./lib/logging-viewer-modal/logging-viewer-modal.component\";\nexport * from \"./lib/logging-viewer-modal/logging-viewer-modal-properties.model\";\nexport * from \"./lib/logging-viewer-translation.model\";\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":["i2.LoggingViewerFilterService","i4","i5","i3","i1","i2","i4.LoggingViewerComponent","i5.LoggingViewerSearchComponent","i6.LoggingViewerLevelsComponent"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ionic-logging-viewer.mjs","sources":["../../../projects/ionic-logging-viewer/src/lib/logging-viewer-filter.service.ts","../../../projects/ionic-logging-viewer/src/lib/logging-viewer/logging-viewer.component.ts","../../../projects/ionic-logging-viewer/src/lib/logging-viewer/logging-viewer.component.html","../../../projects/ionic-logging-viewer/src/lib/logging-viewer-levels/logging-viewer-levels.component.ts","../../../projects/ionic-logging-viewer/src/lib/logging-viewer-levels/logging-viewer-levels.component.html","../../../projects/ionic-logging-viewer/src/lib/logging-viewer-search/logging-viewer-search.component.ts","../../../projects/ionic-logging-viewer/src/lib/logging-viewer-search/logging-viewer-search.component.html","../../../projects/ionic-logging-viewer/src/lib/logging-viewer-modal/logging-viewer-modal.component.ts","../../../projects/ionic-logging-viewer/src/lib/logging-viewer-modal/logging-viewer-modal.component.html","../../../projects/ionic-logging-viewer/src/public_api.ts","../../../projects/ionic-logging-viewer/src/ionic-logging-viewer.ts"],"sourcesContent":["import { Injectable, inject, signal } from \"@angular/core\";\n\nimport { Logger, LoggingService } from \"ionic-logging-service\";\n\n/**\n * Service for storing filter settings for logging viewer.\n */\n@Injectable({\n\tprovidedIn: 'root'\n})\nexport class LoggingViewerFilterService {\n\n\tprivate loggingService = inject(LoggingService);\n\n\tprivate logger: Logger;\n\n\t/**\n\t * Signal for the current log level.\n\t */\n\tpublic level = signal(\"DEBUG\");\n\n\t/**\n\t * Signal for the current search value.\n\t */\n\tpublic search = signal(\"\");\n\n\t/**\n\t * Creates a new instance of the service.\n\t *\n\t * @param loggingService needed for internal logging.\n\t */\n\tconstructor() {\n\t\tthis.logger = this.loggingService.getLogger(\"Ionic.Logging.Viewer.Filter.Service\");\n\t\tconst methodName = \"ctor\";\n\t\tthis.logger.entry(methodName);\n\n\t\tthis.logger.exit(methodName);\n\t}\n}\n","import { Component, inject, input, effect, computed } from \"@angular/core\";\n\nimport { Logger, LoggingService, LogLevelConverter, LogMessage } from \"ionic-logging-service\";\n\nimport { LoggingViewerFilterService } from \"../logging-viewer-filter.service\";\nimport { IonicModule } from \"@ionic/angular\";\nimport { DatePipe } from \"@angular/common\";\n\n/**\n * Component for displaying the current logs.\n *\n * The component can be embedded in any web page using:\n *\n * <ionic-logging-viewer></ionic-logging-viewer>\n */\n@Component({\n\tselector: \"ionic-logging-viewer\",\n\ttemplateUrl: \"./logging-viewer.component.html\",\n\tstyleUrls: [\"./logging-viewer.component.scss\"],\n\timports: [IonicModule, DatePipe]\n})\nexport class LoggingViewerComponent {\n\n\tprivate loggingService = inject(LoggingService);\n\tprivate loggingViewerFilterService = inject(LoggingViewerFilterService);\n\n\t/**\n\t * Comma-separated list of localStorageKeys. If set, the logs get loaded from localStorage instead of memory.\n\t */\n\tpublic readonly localStorageKeys = input<string>(undefined);\n\n\t/**\n\t * Log messages which fulfill the filter condition.\n\t */\n\tpublic logMessagesForDisplay: LogMessage[];\n\n\tprivate logger: Logger;\n\tprivate logMessages = computed(() => {\n\t\tif (this.localStorageKeys()) {\n\t\t\tlet messages: LogMessage[] = [];\n\t\t\tfor (const localStorageKey of this.localStorageKeys().split(\",\")) {\n\t\t\t\tmessages = messages.concat(this.loggingService.getLogMessagesFromLocalStorage(localStorageKey));\n\t\t\t}\n\t\t\treturn messages.sort((a, b) => a.timeStamp.getTime() - b.timeStamp.getTime());\n\t\t} else {\n\t\t\treturn this.loggingService.getLogMessages()();\n\t\t}\n\t});\n\n\t/**\n\t * Creates a new instance of the component.\n\t */\n\tconstructor() {\n\t\tthis.logger = this.loggingService.getLogger(\"Ionic.Logging.Viewer.Component\");\n\t\tconst methodName = \"ctor\";\n\t\tthis.logger.entry(methodName);\n\n\t\t// refresh the messages, when messages or filter are modified\n\t\teffect(() => {\n\t\t\tconst logMessages = this.logMessages();\n\t\t\tconst level = this.loggingViewerFilterService.level();\n\t\t\tconst search = this.loggingViewerFilterService.search();\n\t\t\tthis.filterLogMessages(logMessages, level, search);\n\t\t});\n\n\t\tthis.logger.exit(methodName);\n\t}\n\n\t/**\n\t * Filter the log messages.\n\t */\n\tpublic filterLogMessages(logMessages: LogMessage[], level: string, search: string): void {\n\t\tthis.logMessagesForDisplay = logMessages.filter(\n\t\t\t(message) => this.filterLogMessagesByLevel(message, level) && this.filterLogMessagesBySearch(message, search));\n\t}\n\n\t/**\n\t * Check if the log message's level fulfills the level condition.\n\t *\n\t * @param message the log message to check\n\t * @returns true if check was successful\n\t */\n\tpublic filterLogMessagesByLevel(message: LogMessage, level: string): boolean {\n\t\treturn LogLevelConverter.levelFromString(message.level) >= LogLevelConverter.levelFromString(level);\n\t}\n\n\t/**\n\t * Check if the log message fulfills the search condition.\n\t *\n\t * The search value gets searched in:\n\t * - logger name\n\t * - method name\n\t * - message\n\t *\n\t * @param message the log message to check\n\t * @returns true if check was successful\n\t */\n\tpublic filterLogMessagesBySearch(message: LogMessage, search: string): boolean {\n\t\tconst searchRegex = new RegExp(search, \"i\");\n\t\treturn message.logger.search(searchRegex) >= 0 ||\n\t\t\tmessage.methodName.search(searchRegex) >= 0 ||\n\t\t\tmessage.message.join(\"|\").search(searchRegex) >= 0;\n\t}\n}\n","<ion-list>\n @for (logMessage of logMessagesForDisplay; track logMessage) {\n <ion-item>\n <ion-label>\n <p>{{ logMessage.timeStamp | date:'dd.MM.yyyy HH:mm:ss' }} {{ logMessage.level }}</p>\n <p>{{ logMessage.logger }}</p>\n <p>\n {{ logMessage.methodName }}\n @for (messagePart of logMessage.message; track messagePart) {\n <span> {{ messagePart }} </span>\n }\n </p>\n </ion-label>\n </ion-item>\n }\n</ion-list>","import { Component, effect, inject } from \"@angular/core\";\n\nimport { Logger, LoggingService } from \"ionic-logging-service\";\n\nimport { LoggingViewerFilterService } from \"../logging-viewer-filter.service\";\nimport { IonicModule } from \"@ionic/angular\";\nimport { FormsModule } from \"@angular/forms\";\n\n\n/**\n * Component for displaying the log levels for filtering the current logs.\n *\n * The component can be embedded in any web page using:\n *\n * <ionic-logging-viewer-levels></ionic-logging-viewer-levels>\n */\n@Component({\n\tselector: \"ionic-logging-viewer-levels\",\n\ttemplateUrl: \"./logging-viewer-levels.component.html\",\n\tstyleUrls: [\"./logging-viewer-levels.component.scss\"],\n\timports: [IonicModule, FormsModule]\n})\nexport class LoggingViewerLevelsComponent {\n\n\tprivate loggingService = inject(LoggingService);\n\tprivate loggingViewerFilterService = inject(LoggingViewerFilterService);\n\n\t/**\n\t * Log levels used for filtering: DEBUG, INFO, WARN, ERROR\n\t */\n\tpublic logLevels: string[];\n\n\t/**\n\t * Selected level.\n\t */\n\tpublic selectedLevel: string;\n\n\tprivate logger: Logger;\n\n\t/**\n\t * Creates a new instance of the component.\n\t */\n\tconstructor() {\n\t\tthis.logger = this.loggingService.getLogger(\"Ionic.Logging.Viewer.Levels.Component\");\n\t\tconst methodName = \"ctor\";\n\t\tthis.logger.entry(methodName);\n\n\t\tthis.logLevels = [];\n\t\tthis.logLevels.push(\n\t\t\t\"DEBUG\",\n\t\t\t\"INFO\",\n\t\t\t\"WARN\",\n\t\t\t\"ERROR\",\n\t\t);\n\n\t\t// handle signals of loggingViewerFilterService, to refresh,\n\t\t// when someone else modifies the level\n\t\teffect(() => {\n\t\t\tconst level = this.loggingViewerFilterService.level();\n\t\t\tthis.selectedLevel = level;\n\t\t});\n\n\t\tthis.logger.exit(methodName);\n\t}\n\n\t/**\n\t * Callback when the level was changed in the UI.\n\t */\n\tpublic onLevelChanged(): void {\n\t\tconst methodName = \"onLevelChanged\";\n\t\tthis.logger.entry(methodName, this.selectedLevel);\n\n\t\tthis.loggingViewerFilterService.level.set(this.selectedLevel);\n\n\t\tthis.logger.exit(methodName);\n\t}\n}\n","<ion-segment [(ngModel)]=\"selectedLevel\" (ionChange)=\"onLevelChanged()\">\n @for (logLevel of logLevels; track logLevel) {\n <ion-segment-button [value]=\"logLevel\">\n <ion-label>{{ logLevel }}</ion-label>\n </ion-segment-button>\n }\n</ion-segment>","import { Component, inject, input, effect } from \"@angular/core\";\n\nimport { LoggingService, Logger } from \"ionic-logging-service\";\n\nimport { LoggingViewerFilterService } from \"../logging-viewer-filter.service\";\nimport { IonicModule } from \"@ionic/angular\";\nimport { FormsModule } from \"@angular/forms\";\n\n/**\n * Component for displaying the search bar for filtering the current logs.\n *\n * The component can be embedded in any web page using:\n *\n * <ionic-logging-viewer-search placeholder=\"Search\"></ionic-logging-viewer-search>\n */\n@Component({\n\tselector: \"ionic-logging-viewer-search\",\n\ttemplateUrl: \"./logging-viewer-search.component.html\",\n\tstyleUrls: [\"./logging-viewer-search.component.scss\"],\n\timports: [IonicModule, FormsModule]\n})\nexport class LoggingViewerSearchComponent {\n\n\tprivate loggingService = inject(LoggingService);\n\tprivate loggingViewerFilterService = inject(LoggingViewerFilterService);\n\n\t/**\n\t * Placeholder to be shown in the empty search bar.\n\t */\n\tpublic readonly placeholder = input<string>(undefined);\n\n\t/**\n\t * Current search value.\n\t */\n\tpublic search: string;\n\n\tprivate logger: Logger;\n\n\t/**\n\t * Creates a new instance of the component.\n\t */\n\tconstructor() {\n\t\tthis.logger = this.loggingService.getLogger(\"Ionic.Logging.Viewer.Search.Component\");\n\t\tconst methodName = \"ctor\";\n\t\tthis.logger.entry(methodName);\n\n\t\t// handle signals of loggingViewerFilterService, to refresh,\n\t\t// when someone else modifies the search value\n\t\teffect(() => {\n\t\t\tconst search = this.loggingViewerFilterService.search();\n\t\t\tthis.search = search;\n\t\t});\n\n\t\tthis.logger.exit(methodName);\n\t}\n\n\t/**\n\t * Callback when the search value was changed in the UI.\n\t */\n\tpublic onSearchChanged(): void {\n\t\tconst methodName = \"onSearchChanged\";\n\t\tthis.logger.entry(methodName, this.search);\n\n\t\tthis.loggingViewerFilterService.search.set(this.search);\n\n\t\tthis.logger.exit(methodName);\n\t}\n}\n","<ion-searchbar placeholder=\"{{placeholder() || 'Search'}}\" [(ngModel)]=\"search\" [debounce]=\"1000\"\n (ionInput)=\"onSearchChanged()\"></ion-searchbar>","import { Component, OnInit, inject, input } from \"@angular/core\";\n\nimport { ModalController, Platform, AlertController, IonicModule } from \"@ionic/angular\";\n\nimport { Logger, LoggingService } from \"ionic-logging-service\";\n\nimport { LoggingViewerTranslation } from \"../logging-viewer-translation.model\";\n\nimport { addIcons } from \"ionicons\";\nimport { closeCircle, trashOutline } from \"ionicons/icons\";\n\nimport { LoggingViewerSearchComponent } from \"../logging-viewer-search/logging-viewer-search.component\";\nimport { LoggingViewerLevelsComponent } from \"../logging-viewer-levels/logging-viewer-levels.component\";\nimport { LoggingViewerComponent } from \"../logging-viewer/logging-viewer.component\";\n\n/**\n * Ionic modal containing [LoggingViewerComponent](LoggingViewerComponent.html),\n * [LoggingViewerLevelsComponent](LoggingViewerLevelsComponent.html) and\n * [LoggingViewerSearchComponent](LoggingViewerSearchComponent.html).\n */\n@Component({\n\tselector: \"ionic-logging-viewer-modal\",\n\ttemplateUrl: \"./logging-viewer-modal.component.html\",\n\tstyleUrls: [\"./logging-viewer-modal.component.scss\"],\n\timports: [IonicModule, LoggingViewerSearchComponent, LoggingViewerLevelsComponent, LoggingViewerComponent]\n})\nexport class LoggingViewerModalComponent implements OnInit {\n\n\tprivate platform = inject(Platform);\n\tprivate alertController = inject(AlertController);\n\tprivate modalController = inject(ModalController);\n\tprivate loggingService = inject(LoggingService);\n\n\tprivate static languageEn = \"en\";\n\tprivate static languageDe = \"de\";\n\n\t/**\n\t * Language to be used for the modal.\n\t * Currently supported: en, de\n\t */\n\tpublic readonly language = input<string>(undefined);\n\n\t/**\n\t * Translation to be used for the modal.\n\t * If specified, the language is ignored.\n\t */\n\tpublic readonly translation = input<LoggingViewerTranslation>(undefined);\n\n\t/**\n\t * Comma-separated list of localStorageKeys. If set, the logs get loaded from localStorage instead of memory.\n\t */\n\tpublic readonly localStorageKeys = input<string>(undefined);\n\n\t/**\n\t * Flag showing a delete button, which removes all existing log messages.\n\t */\n\tpublic readonly allowClearLogs = input<boolean>(true);\n\n\t/**\n\t * Flag controlling which close button will be shown.\n\t */\n\tpublic isAndroid: boolean;\n\n\tprivate logger: Logger;\n\n\tprivate translations: Record<string, LoggingViewerTranslation>;\n\n\t/**\n\t * Creates a new instance of the component.\n\t */\n\tconstructor() {\n\t\tthis.logger = this.\n\t\t\tloggingService.getLogger(\"Ionic.Logging.Viewer.Modal.Component\");\n\t\tconst methodName = \"ctor\";\n\t\tthis.logger.entry(methodName);\n\n\t\tthis.isAndroid = this.platform.is(\"android\");\n\t\taddIcons({ closeCircle, trashOutline });\n\n\t\tthis.logger.exit(methodName);\n\t}\n\n\t/**\n\t * Initializes the LoggingViewerModalComponent.\n\t * It configures the supported translations.\n\t */\n\tpublic ngOnInit(): void {\n\t\t// prepare translations\n\t\tthis.translations = {};\n\t\tthis.translations[LoggingViewerModalComponent.languageEn] = {\n\t\t\tcancel: \"Cancel\",\n\t\t\tconfirmDelete: \"Delete all log messages?\",\n\t\t\tok: \"Ok\",\n\t\t\tsearchPlaceholder: \"Search\",\n\t\t\ttitle: \"Logging\",\n\t\t};\n\t\tthis.translations[LoggingViewerModalComponent.languageDe] = {\n\t\t\tcancel: \"Abbrechen\",\n\t\t\tconfirmDelete: \"Alle Logs löschen?\",\n\t\t\tok: \"Ok\",\n\t\t\tsearchPlaceholder: \"Suchen\",\n\t\t\ttitle: \"Logging\",\n\t\t};\n\t}\n\n\t/**\n\t * Eventhandler called by Ionic when the modal is opened.\n\t */\n\tpublic ionViewDidEnter(): void {\n\t\tconst methodName = \"ionViewDidEnter\";\n\t\tthis.logger.entry(methodName);\n\n\t\tthis.logger.exit(methodName);\n\t}\n\n\t/**\n\t * Eventhandler called when the cancel button is clicked.\n\t */\n\tpublic async onClose(): Promise<void> {\n\t\tconst methodName = \"onClose\";\n\t\tthis.logger.entry(methodName);\n\n\t\tawait this.modalController.dismiss();\n\n\t\tthis.logger.exit(methodName);\n\t}\n\n\t/**\n\t * Eventhandler called when the clear button is clicked.\n\t */\n\tpublic async onClearLogs(): Promise<void> {\n\t\tconst methodName = \"onClearLogs\";\n\t\tthis.logger.entry(methodName);\n\n\t\tconst alert = await this.alertController.create({\n\t\t\theader: this.getTranslation().confirmDelete,\n\t\t\tbuttons: [\n\t\t\t\t{\n\t\t\t\t\ttext: this.getTranslation().cancel,\n\t\t\t\t\trole: \"cancel\",\n\t\t\t\t\tcssClass: \"secondary\"\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\ttext: this.getTranslation().ok,\n\t\t\t\t\thandler: () => {\n\t\t\t\t\t\tthis.clearLogs();\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t]\n\t\t});\n\t\tawait alert.present();\n\n\t\tthis.logger.exit(methodName);\n\t}\n\n\t/**\n\t * Clear logs.\n\t */\n\tpublic clearLogs(): void {\n\t\tif (this.localStorageKeys()) {\n\t\t\tfor (const localStorageKey of this.localStorageKeys().split(\",\")) {\n\t\t\t\tthis.loggingService.removeLogMessagesFromLocalStorage(localStorageKey);\n\t\t\t}\n\t\t} else {\n\t\t\tthis.loggingService.removeLogMessages();\n\t\t}\n\t}\n\n\t/**\n\t * Helper method returning the current translation:\n\t * - the property translation if defined\n\t * - the translation according property language if valid\n\t * - English translation, otherwise\n\t */\n\tpublic getTranslation(): LoggingViewerTranslation {\n\t\tconst language = this.language();\n\t\tconst translation = this.translation();\n\t\tif (typeof translation !== \"undefined\") {\n\t\t\treturn translation;\n\t\t} else if (typeof language !== \"undefined\" && typeof this.translations[language] === \"object\") {\n\t\t\treturn this.translations[language];\n\t\t} else {\n\t\t\treturn this.translations[LoggingViewerModalComponent.languageEn];\n\t\t}\n\t}\n}\n","<ion-header>\n <ion-toolbar color=primary>\n <ion-title>{{ getTranslation().title }}</ion-title>\n <ion-buttons slot=\"start\">\n @if (!isAndroid) {\n <ion-button (click)=\"onClose()\">\n {{ getTranslation().cancel }}\n </ion-button>\n } @else {\n <ion-button icon-only (click)=\"onClose()\">\n <ion-icon name=\"close-circle\"></ion-icon>\n </ion-button>\n }\n </ion-buttons>\n </ion-toolbar>\n <ion-toolbar>\n <ionic-logging-viewer-search [placeholder]=\"getTranslation().searchPlaceholder\"></ionic-logging-viewer-search>\n @if (allowClearLogs() !== false) {\n <ion-buttons slot=\"end\" class=\"clearLogs\">\n <ion-button (click)=\"onClearLogs()\">\n <ion-icon name=\"trash-outline\"></ion-icon>\n </ion-button>\n </ion-buttons>\n }\n </ion-toolbar>\n <ion-toolbar>\n <ionic-logging-viewer-levels></ionic-logging-viewer-levels>\n </ion-toolbar>\n</ion-header>\n<ion-content>\n <ionic-logging-viewer [localStorageKeys]=\"localStorageKeys()\"></ionic-logging-viewer>\n</ion-content>","/*\n * Public API Surface of ionic-logging-viewer\n */\n\nexport * from \"./lib/logging-viewer/logging-viewer.component\";\nexport * from \"./lib/logging-viewer-levels/logging-viewer-levels.component\";\nexport * from \"./lib/logging-viewer-search/logging-viewer-search.component\";\nexport * from \"./lib/logging-viewer-modal/logging-viewer-modal.component\";\nexport * from \"./lib/logging-viewer-modal/logging-viewer-modal-properties.model\";\nexport * from \"./lib/logging-viewer-translation.model\";\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,12 +1,15 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "ionic-logging-viewer",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "21.0.0",
|
|
4
4
|
"description": "Viewer component for logs written by ionic-logging-service",
|
|
5
5
|
"author": {
|
|
6
6
|
"name": "Markus Wagner",
|
|
7
7
|
"email": "markus.wagner02@web.de"
|
|
8
8
|
},
|
|
9
|
-
"repository":
|
|
9
|
+
"repository": {
|
|
10
|
+
"type": "git",
|
|
11
|
+
"url": "git+https://github.com/Ritzlgrmft/ionic-logging-service.git"
|
|
12
|
+
},
|
|
10
13
|
"license": "MIT",
|
|
11
14
|
"private": false,
|
|
12
15
|
"keywords": [
|
|
@@ -19,22 +22,20 @@
|
|
|
19
22
|
"tslib": "^2.3.1"
|
|
20
23
|
},
|
|
21
24
|
"peerDependencies": {
|
|
22
|
-
"@angular/common": ">=
|
|
23
|
-
"@angular/core": ">=
|
|
24
|
-
"@ionic/angular": ">=
|
|
25
|
-
"ionic-logging-service": "^
|
|
26
|
-
"ionicons": ">=
|
|
25
|
+
"@angular/common": ">=21.0.0",
|
|
26
|
+
"@angular/core": ">=21.0.0",
|
|
27
|
+
"@ionic/angular": ">=8.0.0",
|
|
28
|
+
"ionic-logging-service": "^21.0.0",
|
|
29
|
+
"ionicons": ">=8.0.0"
|
|
27
30
|
},
|
|
28
31
|
"module": "fesm2022/ionic-logging-viewer.mjs",
|
|
29
|
-
"typings": "
|
|
32
|
+
"typings": "types/ionic-logging-viewer.d.ts",
|
|
30
33
|
"exports": {
|
|
31
34
|
"./package.json": {
|
|
32
35
|
"default": "./package.json"
|
|
33
36
|
},
|
|
34
37
|
".": {
|
|
35
|
-
"types": "./
|
|
36
|
-
"esm2022": "./esm2022/ionic-logging-viewer.mjs",
|
|
37
|
-
"esm": "./esm2022/ionic-logging-viewer.mjs",
|
|
38
|
+
"types": "./types/ionic-logging-viewer.d.ts",
|
|
38
39
|
"default": "./fesm2022/ionic-logging-viewer.mjs"
|
|
39
40
|
}
|
|
40
41
|
},
|
|
@@ -0,0 +1,244 @@
|
|
|
1
|
+
import * as i0 from '@angular/core';
|
|
2
|
+
import { OnInit } from '@angular/core';
|
|
3
|
+
import { LogMessage } from 'ionic-logging-service';
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Component for displaying the current logs.
|
|
7
|
+
*
|
|
8
|
+
* The component can be embedded in any web page using:
|
|
9
|
+
*
|
|
10
|
+
* <ionic-logging-viewer></ionic-logging-viewer>
|
|
11
|
+
*/
|
|
12
|
+
declare class LoggingViewerComponent {
|
|
13
|
+
private loggingService;
|
|
14
|
+
private loggingViewerFilterService;
|
|
15
|
+
/**
|
|
16
|
+
* Comma-separated list of localStorageKeys. If set, the logs get loaded from localStorage instead of memory.
|
|
17
|
+
*/
|
|
18
|
+
readonly localStorageKeys: i0.InputSignal<string>;
|
|
19
|
+
/**
|
|
20
|
+
* Log messages which fulfill the filter condition.
|
|
21
|
+
*/
|
|
22
|
+
logMessagesForDisplay: LogMessage[];
|
|
23
|
+
private logger;
|
|
24
|
+
private logMessages;
|
|
25
|
+
/**
|
|
26
|
+
* Creates a new instance of the component.
|
|
27
|
+
*/
|
|
28
|
+
constructor();
|
|
29
|
+
/**
|
|
30
|
+
* Filter the log messages.
|
|
31
|
+
*/
|
|
32
|
+
filterLogMessages(logMessages: LogMessage[], level: string, search: string): void;
|
|
33
|
+
/**
|
|
34
|
+
* Check if the log message's level fulfills the level condition.
|
|
35
|
+
*
|
|
36
|
+
* @param message the log message to check
|
|
37
|
+
* @returns true if check was successful
|
|
38
|
+
*/
|
|
39
|
+
filterLogMessagesByLevel(message: LogMessage, level: string): boolean;
|
|
40
|
+
/**
|
|
41
|
+
* Check if the log message fulfills the search condition.
|
|
42
|
+
*
|
|
43
|
+
* The search value gets searched in:
|
|
44
|
+
* - logger name
|
|
45
|
+
* - method name
|
|
46
|
+
* - message
|
|
47
|
+
*
|
|
48
|
+
* @param message the log message to check
|
|
49
|
+
* @returns true if check was successful
|
|
50
|
+
*/
|
|
51
|
+
filterLogMessagesBySearch(message: LogMessage, search: string): boolean;
|
|
52
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<LoggingViewerComponent, never>;
|
|
53
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<LoggingViewerComponent, "ionic-logging-viewer", never, { "localStorageKeys": { "alias": "localStorageKeys"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
/**
|
|
57
|
+
* Component for displaying the log levels for filtering the current logs.
|
|
58
|
+
*
|
|
59
|
+
* The component can be embedded in any web page using:
|
|
60
|
+
*
|
|
61
|
+
* <ionic-logging-viewer-levels></ionic-logging-viewer-levels>
|
|
62
|
+
*/
|
|
63
|
+
declare class LoggingViewerLevelsComponent {
|
|
64
|
+
private loggingService;
|
|
65
|
+
private loggingViewerFilterService;
|
|
66
|
+
/**
|
|
67
|
+
* Log levels used for filtering: DEBUG, INFO, WARN, ERROR
|
|
68
|
+
*/
|
|
69
|
+
logLevels: string[];
|
|
70
|
+
/**
|
|
71
|
+
* Selected level.
|
|
72
|
+
*/
|
|
73
|
+
selectedLevel: string;
|
|
74
|
+
private logger;
|
|
75
|
+
/**
|
|
76
|
+
* Creates a new instance of the component.
|
|
77
|
+
*/
|
|
78
|
+
constructor();
|
|
79
|
+
/**
|
|
80
|
+
* Callback when the level was changed in the UI.
|
|
81
|
+
*/
|
|
82
|
+
onLevelChanged(): void;
|
|
83
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<LoggingViewerLevelsComponent, never>;
|
|
84
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<LoggingViewerLevelsComponent, "ionic-logging-viewer-levels", never, {}, {}, never, never, true, never>;
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
/**
|
|
88
|
+
* Component for displaying the search bar for filtering the current logs.
|
|
89
|
+
*
|
|
90
|
+
* The component can be embedded in any web page using:
|
|
91
|
+
*
|
|
92
|
+
* <ionic-logging-viewer-search placeholder="Search"></ionic-logging-viewer-search>
|
|
93
|
+
*/
|
|
94
|
+
declare class LoggingViewerSearchComponent {
|
|
95
|
+
private loggingService;
|
|
96
|
+
private loggingViewerFilterService;
|
|
97
|
+
/**
|
|
98
|
+
* Placeholder to be shown in the empty search bar.
|
|
99
|
+
*/
|
|
100
|
+
readonly placeholder: i0.InputSignal<string>;
|
|
101
|
+
/**
|
|
102
|
+
* Current search value.
|
|
103
|
+
*/
|
|
104
|
+
search: string;
|
|
105
|
+
private logger;
|
|
106
|
+
/**
|
|
107
|
+
* Creates a new instance of the component.
|
|
108
|
+
*/
|
|
109
|
+
constructor();
|
|
110
|
+
/**
|
|
111
|
+
* Callback when the search value was changed in the UI.
|
|
112
|
+
*/
|
|
113
|
+
onSearchChanged(): void;
|
|
114
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<LoggingViewerSearchComponent, never>;
|
|
115
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<LoggingViewerSearchComponent, "ionic-logging-viewer-search", never, { "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
/**
|
|
119
|
+
* Describes all values needed in a translation for
|
|
120
|
+
* [LoggingViewerModalComponent](../classes/LoggingViewerModalComponent.html).
|
|
121
|
+
*/
|
|
122
|
+
interface LoggingViewerTranslation {
|
|
123
|
+
/**
|
|
124
|
+
* Title of the modal.
|
|
125
|
+
*/
|
|
126
|
+
title: string;
|
|
127
|
+
/**
|
|
128
|
+
* Cancel button.
|
|
129
|
+
* There are two cancel buttons: in the modal itself (iOS only) and the confirmation for deleting the messages.
|
|
130
|
+
*/
|
|
131
|
+
cancel: string;
|
|
132
|
+
/**
|
|
133
|
+
* Ok button.
|
|
134
|
+
*/
|
|
135
|
+
ok: string;
|
|
136
|
+
/**
|
|
137
|
+
* Placeholder for search bar.
|
|
138
|
+
*/
|
|
139
|
+
searchPlaceholder: string;
|
|
140
|
+
/**
|
|
141
|
+
* Confirmation message for deleting log messages.
|
|
142
|
+
*/
|
|
143
|
+
confirmDelete: string;
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
/**
|
|
147
|
+
* Ionic modal containing [LoggingViewerComponent](LoggingViewerComponent.html),
|
|
148
|
+
* [LoggingViewerLevelsComponent](LoggingViewerLevelsComponent.html) and
|
|
149
|
+
* [LoggingViewerSearchComponent](LoggingViewerSearchComponent.html).
|
|
150
|
+
*/
|
|
151
|
+
declare class LoggingViewerModalComponent implements OnInit {
|
|
152
|
+
private platform;
|
|
153
|
+
private alertController;
|
|
154
|
+
private modalController;
|
|
155
|
+
private loggingService;
|
|
156
|
+
private static languageEn;
|
|
157
|
+
private static languageDe;
|
|
158
|
+
/**
|
|
159
|
+
* Language to be used for the modal.
|
|
160
|
+
* Currently supported: en, de
|
|
161
|
+
*/
|
|
162
|
+
readonly language: i0.InputSignal<string>;
|
|
163
|
+
/**
|
|
164
|
+
* Translation to be used for the modal.
|
|
165
|
+
* If specified, the language is ignored.
|
|
166
|
+
*/
|
|
167
|
+
readonly translation: i0.InputSignal<LoggingViewerTranslation>;
|
|
168
|
+
/**
|
|
169
|
+
* Comma-separated list of localStorageKeys. If set, the logs get loaded from localStorage instead of memory.
|
|
170
|
+
*/
|
|
171
|
+
readonly localStorageKeys: i0.InputSignal<string>;
|
|
172
|
+
/**
|
|
173
|
+
* Flag showing a delete button, which removes all existing log messages.
|
|
174
|
+
*/
|
|
175
|
+
readonly allowClearLogs: i0.InputSignal<boolean>;
|
|
176
|
+
/**
|
|
177
|
+
* Flag controlling which close button will be shown.
|
|
178
|
+
*/
|
|
179
|
+
isAndroid: boolean;
|
|
180
|
+
private logger;
|
|
181
|
+
private translations;
|
|
182
|
+
/**
|
|
183
|
+
* Creates a new instance of the component.
|
|
184
|
+
*/
|
|
185
|
+
constructor();
|
|
186
|
+
/**
|
|
187
|
+
* Initializes the LoggingViewerModalComponent.
|
|
188
|
+
* It configures the supported translations.
|
|
189
|
+
*/
|
|
190
|
+
ngOnInit(): void;
|
|
191
|
+
/**
|
|
192
|
+
* Eventhandler called by Ionic when the modal is opened.
|
|
193
|
+
*/
|
|
194
|
+
ionViewDidEnter(): void;
|
|
195
|
+
/**
|
|
196
|
+
* Eventhandler called when the cancel button is clicked.
|
|
197
|
+
*/
|
|
198
|
+
onClose(): Promise<void>;
|
|
199
|
+
/**
|
|
200
|
+
* Eventhandler called when the clear button is clicked.
|
|
201
|
+
*/
|
|
202
|
+
onClearLogs(): Promise<void>;
|
|
203
|
+
/**
|
|
204
|
+
* Clear logs.
|
|
205
|
+
*/
|
|
206
|
+
clearLogs(): void;
|
|
207
|
+
/**
|
|
208
|
+
* Helper method returning the current translation:
|
|
209
|
+
* - the property translation if defined
|
|
210
|
+
* - the translation according property language if valid
|
|
211
|
+
* - English translation, otherwise
|
|
212
|
+
*/
|
|
213
|
+
getTranslation(): LoggingViewerTranslation;
|
|
214
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<LoggingViewerModalComponent, never>;
|
|
215
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<LoggingViewerModalComponent, "ionic-logging-viewer-modal", never, { "language": { "alias": "language"; "required": false; "isSignal": true; }; "translation": { "alias": "translation"; "required": false; "isSignal": true; }; "localStorageKeys": { "alias": "localStorageKeys"; "required": false; "isSignal": true; }; "allowClearLogs": { "alias": "allowClearLogs"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
/**
|
|
219
|
+
* Describes all properties which can be passed to the
|
|
220
|
+
* [LoggingViewerModalComponent](../classes/LoggingViewerModalComponent.html).
|
|
221
|
+
*/
|
|
222
|
+
interface LoggingViewerModalProperties {
|
|
223
|
+
/**
|
|
224
|
+
* Language to be used for the modal.
|
|
225
|
+
* Currently supported: en, de
|
|
226
|
+
*/
|
|
227
|
+
language?: string;
|
|
228
|
+
/**
|
|
229
|
+
* Translation to be used for the modal.
|
|
230
|
+
* If specified, the language is ignored.
|
|
231
|
+
*/
|
|
232
|
+
translation?: LoggingViewerTranslation;
|
|
233
|
+
/**
|
|
234
|
+
* Comma-separated list of localStorageKeys. If set, the logs get loaded from localStorage instead of memory.
|
|
235
|
+
*/
|
|
236
|
+
localStorageKeys?: string;
|
|
237
|
+
/**
|
|
238
|
+
* Flag showing a delete button, which removes all existing log messages.
|
|
239
|
+
*/
|
|
240
|
+
allowClearLogs?: boolean;
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
export { LoggingViewerComponent, LoggingViewerLevelsComponent, LoggingViewerModalComponent, LoggingViewerSearchComponent };
|
|
244
|
+
export type { LoggingViewerModalProperties, LoggingViewerTranslation };
|
|
@@ -1,5 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Generated bundle index. Do not edit.
|
|
3
|
-
*/
|
|
4
|
-
export * from './public_api';
|
|
5
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW9uaWMtbG9nZ2luZy12aWV3ZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9wcm9qZWN0cy9pb25pYy1sb2dnaW5nLXZpZXdlci9zcmMvaW9uaWMtbG9nZ2luZy12aWV3ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7O0dBRUc7QUFFSCxjQUFjLGNBQWMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogR2VuZXJhdGVkIGJ1bmRsZSBpbmRleC4gRG8gbm90IGVkaXQuXG4gKi9cblxuZXhwb3J0ICogZnJvbSAnLi9wdWJsaWNfYXBpJztcbiJdfQ==
|
|
@@ -1,119 +0,0 @@
|
|
|
1
|
-
import { Component, Input } from "@angular/core";
|
|
2
|
-
import { LoggingService, LogLevelConverter } from "ionic-logging-service";
|
|
3
|
-
import { LoggingViewerFilterService } from "../logging-viewer-filter.service";
|
|
4
|
-
import * as i0 from "@angular/core";
|
|
5
|
-
import * as i1 from "ionic-logging-service";
|
|
6
|
-
import * as i2 from "../logging-viewer-filter.service";
|
|
7
|
-
import * as i3 from "@angular/common";
|
|
8
|
-
import * as i4 from "@ionic/angular";
|
|
9
|
-
/**
|
|
10
|
-
* Component for displaying the current logs.
|
|
11
|
-
*
|
|
12
|
-
* The component can be embedded in any web page using:
|
|
13
|
-
*
|
|
14
|
-
* <ionic-logging-viewer></ionic-logging-viewer>
|
|
15
|
-
*/
|
|
16
|
-
export class LoggingViewerComponent {
|
|
17
|
-
/**
|
|
18
|
-
* Creates a new instance of the component.
|
|
19
|
-
*/
|
|
20
|
-
constructor(loggingService, loggingViewerFilterService) {
|
|
21
|
-
this.loggingService = loggingService;
|
|
22
|
-
this.loggingViewerFilterService = loggingViewerFilterService;
|
|
23
|
-
this.logger = loggingService.getLogger("Ionic.Logging.Viewer.Component");
|
|
24
|
-
const methodName = "ctor";
|
|
25
|
-
this.logger.entry(methodName);
|
|
26
|
-
this.logger.exit(methodName);
|
|
27
|
-
}
|
|
28
|
-
/**
|
|
29
|
-
* Initialize the component.
|
|
30
|
-
*
|
|
31
|
-
* This is done by reading the filter data from [LoggingViewerFilterService](LoggingViewerFilterService.html)
|
|
32
|
-
* and the log messages from [LoggingService](../../../ionic-logging-service/typedoc/index.html).
|
|
33
|
-
* If the localStorageKeys property is set, the messages are read from local storage.
|
|
34
|
-
*/
|
|
35
|
-
ngOnInit() {
|
|
36
|
-
const methodName = "ngOnInit";
|
|
37
|
-
this.logger.entry(methodName);
|
|
38
|
-
this.loadLogMessages();
|
|
39
|
-
this.filterLogMessages();
|
|
40
|
-
// subscribe to loggingService.logMessagesChanged event, to refresh, when new message is logged
|
|
41
|
-
this.logMessagesChangedSubscription = this.loggingService.logMessagesChanged.subscribe(async () => {
|
|
42
|
-
this.loadLogMessages();
|
|
43
|
-
this.filterLogMessages();
|
|
44
|
-
});
|
|
45
|
-
// subscribe to loggingViewerFilterService.filterChanged event, to refresh, when filter is modified
|
|
46
|
-
this.filterChangedSubscription = this.loggingViewerFilterService.filterChanged.subscribe(() => {
|
|
47
|
-
this.filterLogMessages();
|
|
48
|
-
});
|
|
49
|
-
this.logger.exit(methodName);
|
|
50
|
-
}
|
|
51
|
-
/**
|
|
52
|
-
* Clean up.
|
|
53
|
-
*/
|
|
54
|
-
ngOnDestroy() {
|
|
55
|
-
const methodName = "ngOnDestroy";
|
|
56
|
-
this.logger.entry(methodName);
|
|
57
|
-
this.logMessagesChangedSubscription.unsubscribe();
|
|
58
|
-
this.filterChangedSubscription.unsubscribe();
|
|
59
|
-
this.logger.exit(methodName);
|
|
60
|
-
}
|
|
61
|
-
/**
|
|
62
|
-
* Filter the log messages.
|
|
63
|
-
*/
|
|
64
|
-
filterLogMessages() {
|
|
65
|
-
this.logMessagesForDisplay = this.logMessages.filter((message) => this.filterLogMessagesByLevel(message) && this.filterLogMessagesBySearch(message));
|
|
66
|
-
}
|
|
67
|
-
/**
|
|
68
|
-
* Check if the log message's level fulfills the level condition.
|
|
69
|
-
*
|
|
70
|
-
* @param message the log message to check
|
|
71
|
-
* @returns true if check was successful
|
|
72
|
-
*/
|
|
73
|
-
filterLogMessagesByLevel(message) {
|
|
74
|
-
const levelValue = this.loggingViewerFilterService.level;
|
|
75
|
-
return LogLevelConverter.levelFromString(message.level) >= LogLevelConverter.levelFromString(levelValue);
|
|
76
|
-
}
|
|
77
|
-
/**
|
|
78
|
-
* Check if the log message fulfills the search condition.
|
|
79
|
-
*
|
|
80
|
-
* The search value gets searched in:
|
|
81
|
-
* - logger name
|
|
82
|
-
* - method name
|
|
83
|
-
* - message
|
|
84
|
-
*
|
|
85
|
-
* @param message the log message to check
|
|
86
|
-
* @returns true if check was successful
|
|
87
|
-
*/
|
|
88
|
-
filterLogMessagesBySearch(message) {
|
|
89
|
-
const searchValue = new RegExp(this.loggingViewerFilterService.search, "i");
|
|
90
|
-
return message.logger.search(searchValue) >= 0 ||
|
|
91
|
-
message.methodName.search(searchValue) >= 0 ||
|
|
92
|
-
message.message.join("|").search(searchValue) >= 0;
|
|
93
|
-
}
|
|
94
|
-
/**
|
|
95
|
-
* Load the current log messages.
|
|
96
|
-
* For unit test purposes mainly.
|
|
97
|
-
*/
|
|
98
|
-
loadLogMessages() {
|
|
99
|
-
if (this.localStorageKeys) {
|
|
100
|
-
this.logMessages = [];
|
|
101
|
-
for (const localStorageKey of this.localStorageKeys.split(",")) {
|
|
102
|
-
this.logMessages = this.logMessages.concat(this.loggingService.getLogMessagesFromLocalStorage(localStorageKey));
|
|
103
|
-
}
|
|
104
|
-
this.logMessages = this.logMessages.sort((a, b) => a.timeStamp.getTime() - b.timeStamp.getTime());
|
|
105
|
-
}
|
|
106
|
-
else {
|
|
107
|
-
this.logMessages = this.loggingService.getLogMessages();
|
|
108
|
-
}
|
|
109
|
-
}
|
|
110
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.2.2", ngImport: i0, type: LoggingViewerComponent, deps: [{ token: i1.LoggingService }, { token: i2.LoggingViewerFilterService }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
111
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.2.2", type: LoggingViewerComponent, selector: "ionic-logging-viewer", inputs: { localStorageKeys: "localStorageKeys" }, ngImport: i0, template: "<ion-list>\n\t<ion-item *ngFor=\"let logMessage of logMessagesForDisplay\">\n\t\t<ion-label>\n\t\t\t<p>{{ logMessage.timeStamp | date:'dd.MM.yyyy HH:mm:ss' }} {{ logMessage.level }}</p>\n\t\t\t<p>{{ logMessage.logger }}</p>\n\t\t\t<p>\n\t\t\t\t{{ logMessage.methodName }}\n\t\t\t\t<span *ngFor=\"let messagePart of logMessage.message\"> {{ messagePart }} </span>\n\t\t\t</p>\n\t\t</ion-label>\n\t</ion-item>\n</ion-list>", styles: [""], dependencies: [{ kind: "directive", type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "component", type: i4.IonItem, selector: "ion-item", inputs: ["button", "color", "counter", "counterFormatter", "detail", "detailIcon", "disabled", "download", "fill", "href", "lines", "mode", "rel", "routerAnimation", "routerDirection", "shape", "target", "type"] }, { kind: "component", type: i4.IonLabel, selector: "ion-label", inputs: ["color", "mode", "position"] }, { kind: "component", type: i4.IonList, selector: "ion-list", inputs: ["inset", "lines", "mode"] }, { kind: "pipe", type: i3.DatePipe, name: "date" }] }); }
|
|
112
|
-
}
|
|
113
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.2.2", ngImport: i0, type: LoggingViewerComponent, decorators: [{
|
|
114
|
-
type: Component,
|
|
115
|
-
args: [{ selector: "ionic-logging-viewer", template: "<ion-list>\n\t<ion-item *ngFor=\"let logMessage of logMessagesForDisplay\">\n\t\t<ion-label>\n\t\t\t<p>{{ logMessage.timeStamp | date:'dd.MM.yyyy HH:mm:ss' }} {{ logMessage.level }}</p>\n\t\t\t<p>{{ logMessage.logger }}</p>\n\t\t\t<p>\n\t\t\t\t{{ logMessage.methodName }}\n\t\t\t\t<span *ngFor=\"let messagePart of logMessage.message\"> {{ messagePart }} </span>\n\t\t\t</p>\n\t\t</ion-label>\n\t</ion-item>\n</ion-list>" }]
|
|
116
|
-
}], ctorParameters: () => [{ type: i1.LoggingService }, { type: i2.LoggingViewerFilterService }], propDecorators: { localStorageKeys: [{
|
|
117
|
-
type: Input
|
|
118
|
-
}] } });
|
|
119
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9nZ2luZy12aWV3ZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvaW9uaWMtbG9nZ2luZy12aWV3ZXIvc3JjL2xpYi9sb2dnaW5nLXZpZXdlci9sb2dnaW5nLXZpZXdlci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9pb25pYy1sb2dnaW5nLXZpZXdlci9zcmMvbGliL2xvZ2dpbmctdmlld2VyL2xvZ2dpbmctdmlld2VyLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQXFCLEtBQUssRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUdwRSxPQUFPLEVBQVUsY0FBYyxFQUFFLGlCQUFpQixFQUFjLE1BQU0sdUJBQXVCLENBQUM7QUFFOUYsT0FBTyxFQUFFLDBCQUEwQixFQUFFLE1BQU0sa0NBQWtDLENBQUM7Ozs7OztBQUU5RTs7Ozs7O0dBTUc7QUFNSCxNQUFNLE9BQU8sc0JBQXNCO0lBa0JsQzs7T0FFRztJQUNILFlBQ1MsY0FBOEIsRUFDOUIsMEJBQXNEO1FBRHRELG1CQUFjLEdBQWQsY0FBYyxDQUFnQjtRQUM5QiwrQkFBMEIsR0FBMUIsMEJBQTBCLENBQTRCO1FBRTlELElBQUksQ0FBQyxNQUFNLEdBQUcsY0FBYyxDQUFDLFNBQVMsQ0FBQyxnQ0FBZ0MsQ0FBQyxDQUFDO1FBQ3pFLE1BQU0sVUFBVSxHQUFHLE1BQU0sQ0FBQztRQUMxQixJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUU5QixJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUM5QixDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0ksUUFBUTtRQUNkLE1BQU0sVUFBVSxHQUFHLFVBQVUsQ0FBQztRQUM5QixJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxVQUFVLENB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QUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLE9BQU8sRUFBRSxHQUFHLENBQUMsQ0FBQyxTQUFTLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQztRQUNuRyxDQUFDO2FBQU0sQ0FBQztZQUNQLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxjQUFjLEVBQUUsQ0FBQztRQUN6RCxDQUFDO0lBQ0YsQ0FBQzs4R0E1SFcsc0JBQXNCO2tHQUF0QixzQkFBc0IsOEdDbkJuQyxzYUFXVzs7MkZEUUUsc0JBQXNCO2tCQUxsQyxTQUFTOytCQUNDLHNCQUFzQjs0SEFVekIsZ0JBQWdCO3NCQUR0QixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBPbkRlc3Ryb3ksIE9uSW5pdCwgSW5wdXQgfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xuaW1wb3J0IHsgU3Vic2NyaXB0aW9uIH0gZnJvbSBcInJ4anNcIjtcblxuaW1wb3J0IHsgTG9nZ2VyLCBMb2dnaW5nU2VydmljZSwgTG9nTGV2ZWxDb252ZXJ0ZXIsIExvZ01lc3NhZ2UgfSBmcm9tIFwiaW9uaWMtbG9nZ2luZy1zZXJ2aWNlXCI7XG5cbmltcG9ydCB7IExvZ2dpbmdWaWV3ZXJGaWx0ZXJTZXJ2aWNlIH0gZnJvbSBcIi4uL2xvZ2dpbmctdmlld2VyLWZpbHRlci5zZXJ2aWNlXCI7XG5cbi8qKlxuICogQ29tcG9uZW50IGZvciBkaXNwbGF5aW5nIHRoZSBjdXJyZW50IGxvZ3MuXG4gKlxuICogVGhlIGNvbXBvbmVudCBjYW4gYmUgZW1iZWRkZWQgaW4gYW55IHdlYiBwYWdlIHVzaW5nOlxuICpcbiAqICZsdDtpb25pYy1sb2dnaW5nLXZpZXdlcj4mbHQ7L2lvbmljLWxvZ2dpbmctdmlld2VyPlxuICovXG5AQ29tcG9uZW50KHtcblx0c2VsZWN0b3I6IFwiaW9uaWMtbG9nZ2luZy12aWV3ZXJcIixcblx0dGVtcGxhdGVVcmw6IFwiLi9sb2dnaW5nLXZpZXdlci5jb21wb25lbnQuaHRtbFwiLFxuXHRzdHlsZVVybHM6IFtcIi4vbG9nZ2luZy12aWV3ZXIuY29tcG9uZW50LnNjc3NcIl1cbn0pXG5leHBvcnQgY2xhc3MgTG9nZ2luZ1ZpZXdlckNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcblxuXHQvKipcblx0ICogQ29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgbG9jYWxTdG9yYWdlS2V5cy4gSWYgc2V0LCB0aGUgbG9ncyBnZXQgbG9hZGVkIGZyb20gbG9jYWxTdG9yYWdlIGluc3RlYWQgb2YgbWVtb3J5LlxuXHQgKi9cblx0QElucHV0KClcblx0cHVibGljIGxvY2FsU3RvcmFnZUtleXM6IHN0cmluZztcblxuXHQvKipcblx0ICogTG9nIG1lc3NhZ2VzIHdoaWNoIGZ1bGZpbGwgdGhlIGZpbHRlciBjb25kaXRpb24uXG5cdCAqL1xuXHRwdWJsaWMgbG9nTWVzc2FnZXNGb3JEaXNwbGF5OiBMb2dNZXNzYWdlW107XG5cblx0cHJpdmF0ZSBsb2dnZXI6IExvZ2dlcjtcblx0cHJpdmF0ZSBsb2dNZXNzYWdlczogTG9nTWVzc2FnZVtdO1xuXHRwcml2YXRlIGxvZ01lc3NhZ2VzQ2hhbmdlZFN1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uO1xuXHRwcml2YXRlIGZpbHRlckNoYW5nZWRTdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbjtcblxuXHQvKipcblx0ICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgY29tcG9uZW50LlxuXHQgKi9cblx0Y29uc3RydWN0b3IoXG5cdFx0cHJpdmF0ZSBsb2dnaW5nU2VydmljZTogTG9nZ2luZ1NlcnZpY2UsXG5cdFx0cHJpdmF0ZSBsb2dnaW5nVmlld2VyRmlsdGVyU2VydmljZTogTG9nZ2luZ1ZpZXdlckZpbHRlclNlcnZpY2UpIHtcblxuXHRcdHRoaXMubG9nZ2VyID0gbG9nZ2luZ1NlcnZpY2UuZ2V0TG9nZ2VyKFwiSW9uaWMuTG9nZ2luZy5WaWV3ZXIuQ29tcG9uZW50XCIpO1xuXHRcdGNvbnN0IG1ldGhvZE5hbWUgPSBcImN0b3JcIjtcblx0XHR0aGlzLmxvZ2dlci5lbnRyeShtZXRob2ROYW1lKTtcblxuXHRcdHRoaXMubG9nZ2VyLmV4aXQobWV0aG9kTmFtZSk7XG5cdH1cblxuXHQvKipcblx0ICogSW5pdGlhbGl6ZSB0aGUgY29tcG9uZW50LlxuXHQgKlxuXHQgKiBUaGlzIGlzIGRvbmUgYnkgcmVhZGluZyB0aGUgZmlsdGVyIGRhdGEgZnJvbSBbTG9nZ2luZ1ZpZXdlckZpbHRlclNlcnZpY2VdKExvZ2dpbmdWaWV3ZXJGaWx0ZXJTZXJ2aWNlLmh0bWwpXG5cdCAqIGFuZCB0aGUgbG9nIG1lc3NhZ2VzIGZyb20gW0xvZ2dpbmdTZXJ2aWNlXSguLi8uLi8uLi9pb25pYy1sb2dnaW5nLXNlcnZpY2UvdHlwZWRvYy9pbmRleC5odG1sKS5cblx0ICogSWYgdGhlIGxvY2FsU3RvcmFnZUtleXMgcHJvcGVydHkgaXMgc2V0LCB0aGUgbWVzc2FnZXMgYXJlIHJlYWQgZnJvbSBsb2NhbCBzdG9yYWdlLlxuXHQgKi9cblx0cHVibGljIG5nT25Jbml0KCk6IHZvaWQge1xuXHRcdGNvbnN0IG1ldGhvZE5hbWUgPSBcIm5nT25Jbml0XCI7XG5cdFx0dGhpcy5sb2dnZXIuZW50cnkobWV0aG9kTmFtZSk7XG5cblx0XHR0aGlzLmxvYWRMb2dNZXNzYWdlcygpO1xuXHRcdHRoaXMuZmlsdGVyTG9nTWVzc2FnZXMoKTtcblxuXHRcdC8vIHN1YnNjcmliZSB0byBsb2dnaW5nU2VydmljZS5sb2dNZXNzYWdlc0NoYW5nZWQgZXZlbnQsIHRvIHJlZnJlc2gsIHdoZW4gbmV3IG1lc3NhZ2UgaXMgbG9nZ2VkXG5cdFx0dGhpcy5sb2dNZXNzYWdlc0NoYW5nZWRTdWJzY3JpcHRpb24gPSB0aGlzLmxvZ2dpbmdTZXJ2aWNlLmxvZ01lc3NhZ2VzQ2hhbmdlZC5zdWJzY3JpYmUoYXN5bmMgKCkgPT4ge1xuXHRcdFx0dGhpcy5sb2FkTG9nTWVzc2FnZXMoKTtcblx0XHRcdHRoaXMuZmlsdGVyTG9nTWVzc2FnZXMoKTtcblx0XHR9KTtcblxuXHRcdC8vIHN1YnNjcmliZSB0byBsb2dnaW5nVmlld2VyRmlsdGVyU2VydmljZS5maWx0ZXJDaGFuZ2VkIGV2ZW50LCB0byByZWZyZXNoLCB3aGVuIGZpbHRlciBpcyBtb2RpZmllZFxuXHRcdHRoaXMuZmlsdGVyQ2hhbmdlZFN1YnNjcmlwdGlvbiA9IHRoaXMubG9nZ2luZ1ZpZXdlckZpbHRlclNlcnZpY2UuZmlsdGVyQ2hhbmdlZC5zdWJzY3JpYmUoKCkgPT4ge1xuXHRcdFx0dGhpcy5maWx0ZXJMb2dNZXNzYWdlcygpO1xuXHRcdH0pO1xuXG5cdFx0dGhpcy5sb2dnZXIuZXhpdChtZXRob2ROYW1lKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDbGVhbiB1cC5cblx0ICovXG5cdHB1YmxpYyBuZ09uRGVzdHJveSgpOiB2b2lkIHtcblx0XHRjb25zdCBtZXRob2ROYW1lID0gXCJuZ09uRGVzdHJveVwiO1xuXHRcdHRoaXMubG9nZ2VyLmVudHJ5KG1ldGhvZE5hbWUpO1xuXG5cdFx0dGhpcy5sb2dNZXNzYWdlc0NoYW5nZWRTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcblx0XHR0aGlzLmZpbHRlckNoYW5nZWRTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcblxuXHRcdHRoaXMubG9nZ2VyLmV4aXQobWV0aG9kTmFtZSk7XG5cdH1cblxuXHQvKipcblx0ICogRmlsdGVyIHRoZSBsb2cgbWVzc2FnZXMuXG5cdCAqL1xuXHRwdWJsaWMgZmlsdGVyTG9nTWVzc2FnZXMoKTogdm9pZCB7XG5cdFx0dGhpcy5sb2dNZXNzYWdlc0ZvckRpc3BsYXkgPSB0aGlzLmxvZ01lc3NhZ2VzLmZpbHRlcihcblx0XHRcdChtZXNzYWdlKSA9PiB0aGlzLmZpbHRlckxvZ01lc3NhZ2VzQnlMZXZlbChtZXNzYWdlKSAmJiB0aGlzLmZpbHRlckxvZ01lc3NhZ2VzQnlTZWFyY2gobWVzc2FnZSkpO1xuXHR9XG5cblx0LyoqXG5cdCAqIENoZWNrIGlmIHRoZSBsb2cgbWVzc2FnZSdzIGxldmVsIGZ1bGZpbGxzIHRoZSBsZXZlbCBjb25kaXRpb24uXG5cdCAqXG5cdCAqIEBwYXJhbSBtZXNzYWdlIHRoZSBsb2cgbWVzc2FnZSB0byBjaGVja1xuXHQgKiBAcmV0dXJucyB0cnVlIGlmIGNoZWNrIHdhcyBzdWNjZXNzZnVsXG5cdCAqL1xuXHRwdWJsaWMgZmlsdGVyTG9nTWVzc2FnZXNCeUxldmVsKG1lc3NhZ2U6IExvZ01lc3NhZ2UpOiBib29sZWFuIHtcblx0XHRjb25zdCBsZXZlbFZhbHVlID0gdGhpcy5sb2dnaW5nVmlld2VyRmlsdGVyU2VydmljZS5sZXZlbDtcblx0XHRyZXR1cm4gTG9nTGV2ZWxDb252ZXJ0ZXIubGV2ZWxGcm9tU3RyaW5nKG1lc3NhZ2UubGV2ZWwpID49IExvZ0xldmVsQ29udmVydGVyLmxldmVsRnJvbVN0cmluZyhsZXZlbFZhbHVlKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDaGVjayBpZiB0aGUgbG9nIG1lc3NhZ2UgZnVsZmlsbHMgdGhlIHNlYXJjaCBjb25kaXRpb24uXG5cdCAqXG5cdCAqIFRoZSBzZWFyY2ggdmFsdWUgZ2V0cyBzZWFyY2hlZCBpbjpcblx0ICogLSBsb2dnZXIgbmFtZVxuXHQgKiAtIG1ldGhvZCBuYW1lXG5cdCAqIC0gbWVzc2FnZVxuXHQgKlxuXHQgKiBAcGFyYW0gbWVzc2FnZSB0aGUgbG9nIG1lc3NhZ2UgdG8gY2hlY2tcblx0ICogQHJldHVybnMgdHJ1ZSBpZiBjaGVjayB3YXMgc3VjY2Vzc2Z1bFxuXHQgKi9cblx0cHVibGljIGZpbHRlckxvZ01lc3NhZ2VzQnlTZWFyY2gobWVzc2FnZTogTG9nTWVzc2FnZSk6IGJvb2xlYW4ge1xuXHRcdGNvbnN0IHNlYXJjaFZhbHVlID0gbmV3IFJlZ0V4cCh0aGlzLmxvZ2dpbmdWaWV3ZXJGaWx0ZXJTZXJ2aWNlLnNlYXJjaCwgXCJpXCIpO1xuXHRcdHJldHVybiBtZXNzYWdlLmxvZ2dlci5zZWFyY2goc2VhcmNoVmFsdWUpID49IDAgfHxcblx0XHRcdG1lc3NhZ2UubWV0aG9kTmFtZS5zZWFyY2goc2VhcmNoVmFsdWUpID49IDAgfHxcblx0XHRcdG1lc3NhZ2UubWVzc2FnZS5qb2luKFwifFwiKS5zZWFyY2goc2VhcmNoVmFsdWUpID49IDA7XG5cdH1cblxuXHQvKipcblx0ICogTG9hZCB0aGUgY3VycmVudCBsb2cgbWVzc2FnZXMuXG5cdCAqIEZvciB1bml0IHRlc3QgcHVycG9zZXMgbWFpbmx5LlxuXHQgKi9cblx0cHVibGljIGxvYWRMb2dNZXNzYWdlcygpOiB2b2lkIHtcblx0XHRpZiAodGhpcy5sb2NhbFN0b3JhZ2VLZXlzKSB7XG5cdFx0XHR0aGlzLmxvZ01lc3NhZ2VzID0gW107XG5cdFx0XHRmb3IgKGNvbnN0IGxvY2FsU3RvcmFnZUtleSBvZiB0aGlzLmxvY2FsU3RvcmFnZUtleXMuc3BsaXQoXCIsXCIpKSB7XG5cdFx0XHRcdHRoaXMubG9nTWVzc2FnZXMgPSB0aGlzLmxvZ01lc3NhZ2VzLmNvbmNhdCh0aGlzLmxvZ2dpbmdTZXJ2aWNlLmdldExvZ01lc3NhZ2VzRnJvbUxvY2FsU3RvcmFnZShsb2NhbFN0b3JhZ2VLZXkpKTtcblx0XHRcdH1cblx0XHRcdHRoaXMubG9nTWVzc2FnZXMgPSB0aGlzLmxvZ01lc3NhZ2VzLnNvcnQoKGEsIGIpID0+IGEudGltZVN0YW1wLmdldFRpbWUoKSAtIGIudGltZVN0YW1wLmdldFRpbWUoKSk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHRoaXMubG9nTWVzc2FnZXMgPSB0aGlzLmxvZ2dpbmdTZXJ2aWNlLmdldExvZ01lc3NhZ2VzKCk7XG5cdFx0fVxuXHR9XG59XG4iLCI8aW9uLWxpc3Q+XG5cdDxpb24taXRlbSAqbmdGb3I9XCJsZXQgbG9nTWVzc2FnZSBvZiBsb2dNZXNzYWdlc0ZvckRpc3BsYXlcIj5cblx0XHQ8aW9uLWxhYmVsPlxuXHRcdFx0PHA+e3sgbG9nTWVzc2FnZS50aW1lU3RhbXAgfCBkYXRlOidkZC5NTS55eXl5IEhIOm1tOnNzJyB9fSB7eyBsb2dNZXNzYWdlLmxldmVsIH19PC9wPlxuXHRcdFx0PHA+e3sgbG9nTWVzc2FnZS5sb2dnZXIgfX08L3A+XG5cdFx0XHQ8cD5cblx0XHRcdFx0e3sgbG9nTWVzc2FnZS5tZXRob2ROYW1lIH19XG5cdFx0XHRcdDxzcGFuICpuZ0Zvcj1cImxldCBtZXNzYWdlUGFydCBvZiBsb2dNZXNzYWdlLm1lc3NhZ2VcIj4ge3sgbWVzc2FnZVBhcnQgfX0gPC9zcGFuPlxuXHRcdFx0PC9wPlxuXHRcdDwvaW9uLWxhYmVsPlxuXHQ8L2lvbi1pdGVtPlxuPC9pb24tbGlzdD4iXX0=
|