UNPKG

ionic-logging-viewer

Version:

Viewer component for logs written by ionic-logging-service

1 lines 30.1 kB
{"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, signal } 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 * &lt;ionic-logging-viewer>&lt;/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>(undefined);\n\n\t/**\n\t * Log messages which fulfill the filter condition.\n\t */\n\tpublic logMessagesForDisplay = signal<LogMessage[]>([]);\n\n\tprivate logger: Logger;\n\tprivate logMessages = computed(() => {\n\t\tconst localStorageKeys = this.localStorageKeys();\n\t\tif (localStorageKeys) {\n\t\t\tlet messages: LogMessage[] = [];\n\t\t\tfor (const localStorageKey of 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.set(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\tif (!message.logger || !message.methodName || !message.message) {\n\t\t\treturn false;\n\t\t}\n\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 * &lt;ionic-logging-viewer-levels>&lt;/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 = \"\";\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 * &lt;ionic-logging-viewer-search placeholder=\"Search\">&lt;/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>(undefined);\n\n\t/**\n\t * Current search value.\n\t */\n\tpublic search = \"\";\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>(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>(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>(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\tconst localStorageKeys = this.localStorageKeys();\n\t\tif (localStorageKeys) {\n\t\t\tfor (const localStorageKey of 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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"}