ionic-logging-viewer 21.0.0 → 22.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
CHANGED
|
@@ -23,20 +23,22 @@ class LoggingViewerFilterService {
|
|
|
23
23
|
/**
|
|
24
24
|
* Signal for the current log level.
|
|
25
25
|
*/
|
|
26
|
-
this.level = signal("DEBUG",
|
|
26
|
+
this.level = signal("DEBUG", /* @ts-ignore */
|
|
27
|
+
...(ngDevMode ? [{ debugName: "level" }] : /* istanbul ignore next */ []));
|
|
27
28
|
/**
|
|
28
29
|
* Signal for the current search value.
|
|
29
30
|
*/
|
|
30
|
-
this.search = signal("",
|
|
31
|
+
this.search = signal("", /* @ts-ignore */
|
|
32
|
+
...(ngDevMode ? [{ debugName: "search" }] : /* istanbul ignore next */ []));
|
|
31
33
|
this.logger = this.loggingService.getLogger("Ionic.Logging.Viewer.Filter.Service");
|
|
32
34
|
const methodName = "ctor";
|
|
33
35
|
this.logger.entry(methodName);
|
|
34
36
|
this.logger.exit(methodName);
|
|
35
37
|
}
|
|
36
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
37
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "
|
|
38
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: LoggingViewerFilterService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
39
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: LoggingViewerFilterService, providedIn: 'root' }); }
|
|
38
40
|
}
|
|
39
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
41
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: LoggingViewerFilterService, decorators: [{
|
|
40
42
|
type: Injectable,
|
|
41
43
|
args: [{
|
|
42
44
|
providedIn: 'root'
|
|
@@ -60,11 +62,18 @@ class LoggingViewerComponent {
|
|
|
60
62
|
/**
|
|
61
63
|
* Comma-separated list of localStorageKeys. If set, the logs get loaded from localStorage instead of memory.
|
|
62
64
|
*/
|
|
63
|
-
this.localStorageKeys = input(undefined,
|
|
65
|
+
this.localStorageKeys = input(undefined, /* @ts-ignore */
|
|
66
|
+
...(ngDevMode ? [{ debugName: "localStorageKeys" }] : /* istanbul ignore next */ []));
|
|
67
|
+
/**
|
|
68
|
+
* Log messages which fulfill the filter condition.
|
|
69
|
+
*/
|
|
70
|
+
this.logMessagesForDisplay = signal([], /* @ts-ignore */
|
|
71
|
+
...(ngDevMode ? [{ debugName: "logMessagesForDisplay" }] : /* istanbul ignore next */ []));
|
|
64
72
|
this.logMessages = computed(() => {
|
|
65
|
-
|
|
73
|
+
const localStorageKeys = this.localStorageKeys();
|
|
74
|
+
if (localStorageKeys) {
|
|
66
75
|
let messages = [];
|
|
67
|
-
for (const localStorageKey of
|
|
76
|
+
for (const localStorageKey of localStorageKeys.split(",")) {
|
|
68
77
|
messages = messages.concat(this.loggingService.getLogMessagesFromLocalStorage(localStorageKey));
|
|
69
78
|
}
|
|
70
79
|
return messages.sort((a, b) => a.timeStamp.getTime() - b.timeStamp.getTime());
|
|
@@ -72,7 +81,8 @@ class LoggingViewerComponent {
|
|
|
72
81
|
else {
|
|
73
82
|
return this.loggingService.getLogMessages()();
|
|
74
83
|
}
|
|
75
|
-
},
|
|
84
|
+
}, /* @ts-ignore */
|
|
85
|
+
...(ngDevMode ? [{ debugName: "logMessages" }] : /* istanbul ignore next */ []));
|
|
76
86
|
this.logger = this.loggingService.getLogger("Ionic.Logging.Viewer.Component");
|
|
77
87
|
const methodName = "ctor";
|
|
78
88
|
this.logger.entry(methodName);
|
|
@@ -89,7 +99,7 @@ class LoggingViewerComponent {
|
|
|
89
99
|
* Filter the log messages.
|
|
90
100
|
*/
|
|
91
101
|
filterLogMessages(logMessages, level, search) {
|
|
92
|
-
this.logMessagesForDisplay
|
|
102
|
+
this.logMessagesForDisplay.set(logMessages.filter((message) => this.filterLogMessagesByLevel(message, level) && this.filterLogMessagesBySearch(message, search)));
|
|
93
103
|
}
|
|
94
104
|
/**
|
|
95
105
|
* Check if the log message's level fulfills the level condition.
|
|
@@ -112,17 +122,20 @@ class LoggingViewerComponent {
|
|
|
112
122
|
* @returns true if check was successful
|
|
113
123
|
*/
|
|
114
124
|
filterLogMessagesBySearch(message, search) {
|
|
125
|
+
if (!message.logger || !message.methodName || !message.message) {
|
|
126
|
+
return false;
|
|
127
|
+
}
|
|
115
128
|
const searchRegex = new RegExp(search, "i");
|
|
116
129
|
return message.logger.search(searchRegex) >= 0 ||
|
|
117
130
|
message.methodName.search(searchRegex) >= 0 ||
|
|
118
131
|
message.message.join("|").search(searchRegex) >= 0;
|
|
119
132
|
}
|
|
120
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
121
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "
|
|
133
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: LoggingViewerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
134
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.0", type: LoggingViewerComponent, isStandalone: true, selector: "ionic-logging-viewer", inputs: { localStorageKeys: { classPropertyName: "localStorageKeys", publicName: "localStorageKeys", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: "<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>", styles: [""], dependencies: [{ kind: "ngmodule", type: IonicModule }, { kind: "component", type: i1.IonItem, selector: "ion-item", inputs: ["button", "color", "detail", "detailIcon", "disabled", "download", "href", "lines", "mode", "rel", "routerAnimation", "routerDirection", "target", "type"] }, { kind: "component", type: i1.IonLabel, selector: "ion-label", inputs: ["color", "mode", "position"] }, { kind: "component", type: i1.IonList, selector: "ion-list", inputs: ["inset", "lines", "mode"] }, { kind: "pipe", type: DatePipe, name: "date" }] }); }
|
|
122
135
|
}
|
|
123
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
136
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: LoggingViewerComponent, decorators: [{
|
|
124
137
|
type: Component,
|
|
125
|
-
args: [{ selector: "ionic-logging-viewer", imports: [IonicModule, DatePipe], template: "<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>" }]
|
|
138
|
+
args: [{ selector: "ionic-logging-viewer", imports: [IonicModule, DatePipe], template: "<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>" }]
|
|
126
139
|
}], ctorParameters: () => [], propDecorators: { localStorageKeys: [{ type: i0.Input, args: [{ isSignal: true, alias: "localStorageKeys", required: false }] }] } });
|
|
127
140
|
|
|
128
141
|
/**
|
|
@@ -139,6 +152,10 @@ class LoggingViewerLevelsComponent {
|
|
|
139
152
|
constructor() {
|
|
140
153
|
this.loggingService = inject(LoggingService);
|
|
141
154
|
this.loggingViewerFilterService = inject(LoggingViewerFilterService);
|
|
155
|
+
/**
|
|
156
|
+
* Selected level.
|
|
157
|
+
*/
|
|
158
|
+
this.selectedLevel = "";
|
|
142
159
|
this.logger = this.loggingService.getLogger("Ionic.Logging.Viewer.Levels.Component");
|
|
143
160
|
const methodName = "ctor";
|
|
144
161
|
this.logger.entry(methodName);
|
|
@@ -161,10 +178,10 @@ class LoggingViewerLevelsComponent {
|
|
|
161
178
|
this.loggingViewerFilterService.level.set(this.selectedLevel);
|
|
162
179
|
this.logger.exit(methodName);
|
|
163
180
|
}
|
|
164
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
165
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "
|
|
181
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: LoggingViewerLevelsComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
182
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.0", type: LoggingViewerLevelsComponent, isStandalone: true, selector: "ionic-logging-viewer-levels", ngImport: i0, template: "<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>", styles: [""], dependencies: [{ kind: "ngmodule", type: IonicModule }, { kind: "component", type: i1.IonLabel, selector: "ion-label", inputs: ["color", "mode", "position"] }, { kind: "component", type: i1.IonSegment, selector: "ion-segment", inputs: ["color", "disabled", "mode", "scrollable", "selectOnFocus", "swipeGesture", "value"] }, { kind: "component", type: i1.IonSegmentButton, selector: "ion-segment-button", inputs: ["contentId", "disabled", "layout", "mode", "type", "value"] }, { kind: "directive", type: i1.SelectValueAccessor, selector: "ion-select, ion-radio-group, ion-segment, ion-datetime" }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }] }); }
|
|
166
183
|
}
|
|
167
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
184
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: LoggingViewerLevelsComponent, decorators: [{
|
|
168
185
|
type: Component,
|
|
169
186
|
args: [{ selector: "ionic-logging-viewer-levels", imports: [IonicModule, FormsModule], template: "<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>" }]
|
|
170
187
|
}], ctorParameters: () => [] });
|
|
@@ -186,7 +203,12 @@ class LoggingViewerSearchComponent {
|
|
|
186
203
|
/**
|
|
187
204
|
* Placeholder to be shown in the empty search bar.
|
|
188
205
|
*/
|
|
189
|
-
this.placeholder = input(undefined,
|
|
206
|
+
this.placeholder = input(undefined, /* @ts-ignore */
|
|
207
|
+
...(ngDevMode ? [{ debugName: "placeholder" }] : /* istanbul ignore next */ []));
|
|
208
|
+
/**
|
|
209
|
+
* Current search value.
|
|
210
|
+
*/
|
|
211
|
+
this.search = "";
|
|
190
212
|
this.logger = this.loggingService.getLogger("Ionic.Logging.Viewer.Search.Component");
|
|
191
213
|
const methodName = "ctor";
|
|
192
214
|
this.logger.entry(methodName);
|
|
@@ -207,10 +229,10 @@ class LoggingViewerSearchComponent {
|
|
|
207
229
|
this.loggingViewerFilterService.search.set(this.search);
|
|
208
230
|
this.logger.exit(methodName);
|
|
209
231
|
}
|
|
210
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
211
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "
|
|
232
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: LoggingViewerSearchComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
233
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "22.0.0", type: LoggingViewerSearchComponent, isStandalone: true, selector: "ionic-logging-viewer-search", inputs: { placeholder: { classPropertyName: "placeholder", publicName: "placeholder", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: "<ion-searchbar placeholder=\"{{placeholder() || 'Search'}}\" [(ngModel)]=\"search\" [debounce]=\"1000\"\n (ionInput)=\"onSearchChanged()\"></ion-searchbar>", styles: ["ion-searchbar{padding-top:3px;padding-bottom:0}\n"], dependencies: [{ kind: "ngmodule", type: IonicModule }, { kind: "component", type: i1.IonSearchbar, selector: "ion-searchbar", inputs: ["animated", "autocapitalize", "autocomplete", "autocorrect", "cancelButtonIcon", "cancelButtonText", "clearIcon", "color", "debounce", "disabled", "enterkeyhint", "inputmode", "maxlength", "minlength", "mode", "name", "placeholder", "searchIcon", "showCancelButton", "showClearButton", "spellcheck", "type", "value"] }, { kind: "directive", type: i1.TextValueAccessor, selector: "ion-input:not([type=number]),ion-input-otp[type=text],ion-textarea,ion-searchbar" }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }] }); }
|
|
212
234
|
}
|
|
213
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
235
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: LoggingViewerSearchComponent, decorators: [{
|
|
214
236
|
type: Component,
|
|
215
237
|
args: [{ selector: "ionic-logging-viewer-search", imports: [IonicModule, FormsModule], template: "<ion-searchbar placeholder=\"{{placeholder() || 'Search'}}\" [(ngModel)]=\"search\" [debounce]=\"1000\"\n (ionInput)=\"onSearchChanged()\"></ion-searchbar>", styles: ["ion-searchbar{padding-top:3px;padding-bottom:0}\n"] }]
|
|
216
238
|
}], ctorParameters: () => [], propDecorators: { placeholder: [{ type: i0.Input, args: [{ isSignal: true, alias: "placeholder", required: false }] }] } });
|
|
@@ -235,20 +257,25 @@ class LoggingViewerModalComponent {
|
|
|
235
257
|
* Language to be used for the modal.
|
|
236
258
|
* Currently supported: en, de
|
|
237
259
|
*/
|
|
238
|
-
this.language = input(undefined,
|
|
260
|
+
this.language = input(undefined, /* @ts-ignore */
|
|
261
|
+
...(ngDevMode ? [{ debugName: "language" }] : /* istanbul ignore next */ []));
|
|
239
262
|
/**
|
|
240
263
|
* Translation to be used for the modal.
|
|
241
264
|
* If specified, the language is ignored.
|
|
242
265
|
*/
|
|
243
|
-
this.translation = input(undefined,
|
|
266
|
+
this.translation = input(undefined, /* @ts-ignore */
|
|
267
|
+
...(ngDevMode ? [{ debugName: "translation" }] : /* istanbul ignore next */ []));
|
|
244
268
|
/**
|
|
245
269
|
* Comma-separated list of localStorageKeys. If set, the logs get loaded from localStorage instead of memory.
|
|
246
270
|
*/
|
|
247
|
-
this.localStorageKeys = input(undefined,
|
|
271
|
+
this.localStorageKeys = input(undefined, /* @ts-ignore */
|
|
272
|
+
...(ngDevMode ? [{ debugName: "localStorageKeys" }] : /* istanbul ignore next */ []));
|
|
248
273
|
/**
|
|
249
274
|
* Flag showing a delete button, which removes all existing log messages.
|
|
250
275
|
*/
|
|
251
|
-
this.allowClearLogs = input(true,
|
|
276
|
+
this.allowClearLogs = input(true, /* @ts-ignore */
|
|
277
|
+
...(ngDevMode ? [{ debugName: "allowClearLogs" }] : /* istanbul ignore next */ []));
|
|
278
|
+
this.translations = {};
|
|
252
279
|
this.logger = this.
|
|
253
280
|
loggingService.getLogger("Ionic.Logging.Viewer.Modal.Component");
|
|
254
281
|
const methodName = "ctor";
|
|
@@ -325,8 +352,9 @@ class LoggingViewerModalComponent {
|
|
|
325
352
|
* Clear logs.
|
|
326
353
|
*/
|
|
327
354
|
clearLogs() {
|
|
328
|
-
|
|
329
|
-
|
|
355
|
+
const localStorageKeys = this.localStorageKeys();
|
|
356
|
+
if (localStorageKeys) {
|
|
357
|
+
for (const localStorageKey of localStorageKeys.split(",")) {
|
|
330
358
|
this.loggingService.removeLogMessagesFromLocalStorage(localStorageKey);
|
|
331
359
|
}
|
|
332
360
|
}
|
|
@@ -353,10 +381,10 @@ class LoggingViewerModalComponent {
|
|
|
353
381
|
return this.translations[LoggingViewerModalComponent.languageEn];
|
|
354
382
|
}
|
|
355
383
|
}
|
|
356
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
357
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "
|
|
384
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: LoggingViewerModalComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
385
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.0", type: LoggingViewerModalComponent, isStandalone: true, selector: "ionic-logging-viewer-modal", inputs: { language: { classPropertyName: "language", publicName: "language", isSignal: true, isRequired: false, transformFunction: null }, translation: { classPropertyName: "translation", publicName: "translation", isSignal: true, isRequired: false, transformFunction: null }, localStorageKeys: { classPropertyName: "localStorageKeys", publicName: "localStorageKeys", isSignal: true, isRequired: false, transformFunction: null }, allowClearLogs: { classPropertyName: "allowClearLogs", publicName: "allowClearLogs", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: "<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>", styles: ["ionic-logging-viewer-levels{width:100%;padding-left:12px;padding-right:12px}.clearLogs{padding-top:3px}\n"], dependencies: [{ kind: "ngmodule", type: IonicModule }, { kind: "component", type: i1.IonButton, selector: "ion-button", inputs: ["buttonType", "color", "disabled", "download", "expand", "fill", "form", "href", "mode", "rel", "routerAnimation", "routerDirection", "shape", "size", "strong", "target", "type"] }, { kind: "component", type: i1.IonButtons, selector: "ion-buttons", inputs: ["collapse"] }, { kind: "component", type: i1.IonContent, selector: "ion-content", inputs: ["color", "fixedSlotPlacement", "forceOverscroll", "fullscreen", "scrollEvents", "scrollX", "scrollY"] }, { kind: "component", type: i1.IonHeader, selector: "ion-header", inputs: ["collapse", "mode", "translucent"] }, { kind: "component", type: i1.IonIcon, selector: "ion-icon", inputs: ["color", "flipRtl", "icon", "ios", "lazy", "md", "mode", "name", "sanitize", "size", "src"] }, { kind: "component", type: i1.IonTitle, selector: "ion-title", inputs: ["color", "size"] }, { kind: "component", type: i1.IonToolbar, selector: "ion-toolbar", inputs: ["color", "mode"] }, { kind: "component", type: LoggingViewerSearchComponent, selector: "ionic-logging-viewer-search", inputs: ["placeholder"] }, { kind: "component", type: LoggingViewerLevelsComponent, selector: "ionic-logging-viewer-levels" }, { kind: "component", type: LoggingViewerComponent, selector: "ionic-logging-viewer", inputs: ["localStorageKeys"] }] }); }
|
|
358
386
|
}
|
|
359
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
387
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: LoggingViewerModalComponent, decorators: [{
|
|
360
388
|
type: Component,
|
|
361
389
|
args: [{ selector: "ionic-logging-viewer-modal", imports: [IonicModule, LoggingViewerSearchComponent, LoggingViewerLevelsComponent, LoggingViewerComponent], template: "<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>", styles: ["ionic-logging-viewer-levels{width:100%;padding-left:12px;padding-right:12px}.clearLogs{padding-top:3px}\n"] }]
|
|
362
390
|
}], ctorParameters: () => [], propDecorators: { language: [{ type: i0.Input, args: [{ isSignal: true, alias: "language", required: false }] }], translation: [{ type: i0.Input, args: [{ isSignal: true, alias: "translation", required: false }] }], localStorageKeys: [{ type: i0.Input, args: [{ isSignal: true, alias: "localStorageKeys", required: false }] }], allowClearLogs: [{ type: i0.Input, args: [{ isSignal: true, alias: "allowClearLogs", required: false }] }] } });
|
|
@@ -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/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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"}
|
|
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, 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 * <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>(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 * <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 = \"\";\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>(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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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "ionic-logging-viewer",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "22.0.0",
|
|
4
4
|
"description": "Viewer component for logs written by ionic-logging-service",
|
|
5
5
|
"author": {
|
|
6
6
|
"name": "Markus Wagner",
|
|
@@ -22,10 +22,10 @@
|
|
|
22
22
|
"tslib": "^2.3.1"
|
|
23
23
|
},
|
|
24
24
|
"peerDependencies": {
|
|
25
|
-
"@angular/common": ">=
|
|
26
|
-
"@angular/core": ">=
|
|
25
|
+
"@angular/common": ">=22.0.0",
|
|
26
|
+
"@angular/core": ">=22.0.0",
|
|
27
27
|
"@ionic/angular": ">=8.0.0",
|
|
28
|
-
"ionic-logging-service": "^
|
|
28
|
+
"ionic-logging-service": "^22.0.0",
|
|
29
29
|
"ionicons": ">=8.0.0"
|
|
30
30
|
},
|
|
31
31
|
"module": "fesm2022/ionic-logging-viewer.mjs",
|
|
@@ -39,5 +39,6 @@
|
|
|
39
39
|
"default": "./fesm2022/ionic-logging-viewer.mjs"
|
|
40
40
|
}
|
|
41
41
|
},
|
|
42
|
-
"sideEffects": false
|
|
42
|
+
"sideEffects": false,
|
|
43
|
+
"type": "module"
|
|
43
44
|
}
|
|
@@ -15,11 +15,11 @@ declare class LoggingViewerComponent {
|
|
|
15
15
|
/**
|
|
16
16
|
* Comma-separated list of localStorageKeys. If set, the logs get loaded from localStorage instead of memory.
|
|
17
17
|
*/
|
|
18
|
-
readonly localStorageKeys: i0.InputSignal<string>;
|
|
18
|
+
readonly localStorageKeys: i0.InputSignal<string | undefined>;
|
|
19
19
|
/**
|
|
20
20
|
* Log messages which fulfill the filter condition.
|
|
21
21
|
*/
|
|
22
|
-
logMessagesForDisplay: LogMessage[]
|
|
22
|
+
logMessagesForDisplay: i0.WritableSignal<LogMessage[]>;
|
|
23
23
|
private logger;
|
|
24
24
|
private logMessages;
|
|
25
25
|
/**
|
|
@@ -97,7 +97,7 @@ declare class LoggingViewerSearchComponent {
|
|
|
97
97
|
/**
|
|
98
98
|
* Placeholder to be shown in the empty search bar.
|
|
99
99
|
*/
|
|
100
|
-
readonly placeholder: i0.InputSignal<string>;
|
|
100
|
+
readonly placeholder: i0.InputSignal<string | undefined>;
|
|
101
101
|
/**
|
|
102
102
|
* Current search value.
|
|
103
103
|
*/
|
|
@@ -159,16 +159,16 @@ declare class LoggingViewerModalComponent implements OnInit {
|
|
|
159
159
|
* Language to be used for the modal.
|
|
160
160
|
* Currently supported: en, de
|
|
161
161
|
*/
|
|
162
|
-
readonly language: i0.InputSignal<string>;
|
|
162
|
+
readonly language: i0.InputSignal<string | undefined>;
|
|
163
163
|
/**
|
|
164
164
|
* Translation to be used for the modal.
|
|
165
165
|
* If specified, the language is ignored.
|
|
166
166
|
*/
|
|
167
|
-
readonly translation: i0.InputSignal<LoggingViewerTranslation>;
|
|
167
|
+
readonly translation: i0.InputSignal<LoggingViewerTranslation | undefined>;
|
|
168
168
|
/**
|
|
169
169
|
* Comma-separated list of localStorageKeys. If set, the logs get loaded from localStorage instead of memory.
|
|
170
170
|
*/
|
|
171
|
-
readonly localStorageKeys: i0.InputSignal<string>;
|
|
171
|
+
readonly localStorageKeys: i0.InputSignal<string | undefined>;
|
|
172
172
|
/**
|
|
173
173
|
* Flag showing a delete button, which removes all existing log messages.
|
|
174
174
|
*/
|