From e0cd8f421a973543b2e601e295653656357076aa Mon Sep 17 00:00:00 2001 From: Julia Gru <56249914+julczka@users.noreply.github.com> Date: Mon, 6 Feb 2023 10:30:02 +0100 Subject: [PATCH 01/57] add log search element --- .../log-search/log-search.elements.ts | 47 +++++++++++++++++++ .../logviewer-root-workspace.element.ts | 21 +++++++-- 2 files changed, 64 insertions(+), 4 deletions(-) create mode 100644 src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/log-search/log-search.elements.ts diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/log-search/log-search.elements.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/log-search/log-search.elements.ts new file mode 100644 index 0000000000..609c9d843b --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/log-search/log-search.elements.ts @@ -0,0 +1,47 @@ +import { UUITextStyles } from '@umbraco-ui/uui-css'; +import { css, html } from 'lit'; +import { customElement } from 'lit/decorators.js'; +import { UmbLitElement } from '@umbraco-cms/element'; +import '../../../../shared/components/workspace/actions/save/workspace-action-node-save.element.ts'; + +@customElement('umb-log-search-workspace') +export class UmbLogSearchWorkspaceElement extends UmbLitElement { + static styles = [ + UUITextStyles, + css` + :host { + display: block; + } + + #header { + display: flex; + padding: 0 var(--uui-size-space-6); + gap: var(--uui-size-space-4); + width: 100%; + } + `, + ]; + + render() { + return html` + + + + `; + } +} + +export default UmbLogSearchWorkspaceElement; + +declare global { + interface HTMLElementTagNameMap { + 'umb-log-search-workspace': UmbLogSearchWorkspaceElement; + } +} diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/logviewer-root/logviewer-root-workspace.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/logviewer-root/logviewer-root-workspace.element.ts index f3f77a5ded..daefbd2423 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/logviewer-root/logviewer-root-workspace.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/logviewer-root/logviewer-root-workspace.element.ts @@ -1,13 +1,26 @@ -import { html, LitElement } from 'lit'; +import { css, html, LitElement } from 'lit'; import { customElement } from 'lit/decorators.js'; @customElement('umb-logviewer-root-workspace') export class UmbLogViewerRootWorkspaceElement extends LitElement { + static styles = [ + css` + :host { + display: block; + } + + #header { + display: flex; + padding: 0 var(--uui-size-space-6); + gap: var(--uui-size-space-4); + width: 100%; + } + `, + ]; render() { return html` -
-

LogViewer Root Workspace

-
+ + `; } } From bba7b9b7850d7ac509d5eb14b680e2ca60e54570 Mon Sep 17 00:00:00 2001 From: Julia Gru <56249914+julczka@users.noreply.github.com> Date: Tue, 7 Feb 2023 14:28:44 +0100 Subject: [PATCH 02/57] create repository, store and source I have no clue what i'm doing lol --- .../libs/observable-api/array-state.ts | 1 - .../workspace/data/log-search.repository.ts | 79 +++++++++++++++++++ .../workspace/data/log-search.store.ts | 47 +++++++++++ .../logviewer/workspace/data/sources/index.ts | 11 +++ .../data/sources/log-search.server.data.ts | 33 ++++++++ .../logviewer-root-workspace.element.ts | 3 +- src/Umbraco.Web.UI.Client/vite.config.ts | 3 + 7 files changed, 175 insertions(+), 2 deletions(-) create mode 100644 src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/data/log-search.repository.ts create mode 100644 src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/data/log-search.store.ts create mode 100644 src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/data/sources/index.ts create mode 100644 src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/data/sources/log-search.server.data.ts diff --git a/src/Umbraco.Web.UI.Client/libs/observable-api/array-state.ts b/src/Umbraco.Web.UI.Client/libs/observable-api/array-state.ts index 303e3b3874..f8b46880ba 100644 --- a/src/Umbraco.Web.UI.Client/libs/observable-api/array-state.ts +++ b/src/Umbraco.Web.UI.Client/libs/observable-api/array-state.ts @@ -10,7 +10,6 @@ import { pushToUniqueArray } from "./push-to-unique-array.method"; * * The ArrayState provides methods to append data when the data is an Object. */ - export class ArrayState extends DeepState { diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/data/log-search.repository.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/data/log-search.repository.ts new file mode 100644 index 0000000000..45d8997c7c --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/data/log-search.repository.ts @@ -0,0 +1,79 @@ +import { UmbLogSearchesServerDataSource } from './sources/log-search.server.data'; +import { UmbLogSearchesStore, UMB_LOG_SEARCHES_STORE_CONTEXT_TOKEN } from './log-search.store'; +import { ProblemDetails, Template } from '@umbraco-cms/backend-api'; +import { UmbContextConsumerController } from '@umbraco-cms/context-api'; +import { UmbControllerHostInterface } from '@umbraco-cms/controller'; +import { UmbNotificationService, UMB_NOTIFICATION_SERVICE_CONTEXT_TOKEN } from '@umbraco-cms/notification'; + +// Move to documentation / JSdoc +/* We need to create a new instance of the repository from within the element context. We want the notifications to be displayed in the right context. */ +// element -> context -> repository -> (store) -> data source +// All methods should be async and return a promise. Some methods might return an observable as part of the promise response. +export class UmbLogSearchRepository { + #host: UmbControllerHostInterface; + #dataSource: UmbLogSearchesServerDataSource; + #searchStore?: UmbLogSearchesStore; + #notificationService?: UmbNotificationService; + #initResolver?: () => void; + #initialized = false; + + constructor(host: UmbControllerHostInterface) { + this.#host = host; + this.#dataSource = new UmbLogSearchesServerDataSource(this.#host); + + new UmbContextConsumerController(this.#host, UMB_LOG_SEARCHES_STORE_CONTEXT_TOKEN, (instance) => { + this.#searchStore = instance; + this.#checkIfInitialized(); + }); + + new UmbContextConsumerController(this.#host, UMB_NOTIFICATION_SERVICE_CONTEXT_TOKEN, (instance) => { + this.#notificationService = instance; + this.#checkIfInitialized(); + }); + } + + #init() { + // TODO: This would only works with one user of this method. If two, the first one would be forgotten, but maybe its alright for now as I guess this is temporary. + return new Promise((resolve) => { + this.#initialized ? resolve() : (this.#initResolver = resolve); + }); + } + + #checkIfInitialized() { + if (this.#searchStore && this.#notificationService) { + this.#initialized = true; + this.#initResolver?.(); + } + } + + async getSavedSearches() { + await this.#init(); + + return this.#dataSource.getLogViewerSavedSearch(); + } + + // async insert(template: Template) { + // await this.#init(); + + // // TODO: should we show a notification if the template is missing? + // // Investigate what is best for Acceptance testing, cause in that perspective a thrown error might be the best choice? + // if (!template) { + // const error: ProblemDetails = { title: 'Template is missing' }; + // return { error }; + // } + + // const { error } = await this.#dataSource.insert(template); + + // if (!error) { + // const notification = { data: { message: `Template created` } }; + // this.#notificationService?.peek('positive', notification); + // } + + // // TODO: we currently don't use the detail store for anything. + // // Consider to look up the data before fetching from the server + // this.#searchStore?.append(template); + // // TODO: Update tree store with the new item? + + // return { error }; + // } +} diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/data/log-search.store.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/data/log-search.store.ts new file mode 100644 index 0000000000..990ec2de4f --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/data/log-search.store.ts @@ -0,0 +1,47 @@ +import { UmbContextToken } from '@umbraco-cms/context-api'; +import { ArrayState } from '@umbraco-cms/observable-api'; +import { UmbStoreBase } from '@umbraco-cms/store'; +import { SavedLogSearch } from '@umbraco-cms/backend-api'; +import { UmbControllerHostInterface } from '@umbraco-cms/controller'; + +/** + * @export + * @class UmbLogSearchesStore + * @extends {UmbStoreBase} + * @description - Data Store for log searches + */ +export class UmbLogSearchesStore extends UmbStoreBase { + #data = new ArrayState([], (x) => x.name); + + /** + * Creates an instance of UmbLogSearchesStore. + * @param {UmbControllerHostInterface} host + * @memberof UmbLogSearchesStore + */ + constructor(host: UmbControllerHostInterface) { + super(host, UmbLogSearchesStore.name); + } + + /** + * Append a template to the store + * @param {SavedLogSearch} search + * @memberof UmbLogSearchesStore + */ + append(search: SavedLogSearch) { + this.#data.append([search]); + } + + /** + * Removes templates in the store with the given uniques + * @param {string[]} searchNames + * @memberof UmbLogSearchesStore + */ + remove(searchNames: string[]) { + this.#data.remove(searchNames); + } +} + +export const UMB_LOG_SEARCHES_STORE_CONTEXT_TOKEN = new UmbContextToken( + UmbLogSearchesStore.name, + 'LogSearchesStore TOKEN XXX' +); diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/data/sources/index.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/data/sources/index.ts new file mode 100644 index 0000000000..6c42bd1510 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/data/sources/index.ts @@ -0,0 +1,11 @@ +import { PagedSavedLogSearch, Template } from '@umbraco-cms/backend-api'; +import type { DataSourceResponse } from '@umbraco-cms/models'; + +interface skipNtake { + skip?: number; + take?: number; +} + +export interface LogSearchDataSource { + getLogViewerSavedSearch(skipNtake: skipNtake): Promise>; +} diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/data/sources/log-search.server.data.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/data/sources/log-search.server.data.ts new file mode 100644 index 0000000000..a1be0cb494 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/data/sources/log-search.server.data.ts @@ -0,0 +1,33 @@ +import { LogSearchDataSource } from '.'; +import { LogViewerResource } from '@umbraco-cms/backend-api'; +import { UmbControllerHostInterface } from '@umbraco-cms/controller'; +import { tryExecuteAndNotify } from '@umbraco-cms/resources'; + +/** + * A data source for the Template detail that fetches data from the server + * @export + * @class UmbLogSearchesServerDataSource + * @implements {TemplateDetailDataSource} + */ +export class UmbLogSearchesServerDataSource implements LogSearchDataSource { + #host: UmbControllerHostInterface; + + /** + * Creates an instance of UmbLogSearchesServerDataSource. + * @param {UmbControllerHostInterface} host + * @memberof UmbLogSearchesServerDataSource + */ + constructor(host: UmbControllerHostInterface) { + this.#host = host; + } + + /** + * Gets the user's saved searches + * @param {string} key + * @return {*} + * @memberof UmbLogSearchesServerDataSource + */ + async getLogViewerSavedSearch() { + return await tryExecuteAndNotify(this.#host, LogViewerResource.getLogViewerSavedSearch({})); + } +} diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/logviewer-root/logviewer-root-workspace.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/logviewer-root/logviewer-root-workspace.element.ts index daefbd2423..3c469e898b 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/logviewer-root/logviewer-root-workspace.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/logviewer-root/logviewer-root-workspace.element.ts @@ -19,7 +19,8 @@ export class UmbLogViewerRootWorkspaceElement extends LitElement { ]; render() { return html` - + + hello `; } diff --git a/src/Umbraco.Web.UI.Client/vite.config.ts b/src/Umbraco.Web.UI.Client/vite.config.ts index a9a8182fc9..611ff2686b 100644 --- a/src/Umbraco.Web.UI.Client/vite.config.ts +++ b/src/Umbraco.Web.UI.Client/vite.config.ts @@ -7,6 +7,9 @@ export default defineConfig({ build: { sourcemap: true, }, + server: { + open: '/backoffice', + }, plugins: [ viteStaticCopy({ targets: [ From b25bf990e15556f0e49f68550f1adda109947417 Mon Sep 17 00:00:00 2001 From: Julia Gru <56249914+julczka@users.noreply.github.com> Date: Thu, 9 Feb 2023 11:18:59 +0100 Subject: [PATCH 03/57] get saved search data --- .../src/backoffice/backoffice.element.ts | 2 + .../workspace/data/log-search.repository.ts | 1 + .../logviewer-root-workspace.element.ts | 42 +- .../logviewer-root/logviewer-root.context.ts | 26 ++ .../src/core/mocks/browser-handlers.ts | 2 + .../src/core/mocks/data/data.ts | 4 + .../src/core/mocks/data/log-viewer.data.ts | 374 ++++++++++++++++++ .../core/mocks/domains/log-viewer.handlers.ts | 60 +++ 8 files changed, 503 insertions(+), 8 deletions(-) create mode 100644 src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/logviewer-root/logviewer-root.context.ts create mode 100644 src/Umbraco.Web.UI.Client/src/core/mocks/data/log-viewer.data.ts create mode 100644 src/Umbraco.Web.UI.Client/src/core/mocks/domains/log-viewer.handlers.ts diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/backoffice.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/backoffice.element.ts index 056599ad87..a1d1260bc9 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/backoffice.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/backoffice.element.ts @@ -36,6 +36,7 @@ import { UmbTemplateTreeStore } from './templating/templates/tree/data/template. import { UmbTemplateDetailStore } from './templating/templates/workspace/data/template.detail.store'; import { UmbThemeContext } from './themes/theme.context'; import { UmbLanguageStore } from './settings/languages/language.store'; +import { UmbLogSearchesStore } from './settings/logviewer/workspace/data/log-search.store'; import { UmbNotificationService, UMB_NOTIFICATION_SERVICE_CONTEXT_TOKEN } from '@umbraco-cms/notification'; import '@umbraco-cms/router'; @@ -101,6 +102,7 @@ export class UmbBackofficeElement extends UmbLitElement { new UmbTemplateTreeStore(this); new UmbTemplateDetailStore(this); new UmbLanguageStore(this); + new UmbLogSearchesStore(this); this.provideContext(UMB_BACKOFFICE_CONTEXT_TOKEN, new UmbBackofficeContext()); this.provideContext(UMB_CURRENT_USER_HISTORY_STORE_CONTEXT_TOKEN, new UmbCurrentUserHistoryStore()); diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/data/log-search.repository.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/data/log-search.repository.ts index 45d8997c7c..7ee1c42a54 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/data/log-search.repository.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/data/log-search.repository.ts @@ -30,6 +30,7 @@ export class UmbLogSearchRepository { this.#notificationService = instance; this.#checkIfInitialized(); }); + } #init() { diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/logviewer-root/logviewer-root-workspace.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/logviewer-root/logviewer-root-workspace.element.ts index 3c469e898b..445c9237d6 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/logviewer-root/logviewer-root-workspace.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/logviewer-root/logviewer-root-workspace.element.ts @@ -1,8 +1,11 @@ -import { css, html, LitElement } from 'lit'; -import { customElement } from 'lit/decorators.js'; +import { css, html } from 'lit'; +import { customElement, state } from 'lit/decorators.js'; +import { UmbLogViewerWorkspaceContext } from './logviewer-root.context'; +import { UmbLitElement } from '@umbraco-cms/element'; +import { SavedLogSearch } from '@umbraco-cms/backend-api'; @customElement('umb-logviewer-root-workspace') -export class UmbLogViewerRootWorkspaceElement extends LitElement { +export class UmbLogViewerRootWorkspaceElement extends UmbLitElement { static styles = [ css` :host { @@ -17,12 +20,35 @@ export class UmbLogViewerRootWorkspaceElement extends LitElement { } `, ]; + + @state() + private _savedSearches: SavedLogSearch[] = []; + + load(): void { + // Not relevant for this workspace -added to prevent the error from popping up + console.log('Loading something from somewhere'); + } + + create(): void { + // Not relevant for this workspace + } + + #logViewerContext = new UmbLogViewerWorkspaceContext(this); + + async connectedCallback() { + super.connectedCallback(); + + this.observe(this.#logViewerContext.savedSearches, (savedSearches) => { + + this._savedSearches = savedSearches ?? []; + }); + await this.#logViewerContext.getSavedSearches(); + } + render() { - return html` - - hello - - `; + return html` + ${this._savedSearches.map((search) => html`
${search.name}
`)} bloblllo +
`; } } diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/logviewer-root/logviewer-root.context.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/logviewer-root/logviewer-root.context.ts new file mode 100644 index 0000000000..2071444aa9 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/logviewer-root/logviewer-root.context.ts @@ -0,0 +1,26 @@ +import { createObservablePart, DeepState } from '@umbraco-cms/observable-api'; +import { PagedSavedLogSearch } from '@umbraco-cms/backend-api'; +import { UmbControllerHostInterface } from '@umbraco-cms/controller'; +import { UmbLogSearchRepository } from '../data/log-search.repository'; + +export class UmbLogViewerWorkspaceContext { + #host: UmbControllerHostInterface; + #repository: UmbLogSearchRepository; + + #data = new DeepState(undefined); + data = this.#data.asObservable(); + savedSearches = createObservablePart(this.#data, (data) => data?.items); + + constructor(host: UmbControllerHostInterface) { + this.#host = host; + this.#repository = new UmbLogSearchRepository(this.#host); + } + + async getSavedSearches() { + const { data } = await this.#repository.getSavedSearches(); + + if (data) { + this.#data.next(data); + } + } +} diff --git a/src/Umbraco.Web.UI.Client/src/core/mocks/browser-handlers.ts b/src/Umbraco.Web.UI.Client/src/core/mocks/browser-handlers.ts index ff8ad5b646..2cf5a50bcd 100644 --- a/src/Umbraco.Web.UI.Client/src/core/mocks/browser-handlers.ts +++ b/src/Umbraco.Web.UI.Client/src/core/mocks/browser-handlers.ts @@ -22,6 +22,7 @@ import { handlers as memberTypeHandlers } from './domains/member-type.handlers'; import { handlers as templateHandlers } from './domains/template.handlers'; import { handlers as languageHandlers } from './domains/language.handlers'; import { handlers as redirectManagementHandlers } from './domains/redirect-management.handlers'; +import { handlers as logViewerHandlers } from './domains/log-viewer.handlers'; const handlers = [ serverHandlers.serverVersionHandler, @@ -48,6 +49,7 @@ const handlers = [ ...templateHandlers, ...languageHandlers, ...redirectManagementHandlers, + ...logViewerHandlers, ]; switch (import.meta.env.VITE_UMBRACO_INSTALL_STATUS) { diff --git a/src/Umbraco.Web.UI.Client/src/core/mocks/data/data.ts b/src/Umbraco.Web.UI.Client/src/core/mocks/data/data.ts index 7b405ceed8..8f08949ada 100644 --- a/src/Umbraco.Web.UI.Client/src/core/mocks/data/data.ts +++ b/src/Umbraco.Web.UI.Client/src/core/mocks/data/data.ts @@ -5,4 +5,8 @@ export class UmbData { constructor(data: Array) { this.data = data; } + + get total() { + return this.data.length; + } } diff --git a/src/Umbraco.Web.UI.Client/src/core/mocks/data/log-viewer.data.ts b/src/Umbraco.Web.UI.Client/src/core/mocks/data/log-viewer.data.ts new file mode 100644 index 0000000000..b01360d3ef --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/core/mocks/data/log-viewer.data.ts @@ -0,0 +1,374 @@ +import { LogTemplate, SavedLogSearch } from '@umbraco-cms/backend-api'; +import { UmbData } from './data'; + +// Temp mocked database +class UmbLogviewerSearchesData extends UmbData { + constructor(data: SavedLogSearch[]) { + super(data); + } + + // skip can be number or null + getSavedSearches(skip = 0, take = this.data.length): Array { + return this.data.slice(skip, take); + } + + getByName(name: string) { + return this.data.find((search) => search.name === name); + } +} + +class UmbLogviewerTemplatesData extends UmbData { + constructor(data: LogTemplate[]) { + super(data); + } + + // skip can be number or null + getTemplates(skip = 0, take = this.data.length): Array { + return this.data.slice(skip, take); + } +} + +export const savedSearches: Array = [ + { + name: 'Find all logs where the Level is NOT Verbose and NOT Debug', + query: "Not(@Level='Verbose') and Not(@Level='Debug')", + }, + { + name: 'Find all logs that has an exception property (Warning, Error & Fatal with Exceptions)', + query: 'Has(@Exception)', + }, + { + name: "Find all logs that have the property 'Duration'", + query: 'Has(Duration)', + }, + { + name: "Find all logs that have the property 'Duration' and the duration is greater than 1000ms", + query: 'Has(Duration) and Duration > 1000', + }, + { + name: "Find all logs that are from the namespace 'Umbraco.Core'", + query: "StartsWith(SourceContext, 'Umbraco.Core')", + }, + { + name: 'Find all logs that use a specific log message template', + query: "@messageTemplate = '[Timing {TimingId}] {EndMessage} ({TimingDuration}ms)'", + }, + { + name: 'Find logs where one of the items in the SortedComponentTypes property array is equal to', + query: "SortedComponentTypes[?] = 'Umbraco.Web.Search.ExamineComponent'", + }, + { + name: 'Find logs where one of the items in the SortedComponentTypes property array contains', + query: "Contains(SortedComponentTypes[?], 'DatabaseServer')", + }, + { + name: 'Find all logs that the message has localhost in it with SQL like', + query: "@Message like '%localhost%'", + }, + { + name: "Find all logs that the message that starts with 'end' in it with SQL like", + query: "@Message like 'end%'", + }, + { + name: 'bla', + query: 'bla bla', + }, +]; + +export const messageTemplates: LogTemplate[] = [ + { + messageTemplate: 'Create Foreign Key:\n {Sql}', + count: 90, + }, + { + messageTemplate: 'Create Index:\n {Sql}', + count: 86, + }, + { + messageTemplate: 'Create table:\n {Sql}', + count: 82, + }, + { + messageTemplate: 'Create Primary Key:\n {Sql}', + count: 78, + }, + { + messageTemplate: 'Creating data in {TableName}', + count: 58, + }, + { + messageTemplate: 'Completed creating data in {TableName}', + count: 58, + }, + { + messageTemplate: 'New table {TableName} was created', + count: 58, + }, + { + messageTemplate: 'At {OrigState}', + count: 18, + }, + { + messageTemplate: 'SQL [{ContextIndex}]: {Sql}', + count: 15, + }, + { + messageTemplate: '{StartMessage} [Timing {TimingId}]', + count: 14, + }, + { + messageTemplate: '{EndMessage} ({Duration}ms) [Timing {TimingId}]', + count: 14, + }, + { + messageTemplate: 'Execute {MigrationType}', + count: 13, + }, + { + messageTemplate: "Assigned Deploy permission letter '{Permission}' to user group '{UserGroupAlias}'", + count: 6, + }, + { + messageTemplate: "Starting '{MigrationName}'...", + count: 5, + }, + { + messageTemplate: 'Done (pending scope completion).', + count: 5, + }, + { + messageTemplate: + "Umbraco Forms scheduled record deletion task will not run as it has been not enabled via configuration. To enable, set the configuration value at 'Umbraco:Forms:Options:ScheduledRecordDeletion:Enabled' to true.", + count: 5, + }, + { + messageTemplate: + 'Mapped Umbraco.Cloud.Deployment.SiteExtension.Messages.External.Git.ApplyChangesFromWwwRootToRepositoryCommand -> "siteext-input-queue"', + count: 3, + }, + { + messageTemplate: 'Bus "Rebus 1" started', + count: 3, + }, + { + messageTemplate: 'Acquiring MainDom.', + count: 3, + }, + { + messageTemplate: 'Acquired MainDom.', + count: 3, + }, + { + messageTemplate: 'Profiler is VoidProfiler, not profiling (must run debug mode to profile).', + count: 3, + }, + { + messageTemplate: + "Found single permission letter for '{LegacyPermission}' on user group '{UserGroupAlias}', assuming this is the 'Notifications' permission instead of the Deploy 'Queue for transfer' permission", + count: 3, + }, + { + messageTemplate: 'Started :: Running {edition} edition', + count: 3, + }, + { + messageTemplate: + "File system watcher for deploy events started with filter 'deploy*' and notify filter 'FileName'.", + count: 3, + }, + { + messageTemplate: 'Application started. Press Ctrl+C to shut down.', + count: 3, + }, + { + messageTemplate: 'Hosting environment: {envName}', + count: 3, + }, + { + messageTemplate: 'Content root path: {contentRoot}', + count: 3, + }, + { + messageTemplate: + 'Database migration step not completed: could not create primary key constraint on UFRecordDataLongString as a primary key already exists.', + count: 2, + }, + { + messageTemplate: + 'No last synced Id found, this generally means this is a new server/install. A cold boot will be triggered.', + count: 2, + }, + { + messageTemplate: 'Deploy permissions updated and saved', + count: 2, + }, + { + messageTemplate: 'Starting :: Running on Umbraco Cloud', + count: 2, + }, + { + messageTemplate: + 'Registered with MainDom, localContentDbExists? {LocalContentDbExists}, localMediaDbExists? {LocalMediaDbExists}', + count: 2, + }, + { + messageTemplate: 'Creating the content store, localContentDbExists? {LocalContentDbExists}', + count: 2, + }, + { + messageTemplate: 'Creating the media store, localMediaDbExists? {LocalMediaDbExists}', + count: 2, + }, + { + messageTemplate: 'Stopping ({SignalSource})', + count: 2, + }, + { + messageTemplate: 'Released ({SignalSource})', + count: 2, + }, + { + messageTemplate: 'Application is shutting down...', + count: 2, + }, + { + messageTemplate: 'Bus "Rebus 1" stopped', + count: 2, + }, + { + messageTemplate: 'Queued Hosted Service is stopping.', + count: 2, + }, + { + messageTemplate: 'User logged will be logged out due to timeout: {Username}, IP Address: {IPAddress}', + count: 2, + }, + { + messageTemplate: 'Starting unattended install.', + count: 1, + }, + { + messageTemplate: 'Unattended install completed.', + count: 1, + }, + { + messageTemplate: 'Configured with Azure database.', + count: 1, + }, + { + messageTemplate: 'Initialized the SqlServer database schema.', + count: 1, + }, + { + messageTemplate: + 'Database migration step not completed: could not create primary key constraint on UFRecordDataBit as a primary key already exists.', + count: 1, + }, + { + messageTemplate: + 'Database migration step not completed: could not create primary key constraint on UFRecordDataDateTime as a primary key already exists.', + count: 1, + }, + { + messageTemplate: + 'Database migration step not completed: could not create primary key constraint on UFRecordDataInteger as a primary key already exists.', + count: 1, + }, + { + messageTemplate: + 'Database migration step not completed: could not create primary key constraint on UFUserFormSecurity as a primary key already exists.', + count: 1, + }, + { + messageTemplate: + 'Database migration step not completed: could not create primary key constraint on UFUserGroupSecurity as a primary key already exists.', + count: 1, + }, + { + messageTemplate: + 'Database migration step not completed: could not create primary key constraint on UFUserGroupFormSecurity as a primary key already exists.', + count: 1, + }, + { + messageTemplate: + 'Database NuCache was serialized using {CurrentSerializer}. Currently configured NuCache serializer {Serializer}. Rebuilding Nucache', + count: 1, + }, + { + messageTemplate: 'Starting :: Running locally', + count: 1, + }, + { + messageTemplate: 'No XML encryptor configured. Key {KeyId:B} may be persisted to storage in unencrypted form.', + count: 1, + }, + { + messageTemplate: 'Started :: Transitioned from azure init marker to deploy marker', + count: 1, + }, + { + messageTemplate: 'Found {diskReadTrigger} or {diskReadOnStartTrigger} trigger file when starting, processing...', + count: 1, + }, + { + messageTemplate: 'Beginning deployment {id}.', + count: 1, + }, + { + messageTemplate: 'Suspend scheduled publishing.', + count: 1, + }, + { + messageTemplate: 'Preparing', + count: 1, + }, + { + messageTemplate: 'Reading state', + count: 1, + }, + { + messageTemplate: 'No artifacts', + count: 1, + }, + { + messageTemplate: 'Restore caches and indexes', + count: 1, + }, + { + messageTemplate: 'Resume scheduled publishing.', + count: 1, + }, + { + messageTemplate: 'Complete', + count: 1, + }, + { + messageTemplate: 'Deployment {id} completed.', + count: 1, + }, + { + messageTemplate: 'Work Status {WorkStatus}.', + count: 1, + }, + { + messageTemplate: 'Released from MainDom', + count: 1, + }, + { + messageTemplate: "Keep alive failed (at '{keepAlivePingUrl}').", + count: 1, + }, + { + messageTemplate: 'Adding examine event handlers for {RegisteredIndexers} index providers.', + count: 1, + }, + { + messageTemplate: 'Document {ContentName} (id={ContentId}) has been published.', + count: 1, + }, +]; + +export const umbLogviewerData = { + searches: new UmbLogviewerSearchesData(savedSearches), + templates: new UmbLogviewerTemplatesData(messageTemplates), +}; diff --git a/src/Umbraco.Web.UI.Client/src/core/mocks/domains/log-viewer.handlers.ts b/src/Umbraco.Web.UI.Client/src/core/mocks/domains/log-viewer.handlers.ts new file mode 100644 index 0000000000..72c83168b6 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/core/mocks/domains/log-viewer.handlers.ts @@ -0,0 +1,60 @@ +import { rest } from 'msw'; +import { umbLogviewerData } from '../data/log-viewer.data'; +import { umbracoPath } from '@umbraco-cms/utils'; +import { SavedLogSearch } from '@umbraco-cms/backend-api'; + +// TODO: add schema +export const handlers = [ + //#region Searches + rest.get(umbracoPath('/log-viewer/saved-search'), (req, res, ctx) => { + const skip = req.url.searchParams.get('skip'); + const skipNumber = skip ? Number.parseInt(skip) : undefined; + const take = req.url.searchParams.get('take'); + const takeNumber = take ? Number.parseInt(take) : undefined; + + const items = umbLogviewerData.searches.getSavedSearches(skipNumber, takeNumber); + + const response = { + total: items.length, + items, + }; + + return res(ctx.delay(), ctx.status(200), ctx.json(response)); + }), + + rest.get(umbracoPath('/log-viewer/saved-search/:name'), (req, res, ctx) => { + const name = req.params.key as string; + + if (!name) return; + + const item = umbLogviewerData.searches.getByName(name); + return res(ctx.delay(), ctx.status(200), ctx.json(item)); + }), + + rest.post(umbracoPath('/log-viewer/saved-search'), async (req, res, ctx) => { + return res(ctx.delay(), ctx.status(200)); + }), + + rest.delete(umbracoPath('/log-viewer/saved-search/:name'), async (req, res, ctx) => { + return res(ctx.status(200)); + }), + //#endregion + + //#region Temaplates + rest.get(umbracoPath('/log-viewer/message-template'), (req, res, ctx) => { + const skip = req.url.searchParams.get('skip'); + const skipNumber = skip ? Number.parseInt(skip) : undefined; + const take = req.url.searchParams.get('take'); + const takeNumber = take ? Number.parseInt(take) : undefined; + + const items = umbLogviewerData.templates.getTemplates(skipNumber, takeNumber); + + const response = { + total: umbLogviewerData.templates.total, + items, + }; + + return res(ctx.delay(), ctx.status(200), ctx.json(response)); + }), + //#endregion +]; From 09876fb0fdf75c3bccdfb8379d05e8e1c5ac2cfb Mon Sep 17 00:00:00 2001 From: Julia Gru <56249914+julczka@users.noreply.github.com> Date: Fri, 10 Feb 2023 13:33:47 +0100 Subject: [PATCH 04/57] layout --- .../workspace/data/log-search.repository.ts | 5 +- .../logviewer/workspace/data/sources/index.ts | 18 +++-- .../data/sources/log-search.server.data.ts | 42 ++++++++-- .../logviewer-root-workspace.element.ts | 77 ++++++++++++++++++- .../logviewer-root/logviewer-root.context.ts | 2 +- 5 files changed, 126 insertions(+), 18 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/data/log-search.repository.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/data/log-search.repository.ts index 7ee1c42a54..a321fa0b84 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/data/log-search.repository.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/data/log-search.repository.ts @@ -30,7 +30,6 @@ export class UmbLogSearchRepository { this.#notificationService = instance; this.#checkIfInitialized(); }); - } #init() { @@ -47,10 +46,10 @@ export class UmbLogSearchRepository { } } - async getSavedSearches() { + async getSavedSearches({ skip, take }: { skip: number; take: number }) { await this.#init(); - return this.#dataSource.getLogViewerSavedSearch(); + return this.#dataSource.getAllSavedSearches({ skip, take }); } // async insert(template: Template) { diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/data/sources/index.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/data/sources/index.ts index 6c42bd1510..1977750f66 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/data/sources/index.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/data/sources/index.ts @@ -1,11 +1,15 @@ -import { PagedSavedLogSearch, Template } from '@umbraco-cms/backend-api'; +import { PagedSavedLogSearch, SavedLogSearch } from '@umbraco-cms/backend-api'; import type { DataSourceResponse } from '@umbraco-cms/models'; -interface skipNtake { - skip?: number; - take?: number; -} - export interface LogSearchDataSource { - getLogViewerSavedSearch(skipNtake: skipNtake): Promise>; + getAllSavedSearches({ + skip, + take, + }: { + skip?: number; + take?: number; + }): Promise>; + getSavedSearchByName({ name }: { name: string }): Promise>; + deleteSavedSearchByName({ name }: { name: string }): Promise>; + postLogViewerSavedSearch({ requestBody }: { requestBody?: SavedLogSearch }): Promise>; } diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/data/sources/log-search.server.data.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/data/sources/log-search.server.data.ts index a1be0cb494..f880e3d0d1 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/data/sources/log-search.server.data.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/data/sources/log-search.server.data.ts @@ -1,5 +1,5 @@ import { LogSearchDataSource } from '.'; -import { LogViewerResource } from '@umbraco-cms/backend-api'; +import { LogViewerResource, SavedLogSearch } from '@umbraco-cms/backend-api'; import { UmbControllerHostInterface } from '@umbraco-cms/controller'; import { tryExecuteAndNotify } from '@umbraco-cms/resources'; @@ -22,12 +22,44 @@ export class UmbLogSearchesServerDataSource implements LogSearchDataSource { } /** - * Gets the user's saved searches - * @param {string} key + * Grabs all the log viewer saved searches from the server + * + * @param {{ skip?: number; take?: number }} { skip = 0, take = 100 } * @return {*} * @memberof UmbLogSearchesServerDataSource */ - async getLogViewerSavedSearch() { - return await tryExecuteAndNotify(this.#host, LogViewerResource.getLogViewerSavedSearch({})); + async getAllSavedSearches({ skip = 0, take = 100 }: { skip?: number; take?: number }) { + return await tryExecuteAndNotify(this.#host, LogViewerResource.getLogViewerSavedSearch({ skip, take })); + } + /** + * Get a log viewer saved search by name from the server + * + * @param {{ name: string }} { name } + * @return {*} + * @memberof UmbLogSearchesServerDataSource + */ + async getSavedSearchByName({ name }: { name: string }) { + return await tryExecuteAndNotify(this.#host, LogViewerResource.getLogViewerSavedSearchByName({ name })); + } + + /** + * Post a new log viewer saved search to the server + * + * @param {{ requestBody?: SavedLogSearch }} { requestBody } + * @return {*} + * @memberof UmbLogSearchesServerDataSource + */ + async postLogViewerSavedSearch({ requestBody }: { requestBody?: SavedLogSearch }) { + return await tryExecuteAndNotify(this.#host, LogViewerResource.postLogViewerSavedSearch({ requestBody })); + } + /** + * Remove a log viewer saved search by name from the server + * + * @param {{ name: string }} { name } + * @return {*} + * @memberof UmbLogSearchesServerDataSource + */ + async deleteSavedSearchByName({ name }: { name: string }) { + return await tryExecuteAndNotify(this.#host, LogViewerResource.deleteLogViewerSavedSearchByName({ name })); } } diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/logviewer-root/logviewer-root-workspace.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/logviewer-root/logviewer-root-workspace.element.ts index 445c9237d6..a8099f64cd 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/logviewer-root/logviewer-root-workspace.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/logviewer-root/logviewer-root-workspace.element.ts @@ -18,6 +18,60 @@ export class UmbLogViewerRootWorkspaceElement extends UmbLitElement { gap: var(--uui-size-space-4); width: 100%; } + + #logviewer-layout { + margin: 20px; + } + + #logviewer-layout { + height: calc(100vh - 215px); + display: grid; + grid-template-columns: 4fr 1fr; + grid-template-rows: 1fr 1fr; + gap: 20px 20px; + grid-auto-flow: row; + grid-template-areas: + 'saved-searches info' + 'common-messages info'; + } + + #info { + grid-area: info; + align-self: start; + display: grid; + grid-template-columns: repeat(2, 1fr); + grid-template-rows: repeat(4, 1fr); + gap: 20px 20px; + } + + #time-period { + grid-area: 1 / 1 / 2 / 3; + } + + #errors { + grid-area: 2 / 1 / 3 / 2; + } + + #level { + grid-area: 2 / 2 / 3 / 3; + } + + #types { + grid-area: 3 / 1 / 5 / 3; + } + + #saved-searches-container { + grid-area: saved-searches; + } + + #common-messages-container { + grid-area: common-messages; + } + + #saved-searches-container > uui-box, + #common-messages-container > uui-box { + height: 100%; + } `, ]; @@ -39,7 +93,6 @@ export class UmbLogViewerRootWorkspaceElement extends UmbLitElement { super.connectedCallback(); this.observe(this.#logViewerContext.savedSearches, (savedSearches) => { - this._savedSearches = savedSearches ?? []; }); await this.#logViewerContext.getSavedSearches(); @@ -47,7 +100,27 @@ export class UmbLogViewerRootWorkspaceElement extends UmbLitElement { render() { return html` - ${this._savedSearches.map((search) => html`
${search.name}
`)} bloblllo +
+
+ + + + + + + +
+
+ + ${this._savedSearches.map((search) => html`
${search.name}
`)} +
+
+
+ + ${this._savedSearches.map((search) => html`
${search.name}
`)} +
+
+
`; } } diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/logviewer-root/logviewer-root.context.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/logviewer-root/logviewer-root.context.ts index 2071444aa9..33ae7cc71f 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/logviewer-root/logviewer-root.context.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/logviewer-root/logviewer-root.context.ts @@ -17,7 +17,7 @@ export class UmbLogViewerWorkspaceContext { } async getSavedSearches() { - const { data } = await this.#repository.getSavedSearches(); + const { data } = await this.#repository.getSavedSearches({ skip: 0, take: 100 }); if (data) { this.#data.next(data); From 5b19694de6e51fa74aa4c2b5cf206698f9b1da98 Mon Sep 17 00:00:00 2001 From: Julia Gru <56249914+julczka@users.noreply.github.com> Date: Fri, 10 Feb 2023 16:56:02 +0100 Subject: [PATCH 05/57] add a silly pie chart --- .../logviewer-root-workspace.element.ts | 160 +++++++++++++++++- 1 file changed, 152 insertions(+), 8 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/logviewer-root/logviewer-root-workspace.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/logviewer-root/logviewer-root-workspace.element.ts index a8099f64cd..e2c5ae2e07 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/logviewer-root/logviewer-root-workspace.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/logviewer-root/logviewer-root-workspace.element.ts @@ -4,12 +4,29 @@ import { UmbLogViewerWorkspaceContext } from './logviewer-root.context'; import { UmbLitElement } from '@umbraco-cms/element'; import { SavedLogSearch } from '@umbraco-cms/backend-api'; +const logLevels = { + information: 171, + debug: 39, + warning: 31, + error: 1, + fatal: 0, +}; + +type LogLevel = keyof typeof logLevels; + +//TODO make uui-input accept min and max values @customElement('umb-logviewer-root-workspace') export class UmbLogViewerRootWorkspaceElement extends UmbLitElement { static styles = [ css` :host { display: block; + + --umb-log-viewer-debug-color: var(--uui-color-default-emphasis); + --umb-log-viewer-information-color: var(--uui-color-positive-standalone); + --umb-log-viewer-warning-color: var(--uui-color-warning-standalone); + --umb-log-viewer-error-color: var(--uui-color-danger-standalone); + --umb-log-viewer-fatal-color: var(--uui-color-default-standalone); } #header { @@ -24,9 +41,9 @@ export class UmbLogViewerRootWorkspaceElement extends UmbLitElement { } #logviewer-layout { - height: calc(100vh - 215px); + height: calc(100vh - 160px); display: grid; - grid-template-columns: 4fr 1fr; + grid-template-columns: 7fr 2fr; grid-template-rows: 1fr 1fr; gap: 20px 20px; grid-auto-flow: row; @@ -48,6 +65,9 @@ export class UmbLogViewerRootWorkspaceElement extends UmbLitElement { grid-area: 1 / 1 / 2 / 3; } + #date-input-container { + } + #errors { grid-area: 2 / 1 / 3 / 2; } @@ -60,6 +80,14 @@ export class UmbLogViewerRootWorkspaceElement extends UmbLitElement { grid-area: 3 / 1 / 5 / 3; } + #log-types-container { + display: flex; + gap: var(--uui-size-space-4); + flex-direction: column-reverse; + align-items: center; + justify-content: space-between; + } + #saved-searches-container { grid-area: saved-searches; } @@ -72,9 +100,76 @@ export class UmbLogViewerRootWorkspaceElement extends UmbLitElement { #common-messages-container > uui-box { height: 100%; } + + input { + font-family: inherit; + padding: var(--uui-size-1) var(--uui-size-space-3); + font-size: inherit; + color: inherit; + border-radius: 0; + box-sizing: border-box; + border: none; + background: none; + width: 100%; + text-align: inherit; + outline: none; + } + + ul { + list-style: none; + margin: 0; + padding: 0; + border: 0; + font-size: 100%; + font: inherit; + vertical-align: baseline; + } + + li { + display: flex; + align-items: center; + } + + li uui-icon { + margin-right: 1em; + } + + #chart { + width: 150px; + aspect-ratio: 1; + background: radial-gradient(white 40%, transparent 41%), + conic-gradient( + var(--umb-log-viewer-debug-color) 0% 20%, + var(--umb-log-viewer-information-color) 20% 40%, + var(--umb-log-viewer-warning-color) 40% 60%, + var(--umb-log-viewer-error-color) 60% 80%, + var(--umb-log-viewer-fatal-color) 80% 100% + ); + margin: 10px; + display: inline-block; + border-radius: 50%; + } `, ]; + get today() { + const today = new Date(); + const dd = String(today.getDate()).padStart(2, '0'); + const mm = String(today.getMonth() + 1).padStart(2, '0'); //January is 0! + const yyyy = today.getFullYear(); + + return yyyy + '-' + mm + '-' + dd; + } + + get yesterday() { + const today = new Date(); + const dd = String(today.getDate() - 1).padStart(2, '0'); + const mm = String(today.getMonth() + 1).padStart(2, '0'); //January is 0! + const yyyy = today.getFullYear(); + + return yyyy + '-' + mm + '-' + dd; + } + @state() private _savedSearches: SavedLogSearch[] = []; @@ -98,30 +193,79 @@ export class UmbLogViewerRootWorkspaceElement extends UmbLitElement { await this.#logViewerContext.getSavedSearches(); } + #renderSearchItem(searchListItem: SavedLogSearch) { + return html`
  • + ${searchListItem.name} +
  • `; + } + render() { - return html` + return html` +
    + - - +
    + From: + + + To: + + +
    + + - + + +
    +
    +
      + ${Object.keys(logLevels).map( + (level) => + html`
    • + ${level} +
    • ` + )} +
    +
    +
    +
    +
    +
    - ${this._savedSearches.map((search) => html`
    ${search.name}
    `)} +
      ${this._savedSearches.map(this.#renderSearchItem)}
    +
    ${this._savedSearches.map((search) => html`
    ${search.name}
    `)}
    -
    `; + `; } } From 5d71a61e7cefc3b6690f6cad62753a3c247a8f20 Mon Sep 17 00:00:00 2001 From: Julia Gru <56249914+julczka@users.noreply.github.com> Date: Tue, 14 Feb 2023 10:53:11 +0100 Subject: [PATCH 06/57] add graph --- ...rver.data.ts => log-viewer.server.data.ts} | 0 .../workspace/donut-chart/donut-chart.ts | 133 ++++++++++++++++++ .../workspace/donut-chart/donut-slice.ts | 23 +++ .../logviewer/workspace/donut-chart/index.ts | 2 + .../logviewer-root-workspace.element.ts | 25 +++- 5 files changed, 182 insertions(+), 1 deletion(-) rename src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/data/sources/{log-search.server.data.ts => log-viewer.server.data.ts} (100%) create mode 100644 src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/donut-chart/donut-chart.ts create mode 100644 src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/donut-chart/donut-slice.ts create mode 100644 src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/donut-chart/index.ts diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/data/sources/log-search.server.data.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/data/sources/log-viewer.server.data.ts similarity index 100% rename from src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/data/sources/log-search.server.data.ts rename to src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/data/sources/log-viewer.server.data.ts diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/donut-chart/donut-chart.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/donut-chart/donut-chart.ts new file mode 100644 index 0000000000..b30f6e2648 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/donut-chart/donut-chart.ts @@ -0,0 +1,133 @@ +import { UUITextStyles } from '@umbraco-ui/uui-css'; +import { css, html, LitElement, svg } from 'lit'; +import { customElement, query, queryAssignedElements, state } from 'lit/decorators.js'; +import { UmbDonutSliceElement } from './donut-slice'; + +export interface Circle { + percent: number; + color: string; +} + +interface CircleWithCommands extends Circle { + offset: number; + commands: string; +} + +@customElement('umb-donut-chart') +export class UmbDonutChartElement extends LitElement { + static styles = [ + UUITextStyles, + css` + .slice { + stroke-linecap: round; + stroke-width: 2; + fill: none; + cursor: pointer; + } + + .do-shit-on-hover:hover { + fill: pink; + } + `, + ]; + + @query('slot') + slicesSlot!: HTMLSlotElement; + + @queryAssignedElements({ selector: 'umb-donut-slice' }) + slices!: UmbDonutSliceElement[]; + + @query('#circle-container') + circleContainer!: HTMLSlotElement; + + @state() + circles: CircleWithCommands[] = []; + + @state() + radius = 50; + + @state() + viewBox = 100; + + @state() + borderSize = 20; + + @state() svgSize = 100; + + #printCircles() { + this.circles = this.#addCommands( + this.slices.map((slice) => { + return { + percent: slice.percent, + color: slice.color, + }; + }) + ); + } + + #addCommands(Circles: Circle[]): CircleWithCommands[] { + let previousPercent = 0; + return Circles.map((slice) => { + const sliceWithCommands: CircleWithCommands = { + ...slice, + commands: this.#getSliceCommands(slice, this.radius, this.svgSize, this.borderSize), + offset: previousPercent * 3.6 * -1, + }; + previousPercent += slice.percent; + return sliceWithCommands; + }); + } + + #getSliceCommands(Circle: Circle, radius: number, svgSize: number, borderSize: number): string { + const degrees = UmbDonutChartElement.percentToDegrees(Circle.percent); + const longPathFlag = degrees > 180 ? 1 : 0; + const innerRadius = radius - borderSize; + + const commands: string[] = []; + commands.push(`M ${svgSize / 2 + radius} ${svgSize / 2}`); + commands.push(`A ${radius} ${radius} 0 ${longPathFlag} 0 ${this.#getCoordFromDegrees(degrees, radius, svgSize)}`); + commands.push(`L ${this.#getCoordFromDegrees(degrees, innerRadius, svgSize)}`); + commands.push(`A ${innerRadius} ${innerRadius} 0 ${longPathFlag} 1 ${svgSize / 2 + innerRadius} ${svgSize / 2}`); + return commands.join(' '); + } + + #getCoordFromDegrees(angle: number, radius: number, svgSize: number): string { + const x = Math.cos((angle * Math.PI) / 180); + const y = Math.sin((angle * Math.PI) / 180); + const coordX = x * radius + svgSize / 2; + const coordY = y * -radius + svgSize / 2; + return [coordX, coordY].join(' '); + } + + static percentToDegrees(percent: number): number { + return percent * 3.6; + } + + #renderCircles() { + return svg` + + ${this.circles.map( + (circle) => svg` + + ${circle.color} + ` + )} + + `; + } + + render() { + return html`
    ${this.#renderCircles()}
    + `; + } +} + +declare global { + interface HTMLElementTagNameMap { + 'umb-donut-chart': UmbDonutChartElement; + } +} diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/donut-chart/donut-slice.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/donut-chart/donut-slice.ts new file mode 100644 index 0000000000..29a3237c4b --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/donut-chart/donut-slice.ts @@ -0,0 +1,23 @@ +import { UUITextStyles } from '@umbraco-ui/uui-css'; +import { css, html, LitElement } from 'lit'; +import { customElement, property } from 'lit/decorators.js'; + +@customElement('umb-donut-slice') +export class UmbDonutSliceElement extends LitElement { + static styles = [UUITextStyles, css``]; + + @property({ type: Number }) + percent = 0; + + @property() + color = 'red'; + + @property() + name = ''; +} + +declare global { + interface HTMLElementTagNameMap { + 'umb-donut-slice': UmbDonutSliceElement; + } +} diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/donut-chart/index.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/donut-chart/index.ts new file mode 100644 index 0000000000..218f52b18f --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/donut-chart/index.ts @@ -0,0 +1,2 @@ +export * from './donut-chart'; +export * from './donut-slice'; diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/logviewer-root/logviewer-root-workspace.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/logviewer-root/logviewer-root-workspace.element.ts index e2c5ae2e07..913b4a0b1f 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/logviewer-root/logviewer-root-workspace.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/logviewer-root/logviewer-root-workspace.element.ts @@ -1,3 +1,4 @@ +import '../donut-chart'; import { css, html } from 'lit'; import { customElement, state } from 'lit/decorators.js'; import { UmbLogViewerWorkspaceContext } from './logviewer-root.context'; @@ -173,6 +174,9 @@ export class UmbLogViewerRootWorkspaceElement extends UmbLitElement { @state() private _savedSearches: SavedLogSearch[] = []; + @state() + private _totalLogCount = 0; + load(): void { // Not relevant for this workspace -added to prevent the error from popping up console.log('Loading something from somewhere'); @@ -191,6 +195,14 @@ export class UmbLogViewerRootWorkspaceElement extends UmbLitElement { this._savedSearches = savedSearches ?? []; }); await this.#logViewerContext.getSavedSearches(); + + this._totalLogCount = Object.values(logLevels).reduce((acc, count) => acc + count, 0); + } + + logPercentage(partialValue: number) { + if (this._totalLogCount === 0) return 0; + + return Math.round((100 * partialValue) / this._totalLogCount); } #renderSearchItem(searchListItem: SavedLogSearch) { @@ -248,7 +260,18 @@ export class UmbLogViewerRootWorkspaceElement extends UmbLitElement { )} -
    + + + ${Object.entries(logLevels).map( + ([level, number]) => + html` ` + )} + + From 742177c6ff1c22dbed227ed66bdcd3bb65b0aa98 Mon Sep 17 00:00:00 2001 From: Julia Gru <56249914+julczka@users.noreply.github.com> Date: Tue, 14 Feb 2023 12:44:45 +0100 Subject: [PATCH 07/57] add other endpoints to the data source --- .../workspace/data/log-search.repository.ts | 9 +- .../logviewer/workspace/data/sources/index.ts | 67 ++++++++- .../data/sources/log-viewer.server.data.ts | 138 +++++++++++++++++- .../logviewer-root-workspace.element.ts | 10 +- .../logviewer-root/logviewer-root.context.ts | 4 +- 5 files changed, 207 insertions(+), 21 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/data/log-search.repository.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/data/log-search.repository.ts index a321fa0b84..0f8c0d8666 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/data/log-search.repository.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/data/log-search.repository.ts @@ -1,6 +1,5 @@ -import { UmbLogSearchesServerDataSource } from './sources/log-search.server.data'; +import { UmbLogSearchesServerDataSource } from './sources/log-viewer.server.data'; import { UmbLogSearchesStore, UMB_LOG_SEARCHES_STORE_CONTEXT_TOKEN } from './log-search.store'; -import { ProblemDetails, Template } from '@umbraco-cms/backend-api'; import { UmbContextConsumerController } from '@umbraco-cms/context-api'; import { UmbControllerHostInterface } from '@umbraco-cms/controller'; import { UmbNotificationService, UMB_NOTIFICATION_SERVICE_CONTEXT_TOKEN } from '@umbraco-cms/notification'; @@ -11,7 +10,7 @@ import { UmbNotificationService, UMB_NOTIFICATION_SERVICE_CONTEXT_TOKEN } from ' // All methods should be async and return a promise. Some methods might return an observable as part of the promise response. export class UmbLogSearchRepository { #host: UmbControllerHostInterface; - #dataSource: UmbLogSearchesServerDataSource; + #searchDataSource: UmbLogSearchesServerDataSource; #searchStore?: UmbLogSearchesStore; #notificationService?: UmbNotificationService; #initResolver?: () => void; @@ -19,7 +18,7 @@ export class UmbLogSearchRepository { constructor(host: UmbControllerHostInterface) { this.#host = host; - this.#dataSource = new UmbLogSearchesServerDataSource(this.#host); + this.#searchDataSource = new UmbLogSearchesServerDataSource(this.#host); new UmbContextConsumerController(this.#host, UMB_LOG_SEARCHES_STORE_CONTEXT_TOKEN, (instance) => { this.#searchStore = instance; @@ -49,7 +48,7 @@ export class UmbLogSearchRepository { async getSavedSearches({ skip, take }: { skip: number; take: number }) { await this.#init(); - return this.#dataSource.getAllSavedSearches({ skip, take }); + return this.#searchDataSource.getAllSavedSearches({ skip, take }); } // async insert(template: Template) { diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/data/sources/index.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/data/sources/index.ts index 1977750f66..9693dcb0d9 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/data/sources/index.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/data/sources/index.ts @@ -1,6 +1,22 @@ -import { PagedSavedLogSearch, SavedLogSearch } from '@umbraco-cms/backend-api'; +import { + DirectionModel, + LogLevelModel, + PagedLoggerModel, + PagedLogMessageModel, + PagedLogTemplateModel, + PagedSavedLogSearchModel, + SavedLogSearchModel, +} from '@umbraco-cms/backend-api'; import type { DataSourceResponse } from '@umbraco-cms/models'; +interface LogLevelCountsModel { + information: number; + debug: number; + warning: number; + error: number; + fatal: number; +} + export interface LogSearchDataSource { getAllSavedSearches({ skip, @@ -8,8 +24,51 @@ export interface LogSearchDataSource { }: { skip?: number; take?: number; - }): Promise>; - getSavedSearchByName({ name }: { name: string }): Promise>; + }): Promise>; + getSavedSearchByName({ name }: { name: string }): Promise>; deleteSavedSearchByName({ name }: { name: string }): Promise>; - postLogViewerSavedSearch({ requestBody }: { requestBody?: SavedLogSearch }): Promise>; + postLogViewerSavedSearch({ + requestBody, + }: { + requestBody?: SavedLogSearchModel; + }): Promise>; +} + +export interface LogMessagesDataSource { + getLogViewerLevel({ skip, take }: { skip?: number; take?: number }): Promise>; + getLogViewerLevelCount({ + startDate, + endDate, + }: { + startDate?: string; + endDate?: string; + }): Promise>; + getLogViewerLog({ + skip, + take = 100, + orderDirection, + filterExpression, + logLevel, + startDate, + endDate, + }: { + skip?: number; + take?: number; + orderDirection?: DirectionModel; + filterExpression?: string; + logLevel?: Array; + startDate?: string; + endDate?: string; + }): Promise>; + getLogViewerMessageTemplate({ + skip, + take = 100, + startDate, + endDate, + }: { + skip?: number; + take?: number; + startDate?: string; + endDate?: string; + }): Promise>; } diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/data/sources/log-viewer.server.data.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/data/sources/log-viewer.server.data.ts index f880e3d0d1..62f634cc10 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/data/sources/log-viewer.server.data.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/data/sources/log-viewer.server.data.ts @@ -1,5 +1,5 @@ -import { LogSearchDataSource } from '.'; -import { LogViewerResource, SavedLogSearch } from '@umbraco-cms/backend-api'; +import { LogMessagesDataSource, LogSearchDataSource } from '.'; +import { DirectionModel, LogLevelModel, LogViewerResource, SavedLogSearchModel } from '@umbraco-cms/backend-api'; import { UmbControllerHostInterface } from '@umbraco-cms/controller'; import { tryExecuteAndNotify } from '@umbraco-cms/resources'; @@ -49,7 +49,7 @@ export class UmbLogSearchesServerDataSource implements LogSearchDataSource { * @return {*} * @memberof UmbLogSearchesServerDataSource */ - async postLogViewerSavedSearch({ requestBody }: { requestBody?: SavedLogSearch }) { + async postLogViewerSavedSearch({ requestBody }: { requestBody?: SavedLogSearchModel }) { return await tryExecuteAndNotify(this.#host, LogViewerResource.postLogViewerSavedSearch({ requestBody })); } /** @@ -63,3 +63,135 @@ export class UmbLogSearchesServerDataSource implements LogSearchDataSource { return await tryExecuteAndNotify(this.#host, LogViewerResource.deleteLogViewerSavedSearchByName({ name })); } } + +export class UmbLogMessagesServerDataSource implements LogMessagesDataSource { + #host: UmbControllerHostInterface; + + /** + * Creates an instance of UmbLogMessagesServerDataSource. + * @param {UmbControllerHostInterface} host + * @memberof UmbLogMessagesServerDataSource + */ + constructor(host: UmbControllerHostInterface) { + this.#host = host; + } + + /** + * Grabs all the loggers from the server + * + * @param {{ skip?: number; take?: number }} { skip = 0, take = 100 } + * @return {*} + * @memberof UmbLogMessagesServerDataSource + */ + async getLogViewerLevel({ skip = 0, take = 100 }: { skip?: number; take?: number }) { + return await tryExecuteAndNotify(this.#host, LogViewerResource.getLogViewerLevel({ skip, take })); + } + + /** + * Grabs all the number of different log messages from the server + * + * @param {{ skip?: number; take?: number }} { skip = 0, take = 100 } + * @return {*} + * @memberof UmbLogMessagesServerDataSource + */ + async getLogViewerLevelCount({ startDate, endDate }: { startDate?: string; endDate?: string }) { + return await tryExecuteAndNotify( + this.#host, + LogViewerResource.getLogViewerLevelCount({ + startDate, + endDate, + }) + ); + } + /** + * Grabs all the log messages from the server + * + * @param {{ + * skip?: number; + * take?: number; + * orderDirection?: DirectionModel; + * filterExpression?: string; + * logLevel?: Array; + * startDate?: string; + * endDate?: string; + * }} { + * skip = 0, + * take = 100, + * orderDirection, + * filterExpression, + * logLevel, + * startDate, + * endDate, + * } + * @return {*} + * @memberof UmbLogMessagesServerDataSource + */ + async getLogViewerLog({ + skip = 0, + take = 100, + orderDirection, + filterExpression, + logLevel, + startDate, + endDate, + }: { + skip?: number; + take?: number; + orderDirection?: DirectionModel; + filterExpression?: string; + logLevel?: Array; + startDate?: string; + endDate?: string; + }) { + return await tryExecuteAndNotify( + this.#host, + LogViewerResource.getLogViewerLog({ + skip, + take, + orderDirection, + filterExpression, + logLevel, + startDate, + endDate, + }) + ); + } + /** + * Grabs all the log message templates from the server + * + * @param {{ + * skip?: number; + * take?: number; + * startDate?: string; + * endDate?: string; + * }} { + * skip, + * take = 100, + * startDate, + * endDate, + * } + * @return {*} + * @memberof UmbLogMessagesServerDataSource + */ + async getLogViewerMessageTemplate({ + skip, + take = 100, + startDate, + endDate, + }: { + skip?: number; + take?: number; + startDate?: string; + endDate?: string; + }) { + return await tryExecuteAndNotify( + this.#host, + LogViewerResource.getLogViewerMessageTemplate({ + skip, + take, + startDate, + endDate, + }) + ); + } +} diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/logviewer-root/logviewer-root-workspace.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/logviewer-root/logviewer-root-workspace.element.ts index 913b4a0b1f..dc70a51615 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/logviewer-root/logviewer-root-workspace.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/logviewer-root/logviewer-root-workspace.element.ts @@ -3,7 +3,7 @@ import { css, html } from 'lit'; import { customElement, state } from 'lit/decorators.js'; import { UmbLogViewerWorkspaceContext } from './logviewer-root.context'; import { UmbLitElement } from '@umbraco-cms/element'; -import { SavedLogSearch } from '@umbraco-cms/backend-api'; +import { SavedLogSearchModel } from '@umbraco-cms/backend-api'; const logLevels = { information: 171, @@ -172,7 +172,7 @@ export class UmbLogViewerRootWorkspaceElement extends UmbLitElement { } @state() - private _savedSearches: SavedLogSearch[] = []; + private _savedSearches: SavedLogSearchModel[] = []; @state() private _totalLogCount = 0; @@ -205,7 +205,7 @@ export class UmbLogViewerRootWorkspaceElement extends UmbLitElement { return Math.round((100 * partialValue) / this._totalLogCount); } - #renderSearchItem(searchListItem: SavedLogSearch) { + #renderSearchItem(searchListItem: SavedLogSearchModel) { return html`
  • - ${Object.entries(logLevels).map( ([level, number]) => @@ -268,9 +267,6 @@ export class UmbLogViewerRootWorkspaceElement extends UmbLitElement { .percent=${this.logPercentage(number)} .color=${`var(--umb-log-viewer-${level}-color)`}> ` )} - diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/logviewer-root/logviewer-root.context.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/logviewer-root/logviewer-root.context.ts index 33ae7cc71f..02a0469944 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/logviewer-root/logviewer-root.context.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/logviewer-root/logviewer-root.context.ts @@ -1,5 +1,5 @@ import { createObservablePart, DeepState } from '@umbraco-cms/observable-api'; -import { PagedSavedLogSearch } from '@umbraco-cms/backend-api'; +import { PagedSavedLogSearchModel } from '@umbraco-cms/backend-api'; import { UmbControllerHostInterface } from '@umbraco-cms/controller'; import { UmbLogSearchRepository } from '../data/log-search.repository'; @@ -7,7 +7,7 @@ export class UmbLogViewerWorkspaceContext { #host: UmbControllerHostInterface; #repository: UmbLogSearchRepository; - #data = new DeepState(undefined); + #data = new DeepState(undefined); data = this.#data.asObservable(); savedSearches = createObservablePart(this.#data, (data) => data?.items); From 7718abf98a4f0d8ebba5303105ea2b6f4947b939 Mon Sep 17 00:00:00 2001 From: Julia Gru <56249914+julczka@users.noreply.github.com> Date: Fri, 17 Feb 2023 12:15:07 +0100 Subject: [PATCH 08/57] add handlers --- .../workspace/data/log-search.repository.ts | 10 +- .../src/core/mocks/data/log-viewer.data.ts | 57 +- .../src/core/mocks/data/logs.data.ts | 7317 +++++++++++++++++ .../core/mocks/domains/log-viewer.handlers.ts | 28 +- 4 files changed, 7399 insertions(+), 13 deletions(-) create mode 100644 src/Umbraco.Web.UI.Client/src/core/mocks/data/logs.data.ts diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/data/log-search.repository.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/data/log-search.repository.ts index 0f8c0d8666..b0caca3426 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/data/log-search.repository.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/data/log-search.repository.ts @@ -1,4 +1,4 @@ -import { UmbLogSearchesServerDataSource } from './sources/log-viewer.server.data'; +import { UmbLogMessagesServerDataSource, UmbLogSearchesServerDataSource } from './sources/log-viewer.server.data'; import { UmbLogSearchesStore, UMB_LOG_SEARCHES_STORE_CONTEXT_TOKEN } from './log-search.store'; import { UmbContextConsumerController } from '@umbraco-cms/context-api'; import { UmbControllerHostInterface } from '@umbraco-cms/controller'; @@ -11,6 +11,7 @@ import { UmbNotificationService, UMB_NOTIFICATION_SERVICE_CONTEXT_TOKEN } from ' export class UmbLogSearchRepository { #host: UmbControllerHostInterface; #searchDataSource: UmbLogSearchesServerDataSource; + #messagesDataSource: UmbLogMessagesServerDataSource; #searchStore?: UmbLogSearchesStore; #notificationService?: UmbNotificationService; #initResolver?: () => void; @@ -19,6 +20,7 @@ export class UmbLogSearchRepository { constructor(host: UmbControllerHostInterface) { this.#host = host; this.#searchDataSource = new UmbLogSearchesServerDataSource(this.#host); + this.#messagesDataSource = new UmbLogMessagesServerDataSource(this.#host); new UmbContextConsumerController(this.#host, UMB_LOG_SEARCHES_STORE_CONTEXT_TOKEN, (instance) => { this.#searchStore = instance; @@ -51,6 +53,12 @@ export class UmbLogSearchRepository { return this.#searchDataSource.getAllSavedSearches({ skip, take }); } + async getLogCount({ startDate, endDate }: { startDate?: string; endDate?: string }) { + await this.#init(); + + return this.#messagesDataSource.getLogViewerLevelCount({ startDate, endDate }); + } + // async insert(template: Template) { // await this.#init(); diff --git a/src/Umbraco.Web.UI.Client/src/core/mocks/data/log-viewer.data.ts b/src/Umbraco.Web.UI.Client/src/core/mocks/data/log-viewer.data.ts index b01360d3ef..b74e755fa9 100644 --- a/src/Umbraco.Web.UI.Client/src/core/mocks/data/log-viewer.data.ts +++ b/src/Umbraco.Web.UI.Client/src/core/mocks/data/log-viewer.data.ts @@ -1,14 +1,15 @@ -import { LogTemplate, SavedLogSearch } from '@umbraco-cms/backend-api'; +import { logs } from './logs.data'; import { UmbData } from './data'; +import { LogMessageModel, LogTemplateModel, SavedLogSearchModel } from '@umbraco-cms/backend-api'; // Temp mocked database -class UmbLogviewerSearchesData extends UmbData { - constructor(data: SavedLogSearch[]) { +class UmbLogviewerSearchesData extends UmbData { + constructor(data: SavedLogSearchModel[]) { super(data); } // skip can be number or null - getSavedSearches(skip = 0, take = this.data.length): Array { + getSavedSearches(skip = 0, take = this.data.length): Array { return this.data.slice(skip, take); } @@ -17,18 +18,40 @@ class UmbLogviewerSearchesData extends UmbData { } } -class UmbLogviewerTemplatesData extends UmbData { - constructor(data: LogTemplate[]) { +class UmbLogviewerTemplatesData extends UmbData { + constructor(data: LogTemplateModel[]) { super(data); } // skip can be number or null - getTemplates(skip = 0, take = this.data.length): Array { + getTemplates(skip = 0, take = this.data.length): Array { return this.data.slice(skip, take); } } -export const savedSearches: Array = [ +class UmbLogviewerMessagesData extends UmbData { + constructor(data: LogTemplateModel[]) { + super(data); + } + + // skip can be number or null + getLogs(skip = 0, take = this.data.length): Array { + return this.data.slice(skip, take); + } + + getLevelCount() { + const levels = this.data.map((log) => log.level ?? 'unknown'); + const counts = {}; + levels.forEach((level: string) => { + //eslint-disable-next-line @typescript-eslint/ban-ts-comment + //@ts-ignore + counts[level ?? 'unknown'] = (counts[level] || 0) + 1; + }); + return counts; + } +} + +export const savedSearches: Array = [ { name: 'Find all logs where the Level is NOT Verbose and NOT Debug', query: "Not(@Level='Verbose') and Not(@Level='Debug')", @@ -75,7 +98,7 @@ export const savedSearches: Array = [ }, ]; -export const messageTemplates: LogTemplate[] = [ +export const messageTemplates: LogTemplateModel[] = [ { messageTemplate: 'Create Foreign Key:\n {Sql}', count: 90, @@ -368,7 +391,23 @@ export const messageTemplates: LogTemplate[] = [ }, ]; +export const logLevels = { + total: 2, + items: [ + { + name: 'Global', + level: 'Information', + }, + { + name: 'UmbracoFile', + level: 'Verbose', + }, + ], +}; + export const umbLogviewerData = { searches: new UmbLogviewerSearchesData(savedSearches), templates: new UmbLogviewerTemplatesData(messageTemplates), + logs: new UmbLogviewerMessagesData(logs), + logLevels: logLevels, }; diff --git a/src/Umbraco.Web.UI.Client/src/core/mocks/data/logs.data.ts b/src/Umbraco.Web.UI.Client/src/core/mocks/data/logs.data.ts new file mode 100644 index 0000000000..169d46b068 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/core/mocks/data/logs.data.ts @@ -0,0 +1,7317 @@ +import { LogLevelModel, LogMessageModel } from '@umbraco-cms/backend-api'; + +const allLogs = [ + { + timestamp: '2023-02-14T12:02:15.8094382+00:00', + level: 'Debug', + messageTemplate: '{IndexName} searcher refreshed? {DidRefresh}', + renderedMessage: '"InternalIndex" searcher refreshed? False', + properties: [ + { + name: 'IndexName', + value: 'InternalIndex', + }, + { + name: 'DidRefresh', + value: 'False', + }, + { + name: 'SourceContext', + value: 'Examine.Lucene.Providers.LuceneIndex', + }, + { + name: 'ActionId', + value: '1d9a0529-a75a-40cc-be5d-c871548ab233', + }, + { + name: 'ActionName', + value: 'Umbraco.Cms.Web.BackOffice.Controllers.ContentController.EmptyRecycleBin (Umbraco.Web.BackOffice)', + }, + { + name: 'RequestId', + value: '4000002e-0005-ef00-b63f-84710c7967bb', + }, + { + name: 'RequestPath', + value: '/umbraco/backoffice/umbracoapi/content/EmptyRecycleBin', + }, + { + name: 'ProcessId', + value: '17632', + }, + { + name: 'ProcessName', + value: 'iisexpress', + }, + { + name: 'ThreadId', + value: '50', + }, + { + name: 'ApplicationId', + value: '0cf9334a65daa2e8a69943c6db2fb730bb14f2de', + }, + { + name: 'MachineName', + value: 'DESKTOP-M35N63H', + }, + { + name: 'Log4NetLevel', + value: 'DEBUG', + }, + { + name: 'HttpRequestId', + value: 'c80ec31d-3d58-401a-9361-1ae7451c215f', + }, + { + name: 'HttpRequestNumber', + value: '982', + }, + { + name: 'HttpSessionId', + value: '0', + }, + ], + exception: null, + }, + { + timestamp: '2023-02-14T12:02:15.7464278+00:00', + level: 'Debug', + messageTemplate: '{IndexName} searcher refreshed? {DidRefresh}', + renderedMessage: '"ExternalIndex" searcher refreshed? False', + properties: [ + { + name: 'IndexName', + value: 'ExternalIndex', + }, + { + name: 'DidRefresh', + value: 'False', + }, + { + name: 'SourceContext', + value: 'Examine.Lucene.Providers.LuceneIndex', + }, + { + name: 'ActionId', + value: 'c4a4ecf3-34e7-4ff9-99ad-4aab0a23c3c2', + }, + { + name: 'ActionName', + value: 'Umbraco.Cms.Web.BackOffice.Controllers.ContentController.DeleteById (Umbraco.Web.BackOffice)', + }, + { + name: 'RequestId', + value: '4000005e-0004-fe00-b63f-84710c7967bb', + }, + { + name: 'RequestPath', + value: '/umbraco/backoffice/umbracoapi/content/DeleteById', + }, + { + name: 'ProcessId', + value: '17632', + }, + { + name: 'ProcessName', + value: 'iisexpress', + }, + { + name: 'ThreadId', + value: '57', + }, + { + name: 'ApplicationId', + value: '0cf9334a65daa2e8a69943c6db2fb730bb14f2de', + }, + { + name: 'MachineName', + value: 'DESKTOP-M35N63H', + }, + { + name: 'Log4NetLevel', + value: 'DEBUG', + }, + { + name: 'HttpRequestId', + value: '77052e32-93ab-426f-b96c-4c71fab7d48a', + }, + { + name: 'HttpRequestNumber', + value: '981', + }, + { + name: 'HttpSessionId', + value: '0', + }, + ], + exception: null, + }, + { + timestamp: '2023-02-14T12:02:10.7972442+00:00', + level: 'Debug', + messageTemplate: '{IndexName} searcher refreshed? {DidRefresh}', + renderedMessage: '"InternalIndex" searcher refreshed? False', + properties: [ + { + name: 'IndexName', + value: 'InternalIndex', + }, + { + name: 'DidRefresh', + value: 'False', + }, + { + name: 'SourceContext', + value: 'Examine.Lucene.Providers.LuceneIndex', + }, + { + name: 'ActionId', + value: '1d9a0529-a75a-40cc-be5d-c871548ab233', + }, + { + name: 'ActionName', + value: 'Umbraco.Cms.Web.BackOffice.Controllers.ContentController.EmptyRecycleBin (Umbraco.Web.BackOffice)', + }, + { + name: 'RequestId', + value: '4000002e-0005-ef00-b63f-84710c7967bb', + }, + { + name: 'RequestPath', + value: '/umbraco/backoffice/umbracoapi/content/EmptyRecycleBin', + }, + { + name: 'ProcessId', + value: '17632', + }, + { + name: 'ProcessName', + value: 'iisexpress', + }, + { + name: 'ThreadId', + value: '50', + }, + { + name: 'ApplicationId', + value: '0cf9334a65daa2e8a69943c6db2fb730bb14f2de', + }, + { + name: 'MachineName', + value: 'DESKTOP-M35N63H', + }, + { + name: 'Log4NetLevel', + value: 'DEBUG', + }, + { + name: 'HttpRequestId', + value: '1cec3ec5-4980-4bfc-bdf4-085070da6f4d', + }, + { + name: 'HttpRequestNumber', + value: '980', + }, + { + name: 'HttpSessionId', + value: '0', + }, + ], + exception: null, + }, + { + timestamp: '2023-02-14T12:02:10.735678+00:00', + level: 'Debug', + messageTemplate: '{IndexName} searcher refreshed? {DidRefresh}', + renderedMessage: '"ExternalIndex" searcher refreshed? False', + properties: [ + { + name: 'IndexName', + value: 'ExternalIndex', + }, + { + name: 'DidRefresh', + value: 'False', + }, + { + name: 'SourceContext', + value: 'Examine.Lucene.Providers.LuceneIndex', + }, + { + name: 'ActionId', + value: 'c4a4ecf3-34e7-4ff9-99ad-4aab0a23c3c2', + }, + { + name: 'ActionName', + value: 'Umbraco.Cms.Web.BackOffice.Controllers.ContentController.DeleteById (Umbraco.Web.BackOffice)', + }, + { + name: 'RequestId', + value: '4000005e-0004-fe00-b63f-84710c7967bb', + }, + { + name: 'RequestPath', + value: '/umbraco/backoffice/umbracoapi/content/DeleteById', + }, + { + name: 'ProcessId', + value: '17632', + }, + { + name: 'ProcessName', + value: 'iisexpress', + }, + { + name: 'ThreadId', + value: '57', + }, + { + name: 'ApplicationId', + value: '0cf9334a65daa2e8a69943c6db2fb730bb14f2de', + }, + { + name: 'MachineName', + value: 'DESKTOP-M35N63H', + }, + { + name: 'Log4NetLevel', + value: 'DEBUG', + }, + { + name: 'HttpRequestId', + value: '6941710a-4f09-41b2-8f11-fce2c813ad10', + }, + { + name: 'HttpRequestNumber', + value: '979', + }, + { + name: 'HttpSessionId', + value: '0', + }, + ], + exception: null, + }, + { + timestamp: '2023-02-14T12:02:05.7944643+00:00', + level: 'Debug', + messageTemplate: '{IndexName} searcher refreshed? {DidRefresh}', + renderedMessage: '"InternalIndex" searcher refreshed? False', + properties: [ + { + name: 'IndexName', + value: 'InternalIndex', + }, + { + name: 'DidRefresh', + value: 'False', + }, + { + name: 'SourceContext', + value: 'Examine.Lucene.Providers.LuceneIndex', + }, + { + name: 'ActionId', + value: '1d9a0529-a75a-40cc-be5d-c871548ab233', + }, + { + name: 'ActionName', + value: 'Umbraco.Cms.Web.BackOffice.Controllers.ContentController.EmptyRecycleBin (Umbraco.Web.BackOffice)', + }, + { + name: 'RequestId', + value: '4000002e-0005-ef00-b63f-84710c7967bb', + }, + { + name: 'RequestPath', + value: '/umbraco/backoffice/umbracoapi/content/EmptyRecycleBin', + }, + { + name: 'ProcessId', + value: '17632', + }, + { + name: 'ProcessName', + value: 'iisexpress', + }, + { + name: 'ThreadId', + value: '50', + }, + { + name: 'ApplicationId', + value: '0cf9334a65daa2e8a69943c6db2fb730bb14f2de', + }, + { + name: 'MachineName', + value: 'DESKTOP-M35N63H', + }, + { + name: 'Log4NetLevel', + value: 'DEBUG', + }, + { + name: 'HttpRequestId', + value: '5e129d0e-595d-43f4-9055-7ea218347659', + }, + { + name: 'HttpRequestNumber', + value: '978', + }, + { + name: 'HttpSessionId', + value: '0', + }, + ], + exception: null, + }, + { + timestamp: '2023-02-14T12:02:05.7340093+00:00', + level: 'Debug', + messageTemplate: '{IndexName} searcher refreshed? {DidRefresh}', + renderedMessage: '"ExternalIndex" searcher refreshed? False', + properties: [ + { + name: 'IndexName', + value: 'ExternalIndex', + }, + { + name: 'DidRefresh', + value: 'False', + }, + { + name: 'SourceContext', + value: 'Examine.Lucene.Providers.LuceneIndex', + }, + { + name: 'ActionId', + value: 'c4a4ecf3-34e7-4ff9-99ad-4aab0a23c3c2', + }, + { + name: 'ActionName', + value: 'Umbraco.Cms.Web.BackOffice.Controllers.ContentController.DeleteById (Umbraco.Web.BackOffice)', + }, + { + name: 'RequestId', + value: '4000005e-0004-fe00-b63f-84710c7967bb', + }, + { + name: 'RequestPath', + value: '/umbraco/backoffice/umbracoapi/content/DeleteById', + }, + { + name: 'ProcessId', + value: '17632', + }, + { + name: 'ProcessName', + value: 'iisexpress', + }, + { + name: 'ThreadId', + value: '57', + }, + { + name: 'ApplicationId', + value: '0cf9334a65daa2e8a69943c6db2fb730bb14f2de', + }, + { + name: 'MachineName', + value: 'DESKTOP-M35N63H', + }, + { + name: 'Log4NetLevel', + value: 'DEBUG', + }, + { + name: 'HttpRequestId', + value: 'a760748a-43cd-4132-9f51-c518df8ae368', + }, + { + name: 'HttpRequestNumber', + value: '977', + }, + { + name: 'HttpSessionId', + value: '0', + }, + ], + exception: null, + }, + { + timestamp: '2023-02-14T12:02:00.7904684+00:00', + level: 'Debug', + messageTemplate: '{IndexName} searcher refreshed? {DidRefresh}', + renderedMessage: '"InternalIndex" searcher refreshed? False', + properties: [ + { + name: 'IndexName', + value: 'InternalIndex', + }, + { + name: 'DidRefresh', + value: 'False', + }, + { + name: 'SourceContext', + value: 'Examine.Lucene.Providers.LuceneIndex', + }, + { + name: 'ActionId', + value: '1d9a0529-a75a-40cc-be5d-c871548ab233', + }, + { + name: 'ActionName', + value: 'Umbraco.Cms.Web.BackOffice.Controllers.ContentController.EmptyRecycleBin (Umbraco.Web.BackOffice)', + }, + { + name: 'RequestId', + value: '4000002e-0005-ef00-b63f-84710c7967bb', + }, + { + name: 'RequestPath', + value: '/umbraco/backoffice/umbracoapi/content/EmptyRecycleBin', + }, + { + name: 'ProcessId', + value: '17632', + }, + { + name: 'ProcessName', + value: 'iisexpress', + }, + { + name: 'ThreadId', + value: '50', + }, + { + name: 'ApplicationId', + value: '0cf9334a65daa2e8a69943c6db2fb730bb14f2de', + }, + { + name: 'MachineName', + value: 'DESKTOP-M35N63H', + }, + { + name: 'Log4NetLevel', + value: 'DEBUG', + }, + { + name: 'HttpRequestId', + value: '3acbe275-1340-4d92-a2f9-8b15eea7c5da', + }, + { + name: 'HttpRequestNumber', + value: '976', + }, + { + name: 'HttpSessionId', + value: '0', + }, + ], + exception: null, + }, + { + timestamp: '2023-02-14T12:02:00.7298561+00:00', + level: 'Debug', + messageTemplate: '{IndexName} searcher refreshed? {DidRefresh}', + renderedMessage: '"ExternalIndex" searcher refreshed? False', + properties: [ + { + name: 'IndexName', + value: 'ExternalIndex', + }, + { + name: 'DidRefresh', + value: 'False', + }, + { + name: 'SourceContext', + value: 'Examine.Lucene.Providers.LuceneIndex', + }, + { + name: 'ActionId', + value: 'c4a4ecf3-34e7-4ff9-99ad-4aab0a23c3c2', + }, + { + name: 'ActionName', + value: 'Umbraco.Cms.Web.BackOffice.Controllers.ContentController.DeleteById (Umbraco.Web.BackOffice)', + }, + { + name: 'RequestId', + value: '4000005e-0004-fe00-b63f-84710c7967bb', + }, + { + name: 'RequestPath', + value: '/umbraco/backoffice/umbracoapi/content/DeleteById', + }, + { + name: 'ProcessId', + value: '17632', + }, + { + name: 'ProcessName', + value: 'iisexpress', + }, + { + name: 'ThreadId', + value: '57', + }, + { + name: 'ApplicationId', + value: '0cf9334a65daa2e8a69943c6db2fb730bb14f2de', + }, + { + name: 'MachineName', + value: 'DESKTOP-M35N63H', + }, + { + name: 'Log4NetLevel', + value: 'DEBUG', + }, + { + name: 'HttpRequestId', + value: '09ab7c8b-ae78-4b86-adff-e82bf9bed66e', + }, + { + name: 'HttpRequestNumber', + value: '975', + }, + { + name: 'HttpSessionId', + value: '0', + }, + ], + exception: null, + }, + { + timestamp: '2023-02-14T12:01:55.7815654+00:00', + level: 'Debug', + messageTemplate: '{IndexName} searcher refreshed? {DidRefresh}', + renderedMessage: '"InternalIndex" searcher refreshed? False', + properties: [ + { + name: 'IndexName', + value: 'InternalIndex', + }, + { + name: 'DidRefresh', + value: 'False', + }, + { + name: 'SourceContext', + value: 'Examine.Lucene.Providers.LuceneIndex', + }, + { + name: 'ActionId', + value: '1d9a0529-a75a-40cc-be5d-c871548ab233', + }, + { + name: 'ActionName', + value: 'Umbraco.Cms.Web.BackOffice.Controllers.ContentController.EmptyRecycleBin (Umbraco.Web.BackOffice)', + }, + { + name: 'RequestId', + value: '4000002e-0005-ef00-b63f-84710c7967bb', + }, + { + name: 'RequestPath', + value: '/umbraco/backoffice/umbracoapi/content/EmptyRecycleBin', + }, + { + name: 'ProcessId', + value: '17632', + }, + { + name: 'ProcessName', + value: 'iisexpress', + }, + { + name: 'ThreadId', + value: '50', + }, + { + name: 'ApplicationId', + value: '0cf9334a65daa2e8a69943c6db2fb730bb14f2de', + }, + { + name: 'MachineName', + value: 'DESKTOP-M35N63H', + }, + { + name: 'Log4NetLevel', + value: 'DEBUG', + }, + { + name: 'HttpRequestId', + value: '3252af15-c998-4463-b9c0-18d663d65c53', + }, + { + name: 'HttpRequestNumber', + value: '974', + }, + { + name: 'HttpSessionId', + value: '0', + }, + ], + exception: null, + }, + { + timestamp: '2023-02-14T12:01:55.7215251+00:00', + level: 'Debug', + messageTemplate: '{IndexName} searcher refreshed? {DidRefresh}', + renderedMessage: '"ExternalIndex" searcher refreshed? False', + properties: [ + { + name: 'IndexName', + value: 'ExternalIndex', + }, + { + name: 'DidRefresh', + value: 'False', + }, + { + name: 'SourceContext', + value: 'Examine.Lucene.Providers.LuceneIndex', + }, + { + name: 'ActionId', + value: 'c4a4ecf3-34e7-4ff9-99ad-4aab0a23c3c2', + }, + { + name: 'ActionName', + value: 'Umbraco.Cms.Web.BackOffice.Controllers.ContentController.DeleteById (Umbraco.Web.BackOffice)', + }, + { + name: 'RequestId', + value: '4000005e-0004-fe00-b63f-84710c7967bb', + }, + { + name: 'RequestPath', + value: '/umbraco/backoffice/umbracoapi/content/DeleteById', + }, + { + name: 'ProcessId', + value: '17632', + }, + { + name: 'ProcessName', + value: 'iisexpress', + }, + { + name: 'ThreadId', + value: '57', + }, + { + name: 'ApplicationId', + value: '0cf9334a65daa2e8a69943c6db2fb730bb14f2de', + }, + { + name: 'MachineName', + value: 'DESKTOP-M35N63H', + }, + { + name: 'Log4NetLevel', + value: 'DEBUG', + }, + { + name: 'HttpRequestId', + value: 'aa6552dc-226d-4302-ab2f-6a1ae7b82205', + }, + { + name: 'HttpRequestNumber', + value: '973', + }, + { + name: 'HttpSessionId', + value: '0', + }, + ], + exception: null, + }, + { + timestamp: '2023-02-14T12:01:50.7812088+00:00', + level: 'Debug', + messageTemplate: '{IndexName} searcher refreshed? {DidRefresh}', + renderedMessage: '"InternalIndex" searcher refreshed? False', + properties: [ + { + name: 'IndexName', + value: 'InternalIndex', + }, + { + name: 'DidRefresh', + value: 'False', + }, + { + name: 'SourceContext', + value: 'Examine.Lucene.Providers.LuceneIndex', + }, + { + name: 'ActionId', + value: '1d9a0529-a75a-40cc-be5d-c871548ab233', + }, + { + name: 'ActionName', + value: 'Umbraco.Cms.Web.BackOffice.Controllers.ContentController.EmptyRecycleBin (Umbraco.Web.BackOffice)', + }, + { + name: 'RequestId', + value: '4000002e-0005-ef00-b63f-84710c7967bb', + }, + { + name: 'RequestPath', + value: '/umbraco/backoffice/umbracoapi/content/EmptyRecycleBin', + }, + { + name: 'ProcessId', + value: '17632', + }, + { + name: 'ProcessName', + value: 'iisexpress', + }, + { + name: 'ThreadId', + value: '50', + }, + { + name: 'ApplicationId', + value: '0cf9334a65daa2e8a69943c6db2fb730bb14f2de', + }, + { + name: 'MachineName', + value: 'DESKTOP-M35N63H', + }, + { + name: 'Log4NetLevel', + value: 'DEBUG', + }, + { + name: 'HttpRequestId', + value: '85f8e869-9b32-49f7-a0b6-e1be33258230', + }, + { + name: 'HttpRequestNumber', + value: '972', + }, + { + name: 'HttpSessionId', + value: '0', + }, + ], + exception: null, + }, + { + timestamp: '2023-02-14T12:01:50.7176788+00:00', + level: 'Debug', + messageTemplate: '{IndexName} searcher refreshed? {DidRefresh}', + renderedMessage: '"ExternalIndex" searcher refreshed? False', + properties: [ + { + name: 'IndexName', + value: 'ExternalIndex', + }, + { + name: 'DidRefresh', + value: 'False', + }, + { + name: 'SourceContext', + value: 'Examine.Lucene.Providers.LuceneIndex', + }, + { + name: 'ActionId', + value: 'c4a4ecf3-34e7-4ff9-99ad-4aab0a23c3c2', + }, + { + name: 'ActionName', + value: 'Umbraco.Cms.Web.BackOffice.Controllers.ContentController.DeleteById (Umbraco.Web.BackOffice)', + }, + { + name: 'RequestId', + value: '4000005e-0004-fe00-b63f-84710c7967bb', + }, + { + name: 'RequestPath', + value: '/umbraco/backoffice/umbracoapi/content/DeleteById', + }, + { + name: 'ProcessId', + value: '17632', + }, + { + name: 'ProcessName', + value: 'iisexpress', + }, + { + name: 'ThreadId', + value: '57', + }, + { + name: 'ApplicationId', + value: '0cf9334a65daa2e8a69943c6db2fb730bb14f2de', + }, + { + name: 'MachineName', + value: 'DESKTOP-M35N63H', + }, + { + name: 'Log4NetLevel', + value: 'DEBUG', + }, + { + name: 'HttpRequestId', + value: '70effdd7-f20a-4c54-bdf1-573f12c5c4df', + }, + { + name: 'HttpRequestNumber', + value: '971', + }, + { + name: 'HttpSessionId', + value: '0', + }, + ], + exception: null, + }, + { + timestamp: '2023-02-14T12:01:45.7721389+00:00', + level: 'Debug', + messageTemplate: '{IndexName} searcher refreshed? {DidRefresh}', + renderedMessage: '"InternalIndex" searcher refreshed? False', + properties: [ + { + name: 'IndexName', + value: 'InternalIndex', + }, + { + name: 'DidRefresh', + value: 'False', + }, + { + name: 'SourceContext', + value: 'Examine.Lucene.Providers.LuceneIndex', + }, + { + name: 'ActionId', + value: '1d9a0529-a75a-40cc-be5d-c871548ab233', + }, + { + name: 'ActionName', + value: 'Umbraco.Cms.Web.BackOffice.Controllers.ContentController.EmptyRecycleBin (Umbraco.Web.BackOffice)', + }, + { + name: 'RequestId', + value: '4000002e-0005-ef00-b63f-84710c7967bb', + }, + { + name: 'RequestPath', + value: '/umbraco/backoffice/umbracoapi/content/EmptyRecycleBin', + }, + { + name: 'ProcessId', + value: '17632', + }, + { + name: 'ProcessName', + value: 'iisexpress', + }, + { + name: 'ThreadId', + value: '50', + }, + { + name: 'ApplicationId', + value: '0cf9334a65daa2e8a69943c6db2fb730bb14f2de', + }, + { + name: 'MachineName', + value: 'DESKTOP-M35N63H', + }, + { + name: 'Log4NetLevel', + value: 'DEBUG', + }, + { + name: 'HttpRequestId', + value: '62c6c02d-91b2-414d-82d6-ba6485cd901d', + }, + { + name: 'HttpRequestNumber', + value: '970', + }, + { + name: 'HttpSessionId', + value: '0', + }, + ], + exception: null, + }, + { + timestamp: '2023-02-14T12:01:45.7101655+00:00', + level: 'Debug', + messageTemplate: '{IndexName} searcher refreshed? {DidRefresh}', + renderedMessage: '"ExternalIndex" searcher refreshed? False', + properties: [ + { + name: 'IndexName', + value: 'ExternalIndex', + }, + { + name: 'DidRefresh', + value: 'False', + }, + { + name: 'SourceContext', + value: 'Examine.Lucene.Providers.LuceneIndex', + }, + { + name: 'ActionId', + value: 'c4a4ecf3-34e7-4ff9-99ad-4aab0a23c3c2', + }, + { + name: 'ActionName', + value: 'Umbraco.Cms.Web.BackOffice.Controllers.ContentController.DeleteById (Umbraco.Web.BackOffice)', + }, + { + name: 'RequestId', + value: '4000005e-0004-fe00-b63f-84710c7967bb', + }, + { + name: 'RequestPath', + value: '/umbraco/backoffice/umbracoapi/content/DeleteById', + }, + { + name: 'ProcessId', + value: '17632', + }, + { + name: 'ProcessName', + value: 'iisexpress', + }, + { + name: 'ThreadId', + value: '57', + }, + { + name: 'ApplicationId', + value: '0cf9334a65daa2e8a69943c6db2fb730bb14f2de', + }, + { + name: 'MachineName', + value: 'DESKTOP-M35N63H', + }, + { + name: 'Log4NetLevel', + value: 'DEBUG', + }, + { + name: 'HttpRequestId', + value: '88ee8366-0cbe-465f-ab06-39e082f62cc3', + }, + { + name: 'HttpRequestNumber', + value: '969', + }, + { + name: 'HttpSessionId', + value: '0', + }, + ], + exception: null, + }, + { + timestamp: '2023-02-14T12:01:40.7656432+00:00', + level: 'Debug', + messageTemplate: '{IndexName} searcher refreshed? {DidRefresh}', + renderedMessage: '"InternalIndex" searcher refreshed? False', + properties: [ + { + name: 'IndexName', + value: 'InternalIndex', + }, + { + name: 'DidRefresh', + value: 'False', + }, + { + name: 'SourceContext', + value: 'Examine.Lucene.Providers.LuceneIndex', + }, + { + name: 'ActionId', + value: '1d9a0529-a75a-40cc-be5d-c871548ab233', + }, + { + name: 'ActionName', + value: 'Umbraco.Cms.Web.BackOffice.Controllers.ContentController.EmptyRecycleBin (Umbraco.Web.BackOffice)', + }, + { + name: 'RequestId', + value: '4000002e-0005-ef00-b63f-84710c7967bb', + }, + { + name: 'RequestPath', + value: '/umbraco/backoffice/umbracoapi/content/EmptyRecycleBin', + }, + { + name: 'ProcessId', + value: '17632', + }, + { + name: 'ProcessName', + value: 'iisexpress', + }, + { + name: 'ThreadId', + value: '50', + }, + { + name: 'ApplicationId', + value: '0cf9334a65daa2e8a69943c6db2fb730bb14f2de', + }, + { + name: 'MachineName', + value: 'DESKTOP-M35N63H', + }, + { + name: 'Log4NetLevel', + value: 'DEBUG', + }, + { + name: 'HttpRequestId', + value: '72c6403d-097d-4274-b77e-9c33afe05705', + }, + { + name: 'HttpRequestNumber', + value: '968', + }, + { + name: 'HttpSessionId', + value: '0', + }, + ], + exception: null, + }, + { + timestamp: '2023-02-14T12:01:40.7034373+00:00', + level: 'Debug', + messageTemplate: '{IndexName} searcher refreshed? {DidRefresh}', + renderedMessage: '"ExternalIndex" searcher refreshed? False', + properties: [ + { + name: 'IndexName', + value: 'ExternalIndex', + }, + { + name: 'DidRefresh', + value: 'False', + }, + { + name: 'SourceContext', + value: 'Examine.Lucene.Providers.LuceneIndex', + }, + { + name: 'ActionId', + value: 'c4a4ecf3-34e7-4ff9-99ad-4aab0a23c3c2', + }, + { + name: 'ActionName', + value: 'Umbraco.Cms.Web.BackOffice.Controllers.ContentController.DeleteById (Umbraco.Web.BackOffice)', + }, + { + name: 'RequestId', + value: '4000005e-0004-fe00-b63f-84710c7967bb', + }, + { + name: 'RequestPath', + value: '/umbraco/backoffice/umbracoapi/content/DeleteById', + }, + { + name: 'ProcessId', + value: '17632', + }, + { + name: 'ProcessName', + value: 'iisexpress', + }, + { + name: 'ThreadId', + value: '57', + }, + { + name: 'ApplicationId', + value: '0cf9334a65daa2e8a69943c6db2fb730bb14f2de', + }, + { + name: 'MachineName', + value: 'DESKTOP-M35N63H', + }, + { + name: 'Log4NetLevel', + value: 'DEBUG', + }, + { + name: 'HttpRequestId', + value: 'da7ddb6d-ec9b-44aa-9376-b38f9dbf16ea', + }, + { + name: 'HttpRequestNumber', + value: '967', + }, + { + name: 'HttpSessionId', + value: '0', + }, + ], + exception: null, + }, + { + timestamp: '2023-02-14T12:01:35.7586458+00:00', + level: 'Debug', + messageTemplate: '{IndexName} searcher refreshed? {DidRefresh}', + renderedMessage: '"InternalIndex" searcher refreshed? False', + properties: [ + { + name: 'IndexName', + value: 'InternalIndex', + }, + { + name: 'DidRefresh', + value: 'False', + }, + { + name: 'SourceContext', + value: 'Examine.Lucene.Providers.LuceneIndex', + }, + { + name: 'ActionId', + value: '1d9a0529-a75a-40cc-be5d-c871548ab233', + }, + { + name: 'ActionName', + value: 'Umbraco.Cms.Web.BackOffice.Controllers.ContentController.EmptyRecycleBin (Umbraco.Web.BackOffice)', + }, + { + name: 'RequestId', + value: '4000002e-0005-ef00-b63f-84710c7967bb', + }, + { + name: 'RequestPath', + value: '/umbraco/backoffice/umbracoapi/content/EmptyRecycleBin', + }, + { + name: 'ProcessId', + value: '17632', + }, + { + name: 'ProcessName', + value: 'iisexpress', + }, + { + name: 'ThreadId', + value: '50', + }, + { + name: 'ApplicationId', + value: '0cf9334a65daa2e8a69943c6db2fb730bb14f2de', + }, + { + name: 'MachineName', + value: 'DESKTOP-M35N63H', + }, + { + name: 'Log4NetLevel', + value: 'DEBUG', + }, + { + name: 'HttpRequestId', + value: 'ada57301-d4fe-4399-acab-5506b96f0724', + }, + { + name: 'HttpRequestNumber', + value: '966', + }, + { + name: 'HttpSessionId', + value: '0', + }, + ], + exception: null, + }, + { + timestamp: '2023-02-14T12:01:35.6957643+00:00', + level: 'Debug', + messageTemplate: '{IndexName} searcher refreshed? {DidRefresh}', + renderedMessage: '"ExternalIndex" searcher refreshed? False', + properties: [ + { + name: 'IndexName', + value: 'ExternalIndex', + }, + { + name: 'DidRefresh', + value: 'False', + }, + { + name: 'SourceContext', + value: 'Examine.Lucene.Providers.LuceneIndex', + }, + { + name: 'ActionId', + value: 'c4a4ecf3-34e7-4ff9-99ad-4aab0a23c3c2', + }, + { + name: 'ActionName', + value: 'Umbraco.Cms.Web.BackOffice.Controllers.ContentController.DeleteById (Umbraco.Web.BackOffice)', + }, + { + name: 'RequestId', + value: '4000005e-0004-fe00-b63f-84710c7967bb', + }, + { + name: 'RequestPath', + value: '/umbraco/backoffice/umbracoapi/content/DeleteById', + }, + { + name: 'ProcessId', + value: '17632', + }, + { + name: 'ProcessName', + value: 'iisexpress', + }, + { + name: 'ThreadId', + value: '57', + }, + { + name: 'ApplicationId', + value: '0cf9334a65daa2e8a69943c6db2fb730bb14f2de', + }, + { + name: 'MachineName', + value: 'DESKTOP-M35N63H', + }, + { + name: 'Log4NetLevel', + value: 'DEBUG', + }, + { + name: 'HttpRequestId', + value: '4603522a-12fa-43fa-b171-170c0a7dee91', + }, + { + name: 'HttpRequestNumber', + value: '965', + }, + { + name: 'HttpSessionId', + value: '0', + }, + ], + exception: null, + }, + { + timestamp: '2023-02-14T12:01:30.7559798+00:00', + level: 'Debug', + messageTemplate: '{IndexName} searcher refreshed? {DidRefresh}', + renderedMessage: '"InternalIndex" searcher refreshed? False', + properties: [ + { + name: 'IndexName', + value: 'InternalIndex', + }, + { + name: 'DidRefresh', + value: 'False', + }, + { + name: 'SourceContext', + value: 'Examine.Lucene.Providers.LuceneIndex', + }, + { + name: 'ActionId', + value: '1d9a0529-a75a-40cc-be5d-c871548ab233', + }, + { + name: 'ActionName', + value: 'Umbraco.Cms.Web.BackOffice.Controllers.ContentController.EmptyRecycleBin (Umbraco.Web.BackOffice)', + }, + { + name: 'RequestId', + value: '4000002e-0005-ef00-b63f-84710c7967bb', + }, + { + name: 'RequestPath', + value: '/umbraco/backoffice/umbracoapi/content/EmptyRecycleBin', + }, + { + name: 'ProcessId', + value: '17632', + }, + { + name: 'ProcessName', + value: 'iisexpress', + }, + { + name: 'ThreadId', + value: '50', + }, + { + name: 'ApplicationId', + value: '0cf9334a65daa2e8a69943c6db2fb730bb14f2de', + }, + { + name: 'MachineName', + value: 'DESKTOP-M35N63H', + }, + { + name: 'Log4NetLevel', + value: 'DEBUG', + }, + { + name: 'HttpRequestId', + value: 'bb012edc-36c7-4426-86e3-525e8c2ff44e', + }, + { + name: 'HttpRequestNumber', + value: '964', + }, + { + name: 'HttpSessionId', + value: '0', + }, + ], + exception: null, + }, + { + timestamp: '2023-02-14T12:01:30.6937419+00:00', + level: 'Debug', + messageTemplate: '{IndexName} searcher refreshed? {DidRefresh}', + renderedMessage: '"ExternalIndex" searcher refreshed? False', + properties: [ + { + name: 'IndexName', + value: 'ExternalIndex', + }, + { + name: 'DidRefresh', + value: 'False', + }, + { + name: 'SourceContext', + value: 'Examine.Lucene.Providers.LuceneIndex', + }, + { + name: 'ActionId', + value: 'c4a4ecf3-34e7-4ff9-99ad-4aab0a23c3c2', + }, + { + name: 'ActionName', + value: 'Umbraco.Cms.Web.BackOffice.Controllers.ContentController.DeleteById (Umbraco.Web.BackOffice)', + }, + { + name: 'RequestId', + value: '4000005e-0004-fe00-b63f-84710c7967bb', + }, + { + name: 'RequestPath', + value: '/umbraco/backoffice/umbracoapi/content/DeleteById', + }, + { + name: 'ProcessId', + value: '17632', + }, + { + name: 'ProcessName', + value: 'iisexpress', + }, + { + name: 'ThreadId', + value: '57', + }, + { + name: 'ApplicationId', + value: '0cf9334a65daa2e8a69943c6db2fb730bb14f2de', + }, + { + name: 'MachineName', + value: 'DESKTOP-M35N63H', + }, + { + name: 'Log4NetLevel', + value: 'DEBUG', + }, + { + name: 'HttpRequestId', + value: '1180c2e4-ede3-458a-97ca-c733b4224718', + }, + { + name: 'HttpRequestNumber', + value: '963', + }, + { + name: 'HttpSessionId', + value: '0', + }, + ], + exception: null, + }, + { + timestamp: '2023-02-14T12:01:25.744449+00:00', + level: 'Debug', + messageTemplate: '{IndexName} searcher refreshed? {DidRefresh}', + renderedMessage: '"InternalIndex" searcher refreshed? False', + properties: [ + { + name: 'IndexName', + value: 'InternalIndex', + }, + { + name: 'DidRefresh', + value: 'False', + }, + { + name: 'SourceContext', + value: 'Examine.Lucene.Providers.LuceneIndex', + }, + { + name: 'ActionId', + value: '1d9a0529-a75a-40cc-be5d-c871548ab233', + }, + { + name: 'ActionName', + value: 'Umbraco.Cms.Web.BackOffice.Controllers.ContentController.EmptyRecycleBin (Umbraco.Web.BackOffice)', + }, + { + name: 'RequestId', + value: '4000002e-0005-ef00-b63f-84710c7967bb', + }, + { + name: 'RequestPath', + value: '/umbraco/backoffice/umbracoapi/content/EmptyRecycleBin', + }, + { + name: 'ProcessId', + value: '17632', + }, + { + name: 'ProcessName', + value: 'iisexpress', + }, + { + name: 'ThreadId', + value: '50', + }, + { + name: 'ApplicationId', + value: '0cf9334a65daa2e8a69943c6db2fb730bb14f2de', + }, + { + name: 'MachineName', + value: 'DESKTOP-M35N63H', + }, + { + name: 'Log4NetLevel', + value: 'DEBUG', + }, + { + name: 'HttpRequestId', + value: '7c5d8901-3453-402d-881c-12d3c4d9477a', + }, + { + name: 'HttpRequestNumber', + value: '962', + }, + { + name: 'HttpSessionId', + value: '0', + }, + ], + exception: null, + }, + { + timestamp: '2023-02-14T12:01:25.6824877+00:00', + level: 'Debug', + messageTemplate: '{IndexName} searcher refreshed? {DidRefresh}', + renderedMessage: '"ExternalIndex" searcher refreshed? False', + properties: [ + { + name: 'IndexName', + value: 'ExternalIndex', + }, + { + name: 'DidRefresh', + value: 'False', + }, + { + name: 'SourceContext', + value: 'Examine.Lucene.Providers.LuceneIndex', + }, + { + name: 'ActionId', + value: 'c4a4ecf3-34e7-4ff9-99ad-4aab0a23c3c2', + }, + { + name: 'ActionName', + value: 'Umbraco.Cms.Web.BackOffice.Controllers.ContentController.DeleteById (Umbraco.Web.BackOffice)', + }, + { + name: 'RequestId', + value: '4000005e-0004-fe00-b63f-84710c7967bb', + }, + { + name: 'RequestPath', + value: '/umbraco/backoffice/umbracoapi/content/DeleteById', + }, + { + name: 'ProcessId', + value: '17632', + }, + { + name: 'ProcessName', + value: 'iisexpress', + }, + { + name: 'ThreadId', + value: '57', + }, + { + name: 'ApplicationId', + value: '0cf9334a65daa2e8a69943c6db2fb730bb14f2de', + }, + { + name: 'MachineName', + value: 'DESKTOP-M35N63H', + }, + { + name: 'Log4NetLevel', + value: 'DEBUG', + }, + { + name: 'HttpRequestId', + value: 'a2ae4602-2a58-4521-99dd-6fa41562b004', + }, + { + name: 'HttpRequestNumber', + value: '961', + }, + { + name: 'HttpSessionId', + value: '0', + }, + ], + exception: null, + }, + { + timestamp: '2023-02-14T12:01:20.7317217+00:00', + level: 'Debug', + messageTemplate: '{IndexName} searcher refreshed? {DidRefresh}', + renderedMessage: '"InternalIndex" searcher refreshed? False', + properties: [ + { + name: 'IndexName', + value: 'InternalIndex', + }, + { + name: 'DidRefresh', + value: 'False', + }, + { + name: 'SourceContext', + value: 'Examine.Lucene.Providers.LuceneIndex', + }, + { + name: 'ActionId', + value: '1d9a0529-a75a-40cc-be5d-c871548ab233', + }, + { + name: 'ActionName', + value: 'Umbraco.Cms.Web.BackOffice.Controllers.ContentController.EmptyRecycleBin (Umbraco.Web.BackOffice)', + }, + { + name: 'RequestId', + value: '4000002e-0005-ef00-b63f-84710c7967bb', + }, + { + name: 'RequestPath', + value: '/umbraco/backoffice/umbracoapi/content/EmptyRecycleBin', + }, + { + name: 'ProcessId', + value: '17632', + }, + { + name: 'ProcessName', + value: 'iisexpress', + }, + { + name: 'ThreadId', + value: '50', + }, + { + name: 'ApplicationId', + value: '0cf9334a65daa2e8a69943c6db2fb730bb14f2de', + }, + { + name: 'MachineName', + value: 'DESKTOP-M35N63H', + }, + { + name: 'Log4NetLevel', + value: 'DEBUG', + }, + { + name: 'HttpRequestId', + value: '0b55b0c8-57f3-4ed9-ae8e-1cb85cb11077', + }, + { + name: 'HttpRequestNumber', + value: '960', + }, + { + name: 'HttpSessionId', + value: '0', + }, + ], + exception: null, + }, + { + timestamp: '2023-02-14T12:01:20.6696118+00:00', + level: 'Debug', + messageTemplate: '{IndexName} searcher refreshed? {DidRefresh}', + renderedMessage: '"ExternalIndex" searcher refreshed? False', + properties: [ + { + name: 'IndexName', + value: 'ExternalIndex', + }, + { + name: 'DidRefresh', + value: 'False', + }, + { + name: 'SourceContext', + value: 'Examine.Lucene.Providers.LuceneIndex', + }, + { + name: 'ActionId', + value: 'c4a4ecf3-34e7-4ff9-99ad-4aab0a23c3c2', + }, + { + name: 'ActionName', + value: 'Umbraco.Cms.Web.BackOffice.Controllers.ContentController.DeleteById (Umbraco.Web.BackOffice)', + }, + { + name: 'RequestId', + value: '4000005e-0004-fe00-b63f-84710c7967bb', + }, + { + name: 'RequestPath', + value: '/umbraco/backoffice/umbracoapi/content/DeleteById', + }, + { + name: 'ProcessId', + value: '17632', + }, + { + name: 'ProcessName', + value: 'iisexpress', + }, + { + name: 'ThreadId', + value: '57', + }, + { + name: 'ApplicationId', + value: '0cf9334a65daa2e8a69943c6db2fb730bb14f2de', + }, + { + name: 'MachineName', + value: 'DESKTOP-M35N63H', + }, + { + name: 'Log4NetLevel', + value: 'DEBUG', + }, + { + name: 'HttpRequestId', + value: 'c502a5a8-c8cb-4cec-ac6c-f9b66b3bad33', + }, + { + name: 'HttpRequestNumber', + value: '959', + }, + { + name: 'HttpSessionId', + value: '0', + }, + ], + exception: null, + }, + { + timestamp: '2023-02-14T12:01:15.724729+00:00', + level: 'Debug', + messageTemplate: '{IndexName} searcher refreshed? {DidRefresh}', + renderedMessage: '"InternalIndex" searcher refreshed? False', + properties: [ + { + name: 'IndexName', + value: 'InternalIndex', + }, + { + name: 'DidRefresh', + value: 'False', + }, + { + name: 'SourceContext', + value: 'Examine.Lucene.Providers.LuceneIndex', + }, + { + name: 'ActionId', + value: '1d9a0529-a75a-40cc-be5d-c871548ab233', + }, + { + name: 'ActionName', + value: 'Umbraco.Cms.Web.BackOffice.Controllers.ContentController.EmptyRecycleBin (Umbraco.Web.BackOffice)', + }, + { + name: 'RequestId', + value: '4000002e-0005-ef00-b63f-84710c7967bb', + }, + { + name: 'RequestPath', + value: '/umbraco/backoffice/umbracoapi/content/EmptyRecycleBin', + }, + { + name: 'ProcessId', + value: '17632', + }, + { + name: 'ProcessName', + value: 'iisexpress', + }, + { + name: 'ThreadId', + value: '50', + }, + { + name: 'ApplicationId', + value: '0cf9334a65daa2e8a69943c6db2fb730bb14f2de', + }, + { + name: 'MachineName', + value: 'DESKTOP-M35N63H', + }, + { + name: 'Log4NetLevel', + value: 'DEBUG', + }, + { + name: 'HttpRequestId', + value: 'bcada94f-9851-4c81-8da0-1bf27be66573', + }, + { + name: 'HttpRequestNumber', + value: '958', + }, + { + name: 'HttpSessionId', + value: '0', + }, + ], + exception: null, + }, + { + timestamp: '2023-02-14T12:01:15.662463+00:00', + level: 'Debug', + messageTemplate: '{IndexName} searcher refreshed? {DidRefresh}', + renderedMessage: '"ExternalIndex" searcher refreshed? False', + properties: [ + { + name: 'IndexName', + value: 'ExternalIndex', + }, + { + name: 'DidRefresh', + value: 'False', + }, + { + name: 'SourceContext', + value: 'Examine.Lucene.Providers.LuceneIndex', + }, + { + name: 'ActionId', + value: 'c4a4ecf3-34e7-4ff9-99ad-4aab0a23c3c2', + }, + { + name: 'ActionName', + value: 'Umbraco.Cms.Web.BackOffice.Controllers.ContentController.DeleteById (Umbraco.Web.BackOffice)', + }, + { + name: 'RequestId', + value: '4000005e-0004-fe00-b63f-84710c7967bb', + }, + { + name: 'RequestPath', + value: '/umbraco/backoffice/umbracoapi/content/DeleteById', + }, + { + name: 'ProcessId', + value: '17632', + }, + { + name: 'ProcessName', + value: 'iisexpress', + }, + { + name: 'ThreadId', + value: '57', + }, + { + name: 'ApplicationId', + value: '0cf9334a65daa2e8a69943c6db2fb730bb14f2de', + }, + { + name: 'MachineName', + value: 'DESKTOP-M35N63H', + }, + { + name: 'Log4NetLevel', + value: 'DEBUG', + }, + { + name: 'HttpRequestId', + value: 'f761bc23-9e7f-45e7-8847-7885624dd261', + }, + { + name: 'HttpRequestNumber', + value: '957', + }, + { + name: 'HttpSessionId', + value: '0', + }, + ], + exception: null, + }, + { + timestamp: '2023-02-14T12:01:10.7235889+00:00', + level: 'Debug', + messageTemplate: '{IndexName} searcher refreshed? {DidRefresh}', + renderedMessage: '"InternalIndex" searcher refreshed? False', + properties: [ + { + name: 'IndexName', + value: 'InternalIndex', + }, + { + name: 'DidRefresh', + value: 'False', + }, + { + name: 'SourceContext', + value: 'Examine.Lucene.Providers.LuceneIndex', + }, + { + name: 'ActionId', + value: '1d9a0529-a75a-40cc-be5d-c871548ab233', + }, + { + name: 'ActionName', + value: 'Umbraco.Cms.Web.BackOffice.Controllers.ContentController.EmptyRecycleBin (Umbraco.Web.BackOffice)', + }, + { + name: 'RequestId', + value: '4000002e-0005-ef00-b63f-84710c7967bb', + }, + { + name: 'RequestPath', + value: '/umbraco/backoffice/umbracoapi/content/EmptyRecycleBin', + }, + { + name: 'ProcessId', + value: '17632', + }, + { + name: 'ProcessName', + value: 'iisexpress', + }, + { + name: 'ThreadId', + value: '50', + }, + { + name: 'ApplicationId', + value: '0cf9334a65daa2e8a69943c6db2fb730bb14f2de', + }, + { + name: 'MachineName', + value: 'DESKTOP-M35N63H', + }, + { + name: 'Log4NetLevel', + value: 'DEBUG', + }, + { + name: 'HttpRequestId', + value: '88785b30-85c1-40da-bba9-0663c5b38817', + }, + { + name: 'HttpRequestNumber', + value: '956', + }, + { + name: 'HttpSessionId', + value: '0', + }, + ], + exception: null, + }, + { + timestamp: '2023-02-14T12:01:10.6605318+00:00', + level: 'Debug', + messageTemplate: '{IndexName} searcher refreshed? {DidRefresh}', + renderedMessage: '"ExternalIndex" searcher refreshed? False', + properties: [ + { + name: 'IndexName', + value: 'ExternalIndex', + }, + { + name: 'DidRefresh', + value: 'False', + }, + { + name: 'SourceContext', + value: 'Examine.Lucene.Providers.LuceneIndex', + }, + { + name: 'ActionId', + value: 'c4a4ecf3-34e7-4ff9-99ad-4aab0a23c3c2', + }, + { + name: 'ActionName', + value: 'Umbraco.Cms.Web.BackOffice.Controllers.ContentController.DeleteById (Umbraco.Web.BackOffice)', + }, + { + name: 'RequestId', + value: '4000005e-0004-fe00-b63f-84710c7967bb', + }, + { + name: 'RequestPath', + value: '/umbraco/backoffice/umbracoapi/content/DeleteById', + }, + { + name: 'ProcessId', + value: '17632', + }, + { + name: 'ProcessName', + value: 'iisexpress', + }, + { + name: 'ThreadId', + value: '57', + }, + { + name: 'ApplicationId', + value: '0cf9334a65daa2e8a69943c6db2fb730bb14f2de', + }, + { + name: 'MachineName', + value: 'DESKTOP-M35N63H', + }, + { + name: 'Log4NetLevel', + value: 'DEBUG', + }, + { + name: 'HttpRequestId', + value: 'a26b64b4-5b83-405d-9860-e01bcbc0edaa', + }, + { + name: 'HttpRequestNumber', + value: '955', + }, + { + name: 'HttpSessionId', + value: '0', + }, + ], + exception: null, + }, + { + timestamp: '2023-02-14T12:01:05.7157154+00:00', + level: 'Debug', + messageTemplate: '{IndexName} searcher refreshed? {DidRefresh}', + renderedMessage: '"InternalIndex" searcher refreshed? False', + properties: [ + { + name: 'IndexName', + value: 'InternalIndex', + }, + { + name: 'DidRefresh', + value: 'False', + }, + { + name: 'SourceContext', + value: 'Examine.Lucene.Providers.LuceneIndex', + }, + { + name: 'ActionId', + value: '1d9a0529-a75a-40cc-be5d-c871548ab233', + }, + { + name: 'ActionName', + value: 'Umbraco.Cms.Web.BackOffice.Controllers.ContentController.EmptyRecycleBin (Umbraco.Web.BackOffice)', + }, + { + name: 'RequestId', + value: '4000002e-0005-ef00-b63f-84710c7967bb', + }, + { + name: 'RequestPath', + value: '/umbraco/backoffice/umbracoapi/content/EmptyRecycleBin', + }, + { + name: 'ProcessId', + value: '17632', + }, + { + name: 'ProcessName', + value: 'iisexpress', + }, + { + name: 'ThreadId', + value: '50', + }, + { + name: 'ApplicationId', + value: '0cf9334a65daa2e8a69943c6db2fb730bb14f2de', + }, + { + name: 'MachineName', + value: 'DESKTOP-M35N63H', + }, + { + name: 'Log4NetLevel', + value: 'DEBUG', + }, + { + name: 'HttpRequestId', + value: 'b192ac30-88f0-476d-a9ab-6462a4ca5195', + }, + { + name: 'HttpRequestNumber', + value: '954', + }, + { + name: 'HttpSessionId', + value: '0', + }, + ], + exception: null, + }, + { + timestamp: '2023-02-14T12:01:05.6547824+00:00', + level: 'Debug', + messageTemplate: '{IndexName} searcher refreshed? {DidRefresh}', + renderedMessage: '"ExternalIndex" searcher refreshed? False', + properties: [ + { + name: 'IndexName', + value: 'ExternalIndex', + }, + { + name: 'DidRefresh', + value: 'False', + }, + { + name: 'SourceContext', + value: 'Examine.Lucene.Providers.LuceneIndex', + }, + { + name: 'ActionId', + value: 'c4a4ecf3-34e7-4ff9-99ad-4aab0a23c3c2', + }, + { + name: 'ActionName', + value: 'Umbraco.Cms.Web.BackOffice.Controllers.ContentController.DeleteById (Umbraco.Web.BackOffice)', + }, + { + name: 'RequestId', + value: '4000005e-0004-fe00-b63f-84710c7967bb', + }, + { + name: 'RequestPath', + value: '/umbraco/backoffice/umbracoapi/content/DeleteById', + }, + { + name: 'ProcessId', + value: '17632', + }, + { + name: 'ProcessName', + value: 'iisexpress', + }, + { + name: 'ThreadId', + value: '57', + }, + { + name: 'ApplicationId', + value: '0cf9334a65daa2e8a69943c6db2fb730bb14f2de', + }, + { + name: 'MachineName', + value: 'DESKTOP-M35N63H', + }, + { + name: 'Log4NetLevel', + value: 'DEBUG', + }, + { + name: 'HttpRequestId', + value: '97ee6cef-af1e-472a-acf0-d296890a1916', + }, + { + name: 'HttpRequestNumber', + value: '953', + }, + { + name: 'HttpSessionId', + value: '0', + }, + ], + exception: null, + }, + { + timestamp: '2023-02-14T12:01:00.7039952+00:00', + level: 'Debug', + messageTemplate: '{IndexName} searcher refreshed? {DidRefresh}', + renderedMessage: '"InternalIndex" searcher refreshed? False', + properties: [ + { + name: 'IndexName', + value: 'InternalIndex', + }, + { + name: 'DidRefresh', + value: 'False', + }, + { + name: 'SourceContext', + value: 'Examine.Lucene.Providers.LuceneIndex', + }, + { + name: 'ActionId', + value: '1d9a0529-a75a-40cc-be5d-c871548ab233', + }, + { + name: 'ActionName', + value: 'Umbraco.Cms.Web.BackOffice.Controllers.ContentController.EmptyRecycleBin (Umbraco.Web.BackOffice)', + }, + { + name: 'RequestId', + value: '4000002e-0005-ef00-b63f-84710c7967bb', + }, + { + name: 'RequestPath', + value: '/umbraco/backoffice/umbracoapi/content/EmptyRecycleBin', + }, + { + name: 'ProcessId', + value: '17632', + }, + { + name: 'ProcessName', + value: 'iisexpress', + }, + { + name: 'ThreadId', + value: '50', + }, + { + name: 'ApplicationId', + value: '0cf9334a65daa2e8a69943c6db2fb730bb14f2de', + }, + { + name: 'MachineName', + value: 'DESKTOP-M35N63H', + }, + { + name: 'Log4NetLevel', + value: 'DEBUG', + }, + { + name: 'HttpRequestId', + value: 'b537e0e1-e4ed-4f6b-afce-11c19a798632', + }, + { + name: 'HttpRequestNumber', + value: '952', + }, + { + name: 'HttpSessionId', + value: '0', + }, + ], + exception: null, + }, + { + timestamp: '2023-02-14T12:01:00.6417516+00:00', + level: 'Debug', + messageTemplate: '{IndexName} searcher refreshed? {DidRefresh}', + renderedMessage: '"ExternalIndex" searcher refreshed? False', + properties: [ + { + name: 'IndexName', + value: 'ExternalIndex', + }, + { + name: 'DidRefresh', + value: 'False', + }, + { + name: 'SourceContext', + value: 'Examine.Lucene.Providers.LuceneIndex', + }, + { + name: 'ActionId', + value: 'c4a4ecf3-34e7-4ff9-99ad-4aab0a23c3c2', + }, + { + name: 'ActionName', + value: 'Umbraco.Cms.Web.BackOffice.Controllers.ContentController.DeleteById (Umbraco.Web.BackOffice)', + }, + { + name: 'RequestId', + value: '4000005e-0004-fe00-b63f-84710c7967bb', + }, + { + name: 'RequestPath', + value: '/umbraco/backoffice/umbracoapi/content/DeleteById', + }, + { + name: 'ProcessId', + value: '17632', + }, + { + name: 'ProcessName', + value: 'iisexpress', + }, + { + name: 'ThreadId', + value: '57', + }, + { + name: 'ApplicationId', + value: '0cf9334a65daa2e8a69943c6db2fb730bb14f2de', + }, + { + name: 'MachineName', + value: 'DESKTOP-M35N63H', + }, + { + name: 'Log4NetLevel', + value: 'DEBUG', + }, + { + name: 'HttpRequestId', + value: '3011bb2a-e3df-4dc6-a46d-9619287ad9bb', + }, + { + name: 'HttpRequestNumber', + value: '951', + }, + { + name: 'HttpSessionId', + value: '0', + }, + ], + exception: null, + }, + { + timestamp: '2023-02-14T12:00:55.6948223+00:00', + level: 'Debug', + messageTemplate: '{IndexName} searcher refreshed? {DidRefresh}', + renderedMessage: '"InternalIndex" searcher refreshed? False', + properties: [ + { + name: 'IndexName', + value: 'InternalIndex', + }, + { + name: 'DidRefresh', + value: 'False', + }, + { + name: 'SourceContext', + value: 'Examine.Lucene.Providers.LuceneIndex', + }, + { + name: 'ActionId', + value: '1d9a0529-a75a-40cc-be5d-c871548ab233', + }, + { + name: 'ActionName', + value: 'Umbraco.Cms.Web.BackOffice.Controllers.ContentController.EmptyRecycleBin (Umbraco.Web.BackOffice)', + }, + { + name: 'RequestId', + value: '4000002e-0005-ef00-b63f-84710c7967bb', + }, + { + name: 'RequestPath', + value: '/umbraco/backoffice/umbracoapi/content/EmptyRecycleBin', + }, + { + name: 'ProcessId', + value: '17632', + }, + { + name: 'ProcessName', + value: 'iisexpress', + }, + { + name: 'ThreadId', + value: '50', + }, + { + name: 'ApplicationId', + value: '0cf9334a65daa2e8a69943c6db2fb730bb14f2de', + }, + { + name: 'MachineName', + value: 'DESKTOP-M35N63H', + }, + { + name: 'Log4NetLevel', + value: 'DEBUG', + }, + { + name: 'HttpRequestId', + value: 'f43990a1-fdeb-4169-85c1-60b6833b4c82', + }, + { + name: 'HttpRequestNumber', + value: '950', + }, + { + name: 'HttpSessionId', + value: '0', + }, + ], + exception: null, + }, + { + timestamp: '2023-02-14T12:00:55.6326808+00:00', + level: 'Debug', + messageTemplate: '{IndexName} searcher refreshed? {DidRefresh}', + renderedMessage: '"ExternalIndex" searcher refreshed? False', + properties: [ + { + name: 'IndexName', + value: 'ExternalIndex', + }, + { + name: 'DidRefresh', + value: 'False', + }, + { + name: 'SourceContext', + value: 'Examine.Lucene.Providers.LuceneIndex', + }, + { + name: 'ActionId', + value: 'c4a4ecf3-34e7-4ff9-99ad-4aab0a23c3c2', + }, + { + name: 'ActionName', + value: 'Umbraco.Cms.Web.BackOffice.Controllers.ContentController.DeleteById (Umbraco.Web.BackOffice)', + }, + { + name: 'RequestId', + value: '4000005e-0004-fe00-b63f-84710c7967bb', + }, + { + name: 'RequestPath', + value: '/umbraco/backoffice/umbracoapi/content/DeleteById', + }, + { + name: 'ProcessId', + value: '17632', + }, + { + name: 'ProcessName', + value: 'iisexpress', + }, + { + name: 'ThreadId', + value: '57', + }, + { + name: 'ApplicationId', + value: '0cf9334a65daa2e8a69943c6db2fb730bb14f2de', + }, + { + name: 'MachineName', + value: 'DESKTOP-M35N63H', + }, + { + name: 'Log4NetLevel', + value: 'DEBUG', + }, + { + name: 'HttpRequestId', + value: '43def4b0-c9e6-41db-9031-f7c3fc112900', + }, + { + name: 'HttpRequestNumber', + value: '949', + }, + { + name: 'HttpSessionId', + value: '0', + }, + ], + exception: null, + }, + { + timestamp: '2023-02-14T12:00:50.6948589+00:00', + level: 'Debug', + messageTemplate: '{IndexName} searcher refreshed? {DidRefresh}', + renderedMessage: '"InternalIndex" searcher refreshed? False', + properties: [ + { + name: 'IndexName', + value: 'InternalIndex', + }, + { + name: 'DidRefresh', + value: 'False', + }, + { + name: 'SourceContext', + value: 'Examine.Lucene.Providers.LuceneIndex', + }, + { + name: 'ActionId', + value: '1d9a0529-a75a-40cc-be5d-c871548ab233', + }, + { + name: 'ActionName', + value: 'Umbraco.Cms.Web.BackOffice.Controllers.ContentController.EmptyRecycleBin (Umbraco.Web.BackOffice)', + }, + { + name: 'RequestId', + value: '4000002e-0005-ef00-b63f-84710c7967bb', + }, + { + name: 'RequestPath', + value: '/umbraco/backoffice/umbracoapi/content/EmptyRecycleBin', + }, + { + name: 'ProcessId', + value: '17632', + }, + { + name: 'ProcessName', + value: 'iisexpress', + }, + { + name: 'ThreadId', + value: '50', + }, + { + name: 'ApplicationId', + value: '0cf9334a65daa2e8a69943c6db2fb730bb14f2de', + }, + { + name: 'MachineName', + value: 'DESKTOP-M35N63H', + }, + { + name: 'Log4NetLevel', + value: 'DEBUG', + }, + { + name: 'HttpRequestId', + value: 'e048057f-5dc0-408f-a560-2044b99e53a3', + }, + { + name: 'HttpRequestNumber', + value: '948', + }, + { + name: 'HttpSessionId', + value: '0', + }, + ], + exception: null, + }, + { + timestamp: '2023-02-14T12:00:50.632697+00:00', + level: 'Debug', + messageTemplate: '{IndexName} searcher refreshed? {DidRefresh}', + renderedMessage: '"ExternalIndex" searcher refreshed? False', + properties: [ + { + name: 'IndexName', + value: 'ExternalIndex', + }, + { + name: 'DidRefresh', + value: 'False', + }, + { + name: 'SourceContext', + value: 'Examine.Lucene.Providers.LuceneIndex', + }, + { + name: 'ActionId', + value: 'c4a4ecf3-34e7-4ff9-99ad-4aab0a23c3c2', + }, + { + name: 'ActionName', + value: 'Umbraco.Cms.Web.BackOffice.Controllers.ContentController.DeleteById (Umbraco.Web.BackOffice)', + }, + { + name: 'RequestId', + value: '4000005e-0004-fe00-b63f-84710c7967bb', + }, + { + name: 'RequestPath', + value: '/umbraco/backoffice/umbracoapi/content/DeleteById', + }, + { + name: 'ProcessId', + value: '17632', + }, + { + name: 'ProcessName', + value: 'iisexpress', + }, + { + name: 'ThreadId', + value: '57', + }, + { + name: 'ApplicationId', + value: '0cf9334a65daa2e8a69943c6db2fb730bb14f2de', + }, + { + name: 'MachineName', + value: 'DESKTOP-M35N63H', + }, + { + name: 'Log4NetLevel', + value: 'DEBUG', + }, + { + name: 'HttpRequestId', + value: 'ff426368-f6e5-4e9d-a2d2-0d061bedb688', + }, + { + name: 'HttpRequestNumber', + value: '947', + }, + { + name: 'HttpSessionId', + value: '0', + }, + ], + exception: null, + }, + { + timestamp: '2023-02-14T12:00:45.6943493+00:00', + level: 'Debug', + messageTemplate: '{IndexName} searcher refreshed? {DidRefresh}', + renderedMessage: '"InternalIndex" searcher refreshed? False', + properties: [ + { + name: 'IndexName', + value: 'InternalIndex', + }, + { + name: 'DidRefresh', + value: 'False', + }, + { + name: 'SourceContext', + value: 'Examine.Lucene.Providers.LuceneIndex', + }, + { + name: 'ActionId', + value: '1d9a0529-a75a-40cc-be5d-c871548ab233', + }, + { + name: 'ActionName', + value: 'Umbraco.Cms.Web.BackOffice.Controllers.ContentController.EmptyRecycleBin (Umbraco.Web.BackOffice)', + }, + { + name: 'RequestId', + value: '4000002e-0005-ef00-b63f-84710c7967bb', + }, + { + name: 'RequestPath', + value: '/umbraco/backoffice/umbracoapi/content/EmptyRecycleBin', + }, + { + name: 'ProcessId', + value: '17632', + }, + { + name: 'ProcessName', + value: 'iisexpress', + }, + { + name: 'ThreadId', + value: '50', + }, + { + name: 'ApplicationId', + value: '0cf9334a65daa2e8a69943c6db2fb730bb14f2de', + }, + { + name: 'MachineName', + value: 'DESKTOP-M35N63H', + }, + { + name: 'Log4NetLevel', + value: 'DEBUG', + }, + { + name: 'HttpRequestId', + value: '0f2f6a91-487b-440d-9350-9737bed00c8d', + }, + { + name: 'HttpRequestNumber', + value: '946', + }, + { + name: 'HttpSessionId', + value: '0', + }, + ], + exception: null, + }, + { + timestamp: '2023-02-14T12:00:45.6319218+00:00', + level: 'Debug', + messageTemplate: '{IndexName} searcher refreshed? {DidRefresh}', + renderedMessage: '"ExternalIndex" searcher refreshed? False', + properties: [ + { + name: 'IndexName', + value: 'ExternalIndex', + }, + { + name: 'DidRefresh', + value: 'False', + }, + { + name: 'SourceContext', + value: 'Examine.Lucene.Providers.LuceneIndex', + }, + { + name: 'ActionId', + value: 'c4a4ecf3-34e7-4ff9-99ad-4aab0a23c3c2', + }, + { + name: 'ActionName', + value: 'Umbraco.Cms.Web.BackOffice.Controllers.ContentController.DeleteById (Umbraco.Web.BackOffice)', + }, + { + name: 'RequestId', + value: '4000005e-0004-fe00-b63f-84710c7967bb', + }, + { + name: 'RequestPath', + value: '/umbraco/backoffice/umbracoapi/content/DeleteById', + }, + { + name: 'ProcessId', + value: '17632', + }, + { + name: 'ProcessName', + value: 'iisexpress', + }, + { + name: 'ThreadId', + value: '57', + }, + { + name: 'ApplicationId', + value: '0cf9334a65daa2e8a69943c6db2fb730bb14f2de', + }, + { + name: 'MachineName', + value: 'DESKTOP-M35N63H', + }, + { + name: 'Log4NetLevel', + value: 'DEBUG', + }, + { + name: 'HttpRequestId', + value: 'fc244d40-46ae-49f9-8eee-ef5e41738283', + }, + { + name: 'HttpRequestNumber', + value: '945', + }, + { + name: 'HttpSessionId', + value: '0', + }, + ], + exception: null, + }, + { + timestamp: '2023-02-14T12:00:40.6902419+00:00', + level: 'Debug', + messageTemplate: '{IndexName} searcher refreshed? {DidRefresh}', + renderedMessage: '"InternalIndex" searcher refreshed? False', + properties: [ + { + name: 'IndexName', + value: 'InternalIndex', + }, + { + name: 'DidRefresh', + value: 'False', + }, + { + name: 'SourceContext', + value: 'Examine.Lucene.Providers.LuceneIndex', + }, + { + name: 'ActionId', + value: '1d9a0529-a75a-40cc-be5d-c871548ab233', + }, + { + name: 'ActionName', + value: 'Umbraco.Cms.Web.BackOffice.Controllers.ContentController.EmptyRecycleBin (Umbraco.Web.BackOffice)', + }, + { + name: 'RequestId', + value: '4000002e-0005-ef00-b63f-84710c7967bb', + }, + { + name: 'RequestPath', + value: '/umbraco/backoffice/umbracoapi/content/EmptyRecycleBin', + }, + { + name: 'ProcessId', + value: '17632', + }, + { + name: 'ProcessName', + value: 'iisexpress', + }, + { + name: 'ThreadId', + value: '50', + }, + { + name: 'ApplicationId', + value: '0cf9334a65daa2e8a69943c6db2fb730bb14f2de', + }, + { + name: 'MachineName', + value: 'DESKTOP-M35N63H', + }, + { + name: 'Log4NetLevel', + value: 'DEBUG', + }, + { + name: 'HttpRequestId', + value: '5d3e350c-0b62-4122-9850-1b821fc14824', + }, + { + name: 'HttpRequestNumber', + value: '944', + }, + { + name: 'HttpSessionId', + value: '0', + }, + ], + exception: null, + }, + { + timestamp: '2023-02-14T12:00:40.6274587+00:00', + level: 'Debug', + messageTemplate: '{IndexName} searcher refreshed? {DidRefresh}', + renderedMessage: '"ExternalIndex" searcher refreshed? False', + properties: [ + { + name: 'IndexName', + value: 'ExternalIndex', + }, + { + name: 'DidRefresh', + value: 'False', + }, + { + name: 'SourceContext', + value: 'Examine.Lucene.Providers.LuceneIndex', + }, + { + name: 'ActionId', + value: 'c4a4ecf3-34e7-4ff9-99ad-4aab0a23c3c2', + }, + { + name: 'ActionName', + value: 'Umbraco.Cms.Web.BackOffice.Controllers.ContentController.DeleteById (Umbraco.Web.BackOffice)', + }, + { + name: 'RequestId', + value: '4000005e-0004-fe00-b63f-84710c7967bb', + }, + { + name: 'RequestPath', + value: '/umbraco/backoffice/umbracoapi/content/DeleteById', + }, + { + name: 'ProcessId', + value: '17632', + }, + { + name: 'ProcessName', + value: 'iisexpress', + }, + { + name: 'ThreadId', + value: '57', + }, + { + name: 'ApplicationId', + value: '0cf9334a65daa2e8a69943c6db2fb730bb14f2de', + }, + { + name: 'MachineName', + value: 'DESKTOP-M35N63H', + }, + { + name: 'Log4NetLevel', + value: 'DEBUG', + }, + { + name: 'HttpRequestId', + value: 'f4101feb-d20b-4007-b0d8-5fb8448b0ba5', + }, + { + name: 'HttpRequestNumber', + value: '943', + }, + { + name: 'HttpSessionId', + value: '0', + }, + ], + exception: null, + }, + { + timestamp: '2023-02-14T12:00:35.6787856+00:00', + level: 'Debug', + messageTemplate: '{IndexName} searcher refreshed? {DidRefresh}', + renderedMessage: '"InternalIndex" searcher refreshed? False', + properties: [ + { + name: 'IndexName', + value: 'InternalIndex', + }, + { + name: 'DidRefresh', + value: 'False', + }, + { + name: 'SourceContext', + value: 'Examine.Lucene.Providers.LuceneIndex', + }, + { + name: 'ActionId', + value: '1d9a0529-a75a-40cc-be5d-c871548ab233', + }, + { + name: 'ActionName', + value: 'Umbraco.Cms.Web.BackOffice.Controllers.ContentController.EmptyRecycleBin (Umbraco.Web.BackOffice)', + }, + { + name: 'RequestId', + value: '4000002e-0005-ef00-b63f-84710c7967bb', + }, + { + name: 'RequestPath', + value: '/umbraco/backoffice/umbracoapi/content/EmptyRecycleBin', + }, + { + name: 'ProcessId', + value: '17632', + }, + { + name: 'ProcessName', + value: 'iisexpress', + }, + { + name: 'ThreadId', + value: '50', + }, + { + name: 'ApplicationId', + value: '0cf9334a65daa2e8a69943c6db2fb730bb14f2de', + }, + { + name: 'MachineName', + value: 'DESKTOP-M35N63H', + }, + { + name: 'Log4NetLevel', + value: 'DEBUG', + }, + { + name: 'HttpRequestId', + value: '136c6fa2-59b3-4a35-bf62-41b4b7e47aae', + }, + { + name: 'HttpRequestNumber', + value: '942', + }, + { + name: 'HttpSessionId', + value: '0', + }, + ], + exception: null, + }, + { + timestamp: '2023-02-14T12:00:35.6168559+00:00', + level: 'Debug', + messageTemplate: '{IndexName} searcher refreshed? {DidRefresh}', + renderedMessage: '"ExternalIndex" searcher refreshed? False', + properties: [ + { + name: 'IndexName', + value: 'ExternalIndex', + }, + { + name: 'DidRefresh', + value: 'False', + }, + { + name: 'SourceContext', + value: 'Examine.Lucene.Providers.LuceneIndex', + }, + { + name: 'ActionId', + value: 'c4a4ecf3-34e7-4ff9-99ad-4aab0a23c3c2', + }, + { + name: 'ActionName', + value: 'Umbraco.Cms.Web.BackOffice.Controllers.ContentController.DeleteById (Umbraco.Web.BackOffice)', + }, + { + name: 'RequestId', + value: '4000005e-0004-fe00-b63f-84710c7967bb', + }, + { + name: 'RequestPath', + value: '/umbraco/backoffice/umbracoapi/content/DeleteById', + }, + { + name: 'ProcessId', + value: '17632', + }, + { + name: 'ProcessName', + value: 'iisexpress', + }, + { + name: 'ThreadId', + value: '57', + }, + { + name: 'ApplicationId', + value: '0cf9334a65daa2e8a69943c6db2fb730bb14f2de', + }, + { + name: 'MachineName', + value: 'DESKTOP-M35N63H', + }, + { + name: 'Log4NetLevel', + value: 'DEBUG', + }, + { + name: 'HttpRequestId', + value: 'fd9d8b63-8cbe-448d-acfe-fb0225630c8f', + }, + { + name: 'HttpRequestNumber', + value: '941', + }, + { + name: 'HttpSessionId', + value: '0', + }, + ], + exception: null, + }, + { + timestamp: '2023-02-14T12:00:30.6723677+00:00', + level: 'Debug', + messageTemplate: '{IndexName} searcher refreshed? {DidRefresh}', + renderedMessage: '"InternalIndex" searcher refreshed? False', + properties: [ + { + name: 'IndexName', + value: 'InternalIndex', + }, + { + name: 'DidRefresh', + value: 'False', + }, + { + name: 'SourceContext', + value: 'Examine.Lucene.Providers.LuceneIndex', + }, + { + name: 'ActionId', + value: '1d9a0529-a75a-40cc-be5d-c871548ab233', + }, + { + name: 'ActionName', + value: 'Umbraco.Cms.Web.BackOffice.Controllers.ContentController.EmptyRecycleBin (Umbraco.Web.BackOffice)', + }, + { + name: 'RequestId', + value: '4000002e-0005-ef00-b63f-84710c7967bb', + }, + { + name: 'RequestPath', + value: '/umbraco/backoffice/umbracoapi/content/EmptyRecycleBin', + }, + { + name: 'ProcessId', + value: '17632', + }, + { + name: 'ProcessName', + value: 'iisexpress', + }, + { + name: 'ThreadId', + value: '50', + }, + { + name: 'ApplicationId', + value: '0cf9334a65daa2e8a69943c6db2fb730bb14f2de', + }, + { + name: 'MachineName', + value: 'DESKTOP-M35N63H', + }, + { + name: 'Log4NetLevel', + value: 'DEBUG', + }, + { + name: 'HttpRequestId', + value: '5f550460-063c-4ffe-b4b7-977916a0bf3c', + }, + { + name: 'HttpRequestNumber', + value: '940', + }, + { + name: 'HttpSessionId', + value: '0', + }, + ], + exception: null, + }, + { + timestamp: '2023-02-14T12:00:30.6121168+00:00', + level: 'Debug', + messageTemplate: '{IndexName} searcher refreshed? {DidRefresh}', + renderedMessage: '"ExternalIndex" searcher refreshed? False', + properties: [ + { + name: 'IndexName', + value: 'ExternalIndex', + }, + { + name: 'DidRefresh', + value: 'False', + }, + { + name: 'SourceContext', + value: 'Examine.Lucene.Providers.LuceneIndex', + }, + { + name: 'ActionId', + value: 'c4a4ecf3-34e7-4ff9-99ad-4aab0a23c3c2', + }, + { + name: 'ActionName', + value: 'Umbraco.Cms.Web.BackOffice.Controllers.ContentController.DeleteById (Umbraco.Web.BackOffice)', + }, + { + name: 'RequestId', + value: '4000005e-0004-fe00-b63f-84710c7967bb', + }, + { + name: 'RequestPath', + value: '/umbraco/backoffice/umbracoapi/content/DeleteById', + }, + { + name: 'ProcessId', + value: '17632', + }, + { + name: 'ProcessName', + value: 'iisexpress', + }, + { + name: 'ThreadId', + value: '57', + }, + { + name: 'ApplicationId', + value: '0cf9334a65daa2e8a69943c6db2fb730bb14f2de', + }, + { + name: 'MachineName', + value: 'DESKTOP-M35N63H', + }, + { + name: 'Log4NetLevel', + value: 'DEBUG', + }, + { + name: 'HttpRequestId', + value: '7205a37f-3c57-4388-86d0-aa82334ac8b9', + }, + { + name: 'HttpRequestNumber', + value: '939', + }, + { + name: 'HttpSessionId', + value: '0', + }, + ], + exception: null, + }, + { + timestamp: '2023-02-14T12:00:25.6705459+00:00', + level: 'Debug', + messageTemplate: '{IndexName} searcher refreshed? {DidRefresh}', + renderedMessage: '"InternalIndex" searcher refreshed? False', + properties: [ + { + name: 'IndexName', + value: 'InternalIndex', + }, + { + name: 'DidRefresh', + value: 'False', + }, + { + name: 'SourceContext', + value: 'Examine.Lucene.Providers.LuceneIndex', + }, + { + name: 'ActionId', + value: '1d9a0529-a75a-40cc-be5d-c871548ab233', + }, + { + name: 'ActionName', + value: 'Umbraco.Cms.Web.BackOffice.Controllers.ContentController.EmptyRecycleBin (Umbraco.Web.BackOffice)', + }, + { + name: 'RequestId', + value: '4000002e-0005-ef00-b63f-84710c7967bb', + }, + { + name: 'RequestPath', + value: '/umbraco/backoffice/umbracoapi/content/EmptyRecycleBin', + }, + { + name: 'ProcessId', + value: '17632', + }, + { + name: 'ProcessName', + value: 'iisexpress', + }, + { + name: 'ThreadId', + value: '50', + }, + { + name: 'ApplicationId', + value: '0cf9334a65daa2e8a69943c6db2fb730bb14f2de', + }, + { + name: 'MachineName', + value: 'DESKTOP-M35N63H', + }, + { + name: 'Log4NetLevel', + value: 'DEBUG', + }, + { + name: 'HttpRequestId', + value: '11c619df-ec09-400d-bac3-0796ec8313b3', + }, + { + name: 'HttpRequestNumber', + value: '938', + }, + { + name: 'HttpSessionId', + value: '0', + }, + ], + exception: null, + }, + { + timestamp: '2023-02-14T12:00:25.6072437+00:00', + level: 'Debug', + messageTemplate: '{IndexName} searcher refreshed? {DidRefresh}', + renderedMessage: '"ExternalIndex" searcher refreshed? False', + properties: [ + { + name: 'IndexName', + value: 'ExternalIndex', + }, + { + name: 'DidRefresh', + value: 'False', + }, + { + name: 'SourceContext', + value: 'Examine.Lucene.Providers.LuceneIndex', + }, + { + name: 'ActionId', + value: 'c4a4ecf3-34e7-4ff9-99ad-4aab0a23c3c2', + }, + { + name: 'ActionName', + value: 'Umbraco.Cms.Web.BackOffice.Controllers.ContentController.DeleteById (Umbraco.Web.BackOffice)', + }, + { + name: 'RequestId', + value: '4000005e-0004-fe00-b63f-84710c7967bb', + }, + { + name: 'RequestPath', + value: '/umbraco/backoffice/umbracoapi/content/DeleteById', + }, + { + name: 'ProcessId', + value: '17632', + }, + { + name: 'ProcessName', + value: 'iisexpress', + }, + { + name: 'ThreadId', + value: '57', + }, + { + name: 'ApplicationId', + value: '0cf9334a65daa2e8a69943c6db2fb730bb14f2de', + }, + { + name: 'MachineName', + value: 'DESKTOP-M35N63H', + }, + { + name: 'Log4NetLevel', + value: 'DEBUG', + }, + { + name: 'HttpRequestId', + value: '4acb6550-415f-4acd-9d5d-d16e3f24358d', + }, + { + name: 'HttpRequestNumber', + value: '937', + }, + { + name: 'HttpSessionId', + value: '0', + }, + ], + exception: null, + }, + { + timestamp: '2023-02-14T12:00:20.655909+00:00', + level: 'Debug', + messageTemplate: '{IndexName} searcher refreshed? {DidRefresh}', + renderedMessage: '"InternalIndex" searcher refreshed? False', + properties: [ + { + name: 'IndexName', + value: 'InternalIndex', + }, + { + name: 'DidRefresh', + value: 'False', + }, + { + name: 'SourceContext', + value: 'Examine.Lucene.Providers.LuceneIndex', + }, + { + name: 'ActionId', + value: '1d9a0529-a75a-40cc-be5d-c871548ab233', + }, + { + name: 'ActionName', + value: 'Umbraco.Cms.Web.BackOffice.Controllers.ContentController.EmptyRecycleBin (Umbraco.Web.BackOffice)', + }, + { + name: 'RequestId', + value: '4000002e-0005-ef00-b63f-84710c7967bb', + }, + { + name: 'RequestPath', + value: '/umbraco/backoffice/umbracoapi/content/EmptyRecycleBin', + }, + { + name: 'ProcessId', + value: '17632', + }, + { + name: 'ProcessName', + value: 'iisexpress', + }, + { + name: 'ThreadId', + value: '50', + }, + { + name: 'ApplicationId', + value: '0cf9334a65daa2e8a69943c6db2fb730bb14f2de', + }, + { + name: 'MachineName', + value: 'DESKTOP-M35N63H', + }, + { + name: 'Log4NetLevel', + value: 'DEBUG', + }, + { + name: 'HttpRequestId', + value: '538ddeb5-5f61-4f0f-b997-d730ca43c308', + }, + { + name: 'HttpRequestNumber', + value: '936', + }, + { + name: 'HttpSessionId', + value: '0', + }, + ], + exception: null, + }, + { + timestamp: '2023-02-14T12:00:20.593934+00:00', + level: 'Debug', + messageTemplate: '{IndexName} searcher refreshed? {DidRefresh}', + renderedMessage: '"ExternalIndex" searcher refreshed? False', + properties: [ + { + name: 'IndexName', + value: 'ExternalIndex', + }, + { + name: 'DidRefresh', + value: 'False', + }, + { + name: 'SourceContext', + value: 'Examine.Lucene.Providers.LuceneIndex', + }, + { + name: 'ActionId', + value: 'c4a4ecf3-34e7-4ff9-99ad-4aab0a23c3c2', + }, + { + name: 'ActionName', + value: 'Umbraco.Cms.Web.BackOffice.Controllers.ContentController.DeleteById (Umbraco.Web.BackOffice)', + }, + { + name: 'RequestId', + value: '4000005e-0004-fe00-b63f-84710c7967bb', + }, + { + name: 'RequestPath', + value: '/umbraco/backoffice/umbracoapi/content/DeleteById', + }, + { + name: 'ProcessId', + value: '17632', + }, + { + name: 'ProcessName', + value: 'iisexpress', + }, + { + name: 'ThreadId', + value: '57', + }, + { + name: 'ApplicationId', + value: '0cf9334a65daa2e8a69943c6db2fb730bb14f2de', + }, + { + name: 'MachineName', + value: 'DESKTOP-M35N63H', + }, + { + name: 'Log4NetLevel', + value: 'DEBUG', + }, + { + name: 'HttpRequestId', + value: '0bbed3f1-3732-4961-987b-dee855bf14e5', + }, + { + name: 'HttpRequestNumber', + value: '935', + }, + { + name: 'HttpSessionId', + value: '0', + }, + ], + exception: null, + }, + { + timestamp: '2023-02-14T12:00:15.652173+00:00', + level: 'Debug', + messageTemplate: '{IndexName} searcher refreshed? {DidRefresh}', + renderedMessage: '"InternalIndex" searcher refreshed? False', + properties: [ + { + name: 'IndexName', + value: 'InternalIndex', + }, + { + name: 'DidRefresh', + value: 'False', + }, + { + name: 'SourceContext', + value: 'Examine.Lucene.Providers.LuceneIndex', + }, + { + name: 'ActionId', + value: '1d9a0529-a75a-40cc-be5d-c871548ab233', + }, + { + name: 'ActionName', + value: 'Umbraco.Cms.Web.BackOffice.Controllers.ContentController.EmptyRecycleBin (Umbraco.Web.BackOffice)', + }, + { + name: 'RequestId', + value: '4000002e-0005-ef00-b63f-84710c7967bb', + }, + { + name: 'RequestPath', + value: '/umbraco/backoffice/umbracoapi/content/EmptyRecycleBin', + }, + { + name: 'ProcessId', + value: '17632', + }, + { + name: 'ProcessName', + value: 'iisexpress', + }, + { + name: 'ThreadId', + value: '50', + }, + { + name: 'ApplicationId', + value: '0cf9334a65daa2e8a69943c6db2fb730bb14f2de', + }, + { + name: 'MachineName', + value: 'DESKTOP-M35N63H', + }, + { + name: 'Log4NetLevel', + value: 'DEBUG', + }, + { + name: 'HttpRequestId', + value: '2fc31793-1567-4166-ba1d-fedc5aa86c76', + }, + { + name: 'HttpRequestNumber', + value: '934', + }, + { + name: 'HttpSessionId', + value: '0', + }, + ], + exception: null, + }, + { + timestamp: '2023-02-14T12:00:15.5893967+00:00', + level: 'Debug', + messageTemplate: '{IndexName} searcher refreshed? {DidRefresh}', + renderedMessage: '"ExternalIndex" searcher refreshed? False', + properties: [ + { + name: 'IndexName', + value: 'ExternalIndex', + }, + { + name: 'DidRefresh', + value: 'False', + }, + { + name: 'SourceContext', + value: 'Examine.Lucene.Providers.LuceneIndex', + }, + { + name: 'ActionId', + value: 'c4a4ecf3-34e7-4ff9-99ad-4aab0a23c3c2', + }, + { + name: 'ActionName', + value: 'Umbraco.Cms.Web.BackOffice.Controllers.ContentController.DeleteById (Umbraco.Web.BackOffice)', + }, + { + name: 'RequestId', + value: '4000005e-0004-fe00-b63f-84710c7967bb', + }, + { + name: 'RequestPath', + value: '/umbraco/backoffice/umbracoapi/content/DeleteById', + }, + { + name: 'ProcessId', + value: '17632', + }, + { + name: 'ProcessName', + value: 'iisexpress', + }, + { + name: 'ThreadId', + value: '57', + }, + { + name: 'ApplicationId', + value: '0cf9334a65daa2e8a69943c6db2fb730bb14f2de', + }, + { + name: 'MachineName', + value: 'DESKTOP-M35N63H', + }, + { + name: 'Log4NetLevel', + value: 'DEBUG', + }, + { + name: 'HttpRequestId', + value: 'a1229318-a1f3-45ae-81ea-553c6380dc63', + }, + { + name: 'HttpRequestNumber', + value: '933', + }, + { + name: 'HttpSessionId', + value: '0', + }, + ], + exception: null, + }, + { + timestamp: '2023-02-14T12:00:10.638341+00:00', + level: 'Debug', + messageTemplate: '{IndexName} searcher refreshed? {DidRefresh}', + renderedMessage: '"InternalIndex" searcher refreshed? False', + properties: [ + { + name: 'IndexName', + value: 'InternalIndex', + }, + { + name: 'DidRefresh', + value: 'False', + }, + { + name: 'SourceContext', + value: 'Examine.Lucene.Providers.LuceneIndex', + }, + { + name: 'ActionId', + value: '1d9a0529-a75a-40cc-be5d-c871548ab233', + }, + { + name: 'ActionName', + value: 'Umbraco.Cms.Web.BackOffice.Controllers.ContentController.EmptyRecycleBin (Umbraco.Web.BackOffice)', + }, + { + name: 'RequestId', + value: '4000002e-0005-ef00-b63f-84710c7967bb', + }, + { + name: 'RequestPath', + value: '/umbraco/backoffice/umbracoapi/content/EmptyRecycleBin', + }, + { + name: 'ProcessId', + value: '17632', + }, + { + name: 'ProcessName', + value: 'iisexpress', + }, + { + name: 'ThreadId', + value: '50', + }, + { + name: 'ApplicationId', + value: '0cf9334a65daa2e8a69943c6db2fb730bb14f2de', + }, + { + name: 'MachineName', + value: 'DESKTOP-M35N63H', + }, + { + name: 'Log4NetLevel', + value: 'DEBUG', + }, + { + name: 'HttpRequestId', + value: '3c73f5d8-fb91-4cb1-99ea-710dc5a077d0', + }, + { + name: 'HttpRequestNumber', + value: '932', + }, + { + name: 'HttpSessionId', + value: '0', + }, + ], + exception: null, + }, + { + timestamp: '2023-02-14T12:00:10.5772254+00:00', + level: 'Debug', + messageTemplate: '{IndexName} searcher refreshed? {DidRefresh}', + renderedMessage: '"ExternalIndex" searcher refreshed? False', + properties: [ + { + name: 'IndexName', + value: 'ExternalIndex', + }, + { + name: 'DidRefresh', + value: 'False', + }, + { + name: 'SourceContext', + value: 'Examine.Lucene.Providers.LuceneIndex', + }, + { + name: 'ActionId', + value: 'c4a4ecf3-34e7-4ff9-99ad-4aab0a23c3c2', + }, + { + name: 'ActionName', + value: 'Umbraco.Cms.Web.BackOffice.Controllers.ContentController.DeleteById (Umbraco.Web.BackOffice)', + }, + { + name: 'RequestId', + value: '4000005e-0004-fe00-b63f-84710c7967bb', + }, + { + name: 'RequestPath', + value: '/umbraco/backoffice/umbracoapi/content/DeleteById', + }, + { + name: 'ProcessId', + value: '17632', + }, + { + name: 'ProcessName', + value: 'iisexpress', + }, + { + name: 'ThreadId', + value: '57', + }, + { + name: 'ApplicationId', + value: '0cf9334a65daa2e8a69943c6db2fb730bb14f2de', + }, + { + name: 'MachineName', + value: 'DESKTOP-M35N63H', + }, + { + name: 'Log4NetLevel', + value: 'DEBUG', + }, + { + name: 'HttpRequestId', + value: 'c90cfc2c-4257-4963-b983-66e8154d411b', + }, + { + name: 'HttpRequestNumber', + value: '931', + }, + { + name: 'HttpSessionId', + value: '0', + }, + ], + exception: null, + }, + { + timestamp: '2023-02-14T12:00:05.6357729+00:00', + level: 'Debug', + messageTemplate: '{IndexName} searcher refreshed? {DidRefresh}', + renderedMessage: '"InternalIndex" searcher refreshed? False', + properties: [ + { + name: 'IndexName', + value: 'InternalIndex', + }, + { + name: 'DidRefresh', + value: 'False', + }, + { + name: 'SourceContext', + value: 'Examine.Lucene.Providers.LuceneIndex', + }, + { + name: 'ActionId', + value: '1d9a0529-a75a-40cc-be5d-c871548ab233', + }, + { + name: 'ActionName', + value: 'Umbraco.Cms.Web.BackOffice.Controllers.ContentController.EmptyRecycleBin (Umbraco.Web.BackOffice)', + }, + { + name: 'RequestId', + value: '4000002e-0005-ef00-b63f-84710c7967bb', + }, + { + name: 'RequestPath', + value: '/umbraco/backoffice/umbracoapi/content/EmptyRecycleBin', + }, + { + name: 'ProcessId', + value: '17632', + }, + { + name: 'ProcessName', + value: 'iisexpress', + }, + { + name: 'ThreadId', + value: '50', + }, + { + name: 'ApplicationId', + value: '0cf9334a65daa2e8a69943c6db2fb730bb14f2de', + }, + { + name: 'MachineName', + value: 'DESKTOP-M35N63H', + }, + { + name: 'Log4NetLevel', + value: 'DEBUG', + }, + { + name: 'HttpRequestId', + value: '1545fb5a-eb3f-42ad-b996-83a25cc2884f', + }, + { + name: 'HttpRequestNumber', + value: '930', + }, + { + name: 'HttpSessionId', + value: '0', + }, + ], + exception: null, + }, + { + timestamp: '2023-02-14T12:00:05.5733282+00:00', + level: 'Debug', + messageTemplate: '{IndexName} searcher refreshed? {DidRefresh}', + renderedMessage: '"ExternalIndex" searcher refreshed? False', + properties: [ + { + name: 'IndexName', + value: 'ExternalIndex', + }, + { + name: 'DidRefresh', + value: 'False', + }, + { + name: 'SourceContext', + value: 'Examine.Lucene.Providers.LuceneIndex', + }, + { + name: 'ActionId', + value: 'c4a4ecf3-34e7-4ff9-99ad-4aab0a23c3c2', + }, + { + name: 'ActionName', + value: 'Umbraco.Cms.Web.BackOffice.Controllers.ContentController.DeleteById (Umbraco.Web.BackOffice)', + }, + { + name: 'RequestId', + value: '4000005e-0004-fe00-b63f-84710c7967bb', + }, + { + name: 'RequestPath', + value: '/umbraco/backoffice/umbracoapi/content/DeleteById', + }, + { + name: 'ProcessId', + value: '17632', + }, + { + name: 'ProcessName', + value: 'iisexpress', + }, + { + name: 'ThreadId', + value: '57', + }, + { + name: 'ApplicationId', + value: '0cf9334a65daa2e8a69943c6db2fb730bb14f2de', + }, + { + name: 'MachineName', + value: 'DESKTOP-M35N63H', + }, + { + name: 'Log4NetLevel', + value: 'DEBUG', + }, + { + name: 'HttpRequestId', + value: 'c9d266d1-4934-46c7-9b53-ed09fbd886a0', + }, + { + name: 'HttpRequestNumber', + value: '929', + }, + { + name: 'HttpSessionId', + value: '0', + }, + ], + exception: null, + }, + { + timestamp: '2023-02-14T12:00:00.6298079+00:00', + level: 'Debug', + messageTemplate: '{IndexName} searcher refreshed? {DidRefresh}', + renderedMessage: '"InternalIndex" searcher refreshed? False', + properties: [ + { + name: 'IndexName', + value: 'InternalIndex', + }, + { + name: 'DidRefresh', + value: 'False', + }, + { + name: 'SourceContext', + value: 'Examine.Lucene.Providers.LuceneIndex', + }, + { + name: 'ActionId', + value: '1d9a0529-a75a-40cc-be5d-c871548ab233', + }, + { + name: 'ActionName', + value: 'Umbraco.Cms.Web.BackOffice.Controllers.ContentController.EmptyRecycleBin (Umbraco.Web.BackOffice)', + }, + { + name: 'RequestId', + value: '4000002e-0005-ef00-b63f-84710c7967bb', + }, + { + name: 'RequestPath', + value: '/umbraco/backoffice/umbracoapi/content/EmptyRecycleBin', + }, + { + name: 'ProcessId', + value: '17632', + }, + { + name: 'ProcessName', + value: 'iisexpress', + }, + { + name: 'ThreadId', + value: '50', + }, + { + name: 'ApplicationId', + value: '0cf9334a65daa2e8a69943c6db2fb730bb14f2de', + }, + { + name: 'MachineName', + value: 'DESKTOP-M35N63H', + }, + { + name: 'Log4NetLevel', + value: 'DEBUG', + }, + { + name: 'HttpRequestId', + value: 'de2e3225-9d89-4a80-9ee5-e71690355f9d', + }, + { + name: 'HttpRequestNumber', + value: '928', + }, + { + name: 'HttpSessionId', + value: '0', + }, + ], + exception: null, + }, + { + timestamp: '2023-02-14T12:00:00.5660574+00:00', + level: 'Debug', + messageTemplate: '{IndexName} searcher refreshed? {DidRefresh}', + renderedMessage: '"ExternalIndex" searcher refreshed? False', + properties: [ + { + name: 'IndexName', + value: 'ExternalIndex', + }, + { + name: 'DidRefresh', + value: 'False', + }, + { + name: 'SourceContext', + value: 'Examine.Lucene.Providers.LuceneIndex', + }, + { + name: 'ActionId', + value: 'c4a4ecf3-34e7-4ff9-99ad-4aab0a23c3c2', + }, + { + name: 'ActionName', + value: 'Umbraco.Cms.Web.BackOffice.Controllers.ContentController.DeleteById (Umbraco.Web.BackOffice)', + }, + { + name: 'RequestId', + value: '4000005e-0004-fe00-b63f-84710c7967bb', + }, + { + name: 'RequestPath', + value: '/umbraco/backoffice/umbracoapi/content/DeleteById', + }, + { + name: 'ProcessId', + value: '17632', + }, + { + name: 'ProcessName', + value: 'iisexpress', + }, + { + name: 'ThreadId', + value: '57', + }, + { + name: 'ApplicationId', + value: '0cf9334a65daa2e8a69943c6db2fb730bb14f2de', + }, + { + name: 'MachineName', + value: 'DESKTOP-M35N63H', + }, + { + name: 'Log4NetLevel', + value: 'DEBUG', + }, + { + name: 'HttpRequestId', + value: '82db2316-2b67-451c-86c0-dd45244c1d96', + }, + { + name: 'HttpRequestNumber', + value: '927', + }, + { + name: 'HttpSessionId', + value: '0', + }, + ], + exception: null, + }, + { + timestamp: '2023-02-14T11:59:55.6191475+00:00', + level: 'Debug', + messageTemplate: '{IndexName} searcher refreshed? {DidRefresh}', + renderedMessage: '"InternalIndex" searcher refreshed? False', + properties: [ + { + name: 'IndexName', + value: 'InternalIndex', + }, + { + name: 'DidRefresh', + value: 'False', + }, + { + name: 'SourceContext', + value: 'Examine.Lucene.Providers.LuceneIndex', + }, + { + name: 'ActionId', + value: '1d9a0529-a75a-40cc-be5d-c871548ab233', + }, + { + name: 'ActionName', + value: 'Umbraco.Cms.Web.BackOffice.Controllers.ContentController.EmptyRecycleBin (Umbraco.Web.BackOffice)', + }, + { + name: 'RequestId', + value: '4000002e-0005-ef00-b63f-84710c7967bb', + }, + { + name: 'RequestPath', + value: '/umbraco/backoffice/umbracoapi/content/EmptyRecycleBin', + }, + { + name: 'ProcessId', + value: '17632', + }, + { + name: 'ProcessName', + value: 'iisexpress', + }, + { + name: 'ThreadId', + value: '50', + }, + { + name: 'ApplicationId', + value: '0cf9334a65daa2e8a69943c6db2fb730bb14f2de', + }, + { + name: 'MachineName', + value: 'DESKTOP-M35N63H', + }, + { + name: 'Log4NetLevel', + value: 'DEBUG', + }, + { + name: 'HttpRequestId', + value: '8dc85495-24f2-4842-8ff5-d0374cad3741', + }, + { + name: 'HttpRequestNumber', + value: '926', + }, + { + name: 'HttpSessionId', + value: '0', + }, + ], + exception: null, + }, + { + timestamp: '2023-02-14T11:59:55.5568848+00:00', + level: 'Debug', + messageTemplate: '{IndexName} searcher refreshed? {DidRefresh}', + renderedMessage: '"ExternalIndex" searcher refreshed? False', + properties: [ + { + name: 'IndexName', + value: 'ExternalIndex', + }, + { + name: 'DidRefresh', + value: 'False', + }, + { + name: 'SourceContext', + value: 'Examine.Lucene.Providers.LuceneIndex', + }, + { + name: 'ActionId', + value: 'c4a4ecf3-34e7-4ff9-99ad-4aab0a23c3c2', + }, + { + name: 'ActionName', + value: 'Umbraco.Cms.Web.BackOffice.Controllers.ContentController.DeleteById (Umbraco.Web.BackOffice)', + }, + { + name: 'RequestId', + value: '4000005e-0004-fe00-b63f-84710c7967bb', + }, + { + name: 'RequestPath', + value: '/umbraco/backoffice/umbracoapi/content/DeleteById', + }, + { + name: 'ProcessId', + value: '17632', + }, + { + name: 'ProcessName', + value: 'iisexpress', + }, + { + name: 'ThreadId', + value: '57', + }, + { + name: 'ApplicationId', + value: '0cf9334a65daa2e8a69943c6db2fb730bb14f2de', + }, + { + name: 'MachineName', + value: 'DESKTOP-M35N63H', + }, + { + name: 'Log4NetLevel', + value: 'DEBUG', + }, + { + name: 'HttpRequestId', + value: 'cc428ec4-db17-4cee-981d-901fde3af15c', + }, + { + name: 'HttpRequestNumber', + value: '925', + }, + { + name: 'HttpSessionId', + value: '0', + }, + ], + exception: null, + }, + { + timestamp: '2023-02-14T11:59:50.6177966+00:00', + level: 'Debug', + messageTemplate: '{IndexName} searcher refreshed? {DidRefresh}', + renderedMessage: '"InternalIndex" searcher refreshed? False', + properties: [ + { + name: 'IndexName', + value: 'InternalIndex', + }, + { + name: 'DidRefresh', + value: 'False', + }, + { + name: 'SourceContext', + value: 'Examine.Lucene.Providers.LuceneIndex', + }, + { + name: 'ActionId', + value: '1d9a0529-a75a-40cc-be5d-c871548ab233', + }, + { + name: 'ActionName', + value: 'Umbraco.Cms.Web.BackOffice.Controllers.ContentController.EmptyRecycleBin (Umbraco.Web.BackOffice)', + }, + { + name: 'RequestId', + value: '4000002e-0005-ef00-b63f-84710c7967bb', + }, + { + name: 'RequestPath', + value: '/umbraco/backoffice/umbracoapi/content/EmptyRecycleBin', + }, + { + name: 'ProcessId', + value: '17632', + }, + { + name: 'ProcessName', + value: 'iisexpress', + }, + { + name: 'ThreadId', + value: '50', + }, + { + name: 'ApplicationId', + value: '0cf9334a65daa2e8a69943c6db2fb730bb14f2de', + }, + { + name: 'MachineName', + value: 'DESKTOP-M35N63H', + }, + { + name: 'Log4NetLevel', + value: 'DEBUG', + }, + { + name: 'HttpRequestId', + value: '245be706-df80-4501-a915-d2af6e44af26', + }, + { + name: 'HttpRequestNumber', + value: '924', + }, + { + name: 'HttpSessionId', + value: '0', + }, + ], + exception: null, + }, + { + timestamp: '2023-02-14T11:59:50.5567918+00:00', + level: 'Debug', + messageTemplate: '{IndexName} searcher refreshed? {DidRefresh}', + renderedMessage: '"ExternalIndex" searcher refreshed? False', + properties: [ + { + name: 'IndexName', + value: 'ExternalIndex', + }, + { + name: 'DidRefresh', + value: 'False', + }, + { + name: 'SourceContext', + value: 'Examine.Lucene.Providers.LuceneIndex', + }, + { + name: 'ActionId', + value: 'c4a4ecf3-34e7-4ff9-99ad-4aab0a23c3c2', + }, + { + name: 'ActionName', + value: 'Umbraco.Cms.Web.BackOffice.Controllers.ContentController.DeleteById (Umbraco.Web.BackOffice)', + }, + { + name: 'RequestId', + value: '4000005e-0004-fe00-b63f-84710c7967bb', + }, + { + name: 'RequestPath', + value: '/umbraco/backoffice/umbracoapi/content/DeleteById', + }, + { + name: 'ProcessId', + value: '17632', + }, + { + name: 'ProcessName', + value: 'iisexpress', + }, + { + name: 'ThreadId', + value: '57', + }, + { + name: 'ApplicationId', + value: '0cf9334a65daa2e8a69943c6db2fb730bb14f2de', + }, + { + name: 'MachineName', + value: 'DESKTOP-M35N63H', + }, + { + name: 'Log4NetLevel', + value: 'DEBUG', + }, + { + name: 'HttpRequestId', + value: '8d5082a3-4ca1-4fb2-976b-8a761a245661', + }, + { + name: 'HttpRequestNumber', + value: '923', + }, + { + name: 'HttpSessionId', + value: '0', + }, + ], + exception: null, + }, + { + timestamp: '2023-02-14T11:59:45.6058749+00:00', + level: 'Debug', + messageTemplate: '{IndexName} searcher refreshed? {DidRefresh}', + renderedMessage: '"InternalIndex" searcher refreshed? False', + properties: [ + { + name: 'IndexName', + value: 'InternalIndex', + }, + { + name: 'DidRefresh', + value: 'False', + }, + { + name: 'SourceContext', + value: 'Examine.Lucene.Providers.LuceneIndex', + }, + { + name: 'ActionId', + value: '1d9a0529-a75a-40cc-be5d-c871548ab233', + }, + { + name: 'ActionName', + value: 'Umbraco.Cms.Web.BackOffice.Controllers.ContentController.EmptyRecycleBin (Umbraco.Web.BackOffice)', + }, + { + name: 'RequestId', + value: '4000002e-0005-ef00-b63f-84710c7967bb', + }, + { + name: 'RequestPath', + value: '/umbraco/backoffice/umbracoapi/content/EmptyRecycleBin', + }, + { + name: 'ProcessId', + value: '17632', + }, + { + name: 'ProcessName', + value: 'iisexpress', + }, + { + name: 'ThreadId', + value: '50', + }, + { + name: 'ApplicationId', + value: '0cf9334a65daa2e8a69943c6db2fb730bb14f2de', + }, + { + name: 'MachineName', + value: 'DESKTOP-M35N63H', + }, + { + name: 'Log4NetLevel', + value: 'DEBUG', + }, + { + name: 'HttpRequestId', + value: '8fd1dee6-eb15-4081-b623-f4139cc465fd', + }, + { + name: 'HttpRequestNumber', + value: '922', + }, + { + name: 'HttpSessionId', + value: '0', + }, + ], + exception: null, + }, + { + timestamp: '2023-02-14T11:59:45.5419858+00:00', + level: 'Debug', + messageTemplate: '{IndexName} searcher refreshed? {DidRefresh}', + renderedMessage: '"ExternalIndex" searcher refreshed? False', + properties: [ + { + name: 'IndexName', + value: 'ExternalIndex', + }, + { + name: 'DidRefresh', + value: 'False', + }, + { + name: 'SourceContext', + value: 'Examine.Lucene.Providers.LuceneIndex', + }, + { + name: 'ActionId', + value: 'c4a4ecf3-34e7-4ff9-99ad-4aab0a23c3c2', + }, + { + name: 'ActionName', + value: 'Umbraco.Cms.Web.BackOffice.Controllers.ContentController.DeleteById (Umbraco.Web.BackOffice)', + }, + { + name: 'RequestId', + value: '4000005e-0004-fe00-b63f-84710c7967bb', + }, + { + name: 'RequestPath', + value: '/umbraco/backoffice/umbracoapi/content/DeleteById', + }, + { + name: 'ProcessId', + value: '17632', + }, + { + name: 'ProcessName', + value: 'iisexpress', + }, + { + name: 'ThreadId', + value: '57', + }, + { + name: 'ApplicationId', + value: '0cf9334a65daa2e8a69943c6db2fb730bb14f2de', + }, + { + name: 'MachineName', + value: 'DESKTOP-M35N63H', + }, + { + name: 'Log4NetLevel', + value: 'DEBUG', + }, + { + name: 'HttpRequestId', + value: '87434476-9f86-49f5-bacd-37978f97ec3a', + }, + { + name: 'HttpRequestNumber', + value: '921', + }, + { + name: 'HttpSessionId', + value: '0', + }, + ], + exception: null, + }, + { + timestamp: '2023-02-14T11:59:40.6030991+00:00', + level: 'Debug', + messageTemplate: '{IndexName} searcher refreshed? {DidRefresh}', + renderedMessage: '"InternalIndex" searcher refreshed? False', + properties: [ + { + name: 'IndexName', + value: 'InternalIndex', + }, + { + name: 'DidRefresh', + value: 'False', + }, + { + name: 'SourceContext', + value: 'Examine.Lucene.Providers.LuceneIndex', + }, + { + name: 'ActionId', + value: '1d9a0529-a75a-40cc-be5d-c871548ab233', + }, + { + name: 'ActionName', + value: 'Umbraco.Cms.Web.BackOffice.Controllers.ContentController.EmptyRecycleBin (Umbraco.Web.BackOffice)', + }, + { + name: 'RequestId', + value: '4000002e-0005-ef00-b63f-84710c7967bb', + }, + { + name: 'RequestPath', + value: '/umbraco/backoffice/umbracoapi/content/EmptyRecycleBin', + }, + { + name: 'ProcessId', + value: '17632', + }, + { + name: 'ProcessName', + value: 'iisexpress', + }, + { + name: 'ThreadId', + value: '50', + }, + { + name: 'ApplicationId', + value: '0cf9334a65daa2e8a69943c6db2fb730bb14f2de', + }, + { + name: 'MachineName', + value: 'DESKTOP-M35N63H', + }, + { + name: 'Log4NetLevel', + value: 'DEBUG', + }, + { + name: 'HttpRequestId', + value: '3a79d410-232f-46f0-8521-f71c58cefcd3', + }, + { + name: 'HttpRequestNumber', + value: '920', + }, + { + name: 'HttpSessionId', + value: '0', + }, + ], + exception: null, + }, + { + timestamp: '2023-02-14T11:59:40.5414694+00:00', + level: 'Debug', + messageTemplate: '{IndexName} searcher refreshed? {DidRefresh}', + renderedMessage: '"ExternalIndex" searcher refreshed? False', + properties: [ + { + name: 'IndexName', + value: 'ExternalIndex', + }, + { + name: 'DidRefresh', + value: 'False', + }, + { + name: 'SourceContext', + value: 'Examine.Lucene.Providers.LuceneIndex', + }, + { + name: 'ActionId', + value: 'c4a4ecf3-34e7-4ff9-99ad-4aab0a23c3c2', + }, + { + name: 'ActionName', + value: 'Umbraco.Cms.Web.BackOffice.Controllers.ContentController.DeleteById (Umbraco.Web.BackOffice)', + }, + { + name: 'RequestId', + value: '4000005e-0004-fe00-b63f-84710c7967bb', + }, + { + name: 'RequestPath', + value: '/umbraco/backoffice/umbracoapi/content/DeleteById', + }, + { + name: 'ProcessId', + value: '17632', + }, + { + name: 'ProcessName', + value: 'iisexpress', + }, + { + name: 'ThreadId', + value: '57', + }, + { + name: 'ApplicationId', + value: '0cf9334a65daa2e8a69943c6db2fb730bb14f2de', + }, + { + name: 'MachineName', + value: 'DESKTOP-M35N63H', + }, + { + name: 'Log4NetLevel', + value: 'DEBUG', + }, + { + name: 'HttpRequestId', + value: '0fda8a3d-b7df-46e4-bf3d-0cf15829f6a7', + }, + { + name: 'HttpRequestNumber', + value: '919', + }, + { + name: 'HttpSessionId', + value: '0', + }, + ], + exception: null, + }, + { + timestamp: '2023-02-14T11:59:35.5924386+00:00', + level: 'Debug', + messageTemplate: '{IndexName} searcher refreshed? {DidRefresh}', + renderedMessage: '"InternalIndex" searcher refreshed? False', + properties: [ + { + name: 'IndexName', + value: 'InternalIndex', + }, + { + name: 'DidRefresh', + value: 'False', + }, + { + name: 'SourceContext', + value: 'Examine.Lucene.Providers.LuceneIndex', + }, + { + name: 'ActionId', + value: '1d9a0529-a75a-40cc-be5d-c871548ab233', + }, + { + name: 'ActionName', + value: 'Umbraco.Cms.Web.BackOffice.Controllers.ContentController.EmptyRecycleBin (Umbraco.Web.BackOffice)', + }, + { + name: 'RequestId', + value: '4000002e-0005-ef00-b63f-84710c7967bb', + }, + { + name: 'RequestPath', + value: '/umbraco/backoffice/umbracoapi/content/EmptyRecycleBin', + }, + { + name: 'ProcessId', + value: '17632', + }, + { + name: 'ProcessName', + value: 'iisexpress', + }, + { + name: 'ThreadId', + value: '50', + }, + { + name: 'ApplicationId', + value: '0cf9334a65daa2e8a69943c6db2fb730bb14f2de', + }, + { + name: 'MachineName', + value: 'DESKTOP-M35N63H', + }, + { + name: 'Log4NetLevel', + value: 'DEBUG', + }, + { + name: 'HttpRequestId', + value: '54f6057e-d0f6-46d0-b7b4-082f315c4533', + }, + { + name: 'HttpRequestNumber', + value: '918', + }, + { + name: 'HttpSessionId', + value: '0', + }, + ], + exception: null, + }, + { + timestamp: '2023-02-14T11:59:35.5304962+00:00', + level: 'Debug', + messageTemplate: '{IndexName} searcher refreshed? {DidRefresh}', + renderedMessage: '"ExternalIndex" searcher refreshed? False', + properties: [ + { + name: 'IndexName', + value: 'ExternalIndex', + }, + { + name: 'DidRefresh', + value: 'False', + }, + { + name: 'SourceContext', + value: 'Examine.Lucene.Providers.LuceneIndex', + }, + { + name: 'ActionId', + value: 'c4a4ecf3-34e7-4ff9-99ad-4aab0a23c3c2', + }, + { + name: 'ActionName', + value: 'Umbraco.Cms.Web.BackOffice.Controllers.ContentController.DeleteById (Umbraco.Web.BackOffice)', + }, + { + name: 'RequestId', + value: '4000005e-0004-fe00-b63f-84710c7967bb', + }, + { + name: 'RequestPath', + value: '/umbraco/backoffice/umbracoapi/content/DeleteById', + }, + { + name: 'ProcessId', + value: '17632', + }, + { + name: 'ProcessName', + value: 'iisexpress', + }, + { + name: 'ThreadId', + value: '57', + }, + { + name: 'ApplicationId', + value: '0cf9334a65daa2e8a69943c6db2fb730bb14f2de', + }, + { + name: 'MachineName', + value: 'DESKTOP-M35N63H', + }, + { + name: 'Log4NetLevel', + value: 'DEBUG', + }, + { + name: 'HttpRequestId', + value: '39ae83f8-0778-474a-b41f-eea93b82b201', + }, + { + name: 'HttpRequestNumber', + value: '917', + }, + { + name: 'HttpSessionId', + value: '0', + }, + ], + exception: null, + }, + { + timestamp: '2023-02-14T11:59:30.5881163+00:00', + level: 'Debug', + messageTemplate: '{IndexName} searcher refreshed? {DidRefresh}', + renderedMessage: '"InternalIndex" searcher refreshed? False', + properties: [ + { + name: 'IndexName', + value: 'InternalIndex', + }, + { + name: 'DidRefresh', + value: 'False', + }, + { + name: 'SourceContext', + value: 'Examine.Lucene.Providers.LuceneIndex', + }, + { + name: 'ActionId', + value: '1d9a0529-a75a-40cc-be5d-c871548ab233', + }, + { + name: 'ActionName', + value: 'Umbraco.Cms.Web.BackOffice.Controllers.ContentController.EmptyRecycleBin (Umbraco.Web.BackOffice)', + }, + { + name: 'RequestId', + value: '4000002e-0005-ef00-b63f-84710c7967bb', + }, + { + name: 'RequestPath', + value: '/umbraco/backoffice/umbracoapi/content/EmptyRecycleBin', + }, + { + name: 'ProcessId', + value: '17632', + }, + { + name: 'ProcessName', + value: 'iisexpress', + }, + { + name: 'ThreadId', + value: '50', + }, + { + name: 'ApplicationId', + value: '0cf9334a65daa2e8a69943c6db2fb730bb14f2de', + }, + { + name: 'MachineName', + value: 'DESKTOP-M35N63H', + }, + { + name: 'Log4NetLevel', + value: 'DEBUG', + }, + { + name: 'HttpRequestId', + value: 'c521cadd-3e47-4eab-b640-ea9dfc50abb8', + }, + { + name: 'HttpRequestNumber', + value: '916', + }, + { + name: 'HttpSessionId', + value: '0', + }, + ], + exception: null, + }, + { + timestamp: '2023-02-14T11:59:30.5260781+00:00', + level: 'Debug', + messageTemplate: '{IndexName} searcher refreshed? {DidRefresh}', + renderedMessage: '"ExternalIndex" searcher refreshed? False', + properties: [ + { + name: 'IndexName', + value: 'ExternalIndex', + }, + { + name: 'DidRefresh', + value: 'False', + }, + { + name: 'SourceContext', + value: 'Examine.Lucene.Providers.LuceneIndex', + }, + { + name: 'ActionId', + value: 'c4a4ecf3-34e7-4ff9-99ad-4aab0a23c3c2', + }, + { + name: 'ActionName', + value: 'Umbraco.Cms.Web.BackOffice.Controllers.ContentController.DeleteById (Umbraco.Web.BackOffice)', + }, + { + name: 'RequestId', + value: '4000005e-0004-fe00-b63f-84710c7967bb', + }, + { + name: 'RequestPath', + value: '/umbraco/backoffice/umbracoapi/content/DeleteById', + }, + { + name: 'ProcessId', + value: '17632', + }, + { + name: 'ProcessName', + value: 'iisexpress', + }, + { + name: 'ThreadId', + value: '57', + }, + { + name: 'ApplicationId', + value: '0cf9334a65daa2e8a69943c6db2fb730bb14f2de', + }, + { + name: 'MachineName', + value: 'DESKTOP-M35N63H', + }, + { + name: 'Log4NetLevel', + value: 'DEBUG', + }, + { + name: 'HttpRequestId', + value: '5c3f597f-abcd-41d5-9360-8bd725c85b60', + }, + { + name: 'HttpRequestNumber', + value: '915', + }, + { + name: 'HttpSessionId', + value: '0', + }, + ], + exception: null, + }, + { + timestamp: '2023-02-14T11:59:25.5753438+00:00', + level: 'Debug', + messageTemplate: '{IndexName} searcher refreshed? {DidRefresh}', + renderedMessage: '"InternalIndex" searcher refreshed? False', + properties: [ + { + name: 'IndexName', + value: 'InternalIndex', + }, + { + name: 'DidRefresh', + value: 'False', + }, + { + name: 'SourceContext', + value: 'Examine.Lucene.Providers.LuceneIndex', + }, + { + name: 'ActionId', + value: '1d9a0529-a75a-40cc-be5d-c871548ab233', + }, + { + name: 'ActionName', + value: 'Umbraco.Cms.Web.BackOffice.Controllers.ContentController.EmptyRecycleBin (Umbraco.Web.BackOffice)', + }, + { + name: 'RequestId', + value: '4000002e-0005-ef00-b63f-84710c7967bb', + }, + { + name: 'RequestPath', + value: '/umbraco/backoffice/umbracoapi/content/EmptyRecycleBin', + }, + { + name: 'ProcessId', + value: '17632', + }, + { + name: 'ProcessName', + value: 'iisexpress', + }, + { + name: 'ThreadId', + value: '50', + }, + { + name: 'ApplicationId', + value: '0cf9334a65daa2e8a69943c6db2fb730bb14f2de', + }, + { + name: 'MachineName', + value: 'DESKTOP-M35N63H', + }, + { + name: 'Log4NetLevel', + value: 'DEBUG', + }, + { + name: 'HttpRequestId', + value: '886f9acd-60bd-4ed4-8cf2-1c35b007c58e', + }, + { + name: 'HttpRequestNumber', + value: '914', + }, + { + name: 'HttpSessionId', + value: '0', + }, + ], + exception: null, + }, + { + timestamp: '2023-02-14T11:59:25.5127958+00:00', + level: 'Debug', + messageTemplate: '{IndexName} searcher refreshed? {DidRefresh}', + renderedMessage: '"ExternalIndex" searcher refreshed? False', + properties: [ + { + name: 'IndexName', + value: 'ExternalIndex', + }, + { + name: 'DidRefresh', + value: 'False', + }, + { + name: 'SourceContext', + value: 'Examine.Lucene.Providers.LuceneIndex', + }, + { + name: 'ActionId', + value: 'c4a4ecf3-34e7-4ff9-99ad-4aab0a23c3c2', + }, + { + name: 'ActionName', + value: 'Umbraco.Cms.Web.BackOffice.Controllers.ContentController.DeleteById (Umbraco.Web.BackOffice)', + }, + { + name: 'RequestId', + value: '4000005e-0004-fe00-b63f-84710c7967bb', + }, + { + name: 'RequestPath', + value: '/umbraco/backoffice/umbracoapi/content/DeleteById', + }, + { + name: 'ProcessId', + value: '17632', + }, + { + name: 'ProcessName', + value: 'iisexpress', + }, + { + name: 'ThreadId', + value: '57', + }, + { + name: 'ApplicationId', + value: '0cf9334a65daa2e8a69943c6db2fb730bb14f2de', + }, + { + name: 'MachineName', + value: 'DESKTOP-M35N63H', + }, + { + name: 'Log4NetLevel', + value: 'DEBUG', + }, + { + name: 'HttpRequestId', + value: 'c215f085-f3b8-4150-b77c-0a9882404530', + }, + { + name: 'HttpRequestNumber', + value: '913', + }, + { + name: 'HttpSessionId', + value: '0', + }, + ], + exception: null, + }, + { + timestamp: '2023-02-14T11:59:20.571759+00:00', + level: 'Debug', + messageTemplate: '{IndexName} searcher refreshed? {DidRefresh}', + renderedMessage: '"InternalIndex" searcher refreshed? False', + properties: [ + { + name: 'IndexName', + value: 'InternalIndex', + }, + { + name: 'DidRefresh', + value: 'False', + }, + { + name: 'SourceContext', + value: 'Examine.Lucene.Providers.LuceneIndex', + }, + { + name: 'ActionId', + value: '1d9a0529-a75a-40cc-be5d-c871548ab233', + }, + { + name: 'ActionName', + value: 'Umbraco.Cms.Web.BackOffice.Controllers.ContentController.EmptyRecycleBin (Umbraco.Web.BackOffice)', + }, + { + name: 'RequestId', + value: '4000002e-0005-ef00-b63f-84710c7967bb', + }, + { + name: 'RequestPath', + value: '/umbraco/backoffice/umbracoapi/content/EmptyRecycleBin', + }, + { + name: 'ProcessId', + value: '17632', + }, + { + name: 'ProcessName', + value: 'iisexpress', + }, + { + name: 'ThreadId', + value: '50', + }, + { + name: 'ApplicationId', + value: '0cf9334a65daa2e8a69943c6db2fb730bb14f2de', + }, + { + name: 'MachineName', + value: 'DESKTOP-M35N63H', + }, + { + name: 'Log4NetLevel', + value: 'DEBUG', + }, + { + name: 'HttpRequestId', + value: 'b3d613ba-6a53-4d6e-9b1a-c755752fe566', + }, + { + name: 'HttpRequestNumber', + value: '912', + }, + { + name: 'HttpSessionId', + value: '0', + }, + ], + exception: null, + }, + { + timestamp: '2023-02-14T11:59:20.5091665+00:00', + level: 'Debug', + messageTemplate: '{IndexName} searcher refreshed? {DidRefresh}', + renderedMessage: '"ExternalIndex" searcher refreshed? False', + properties: [ + { + name: 'IndexName', + value: 'ExternalIndex', + }, + { + name: 'DidRefresh', + value: 'False', + }, + { + name: 'SourceContext', + value: 'Examine.Lucene.Providers.LuceneIndex', + }, + { + name: 'ActionId', + value: 'c4a4ecf3-34e7-4ff9-99ad-4aab0a23c3c2', + }, + { + name: 'ActionName', + value: 'Umbraco.Cms.Web.BackOffice.Controllers.ContentController.DeleteById (Umbraco.Web.BackOffice)', + }, + { + name: 'RequestId', + value: '4000005e-0004-fe00-b63f-84710c7967bb', + }, + { + name: 'RequestPath', + value: '/umbraco/backoffice/umbracoapi/content/DeleteById', + }, + { + name: 'ProcessId', + value: '17632', + }, + { + name: 'ProcessName', + value: 'iisexpress', + }, + { + name: 'ThreadId', + value: '57', + }, + { + name: 'ApplicationId', + value: '0cf9334a65daa2e8a69943c6db2fb730bb14f2de', + }, + { + name: 'MachineName', + value: 'DESKTOP-M35N63H', + }, + { + name: 'Log4NetLevel', + value: 'DEBUG', + }, + { + name: 'HttpRequestId', + value: 'f97c2d30-f658-447e-b728-136bcd824bc9', + }, + { + name: 'HttpRequestNumber', + value: '911', + }, + { + name: 'HttpSessionId', + value: '0', + }, + ], + exception: null, + }, + { + timestamp: '2023-02-14T11:59:15.569587+00:00', + level: 'Debug', + messageTemplate: '{IndexName} searcher refreshed? {DidRefresh}', + renderedMessage: '"InternalIndex" searcher refreshed? False', + properties: [ + { + name: 'IndexName', + value: 'InternalIndex', + }, + { + name: 'DidRefresh', + value: 'False', + }, + { + name: 'SourceContext', + value: 'Examine.Lucene.Providers.LuceneIndex', + }, + { + name: 'ActionId', + value: '1d9a0529-a75a-40cc-be5d-c871548ab233', + }, + { + name: 'ActionName', + value: 'Umbraco.Cms.Web.BackOffice.Controllers.ContentController.EmptyRecycleBin (Umbraco.Web.BackOffice)', + }, + { + name: 'RequestId', + value: '4000002e-0005-ef00-b63f-84710c7967bb', + }, + { + name: 'RequestPath', + value: '/umbraco/backoffice/umbracoapi/content/EmptyRecycleBin', + }, + { + name: 'ProcessId', + value: '17632', + }, + { + name: 'ProcessName', + value: 'iisexpress', + }, + { + name: 'ThreadId', + value: '50', + }, + { + name: 'ApplicationId', + value: '0cf9334a65daa2e8a69943c6db2fb730bb14f2de', + }, + { + name: 'MachineName', + value: 'DESKTOP-M35N63H', + }, + { + name: 'Log4NetLevel', + value: 'DEBUG', + }, + { + name: 'HttpRequestId', + value: 'f7d59956-1034-4698-aad1-c2da66d067e8', + }, + { + name: 'HttpRequestNumber', + value: '910', + }, + { + name: 'HttpSessionId', + value: '0', + }, + ], + exception: null, + }, + { + timestamp: '2023-02-14T11:59:15.5076538+00:00', + level: 'Debug', + messageTemplate: '{IndexName} searcher refreshed? {DidRefresh}', + renderedMessage: '"ExternalIndex" searcher refreshed? False', + properties: [ + { + name: 'IndexName', + value: 'ExternalIndex', + }, + { + name: 'DidRefresh', + value: 'False', + }, + { + name: 'SourceContext', + value: 'Examine.Lucene.Providers.LuceneIndex', + }, + { + name: 'ActionId', + value: 'c4a4ecf3-34e7-4ff9-99ad-4aab0a23c3c2', + }, + { + name: 'ActionName', + value: 'Umbraco.Cms.Web.BackOffice.Controllers.ContentController.DeleteById (Umbraco.Web.BackOffice)', + }, + { + name: 'RequestId', + value: '4000005e-0004-fe00-b63f-84710c7967bb', + }, + { + name: 'RequestPath', + value: '/umbraco/backoffice/umbracoapi/content/DeleteById', + }, + { + name: 'ProcessId', + value: '17632', + }, + { + name: 'ProcessName', + value: 'iisexpress', + }, + { + name: 'ThreadId', + value: '57', + }, + { + name: 'ApplicationId', + value: '0cf9334a65daa2e8a69943c6db2fb730bb14f2de', + }, + { + name: 'MachineName', + value: 'DESKTOP-M35N63H', + }, + { + name: 'Log4NetLevel', + value: 'DEBUG', + }, + { + name: 'HttpRequestId', + value: 'a98bb970-a9f1-4a31-b22c-6874e7bcc811', + }, + { + name: 'HttpRequestNumber', + value: '909', + }, + { + name: 'HttpSessionId', + value: '0', + }, + ], + exception: null, + }, + { + timestamp: '2023-02-14T11:59:10.5556531+00:00', + level: 'Debug', + messageTemplate: '{IndexName} searcher refreshed? {DidRefresh}', + renderedMessage: '"InternalIndex" searcher refreshed? False', + properties: [ + { + name: 'IndexName', + value: 'InternalIndex', + }, + { + name: 'DidRefresh', + value: 'False', + }, + { + name: 'SourceContext', + value: 'Examine.Lucene.Providers.LuceneIndex', + }, + { + name: 'ActionId', + value: '1d9a0529-a75a-40cc-be5d-c871548ab233', + }, + { + name: 'ActionName', + value: 'Umbraco.Cms.Web.BackOffice.Controllers.ContentController.EmptyRecycleBin (Umbraco.Web.BackOffice)', + }, + { + name: 'RequestId', + value: '4000002e-0005-ef00-b63f-84710c7967bb', + }, + { + name: 'RequestPath', + value: '/umbraco/backoffice/umbracoapi/content/EmptyRecycleBin', + }, + { + name: 'ProcessId', + value: '17632', + }, + { + name: 'ProcessName', + value: 'iisexpress', + }, + { + name: 'ThreadId', + value: '50', + }, + { + name: 'ApplicationId', + value: '0cf9334a65daa2e8a69943c6db2fb730bb14f2de', + }, + { + name: 'MachineName', + value: 'DESKTOP-M35N63H', + }, + { + name: 'Log4NetLevel', + value: 'DEBUG', + }, + { + name: 'HttpRequestId', + value: '188b901c-9022-4e8e-80c7-45bb8d5c7c0a', + }, + { + name: 'HttpRequestNumber', + value: '908', + }, + { + name: 'HttpSessionId', + value: '0', + }, + ], + exception: null, + }, + { + timestamp: '2023-02-14T11:59:10.5074665+00:00', + level: 'Debug', + messageTemplate: '{IndexName} searcher refreshed? {DidRefresh}', + renderedMessage: '"ExternalIndex" searcher refreshed? False', + properties: [ + { + name: 'IndexName', + value: 'ExternalIndex', + }, + { + name: 'DidRefresh', + value: 'False', + }, + { + name: 'SourceContext', + value: 'Examine.Lucene.Providers.LuceneIndex', + }, + { + name: 'ActionId', + value: 'c4a4ecf3-34e7-4ff9-99ad-4aab0a23c3c2', + }, + { + name: 'ActionName', + value: 'Umbraco.Cms.Web.BackOffice.Controllers.ContentController.DeleteById (Umbraco.Web.BackOffice)', + }, + { + name: 'RequestId', + value: '4000005e-0004-fe00-b63f-84710c7967bb', + }, + { + name: 'RequestPath', + value: '/umbraco/backoffice/umbracoapi/content/DeleteById', + }, + { + name: 'ProcessId', + value: '17632', + }, + { + name: 'ProcessName', + value: 'iisexpress', + }, + { + name: 'ThreadId', + value: '57', + }, + { + name: 'ApplicationId', + value: '0cf9334a65daa2e8a69943c6db2fb730bb14f2de', + }, + { + name: 'MachineName', + value: 'DESKTOP-M35N63H', + }, + { + name: 'Log4NetLevel', + value: 'DEBUG', + }, + { + name: 'HttpRequestId', + value: 'dba6dbdd-2142-4803-8223-cce07f231a51', + }, + { + name: 'HttpRequestNumber', + value: '907', + }, + { + name: 'HttpSessionId', + value: '0', + }, + ], + exception: null, + }, + { + timestamp: '2023-02-14T11:59:05.5524744+00:00', + level: 'Debug', + messageTemplate: '{IndexName} searcher refreshed? {DidRefresh}', + renderedMessage: '"InternalIndex" searcher refreshed? False', + properties: [ + { + name: 'IndexName', + value: 'InternalIndex', + }, + { + name: 'DidRefresh', + value: 'False', + }, + { + name: 'SourceContext', + value: 'Examine.Lucene.Providers.LuceneIndex', + }, + { + name: 'ActionId', + value: '1d9a0529-a75a-40cc-be5d-c871548ab233', + }, + { + name: 'ActionName', + value: 'Umbraco.Cms.Web.BackOffice.Controllers.ContentController.EmptyRecycleBin (Umbraco.Web.BackOffice)', + }, + { + name: 'RequestId', + value: '4000002e-0005-ef00-b63f-84710c7967bb', + }, + { + name: 'RequestPath', + value: '/umbraco/backoffice/umbracoapi/content/EmptyRecycleBin', + }, + { + name: 'ProcessId', + value: '17632', + }, + { + name: 'ProcessName', + value: 'iisexpress', + }, + { + name: 'ThreadId', + value: '50', + }, + { + name: 'ApplicationId', + value: '0cf9334a65daa2e8a69943c6db2fb730bb14f2de', + }, + { + name: 'MachineName', + value: 'DESKTOP-M35N63H', + }, + { + name: 'Log4NetLevel', + value: 'DEBUG', + }, + { + name: 'HttpRequestId', + value: '07d65eca-a9ca-4109-8ad8-4db2a737cc68', + }, + { + name: 'HttpRequestNumber', + value: '906', + }, + { + name: 'HttpSessionId', + value: '0', + }, + ], + exception: null, + }, + { + timestamp: '2023-02-14T11:59:05.5045339+00:00', + level: 'Debug', + messageTemplate: '{IndexName} searcher refreshed? {DidRefresh}', + renderedMessage: '"ExternalIndex" searcher refreshed? False', + properties: [ + { + name: 'IndexName', + value: 'ExternalIndex', + }, + { + name: 'DidRefresh', + value: 'False', + }, + { + name: 'SourceContext', + value: 'Examine.Lucene.Providers.LuceneIndex', + }, + { + name: 'ActionId', + value: 'c4a4ecf3-34e7-4ff9-99ad-4aab0a23c3c2', + }, + { + name: 'ActionName', + value: 'Umbraco.Cms.Web.BackOffice.Controllers.ContentController.DeleteById (Umbraco.Web.BackOffice)', + }, + { + name: 'RequestId', + value: '4000005e-0004-fe00-b63f-84710c7967bb', + }, + { + name: 'RequestPath', + value: '/umbraco/backoffice/umbracoapi/content/DeleteById', + }, + { + name: 'ProcessId', + value: '17632', + }, + { + name: 'ProcessName', + value: 'iisexpress', + }, + { + name: 'ThreadId', + value: '57', + }, + { + name: 'ApplicationId', + value: '0cf9334a65daa2e8a69943c6db2fb730bb14f2de', + }, + { + name: 'MachineName', + value: 'DESKTOP-M35N63H', + }, + { + name: 'Log4NetLevel', + value: 'DEBUG', + }, + { + name: 'HttpRequestId', + value: 'c75e74d2-dec9-4525-8966-34e455047231', + }, + { + name: 'HttpRequestNumber', + value: '905', + }, + { + name: 'HttpSessionId', + value: '0', + }, + ], + exception: null, + }, + { + timestamp: '2023-02-14T11:59:00.5441587+00:00', + level: 'Debug', + messageTemplate: '{IndexName} searcher refreshed? {DidRefresh}', + renderedMessage: '"InternalIndex" searcher refreshed? False', + properties: [ + { + name: 'IndexName', + value: 'InternalIndex', + }, + { + name: 'DidRefresh', + value: 'False', + }, + { + name: 'SourceContext', + value: 'Examine.Lucene.Providers.LuceneIndex', + }, + { + name: 'ActionId', + value: '1d9a0529-a75a-40cc-be5d-c871548ab233', + }, + { + name: 'ActionName', + value: 'Umbraco.Cms.Web.BackOffice.Controllers.ContentController.EmptyRecycleBin (Umbraco.Web.BackOffice)', + }, + { + name: 'RequestId', + value: '4000002e-0005-ef00-b63f-84710c7967bb', + }, + { + name: 'RequestPath', + value: '/umbraco/backoffice/umbracoapi/content/EmptyRecycleBin', + }, + { + name: 'ProcessId', + value: '17632', + }, + { + name: 'ProcessName', + value: 'iisexpress', + }, + { + name: 'ThreadId', + value: '50', + }, + { + name: 'ApplicationId', + value: '0cf9334a65daa2e8a69943c6db2fb730bb14f2de', + }, + { + name: 'MachineName', + value: 'DESKTOP-M35N63H', + }, + { + name: 'Log4NetLevel', + value: 'DEBUG', + }, + { + name: 'HttpRequestId', + value: '4787c7ab-a877-47e5-96fa-a8cdbc8eb427', + }, + { + name: 'HttpRequestNumber', + value: '904', + }, + { + name: 'HttpSessionId', + value: '0', + }, + ], + exception: null, + }, + { + timestamp: '2023-02-14T11:59:00.4976461+00:00', + level: 'Debug', + messageTemplate: '{IndexName} searcher refreshed? {DidRefresh}', + renderedMessage: '"ExternalIndex" searcher refreshed? False', + properties: [ + { + name: 'IndexName', + value: 'ExternalIndex', + }, + { + name: 'DidRefresh', + value: 'False', + }, + { + name: 'SourceContext', + value: 'Examine.Lucene.Providers.LuceneIndex', + }, + { + name: 'ActionId', + value: 'c4a4ecf3-34e7-4ff9-99ad-4aab0a23c3c2', + }, + { + name: 'ActionName', + value: 'Umbraco.Cms.Web.BackOffice.Controllers.ContentController.DeleteById (Umbraco.Web.BackOffice)', + }, + { + name: 'RequestId', + value: '4000005e-0004-fe00-b63f-84710c7967bb', + }, + { + name: 'RequestPath', + value: '/umbraco/backoffice/umbracoapi/content/DeleteById', + }, + { + name: 'ProcessId', + value: '17632', + }, + { + name: 'ProcessName', + value: 'iisexpress', + }, + { + name: 'ThreadId', + value: '57', + }, + { + name: 'ApplicationId', + value: '0cf9334a65daa2e8a69943c6db2fb730bb14f2de', + }, + { + name: 'MachineName', + value: 'DESKTOP-M35N63H', + }, + { + name: 'Log4NetLevel', + value: 'DEBUG', + }, + { + name: 'HttpRequestId', + value: '6fd66545-4305-4f30-9791-54be1d151483', + }, + { + name: 'HttpRequestNumber', + value: '903', + }, + { + name: 'HttpSessionId', + value: '0', + }, + ], + exception: null, + }, + { + timestamp: '2023-02-14T11:58:55.5306481+00:00', + level: 'Debug', + messageTemplate: '{IndexName} searcher refreshed? {DidRefresh}', + renderedMessage: '"InternalIndex" searcher refreshed? False', + properties: [ + { + name: 'IndexName', + value: 'InternalIndex', + }, + { + name: 'DidRefresh', + value: 'False', + }, + { + name: 'SourceContext', + value: 'Examine.Lucene.Providers.LuceneIndex', + }, + { + name: 'ActionId', + value: '1d9a0529-a75a-40cc-be5d-c871548ab233', + }, + { + name: 'ActionName', + value: 'Umbraco.Cms.Web.BackOffice.Controllers.ContentController.EmptyRecycleBin (Umbraco.Web.BackOffice)', + }, + { + name: 'RequestId', + value: '4000002e-0005-ef00-b63f-84710c7967bb', + }, + { + name: 'RequestPath', + value: '/umbraco/backoffice/umbracoapi/content/EmptyRecycleBin', + }, + { + name: 'ProcessId', + value: '17632', + }, + { + name: 'ProcessName', + value: 'iisexpress', + }, + { + name: 'ThreadId', + value: '50', + }, + { + name: 'ApplicationId', + value: '0cf9334a65daa2e8a69943c6db2fb730bb14f2de', + }, + { + name: 'MachineName', + value: 'DESKTOP-M35N63H', + }, + { + name: 'Log4NetLevel', + value: 'DEBUG', + }, + { + name: 'HttpRequestId', + value: '06ac6e6f-d866-48e7-ae49-b908cd472555', + }, + { + name: 'HttpRequestNumber', + value: '902', + }, + { + name: 'HttpSessionId', + value: '0', + }, + ], + exception: null, + }, + { + timestamp: '2023-02-14T11:58:55.4849332+00:00', + level: 'Debug', + messageTemplate: '{IndexName} searcher refreshed? {DidRefresh}', + renderedMessage: '"ExternalIndex" searcher refreshed? False', + properties: [ + { + name: 'IndexName', + value: 'ExternalIndex', + }, + { + name: 'DidRefresh', + value: 'False', + }, + { + name: 'SourceContext', + value: 'Examine.Lucene.Providers.LuceneIndex', + }, + { + name: 'ActionId', + value: 'c4a4ecf3-34e7-4ff9-99ad-4aab0a23c3c2', + }, + { + name: 'ActionName', + value: 'Umbraco.Cms.Web.BackOffice.Controllers.ContentController.DeleteById (Umbraco.Web.BackOffice)', + }, + { + name: 'RequestId', + value: '4000005e-0004-fe00-b63f-84710c7967bb', + }, + { + name: 'RequestPath', + value: '/umbraco/backoffice/umbracoapi/content/DeleteById', + }, + { + name: 'ProcessId', + value: '17632', + }, + { + name: 'ProcessName', + value: 'iisexpress', + }, + { + name: 'ThreadId', + value: '57', + }, + { + name: 'ApplicationId', + value: '0cf9334a65daa2e8a69943c6db2fb730bb14f2de', + }, + { + name: 'MachineName', + value: 'DESKTOP-M35N63H', + }, + { + name: 'Log4NetLevel', + value: 'DEBUG', + }, + { + name: 'HttpRequestId', + value: 'a8a3191e-1324-49b7-9fc5-c65b99f29c37', + }, + { + name: 'HttpRequestNumber', + value: '901', + }, + { + name: 'HttpSessionId', + value: '0', + }, + ], + exception: null, + }, + { + timestamp: '2023-02-14T11:58:50.5183018+00:00', + level: 'Debug', + messageTemplate: '{IndexName} searcher refreshed? {DidRefresh}', + renderedMessage: '"InternalIndex" searcher refreshed? False', + properties: [ + { + name: 'IndexName', + value: 'InternalIndex', + }, + { + name: 'DidRefresh', + value: 'False', + }, + { + name: 'SourceContext', + value: 'Examine.Lucene.Providers.LuceneIndex', + }, + { + name: 'ActionId', + value: '1d9a0529-a75a-40cc-be5d-c871548ab233', + }, + { + name: 'ActionName', + value: 'Umbraco.Cms.Web.BackOffice.Controllers.ContentController.EmptyRecycleBin (Umbraco.Web.BackOffice)', + }, + { + name: 'RequestId', + value: '4000002e-0005-ef00-b63f-84710c7967bb', + }, + { + name: 'RequestPath', + value: '/umbraco/backoffice/umbracoapi/content/EmptyRecycleBin', + }, + { + name: 'ProcessId', + value: '17632', + }, + { + name: 'ProcessName', + value: 'iisexpress', + }, + { + name: 'ThreadId', + value: '50', + }, + { + name: 'ApplicationId', + value: '0cf9334a65daa2e8a69943c6db2fb730bb14f2de', + }, + { + name: 'MachineName', + value: 'DESKTOP-M35N63H', + }, + { + name: 'Log4NetLevel', + value: 'DEBUG', + }, + { + name: 'HttpRequestId', + value: '5c3c404b-03bb-47ee-8e60-2678249015a8', + }, + { + name: 'HttpRequestNumber', + value: '900', + }, + { + name: 'HttpSessionId', + value: '0', + }, + ], + exception: null, + }, + { + timestamp: '2023-02-14T11:58:50.4715437+00:00', + level: 'Debug', + messageTemplate: '{IndexName} searcher refreshed? {DidRefresh}', + renderedMessage: '"ExternalIndex" searcher refreshed? False', + properties: [ + { + name: 'IndexName', + value: 'ExternalIndex', + }, + { + name: 'DidRefresh', + value: 'False', + }, + { + name: 'SourceContext', + value: 'Examine.Lucene.Providers.LuceneIndex', + }, + { + name: 'ActionId', + value: 'c4a4ecf3-34e7-4ff9-99ad-4aab0a23c3c2', + }, + { + name: 'ActionName', + value: 'Umbraco.Cms.Web.BackOffice.Controllers.ContentController.DeleteById (Umbraco.Web.BackOffice)', + }, + { + name: 'RequestId', + value: '4000005e-0004-fe00-b63f-84710c7967bb', + }, + { + name: 'RequestPath', + value: '/umbraco/backoffice/umbracoapi/content/DeleteById', + }, + { + name: 'ProcessId', + value: '17632', + }, + { + name: 'ProcessName', + value: 'iisexpress', + }, + { + name: 'ThreadId', + value: '57', + }, + { + name: 'ApplicationId', + value: '0cf9334a65daa2e8a69943c6db2fb730bb14f2de', + }, + { + name: 'MachineName', + value: 'DESKTOP-M35N63H', + }, + { + name: 'Log4NetLevel', + value: 'DEBUG', + }, + { + name: 'HttpRequestId', + value: '40090ff4-ac41-4e2d-a69b-99414ce77df5', + }, + { + name: 'HttpRequestNumber', + value: '899', + }, + { + name: 'HttpSessionId', + value: '0', + }, + ], + exception: null, + }, + { + timestamp: '2023-02-14T11:58:45.5057522+00:00', + level: 'Debug', + messageTemplate: '{IndexName} searcher refreshed? {DidRefresh}', + renderedMessage: '"InternalIndex" searcher refreshed? False', + properties: [ + { + name: 'IndexName', + value: 'InternalIndex', + }, + { + name: 'DidRefresh', + value: 'False', + }, + { + name: 'SourceContext', + value: 'Examine.Lucene.Providers.LuceneIndex', + }, + { + name: 'ActionId', + value: '1d9a0529-a75a-40cc-be5d-c871548ab233', + }, + { + name: 'ActionName', + value: 'Umbraco.Cms.Web.BackOffice.Controllers.ContentController.EmptyRecycleBin (Umbraco.Web.BackOffice)', + }, + { + name: 'RequestId', + value: '4000002e-0005-ef00-b63f-84710c7967bb', + }, + { + name: 'RequestPath', + value: '/umbraco/backoffice/umbracoapi/content/EmptyRecycleBin', + }, + { + name: 'ProcessId', + value: '17632', + }, + { + name: 'ProcessName', + value: 'iisexpress', + }, + { + name: 'ThreadId', + value: '50', + }, + { + name: 'ApplicationId', + value: '0cf9334a65daa2e8a69943c6db2fb730bb14f2de', + }, + { + name: 'MachineName', + value: 'DESKTOP-M35N63H', + }, + { + name: 'Log4NetLevel', + value: 'DEBUG', + }, + { + name: 'HttpRequestId', + value: 'b4cf7b6b-ebaf-40d0-97d6-69acd93bec86', + }, + { + name: 'HttpRequestNumber', + value: '898', + }, + { + name: 'HttpSessionId', + value: '0', + }, + ], + exception: null, + }, + { + timestamp: '2023-02-14T11:58:45.4595094+00:00', + level: 'Debug', + messageTemplate: '{IndexName} searcher refreshed? {DidRefresh}', + renderedMessage: '"ExternalIndex" searcher refreshed? False', + properties: [ + { + name: 'IndexName', + value: 'ExternalIndex', + }, + { + name: 'DidRefresh', + value: 'False', + }, + { + name: 'SourceContext', + value: 'Examine.Lucene.Providers.LuceneIndex', + }, + { + name: 'ActionId', + value: 'c4a4ecf3-34e7-4ff9-99ad-4aab0a23c3c2', + }, + { + name: 'ActionName', + value: 'Umbraco.Cms.Web.BackOffice.Controllers.ContentController.DeleteById (Umbraco.Web.BackOffice)', + }, + { + name: 'RequestId', + value: '4000005e-0004-fe00-b63f-84710c7967bb', + }, + { + name: 'RequestPath', + value: '/umbraco/backoffice/umbracoapi/content/DeleteById', + }, + { + name: 'ProcessId', + value: '17632', + }, + { + name: 'ProcessName', + value: 'iisexpress', + }, + { + name: 'ThreadId', + value: '57', + }, + { + name: 'ApplicationId', + value: '0cf9334a65daa2e8a69943c6db2fb730bb14f2de', + }, + { + name: 'MachineName', + value: 'DESKTOP-M35N63H', + }, + { + name: 'Log4NetLevel', + value: 'DEBUG', + }, + { + name: 'HttpRequestId', + value: '17ee778c-62bb-4025-a232-bfaf76eda60b', + }, + { + name: 'HttpRequestNumber', + value: '897', + }, + { + name: 'HttpSessionId', + value: '0', + }, + ], + exception: null, + }, + { + timestamp: '2023-02-14T11:58:40.4955381+00:00', + level: 'Debug', + messageTemplate: '{IndexName} searcher refreshed? {DidRefresh}', + renderedMessage: '"InternalIndex" searcher refreshed? False', + properties: [ + { + name: 'IndexName', + value: 'InternalIndex', + }, + { + name: 'DidRefresh', + value: 'False', + }, + { + name: 'SourceContext', + value: 'Examine.Lucene.Providers.LuceneIndex', + }, + { + name: 'ActionId', + value: '1d9a0529-a75a-40cc-be5d-c871548ab233', + }, + { + name: 'ActionName', + value: 'Umbraco.Cms.Web.BackOffice.Controllers.ContentController.EmptyRecycleBin (Umbraco.Web.BackOffice)', + }, + { + name: 'RequestId', + value: '4000002e-0005-ef00-b63f-84710c7967bb', + }, + { + name: 'RequestPath', + value: '/umbraco/backoffice/umbracoapi/content/EmptyRecycleBin', + }, + { + name: 'ProcessId', + value: '17632', + }, + { + name: 'ProcessName', + value: 'iisexpress', + }, + { + name: 'ThreadId', + value: '50', + }, + { + name: 'ApplicationId', + value: '0cf9334a65daa2e8a69943c6db2fb730bb14f2de', + }, + { + name: 'MachineName', + value: 'DESKTOP-M35N63H', + }, + { + name: 'Log4NetLevel', + value: 'DEBUG', + }, + { + name: 'HttpRequestId', + value: 'f2f9a23f-efd1-4bc5-a316-bc603544c43a', + }, + { + name: 'HttpRequestNumber', + value: '896', + }, + { + name: 'HttpSessionId', + value: '0', + }, + ], + exception: null, + }, + { + timestamp: '2023-02-14T11:58:40.4490867+00:00', + level: 'Debug', + messageTemplate: '{IndexName} searcher refreshed? {DidRefresh}', + renderedMessage: '"ExternalIndex" searcher refreshed? False', + properties: [ + { + name: 'IndexName', + value: 'ExternalIndex', + }, + { + name: 'DidRefresh', + value: 'False', + }, + { + name: 'SourceContext', + value: 'Examine.Lucene.Providers.LuceneIndex', + }, + { + name: 'ActionId', + value: 'c4a4ecf3-34e7-4ff9-99ad-4aab0a23c3c2', + }, + { + name: 'ActionName', + value: 'Umbraco.Cms.Web.BackOffice.Controllers.ContentController.DeleteById (Umbraco.Web.BackOffice)', + }, + { + name: 'RequestId', + value: '4000005e-0004-fe00-b63f-84710c7967bb', + }, + { + name: 'RequestPath', + value: '/umbraco/backoffice/umbracoapi/content/DeleteById', + }, + { + name: 'ProcessId', + value: '17632', + }, + { + name: 'ProcessName', + value: 'iisexpress', + }, + { + name: 'ThreadId', + value: '57', + }, + { + name: 'ApplicationId', + value: '0cf9334a65daa2e8a69943c6db2fb730bb14f2de', + }, + { + name: 'MachineName', + value: 'DESKTOP-M35N63H', + }, + { + name: 'Log4NetLevel', + value: 'DEBUG', + }, + { + name: 'HttpRequestId', + value: '1894e914-d45b-436f-b125-56160011d80f', + }, + { + name: 'HttpRequestNumber', + value: '895', + }, + { + name: 'HttpSessionId', + value: '0', + }, + ], + exception: null, + }, + { + timestamp: '2023-02-14T11:58:35.4899092+00:00', + level: 'Debug', + messageTemplate: '{IndexName} searcher refreshed? {DidRefresh}', + renderedMessage: '"InternalIndex" searcher refreshed? False', + properties: [ + { + name: 'IndexName', + value: 'InternalIndex', + }, + { + name: 'DidRefresh', + value: 'False', + }, + { + name: 'SourceContext', + value: 'Examine.Lucene.Providers.LuceneIndex', + }, + { + name: 'ActionId', + value: '1d9a0529-a75a-40cc-be5d-c871548ab233', + }, + { + name: 'ActionName', + value: 'Umbraco.Cms.Web.BackOffice.Controllers.ContentController.EmptyRecycleBin (Umbraco.Web.BackOffice)', + }, + { + name: 'RequestId', + value: '4000002e-0005-ef00-b63f-84710c7967bb', + }, + { + name: 'RequestPath', + value: '/umbraco/backoffice/umbracoapi/content/EmptyRecycleBin', + }, + { + name: 'ProcessId', + value: '17632', + }, + { + name: 'ProcessName', + value: 'iisexpress', + }, + { + name: 'ThreadId', + value: '50', + }, + { + name: 'ApplicationId', + value: '0cf9334a65daa2e8a69943c6db2fb730bb14f2de', + }, + { + name: 'MachineName', + value: 'DESKTOP-M35N63H', + }, + { + name: 'Log4NetLevel', + value: 'DEBUG', + }, + { + name: 'HttpRequestId', + value: 'f092d759-7c3a-4e7e-a560-9ac7e6c77f7c', + }, + { + name: 'HttpRequestNumber', + value: '894', + }, + { + name: 'HttpSessionId', + value: '0', + }, + ], + exception: null, + }, + { + timestamp: '2023-02-14T11:58:35.4438695+00:00', + level: 'Debug', + messageTemplate: '{IndexName} searcher refreshed? {DidRefresh}', + renderedMessage: '"ExternalIndex" searcher refreshed? False', + properties: [ + { + name: 'IndexName', + value: 'ExternalIndex', + }, + { + name: 'DidRefresh', + value: 'False', + }, + { + name: 'SourceContext', + value: 'Examine.Lucene.Providers.LuceneIndex', + }, + { + name: 'ActionId', + value: 'c4a4ecf3-34e7-4ff9-99ad-4aab0a23c3c2', + }, + { + name: 'ActionName', + value: 'Umbraco.Cms.Web.BackOffice.Controllers.ContentController.DeleteById (Umbraco.Web.BackOffice)', + }, + { + name: 'RequestId', + value: '4000005e-0004-fe00-b63f-84710c7967bb', + }, + { + name: 'RequestPath', + value: '/umbraco/backoffice/umbracoapi/content/DeleteById', + }, + { + name: 'ProcessId', + value: '17632', + }, + { + name: 'ProcessName', + value: 'iisexpress', + }, + { + name: 'ThreadId', + value: '57', + }, + { + name: 'ApplicationId', + value: '0cf9334a65daa2e8a69943c6db2fb730bb14f2de', + }, + { + name: 'MachineName', + value: 'DESKTOP-M35N63H', + }, + { + name: 'Log4NetLevel', + value: 'DEBUG', + }, + { + name: 'HttpRequestId', + value: 'f02cb18d-8976-4f2c-a16a-a0c9006724a1', + }, + { + name: 'HttpRequestNumber', + value: '893', + }, + { + name: 'HttpSessionId', + value: '0', + }, + ], + exception: null, + }, + { + timestamp: '2023-02-14T11:58:30.4782757+00:00', + level: 'Debug', + messageTemplate: '{IndexName} searcher refreshed? {DidRefresh}', + renderedMessage: '"InternalIndex" searcher refreshed? False', + properties: [ + { + name: 'IndexName', + value: 'InternalIndex', + }, + { + name: 'DidRefresh', + value: 'False', + }, + { + name: 'SourceContext', + value: 'Examine.Lucene.Providers.LuceneIndex', + }, + { + name: 'ActionId', + value: '1d9a0529-a75a-40cc-be5d-c871548ab233', + }, + { + name: 'ActionName', + value: 'Umbraco.Cms.Web.BackOffice.Controllers.ContentController.EmptyRecycleBin (Umbraco.Web.BackOffice)', + }, + { + name: 'RequestId', + value: '4000002e-0005-ef00-b63f-84710c7967bb', + }, + { + name: 'RequestPath', + value: '/umbraco/backoffice/umbracoapi/content/EmptyRecycleBin', + }, + { + name: 'ProcessId', + value: '17632', + }, + { + name: 'ProcessName', + value: 'iisexpress', + }, + { + name: 'ThreadId', + value: '50', + }, + { + name: 'ApplicationId', + value: '0cf9334a65daa2e8a69943c6db2fb730bb14f2de', + }, + { + name: 'MachineName', + value: 'DESKTOP-M35N63H', + }, + { + name: 'Log4NetLevel', + value: 'DEBUG', + }, + { + name: 'HttpRequestId', + value: '743f4f0b-7e83-4eb8-bfdc-e3e97be0ecc6', + }, + { + name: 'HttpRequestNumber', + value: '892', + }, + { + name: 'HttpSessionId', + value: '0', + }, + ], + exception: null, + }, + { + timestamp: '2023-02-14T11:58:30.4324179+00:00', + level: 'Debug', + messageTemplate: '{IndexName} searcher refreshed? {DidRefresh}', + renderedMessage: '"ExternalIndex" searcher refreshed? False', + properties: [ + { + name: 'IndexName', + value: 'ExternalIndex', + }, + { + name: 'DidRefresh', + value: 'False', + }, + { + name: 'SourceContext', + value: 'Examine.Lucene.Providers.LuceneIndex', + }, + { + name: 'ActionId', + value: 'c4a4ecf3-34e7-4ff9-99ad-4aab0a23c3c2', + }, + { + name: 'ActionName', + value: 'Umbraco.Cms.Web.BackOffice.Controllers.ContentController.DeleteById (Umbraco.Web.BackOffice)', + }, + { + name: 'RequestId', + value: '4000005e-0004-fe00-b63f-84710c7967bb', + }, + { + name: 'RequestPath', + value: '/umbraco/backoffice/umbracoapi/content/DeleteById', + }, + { + name: 'ProcessId', + value: '17632', + }, + { + name: 'ProcessName', + value: 'iisexpress', + }, + { + name: 'ThreadId', + value: '57', + }, + { + name: 'ApplicationId', + value: '0cf9334a65daa2e8a69943c6db2fb730bb14f2de', + }, + { + name: 'MachineName', + value: 'DESKTOP-M35N63H', + }, + { + name: 'Log4NetLevel', + value: 'DEBUG', + }, + { + name: 'HttpRequestId', + value: '422d43b5-45a4-4b59-901b-399cb3fb448a', + }, + { + name: 'HttpRequestNumber', + value: '891', + }, + { + name: 'HttpSessionId', + value: '0', + }, + ], + exception: null, + }, + { + timestamp: '2023-02-14T11:58:25.4653028+00:00', + level: 'Debug', + messageTemplate: '{IndexName} searcher refreshed? {DidRefresh}', + renderedMessage: '"InternalIndex" searcher refreshed? False', + properties: [ + { + name: 'IndexName', + value: 'InternalIndex', + }, + { + name: 'DidRefresh', + value: 'False', + }, + { + name: 'SourceContext', + value: 'Examine.Lucene.Providers.LuceneIndex', + }, + { + name: 'ActionId', + value: '1d9a0529-a75a-40cc-be5d-c871548ab233', + }, + { + name: 'ActionName', + value: 'Umbraco.Cms.Web.BackOffice.Controllers.ContentController.EmptyRecycleBin (Umbraco.Web.BackOffice)', + }, + { + name: 'RequestId', + value: '4000002e-0005-ef00-b63f-84710c7967bb', + }, + { + name: 'RequestPath', + value: '/umbraco/backoffice/umbracoapi/content/EmptyRecycleBin', + }, + { + name: 'ProcessId', + value: '17632', + }, + { + name: 'ProcessName', + value: 'iisexpress', + }, + { + name: 'ThreadId', + value: '50', + }, + { + name: 'ApplicationId', + value: '0cf9334a65daa2e8a69943c6db2fb730bb14f2de', + }, + { + name: 'MachineName', + value: 'DESKTOP-M35N63H', + }, + { + name: 'Log4NetLevel', + value: 'DEBUG', + }, + { + name: 'HttpRequestId', + value: '7a3fe678-d6c9-475a-ab57-f7b4d06b8005', + }, + { + name: 'HttpRequestNumber', + value: '890', + }, + { + name: 'HttpSessionId', + value: '0', + }, + ], + exception: null, + }, + { + timestamp: '2023-02-14T11:58:25.4179895+00:00', + level: 'Debug', + messageTemplate: '{IndexName} searcher refreshed? {DidRefresh}', + renderedMessage: '"ExternalIndex" searcher refreshed? False', + properties: [ + { + name: 'IndexName', + value: 'ExternalIndex', + }, + { + name: 'DidRefresh', + value: 'False', + }, + { + name: 'SourceContext', + value: 'Examine.Lucene.Providers.LuceneIndex', + }, + { + name: 'ActionId', + value: 'c4a4ecf3-34e7-4ff9-99ad-4aab0a23c3c2', + }, + { + name: 'ActionName', + value: 'Umbraco.Cms.Web.BackOffice.Controllers.ContentController.DeleteById (Umbraco.Web.BackOffice)', + }, + { + name: 'RequestId', + value: '4000005e-0004-fe00-b63f-84710c7967bb', + }, + { + name: 'RequestPath', + value: '/umbraco/backoffice/umbracoapi/content/DeleteById', + }, + { + name: 'ProcessId', + value: '17632', + }, + { + name: 'ProcessName', + value: 'iisexpress', + }, + { + name: 'ThreadId', + value: '57', + }, + { + name: 'ApplicationId', + value: '0cf9334a65daa2e8a69943c6db2fb730bb14f2de', + }, + { + name: 'MachineName', + value: 'DESKTOP-M35N63H', + }, + { + name: 'Log4NetLevel', + value: 'DEBUG', + }, + { + name: 'HttpRequestId', + value: '956a5a79-b0dd-446b-b4d0-f9594d6f538d', + }, + { + name: 'HttpRequestNumber', + value: '889', + }, + { + name: 'HttpSessionId', + value: '0', + }, + ], + exception: null, + }, + { + timestamp: '2023-02-14T11:58:20.4554989+00:00', + level: 'Debug', + messageTemplate: '{IndexName} searcher refreshed? {DidRefresh}', + renderedMessage: '"InternalIndex" searcher refreshed? False', + properties: [ + { + name: 'IndexName', + value: 'InternalIndex', + }, + { + name: 'DidRefresh', + value: 'False', + }, + { + name: 'SourceContext', + value: 'Examine.Lucene.Providers.LuceneIndex', + }, + { + name: 'ActionId', + value: '1d9a0529-a75a-40cc-be5d-c871548ab233', + }, + { + name: 'ActionName', + value: 'Umbraco.Cms.Web.BackOffice.Controllers.ContentController.EmptyRecycleBin (Umbraco.Web.BackOffice)', + }, + { + name: 'RequestId', + value: '4000002e-0005-ef00-b63f-84710c7967bb', + }, + { + name: 'RequestPath', + value: '/umbraco/backoffice/umbracoapi/content/EmptyRecycleBin', + }, + { + name: 'ProcessId', + value: '17632', + }, + { + name: 'ProcessName', + value: 'iisexpress', + }, + { + name: 'ThreadId', + value: '50', + }, + { + name: 'ApplicationId', + value: '0cf9334a65daa2e8a69943c6db2fb730bb14f2de', + }, + { + name: 'MachineName', + value: 'DESKTOP-M35N63H', + }, + { + name: 'Log4NetLevel', + value: 'DEBUG', + }, + { + name: 'HttpRequestId', + value: '7cdab7b5-0d9b-4ae4-b023-83b5415e2909', + }, + { + name: 'HttpRequestNumber', + value: '888', + }, + { + name: 'HttpSessionId', + value: '0', + }, + ], + exception: null, + }, + { + timestamp: '2023-02-14T11:58:20.4074817+00:00', + level: 'Debug', + messageTemplate: '{IndexName} searcher refreshed? {DidRefresh}', + renderedMessage: '"ExternalIndex" searcher refreshed? False', + properties: [ + { + name: 'IndexName', + value: 'ExternalIndex', + }, + { + name: 'DidRefresh', + value: 'False', + }, + { + name: 'SourceContext', + value: 'Examine.Lucene.Providers.LuceneIndex', + }, + { + name: 'ActionId', + value: 'c4a4ecf3-34e7-4ff9-99ad-4aab0a23c3c2', + }, + { + name: 'ActionName', + value: 'Umbraco.Cms.Web.BackOffice.Controllers.ContentController.DeleteById (Umbraco.Web.BackOffice)', + }, + { + name: 'RequestId', + value: '4000005e-0004-fe00-b63f-84710c7967bb', + }, + { + name: 'RequestPath', + value: '/umbraco/backoffice/umbracoapi/content/DeleteById', + }, + { + name: 'ProcessId', + value: '17632', + }, + { + name: 'ProcessName', + value: 'iisexpress', + }, + { + name: 'ThreadId', + value: '57', + }, + { + name: 'ApplicationId', + value: '0cf9334a65daa2e8a69943c6db2fb730bb14f2de', + }, + { + name: 'MachineName', + value: 'DESKTOP-M35N63H', + }, + { + name: 'Log4NetLevel', + value: 'DEBUG', + }, + { + name: 'HttpRequestId', + value: 'f9dbdf17-fc1a-45b4-bd88-030b2c26ec16', + }, + { + name: 'HttpRequestNumber', + value: '887', + }, + { + name: 'HttpSessionId', + value: '0', + }, + ], + exception: null, + }, + { + timestamp: '2023-02-14T11:58:15.4508724+00:00', + level: 'Debug', + messageTemplate: '{IndexName} searcher refreshed? {DidRefresh}', + renderedMessage: '"InternalIndex" searcher refreshed? False', + properties: [ + { + name: 'IndexName', + value: 'InternalIndex', + }, + { + name: 'DidRefresh', + value: 'False', + }, + { + name: 'SourceContext', + value: 'Examine.Lucene.Providers.LuceneIndex', + }, + { + name: 'ActionId', + value: '1d9a0529-a75a-40cc-be5d-c871548ab233', + }, + { + name: 'ActionName', + value: 'Umbraco.Cms.Web.BackOffice.Controllers.ContentController.EmptyRecycleBin (Umbraco.Web.BackOffice)', + }, + { + name: 'RequestId', + value: '4000002e-0005-ef00-b63f-84710c7967bb', + }, + { + name: 'RequestPath', + value: '/umbraco/backoffice/umbracoapi/content/EmptyRecycleBin', + }, + { + name: 'ProcessId', + value: '17632', + }, + { + name: 'ProcessName', + value: 'iisexpress', + }, + { + name: 'ThreadId', + value: '50', + }, + { + name: 'ApplicationId', + value: '0cf9334a65daa2e8a69943c6db2fb730bb14f2de', + }, + { + name: 'MachineName', + value: 'DESKTOP-M35N63H', + }, + { + name: 'Log4NetLevel', + value: 'DEBUG', + }, + { + name: 'HttpRequestId', + value: '9fef4e4a-e373-4a9a-b162-857af5c160f9', + }, + { + name: 'HttpRequestNumber', + value: '886', + }, + { + name: 'HttpSessionId', + value: '0', + }, + ], + exception: null, + }, + { + timestamp: '2023-02-14T11:58:15.4043773+00:00', + level: 'Debug', + messageTemplate: '{IndexName} searcher refreshed? {DidRefresh}', + renderedMessage: '"ExternalIndex" searcher refreshed? False', + properties: [ + { + name: 'IndexName', + value: 'ExternalIndex', + }, + { + name: 'DidRefresh', + value: 'False', + }, + { + name: 'SourceContext', + value: 'Examine.Lucene.Providers.LuceneIndex', + }, + { + name: 'ActionId', + value: 'c4a4ecf3-34e7-4ff9-99ad-4aab0a23c3c2', + }, + { + name: 'ActionName', + value: 'Umbraco.Cms.Web.BackOffice.Controllers.ContentController.DeleteById (Umbraco.Web.BackOffice)', + }, + { + name: 'RequestId', + value: '4000005e-0004-fe00-b63f-84710c7967bb', + }, + { + name: 'RequestPath', + value: '/umbraco/backoffice/umbracoapi/content/DeleteById', + }, + { + name: 'ProcessId', + value: '17632', + }, + { + name: 'ProcessName', + value: 'iisexpress', + }, + { + name: 'ThreadId', + value: '57', + }, + { + name: 'ApplicationId', + value: '0cf9334a65daa2e8a69943c6db2fb730bb14f2de', + }, + { + name: 'MachineName', + value: 'DESKTOP-M35N63H', + }, + { + name: 'Log4NetLevel', + value: 'DEBUG', + }, + { + name: 'HttpRequestId', + value: '1b1c9faa-c0be-4722-b3f3-441e48d42c0a', + }, + { + name: 'HttpRequestNumber', + value: '885', + }, + { + name: 'HttpSessionId', + value: '0', + }, + ], + exception: null, + }, + { + timestamp: '2023-02-14T11:58:10.4501237+00:00', + level: 'Debug', + messageTemplate: '{IndexName} searcher refreshed? {DidRefresh}', + renderedMessage: '"InternalIndex" searcher refreshed? False', + properties: [ + { + name: 'IndexName', + value: 'InternalIndex', + }, + { + name: 'DidRefresh', + value: 'False', + }, + { + name: 'SourceContext', + value: 'Examine.Lucene.Providers.LuceneIndex', + }, + { + name: 'ActionId', + value: '1d9a0529-a75a-40cc-be5d-c871548ab233', + }, + { + name: 'ActionName', + value: 'Umbraco.Cms.Web.BackOffice.Controllers.ContentController.EmptyRecycleBin (Umbraco.Web.BackOffice)', + }, + { + name: 'RequestId', + value: '4000002e-0005-ef00-b63f-84710c7967bb', + }, + { + name: 'RequestPath', + value: '/umbraco/backoffice/umbracoapi/content/EmptyRecycleBin', + }, + { + name: 'ProcessId', + value: '17632', + }, + { + name: 'ProcessName', + value: 'iisexpress', + }, + { + name: 'ThreadId', + value: '50', + }, + { + name: 'ApplicationId', + value: '0cf9334a65daa2e8a69943c6db2fb730bb14f2de', + }, + { + name: 'MachineName', + value: 'DESKTOP-M35N63H', + }, + { + name: 'Log4NetLevel', + value: 'DEBUG', + }, + { + name: 'HttpRequestId', + value: 'd8bedb8f-1151-4e2b-858f-286df530ffa2', + }, + { + name: 'HttpRequestNumber', + value: '884', + }, + { + name: 'HttpSessionId', + value: '0', + }, + ], + exception: null, + }, + { + timestamp: '2023-02-14T11:58:10.4036882+00:00', + level: 'Debug', + messageTemplate: '{IndexName} searcher refreshed? {DidRefresh}', + renderedMessage: '"ExternalIndex" searcher refreshed? False', + properties: [ + { + name: 'IndexName', + value: 'ExternalIndex', + }, + { + name: 'DidRefresh', + value: 'False', + }, + { + name: 'SourceContext', + value: 'Examine.Lucene.Providers.LuceneIndex', + }, + { + name: 'ActionId', + value: 'c4a4ecf3-34e7-4ff9-99ad-4aab0a23c3c2', + }, + { + name: 'ActionName', + value: 'Umbraco.Cms.Web.BackOffice.Controllers.ContentController.DeleteById (Umbraco.Web.BackOffice)', + }, + { + name: 'RequestId', + value: '4000005e-0004-fe00-b63f-84710c7967bb', + }, + { + name: 'RequestPath', + value: '/umbraco/backoffice/umbracoapi/content/DeleteById', + }, + { + name: 'ProcessId', + value: '17632', + }, + { + name: 'ProcessName', + value: 'iisexpress', + }, + { + name: 'ThreadId', + value: '57', + }, + { + name: 'ApplicationId', + value: '0cf9334a65daa2e8a69943c6db2fb730bb14f2de', + }, + { + name: 'MachineName', + value: 'DESKTOP-M35N63H', + }, + { + name: 'Log4NetLevel', + value: 'DEBUG', + }, + { + name: 'HttpRequestId', + value: 'cdfde20a-6e4e-4062-be6f-5daff839ed04', + }, + { + name: 'HttpRequestNumber', + value: '883', + }, + { + name: 'HttpSessionId', + value: '0', + }, + ], + exception: null, + }, +]; + +const randomEnumValue = (enumeration: any): LogLevelModel => { + const values = Object.keys(enumeration); + const enumKey = values[Math.floor(Math.random() * values.length)]; + return enumeration[enumKey]; +}; + +export const logs: LogMessageModel[] = allLogs.map((log) => { + return { + ...log, + level: randomEnumValue(LogLevelModel), + }; +}); diff --git a/src/Umbraco.Web.UI.Client/src/core/mocks/domains/log-viewer.handlers.ts b/src/Umbraco.Web.UI.Client/src/core/mocks/domains/log-viewer.handlers.ts index 72c83168b6..a0b6a8877a 100644 --- a/src/Umbraco.Web.UI.Client/src/core/mocks/domains/log-viewer.handlers.ts +++ b/src/Umbraco.Web.UI.Client/src/core/mocks/domains/log-viewer.handlers.ts @@ -1,9 +1,8 @@ import { rest } from 'msw'; import { umbLogviewerData } from '../data/log-viewer.data'; import { umbracoPath } from '@umbraco-cms/utils'; -import { SavedLogSearch } from '@umbraco-cms/backend-api'; +import { SavedLogSearchModel } from '@umbraco-cms/backend-api'; -// TODO: add schema export const handlers = [ //#region Searches rest.get(umbracoPath('/log-viewer/saved-search'), (req, res, ctx) => { @@ -31,7 +30,7 @@ export const handlers = [ return res(ctx.delay(), ctx.status(200), ctx.json(item)); }), - rest.post(umbracoPath('/log-viewer/saved-search'), async (req, res, ctx) => { + rest.post(umbracoPath('/log-viewer/saved-search'), async (req, res, ctx) => { return res(ctx.delay(), ctx.status(200)); }), @@ -57,4 +56,27 @@ export const handlers = [ return res(ctx.delay(), ctx.status(200), ctx.json(response)); }), //#endregion + //#region Logs + rest.get(umbracoPath('/log-viewer/level'), (req, res, ctx) => { + return res(ctx.delay(), ctx.status(200), ctx.json(umbLogviewerData.logLevels)); + }), + + rest.get(umbracoPath('/log-viewer/level-count'), (req, res, ctx) => { + return res(ctx.delay(), ctx.status(200), ctx.json(umbLogviewerData.logs.getLevelCount())); + }), + + rest.get(umbracoPath('/log-viewer/log'), (req, res, ctx) => { + const skip = req.url.searchParams.get('skip'); + const skipNumber = skip ? Number.parseInt(skip) : undefined; + const take = req.url.searchParams.get('take'); + const takeNumber = take ? Number.parseInt(take) : undefined; + + const items = umbLogviewerData.logs.getLogs(skipNumber, takeNumber); + const response = { + total: umbLogviewerData.logs.total, + items, + }; + + return res(ctx.delay(), ctx.status(200), ctx.json(response)); + }), ]; From 467bf31f3ec78a163c5c2cd8d62831891b0fb318 Mon Sep 17 00:00:00 2001 From: Julia Gru <56249914+julczka@users.noreply.github.com> Date: Wed, 22 Feb 2023 10:20:58 +0100 Subject: [PATCH 09/57] add nice filter to the graph --- .../workspace/data/log-search.store.ts | 6 +- ...repository.ts => log-viewer.repository.ts} | 8 +- .../data/sources/log-viewer.server.data.ts | 10 +- .../workspace/donut-chart/donut-chart.ts | 63 ++++++-- .../workspace/donut-chart/donut-slice.ts | 9 ++ .../logviewer-root-workspace.element.ts | 140 +++++++++++++----- .../logviewer-root/logviewer-root.context.ts | 47 +++++- 7 files changed, 223 insertions(+), 60 deletions(-) rename src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/data/{log-search.repository.ts => log-viewer.repository.ts} (93%) diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/data/log-search.store.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/data/log-search.store.ts index 990ec2de4f..62f8d644a5 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/data/log-search.store.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/data/log-search.store.ts @@ -1,8 +1,8 @@ import { UmbContextToken } from '@umbraco-cms/context-api'; import { ArrayState } from '@umbraco-cms/observable-api'; import { UmbStoreBase } from '@umbraco-cms/store'; -import { SavedLogSearch } from '@umbraco-cms/backend-api'; import { UmbControllerHostInterface } from '@umbraco-cms/controller'; +import { SavedLogSearchModel } from '@umbraco-cms/backend-api'; /** * @export @@ -11,7 +11,7 @@ import { UmbControllerHostInterface } from '@umbraco-cms/controller'; * @description - Data Store for log searches */ export class UmbLogSearchesStore extends UmbStoreBase { - #data = new ArrayState([], (x) => x.name); + #data = new ArrayState([], (x) => x.name); /** * Creates an instance of UmbLogSearchesStore. @@ -27,7 +27,7 @@ export class UmbLogSearchesStore extends UmbStoreBase { * @param {SavedLogSearch} search * @memberof UmbLogSearchesStore */ - append(search: SavedLogSearch) { + append(search: SavedLogSearchModel) { this.#data.append([search]); } diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/data/log-search.repository.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/data/log-viewer.repository.ts similarity index 93% rename from src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/data/log-search.repository.ts rename to src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/data/log-viewer.repository.ts index b0caca3426..a64a198c03 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/data/log-search.repository.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/data/log-viewer.repository.ts @@ -8,7 +8,7 @@ import { UmbNotificationService, UMB_NOTIFICATION_SERVICE_CONTEXT_TOKEN } from ' /* We need to create a new instance of the repository from within the element context. We want the notifications to be displayed in the right context. */ // element -> context -> repository -> (store) -> data source // All methods should be async and return a promise. Some methods might return an observable as part of the promise response. -export class UmbLogSearchRepository { +export class UmbLogViewerRepository { #host: UmbControllerHostInterface; #searchDataSource: UmbLogSearchesServerDataSource; #messagesDataSource: UmbLogMessagesServerDataSource; @@ -53,6 +53,12 @@ export class UmbLogSearchRepository { return this.#searchDataSource.getAllSavedSearches({ skip, take }); } + async getMessageTemplates({ skip, take }: { skip: number; take: number }) { + await this.#init(); + + return this.#messagesDataSource.getLogViewerMessageTemplate({ skip, take }); + } + async getLogCount({ startDate, endDate }: { startDate?: string; endDate?: string }) { await this.#init(); diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/data/sources/log-viewer.server.data.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/data/sources/log-viewer.server.data.ts index 62f634cc10..936501858d 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/data/sources/log-viewer.server.data.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/data/sources/log-viewer.server.data.ts @@ -4,7 +4,7 @@ import { UmbControllerHostInterface } from '@umbraco-cms/controller'; import { tryExecuteAndNotify } from '@umbraco-cms/resources'; /** - * A data source for the Template detail that fetches data from the server + * A data source for the log saved searches * @export * @class UmbLogSearchesServerDataSource * @implements {TemplateDetailDataSource} @@ -63,7 +63,13 @@ export class UmbLogSearchesServerDataSource implements LogSearchDataSource { return await tryExecuteAndNotify(this.#host, LogViewerResource.deleteLogViewerSavedSearchByName({ name })); } } - +/** + * A data source for the log messages and levels + * + * @export + * @class UmbLogMessagesServerDataSource + * @implements {LogMessagesDataSource} + */ export class UmbLogMessagesServerDataSource implements LogMessagesDataSource { #host: UmbControllerHostInterface; diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/donut-chart/donut-chart.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/donut-chart/donut-chart.ts index b30f6e2648..808b29a7c2 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/donut-chart/donut-chart.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/donut-chart/donut-chart.ts @@ -6,6 +6,8 @@ import { UmbDonutSliceElement } from './donut-slice'; export interface Circle { percent: number; color: string; + name: string; + tooltipText: string; } interface CircleWithCommands extends Circle { @@ -18,15 +20,18 @@ export class UmbDonutChartElement extends LitElement { static styles = [ UUITextStyles, css` - .slice { - stroke-linecap: round; - stroke-width: 2; - fill: none; - cursor: pointer; + path { + filter: url(#erode); } - .do-shit-on-hover:hover { - fill: pink; + .highlight { + transition: opacity 200ms linear; + filter: url(#filter); + opacity: 0; + } + + .highlight:hover { + opacity: 0.5; } `, ]; @@ -44,7 +49,7 @@ export class UmbDonutChartElement extends LitElement { circles: CircleWithCommands[] = []; @state() - radius = 50; + radius = 45; @state() viewBox = 100; @@ -54,12 +59,15 @@ export class UmbDonutChartElement extends LitElement { @state() svgSize = 100; - #printCircles() { + #printCircles(event: Event) { + event.stopPropagation(); this.circles = this.#addCommands( this.slices.map((slice) => { return { percent: slice.percent, color: slice.color, + name: slice.name, + tooltipText: slice.tooltipText, }; }) ); @@ -104,16 +112,45 @@ export class UmbDonutChartElement extends LitElement { } #renderCircles() { + const highlightFactor = 4; + return svg` - + + + + + + + + + + + + + + + + + In chosen date range you have this number of log message of type: ${this.circles.map( (circle) => svg` - ${circle.color} + ${circle.tooltipText} + + + ${circle.tooltipText} ` )} @@ -122,7 +159,7 @@ export class UmbDonutChartElement extends LitElement { render() { return html`
    ${this.#renderCircles()}
    - `; + `; } } diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/donut-chart/donut-slice.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/donut-chart/donut-slice.ts index 29a3237c4b..5446391c60 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/donut-chart/donut-slice.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/donut-chart/donut-slice.ts @@ -9,13 +9,22 @@ export class UmbDonutSliceElement extends LitElement { @property({ type: Number }) percent = 0; + @property() + tooltipText = ''; + @property() color = 'red'; @property() name = ''; + + willUpdate() { + this.dispatchEvent(new CustomEvent('slice-update', { composed: true, bubbles: true })); + } } + + declare global { interface HTMLElementTagNameMap { 'umb-donut-slice': UmbDonutSliceElement; diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/logviewer-root/logviewer-root-workspace.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/logviewer-root/logviewer-root-workspace.element.ts index dc70a51615..8073486862 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/logviewer-root/logviewer-root-workspace.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/logviewer-root/logviewer-root-workspace.element.ts @@ -1,19 +1,9 @@ import '../donut-chart'; import { css, html } from 'lit'; import { customElement, state } from 'lit/decorators.js'; -import { UmbLogViewerWorkspaceContext } from './logviewer-root.context'; +import { LogLevel, UmbLogViewerWorkspaceContext } from './logviewer-root.context'; import { UmbLitElement } from '@umbraco-cms/element'; -import { SavedLogSearchModel } from '@umbraco-cms/backend-api'; - -const logLevels = { - information: 171, - debug: 39, - warning: 31, - error: 1, - fatal: 0, -}; - -type LogLevel = keyof typeof logLevels; +import { LogLevelModel, PagedLogTemplateModel, SavedLogSearchModel } from '@umbraco-cms/backend-api'; //TODO make uui-input accept min and max values @customElement('umb-logviewer-root-workspace') @@ -28,6 +18,7 @@ export class UmbLogViewerRootWorkspaceElement extends UmbLitElement { --umb-log-viewer-warning-color: var(--uui-color-warning-standalone); --umb-log-viewer-error-color: var(--uui-color-danger-standalone); --umb-log-viewer-fatal-color: var(--uui-color-default-standalone); + --umb-log-viewer-verbose-color: var(--uui-color-current-standalone); } #header { @@ -95,6 +86,8 @@ export class UmbLogViewerRootWorkspaceElement extends UmbLitElement { #common-messages-container { grid-area: common-messages; + --uui-box-default-padding: 0 var(--uui-size-space-5, 18px) var(--uui-size-space-5, 18px) + var(--uui-size-space-5, 18px); } #saved-searches-container > uui-box, @@ -135,6 +128,24 @@ export class UmbLogViewerRootWorkspaceElement extends UmbLitElement { margin-right: 1em; } + uui-table-cell { + padding: 10px 20px; + height: unset; + } + + uui-table-row { + cursor: pointer; + } + + uui-table-row:hover > uui-table-cell { + background-color: var(--uui-color-surface-alt); + } + + uui-label:nth-of-type(2) { + display: block; + margin-top: var(--uui-size-space-5); + } + #chart { width: 150px; aspect-ratio: 1; @@ -150,6 +161,10 @@ export class UmbLogViewerRootWorkspaceElement extends UmbLitElement { display: inline-block; border-radius: 50%; } + + #show-more-templates-btn { + margin-top: var(--uui-size-space-5); + } `, ]; @@ -174,9 +189,21 @@ export class UmbLogViewerRootWorkspaceElement extends UmbLitElement { @state() private _savedSearches: SavedLogSearchModel[] = []; + @state() + private _messageTemplates: PagedLogTemplateModel | null = null; + @state() private _totalLogCount = 0; + @state() + private _logLevelCount: LogLevel | null = null; + + @state() + private _startDate = this.yesterday; + + @state() + private _endDate = this.yesterday; + load(): void { // Not relevant for this workspace -added to prevent the error from popping up console.log('Loading something from somewhere'); @@ -196,13 +223,35 @@ export class UmbLogViewerRootWorkspaceElement extends UmbLitElement { }); await this.#logViewerContext.getSavedSearches(); - this._totalLogCount = Object.values(logLevels).reduce((acc, count) => acc + count, 0); + this.observe(this.#logViewerContext.logCount, (logLevel) => { + this._logLevelCount = logLevel ?? null; + }); + await this.#logViewerContext.getLogCount(this.today, this.yesterday); + + this.observe(this.#logViewerContext.messageTemplates, (templates) => { + this._messageTemplates = templates ?? null; + }); + await this.#logViewerContext.getMessageTemplates(0, 10); + + this._totalLogCount = this._logLevelCount + ? Object.values(this._logLevelCount).reduce((acc, count) => acc + count, 0) + : 0; } - logPercentage(partialValue: number) { + #calculatePercentage(partialValue: number) { if (this._totalLogCount === 0) return 0; + const percent = Math.round((100 * partialValue) / this._totalLogCount); + return percent; + } - return Math.round((100 * partialValue) / this._totalLogCount); + #setDates(event: Event) { + const target = event.target as HTMLInputElement; + if (target.id === 'start-date') { + this._startDate = target.value; + } else if (target.id === 'end-date') { + this._endDate = target.value; + } + console.log('start date: ' + this._startDate); } #renderSearchItem(searchListItem: SavedLogSearchModel) { @@ -223,14 +272,14 @@ export class UmbLogViewerRootWorkspaceElement extends UmbLitElement {
    -
    +
    From: + max="${this.today}" + .value=${this._startDate}> To: + .value=${this._endDate}>
    @@ -251,22 +300,33 @@ export class UmbLogViewerRootWorkspaceElement extends UmbLitElement {
      - ${Object.keys(logLevels).map( - (level) => - html`
    • - ${level} -
    • ` - )} + ${ + this._logLevelCount + ? Object.keys(this._logLevelCount).map( + (level) => + html`
    • + ${level} +
    • ` + ) + : '' + }
    - ${Object.entries(logLevels).map( - ([level, number]) => - html` ` - )} + ${ + this._logLevelCount + ? Object.entries(this._logLevelCount).map( + ([level, number]) => + html` ` + ) + : '' + }
    @@ -280,7 +340,21 @@ export class UmbLogViewerRootWorkspaceElement extends UmbLitElement {
    - ${this._savedSearches.map((search) => html`
    ${search.name}
    `)} +

    Total Unique Message types: ${this._messageTemplates?.total}

    + + ${ + this._messageTemplates + ? this._messageTemplates.items.map( + (template) => + html`${template.messageTemplate} + ${template.count} + ` + ) + : '' + } + + Show more
    diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/logviewer-root/logviewer-root.context.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/logviewer-root/logviewer-root.context.ts index 02a0469944..a964e864fb 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/logviewer-root/logviewer-root.context.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/logviewer-root/logviewer-root.context.ts @@ -1,26 +1,57 @@ +import { UmbLogViewerRepository } from '../data/log-viewer.repository'; import { createObservablePart, DeepState } from '@umbraco-cms/observable-api'; -import { PagedSavedLogSearchModel } from '@umbraco-cms/backend-api'; +import { LogTemplateModel, PagedLogTemplateModel, PagedSavedLogSearchModel } from '@umbraco-cms/backend-api'; import { UmbControllerHostInterface } from '@umbraco-cms/controller'; -import { UmbLogSearchRepository } from '../data/log-search.repository'; + +const logLevels = { + information: 171, + debug: 39, + warning: 31, + error: 1, + fatal: 0, +}; + +export type LogLevel = Record; export class UmbLogViewerWorkspaceContext { #host: UmbControllerHostInterface; - #repository: UmbLogSearchRepository; + #repository: UmbLogViewerRepository; - #data = new DeepState(undefined); - data = this.#data.asObservable(); - savedSearches = createObservablePart(this.#data, (data) => data?.items); + #savedSearches = new DeepState(undefined); + savedSearches = createObservablePart(this.#savedSearches, (data) => data?.items); + + #logCount = new DeepState(null); + logCount = createObservablePart(this.#logCount, (data) => data); + + #messageTemplates = new DeepState(null); + messageTemplates = createObservablePart(this.#messageTemplates, (data) => data); constructor(host: UmbControllerHostInterface) { this.#host = host; - this.#repository = new UmbLogSearchRepository(this.#host); + this.#repository = new UmbLogViewerRepository(this.#host); } async getSavedSearches() { const { data } = await this.#repository.getSavedSearches({ skip: 0, take: 100 }); if (data) { - this.#data.next(data); + this.#savedSearches.next(data); + } + } + + async getLogCount(startDate: string, endDate: string) { + const { data } = await this.#repository.getLogCount({ startDate, endDate }); + + if (data) { + this.#logCount.next(data); + } + } + + async getMessageTemplates(skip: number, take: number) { + const { data } = await this.#repository.getMessageTemplates({ skip, take }); + + if (data) { + this.#messageTemplates.next(data); } } } From 083ecc9ad70e93fd9475105090a65d94a2f35843 Mon Sep 17 00:00:00 2001 From: Julia Gru <56249914+julczka@users.noreply.github.com> Date: Wed, 22 Feb 2023 16:09:57 +0100 Subject: [PATCH 10/57] add filtering to the graph --- .../workspace/donut-chart/donut-chart.ts | 2 +- .../logviewer-root-workspace.element.ts | 83 +++++++++++++++---- 2 files changed, 69 insertions(+), 16 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/donut-chart/donut-chart.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/donut-chart/donut-chart.ts index 808b29a7c2..a2819d08e0 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/donut-chart/donut-chart.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/donut-chart/donut-chart.ts @@ -112,7 +112,7 @@ export class UmbDonutChartElement extends LitElement { } #renderCircles() { - const highlightFactor = 4; + return svg` diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/logviewer-root/logviewer-root-workspace.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/logviewer-root/logviewer-root-workspace.element.ts index 8073486862..2754da5ee3 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/logviewer-root/logviewer-root-workspace.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/logviewer-root/logviewer-root-workspace.element.ts @@ -1,9 +1,10 @@ import '../donut-chart'; -import { css, html } from 'lit'; +import { css, html, PropertyValueMap } from 'lit'; import { customElement, state } from 'lit/decorators.js'; import { LogLevel, UmbLogViewerWorkspaceContext } from './logviewer-root.context'; import { UmbLitElement } from '@umbraco-cms/element'; import { LogLevelModel, PagedLogTemplateModel, SavedLogSearchModel } from '@umbraco-cms/backend-api'; +import { clamp } from 'lodash-es'; //TODO make uui-input accept min and max values @customElement('umb-logviewer-root-workspace') @@ -14,11 +15,11 @@ export class UmbLogViewerRootWorkspaceElement extends UmbLitElement { display: block; --umb-log-viewer-debug-color: var(--uui-color-default-emphasis); - --umb-log-viewer-information-color: var(--uui-color-positive-standalone); - --umb-log-viewer-warning-color: var(--uui-color-warning-standalone); - --umb-log-viewer-error-color: var(--uui-color-danger-standalone); - --umb-log-viewer-fatal-color: var(--uui-color-default-standalone); - --umb-log-viewer-verbose-color: var(--uui-color-current-standalone); + --umb-log-viewer-information-color: var(--uui-color-positive); + --umb-log-viewer-warning-color: var(--uui-color-warning); + --umb-log-viewer-error-color: var(--uui-color-danger); + --umb-log-viewer-fatal-color: var(--uui-color-default); + --umb-log-viewer-verbose-color: var(--uui-color-current); } #header { @@ -146,6 +147,21 @@ export class UmbLogViewerRootWorkspaceElement extends UmbLitElement { margin-top: var(--uui-size-space-5); } + button { + all: unset; + display: flex; + align-items: center; + cursor: pointer; + } + + button:focus { + outline: 1px solid var(--uui-color-focus); + } + + button.active { + text-decoration: line-through; + } + #chart { width: 150px; aspect-ratio: 1; @@ -195,6 +211,12 @@ export class UmbLogViewerRootWorkspaceElement extends UmbLitElement { @state() private _totalLogCount = 0; + @state() + private _logLevelCountFilter: string[] = []; + + @state() + private logLevelCount: [string, number][] = []; + @state() private _logLevelCount: LogLevel | null = null; @@ -204,6 +226,12 @@ export class UmbLogViewerRootWorkspaceElement extends UmbLitElement { @state() private _endDate = this.yesterday; + setLogLevelCount() { + this.logLevelCount = this._logLevelCount + ? Object.entries(this._logLevelCount).filter(([level, number]) => !this._logLevelCountFilter.includes(level)) + : []; + } + load(): void { // Not relevant for this workspace -added to prevent the error from popping up console.log('Loading something from somewhere'); @@ -225,6 +253,7 @@ export class UmbLogViewerRootWorkspaceElement extends UmbLitElement { this.observe(this.#logViewerContext.logCount, (logLevel) => { this._logLevelCount = logLevel ?? null; + this.setLogLevelCount(); }); await this.#logViewerContext.getLogCount(this.today, this.yesterday); @@ -234,14 +263,23 @@ export class UmbLogViewerRootWorkspaceElement extends UmbLitElement { await this.#logViewerContext.getMessageTemplates(0, 10); this._totalLogCount = this._logLevelCount - ? Object.values(this._logLevelCount).reduce((acc, count) => acc + count, 0) + ? this.logLevelCount.flatMap((arr) => arr[1]).reduce((acc, count) => acc + count, 0) : 0; } + protected willUpdate(_changedProperties: PropertyValueMap | Map): void { + if (_changedProperties.has('_logLevelCountFilter')) { + this.setLogLevelCount(); + this._totalLogCount = this._logLevelCount + ? this.logLevelCount.flatMap((arr) => arr[1]).reduce((acc, count) => acc + count, 0) + : 0; + } + } + #calculatePercentage(partialValue: number) { if (this._totalLogCount === 0) return 0; const percent = Math.round((100 * partialValue) / this._totalLogCount); - return percent; + return clamp(percent, 0, 99); } #setDates(event: Event) { @@ -265,6 +303,15 @@ export class UmbLogViewerRootWorkspaceElement extends UmbLitElement {
  • `; } + #setCountFilter(level: string) { + if (this._logLevelCountFilter.includes(level)) { + this._logLevelCountFilter = this._logLevelCountFilter.filter((item) => item !== level); + return; + } + + this._logLevelCountFilter = [...this._logLevelCountFilter, level]; + } + render() { return html` @@ -305,10 +352,16 @@ export class UmbLogViewerRootWorkspaceElement extends UmbLitElement { ? Object.keys(this._logLevelCount).map( (level) => html`
  • - ${level} +
  • ` ) : '' @@ -318,12 +371,12 @@ export class UmbLogViewerRootWorkspaceElement extends UmbLitElement { ${ this._logLevelCount - ? Object.entries(this._logLevelCount).map( + ? this.logLevelCount.map( ([level, number]) => html` ` + .percent=${this.#calculatePercentage(number)} + .color="${`var(--umb-log-viewer-${level.toLowerCase()}-color)`}"> ` ) : '' } From d2bba90aed44f48de1baf89e25d95a1b8947cb21 Mon Sep 17 00:00:00 2001 From: Julia Gru <56249914+julczka@users.noreply.github.com> Date: Thu, 23 Feb 2023 09:05:26 +0100 Subject: [PATCH 11/57] format --- .../workspace/donut-chart/donut-chart.ts | 141 ++++++++++++------ 1 file changed, 98 insertions(+), 43 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/donut-chart/donut-chart.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/donut-chart/donut-chart.ts index a2819d08e0..679c8a4867 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/donut-chart/donut-chart.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/donut-chart/donut-chart.ts @@ -17,6 +17,10 @@ interface CircleWithCommands extends Circle { @customElement('umb-donut-chart') export class UmbDonutChartElement extends LitElement { + static percentToDegrees(percent: number): number { + return percent * 3.6; + } + static styles = [ UUITextStyles, css` @@ -33,6 +37,28 @@ export class UmbDonutChartElement extends LitElement { .highlight:hover { opacity: 0.5; } + + #container { + position: relative; + width: 200px; + } + + #details-box { + background: #f00; + width: 20px; + height: 20px; + top: 0; + left: 0; + position: absolute; + opacity: 0; + transform: translate3d(var(--pos-x), var(--pos-y), 0); + transition: transform 0.2s cubic-bezier(0.02, 1.23, 0.79, 1.08); + transition: opacity 150ms linear; + } + + #details-box.show { + opacity: 1; + } `, ]; @@ -45,6 +71,12 @@ export class UmbDonutChartElement extends LitElement { @query('#circle-container') circleContainer!: HTMLSlotElement; + @query('#container') + container!: HTMLDivElement; + + @query('#details-box') + detailsBox!: HTMLDivElement; + @state() circles: CircleWithCommands[] = []; @@ -59,6 +91,12 @@ export class UmbDonutChartElement extends LitElement { @state() svgSize = 100; + @state() + posY = 0; + + @state() + posX = 0; + #printCircles(event: Event) { event.stopPropagation(); this.circles = this.#addCommands( @@ -107,58 +145,75 @@ export class UmbDonutChartElement extends LitElement { return [coordX, coordY].join(' '); } - static percentToDegrees(percent: number): number { - return percent * 3.6; + #calculateDetailsBoxPosition(event: MouseEvent) { + const rect = this.container.getBoundingClientRect(); + const x = event.clientX - rect.left; + const y = event.clientY - rect.top; + this.posX = x; + this.posY = y - 30; + } + + #showDetailsBox(event: MouseEvent) { + this.detailsBox.classList.add('show'); + } + + #hideDetailsBox(event: MouseEvent) { + this.detailsBox.classList.remove('show'); } #renderCircles() { - - return svg` - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + In chosen date range you have this number of log message of type: - ${this.circles.map( - (circle) => svg` - - ${circle.tooltipText} - - - ${circle.tooltipText} - ` - )} - + ${this.circles.map( + (circle) => svg` + + ${circle.tooltipText} + + + ${circle.tooltipText} + ` + )} + `; } render() { - return html`
    ${this.#renderCircles()}
    + return html`
    + ${this.#renderCircles()} +
    +
    `; } } From f266ea56ba2ddb2b3acbd73952bf5afa5aa98e7e Mon Sep 17 00:00:00 2001 From: Julia Gru <56249914+julczka@users.noreply.github.com> Date: Thu, 23 Feb 2023 09:18:18 +0100 Subject: [PATCH 12/57] cleanup --- .../settings/logviewer/workspace/donut-chart/donut-chart.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/donut-chart/donut-chart.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/donut-chart/donut-chart.ts index 679c8a4867..5bd216e8a8 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/donut-chart/donut-chart.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/donut-chart/donut-chart.ts @@ -89,7 +89,8 @@ export class UmbDonutChartElement extends LitElement { @state() borderSize = 20; - @state() svgSize = 100; + @state() + svgSize = 100; @state() posY = 0; From c72989cb8b8b5128ba3a7aaf64f9e86c8ef194c2 Mon Sep 17 00:00:00 2001 From: Julia Gru <56249914+julczka@users.noreply.github.com> Date: Thu, 23 Feb 2023 11:18:07 +0100 Subject: [PATCH 13/57] add pretty detail box --- .../workspace/donut-chart/donut-chart.ts | 75 +++++++++++++++---- .../workspace/donut-chart/donut-slice.ts | 4 +- .../logviewer-root-workspace.element.ts | 3 +- 3 files changed, 66 insertions(+), 16 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/donut-chart/donut-chart.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/donut-chart/donut-chart.ts index 5bd216e8a8..e8e7d11b3c 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/donut-chart/donut-chart.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/donut-chart/donut-chart.ts @@ -25,6 +25,9 @@ export class UmbDonutChartElement extends LitElement { UUITextStyles, css` path { + pointer-events: visibleFill; + } + .circle { filter: url(#erode); } @@ -44,13 +47,18 @@ export class UmbDonutChartElement extends LitElement { } #details-box { - background: #f00; - width: 20px; - height: 20px; + background: #ffffffe6; + border: 1px solid var(--uui-color-border-standalone); + border-radius: var(--uui-border-radius); + box-sizing: border-box; top: 0; left: 0; position: absolute; opacity: 0; + padding: 0.5em; + line-height: 1.5; + font-size: var(--uui-type-small-size); + box-shadow: var(--uui-shadow-depth-1); transform: translate3d(var(--pos-x), var(--pos-y), 0); transition: transform 0.2s cubic-bezier(0.02, 1.23, 0.79, 1.08); transition: opacity 150ms linear; @@ -59,6 +67,18 @@ export class UmbDonutChartElement extends LitElement { #details-box.show { opacity: 1; } + + #details-box uui-icon { + /* optically correct alignment */ + color: var(--umb-donut-detail-color); + margin-right: 0.2em; + } + + #details-title { + font-weight: bold; + display: flex; + align-items: center; + } `, ]; @@ -98,6 +118,18 @@ export class UmbDonutChartElement extends LitElement { @state() posX = 0; + @state() + detailName = ''; + + @state() + detailAmount = 0; + + @state() + detailPercent = 0; + + @state() + detailColor = 'red'; + #printCircles(event: Event) { event.stopPropagation(); this.circles = this.#addCommands( @@ -150,11 +182,22 @@ export class UmbDonutChartElement extends LitElement { const rect = this.container.getBoundingClientRect(); const x = event.clientX - rect.left; const y = event.clientY - rect.top; - this.posX = x; - this.posY = y - 30; + this.posX = x - 10; + this.posY = y - 70; + } + + #setDetailsBoxData(event: MouseEvent) { + const target = event.target as SVGPathElement; + const index = target.dataset.index as unknown as number; + const circle = this.circles[index]; + this.detailName = circle.name; + this.detailAmount = circle.percent; + this.detailPercent = circle.percent; + this.detailColor = circle.color; } #showDetailsBox(event: MouseEvent) { + this.#setDetailsBoxData(event); this.detailsBox.classList.add('show'); } @@ -164,7 +207,6 @@ export class UmbDonutChartElement extends LitElement { #renderCircles() { return svg` - @@ -187,15 +229,18 @@ export class UmbDonutChartElement extends LitElement { In chosen date range you have this number of log message of type: ${this.circles.map( - (circle) => svg` + (circle, i) => svg` - ${circle.tooltipText} - - ${circle.tooltipText} ` )} - + `; } render() { return html`
    - ${this.#renderCircles()} -
    + ${this.#renderCircles()} +
    +
    ${this.detailName}
    + ${this.detailAmount} messages +
    `; } diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/donut-chart/donut-slice.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/donut-chart/donut-slice.ts index 5446391c60..3c42632bfa 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/donut-chart/donut-slice.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/donut-chart/donut-slice.ts @@ -9,8 +9,8 @@ export class UmbDonutSliceElement extends LitElement { @property({ type: Number }) percent = 0; - @property() - tooltipText = ''; + @property({ type: Number }) + amount = 0; @property() color = 'red'; diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/logviewer-root/logviewer-root-workspace.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/logviewer-root/logviewer-root-workspace.element.ts index 2754da5ee3..05121dd409 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/logviewer-root/logviewer-root-workspace.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/logviewer-root/logviewer-root-workspace.element.ts @@ -374,7 +374,8 @@ export class UmbLogViewerRootWorkspaceElement extends UmbLitElement { ? this.logLevelCount.map( ([level, number]) => html` ` ) From 53bcf531aea02e65a7e07ab57f979edca4aa2695 Mon Sep 17 00:00:00 2001 From: Julia Gru <56249914+julczka@users.noreply.github.com> Date: Thu, 23 Feb 2023 12:28:09 +0100 Subject: [PATCH 14/57] cleanup --- .../logviewer/workspace/donut-chart/donut-chart.ts | 2 +- .../logviewer/workspace/donut-chart/donut-slice.ts | 7 +------ .../logviewer-root/logviewer-root-workspace.element.ts | 8 ++++---- .../workspace/logviewer-root/logviewer-root.context.ts | 2 +- 4 files changed, 7 insertions(+), 12 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/donut-chart/donut-chart.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/donut-chart/donut-chart.ts index e8e7d11b3c..5824c81c33 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/donut-chart/donut-chart.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/donut-chart/donut-chart.ts @@ -201,7 +201,7 @@ export class UmbDonutChartElement extends LitElement { this.detailsBox.classList.add('show'); } - #hideDetailsBox(event: MouseEvent) { + #hideDetailsBox() { this.detailsBox.classList.remove('show'); } diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/donut-chart/donut-slice.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/donut-chart/donut-slice.ts index 3c42632bfa..65ac6b9746 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/donut-chart/donut-slice.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/donut-chart/donut-slice.ts @@ -1,11 +1,8 @@ -import { UUITextStyles } from '@umbraco-ui/uui-css'; -import { css, html, LitElement } from 'lit'; +import { LitElement } from 'lit'; import { customElement, property } from 'lit/decorators.js'; @customElement('umb-donut-slice') export class UmbDonutSliceElement extends LitElement { - static styles = [UUITextStyles, css``]; - @property({ type: Number }) percent = 0; @@ -23,8 +20,6 @@ export class UmbDonutSliceElement extends LitElement { } } - - declare global { interface HTMLElementTagNameMap { 'umb-donut-slice': UmbDonutSliceElement; diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/logviewer-root/logviewer-root-workspace.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/logviewer-root/logviewer-root-workspace.element.ts index 05121dd409..058757a7ba 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/logviewer-root/logviewer-root-workspace.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/logviewer-root/logviewer-root-workspace.element.ts @@ -1,10 +1,10 @@ import '../donut-chart'; +import { clamp } from 'lodash-es'; import { css, html, PropertyValueMap } from 'lit'; import { customElement, state } from 'lit/decorators.js'; import { LogLevel, UmbLogViewerWorkspaceContext } from './logviewer-root.context'; import { UmbLitElement } from '@umbraco-cms/element'; -import { LogLevelModel, PagedLogTemplateModel, SavedLogSearchModel } from '@umbraco-cms/backend-api'; -import { clamp } from 'lodash-es'; +import { PagedLogTemplateModel, SavedLogSearchModel } from '@umbraco-cms/backend-api'; //TODO make uui-input accept min and max values @customElement('umb-logviewer-root-workspace') @@ -228,7 +228,7 @@ export class UmbLogViewerRootWorkspaceElement extends UmbLitElement { setLogLevelCount() { this.logLevelCount = this._logLevelCount - ? Object.entries(this._logLevelCount).filter(([level, number]) => !this._logLevelCountFilter.includes(level)) + ? Object.entries(this._logLevelCount).filter(([level]) => !this._logLevelCountFilter.includes(level)) : []; } @@ -267,7 +267,7 @@ export class UmbLogViewerRootWorkspaceElement extends UmbLitElement { : 0; } - protected willUpdate(_changedProperties: PropertyValueMap | Map): void { + protected willUpdate(_changedProperties: Map): void { if (_changedProperties.has('_logLevelCountFilter')) { this.setLogLevelCount(); this._totalLogCount = this._logLevelCount diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/logviewer-root/logviewer-root.context.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/logviewer-root/logviewer-root.context.ts index a964e864fb..fe4d594385 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/logviewer-root/logviewer-root.context.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/logviewer-root/logviewer-root.context.ts @@ -1,6 +1,6 @@ import { UmbLogViewerRepository } from '../data/log-viewer.repository'; import { createObservablePart, DeepState } from '@umbraco-cms/observable-api'; -import { LogTemplateModel, PagedLogTemplateModel, PagedSavedLogSearchModel } from '@umbraco-cms/backend-api'; +import { PagedLogTemplateModel, PagedSavedLogSearchModel } from '@umbraco-cms/backend-api'; import { UmbControllerHostInterface } from '@umbraco-cms/controller'; const logLevels = { From f41490c471b1555edd8abf7ec7db1e5d66412e3d Mon Sep 17 00:00:00 2001 From: Julia Gru <56249914+julczka@users.noreply.github.com> Date: Thu, 23 Feb 2023 19:31:38 +0100 Subject: [PATCH 15/57] restructure everuthing --- .../logviewer/sidebar-menu-item/manifests.ts | 2 +- .../log-search/log-search.elements.copy.ts | 419 +++++++++++++ .../log-search/log-search.elements.ts | 20 +- .../logviewer-root-workspace.element.ts | 552 ++++++------------ .../workspace/logviewer-root/manifests.ts | 35 +- .../settings/logviewer/workspace/manifests.ts | 1 + 6 files changed, 652 insertions(+), 377 deletions(-) create mode 100644 src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/log-search/log-search.elements.copy.ts diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/sidebar-menu-item/manifests.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/sidebar-menu-item/manifests.ts index 95c4bc26f5..460c5170aa 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/sidebar-menu-item/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/sidebar-menu-item/manifests.ts @@ -8,7 +8,7 @@ const sidebarMenuItem: ManifestSidebarMenuItem = { meta: { label: 'Log Viewer', icon: 'umb:box-alt', - entityType: 'logviewer-root', + entityType: 'logviewer', sidebarMenus: ['Umb.SidebarMenu.Settings'], }, }; diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/log-search/log-search.elements.copy.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/log-search/log-search.elements.copy.ts new file mode 100644 index 0000000000..8393603284 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/log-search/log-search.elements.copy.ts @@ -0,0 +1,419 @@ +import { UUITextStyles } from '@umbraco-ui/uui-css'; +import { css, html } from 'lit'; +import { customElement, state } from 'lit/decorators.js'; +import { UmbLitElement } from '@umbraco-cms/element'; +import { UmbRouterSlotInitEvent } from '@umbraco-cms/router'; +import { SavedLogSearchModel, PagedLogTemplateModel } from '@umbraco-cms/backend-api'; +import { clamp } from 'lodash-es'; +import { LogLevel } from 'vite'; +import { UmbLogViewerWorkspaceContext } from '../logviewer-root/logviewer-root.context'; + +@customElement('umb-log-search-workspace-overview') +export class UmbLogSearchWorkspaceElement extends UmbLitElement { + static styles = [ + css` + :host { + display: block; + + --umb-log-viewer-debug-color: var(--uui-color-default-emphasis); + --umb-log-viewer-information-color: var(--uui-color-positive); + --umb-log-viewer-warning-color: var(--uui-color-warning); + --umb-log-viewer-error-color: var(--uui-color-danger); + --umb-log-viewer-fatal-color: var(--uui-color-default); + --umb-log-viewer-verbose-color: var(--uui-color-current); + } + + #logviewer-layout { + margin: 20px; + } + + #logviewer-layout { + height: calc(100vh - 160px); + display: grid; + grid-template-columns: 7fr 2fr; + grid-template-rows: 1fr 1fr; + gap: 20px 20px; + grid-auto-flow: row; + grid-template-areas: + 'saved-searches info' + 'common-messages info'; + } + + #info { + grid-area: info; + align-self: start; + display: grid; + grid-template-columns: repeat(2, 1fr); + grid-template-rows: repeat(4, 1fr); + gap: 20px 20px; + } + + #time-period { + grid-area: 1 / 1 / 2 / 3; + } + + #date-input-container { + } + + #errors { + grid-area: 2 / 1 / 3 / 2; + } + + #level { + grid-area: 2 / 2 / 3 / 3; + } + + #types { + grid-area: 3 / 1 / 5 / 3; + } + + #log-types-container { + display: flex; + gap: var(--uui-size-space-4); + flex-direction: column-reverse; + align-items: center; + justify-content: space-between; + } + + #saved-searches-container { + grid-area: saved-searches; + } + + #common-messages-container { + grid-area: common-messages; + --uui-box-default-padding: 0 var(--uui-size-space-5, 18px) var(--uui-size-space-5, 18px) + var(--uui-size-space-5, 18px); + } + + #saved-searches-container > uui-box, + #common-messages-container > uui-box { + height: 100%; + } + + input { + font-family: inherit; + padding: var(--uui-size-1) var(--uui-size-space-3); + font-size: inherit; + color: inherit; + border-radius: 0; + box-sizing: border-box; + border: none; + background: none; + width: 100%; + text-align: inherit; + outline: none; + } + + ul { + list-style: none; + margin: 0; + padding: 0; + border: 0; + font-size: 100%; + font: inherit; + vertical-align: baseline; + } + + li { + display: flex; + align-items: center; + } + + li uui-icon { + margin-right: 1em; + } + + uui-table-cell { + padding: 10px 20px; + height: unset; + } + + uui-table-row { + cursor: pointer; + } + + uui-table-row:hover > uui-table-cell { + background-color: var(--uui-color-surface-alt); + } + + uui-label:nth-of-type(2) { + display: block; + margin-top: var(--uui-size-space-5); + } + + button { + all: unset; + display: flex; + align-items: center; + cursor: pointer; + } + + button:focus { + outline: 1px solid var(--uui-color-focus); + } + + button.active { + text-decoration: line-through; + } + + #chart { + width: 150px; + aspect-ratio: 1; + background: radial-gradient(white 40%, transparent 41%), + conic-gradient( + var(--umb-log-viewer-debug-color) 0% 20%, + var(--umb-log-viewer-information-color) 20% 40%, + var(--umb-log-viewer-warning-color) 40% 60%, + var(--umb-log-viewer-error-color) 60% 80%, + var(--umb-log-viewer-fatal-color) 80% 100% + ); + margin: 10px; + display: inline-block; + border-radius: 50%; + } + + #show-more-templates-btn { + margin-top: var(--uui-size-space-5); + } + `, + ]; + + get today() { + const today = new Date(); + const dd = String(today.getDate()).padStart(2, '0'); + const mm = String(today.getMonth() + 1).padStart(2, '0'); //January is 0! + const yyyy = today.getFullYear(); + + return yyyy + '-' + mm + '-' + dd; + } + + get yesterday() { + const today = new Date(); + const dd = String(today.getDate() - 1).padStart(2, '0'); + const mm = String(today.getMonth() + 1).padStart(2, '0'); //January is 0! + const yyyy = today.getFullYear(); + + return yyyy + '-' + mm + '-' + dd; + } + + @state() + private _savedSearches: SavedLogSearchModel[] = []; + + @state() + private _messageTemplates: PagedLogTemplateModel | null = null; + + @state() + private _totalLogCount = 0; + + @state() + private _logLevelCountFilter: string[] = []; + + @state() + private logLevelCount: [string, number][] = []; + + @state() + private _logLevelCount: LogLevel | null = null; + + @state() + private _startDate = this.yesterday; + + @state() + private _endDate = this.yesterday; + + setLogLevelCount() { + this.logLevelCount = this._logLevelCount + ? Object.entries(this._logLevelCount).filter(([level]) => !this._logLevelCountFilter.includes(level)) + : []; + } + + load(): void { + // Not relevant for this workspace -added to prevent the error from popping up + console.log('Loading something from somewhere'); + } + + create(): void { + // Not relevant for this workspace + } + + #logViewerContext = new UmbLogViewerWorkspaceContext(this); + + async connectedCallback() { + super.connectedCallback(); + + this.observe(this.#logViewerContext.savedSearches, (savedSearches) => { + this._savedSearches = savedSearches ?? []; + }); + await this.#logViewerContext.getSavedSearches(); + + this.observe(this.#logViewerContext.logCount, (logLevel) => { + this._logLevelCount = logLevel ?? null; + this.setLogLevelCount(); + }); + await this.#logViewerContext.getLogCount(this.today, this.yesterday); + + this.observe(this.#logViewerContext.messageTemplates, (templates) => { + this._messageTemplates = templates ?? null; + }); + await this.#logViewerContext.getMessageTemplates(0, 10); + + this._totalLogCount = this._logLevelCount + ? this.logLevelCount.flatMap((arr) => arr[1]).reduce((acc, count) => acc + count, 0) + : 0; + } + + protected willUpdate(_changedProperties: Map): void { + if (_changedProperties.has('_logLevelCountFilter')) { + this.setLogLevelCount(); + this._totalLogCount = this._logLevelCount + ? this.logLevelCount.flatMap((arr) => arr[1]).reduce((acc, count) => acc + count, 0) + : 0; + } + } + + #calculatePercentage(partialValue: number) { + if (this._totalLogCount === 0) return 0; + const percent = Math.round((100 * partialValue) / this._totalLogCount); + return clamp(percent, 0, 99); + } + + #setDates(event: Event) { + const target = event.target as HTMLInputElement; + if (target.id === 'start-date') { + this._startDate = target.value; + } else if (target.id === 'end-date') { + this._endDate = target.value; + } + console.log('start date: ' + this._startDate); + } + + #renderSearchItem(searchListItem: SavedLogSearchModel) { + return html`
  • + ${searchListItem.name} +
  • `; + } + + #setCountFilter(level: string) { + if (this._logLevelCountFilter.includes(level)) { + this._logLevelCountFilter = this._logLevelCountFilter.filter((item) => item !== level); + return; + } + + this._logLevelCountFilter = [...this._logLevelCountFilter, level]; + } + + render() { + return html` + +
    +
    + + +
    + From: + + + To: + + +
    +
    + + + + + + +
    +
    +
      + ${ + this._logLevelCount + ? Object.keys(this._logLevelCount).map( + (level) => + html`
    • + +
    • ` + ) + : '' + } +
    +
    + + ${ + this._logLevelCount + ? this.logLevelCount.map( + ([level, number]) => + html` ` + ) + : '' + } + +
    +
    +
    + +
    + +
      ${this._savedSearches.map(this.#renderSearchItem)}
    +
    +
    + +
    + +

    Total Unique Message types: ${this._messageTemplates?.total}

    + + ${ + this._messageTemplates + ? this._messageTemplates.items.map( + (template) => + html`${template.messageTemplate} + ${template.count} + ` + ) + : '' + } + + Show more +
    +
    +
    +`; + } +} + +export default UmbLogSearchWorkspaceElement; + +declare global { + interface HTMLElementTagNameMap { + 'umb-log-search-workspace-overview': UmbLogSearchWorkspaceElement; + } +} diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/log-search/log-search.elements.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/log-search/log-search.elements.ts index 609c9d843b..00597b7ec4 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/log-search/log-search.elements.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/log-search/log-search.elements.ts @@ -2,9 +2,9 @@ import { UUITextStyles } from '@umbraco-ui/uui-css'; import { css, html } from 'lit'; import { customElement } from 'lit/decorators.js'; import { UmbLitElement } from '@umbraco-cms/element'; -import '../../../../shared/components/workspace/actions/save/workspace-action-node-save.element.ts'; +import { UmbRouterSlotInitEvent } from '@umbraco-cms/router'; -@customElement('umb-log-search-workspace') +@customElement('umb-log-search-workspace-search') export class UmbLogSearchWorkspaceElement extends UmbLitElement { static styles = [ UUITextStyles, @@ -15,6 +15,7 @@ export class UmbLogSearchWorkspaceElement extends UmbLitElement { #header { display: flex; + align-items: center; padding: 0 var(--uui-size-space-6); gap: var(--uui-size-space-4); width: 100%; @@ -22,19 +23,10 @@ export class UmbLogSearchWorkspaceElement extends UmbLitElement { `, ]; + private _routerPath?: string; + render() { - return html` - - - - `; + return html`

    Search

    `; } } diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/logviewer-root/logviewer-root-workspace.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/logviewer-root/logviewer-root-workspace.element.ts index 058757a7ba..e34fbb592f 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/logviewer-root/logviewer-root-workspace.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/logviewer-root/logviewer-root-workspace.element.ts @@ -1,25 +1,128 @@ import '../donut-chart'; -import { clamp } from 'lodash-es'; -import { css, html, PropertyValueMap } from 'lit'; -import { customElement, state } from 'lit/decorators.js'; -import { LogLevel, UmbLogViewerWorkspaceContext } from './logviewer-root.context'; +import { map } from 'rxjs'; +import { css, html, nothing, PropertyValueMap } from 'lit'; +import { customElement, state, property } from 'lit/decorators.js'; import { UmbLitElement } from '@umbraco-cms/element'; import { PagedLogTemplateModel, SavedLogSearchModel } from '@umbraco-cms/backend-api'; +import { UUITextStyles } from '@umbraco-ui/uui-css'; +import { umbExtensionsRegistry, createExtensionElement } from '@umbraco-cms/extensions-api'; +import { ManifestWorkspaceView, ManifestWorkspaceViewCollection } from '@umbraco-cms/extensions-registry'; +import { UmbRouterSlotInitEvent, UmbRouterSlotChangeEvent } from '@umbraco-cms/router'; +import { IRoutingInfo } from 'router-slot'; //TODO make uui-input accept min and max values @customElement('umb-logviewer-root-workspace') export class UmbLogViewerRootWorkspaceElement extends UmbLitElement { + // render() { + // return html` + // + //
    + //
    + + // + //
    + // From: + // + // + // To: + // + // + //
    + //
    + + // + + // + + // + //
    + //
    + //
      + // ${ + // this._logLevelCount + // ? Object.keys(this._logLevelCount).map( + // (level) => + // html`
    • + // + //
    • ` + // ) + // : '' + // } + //
    + //
    + // + // ${ + // this._logLevelCount + // ? this.logLevelCount.map( + // ([level, number]) => + // html` ` + // ) + // : '' + // } + // + //
    + //
    + //
    + + //
    + // + //
      ${this._savedSearches.map(this.#renderSearchItem)}
    + //
    + //
    + + //
    + // + //

    Total Unique Message types: ${this._messageTemplates?.total}

    + // + // ${ + // this._messageTemplates + // ? this._messageTemplates.items.map( + // (template) => + // html`${template.messageTemplate} + // ${template.count} + // ` + // ) + // : '' + // } + // + // Show more + //
    + //
    + //
    + //
    `; + // } + static styles = [ + UUITextStyles, css` :host { display: block; - - --umb-log-viewer-debug-color: var(--uui-color-default-emphasis); - --umb-log-viewer-information-color: var(--uui-color-positive); - --umb-log-viewer-warning-color: var(--uui-color-warning); - --umb-log-viewer-error-color: var(--uui-color-danger); - --umb-log-viewer-fatal-color: var(--uui-color-default); - --umb-log-viewer-verbose-color: var(--uui-color-current); + width: 100%; + height: 100%; } #header { @@ -27,209 +130,35 @@ export class UmbLogViewerRootWorkspaceElement extends UmbLitElement { padding: 0 var(--uui-size-space-6); gap: var(--uui-size-space-4); width: 100%; - } - - #logviewer-layout { - margin: 20px; - } - - #logviewer-layout { - height: calc(100vh - 160px); - display: grid; - grid-template-columns: 7fr 2fr; - grid-template-rows: 1fr 1fr; - gap: 20px 20px; - grid-auto-flow: row; - grid-template-areas: - 'saved-searches info' - 'common-messages info'; - } - - #info { - grid-area: info; - align-self: start; - display: grid; - grid-template-columns: repeat(2, 1fr); - grid-template-rows: repeat(4, 1fr); - gap: 20px 20px; - } - - #time-period { - grid-area: 1 / 1 / 2 / 3; - } - - #date-input-container { - } - - #errors { - grid-area: 2 / 1 / 3 / 2; - } - - #level { - grid-area: 2 / 2 / 3 / 3; - } - - #types { - grid-area: 3 / 1 / 5 / 3; - } - - #log-types-container { - display: flex; - gap: var(--uui-size-space-4); - flex-direction: column-reverse; align-items: center; - justify-content: space-between; } - #saved-searches-container { - grid-area: saved-searches; - } - - #common-messages-container { - grid-area: common-messages; - --uui-box-default-padding: 0 var(--uui-size-space-5, 18px) var(--uui-size-space-5, 18px) - var(--uui-size-space-5, 18px); - } - - #saved-searches-container > uui-box, - #common-messages-container > uui-box { + #router-slot { height: 100%; } - - input { - font-family: inherit; - padding: var(--uui-size-1) var(--uui-size-space-3); - font-size: inherit; - color: inherit; - border-radius: 0; - box-sizing: border-box; - border: none; - background: none; - width: 100%; - text-align: inherit; - outline: none; - } - - ul { - list-style: none; - margin: 0; - padding: 0; - border: 0; - font-size: 100%; - font: inherit; - vertical-align: baseline; - } - - li { - display: flex; - align-items: center; - } - - li uui-icon { - margin-right: 1em; - } - - uui-table-cell { - padding: 10px 20px; - height: unset; - } - - uui-table-row { - cursor: pointer; - } - - uui-table-row:hover > uui-table-cell { - background-color: var(--uui-color-surface-alt); - } - - uui-label:nth-of-type(2) { - display: block; - margin-top: var(--uui-size-space-5); - } - - button { - all: unset; - display: flex; - align-items: center; - cursor: pointer; - } - - button:focus { - outline: 1px solid var(--uui-color-focus); - } - - button.active { - text-decoration: line-through; - } - - #chart { - width: 150px; - aspect-ratio: 1; - background: radial-gradient(white 40%, transparent 41%), - conic-gradient( - var(--umb-log-viewer-debug-color) 0% 20%, - var(--umb-log-viewer-information-color) 20% 40%, - var(--umb-log-viewer-warning-color) 40% 60%, - var(--umb-log-viewer-error-color) 60% 80%, - var(--umb-log-viewer-fatal-color) 80% 100% - ); - margin: 10px; - display: inline-block; - border-radius: 50%; - } - - #show-more-templates-btn { - margin-top: var(--uui-size-space-5); - } `, ]; - get today() { - const today = new Date(); - const dd = String(today.getDate()).padStart(2, '0'); - const mm = String(today.getMonth() + 1).padStart(2, '0'); //January is 0! - const yyyy = today.getFullYear(); + @property() + public headline = 'Log Overview for Selected Time Period'; - return yyyy + '-' + mm + '-' + dd; - } - - get yesterday() { - const today = new Date(); - const dd = String(today.getDate() - 1).padStart(2, '0'); - const mm = String(today.getMonth() + 1).padStart(2, '0'); //January is 0! - const yyyy = today.getFullYear(); - - return yyyy + '-' + mm + '-' + dd; - } + private _alias = 'Umb.Workspace.LogviewerRoot'; @state() - private _savedSearches: SavedLogSearchModel[] = []; + private _workspaceViews: Array = []; @state() - private _messageTemplates: PagedLogTemplateModel | null = null; + private _routes: any[] = []; @state() - private _totalLogCount = 0; + private _routerPath?: string; @state() - private _logLevelCountFilter: string[] = []; + private _activePath?: string; - @state() - private logLevelCount: [string, number][] = []; - - @state() - private _logLevelCount: LogLevel | null = null; - - @state() - private _startDate = this.yesterday; - - @state() - private _endDate = this.yesterday; - - setLogLevelCount() { - this.logLevelCount = this._logLevelCount - ? Object.entries(this._logLevelCount).filter(([level]) => !this._logLevelCountFilter.includes(level)) - : []; + connectedCallback() { + super.connectedCallback(); + this._observeWorkspaceViews(); } load(): void { @@ -237,182 +166,87 @@ export class UmbLogViewerRootWorkspaceElement extends UmbLitElement { console.log('Loading something from somewhere'); } + private _observeWorkspaceViews() { + this.observe( + umbExtensionsRegistry + .extensionsOfTypes(['workspaceView']) + .pipe(map((extensions) => extensions.filter((extension) => extension.meta.workspaces.includes(this._alias)))), + (workspaceViews) => { + this._workspaceViews = workspaceViews; + this._createRoutes(); + } + ); + } + create(): void { // Not relevant for this workspace } - #logViewerContext = new UmbLogViewerWorkspaceContext(this); + private _createRoutes() { + this._routes = []; - async connectedCallback() { - super.connectedCallback(); + if (this._workspaceViews.length > 0) { + this._routes = this._workspaceViews.map((view) => { + return { + path: `${view.meta.pathname}`, + component: () => { + return createExtensionElement(view); + }, + setup: (component: Promise | HTMLElement, info: IRoutingInfo) => { + // When its using import, we get an element, when using createExtensionElement we get a Promise. + if ((component as any).then) { + (component as any).then((el: any) => (el.manifest = view)); + } else { + (component as any).manifest = view; + } + }, + }; + }); - this.observe(this.#logViewerContext.savedSearches, (savedSearches) => { - this._savedSearches = savedSearches ?? []; - }); - await this.#logViewerContext.getSavedSearches(); - - this.observe(this.#logViewerContext.logCount, (logLevel) => { - this._logLevelCount = logLevel ?? null; - this.setLogLevelCount(); - }); - await this.#logViewerContext.getLogCount(this.today, this.yesterday); - - this.observe(this.#logViewerContext.messageTemplates, (templates) => { - this._messageTemplates = templates ?? null; - }); - await this.#logViewerContext.getMessageTemplates(0, 10); - - this._totalLogCount = this._logLevelCount - ? this.logLevelCount.flatMap((arr) => arr[1]).reduce((acc, count) => acc + count, 0) - : 0; - } - - protected willUpdate(_changedProperties: Map): void { - if (_changedProperties.has('_logLevelCountFilter')) { - this.setLogLevelCount(); - this._totalLogCount = this._logLevelCount - ? this.logLevelCount.flatMap((arr) => arr[1]).reduce((acc, count) => acc + count, 0) - : 0; + this._routes.push({ + path: '**', + redirectTo: `${this._workspaceViews[0].meta.pathname}`, + }); } } - #calculatePercentage(partialValue: number) { - if (this._totalLogCount === 0) return 0; - const percent = Math.round((100 * partialValue) / this._totalLogCount); - return clamp(percent, 0, 99); - } - - #setDates(event: Event) { - const target = event.target as HTMLInputElement; - if (target.id === 'start-date') { - this._startDate = target.value; - } else if (target.id === 'end-date') { - this._endDate = target.value; - } - console.log('start date: ' + this._startDate); - } - - #renderSearchItem(searchListItem: SavedLogSearchModel) { - return html`
  • - ${searchListItem.name} -
  • `; - } - - #setCountFilter(level: string) { - if (this._logLevelCountFilter.includes(level)) { - this._logLevelCountFilter = this._logLevelCountFilter.filter((item) => item !== level); - return; - } - - this._logLevelCountFilter = [...this._logLevelCountFilter, level]; + #renderRoutes() { + return html` + ${this._routes.length > 0 + ? html` + { + this._routerPath = event.target.absoluteRouterPath; + }} + @change=${(event: UmbRouterSlotChangeEvent) => { + this._activePath = event.target.localActiveViewPath; + }}> + ` + : nothing} + `; } render() { - return html` - -
    -
    - - -
    - From: - - - To: - - -
    -
    - - - - - - -
    -
    -
      - ${ - this._logLevelCount - ? Object.keys(this._logLevelCount).map( - (level) => - html`
    • - -
    • ` - ) - : '' - } -
    -
    - - ${ - this._logLevelCount - ? this.logLevelCount.map( - ([level, number]) => - html` ` - ) - : '' - } - -
    -
    + return html` + + - -
    - -
      ${this._savedSearches.map(this.#renderSearchItem)}
    -
    -
    - -
    - -

    Total Unique Message types: ${this._messageTemplates?.total}

    - - ${ - this._messageTemplates - ? this._messageTemplates.items.map( - (template) => - html`${template.messageTemplate} - ${template.count} - ` - ) - : '' - } - - Show more -
    -
    -
    - `; + ${this.#renderRoutes()} + + + `; } } diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/logviewer-root/manifests.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/logviewer-root/manifests.ts index 1e06c4df7d..bd472bdeb4 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/logviewer-root/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/logviewer-root/manifests.ts @@ -1,16 +1,45 @@ import type { ManifestWorkspace, ManifestWorkspaceAction, ManifestWorkspaceView } from '@umbraco-cms/models'; +const workspaceAlias = 'Umb.Workspace.LogviewerRoot'; + const workspace: ManifestWorkspace = { type: 'workspace', - alias: 'Umb.Workspace.LogviewerRoot', + alias: workspaceAlias, name: 'LogViewer Root Workspace', loader: () => import('./logviewer-root-workspace.element'), meta: { - entityType: 'logviewer-root', + entityType: 'logviewer', }, }; -const workspaceViews: Array = []; +const workspaceViews: Array = [ + { + type: 'workspaceView', + alias: 'Umb.WorkspaceView.Logviewer.Overview', + name: 'LogViewer Root Workspace Overview View', + loader: () => import('../log-search/log-search.elements.copy'), + weight: 300, + meta: { + workspaces: [workspaceAlias], + label: '', + pathname: 'overview', + icon: '', + }, + }, + { + type: 'workspaceView', + alias: 'Umb.WorkspaceView.Logviewer.Search', + name: 'LogViewer Root Workspace Search View', + loader: () => import('../log-search/log-search.elements'), + weight: 200, + meta: { + workspaces: [workspaceAlias], + label: '', + pathname: 'search', + icon: '', + }, + }, +]; const workspaceActions: Array = []; diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/manifests.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/manifests.ts index 4f3d6db1e4..5a8c3cc38d 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/manifests.ts @@ -1,3 +1,4 @@ import { manifests as logviewerRootManifests } from './logviewer-root/manifests'; + export const manifests = [...logviewerRootManifests]; From cfc53151060d06b2ef73b92f352cc69dee82057c Mon Sep 17 00:00:00 2001 From: Julia Gru <56249914+julczka@users.noreply.github.com> Date: Fri, 24 Feb 2023 10:11:17 +0100 Subject: [PATCH 16/57] rename views --- .../logviewer/workspace/logviewer-root/manifests.ts | 4 ++-- .../log-overview.element.ts} | 10 ++++------ .../log-search.element.ts} | 0 3 files changed, 6 insertions(+), 8 deletions(-) rename src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/{log-search/log-search.elements.copy.ts => views/log-overview.element.ts} (97%) rename src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/{log-search/log-search.elements.ts => views/log-search.element.ts} (100%) diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/logviewer-root/manifests.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/logviewer-root/manifests.ts index bd472bdeb4..635b8058a4 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/logviewer-root/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/logviewer-root/manifests.ts @@ -17,7 +17,7 @@ const workspaceViews: Array = [ type: 'workspaceView', alias: 'Umb.WorkspaceView.Logviewer.Overview', name: 'LogViewer Root Workspace Overview View', - loader: () => import('../log-search/log-search.elements.copy'), + loader: () => import('../views/log-overview.element'), weight: 300, meta: { workspaces: [workspaceAlias], @@ -30,7 +30,7 @@ const workspaceViews: Array = [ type: 'workspaceView', alias: 'Umb.WorkspaceView.Logviewer.Search', name: 'LogViewer Root Workspace Search View', - loader: () => import('../log-search/log-search.elements'), + loader: () => import('../views/log-search.element'), weight: 200, meta: { workspaces: [workspaceAlias], diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/log-search/log-search.elements.copy.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/log-overview.element.ts similarity index 97% rename from src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/log-search/log-search.elements.copy.ts rename to src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/log-overview.element.ts index 8393603284..dbd5526b38 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/log-search/log-search.elements.copy.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/log-overview.element.ts @@ -1,12 +1,10 @@ -import { UUITextStyles } from '@umbraco-ui/uui-css'; import { css, html } from 'lit'; import { customElement, state } from 'lit/decorators.js'; -import { UmbLitElement } from '@umbraco-cms/element'; -import { UmbRouterSlotInitEvent } from '@umbraco-cms/router'; -import { SavedLogSearchModel, PagedLogTemplateModel } from '@umbraco-cms/backend-api'; import { clamp } from 'lodash-es'; import { LogLevel } from 'vite'; import { UmbLogViewerWorkspaceContext } from '../logviewer-root/logviewer-root.context'; +import { SavedLogSearchModel, PagedLogTemplateModel } from '@umbraco-cms/backend-api'; +import { UmbLitElement } from '@umbraco-cms/element'; @customElement('umb-log-search-workspace-overview') export class UmbLogSearchWorkspaceElement extends UmbLitElement { @@ -222,7 +220,7 @@ export class UmbLogSearchWorkspaceElement extends UmbLitElement { setLogLevelCount() { this.logLevelCount = this._logLevelCount - ? Object.entries(this._logLevelCount).filter(([level]) => !this._logLevelCountFilter.includes(level)) + ? Object.entries(this._logLevelCount).filter(([level, number]) => !this._logLevelCountFilter.includes(level)) : []; } @@ -291,7 +289,7 @@ export class UmbLogSearchWorkspaceElement extends UmbLitElement { ${searchListItem.name} `; diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/log-search/log-search.elements.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/log-search.element.ts similarity index 100% rename from src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/log-search/log-search.elements.ts rename to src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/log-search.element.ts From 91af512d644ce4bf0ce81223541dd50732667505 Mon Sep 17 00:00:00 2001 From: Julia Gru <56249914+julczka@users.noreply.github.com> Date: Fri, 24 Feb 2023 11:30:45 +0100 Subject: [PATCH 17/57] provide context to child elements --- .../logviewer-root-workspace.element.ts | 15 +++-- .../logviewer-root/logviewer-root.context.ts | 5 ++ .../workspace/views/log-overview.element.ts | 67 ++++++++++++++----- .../workspace/views/log-search.element.ts | 3 - 4 files changed, 65 insertions(+), 25 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/logviewer-root/logviewer-root-workspace.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/logviewer-root/logviewer-root-workspace.element.ts index e34fbb592f..d68ad425ec 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/logviewer-root/logviewer-root-workspace.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/logviewer-root/logviewer-root-workspace.element.ts @@ -1,14 +1,14 @@ import '../donut-chart'; import { map } from 'rxjs'; -import { css, html, nothing, PropertyValueMap } from 'lit'; +import { css, html, nothing } from 'lit'; import { customElement, state, property } from 'lit/decorators.js'; -import { UmbLitElement } from '@umbraco-cms/element'; -import { PagedLogTemplateModel, SavedLogSearchModel } from '@umbraco-cms/backend-api'; +import { IRoutingInfo } from 'router-slot'; import { UUITextStyles } from '@umbraco-ui/uui-css'; +import { UmbLitElement } from '@umbraco-cms/element'; import { umbExtensionsRegistry, createExtensionElement } from '@umbraco-cms/extensions-api'; import { ManifestWorkspaceView, ManifestWorkspaceViewCollection } from '@umbraco-cms/extensions-registry'; import { UmbRouterSlotInitEvent, UmbRouterSlotChangeEvent } from '@umbraco-cms/router'; -import { IRoutingInfo } from 'router-slot'; +import { UmbLogViewerWorkspaceContext, UMB_APP_LOG_VIEWER_CONTEXT_TOKEN } from './logviewer-root.context'; //TODO make uui-input accept min and max values @customElement('umb-logviewer-root-workspace') @@ -151,14 +151,17 @@ export class UmbLogViewerRootWorkspaceElement extends UmbLitElement { private _routes: any[] = []; @state() - private _routerPath?: string; + private _activePath?: string; @state() - private _activePath?: string; + private _routerPath?: string; + + #logViewerContext = new UmbLogViewerWorkspaceContext(this); connectedCallback() { super.connectedCallback(); this._observeWorkspaceViews(); + this.provideContext(UMB_APP_LOG_VIEWER_CONTEXT_TOKEN, this.#logViewerContext); } load(): void { diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/logviewer-root/logviewer-root.context.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/logviewer-root/logviewer-root.context.ts index fe4d594385..38b004ff69 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/logviewer-root/logviewer-root.context.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/logviewer-root/logviewer-root.context.ts @@ -2,6 +2,7 @@ import { UmbLogViewerRepository } from '../data/log-viewer.repository'; import { createObservablePart, DeepState } from '@umbraco-cms/observable-api'; import { PagedLogTemplateModel, PagedSavedLogSearchModel } from '@umbraco-cms/backend-api'; import { UmbControllerHostInterface } from '@umbraco-cms/controller'; +import { UmbContextToken } from '@umbraco-cms/context-api'; const logLevels = { information: 171, @@ -55,3 +56,7 @@ export class UmbLogViewerWorkspaceContext { } } } + +export const UMB_APP_LOG_VIEWER_CONTEXT_TOKEN = new UmbContextToken( + UmbLogViewerWorkspaceContext.name +); diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/log-overview.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/log-overview.element.ts index dbd5526b38..4271c48c97 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/log-overview.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/log-overview.element.ts @@ -1,8 +1,11 @@ import { css, html } from 'lit'; import { customElement, state } from 'lit/decorators.js'; import { clamp } from 'lodash-es'; -import { LogLevel } from 'vite'; -import { UmbLogViewerWorkspaceContext } from '../logviewer-root/logviewer-root.context'; +import { + LogLevel, + UmbLogViewerWorkspaceContext, + UMB_APP_LOG_VIEWER_CONTEXT_TOKEN, +} from '../logviewer-root/logviewer-root.context'; import { SavedLogSearchModel, PagedLogTemplateModel } from '@umbraco-cms/backend-api'; import { UmbLitElement } from '@umbraco-cms/element'; @@ -173,6 +176,14 @@ export class UmbLogSearchWorkspaceElement extends UmbLitElement { #show-more-templates-btn { margin-top: var(--uui-size-space-5); } + + a { + display: flex; + align-items: center; + justify-content: space-between; + text-decoration: none; + color: inherit; + } `, ]; @@ -216,12 +227,17 @@ export class UmbLogSearchWorkspaceElement extends UmbLitElement { private _startDate = this.yesterday; @state() - private _endDate = this.yesterday; + private _endDate = this.today; + + #logViewerContext?: UmbLogViewerWorkspaceContext; setLogLevelCount() { this.logLevelCount = this._logLevelCount ? Object.entries(this._logLevelCount).filter(([level, number]) => !this._logLevelCountFilter.includes(level)) : []; + this._totalLogCount = this._logLevelCount + ? this.logLevelCount.flatMap((arr) => arr[1]).reduce((acc, count) => acc + count, 0) + : 0; } load(): void { @@ -233,30 +249,44 @@ export class UmbLogSearchWorkspaceElement extends UmbLitElement { // Not relevant for this workspace } - #logViewerContext = new UmbLogViewerWorkspaceContext(this); - - async connectedCallback() { - super.connectedCallback(); + constructor() { + super(); + this.consumeContext(UMB_APP_LOG_VIEWER_CONTEXT_TOKEN, (instance) => { + this.#logViewerContext = instance; + this.#observeStuff(); + this.getData(); + }); + } + #observeStuff() { + if (!this.#logViewerContext) return; this.observe(this.#logViewerContext.savedSearches, (savedSearches) => { this._savedSearches = savedSearches ?? []; }); - await this.#logViewerContext.getSavedSearches(); this.observe(this.#logViewerContext.logCount, (logLevel) => { this._logLevelCount = logLevel ?? null; + this.setLogLevelCount(); }); - await this.#logViewerContext.getLogCount(this.today, this.yesterday); this.observe(this.#logViewerContext.messageTemplates, (templates) => { this._messageTemplates = templates ?? null; }); - await this.#logViewerContext.getMessageTemplates(0, 10); + } - this._totalLogCount = this._logLevelCount - ? this.logLevelCount.flatMap((arr) => arr[1]).reduce((acc, count) => acc + count, 0) - : 0; + async getData() { + if (!this.#logViewerContext) return; + + try { + await Promise.all([ + this.#logViewerContext.getSavedSearches(), + this.#logViewerContext.getLogCount(this.today, this.yesterday), + this.#logViewerContext.getMessageTemplates(0, 10), + ]); + } catch (e) { + console.error(e); + } } protected willUpdate(_changedProperties: Map): void { @@ -289,7 +319,7 @@ export class UmbLogSearchWorkspaceElement extends UmbLitElement { ${searchListItem.name} `; @@ -393,8 +423,13 @@ export class UmbLogSearchWorkspaceElement extends UmbLitElement { ? this._messageTemplates.items.map( (template) => html`${template.messageTemplate} - ${template.count} + > + + ${template.messageTemplate} ${template.count} + + ` ) : '' diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/log-search.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/log-search.element.ts index 00597b7ec4..cb17d6c9da 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/log-search.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/log-search.element.ts @@ -2,7 +2,6 @@ import { UUITextStyles } from '@umbraco-ui/uui-css'; import { css, html } from 'lit'; import { customElement } from 'lit/decorators.js'; import { UmbLitElement } from '@umbraco-cms/element'; -import { UmbRouterSlotInitEvent } from '@umbraco-cms/router'; @customElement('umb-log-search-workspace-search') export class UmbLogSearchWorkspaceElement extends UmbLitElement { @@ -23,8 +22,6 @@ export class UmbLogSearchWorkspaceElement extends UmbLitElement { `, ]; - private _routerPath?: string; - render() { return html`

    Search

    `; } From b86b6a1a7cc026e9ff8b57c2b5900af06807d13d Mon Sep 17 00:00:00 2001 From: Julia Gru <56249914+julczka@users.noreply.github.com> Date: Sat, 25 Feb 2023 10:16:57 +0100 Subject: [PATCH 18/57] extend clickable area of native date input --- .../workspace/data/log-viewer.repository.ts | 24 ------ .../logviewer-root/logviewer-root.context.ts | 11 +-- .../workspace/views/log-overview.element.ts | 76 +++++++++++++------ 3 files changed, 57 insertions(+), 54 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/data/log-viewer.repository.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/data/log-viewer.repository.ts index a64a198c03..c208be19d9 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/data/log-viewer.repository.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/data/log-viewer.repository.ts @@ -65,28 +65,4 @@ export class UmbLogViewerRepository { return this.#messagesDataSource.getLogViewerLevelCount({ startDate, endDate }); } - // async insert(template: Template) { - // await this.#init(); - - // // TODO: should we show a notification if the template is missing? - // // Investigate what is best for Acceptance testing, cause in that perspective a thrown error might be the best choice? - // if (!template) { - // const error: ProblemDetails = { title: 'Template is missing' }; - // return { error }; - // } - - // const { error } = await this.#dataSource.insert(template); - - // if (!error) { - // const notification = { data: { message: `Template created` } }; - // this.#notificationService?.peek('positive', notification); - // } - - // // TODO: we currently don't use the detail store for anything. - // // Consider to look up the data before fetching from the server - // this.#searchStore?.append(template); - // // TODO: Update tree store with the new item? - - // return { error }; - // } } diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/logviewer-root/logviewer-root.context.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/logviewer-root/logviewer-root.context.ts index 38b004ff69..548a08542e 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/logviewer-root/logviewer-root.context.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/logviewer-root/logviewer-root.context.ts @@ -5,11 +5,11 @@ import { UmbControllerHostInterface } from '@umbraco-cms/controller'; import { UmbContextToken } from '@umbraco-cms/context-api'; const logLevels = { - information: 171, - debug: 39, - warning: 31, - error: 1, - fatal: 0, + Information: 171, + Debug: 39, + Warning: 31, + Error: 1, + Fatal: 0, }; export type LogLevel = Record; @@ -48,6 +48,7 @@ export class UmbLogViewerWorkspaceContext { } } + async getMessageTemplates(skip: number, take: number) { const { data } = await this.#repository.getMessageTemplates({ skip, take }); diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/log-overview.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/log-overview.element.ts index 4271c48c97..f08eb50078 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/log-overview.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/log-overview.element.ts @@ -53,9 +53,6 @@ export class UmbLogSearchWorkspaceElement extends UmbLitElement { grid-area: 1 / 1 / 2 / 3; } - #date-input-container { - } - #errors { grid-area: 2 / 1 / 3 / 2; } @@ -64,6 +61,11 @@ export class UmbLogSearchWorkspaceElement extends UmbLitElement { grid-area: 2 / 2 / 3 / 3; } + #log-lever { + color: var(--uui-color-positive); + text-align: center; + } + #types { grid-area: 3 / 1 / 5 / 3; } @@ -184,6 +186,12 @@ export class UmbLogSearchWorkspaceElement extends UmbLitElement { text-decoration: none; color: inherit; } + + #error-count { + font-size: 4rem; + text-align: center; + color: var(--uui-color-danger); + } `, ]; @@ -214,6 +222,9 @@ export class UmbLogSearchWorkspaceElement extends UmbLitElement { @state() private _totalLogCount = 0; + @state() + private _errorCount = 0; + @state() private _logLevelCountFilter: string[] = []; @@ -266,7 +277,7 @@ export class UmbLogSearchWorkspaceElement extends UmbLitElement { this.observe(this.#logViewerContext.logCount, (logLevel) => { this._logLevelCount = logLevel ?? null; - + this._errorCount = this._logLevelCount?.Error ?? 0; this.setLogLevelCount(); }); @@ -298,6 +309,11 @@ export class UmbLogSearchWorkspaceElement extends UmbLitElement { } } + async #getMessageTemplates() { + const take = this._messageTemplates?.items?.length ?? 0; + await this.#logViewerContext?.getMessageTemplates(0, take + 10); + } + #calculatePercentage(partialValue: number) { if (this._totalLogCount === 0) return 0; const percent = Math.round((100 * partialValue) / this._totalLogCount); @@ -344,6 +360,7 @@ export class UmbLogSearchWorkspaceElement extends UmbLitElement {
    From: {(e.target as HTMLInputElement).showPicker()}} id="start-date" type="date" label="From" @@ -352,6 +369,8 @@ export class UmbLogSearchWorkspaceElement extends UmbLitElement { To: {(e.target as HTMLInputElement).showPicker()}} + id="end-date" type="date" label="To" @@ -361,9 +380,14 @@ export class UmbLogSearchWorkspaceElement extends UmbLitElement {
    - + +

    ${this._errorCount ? this._errorCount : ''}

    +
    - + +

    Info

    + +
    @@ -417,25 +441,27 @@ export class UmbLogSearchWorkspaceElement extends UmbLitElement {

    Total Unique Message types: ${this._messageTemplates?.total}

    - - ${ - this._messageTemplates - ? this._messageTemplates.items.map( - (template) => - html` - - ${template.messageTemplate} ${template.count} - - - ` - ) - : '' - } - - Show more + + + ${ + this._messageTemplates + ? this._messageTemplates.items.map( + (template) => + html` + + ${template.messageTemplate} ${template.count} + + + ` + ) + : '' + } + + + Show more
    From 7a71af1b273f788f527fd3c37004891a77670e5b Mon Sep 17 00:00:00 2001 From: Julia Gru <56249914+julczka@users.noreply.github.com> Date: Sat, 25 Feb 2023 10:19:46 +0100 Subject: [PATCH 19/57] remove console logs --- .../settings/logviewer/workspace/views/log-overview.element.ts | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/log-overview.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/log-overview.element.ts index f08eb50078..a9a7aa98f0 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/log-overview.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/log-overview.element.ts @@ -253,7 +253,6 @@ export class UmbLogSearchWorkspaceElement extends UmbLitElement { load(): void { // Not relevant for this workspace -added to prevent the error from popping up - console.log('Loading something from somewhere'); } create(): void { @@ -327,7 +326,6 @@ export class UmbLogSearchWorkspaceElement extends UmbLitElement { } else if (target.id === 'end-date') { this._endDate = target.value; } - console.log('start date: ' + this._startDate); } #renderSearchItem(searchListItem: SavedLogSearchModel) { From 63530989216497b917f207b7f1b82a2dd559e9fe Mon Sep 17 00:00:00 2001 From: Julia Gru <56249914+julczka@users.noreply.github.com> Date: Sat, 25 Feb 2023 10:25:23 +0100 Subject: [PATCH 20/57] move files around --- .../logviewer-root-workspace.element.ts | 10 ++++----- ...r-root.context.ts => logviewer.context.ts} | 3 +-- .../workspace/views/log-overview.element.ts | 22 +++++++++---------- .../workspace/views/log-search.element.ts | 18 +++++++++++---- 4 files changed, 31 insertions(+), 22 deletions(-) rename src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/{logviewer-root/logviewer-root.context.ts => logviewer.context.ts} (96%) diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/logviewer-root/logviewer-root-workspace.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/logviewer-root/logviewer-root-workspace.element.ts index d68ad425ec..6e08da82d8 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/logviewer-root/logviewer-root-workspace.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/logviewer-root/logviewer-root-workspace.element.ts @@ -8,11 +8,11 @@ import { UmbLitElement } from '@umbraco-cms/element'; import { umbExtensionsRegistry, createExtensionElement } from '@umbraco-cms/extensions-api'; import { ManifestWorkspaceView, ManifestWorkspaceViewCollection } from '@umbraco-cms/extensions-registry'; import { UmbRouterSlotInitEvent, UmbRouterSlotChangeEvent } from '@umbraco-cms/router'; -import { UmbLogViewerWorkspaceContext, UMB_APP_LOG_VIEWER_CONTEXT_TOKEN } from './logviewer-root.context'; +import { UmbLogViewerWorkspaceContext, UMB_APP_LOG_VIEWER_CONTEXT_TOKEN } from '../logviewer.context'; //TODO make uui-input accept min and max values -@customElement('umb-logviewer-root-workspace') -export class UmbLogViewerRootWorkspaceElement extends UmbLitElement { +@customElement('umb-logviewer-workspace') +export class UmbLogViewerWorkspaceElement extends UmbLitElement { // render() { // return html` // @@ -253,10 +253,10 @@ export class UmbLogViewerRootWorkspaceElement extends UmbLitElement { } } -export default UmbLogViewerRootWorkspaceElement; +export default UmbLogViewerWorkspaceElement; declare global { interface HTMLElementTagNameMap { - 'umb-logviewer-root-workspace': UmbLogViewerRootWorkspaceElement; + 'umb-logviewer-workspace': UmbLogViewerWorkspaceElement; } } diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/logviewer-root/logviewer-root.context.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/logviewer.context.ts similarity index 96% rename from src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/logviewer-root/logviewer-root.context.ts rename to src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/logviewer.context.ts index 548a08542e..3cf66f8d8f 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/logviewer-root/logviewer-root.context.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/logviewer.context.ts @@ -1,4 +1,4 @@ -import { UmbLogViewerRepository } from '../data/log-viewer.repository'; +import { UmbLogViewerRepository } from './data/log-viewer.repository'; import { createObservablePart, DeepState } from '@umbraco-cms/observable-api'; import { PagedLogTemplateModel, PagedSavedLogSearchModel } from '@umbraco-cms/backend-api'; import { UmbControllerHostInterface } from '@umbraco-cms/controller'; @@ -48,7 +48,6 @@ export class UmbLogViewerWorkspaceContext { } } - async getMessageTemplates(skip: number, take: number) { const { data } = await this.#repository.getMessageTemplates({ skip, take }); diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/log-overview.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/log-overview.element.ts index a9a7aa98f0..156470c250 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/log-overview.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/log-overview.element.ts @@ -1,16 +1,12 @@ import { css, html } from 'lit'; import { customElement, state } from 'lit/decorators.js'; import { clamp } from 'lodash-es'; -import { - LogLevel, - UmbLogViewerWorkspaceContext, - UMB_APP_LOG_VIEWER_CONTEXT_TOKEN, -} from '../logviewer-root/logviewer-root.context'; +import { LogLevel, UmbLogViewerWorkspaceContext, UMB_APP_LOG_VIEWER_CONTEXT_TOKEN } from '../logviewer.context'; import { SavedLogSearchModel, PagedLogTemplateModel } from '@umbraco-cms/backend-api'; import { UmbLitElement } from '@umbraco-cms/element'; -@customElement('umb-log-search-workspace-overview') -export class UmbLogSearchWorkspaceElement extends UmbLitElement { +@customElement('umb-log-viewer-overview-view') +export class UmbLogViewerOverviewViewElement extends UmbLitElement { static styles = [ css` :host { @@ -358,7 +354,9 @@ export class UmbLogSearchWorkspaceElement extends UmbLitElement {
    From: {(e.target as HTMLInputElement).showPicker()}} + @click=${(e: Event) => { + (e.target as HTMLInputElement).showPicker(); + }} id="start-date" type="date" label="From" @@ -367,7 +365,9 @@ export class UmbLogSearchWorkspaceElement extends UmbLitElement { To: {(e.target as HTMLInputElement).showPicker()}} + @click=${(e: Event) => { + (e.target as HTMLInputElement).showPicker(); + }} id="end-date" type="date" @@ -467,10 +467,10 @@ export class UmbLogSearchWorkspaceElement extends UmbLitElement { } } -export default UmbLogSearchWorkspaceElement; +export default UmbLogViewerOverviewViewElement; declare global { interface HTMLElementTagNameMap { - 'umb-log-search-workspace-overview': UmbLogSearchWorkspaceElement; + 'umb-log-viewer-overview-view': UmbLogViewerOverviewViewElement; } } diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/log-search.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/log-search.element.ts index cb17d6c9da..7a25cc63ed 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/log-search.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/log-search.element.ts @@ -1,10 +1,11 @@ import { UUITextStyles } from '@umbraco-ui/uui-css'; import { css, html } from 'lit'; import { customElement } from 'lit/decorators.js'; +import { UmbLogViewerWorkspaceContext, UMB_APP_LOG_VIEWER_CONTEXT_TOKEN } from '../logviewer.context'; import { UmbLitElement } from '@umbraco-cms/element'; -@customElement('umb-log-search-workspace-search') -export class UmbLogSearchWorkspaceElement extends UmbLitElement { +@customElement('umb-log-viewer-search-view') +export class UmbLogViewerSearchViewElement extends UmbLitElement { static styles = [ UUITextStyles, css` @@ -22,15 +23,24 @@ export class UmbLogSearchWorkspaceElement extends UmbLitElement { `, ]; + #logViewerContext?: UmbLogViewerWorkspaceContext; + + constructor() { + super(); + this.consumeContext(UMB_APP_LOG_VIEWER_CONTEXT_TOKEN, (instance) => { + this.#logViewerContext = instance; + }); + } + render() { return html`

    Search

    `; } } -export default UmbLogSearchWorkspaceElement; +export default UmbLogViewerSearchViewElement; declare global { interface HTMLElementTagNameMap { - 'umb-log-search-workspace': UmbLogSearchWorkspaceElement; + 'umb-log-viewer-search-view': UmbLogViewerSearchViewElement; } } From db2f4da54a95760e4a5bfe47f306cf07efefb93a Mon Sep 17 00:00:00 2001 From: Julia Gru <56249914+julczka@users.noreply.github.com> Date: Sat, 25 Feb 2023 10:43:59 +0100 Subject: [PATCH 21/57] add ui-elemnts --- .../workspace/views/log-overview.element.ts | 3 -- .../workspace/views/log-search.element.ts | 49 ++++++++++++++++--- 2 files changed, 43 insertions(+), 9 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/log-overview.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/log-overview.element.ts index 156470c250..3698fd41ae 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/log-overview.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/log-overview.element.ts @@ -22,9 +22,6 @@ export class UmbLogViewerOverviewViewElement extends UmbLitElement { #logviewer-layout { margin: 20px; - } - - #logviewer-layout { height: calc(100vh - 160px); display: grid; grid-template-columns: 7fr 2fr; diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/log-search.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/log-search.element.ts index 7a25cc63ed..2caaed8776 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/log-search.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/log-search.element.ts @@ -9,16 +9,32 @@ export class UmbLogViewerSearchViewElement extends UmbLitElement { static styles = [ UUITextStyles, css` - :host { - display: block; + #layout { + margin: 20px; } - - #header { + #levels-container, + #input-container { display: flex; align-items: center; - padding: 0 var(--uui-size-space-6); gap: var(--uui-size-space-4); width: 100%; + margin-bottom: 20px; + } + + #levels-container { + justify-content: space-between; + } + + #input-container { + justify-content: space-between; + } + + #search-input { + flex: 1; + } + + #saved-searches-button { + flex-shrink: 0; } `, ]; @@ -33,7 +49,28 @@ export class UmbLogViewerSearchViewElement extends UmbLitElement { } render() { - return html`

    Search

    `; + return html` +
    +
    + Log level: All + + Polling + + +
    +
    + + Saved searches + + Search +
    + +

    Total items: 234

    +
    +
    + `; } } From b6faf65b13cb94ba08654c7d00380863ee30f0ea Mon Sep 17 00:00:00 2001 From: Julia Gru <56249914+julczka@users.noreply.github.com> Date: Sat, 25 Feb 2023 16:45:30 +0100 Subject: [PATCH 22/57] add saved searches --- .../logviewer-root-workspace.element.ts | 1 + .../logviewer/workspace/logviewer.context.ts | 51 ++++++- .../workspace/views/log-overview.element.ts | 53 ++----- .../workspace/views/log-search.element.ts | 136 ++++++++++++++++-- 4 files changed, 185 insertions(+), 56 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/logviewer-root/logviewer-root-workspace.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/logviewer-root/logviewer-root-workspace.element.ts index 6e08da82d8..6437abf570 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/logviewer-root/logviewer-root-workspace.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/logviewer-root/logviewer-root-workspace.element.ts @@ -161,6 +161,7 @@ export class UmbLogViewerWorkspaceElement extends UmbLitElement { connectedCallback() { super.connectedCallback(); this._observeWorkspaceViews(); + this.#logViewerContext.init(); this.provideContext(UMB_APP_LOG_VIEWER_CONTEXT_TOKEN, this.#logViewerContext); } diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/logviewer.context.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/logviewer.context.ts index 3cf66f8d8f..fed7459a60 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/logviewer.context.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/logviewer.context.ts @@ -14,16 +14,47 @@ const logLevels = { export type LogLevel = Record; +export interface LogViewerDateRange { + startDate: string; + endDate: string; +} + export class UmbLogViewerWorkspaceContext { #host: UmbControllerHostInterface; #repository: UmbLogViewerRepository; + get today() { + const today = new Date(); + const dd = String(today.getDate()).padStart(2, '0'); + const mm = String(today.getMonth() + 1).padStart(2, '0'); //January is 0! + const yyyy = today.getFullYear(); + + return yyyy + '-' + mm + '-' + dd; + } + + get yesterday() { + const today = new Date(); + const dd = String(today.getDate() - 1).padStart(2, '0'); + const mm = String(today.getMonth() + 1).padStart(2, '0'); //January is 0! + const yyyy = today.getFullYear(); + + return yyyy + '-' + mm + '-' + dd; + } + + defaultDateRange: LogViewerDateRange = { + startDate: this.yesterday, + endDate: this.today, + }; + #savedSearches = new DeepState(undefined); savedSearches = createObservablePart(this.#savedSearches, (data) => data?.items); #logCount = new DeepState(null); logCount = createObservablePart(this.#logCount, (data) => data); + #dateRange = new DeepState(this.defaultDateRange); + dateRange = createObservablePart(this.#dateRange, (data) => data); + #messageTemplates = new DeepState(null); messageTemplates = createObservablePart(this.#messageTemplates, (data) => data); @@ -32,15 +63,31 @@ export class UmbLogViewerWorkspaceContext { this.#repository = new UmbLogViewerRepository(this.#host); } + async init() { + try { + await Promise.all([ + this.getMessageTemplates(0, 100), + this.getLogCount(this.defaultDateRange), + this.getSavedSearches(), + ]); + } catch (error) { + console.error(error); + } + } + + setDateRange(dateRange: LogViewerDateRange) { + this.#dateRange.next(dateRange); + this.getLogCount(dateRange); + } + async getSavedSearches() { const { data } = await this.#repository.getSavedSearches({ skip: 0, take: 100 }); - if (data) { this.#savedSearches.next(data); } } - async getLogCount(startDate: string, endDate: string) { + async getLogCount({ startDate, endDate }: LogViewerDateRange) { const { data } = await this.#repository.getLogCount({ startDate, endDate }); if (data) { diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/log-overview.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/log-overview.element.ts index 3698fd41ae..8af48a23e8 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/log-overview.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/log-overview.element.ts @@ -1,7 +1,7 @@ import { css, html } from 'lit'; import { customElement, state } from 'lit/decorators.js'; import { clamp } from 'lodash-es'; -import { LogLevel, UmbLogViewerWorkspaceContext, UMB_APP_LOG_VIEWER_CONTEXT_TOKEN } from '../logviewer.context'; +import { LogLevel, LogViewerDateRange, UmbLogViewerWorkspaceContext, UMB_APP_LOG_VIEWER_CONTEXT_TOKEN } from '../logviewer.context'; import { SavedLogSearchModel, PagedLogTemplateModel } from '@umbraco-cms/backend-api'; import { UmbLitElement } from '@umbraco-cms/element'; @@ -188,24 +188,6 @@ export class UmbLogViewerOverviewViewElement extends UmbLitElement { `, ]; - get today() { - const today = new Date(); - const dd = String(today.getDate()).padStart(2, '0'); - const mm = String(today.getMonth() + 1).padStart(2, '0'); //January is 0! - const yyyy = today.getFullYear(); - - return yyyy + '-' + mm + '-' + dd; - } - - get yesterday() { - const today = new Date(); - const dd = String(today.getDate() - 1).padStart(2, '0'); - const mm = String(today.getMonth() + 1).padStart(2, '0'); //January is 0! - const yyyy = today.getFullYear(); - - return yyyy + '-' + mm + '-' + dd; - } - @state() private _savedSearches: SavedLogSearchModel[] = []; @@ -228,10 +210,10 @@ export class UmbLogViewerOverviewViewElement extends UmbLitElement { private _logLevelCount: LogLevel | null = null; @state() - private _startDate = this.yesterday; + private _startDate = ''; @state() - private _endDate = this.today; + private _endDate = ''; #logViewerContext?: UmbLogViewerWorkspaceContext; @@ -244,20 +226,12 @@ export class UmbLogViewerOverviewViewElement extends UmbLitElement { : 0; } - load(): void { - // Not relevant for this workspace -added to prevent the error from popping up - } - - create(): void { - // Not relevant for this workspace - } - constructor() { super(); this.consumeContext(UMB_APP_LOG_VIEWER_CONTEXT_TOKEN, (instance) => { this.#logViewerContext = instance; this.#observeStuff(); - this.getData(); + }); } @@ -276,20 +250,11 @@ export class UmbLogViewerOverviewViewElement extends UmbLitElement { this.observe(this.#logViewerContext.messageTemplates, (templates) => { this._messageTemplates = templates ?? null; }); - } - async getData() { - if (!this.#logViewerContext) return; - - try { - await Promise.all([ - this.#logViewerContext.getSavedSearches(), - this.#logViewerContext.getLogCount(this.today, this.yesterday), - this.#logViewerContext.getMessageTemplates(0, 10), - ]); - } catch (e) { - console.error(e); - } + this.observe(this.#logViewerContext.dateRange, (dateRange: LogViewerDateRange) => { + this._startDate = dateRange?.startDate; + this._endDate = dateRange?.endDate; + }) } protected willUpdate(_changedProperties: Map): void { @@ -319,6 +284,8 @@ export class UmbLogViewerOverviewViewElement extends UmbLitElement { } else if (target.id === 'end-date') { this._endDate = target.value; } + const newDateRange: LogViewerDateRange = { startDate: this._startDate, endDate: this._endDate }; + this.#logViewerContext?.setDateRange(newDateRange); } #renderSearchItem(searchListItem: SavedLogSearchModel) { diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/log-search.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/log-search.element.ts index 2caaed8776..851362a63a 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/log-search.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/log-search.element.ts @@ -1,8 +1,14 @@ import { UUITextStyles } from '@umbraco-ui/uui-css'; import { css, html } from 'lit'; -import { customElement } from 'lit/decorators.js'; -import { UmbLogViewerWorkspaceContext, UMB_APP_LOG_VIEWER_CONTEXT_TOKEN } from '../logviewer.context'; +import { customElement, state, query } from 'lit/decorators.js'; +import { + LogViewerDateRange, + UmbLogViewerWorkspaceContext, + UMB_APP_LOG_VIEWER_CONTEXT_TOKEN, +} from '../logviewer.context'; import { UmbLitElement } from '@umbraco-cms/element'; +import { SavedLogSearchModel } from '@umbraco-cms/backend-api'; +import { UUIInputElement, UUIPopoverElement, UUISymbolExpandElement } from '@umbraco-ui/uui'; @customElement('umb-log-viewer-search-view') export class UmbLogViewerSearchViewElement extends UmbLitElement { @@ -30,24 +36,139 @@ export class UmbLogViewerSearchViewElement extends UmbLitElement { } #search-input { - flex: 1; + width: 100%; } #saved-searches-button { flex-shrink: 0; } + + #saved-searches-popover { + flex: 1; + } + + #saved-searches-container { + width: 100%; + max-height: 300px; + background-color: var(--uui-color-surface); + box-shadow: var(--uui-shadow-depth-1); + } + + .saved-search-item { + display: flex; + justify-content: space-between; + } + + .saved-search-item-button { + flex: 1; + } + + .saved-search-item-name { + font-weight: 600; + } `, ]; + @query('#saved-searches-popover') + private _savedSearchesPopover!: UUIPopoverElement; + + @query('#saved-search-expand-symbol') + private _savedSearchesExpandSymbol!: UUISymbolExpandElement; + + @state() + private _savedSearches: SavedLogSearchModel[] = []; + + @state() + private _startDate = ''; + + @state() + private _endDate = ''; + + @state() + private _inputQuery = ''; + #logViewerContext?: UmbLogViewerWorkspaceContext; constructor() { super(); this.consumeContext(UMB_APP_LOG_VIEWER_CONTEXT_TOKEN, (instance) => { this.#logViewerContext = instance; + this.#observeStuff(); }); } + #observeStuff() { + if (!this.#logViewerContext) return; + this.observe(this.#logViewerContext.savedSearches, (savedSearches) => { + this._savedSearches = savedSearches ?? []; + }); + + this.observe(this.#logViewerContext.dateRange, (dateRange: LogViewerDateRange) => { + this._startDate = dateRange?.startDate; + this._endDate = dateRange?.endDate; + }); + } + + #toggleSavedSearchesPopover() { + this._savedSearchesPopover.open = !this._savedSearchesPopover.open; + } + + #toggleSavedSearchesExpandSymbol() { + this._savedSearchesExpandSymbol.open = !this._savedSearchesExpandSymbol.open; + } + + #openPopover() { + this.#toggleSavedSearchesPopover(); + this.#toggleSavedSearchesExpandSymbol(); + } + + #setQuery(event: Event) { + const target = event.target as UUIInputElement; + this._inputQuery = target.value as string; + } + + #clearQuery() { + this._inputQuery = ''; + } + + #renderSearchInput() { + return html` + + ${this._inputQuery + ? html`` + : html``} + Saved searches + + + + ${this._savedSearches.map( + (search) => + html`
    + ${search.name}${search.query} +
    ` + )} +
    +
    + Search`; + } + render() { return html`
    @@ -58,14 +179,7 @@ export class UmbLogViewerSearchViewElement extends UmbLitElement {
    -
    - - Saved searches - - Search -
    +
    ${this.#renderSearchInput()}

    Total items: 234

    From e12079e81de26f9666031334bcad4c5cf58835f2 Mon Sep 17 00:00:00 2001 From: Julia Gru <56249914+julczka@users.noreply.github.com> Date: Sat, 25 Feb 2023 17:10:29 +0100 Subject: [PATCH 23/57] style saved search element --- src/Umbraco.Web.UI.Client/package-lock.json | 4 +- .../workspace/views/log-search.element.ts | 38 +++++++++++++++---- 2 files changed, 33 insertions(+), 9 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/package-lock.json b/src/Umbraco.Web.UI.Client/package-lock.json index eea87149ae..646bbd3b30 100644 --- a/src/Umbraco.Web.UI.Client/package-lock.json +++ b/src/Umbraco.Web.UI.Client/package-lock.json @@ -76,8 +76,8 @@ "web-component-analyzer": "^2.0.0-next.4" }, "engines": { - "node": ">=18.14.2 <19", - "npm": ">=9.5.0 < 10" + "node": ">=18.14 <19", + "npm": ">=9.5 < 10" } }, "node_modules/@ampproject/remapping": { diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/log-search.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/log-search.element.ts index 851362a63a..244ab0ba40 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/log-search.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/log-search.element.ts @@ -57,14 +57,36 @@ export class UmbLogViewerSearchViewElement extends UmbLitElement { .saved-search-item { display: flex; justify-content: space-between; + align-items: stretch; + border-bottom: 1px solid #e9e9eb; } .saved-search-item-button { + display: flex; + font-family: inherit; flex: 1; + background: 0 0; + padding: 0 0; + border: 0; + clear: both; + cursor: pointer; + display: flex; + font-weight: 400; + line-height: 20px; + text-align: left; + align-items: center; + white-space: nowrap; + color: var(--uui-color-interactive); + } + + .saved-search-item-button:hover { + background-color: var(--uui-color-surface-emphasis, rgb(250, 250, 250)); + color: var(--color-standalone); } .saved-search-item-name { font-weight: 600; + margin: 0 var(--uui-size-space-3); } `, ]; @@ -154,15 +176,17 @@ export class UmbLogViewerSearchViewElement extends UmbLitElement { > - + ${this._savedSearches.map( (search) => - html`
    - ${search.name}${search.query} -
    ` + html`
  • + +
  • ` )}
    From 041a2bc3228a60202a8a23452630a8d0e812d34a Mon Sep 17 00:00:00 2001 From: Julia Gru <56249914+julczka@users.noreply.github.com> Date: Mon, 27 Feb 2023 14:22:09 +0100 Subject: [PATCH 24/57] get logs --- .../workspace/data/log-viewer.repository.ts | 30 +++++++++++++ .../logviewer/workspace/data/sources/index.ts | 2 +- .../data/sources/log-viewer.server.data.ts | 2 +- .../logviewer/workspace/logviewer.context.ts | 42 +++++++++++++++++-- .../workspace/views/log-overview.element.ts | 35 ++++++++++++---- .../workspace/views/log-search.element.ts | 20 ++++++++- 6 files changed, 117 insertions(+), 14 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/data/log-viewer.repository.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/data/log-viewer.repository.ts index c208be19d9..136deba17e 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/data/log-viewer.repository.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/data/log-viewer.repository.ts @@ -3,6 +3,7 @@ import { UmbLogSearchesStore, UMB_LOG_SEARCHES_STORE_CONTEXT_TOKEN } from './log import { UmbContextConsumerController } from '@umbraco-cms/context-api'; import { UmbControllerHostInterface } from '@umbraco-cms/controller'; import { UmbNotificationService, UMB_NOTIFICATION_SERVICE_CONTEXT_TOKEN } from '@umbraco-cms/notification'; +import { DirectionModel, LogLevelModel } from '@umbraco-cms/backend-api'; // Move to documentation / JSdoc /* We need to create a new instance of the repository from within the element context. We want the notifications to be displayed in the right context. */ @@ -65,4 +66,33 @@ export class UmbLogViewerRepository { return this.#messagesDataSource.getLogViewerLevelCount({ startDate, endDate }); } + async getLogs({ + skip = 0, + take = 100, + orderDirection, + filterExpression, + logLevel, + startDate, + endDate, + }: { + skip?: number; + take?: number; + orderDirection?: DirectionModel; + filterExpression?: string; + logLevel?: Array; + startDate?: string; + endDate?: string; + }) { + await this.#init(); + + return this.#messagesDataSource.getLogViewerLogs({ + skip, + take, + orderDirection, + filterExpression, + logLevel, + startDate, + endDate, + }); + } } diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/data/sources/index.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/data/sources/index.ts index 9693dcb0d9..e01b65b3a9 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/data/sources/index.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/data/sources/index.ts @@ -43,7 +43,7 @@ export interface LogMessagesDataSource { startDate?: string; endDate?: string; }): Promise>; - getLogViewerLog({ + getLogViewerLogs({ skip, take = 100, orderDirection, diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/data/sources/log-viewer.server.data.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/data/sources/log-viewer.server.data.ts index 936501858d..733c20bcfb 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/data/sources/log-viewer.server.data.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/data/sources/log-viewer.server.data.ts @@ -132,7 +132,7 @@ export class UmbLogMessagesServerDataSource implements LogMessagesDataSource { * @return {*} * @memberof UmbLogMessagesServerDataSource */ - async getLogViewerLog({ + async getLogViewerLogs({ skip = 0, take = 100, orderDirection, diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/logviewer.context.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/logviewer.context.ts index fed7459a60..178c00d510 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/logviewer.context.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/logviewer.context.ts @@ -1,6 +1,14 @@ import { UmbLogViewerRepository } from './data/log-viewer.repository'; -import { createObservablePart, DeepState } from '@umbraco-cms/observable-api'; -import { PagedLogTemplateModel, PagedSavedLogSearchModel } from '@umbraco-cms/backend-api'; +import { ArrayState, createObservablePart, DeepState, StringState } from '@umbraco-cms/observable-api'; +import { + DirectionModel, + LoggerModel, + LogLevelModel, + PagedLoggerModel, + PagedLogMessageModel, + PagedLogTemplateModel, + PagedSavedLogSearchModel, +} from '@umbraco-cms/backend-api'; import { UmbControllerHostInterface } from '@umbraco-cms/controller'; import { UmbContextToken } from '@umbraco-cms/context-api'; @@ -55,9 +63,18 @@ export class UmbLogViewerWorkspaceContext { #dateRange = new DeepState(this.defaultDateRange); dateRange = createObservablePart(this.#dateRange, (data) => data); + #currentQuery = new StringState(''); + currentQuery = createObservablePart(this.#currentQuery, (data) => data); + #messageTemplates = new DeepState(null); messageTemplates = createObservablePart(this.#messageTemplates, (data) => data); + #logLevel = new ArrayState([]); + logLevel = createObservablePart(this.#logLevel, (data) => data); + + #logs = new DeepState(null); + logs = createObservablePart(this.#logs, (data) => data?.items); + constructor(host: UmbControllerHostInterface) { this.#host = host; this.#repository = new UmbLogViewerRepository(this.#host); @@ -66,7 +83,7 @@ export class UmbLogViewerWorkspaceContext { async init() { try { await Promise.all([ - this.getMessageTemplates(0, 100), + this.getMessageTemplates(0, 10), this.getLogCount(this.defaultDateRange), this.getSavedSearches(), ]); @@ -102,6 +119,25 @@ export class UmbLogViewerWorkspaceContext { this.#messageTemplates.next(data); } } + + async getLogs() { + const options = { + orderDirection: DirectionModel.ASCENDING, + filterExpression: this.#currentQuery.getValue(), + logLevel: this.#logLevel.getValue(), + ...this.#dateRange.getValue(), + }; + + const { data } = await this.#repository.getLogs(options); + + if (data) { + this.#logs.next(data); + } + } + + setCurrentQuery(query: string) { + this.#currentQuery.next(query); + } } export const UMB_APP_LOG_VIEWER_CONTEXT_TOKEN = new UmbContextToken( diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/log-overview.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/log-overview.element.ts index 8af48a23e8..fe824ccacf 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/log-overview.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/log-overview.element.ts @@ -231,7 +231,6 @@ export class UmbLogViewerOverviewViewElement extends UmbLitElement { this.consumeContext(UMB_APP_LOG_VIEWER_CONTEXT_TOKEN, (instance) => { this.#logViewerContext = instance; this.#observeStuff(); - }); } @@ -254,7 +253,7 @@ export class UmbLogViewerOverviewViewElement extends UmbLitElement { this.observe(this.#logViewerContext.dateRange, (dateRange: LogViewerDateRange) => { this._startDate = dateRange?.startDate; this._endDate = dateRange?.endDate; - }) + }); } protected willUpdate(_changedProperties: Map): void { @@ -288,16 +287,19 @@ export class UmbLogViewerOverviewViewElement extends UmbLitElement { this.#logViewerContext?.setDateRange(newDateRange); } - #renderSearchItem(searchListItem: SavedLogSearchModel) { + renderSearchItem = (searchListItem: SavedLogSearchModel) => { return html`
  • { + this.setCurrentQuery(searchListItem.query ?? ''); + }} label="${searchListItem.name}" title="${searchListItem.name}" href=${'/section/settings/logviewer/search?lq=' + searchListItem.query} >${searchListItem.name}
  • `; - } + }; #setCountFilter(level: string) { if (this._logLevelCountFilter.includes(level)) { @@ -308,6 +310,10 @@ export class UmbLogViewerOverviewViewElement extends UmbLitElement { this._logLevelCountFilter = [...this._logLevelCountFilter, level]; } + setCurrentQuery(query: string) { + this.#logViewerContext?.setCurrentQuery(query); + } + render() { return html` @@ -324,7 +330,7 @@ export class UmbLogViewerOverviewViewElement extends UmbLitElement { id="start-date" type="date" label="From" - max="${this.today}" + .max=${this.#logViewerContext?.today ?? ''} .value=${this._startDate}> To: @@ -336,7 +342,7 @@ export class UmbLogViewerOverviewViewElement extends UmbLitElement { id="end-date" type="date" label="To" - max="${this.today}" + .max=${this.#logViewerContext?.today ?? ''} .value=${this._endDate}>
    @@ -396,7 +402,19 @@ export class UmbLogViewerOverviewViewElement extends UmbLitElement {
    -
      ${this._savedSearches.map(this.#renderSearchItem)}
    +
      +
    • + { + this.setCurrentQuery(''); + }} + label="All logs" + title="All logs" + href="/section/settings/logviewer/search" + >All logs +
    • + ${this._savedSearches.map(this.renderSearchItem)}
    @@ -412,6 +430,9 @@ export class UmbLogViewerOverviewViewElement extends UmbLitElement { html` { + this.setCurrentQuery(`@MessageTemplate='${template.messageTemplate}'` ?? ''); + }} href=${'/section/settings/logviewer/search?lg=@MessageTemplate%3D' + template.messageTemplate}> ${template.messageTemplate} ${template.count} diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/log-search.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/log-search.element.ts index 244ab0ba40..e31d742a95 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/log-search.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/log-search.element.ts @@ -7,7 +7,7 @@ import { UMB_APP_LOG_VIEWER_CONTEXT_TOKEN, } from '../logviewer.context'; import { UmbLitElement } from '@umbraco-cms/element'; -import { SavedLogSearchModel } from '@umbraco-cms/backend-api'; +import { LogMessageModel, SavedLogSearchModel } from '@umbraco-cms/backend-api'; import { UUIInputElement, UUIPopoverElement, UUISymbolExpandElement } from '@umbraco-ui/uui'; @customElement('umb-log-viewer-search-view') @@ -88,6 +88,10 @@ export class UmbLogViewerSearchViewElement extends UmbLitElement { font-weight: 600; margin: 0 var(--uui-size-space-3); } + + uui-symbol-expand:not(#polling-symbol-expand) { + margin-left: var(--uui-size-space-3); + } `, ]; @@ -109,6 +113,9 @@ export class UmbLogViewerSearchViewElement extends UmbLitElement { @state() private _inputQuery = ''; + @state() + private _logs: LogMessageModel[] = []; + #logViewerContext?: UmbLogViewerWorkspaceContext; constructor() { @@ -116,6 +123,7 @@ export class UmbLogViewerSearchViewElement extends UmbLitElement { this.consumeContext(UMB_APP_LOG_VIEWER_CONTEXT_TOKEN, (instance) => { this.#logViewerContext = instance; this.#observeStuff(); + this.#logViewerContext.getLogs(); }); } @@ -129,6 +137,14 @@ export class UmbLogViewerSearchViewElement extends UmbLitElement { this._startDate = dateRange?.startDate; this._endDate = dateRange?.endDate; }); + + this.observe(this.#logViewerContext.currentQuery, (query) => { + this._inputQuery = query; + }); + + this.observe(this.#logViewerContext.logs, (logs) => { + this._logs = logs ?? []; + }); } #toggleSavedSearchesPopover() { @@ -200,7 +216,7 @@ export class UmbLogViewerSearchViewElement extends UmbLitElement { Log level: All Polling - +
    ${this.#renderSearchInput()}
    From a589c0f6744ef7d3da905e01e8e6288c10204dcc Mon Sep 17 00:00:00 2001 From: Julia Gru <56249914+julczka@users.noreply.github.com> Date: Mon, 27 Feb 2023 15:48:23 +0100 Subject: [PATCH 25/57] create message component --- .../logviewer-root-workspace.element.ts | 1 + .../workspace/views/components/index.ts | 1 + .../views/components/log-viewer-message.ts | 84 +++++++++++++++++++ .../workspace/views/log-search.element.ts | 9 ++ 4 files changed, 95 insertions(+) create mode 100644 src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/components/index.ts create mode 100644 src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/components/log-viewer-message.ts diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/logviewer-root/logviewer-root-workspace.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/logviewer-root/logviewer-root-workspace.element.ts index 6437abf570..a842f980c7 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/logviewer-root/logviewer-root-workspace.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/logviewer-root/logviewer-root-workspace.element.ts @@ -1,4 +1,5 @@ import '../donut-chart'; +import '../views/components'; import { map } from 'rxjs'; import { css, html, nothing } from 'lit'; import { customElement, state, property } from 'lit/decorators.js'; diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/components/index.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/components/index.ts new file mode 100644 index 0000000000..19e82179af --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/components/index.ts @@ -0,0 +1 @@ +export * from './log-viewer-message'; diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/components/log-viewer-message.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/components/log-viewer-message.ts new file mode 100644 index 0000000000..61872245cd --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/components/log-viewer-message.ts @@ -0,0 +1,84 @@ +import { LogLevelModel, LogMessagePropertyModel } from '@umbraco-cms/backend-api'; +import { UUITextStyles } from '@umbraco-ui/uui-css'; +import { css, html, LitElement } from 'lit'; +import { customElement, property, state } from 'lit/decorators.js'; + +@customElement('umb-log-viewer-message') +export class UmbLogViewerMessageElement extends LitElement { + static styles = [ + UUITextStyles, + css` + summary { + display: flex; + } + + summary > div { + padding: 10px 20px; + display: flex; + align-items: center; + } + + #timestamp { + flex: 2; + } + + #level, + #machine { + flex: 1; + } + + #message { + flex: 4; + } + `, + ]; + + @property() + timestamp = ''; + + @state() + date?: Date; + + @property() + level: LogLevelModel | '' = ''; + + @property() + messageTemplate = ''; + + @property() + renderedMessage = ''; + + @property({ attribute: false }) + properties: Array = []; + + @property() + exception = ''; + + willUpdate(changedProperties: Map) { + if (changedProperties.has('timestamp')) { + this.date = new Date(this.timestamp); + } + } + + render() { + return html` +
    + +
    ${this.date?.toLocaleString()}
    +
    ${this.level}
    +
    ${this.properties.find((property) => property.name === 'MachineName')?.value}
    +
    ${this.renderedMessage}
    +
    +
      + ${this.properties.map((property) => html`
    • ${property.name}: ${property.value}
    • `)} +
    +
    + `; + } +} + +declare global { + interface HTMLElementTagNameMap { + 'umb-log-viewer-message': UmbLogViewerMessageElement; + } +} diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/log-search.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/log-search.element.ts index e31d742a95..d5d5e22cd1 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/log-search.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/log-search.element.ts @@ -222,6 +222,15 @@ export class UmbLogViewerSearchViewElement extends UmbLitElement {
    ${this.#renderSearchInput()}

    Total items: 234

    + ${this._logs.map( + (log) => html`` + )}
    `; From 15c6b3053d3f913684d220c0837339f3ea508de9 Mon Sep 17 00:00:00 2001 From: Julia Gru <56249914+julczka@users.noreply.github.com> Date: Tue, 28 Feb 2023 14:00:11 +0100 Subject: [PATCH 26/57] create button with dropdown compoennt and log level tag --- .../logviewer-root-workspace.element.ts | 110 +----------- .../workspace/views/components/index.ts | 3 +- .../log-viewer-level-tag.element.ts | 47 +++++ .../components/log-viewer-message.element.ts | 165 ++++++++++++++++++ .../views/components/log-viewer-message.ts | 84 --------- .../workspace/views/log-overview.element.ts | 6 - .../workspace/views/log-search.element.ts | 36 +++- .../button-with-dropdown.element.ts | 81 +++++++++ .../button-with-dropdown.stories.ts | 17 ++ .../src/backoffice/shared/components/index.ts | 1 + 10 files changed, 354 insertions(+), 196 deletions(-) create mode 100644 src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/components/log-viewer-level-tag.element.ts create mode 100644 src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/components/log-viewer-message.element.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/components/log-viewer-message.ts create mode 100644 src/Umbraco.Web.UI.Client/src/backoffice/shared/components/button-with-dropdown/button-with-dropdown.element.ts create mode 100644 src/Umbraco.Web.UI.Client/src/backoffice/shared/components/button-with-dropdown/button-with-dropdown.stories.ts diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/logviewer-root/logviewer-root-workspace.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/logviewer-root/logviewer-root-workspace.element.ts index a842f980c7..017d04f418 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/logviewer-root/logviewer-root-workspace.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/logviewer-root/logviewer-root-workspace.element.ts @@ -14,109 +14,6 @@ import { UmbLogViewerWorkspaceContext, UMB_APP_LOG_VIEWER_CONTEXT_TOKEN } from ' //TODO make uui-input accept min and max values @customElement('umb-logviewer-workspace') export class UmbLogViewerWorkspaceElement extends UmbLitElement { - // render() { - // return html` - // - //
    - //
    - - // - //
    - // From: - // - // - // To: - // - // - //
    - //
    - - // - - // - - // - //
    - //
    - //
      - // ${ - // this._logLevelCount - // ? Object.keys(this._logLevelCount).map( - // (level) => - // html`
    • - // - //
    • ` - // ) - // : '' - // } - //
    - //
    - // - // ${ - // this._logLevelCount - // ? this.logLevelCount.map( - // ([level, number]) => - // html` ` - // ) - // : '' - // } - // - //
    - //
    - //
    - - //
    - // - //
      ${this._savedSearches.map(this.#renderSearchItem)}
    - //
    - //
    - - //
    - // - //

    Total Unique Message types: ${this._messageTemplates?.total}

    - // - // ${ - // this._messageTemplates - // ? this._messageTemplates.items.map( - // (template) => - // html`${template.messageTemplate} - // ${template.count} - // ` - // ) - // : '' - // } - // - // Show more - //
    - //
    - //
    - //
    `; - // } - static styles = [ UUITextStyles, css` @@ -124,6 +21,13 @@ export class UmbLogViewerWorkspaceElement extends UmbLitElement { display: block; width: 100%; height: 100%; + + --umb-log-viewer-debug-color: var(--uui-color-default-emphasis); + --umb-log-viewer-information-color: var(--uui-color-positive); + --umb-log-viewer-warning-color: var(--uui-color-warning); + --umb-log-viewer-error-color: var(--uui-color-danger); + --umb-log-viewer-fatal-color: var(--uui-color-default); + --umb-log-viewer-verbose-color: var(--uui-color-current); } #header { diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/components/index.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/components/index.ts index 19e82179af..e73f51de1f 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/components/index.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/components/index.ts @@ -1 +1,2 @@ -export * from './log-viewer-message'; +export * from './log-viewer-level-tag.element'; +export * from './log-viewer-message.element'; diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/components/log-viewer-level-tag.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/components/log-viewer-level-tag.element.ts new file mode 100644 index 0000000000..e3ea2980aa --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/components/log-viewer-level-tag.element.ts @@ -0,0 +1,47 @@ +import { UUITextStyles } from '@umbraco-ui/uui-css'; +import { css, html, LitElement } from 'lit'; +import { customElement, property } from 'lit/decorators.js'; +import { LogLevelModel } from '@umbraco-cms/backend-api'; +import { ifDefined } from 'lit-html/directives/if-defined.js'; +import { InterfaceColor, InterfaceLook } from '@umbraco-ui/uui-base/lib/types'; + +interface LevelMapStyles { + look?: InterfaceLook; + color?: InterfaceColor; + style?: string; +} + +@customElement('umb-log-viewer-level-tag') +export class UmbLogViewerLevelTagElement extends LitElement { + static styles = [UUITextStyles, css``]; + + @property() + level?: LogLevelModel; + + levelMap: Record = { + Verbose: { look: 'secondary' }, + Debug: { + look: 'default', + style: 'background-color: var(--umb-log-viewer-debug-color); color: var(--uui-color-surface)', + }, + Information: { look: 'primary', color: 'positive' }, + Warning: { look: 'primary', color: 'warning' }, + Error: { look: 'primary', color: 'danger' }, + Fatal: { look: 'primary' }, + }; + + render() { + return html`${this.level}`; + } +} + +declare global { + interface HTMLElementTagNameMap { + 'umb-log-viewer-level-tag': UmbLogViewerLevelTagElement; + } +} diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/components/log-viewer-message.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/components/log-viewer-message.element.ts new file mode 100644 index 0000000000..86e289c2fb --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/components/log-viewer-message.element.ts @@ -0,0 +1,165 @@ +import { LogLevelModel, LogMessagePropertyModel } from '@umbraco-cms/backend-api'; +import { UUITextStyles } from '@umbraco-ui/uui-css'; +import { css, html, LitElement } from 'lit'; +import { customElement, property, state } from 'lit/decorators.js'; + +@customElement('umb-log-viewer-message') +export class UmbLogViewerMessageElement extends LitElement { + static styles = [ + UUITextStyles, + css` + :host > details { + border-top: 1px solid var(--uui-color-border); + } + + :host(:last-child) > details { + border-bottom: 1px solid var(--uui-color-border); + } + + summary { + display: flex; + } + + summary:hover, + ul { + background-color: var(--uui-color-background); + } + + ul { + margin: 0; + padding: 0; + list-style: none; + } + + li { + padding: 10px 20px; + display: flex; + border-top: 1px solid var(--uui-color-border); + } + + summary > div { + box-sizing: border-box; + padding: 10px 20px; + display: flex; + align-items: center; + } + + #timestamp { + flex: 1 0 14ch; + } + + #level, + #machine { + flex: 1 0 14ch; + } + + #message { + flex: 6 0 14ch; + } + + .property-name { + font-weight: 600; + flex: 1 1 20ch; + } + + .property-value { + flex: 3 0 20ch; + } + + #search-menu { + margin: 0; + padding: 0; + margin-top: var(--uui-size-space-3); + background-color: var(--uui-color-surface); + box-shadow: var(--uui-shadow-depth-2); + max-width: 20%; + } + + #search-menu > li { + padding: 0; + } + + .search-item { + width: 100%; + } + `, + ]; + + @property() + timestamp = ''; + + @state() + date?: Date; + + @property() + level: LogLevelModel | '' = ''; + + @property() + messageTemplate = ''; + + @property() + renderedMessage = ''; + + @property({ attribute: false }) + properties: Array = []; + + @property() + exception = ''; + + willUpdate(changedProperties: Map) { + if (changedProperties.has('timestamp')) { + this.date = new Date(this.timestamp); + } + } + + render() { + return html` +
    + +
    ${this.date?.toLocaleString()}
    +
    + +
    +
    ${this.properties.find((property) => property.name === 'MachineName')?.value}
    +
    ${this.renderedMessage}
    +
    +
      +
    • +
      Timestamp
      +
      ${this.date?.toLocaleString()}
      +
    • +
    • +
      @MessageTemplate
      +
      ${this.messageTemplate}
      +
    • + ${this.properties.map( + (property) => + html`
    • +
      ${property.name}:
      +
      ${property.value}
      +
    • ` + )} +
    + + Search +
      +
    • + Google +
    • +
    +
    +
    + `; + } +} + +declare global { + interface HTMLElementTagNameMap { + 'umb-log-viewer-message': UmbLogViewerMessageElement; + } +} diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/components/log-viewer-message.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/components/log-viewer-message.ts deleted file mode 100644 index 61872245cd..0000000000 --- a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/components/log-viewer-message.ts +++ /dev/null @@ -1,84 +0,0 @@ -import { LogLevelModel, LogMessagePropertyModel } from '@umbraco-cms/backend-api'; -import { UUITextStyles } from '@umbraco-ui/uui-css'; -import { css, html, LitElement } from 'lit'; -import { customElement, property, state } from 'lit/decorators.js'; - -@customElement('umb-log-viewer-message') -export class UmbLogViewerMessageElement extends LitElement { - static styles = [ - UUITextStyles, - css` - summary { - display: flex; - } - - summary > div { - padding: 10px 20px; - display: flex; - align-items: center; - } - - #timestamp { - flex: 2; - } - - #level, - #machine { - flex: 1; - } - - #message { - flex: 4; - } - `, - ]; - - @property() - timestamp = ''; - - @state() - date?: Date; - - @property() - level: LogLevelModel | '' = ''; - - @property() - messageTemplate = ''; - - @property() - renderedMessage = ''; - - @property({ attribute: false }) - properties: Array = []; - - @property() - exception = ''; - - willUpdate(changedProperties: Map) { - if (changedProperties.has('timestamp')) { - this.date = new Date(this.timestamp); - } - } - - render() { - return html` -
    - -
    ${this.date?.toLocaleString()}
    -
    ${this.level}
    -
    ${this.properties.find((property) => property.name === 'MachineName')?.value}
    -
    ${this.renderedMessage}
    -
    -
      - ${this.properties.map((property) => html`
    • ${property.name}: ${property.value}
    • `)} -
    -
    - `; - } -} - -declare global { - interface HTMLElementTagNameMap { - 'umb-log-viewer-message': UmbLogViewerMessageElement; - } -} diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/log-overview.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/log-overview.element.ts index fe824ccacf..ca84c3b9f1 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/log-overview.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/log-overview.element.ts @@ -12,12 +12,6 @@ export class UmbLogViewerOverviewViewElement extends UmbLitElement { :host { display: block; - --umb-log-viewer-debug-color: var(--uui-color-default-emphasis); - --umb-log-viewer-information-color: var(--uui-color-positive); - --umb-log-viewer-warning-color: var(--uui-color-warning); - --umb-log-viewer-error-color: var(--uui-color-danger); - --umb-log-viewer-fatal-color: var(--uui-color-default); - --umb-log-viewer-verbose-color: var(--uui-color-current); } #logviewer-layout { diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/log-search.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/log-search.element.ts index d5d5e22cd1..92f7ae3f92 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/log-search.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/log-search.element.ts @@ -89,9 +89,35 @@ export class UmbLogViewerSearchViewElement extends UmbLitElement { margin: 0 var(--uui-size-space-3); } - uui-symbol-expand:not(#polling-symbol-expand) { + uui-symbol-expand:not(#polling-symbol-expand), + uui-symbol-sort { margin-left: var(--uui-size-space-3); } + + #message-list-header { + display: flex; + font-weight: 600; + } + + #message-list-header > div { + box-sizing: border-box; + padding: 10px 20px; + display: flex; + align-items: center; + } + + #timestamp { + flex: 1 0 14ch; + } + + #level, + #machine { + flex: 1 0 14ch; + } + + #message { + flex: 6 0 14ch; + } `, ]; @@ -221,7 +247,13 @@ export class UmbLogViewerSearchViewElement extends UmbLitElement {
    ${this.#renderSearchInput()}
    -

    Total items: 234

    +

    Total items: ${this._logs.length}

    +
    +
    Timestamp
    +
    Level
    +
    Machine name
    +
    Message
    +
    ${this._logs.map( (log) => html` + + + + +
    + +
    + + `; + } +} + +declare global { + interface HTMLElementTagNameMap { + 'umb-button-with-dropdown': UmbButtonWithDropdownElement; + } +} diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/button-with-dropdown/button-with-dropdown.stories.ts b/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/button-with-dropdown/button-with-dropdown.stories.ts new file mode 100644 index 0000000000..4c73fc1dfa --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/button-with-dropdown/button-with-dropdown.stories.ts @@ -0,0 +1,17 @@ +import './button-with-dropdown.element'; + +import { Meta, Story } from '@storybook/web-components'; +import { html } from 'lit-html'; +import { UmbButtonWithDropdownElement } from './button-with-dropdown.element'; + +export default { + title: 'Components/Button with dropdown', + component: 'umb-button-with-dropdown', + id: 'umb-button-with-dropdown', +} as Meta; + +export const AAAOverview: Story = () => html` + Open me +
    I am a dropdown
    +
    `; +AAAOverview.storyName = 'Overview'; diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/index.ts b/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/index.ts index 3909530f60..429dfc5d57 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/index.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/index.ts @@ -7,6 +7,7 @@ import './backoffice-frame/backoffice-header.element'; import './backoffice-frame/backoffice-main.element'; import './backoffice-frame/backoffice-modal-container.element'; import './backoffice-frame/backoffice-notification-container.element'; +import './button-with-dropdown/button-with-dropdown.element'; import './code-block/code-block.element'; import './debug/debug.element'; import './dropdown/dropdown.element'; From a960249d9259bb6dc09b965a287e265cb8498611 Mon Sep 17 00:00:00 2001 From: Julia Gru <56249914+julczka@users.noreply.github.com> Date: Wed, 1 Mar 2023 09:24:16 +0100 Subject: [PATCH 27/57] add search menu --- .../components/log-viewer-message.element.ts | 95 +++++++++++++++---- 1 file changed, 77 insertions(+), 18 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/components/log-viewer-message.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/components/log-viewer-message.element.ts index 86e289c2fb..503d32d859 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/components/log-viewer-message.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/components/log-viewer-message.element.ts @@ -20,18 +20,23 @@ export class UmbLogViewerMessageElement extends LitElement { display: flex; } + details[open] { + margin-bottom: var(--uui-size-space-3); + } + summary:hover, - ul { + #properties-list { background-color: var(--uui-color-background); } - ul { + #properties-list { margin: 0; padding: 0; list-style: none; + margin-bottom: var(--uui-size-space-3); } - li { + .property { padding: 10px 20px; display: flex; border-top: 1px solid var(--uui-color-border); @@ -71,8 +76,8 @@ export class UmbLogViewerMessageElement extends LitElement { padding: 0; margin-top: var(--uui-size-space-3); background-color: var(--uui-color-surface); - box-shadow: var(--uui-shadow-depth-2); - max-width: 20%; + box-shadow: var(--uui-shadow-depth-3); + max-width: 25%; } #search-menu > li { @@ -112,6 +117,54 @@ export class UmbLogViewerMessageElement extends LitElement { } } + private _searchMenuData: Array<{ label: string; href: () => string; icon: string; title: string }> = [ + { + label: 'Search in Google', + title: '@logViewer_searchThisMessageWithGoogle', + href: () => `https://www.google.com/search?q=${this.renderedMessage}`, + icon: 'https://www.google.com/favicon.ico', + }, + { + label: 'Search in Bing', + title: 'Search this message with Bing', + href: () => `https://www.bing.com/search?q=${this.renderedMessage}`, + icon: 'https://www.bing.com/favicon.ico', + }, + { + label: 'Search in OurUmbraco', + title: 'Search this message on Our Umbraco forums and docs', + href: () => `https://our.umbraco.com/search?q=${this.renderedMessage}&content=wiki,forum,documentation`, + icon: 'https://our.umbraco.com/assets/images/app-icons/favicon.png', + }, + { + label: 'Search in OurUmbraco with Google', + title: 'Search Our Umbraco forums using Google', + href: () => + `https://www.google.co.uk/?q=site:our.umbraco.com ${this.renderedMessage}&safe=off#q=site:our.umbraco.com ${ + this.renderedMessage + } ${this.properties.find((property) => property.name === 'SourceContext')?.value}&safe=off"`, + icon: 'https://www.google.com/favicon.ico', + }, + { + label: 'Search Umbraco Source', + title: 'Search within Umbraco source code on Github', + href: () => + `https://github.com/umbraco/Umbraco-CMS/search?q=${ + this.properties.find((property) => property.name === 'SourceContext')?.value + }`, + icon: 'https://github.githubassets.com/favicon.ico', + }, + { + label: 'Search Umbraco Issues', + title: 'Search Umbraco Issues on Github', + href: () => + `https://github.com/umbraco/Umbraco-CMS/issues?q=${ + this.properties.find((property) => property.name === 'SourceContext')?.value + }`, + icon: 'https://github.githubassets.com/favicon.ico', + }, + ]; + render() { return html`
    @@ -123,34 +176,40 @@ export class UmbLogViewerMessageElement extends LitElement {
    ${this.properties.find((property) => property.name === 'MachineName')?.value}
    ${this.renderedMessage}
    -
      -
    • +
        +
      • Timestamp
        ${this.date?.toLocaleString()}
      • -
      • +
      • @MessageTemplate
        ${this.messageTemplate}
      • ${this.properties.map( (property) => - html`
      • + html`
      • ${property.name}:
        ${property.value}
      • ` )}
      - + Search
        -
      • - Google -
      • + ${this._searchMenuData.map( + (menuItem) => html` +
      • + + + +
      • + ` + )}
    From 73f0105c339ece88b1972b4bec5de198020f8bf4 Mon Sep 17 00:00:00 2001 From: Julia Gru <56249914+julczka@users.noreply.github.com> Date: Wed, 1 Mar 2023 16:43:46 +0100 Subject: [PATCH 28/57] add log level filtering --- .../logviewer/workspace/logviewer.context.ts | 24 +++--- .../log-viewer-level-tag.element.ts | 4 +- .../components/log-viewer-message.element.ts | 69 ++++++++++++++-- .../workspace/views/log-overview.element.ts | 6 +- .../workspace/views/log-search.element.ts | 79 +++++++++++++++++-- .../src/core/mocks/data/logs.data.ts | 35 +++++++- 6 files changed, 190 insertions(+), 27 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/logviewer.context.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/logviewer.context.ts index 178c00d510..bde708ab2b 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/logviewer.context.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/logviewer.context.ts @@ -34,17 +34,17 @@ export class UmbLogViewerWorkspaceContext { get today() { const today = new Date(); const dd = String(today.getDate()).padStart(2, '0'); - const mm = String(today.getMonth() + 1).padStart(2, '0'); //January is 0! + const mm = String(today.getMonth() + 1).padStart(2, '0'); const yyyy = today.getFullYear(); return yyyy + '-' + mm + '-' + dd; } get yesterday() { - const today = new Date(); - const dd = String(today.getDate() - 1).padStart(2, '0'); - const mm = String(today.getMonth() + 1).padStart(2, '0'); //January is 0! - const yyyy = today.getFullYear(); + const yesterday = new Date(new Date().setDate(new Date().getDate() - 1)); + const dd = String(yesterday.getDate()).padStart(2, '0'); + const mm = String(yesterday.getMonth() + 1).padStart(2, '0'); + const yyyy = yesterday.getFullYear(); return yyyy + '-' + mm + '-' + dd; } @@ -63,8 +63,8 @@ export class UmbLogViewerWorkspaceContext { #dateRange = new DeepState(this.defaultDateRange); dateRange = createObservablePart(this.#dateRange, (data) => data); - #currentQuery = new StringState(''); - currentQuery = createObservablePart(this.#currentQuery, (data) => data); + #filterExpression = new StringState(''); + filterExpression = createObservablePart(this.#filterExpression, (data) => data); #messageTemplates = new DeepState(null); messageTemplates = createObservablePart(this.#messageTemplates, (data) => data); @@ -123,7 +123,7 @@ export class UmbLogViewerWorkspaceContext { async getLogs() { const options = { orderDirection: DirectionModel.ASCENDING, - filterExpression: this.#currentQuery.getValue(), + filterExpression: this.#filterExpression.getValue(), logLevel: this.#logLevel.getValue(), ...this.#dateRange.getValue(), }; @@ -135,8 +135,12 @@ export class UmbLogViewerWorkspaceContext { } } - setCurrentQuery(query: string) { - this.#currentQuery.next(query); + setFilterExpression(query: string) { + this.#filterExpression.next(query); + } + + setLogLevels(logLevels: LogLevelModel[]) { + this.#logLevel.next(logLevels); } } diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/components/log-viewer-level-tag.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/components/log-viewer-level-tag.element.ts index e3ea2980aa..958a291f2d 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/components/log-viewer-level-tag.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/components/log-viewer-level-tag.element.ts @@ -35,8 +35,8 @@ export class UmbLogViewerLevelTagElement extends LitElement { look=${ifDefined(this.level ? this.levelMap[this.level]?.look : undefined)} color=${ifDefined(this.level ? this.levelMap[this.level]?.color : undefined)} style="${ifDefined(this.level ? this.levelMap[this.level]?.style : undefined)}" - >${this.level}`; + >${this.level}`; } } diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/components/log-viewer-message.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/components/log-viewer-message.element.ts index 503d32d859..7cdfd9e355 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/components/log-viewer-message.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/components/log-viewer-message.element.ts @@ -1,10 +1,13 @@ -import { LogLevelModel, LogMessagePropertyModel } from '@umbraco-cms/backend-api'; import { UUITextStyles } from '@umbraco-ui/uui-css'; -import { css, html, LitElement } from 'lit'; +import { css, html } from 'lit'; import { customElement, property, state } from 'lit/decorators.js'; +import { UmbLogViewerWorkspaceContext, UMB_APP_LOG_VIEWER_CONTEXT_TOKEN } from '../../logviewer.context'; +import { LogLevelModel, LogMessagePropertyModel } from '@umbraco-cms/backend-api'; +import { UmbLitElement } from '@umbraco-cms/element'; +//TODO: check how to display EventId field in the message properties @customElement('umb-log-viewer-message') -export class UmbLogViewerMessageElement extends LitElement { +export class UmbLogViewerMessageElement extends UmbLitElement { static styles = [ UUITextStyles, css` @@ -62,6 +65,12 @@ export class UmbLogViewerMessageElement extends LitElement { flex: 6 0 14ch; } + .property-name, + .property-value { + display: flex; + align-items: center; + } + .property-name { font-weight: 600; flex: 1 1 20ch; @@ -87,6 +96,20 @@ export class UmbLogViewerMessageElement extends LitElement { .search-item { width: 100%; } + + pre { + background-color: var(--uui-color-background); + border-top: 1px solid #d8d7d9; + border-left: 4px solid #d42054; + color: #303033; + display: block; + font-family: Lato, Helvetica Neue, Helvetica, Arial, sans-serif; + line-height: 20px; + margin: 0; + overflow-x: auto; + padding: 9.5px; + white-space: pre-wrap; + } `, ]; @@ -117,6 +140,14 @@ export class UmbLogViewerMessageElement extends LitElement { } } + #logViewerContext?: UmbLogViewerWorkspaceContext; + constructor() { + super(); + this.consumeContext(UMB_APP_LOG_VIEWER_CONTEXT_TOKEN, (instance) => { + this.#logViewerContext = instance; + }); + } + private _searchMenuData: Array<{ label: string; href: () => string; icon: string; title: string }> = [ { label: 'Search in Google', @@ -165,6 +196,21 @@ export class UmbLogViewerMessageElement extends LitElement { }, ]; + private _propertiesWithSearchMenu: Array = ['HttpRequestNumber', 'SourceContext', 'MachineName']; + + private _findLogsWithProperty({ name, value }: LogMessagePropertyModel) { + let queryString = ''; + + if (isNaN(+(value ?? ''))) { + queryString = name + "='" + value + "'"; + } else { + queryString = name + '=' + value; + } + + this.#logViewerContext?.setFilterExpression(queryString); + this.#logViewerContext?.getLogs(); + } + render() { return html`
    @@ -176,6 +222,7 @@ export class UmbLogViewerMessageElement extends LitElement {
    ${this.properties.find((property) => property.name === 'MachineName')?.value}
    ${this.renderedMessage}
    + ${this.exception ? html`
    ${this.exception}
    ` : ''}
    • Timestamp
      @@ -189,11 +236,23 @@ export class UmbLogViewerMessageElement extends LitElement { (property) => html`
    • ${property.name}:
      -
      ${property.value}
      +
      + ${property.value} + ${this._propertiesWithSearchMenu.includes(property.name ?? '') + ? html` this._findLogsWithProperty(property)} + look="secondary" + label="Find logs with ${property.name}" + title="Find logs with ${property.name}" + >` + : ''} +
    • ` )}
    - + Search
      ${this._searchMenuData.map( diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/log-overview.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/log-overview.element.ts index ca84c3b9f1..b0aee61893 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/log-overview.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/log-overview.element.ts @@ -11,7 +11,6 @@ export class UmbLogViewerOverviewViewElement extends UmbLitElement { css` :host { display: block; - } #logviewer-layout { @@ -209,8 +208,6 @@ export class UmbLogViewerOverviewViewElement extends UmbLitElement { @state() private _endDate = ''; - #logViewerContext?: UmbLogViewerWorkspaceContext; - setLogLevelCount() { this.logLevelCount = this._logLevelCount ? Object.entries(this._logLevelCount).filter(([level, number]) => !this._logLevelCountFilter.includes(level)) @@ -220,6 +217,7 @@ export class UmbLogViewerOverviewViewElement extends UmbLitElement { : 0; } + #logViewerContext?: UmbLogViewerWorkspaceContext; constructor() { super(); this.consumeContext(UMB_APP_LOG_VIEWER_CONTEXT_TOKEN, (instance) => { @@ -305,7 +303,7 @@ export class UmbLogViewerOverviewViewElement extends UmbLitElement { } setCurrentQuery(query: string) { - this.#logViewerContext?.setCurrentQuery(query); + this.#logViewerContext?.setFilterExpression(query); } render() { diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/log-search.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/log-search.element.ts index 92f7ae3f92..2b847c45ea 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/log-search.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/log-search.element.ts @@ -1,14 +1,14 @@ import { UUITextStyles } from '@umbraco-ui/uui-css'; import { css, html } from 'lit'; -import { customElement, state, query } from 'lit/decorators.js'; +import { customElement, state, query, queryAll } from 'lit/decorators.js'; import { LogViewerDateRange, UmbLogViewerWorkspaceContext, UMB_APP_LOG_VIEWER_CONTEXT_TOKEN, } from '../logviewer.context'; import { UmbLitElement } from '@umbraco-cms/element'; -import { LogMessageModel, SavedLogSearchModel } from '@umbraco-cms/backend-api'; -import { UUIInputElement, UUIPopoverElement, UUISymbolExpandElement } from '@umbraco-ui/uui'; +import { LogLevelModel, LogMessageModel, SavedLogSearchModel } from '@umbraco-cms/backend-api'; +import { UUICheckboxElement, UUIInputElement, UUIPopoverElement, UUISymbolExpandElement } from '@umbraco-ui/uui'; @customElement('umb-log-viewer-search-view') export class UmbLogViewerSearchViewElement extends UmbLitElement { @@ -118,6 +118,24 @@ export class UmbLogViewerSearchViewElement extends UmbLitElement { #message { flex: 6 0 14ch; } + + #log-level-selector { + padding: var(--uui-box-default-padding, var(--uui-size-space-5, 18px)); + width: 150px; + background-color: var(--uui-color-surface); + box-shadow: var(--uui-shadow-depth-3); + display: flex; + flex-direction: column; + gap: var(--uui-size-space-3); + } + + .log-level-button-indicator { + font-weight: 600; + } + + .log-level-button-indicator:not(:last-of-type)::after { + content: ', '; + } `, ]; @@ -127,6 +145,9 @@ export class UmbLogViewerSearchViewElement extends UmbLitElement { @query('#saved-search-expand-symbol') private _savedSearchesExpandSymbol!: UUISymbolExpandElement; + @queryAll('#log-level-selector > uui-checkbox') + private _logLevelSelectorCheckboxes!: NodeListOf; + @state() private _savedSearches: SavedLogSearchModel[] = []; @@ -142,6 +163,9 @@ export class UmbLogViewerSearchViewElement extends UmbLitElement { @state() private _logs: LogMessageModel[] = []; + @state() + private _logLevel: LogLevelModel[] = []; + #logViewerContext?: UmbLogViewerWorkspaceContext; constructor() { @@ -164,13 +188,17 @@ export class UmbLogViewerSearchViewElement extends UmbLitElement { this._endDate = dateRange?.endDate; }); - this.observe(this.#logViewerContext.currentQuery, (query) => { + this.observe(this.#logViewerContext.filterExpression, (query) => { this._inputQuery = query; }); this.observe(this.#logViewerContext.logs, (logs) => { this._logs = logs ?? []; }); + + this.observe(this.#logViewerContext.logLevel, (levels) => { + this._logLevel = levels ?? []; + }); } #toggleSavedSearchesPopover() { @@ -193,6 +221,8 @@ export class UmbLogViewerSearchViewElement extends UmbLitElement { #clearQuery() { this._inputQuery = ''; + this.#logViewerContext?.setFilterExpression(''); + this.#logViewerContext?.getLogs(); } #renderSearchInput() { @@ -235,11 +265,50 @@ export class UmbLogViewerSearchViewElement extends UmbLitElement { Search`; } + #setLogLevel() { + const logLevels = Array.from(this._logLevelSelectorCheckboxes) + .filter((checkbox) => checkbox.checked) + .map((checkbox) => checkbox.value as LogLevelModel); + this.#logViewerContext?.setLogLevels(logLevels); + this.#logViewerContext?.getLogs(); + } + + #selectAllLogLevels() { + this._logLevelSelectorCheckboxes.forEach((checkbox) => (checkbox.checked = true)); + this.#setLogLevel(); + } + + #deselectAllLogLevels() { + this._logLevelSelectorCheckboxes.forEach((checkbox) => (checkbox.checked = false)); + this.#setLogLevel(); + } + + #renderLogLevelSelector() { + return html` +
      + ${Object.values(LogLevelModel).map( + (logLevel) => + html`` + )} + Select all + Deselect all +
      + `; + } + render() { return html`
      - Log level: All + Log Level: + ${this._logLevel.length > 0 + ? this._logLevel.map((level) => html`${level}`) + : 'All'} + ${this.#renderLogLevelSelector()} + Polling diff --git a/src/Umbraco.Web.UI.Client/src/core/mocks/data/logs.data.ts b/src/Umbraco.Web.UI.Client/src/core/mocks/data/logs.data.ts index 169d46b068..974ec00f50 100644 --- a/src/Umbraco.Web.UI.Client/src/core/mocks/data/logs.data.ts +++ b/src/Umbraco.Web.UI.Client/src/core/mocks/data/logs.data.ts @@ -7310,8 +7310,41 @@ const randomEnumValue = (enumeration: any): LogLevelModel => { }; export const logs: LogMessageModel[] = allLogs.map((log) => { + + const randomLevel = randomEnumValue(LogLevelModel); + return { ...log, - level: randomEnumValue(LogLevelModel), + level: randomLevel, + eventId: { + TypeTag: null, + Properties: [ + { + Name: 'Id', + Value: { + Value: 17, + }, + }, + { + Name: 'Name', + Value: { + Value: 'ExceptionProcessingMessage', + }, + }, + ], + }, + exception: + randomLevel === LogLevelModel.ERROR + ? `System.InvalidOperationException: The identity did not contain requried claim name + at Umbraco.Cloud.Identity.Cms.PrincipalExtensions.GetRequiredFirstValue(ClaimsIdentity identity, String claimType) + at Umbraco.Cloud.Identity.Cms.ClaimsIdentityExtensions.ApplyNameClaim(ClaimsIdentity identity) + at Umbraco.Cloud.Identity.Cms.ClaimsIdentityExtensions.ValidateAndTransformClaims(ClaimsIdentity identity, String currentPolicy, String[] userRoles, String passwordChangePolicy, String profilePolicy, String passwordResetPolicy) + at Umbraco.Cloud.Identity.Cms.ClaimsIdentityExtensions.ValidateAndTransformClaims(ClaimsPrincipal principal, String currentPolicy, String[] userRoles, String passwordChangePolicy, String profilePolicy, String passwordResetPolicy) + at Umbraco.Cloud.Identity.Cms.V10.OpenIdConnectEventHandler.OnAuthorizationCodeReceived(AuthorizationCodeReceivedContext context) + at Microsoft.Identity.Web.MicrosoftIdentityWebAppAuthenticationBuilder.<>c__DisplayClass11_1.<b__1>d.MoveNext() + --- End of stack trace from previous location --- + at Microsoft.AspNetCore.Authentication.OpenIdConnect.OpenIdConnectHandler.RunAuthorizationCodeReceivedEventAsync(OpenIdConnectMessage authorizationResponse, ClaimsPrincipal user, AuthenticationProperties properties, JwtSecurityToken jwt) + at Microsoft.AspNetCore.Authentication.OpenIdConnect.OpenIdConnectHandler.HandleRemoteAuthenticateAsync()` + : undefined, }; }); From 908c1b0381039a3bf40b9fb9d60c096dfdcea604 Mon Sep 17 00:00:00 2001 From: Julia Gru <56249914+julczka@users.noreply.github.com> Date: Wed, 1 Mar 2023 16:51:27 +0100 Subject: [PATCH 29/57] add query from saved searches --- .../workspace/views/log-search.element.ts | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/log-search.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/log-search.element.ts index 2b847c45ea..8930fd1d79 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/log-search.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/log-search.element.ts @@ -217,6 +217,15 @@ export class UmbLogViewerSearchViewElement extends UmbLitElement { #setQuery(event: Event) { const target = event.target as UUIInputElement; this._inputQuery = target.value as string; + this.#logViewerContext?.setFilterExpression(this._inputQuery); + } + + #setQueryFromSavedSearch(query: string) { + this._inputQuery = query; + this.#logViewerContext?.setFilterExpression(query); + this.#logViewerContext?.getLogs(); + this._savedSearchesPopover.open = false; + } #clearQuery() { @@ -252,7 +261,10 @@ export class UmbLogViewerSearchViewElement extends UmbLitElement { ${this._savedSearches.map( (search) => html`
    • - Date: Wed, 1 Mar 2023 16:56:37 +0100 Subject: [PATCH 30/57] fix menu item --- .../src/backoffice/settings/logviewer/menu-item/manifests.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/menu-item/manifests.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/menu-item/manifests.ts index dc7b08158f..558df963b7 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/menu-item/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/menu-item/manifests.ts @@ -8,7 +8,7 @@ const menuItem: ManifestMenuItem = { meta: { label: 'Log Viewer', icon: 'umb:box-alt', - entityType: 'logviewer-root', + entityType: 'logviewer', menus: ['Umb.Menu.Settings'], }, }; From 099b3ac651616c2f4259c3af2be60c98a99efc49 Mon Sep 17 00:00:00 2001 From: Julia Gru <56249914+julczka@users.noreply.github.com> Date: Wed, 1 Mar 2023 18:22:45 +0100 Subject: [PATCH 31/57] add polling --- .../logviewer/workspace/logviewer.context.ts | 32 +++++- .../workspace/views/log-overview.element.ts | 17 ++-- .../workspace/views/log-search.element.ts | 99 ++++++++++++++++--- 3 files changed, 127 insertions(+), 21 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/logviewer.context.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/logviewer.context.ts index bde708ab2b..7d686f4fa8 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/logviewer.context.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/logviewer.context.ts @@ -1,5 +1,5 @@ import { UmbLogViewerRepository } from './data/log-viewer.repository'; -import { ArrayState, createObservablePart, DeepState, StringState } from '@umbraco-cms/observable-api'; +import { ArrayState, createObservablePart, DeepState, ObjectState, StringState } from '@umbraco-cms/observable-api'; import { DirectionModel, LoggerModel, @@ -22,6 +22,11 @@ const logLevels = { export type LogLevel = Record; +export type PoolingInterval = 0 | 2000 | 5000 | 10000 | 20000 | 30000; +export interface PoolingCOnfig { + enabled: boolean; + interval: PoolingInterval; +} export interface LogViewerDateRange { startDate: string; endDate: string; @@ -75,6 +80,11 @@ export class UmbLogViewerWorkspaceContext { #logs = new DeepState(null); logs = createObservablePart(this.#logs, (data) => data?.items); + #polling = new ObjectState({ enabled: false, interval: 2000 }); + polling = createObservablePart(this.#polling, (data) => data); + + #intervalID: number | null = null; + constructor(host: UmbControllerHostInterface) { this.#host = host; this.#repository = new UmbLogViewerRepository(this.#host); @@ -142,6 +152,26 @@ export class UmbLogViewerWorkspaceContext { setLogLevels(logLevels: LogLevelModel[]) { this.#logLevel.next(logLevels); } + + togglePolling() { + const isEnabled = !this.#polling.getValue().enabled; + this.#polling.update({ + enabled: isEnabled, + }); + + if (isEnabled) { + this.#intervalID = setInterval(() => { + this.getLogs(); + }, this.#polling.getValue().interval) as unknown as number; + return; + } + + clearInterval(this.#intervalID as number); + } + + setPollingInterval(interval: PoolingInterval) { + this.#polling.update({ interval, enabled: true }); + } } export const UMB_APP_LOG_VIEWER_CONTEXT_TOKEN = new UmbContextToken( diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/log-overview.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/log-overview.element.ts index b0aee61893..c03a8f95a9 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/log-overview.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/log-overview.element.ts @@ -316,9 +316,9 @@ export class UmbLogViewerOverviewViewElement extends UmbLitElement {
      From: { - (e.target as HTMLInputElement).showPicker(); - }} + @click=${(e: Event) => { + (e.target as HTMLInputElement).showPicker(); + }} id="start-date" type="date" label="From" @@ -327,10 +327,9 @@ export class UmbLogViewerOverviewViewElement extends UmbLitElement { To: { - (e.target as HTMLInputElement).showPicker(); - }} - + @click=${(e: Event) => { + (e.target as HTMLInputElement).showPicker(); + }} id="end-date" type="date" label="To" @@ -436,7 +435,9 @@ export class UmbLogViewerOverviewViewElement extends UmbLitElement { } - Show more + Show more
    • diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/log-search.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/log-search.element.ts index 8930fd1d79..8352911e80 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/log-search.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/log-search.element.ts @@ -3,6 +3,8 @@ import { css, html } from 'lit'; import { customElement, state, query, queryAll } from 'lit/decorators.js'; import { LogViewerDateRange, + PoolingCOnfig, + PoolingInterval, UmbLogViewerWorkspaceContext, UMB_APP_LOG_VIEWER_CONTEXT_TOKEN, } from '../logviewer.context'; @@ -89,7 +91,8 @@ export class UmbLogViewerSearchViewElement extends UmbLitElement { margin: 0 var(--uui-size-space-3); } - uui-symbol-expand:not(#polling-symbol-expand), + #polling-symbol-expand, + #saved-search-expand-symbol, uui-symbol-sort { margin-left: var(--uui-size-space-3); } @@ -136,12 +139,29 @@ export class UmbLogViewerSearchViewElement extends UmbLitElement { .log-level-button-indicator:not(:last-of-type)::after { content: ', '; } + + #polling-interval-menu { + margin: 0; + padding: 0; + width: 20ch; + background-color: var(--uui-color-surface); + box-shadow: var(--uui-shadow-depth-3); + display: flex; + flex-direction: column; + transform: translateX(calc((100% - 33px) * -1)); + } `, ]; @query('#saved-searches-popover') private _savedSearchesPopover!: UUIPopoverElement; + @query('#polling-popover') + private _pollingPopover!: UUIPopoverElement; + + @query('#polling-expand-symbol') + private _polingExpandSymbol!: UUISymbolExpandElement; + @query('#saved-search-expand-symbol') private _savedSearchesExpandSymbol!: UUISymbolExpandElement; @@ -166,6 +186,9 @@ export class UmbLogViewerSearchViewElement extends UmbLitElement { @state() private _logLevel: LogLevelModel[] = []; + @state() + private _poolingConfig: PoolingCOnfig = {pooling: false, interval: 0}; + #logViewerContext?: UmbLogViewerWorkspaceContext; constructor() { @@ -199,6 +222,11 @@ export class UmbLogViewerSearchViewElement extends UmbLitElement { this.observe(this.#logViewerContext.logLevel, (levels) => { this._logLevel = levels ?? []; }); + + + this.observe(this.#logViewerContext.polling, (poolingConfig) => { + this._poolingConfig = {...poolingConfig}; + }); } #toggleSavedSearchesPopover() { @@ -209,7 +237,7 @@ export class UmbLogViewerSearchViewElement extends UmbLitElement { this._savedSearchesExpandSymbol.open = !this._savedSearchesExpandSymbol.open; } - #openPopover() { + #openSavedSearchesPopover() { this.#toggleSavedSearchesPopover(); this.#toggleSavedSearchesExpandSymbol(); } @@ -225,7 +253,6 @@ export class UmbLogViewerSearchViewElement extends UmbLitElement { this.#logViewerContext?.setFilterExpression(query); this.#logViewerContext?.getLogs(); this._savedSearchesPopover.open = false; - } #clearQuery() { @@ -241,6 +268,7 @@ export class UmbLogViewerSearchViewElement extends UmbLitElement { @close=${this.#toggleSavedSearchesExpandSymbol}> ` : html``} - Saved searches @@ -300,31 +333,73 @@ export class UmbLogViewerSearchViewElement extends UmbLitElement {
      ${Object.values(LogLevelModel).map( (logLevel) => - html`` )} - Select all - Deselect all + Select all + Deselect all
      `; } + #togglePolling() { + this.#logViewerContext?.togglePolling(); + } + + #setPolingInterval(interval: PoolingInterval) { + this.#logViewerContext?.setPollingInterval(interval); + this.#closePoolingPopover(); + } + + #openPoolingPopover() { + this._pollingPopover.open = true; + this._polingExpandSymbol.open = true; + } + + #closePoolingPopover() { + this._pollingPopover.open = false; + this._polingExpandSymbol.open = false; + } + + #pollingIntervals: PoolingInterval[] = [2000, 5000, 10000, 20000, 30000]; + + #renderPolingTimeSelector() { + return html` + ${this._poolingConfig.enabled ? html`Polling ${this._poolingConfig.interval/1000} seconds` : 'Pooling'} + (this._polingExpandSymbol.open = false)}> + + + + +
        + ${this.#pollingIntervals.map( + (interval: PoolingInterval) => + html` this.#setPolingInterval(interval)}>` + )} +
      +
      +
      `; + } + render() { return html`
      - Log Level: ${this._logLevel.length > 0 ? this._logLevel.map((level) => html`${level}`) : 'All'} ${this.#renderLogLevelSelector()} - - Polling - - + ${this.#renderPolingTimeSelector()}
      ${this.#renderSearchInput()}
      From 48cf9b319304023dafe496d5c7878ad420423dad Mon Sep 17 00:00:00 2001 From: Julia Gru <56249914+julczka@users.noreply.github.com> Date: Thu, 2 Mar 2023 08:57:11 +0100 Subject: [PATCH 32/57] cleanup --- .../settings/logviewer/workspace/logviewer.context.ts | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/logviewer.context.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/logviewer.context.ts index 7d686f4fa8..50cb0f1ab9 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/logviewer.context.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/logviewer.context.ts @@ -2,9 +2,7 @@ import { UmbLogViewerRepository } from './data/log-viewer.repository'; import { ArrayState, createObservablePart, DeepState, ObjectState, StringState } from '@umbraco-cms/observable-api'; import { DirectionModel, - LoggerModel, LogLevelModel, - PagedLoggerModel, PagedLogMessageModel, PagedLogTemplateModel, PagedSavedLogSearchModel, From eb42e8ecf7a86723f2d13fba21091c4d4f3ef0aa Mon Sep 17 00:00:00 2001 From: Julia Gru <56249914+julczka@users.noreply.github.com> Date: Thu, 2 Mar 2023 08:58:04 +0100 Subject: [PATCH 33/57] cleanup --- .../logviewer/workspace/donut-chart/donut-chart.ts | 2 -- .../logviewer/workspace/views/log-search.element.ts | 13 ++++++++----- 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/donut-chart/donut-chart.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/donut-chart/donut-chart.ts index 5824c81c33..0e7cb81cd8 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/donut-chart/donut-chart.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/donut-chart/donut-chart.ts @@ -7,7 +7,6 @@ export interface Circle { percent: number; color: string; name: string; - tooltipText: string; } interface CircleWithCommands extends Circle { @@ -138,7 +137,6 @@ export class UmbDonutChartElement extends LitElement { percent: slice.percent, color: slice.color, name: slice.name, - tooltipText: slice.tooltipText, }; }) ); diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/log-search.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/log-search.element.ts index 8352911e80..fa5b7e3799 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/log-search.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/log-search.element.ts @@ -187,7 +187,7 @@ export class UmbLogViewerSearchViewElement extends UmbLitElement { private _logLevel: LogLevelModel[] = []; @state() - private _poolingConfig: PoolingCOnfig = {pooling: false, interval: 0}; + private _poolingConfig: PoolingCOnfig = { enabled: false, interval: 0 }; #logViewerContext?: UmbLogViewerWorkspaceContext; @@ -223,9 +223,8 @@ export class UmbLogViewerSearchViewElement extends UmbLitElement { this._logLevel = levels ?? []; }); - this.observe(this.#logViewerContext.polling, (poolingConfig) => { - this._poolingConfig = {...poolingConfig}; + this._poolingConfig = { ...poolingConfig }; }); } @@ -370,7 +369,11 @@ export class UmbLogViewerSearchViewElement extends UmbLitElement { #renderPolingTimeSelector() { return html` - ${this._poolingConfig.enabled ? html`Polling ${this._poolingConfig.interval/1000} seconds` : 'Pooling'} + ${this._poolingConfig.enabled + ? html`Polling ${this._poolingConfig.interval / 1000} seconds` + : 'Pooling'} (this._polingExpandSymbol.open = false)}> @@ -380,7 +383,7 @@ export class UmbLogViewerSearchViewElement extends UmbLitElement { ${this.#pollingIntervals.map( (interval: PoolingInterval) => html` this.#setPolingInterval(interval)}>` )}
    From 67c65d06e8987befa1cf557695ec3230c46399af Mon Sep 17 00:00:00 2001 From: Julia Gru <56249914+julczka@users.noreply.github.com> Date: Thu, 2 Mar 2023 12:26:16 +0100 Subject: [PATCH 34/57] fix naming --- .../logviewer/workspace/data/log-viewer.repository.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/data/log-viewer.repository.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/data/log-viewer.repository.ts index 136deba17e..a1b1612377 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/data/log-viewer.repository.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/data/log-viewer.repository.ts @@ -2,7 +2,7 @@ import { UmbLogMessagesServerDataSource, UmbLogSearchesServerDataSource } from ' import { UmbLogSearchesStore, UMB_LOG_SEARCHES_STORE_CONTEXT_TOKEN } from './log-search.store'; import { UmbContextConsumerController } from '@umbraco-cms/context-api'; import { UmbControllerHostInterface } from '@umbraco-cms/controller'; -import { UmbNotificationService, UMB_NOTIFICATION_SERVICE_CONTEXT_TOKEN } from '@umbraco-cms/notification'; +import { UmbNotificationContext, UMB_NOTIFICATION_CONTEXT_TOKEN } from '@umbraco-cms/notification'; import { DirectionModel, LogLevelModel } from '@umbraco-cms/backend-api'; // Move to documentation / JSdoc @@ -14,7 +14,7 @@ export class UmbLogViewerRepository { #searchDataSource: UmbLogSearchesServerDataSource; #messagesDataSource: UmbLogMessagesServerDataSource; #searchStore?: UmbLogSearchesStore; - #notificationService?: UmbNotificationService; + #notificationService?: UmbNotificationContext; #initResolver?: () => void; #initialized = false; @@ -28,7 +28,7 @@ export class UmbLogViewerRepository { this.#checkIfInitialized(); }); - new UmbContextConsumerController(this.#host, UMB_NOTIFICATION_SERVICE_CONTEXT_TOKEN, (instance) => { + new UmbContextConsumerController(this.#host, UMB_NOTIFICATION_CONTEXT_TOKEN, (instance) => { this.#notificationService = instance; this.#checkIfInitialized(); }); From d61d9fb1e2af5dcff65754771d2bf6308af59984 Mon Sep 17 00:00:00 2001 From: Julia Gru <56249914+julczka@users.noreply.github.com> Date: Thu, 2 Mar 2023 12:26:26 +0100 Subject: [PATCH 35/57] add rotating icon to polling button --- .../workspace/views/log-search.element.ts | 31 ++++++++++++++++++- 1 file changed, 30 insertions(+), 1 deletion(-) diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/log-search.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/log-search.element.ts index fa5b7e3799..1e55d36be5 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/log-search.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/log-search.element.ts @@ -150,6 +150,34 @@ export class UmbLogViewerSearchViewElement extends UmbLitElement { flex-direction: column; transform: translateX(calc((100% - 33px) * -1)); } + + #polling-enabled-icon { + margin-right: var(--uui-size-space-3); + margin-bottom: 1px; + -webkit-animation: rotate-center 0.8s ease-in-out infinite both; + animation: rotate-center 0.8s ease-in-out infinite both; + } + + @-webkit-keyframes rotate-center { + 0% { + -webkit-transform: rotate(0); + transform: rotate(0); + } + 100% { + -webkit-transform: rotate(360deg); + transform: rotate(360deg); + } + } + @keyframes rotate-center { + 0% { + -webkit-transform: rotate(0); + transform: rotate(0); + } + 100% { + -webkit-transform: rotate(360deg); + transform: rotate(360deg); + } + } `, ]; @@ -371,7 +399,8 @@ export class UmbLogViewerSearchViewElement extends UmbLitElement { return html` ${this._poolingConfig.enabled - ? html`Polling ${this._poolingConfig.interval / 1000} seconds` + ? html`Polling + ${this._poolingConfig.interval / 1000} seconds` : 'Pooling'} (this._polingExpandSymbol.open = false)}> From 99b3be6e4c92d40f69fd9f51f8227dcd4033ce2e Mon Sep 17 00:00:00 2001 From: Julia Gru <56249914+julczka@users.noreply.github.com> Date: Thu, 2 Mar 2023 13:11:33 +0100 Subject: [PATCH 36/57] add sorting --- .../logviewer/workspace/logviewer.context.ts | 12 +++- .../workspace/views/log-overview.element.ts | 2 +- .../workspace/views/log-search.element.ts | 70 ++++++++++++++----- 3 files changed, 65 insertions(+), 19 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/logviewer.context.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/logviewer.context.ts index 50cb0f1ab9..71ea422769 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/logviewer.context.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/logviewer.context.ts @@ -9,6 +9,7 @@ import { } from '@umbraco-cms/backend-api'; import { UmbControllerHostInterface } from '@umbraco-cms/controller'; import { UmbContextToken } from '@umbraco-cms/context-api'; +import { BasicState } from 'libs/observable-api/basic-state'; const logLevels = { Information: 171, @@ -81,6 +82,9 @@ export class UmbLogViewerWorkspaceContext { #polling = new ObjectState({ enabled: false, interval: 2000 }); polling = createObservablePart(this.#polling, (data) => data); + #sortingDirection = new BasicState(DirectionModel.ASCENDING); + sortingDirection = createObservablePart(this.#sortingDirection, (data) => data); + #intervalID: number | null = null; constructor(host: UmbControllerHostInterface) { @@ -130,7 +134,7 @@ export class UmbLogViewerWorkspaceContext { async getLogs() { const options = { - orderDirection: DirectionModel.ASCENDING, + orderDirection: this.#sortingDirection.getValue(), filterExpression: this.#filterExpression.getValue(), logLevel: this.#logLevel.getValue(), ...this.#dateRange.getValue(), @@ -170,6 +174,12 @@ export class UmbLogViewerWorkspaceContext { setPollingInterval(interval: PoolingInterval) { this.#polling.update({ interval, enabled: true }); } + + toggleSortOrder() { + const direction = this.#sortingDirection.getValue(); + const newDirection = direction === DirectionModel.ASCENDING ? DirectionModel.DESCENDING : DirectionModel.ASCENDING; + this.#sortingDirection.next(newDirection); + } } export const UMB_APP_LOG_VIEWER_CONTEXT_TOKEN = new UmbContextToken( diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/log-overview.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/log-overview.element.ts index c03a8f95a9..96e3fb224a 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/log-overview.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/log-overview.element.ts @@ -340,7 +340,7 @@ export class UmbLogViewerOverviewViewElement extends UmbLitElement { -

    ${this._errorCount ? this._errorCount : ''}

    +

    ${this._errorCount}

    diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/log-search.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/log-search.element.ts index 1e55d36be5..aa00b91869 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/log-search.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/log-search.element.ts @@ -9,7 +9,7 @@ import { UMB_APP_LOG_VIEWER_CONTEXT_TOKEN, } from '../logviewer.context'; import { UmbLitElement } from '@umbraco-cms/element'; -import { LogLevelModel, LogMessageModel, SavedLogSearchModel } from '@umbraco-cms/backend-api'; +import { DirectionModel, LogLevelModel, LogMessageModel, SavedLogSearchModel } from '@umbraco-cms/backend-api'; import { UUICheckboxElement, UUIInputElement, UUIPopoverElement, UUISymbolExpandElement } from '@umbraco-ui/uui'; @customElement('umb-log-viewer-search-view') @@ -158,6 +158,13 @@ export class UmbLogViewerSearchViewElement extends UmbLitElement { animation: rotate-center 0.8s ease-in-out infinite both; } + #empty { + display: flex; + justify-content: center; + align-items: center; + gap: var(--uui-size-space-3); + } + @-webkit-keyframes rotate-center { 0% { -webkit-transform: rotate(0); @@ -208,6 +215,9 @@ export class UmbLogViewerSearchViewElement extends UmbLitElement { @state() private _inputQuery = ''; + @state() + private _sortingDirection: DirectionModel = DirectionModel.ASCENDING; + @state() private _logs: LogMessageModel[] = []; @@ -254,6 +264,10 @@ export class UmbLogViewerSearchViewElement extends UmbLitElement { this.observe(this.#logViewerContext.polling, (poolingConfig) => { this._poolingConfig = { ...poolingConfig }; }); + + this.observe(this.#logViewerContext.sortingDirection, (direction) => { + this._sortingDirection = direction; + }); } #toggleSavedSearchesPopover() { @@ -288,6 +302,10 @@ export class UmbLogViewerSearchViewElement extends UmbLitElement { this.#logViewerContext?.getLogs(); } + #search() { + this.#logViewerContext?.getLogs(); + } + #renderSearchInput() { return html` - Search`; + Search`; } #setLogLevel() { @@ -420,6 +438,11 @@ export class UmbLogViewerSearchViewElement extends UmbLitElement {
    `; } + #sortLogs() { + this.#logViewerContext?.toggleSortOrder(); + this.#logViewerContext?.getLogs(); + } + render() { return html`
    @@ -436,21 +459,34 @@ export class UmbLogViewerSearchViewElement extends UmbLitElement {
    ${this.#renderSearchInput()}

    Total items: ${this._logs.length}

    -
    -
    Timestamp
    -
    Level
    -
    Machine name
    -
    Message
    -
    - ${this._logs.map( - (log) => html`` - )} + ${this._logs.length > 0 + ? html`
    +
    + Timestamp + + + +
    +
    Level
    +
    Machine name
    +
    Message
    +
    + ${this._logs.map( + (log) => html`` + )}` + : html` + Sorry, we cannot find what you are looking for. + `}
    `; From 5d3a91ec715f4970fb61cd32eb57b737c02855f0 Mon Sep 17 00:00:00 2001 From: Julia Gru <56249914+julczka@users.noreply.github.com> Date: Thu, 2 Mar 2023 16:45:30 +0100 Subject: [PATCH 37/57] add pagination to logs --- .../logviewer/workspace/logviewer.context.ts | 12 +++ .../workspace/views/log-overview.element.ts | 1 + .../workspace/views/log-search.element.ts | 89 ++++++++++++++----- 3 files changed, 79 insertions(+), 23 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/logviewer.context.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/logviewer.context.ts index 71ea422769..cb3500e148 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/logviewer.context.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/logviewer.context.ts @@ -78,6 +78,7 @@ export class UmbLogViewerWorkspaceContext { #logs = new DeepState(null); logs = createObservablePart(this.#logs, (data) => data?.items); + logsTotal = createObservablePart(this.#logs, (data) => data?.total); #polling = new ObjectState({ enabled: false, interval: 2000 }); polling = createObservablePart(this.#polling, (data) => data); @@ -87,6 +88,8 @@ export class UmbLogViewerWorkspaceContext { #intervalID: number | null = null; + #currentPage = 1; + constructor(host: UmbControllerHostInterface) { this.#host = host; this.#repository = new UmbLogViewerRepository(this.#host); @@ -132,8 +135,17 @@ export class UmbLogViewerWorkspaceContext { } } + setCurrentPage(page: number) { + this.#currentPage = page; + } + async getLogs() { + const skip = (this.#currentPage - 1) * 100; + const take = 100; + const options = { + skip, + take, orderDirection: this.#sortingDirection.getValue(), filterExpression: this.#filterExpression.getValue(), logLevel: this.#logLevel.getValue(), diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/log-overview.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/log-overview.element.ts index 96e3fb224a..245eeb70c5 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/log-overview.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/log-overview.element.ts @@ -5,6 +5,7 @@ import { LogLevel, LogViewerDateRange, UmbLogViewerWorkspaceContext, UMB_APP_LOG import { SavedLogSearchModel, PagedLogTemplateModel } from '@umbraco-cms/backend-api'; import { UmbLitElement } from '@umbraco-cms/element'; +//TODO: add a disabled attribute to the show more button when the total number of items is correctly returned from the endpoint @customElement('umb-log-viewer-overview-view') export class UmbLogViewerOverviewViewElement extends UmbLitElement { static styles = [ diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/log-search.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/log-search.element.ts index aa00b91869..7b109ff5e2 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/log-search.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/log-search.element.ts @@ -10,7 +10,14 @@ import { } from '../logviewer.context'; import { UmbLitElement } from '@umbraco-cms/element'; import { DirectionModel, LogLevelModel, LogMessageModel, SavedLogSearchModel } from '@umbraco-cms/backend-api'; -import { UUICheckboxElement, UUIInputElement, UUIPopoverElement, UUISymbolExpandElement } from '@umbraco-ui/uui'; +import { + UUICheckboxElement, + UUIInputElement, + UUIPaginationElement, + UUIPopoverElement, + UUIScrollContainerElement, + UUISymbolExpandElement, +} from '@umbraco-ui/uui'; @customElement('umb-log-viewer-search-view') export class UmbLogViewerSearchViewElement extends UmbLitElement { @@ -165,6 +172,10 @@ export class UmbLogViewerSearchViewElement extends UmbLitElement { gap: var(--uui-size-space-3); } + #pagination { + margin: var(--uui-size-space-5, 18px) 0; + } + @-webkit-keyframes rotate-center { 0% { -webkit-transform: rotate(0); @@ -200,6 +211,9 @@ export class UmbLogViewerSearchViewElement extends UmbLitElement { @query('#saved-search-expand-symbol') private _savedSearchesExpandSymbol!: UUISymbolExpandElement; + @query('#logs-scroll-container') + private _logsScrollContainer!: UUIScrollContainerElement; + @queryAll('#log-level-selector > uui-checkbox') private _logLevelSelectorCheckboxes!: NodeListOf; @@ -221,6 +235,9 @@ export class UmbLogViewerSearchViewElement extends UmbLitElement { @state() private _logs: LogMessageModel[] = []; + @state() + private _logsTotal = 0; + @state() private _logLevel: LogLevelModel[] = []; @@ -257,6 +274,10 @@ export class UmbLogViewerSearchViewElement extends UmbLitElement { this._logs = logs ?? []; }); + this.observe(this.#logViewerContext.logsTotal, (total) => { + this._logsTotal = total ?? 0; + }); + this.observe(this.#logViewerContext.logLevel, (levels) => { this._logLevel = levels ?? []; }); @@ -458,22 +479,23 @@ export class UmbLogViewerSearchViewElement extends UmbLitElement {
    ${this.#renderSearchInput()}
    -

    Total items: ${this._logs.length}

    - ${this._logs.length > 0 - ? html`
    -
    - Timestamp - - - -
    -
    Level
    -
    Machine name
    -
    Message
    -
    - ${this._logs.map( +

    Total items: ${this._logsTotal}

    +
    +
    + Timestamp + + + +
    +
    Level
    +
    Machine name
    +
    Message
    +
    + + ${this._logs.length > 0 + ? html` ${this._logs.map( (log) => html`` - )}` - : html` - Sorry, we cannot find what you are looking for. - `} + )}` + : html` + Sorry, we cannot find what you are looking for. + `} + + ${this._renderPagination()}
    `; } + + _onPageChange(event: Event): void { + const current = (event.target as UUIPaginationElement).current; + this.#logViewerContext?.setCurrentPage(current); + this.#logViewerContext?.getLogs(); + this._logsScrollContainer.scrollTop = 0; + } + + private _renderPagination() { + if (!this._logsTotal) return ''; + + const totalPages = Math.ceil(this._logsTotal / 100); + + if (totalPages <= 1) return ''; + + return html``; + } } export default UmbLogViewerSearchViewElement; From 9b7383de05981ae9c8337e7dcc36ae6fee66f7eb Mon Sep 17 00:00:00 2001 From: Julia Gru <56249914+julczka@users.noreply.github.com> Date: Thu, 2 Mar 2023 17:04:33 +0100 Subject: [PATCH 38/57] add debounce to log filters --- .../settings/logviewer/workspace/logviewer.context.ts | 10 +++++----- .../logviewer/workspace/views/log-search.element.ts | 8 ++++++-- 2 files changed, 11 insertions(+), 7 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/logviewer.context.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/logviewer.context.ts index cb3500e148..70c9d1b5f2 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/logviewer.context.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/logviewer.context.ts @@ -88,7 +88,7 @@ export class UmbLogViewerWorkspaceContext { #intervalID: number | null = null; - #currentPage = 1; + currentPage = 1; constructor(host: UmbControllerHostInterface) { this.#host = host; @@ -136,11 +136,11 @@ export class UmbLogViewerWorkspaceContext { } setCurrentPage(page: number) { - this.#currentPage = page; + this.currentPage = page; } - async getLogs() { - const skip = (this.#currentPage - 1) * 100; + getLogs = async () => { + const skip = (this.currentPage - 1) * 100; const take = 100; const options = { @@ -157,7 +157,7 @@ export class UmbLogViewerWorkspaceContext { if (data) { this.#logs.next(data); } - } + }; setFilterExpression(query: string) { this.#filterExpression.next(query); diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/log-search.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/log-search.element.ts index 7b109ff5e2..62a4bfd827 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/log-search.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/log-search.element.ts @@ -18,6 +18,7 @@ import { UUIScrollContainerElement, UUISymbolExpandElement, } from '@umbraco-ui/uui'; +import _ from 'lodash'; @customElement('umb-log-viewer-search-view') export class UmbLogViewerSearchViewElement extends UmbLitElement { @@ -377,13 +378,16 @@ export class UmbLogViewerSearchViewElement extends UmbLitElement { } #setLogLevel() { + if (!this.#logViewerContext) return; const logLevels = Array.from(this._logLevelSelectorCheckboxes) .filter((checkbox) => checkbox.checked) .map((checkbox) => checkbox.value as LogLevelModel); this.#logViewerContext?.setLogLevels(logLevels); - this.#logViewerContext?.getLogs(); + this.#logViewerContext.getLogs(); } + setLogLevelDebounce = _.debounce(this.#setLogLevel, 300); + #selectAllLogLevels() { this._logLevelSelectorCheckboxes.forEach((checkbox) => (checkbox.checked = true)); this.#setLogLevel(); @@ -396,7 +400,7 @@ export class UmbLogViewerSearchViewElement extends UmbLitElement { #renderLogLevelSelector() { return html` -
    +
    ${Object.values(LogLevelModel).map( (logLevel) => html` Date: Thu, 2 Mar 2023 17:28:22 +0100 Subject: [PATCH 39/57] add dates checks --- .../settings/logviewer/workspace/logviewer.context.ts | 8 ++++++++ .../logviewer/workspace/views/log-overview.element.ts | 8 ++++++++ 2 files changed, 16 insertions(+) diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/logviewer.context.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/logviewer.context.ts index 70c9d1b5f2..50090a1f62 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/logviewer.context.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/logviewer.context.ts @@ -108,6 +108,14 @@ export class UmbLogViewerWorkspaceContext { } setDateRange(dateRange: LogViewerDateRange) { + const { startDate, endDate } = dateRange; + + const isAnyDateInTheFuture = new Date(startDate) > new Date() || new Date(endDate) > new Date(); + const isStartDateBiggerThenEndDate = new Date(startDate) > new Date(endDate); + if (isAnyDateInTheFuture || isStartDateBiggerThenEndDate) { + return; + } + this.#dateRange.next(dateRange); this.getLogCount(dateRange); } diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/log-overview.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/log-overview.element.ts index 245eeb70c5..933cf0825c 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/log-overview.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/log-overview.element.ts @@ -92,6 +92,13 @@ export class UmbLogViewerOverviewViewElement extends UmbLitElement { width: 100%; text-align: inherit; outline: none; + position: relative; + border-bottom: 2px solid transparent; + } + + /* find out better validation for that */ + input:out-of-range { + border-color: var(--uui-color-danger); } ul { @@ -334,6 +341,7 @@ export class UmbLogViewerOverviewViewElement extends UmbLitElement { id="end-date" type="date" label="To" + .min=${this._startDate} .max=${this.#logViewerContext?.today ?? ''} .value=${this._endDate}> From e540d1c588dec5254fe0fb3d6a73980051caf4e6 Mon Sep 17 00:00:00 2001 From: Julia Gru <56249914+julczka@users.noreply.github.com> Date: Fri, 3 Mar 2023 08:47:15 +0100 Subject: [PATCH 40/57] reset current page with every search --- .../logviewer/workspace/logviewer.context.ts | 33 +++++++++++++++++++ .../workspace/views/log-search.element.ts | 7 ++++ src/Umbraco.Web.UI.Client/vite.config.ts | 3 -- 3 files changed, 40 insertions(+), 3 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/logviewer.context.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/logviewer.context.ts index 50090a1f62..0d123061a1 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/logviewer.context.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/logviewer.context.ts @@ -124,6 +124,37 @@ export class UmbLogViewerWorkspaceContext { const { data } = await this.#repository.getSavedSearches({ skip: 0, take: 100 }); if (data) { this.#savedSearches.next(data); + } else { + //falback to some default searches like in the old backoffice + this.#savedSearches.next({ + items: [ + { + name: 'Find all logs where the Level is NOT Verbose and NOT Debug', + query: "Not(@Level='Verbose') and Not(@Level='Debug')", + }, + { + name: 'Find all logs that has an exception property (Warning, Error & Fatal with Exceptions)', + query: 'Has(@Exception)', + }, + { + name: "Find all logs that have the property 'Duration'", + query: 'Has(Duration)', + }, + { + name: "Find all logs that have the property 'Duration' and the duration is greater than 1000ms", + query: 'Has(Duration) and Duration > 1000', + }, + { + name: "Find all logs that are from the namespace 'Umbraco.Core'", + query: "StartsWith(SourceContext, 'Umbraco.Core')", + }, + { + name: 'Find all logs that use a specific log message template', + query: "@MessageTemplate = '[Timing {TimingId}] {EndMessage} ({TimingDuration}ms)'", + }, + ], + total: 6, + }); } } @@ -176,6 +207,7 @@ export class UmbLogViewerWorkspaceContext { } togglePolling() { + const isEnabled = !this.#polling.getValue().enabled; this.#polling.update({ enabled: isEnabled, @@ -183,6 +215,7 @@ export class UmbLogViewerWorkspaceContext { if (isEnabled) { this.#intervalID = setInterval(() => { + this.currentPage = 1; this.getLogs(); }, this.#polling.getValue().interval) as unknown as number; return; diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/log-search.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/log-search.element.ts index 62a4bfd827..badb6dde85 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/log-search.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/log-search.element.ts @@ -314,6 +314,8 @@ export class UmbLogViewerSearchViewElement extends UmbLitElement { #setQueryFromSavedSearch(query: string) { this._inputQuery = query; this.#logViewerContext?.setFilterExpression(query); + this.#logViewerContext?.setCurrentPage(1); + this.#logViewerContext?.getLogs(); this._savedSearchesPopover.open = false; } @@ -325,6 +327,8 @@ export class UmbLogViewerSearchViewElement extends UmbLitElement { } #search() { + this.#logViewerContext?.setCurrentPage(1); + this.#logViewerContext?.getLogs(); } @@ -379,6 +383,8 @@ export class UmbLogViewerSearchViewElement extends UmbLitElement { #setLogLevel() { if (!this.#logViewerContext) return; + this.#logViewerContext?.setCurrentPage(1); + const logLevels = Array.from(this._logLevelSelectorCheckboxes) .filter((checkbox) => checkbox.checked) .map((checkbox) => checkbox.value as LogLevelModel); @@ -465,6 +471,7 @@ export class UmbLogViewerSearchViewElement extends UmbLitElement { #sortLogs() { this.#logViewerContext?.toggleSortOrder(); + this.#logViewerContext?.setCurrentPage(1); this.#logViewerContext?.getLogs(); } diff --git a/src/Umbraco.Web.UI.Client/vite.config.ts b/src/Umbraco.Web.UI.Client/vite.config.ts index 611ff2686b..a9a8182fc9 100644 --- a/src/Umbraco.Web.UI.Client/vite.config.ts +++ b/src/Umbraco.Web.UI.Client/vite.config.ts @@ -7,9 +7,6 @@ export default defineConfig({ build: { sourcemap: true, }, - server: { - open: '/backoffice', - }, plugins: [ viteStaticCopy({ targets: [ From 2fa8fccd6e473557d91127ea600cf310520f2848 Mon Sep 17 00:00:00 2001 From: Julia Gru <56249914+julczka@users.noreply.github.com> Date: Fri, 3 Mar 2023 12:14:15 +0100 Subject: [PATCH 41/57] exctract polling button to separate component --- .../.vscode/settings.json | 3 +- .../workspace/views/components/index.ts | 1 + .../components/log-viewer-message.element.ts | 28 +++- .../log-viewer-polling-button.element.ts | 138 ++++++++++++++++++ .../workspace/views/log-search.element.ts | 83 +---------- 5 files changed, 166 insertions(+), 87 deletions(-) create mode 100644 src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/components/log-viewer-polling-button.element.ts diff --git a/src/Umbraco.Web.UI.Client/.vscode/settings.json b/src/Umbraco.Web.UI.Client/.vscode/settings.json index a33b02ae5b..30aabc0572 100644 --- a/src/Umbraco.Web.UI.Client/.vscode/settings.json +++ b/src/Umbraco.Web.UI.Client/.vscode/settings.json @@ -1,4 +1,5 @@ { "cssVariables.lookupFiles": ["node_modules/@umbraco-ui/uui-css/dist/custom-properties.css"], - "cSpell.words": ["combobox", "variantable"] + "cSpell.words": ["combobox", "variantable"], + "exportall.config.folderListener": ["/src/backoffice/settings/logviewer/workspace/views/components"] } diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/components/index.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/components/index.ts index e73f51de1f..14acdff6af 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/components/index.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/components/index.ts @@ -1,2 +1,3 @@ export * from './log-viewer-level-tag.element'; export * from './log-viewer-message.element'; +export * from './log-viewer-polling-button.element'; diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/components/log-viewer-message.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/components/log-viewer-message.element.ts index 7cdfd9e355..7209d51872 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/components/log-viewer-message.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/components/log-viewer-message.element.ts @@ -1,6 +1,6 @@ import { UUITextStyles } from '@umbraco-ui/uui-css'; -import { css, html } from 'lit'; -import { customElement, property, state } from 'lit/decorators.js'; +import { css, html, PropertyValueMap } from 'lit'; +import { customElement, property, query, state } from 'lit/decorators.js'; import { UmbLogViewerWorkspaceContext, UMB_APP_LOG_VIEWER_CONTEXT_TOKEN } from '../../logviewer.context'; import { LogLevelModel, LogMessagePropertyModel } from '@umbraco-cms/backend-api'; import { UmbLitElement } from '@umbraco-cms/element'; @@ -113,6 +113,9 @@ export class UmbLogViewerMessageElement extends UmbLitElement { `, ]; + @query('details') + details!: HTMLDetailsElement; + @property() timestamp = ''; @@ -131,6 +134,9 @@ export class UmbLogViewerMessageElement extends UmbLitElement { @property({ attribute: false }) properties: Array = []; + @property({ type: Boolean }) + open = false; + @property() exception = ''; @@ -140,6 +146,12 @@ export class UmbLogViewerMessageElement extends UmbLitElement { } } + protected updated(_changedProperties: PropertyValueMap | Map): void { + if (_changedProperties.has('open')) { + this.open ? this.details.setAttribute('open', 'true') : this.details.removeAttribute('open'); + } + } + #logViewerContext?: UmbLogViewerWorkspaceContext; constructor() { super(); @@ -208,12 +220,18 @@ export class UmbLogViewerMessageElement extends UmbLitElement { } this.#logViewerContext?.setFilterExpression(queryString); + this.#logViewerContext?.setCurrentPage(1); + this.details.removeAttribute('open'); this.#logViewerContext?.getLogs(); } + #setOpen(event: Event) { + this.open = (event.target as HTMLDetailsElement).open; + } + render() { return html` -
    +
    ${this.date?.toLocaleString()}
    @@ -241,7 +259,9 @@ export class UmbLogViewerMessageElement extends UmbLitElement { ${this._propertiesWithSearchMenu.includes(property.name ?? '') ? html` this._findLogsWithProperty(property)} + @click=${() => { + this._findLogsWithProperty(property); + }} look="secondary" label="Find logs with ${property.name}" title="Find logs with ${property.name}" diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/components/log-viewer-polling-button.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/components/log-viewer-polling-button.element.ts new file mode 100644 index 0000000000..397dfe28ef --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/components/log-viewer-polling-button.element.ts @@ -0,0 +1,138 @@ +import { UUIPopoverElement, UUISymbolExpandElement } from '@umbraco-ui/uui'; +import { UUITextStyles } from '@umbraco-ui/uui-css'; +import { css, html } from 'lit'; +import { customElement, query, state } from 'lit/decorators.js'; +import { + PoolingCOnfig, + PoolingInterval, + UmbLogViewerWorkspaceContext, + UMB_APP_LOG_VIEWER_CONTEXT_TOKEN, +} from '../../logviewer.context'; +import { UmbLitElement } from '@umbraco-cms/element'; + +@customElement('umb-log-viewer-polling-button') +export class UmbLogViewerPollingButtonElement extends UmbLitElement { + static styles = [ + UUITextStyles, + css` + #polling-interval-menu { + margin: 0; + padding: 0; + width: 20ch; + background-color: var(--uui-color-surface); + box-shadow: var(--uui-shadow-depth-3); + display: flex; + flex-direction: column; + transform: translateX(calc((100% - 33px) * -1)); + } + + #polling-enabled-icon { + margin-right: var(--uui-size-space-3); + margin-bottom: 1px; + -webkit-animation: rotate-center 0.8s ease-in-out infinite both; + animation: rotate-center 0.8s ease-in-out infinite both; + } + + @-webkit-keyframes rotate-center { + 0% { + -webkit-transform: rotate(0); + transform: rotate(0); + } + 100% { + -webkit-transform: rotate(360deg); + transform: rotate(360deg); + } + } + @keyframes rotate-center { + 0% { + -webkit-transform: rotate(0); + transform: rotate(0); + } + 100% { + -webkit-transform: rotate(360deg); + transform: rotate(360deg); + } + } + `, + ]; + + @query('#polling-popover') + private _pollingPopover!: UUIPopoverElement; + + @query('#polling-expand-symbol') + private _polingExpandSymbol!: UUISymbolExpandElement; + + @state() + private _poolingConfig: PoolingCOnfig = { enabled: false, interval: 0 }; + + #logViewerContext?: UmbLogViewerWorkspaceContext; + + #pollingIntervals: PoolingInterval[] = [2000, 5000, 10000, 20000, 30000]; + + constructor() { + super(); + this.consumeContext(UMB_APP_LOG_VIEWER_CONTEXT_TOKEN, (instance) => { + this.#logViewerContext = instance; + this.#observePoolingConfig(); + this.#logViewerContext.getLogs(); + }); + } + + #observePoolingConfig() { + if (!this.#logViewerContext) return; + + this.observe(this.#logViewerContext.polling, (poolingConfig) => { + this._poolingConfig = { ...poolingConfig }; + }); + } + + #togglePolling() { + this.#logViewerContext?.togglePolling(); + } + + #setPolingInterval(interval: PoolingInterval) { + this.#logViewerContext?.setPollingInterval(interval); + this.#closePoolingPopover(); + } + + #openPoolingPopover() { + this._pollingPopover.open = true; + this._polingExpandSymbol.open = true; + } + + #closePoolingPopover() { + this._pollingPopover.open = false; + this._polingExpandSymbol.open = false; + } + + render() { + return html` + ${this._poolingConfig.enabled + ? html`Polling + ${this._poolingConfig.interval / 1000} seconds` + : 'Pooling'} + (this._polingExpandSymbol.open = false)}> + + + + +
      + ${this.#pollingIntervals.map( + (interval: PoolingInterval) => + html` this.#setPolingInterval(interval)}>` + )} +
    +
    +
    `; + } +} + +declare global { + interface HTMLElementTagNameMap { + 'umb-log-viewer-polling-button': UmbLogViewerPollingButtonElement; + } +} diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/log-search.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/log-search.element.ts index badb6dde85..fbb07ade22 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/log-search.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/log-search.element.ts @@ -148,24 +148,6 @@ export class UmbLogViewerSearchViewElement extends UmbLitElement { content: ', '; } - #polling-interval-menu { - margin: 0; - padding: 0; - width: 20ch; - background-color: var(--uui-color-surface); - box-shadow: var(--uui-shadow-depth-3); - display: flex; - flex-direction: column; - transform: translateX(calc((100% - 33px) * -1)); - } - - #polling-enabled-icon { - margin-right: var(--uui-size-space-3); - margin-bottom: 1px; - -webkit-animation: rotate-center 0.8s ease-in-out infinite both; - animation: rotate-center 0.8s ease-in-out infinite both; - } - #empty { display: flex; justify-content: center; @@ -176,27 +158,6 @@ export class UmbLogViewerSearchViewElement extends UmbLitElement { #pagination { margin: var(--uui-size-space-5, 18px) 0; } - - @-webkit-keyframes rotate-center { - 0% { - -webkit-transform: rotate(0); - transform: rotate(0); - } - 100% { - -webkit-transform: rotate(360deg); - transform: rotate(360deg); - } - } - @keyframes rotate-center { - 0% { - -webkit-transform: rotate(0); - transform: rotate(0); - } - 100% { - -webkit-transform: rotate(360deg); - transform: rotate(360deg); - } - } `, ]; @@ -423,50 +384,8 @@ export class UmbLogViewerSearchViewElement extends UmbLitElement { `; } - #togglePolling() { - this.#logViewerContext?.togglePolling(); - } - - #setPolingInterval(interval: PoolingInterval) { - this.#logViewerContext?.setPollingInterval(interval); - this.#closePoolingPopover(); - } - - #openPoolingPopover() { - this._pollingPopover.open = true; - this._polingExpandSymbol.open = true; - } - - #closePoolingPopover() { - this._pollingPopover.open = false; - this._polingExpandSymbol.open = false; - } - - #pollingIntervals: PoolingInterval[] = [2000, 5000, 10000, 20000, 30000]; - #renderPolingTimeSelector() { - return html` - ${this._poolingConfig.enabled - ? html`Polling - ${this._poolingConfig.interval / 1000} seconds` - : 'Pooling'} - (this._polingExpandSymbol.open = false)}> - - - - -
      - ${this.#pollingIntervals.map( - (interval: PoolingInterval) => - html` this.#setPolingInterval(interval)}>` - )} -
    -
    -
    `; + return html` `; } #sortLogs() { From 838e67ac2cd5af9f824daa1062df3c3cb49b8dae Mon Sep 17 00:00:00 2001 From: Julia Gru <56249914+julczka@users.noreply.github.com> Date: Fri, 3 Mar 2023 12:28:44 +0100 Subject: [PATCH 42/57] extract log-viewer filter to separate component --- .../logviewer/workspace/logviewer.context.ts | 11 +- .../workspace/views/components/index.ts | 1 + ...og-viewer-log-level-filter-menu.element.ts | 118 ++++++++++++++++++ .../log-viewer-polling-button.element.ts | 4 +- .../workspace/views/log-search.element.ts | 109 ++-------------- 5 files changed, 135 insertions(+), 108 deletions(-) create mode 100644 src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/components/log-viewer-log-level-filter-menu.element.ts diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/logviewer.context.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/logviewer.context.ts index 0d123061a1..782ae76e43 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/logviewer.context.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/logviewer.context.ts @@ -73,8 +73,8 @@ export class UmbLogViewerWorkspaceContext { #messageTemplates = new DeepState(null); messageTemplates = createObservablePart(this.#messageTemplates, (data) => data); - #logLevel = new ArrayState([]); - logLevel = createObservablePart(this.#logLevel, (data) => data); + #logLevelsFilter = new ArrayState([]); + logLevelsFilter = createObservablePart(this.#logLevelsFilter, (data) => data); #logs = new DeepState(null); logs = createObservablePart(this.#logs, (data) => data?.items); @@ -187,7 +187,7 @@ export class UmbLogViewerWorkspaceContext { take, orderDirection: this.#sortingDirection.getValue(), filterExpression: this.#filterExpression.getValue(), - logLevel: this.#logLevel.getValue(), + logLevel: this.#logLevelsFilter.getValue(), ...this.#dateRange.getValue(), }; @@ -202,12 +202,11 @@ export class UmbLogViewerWorkspaceContext { this.#filterExpression.next(query); } - setLogLevels(logLevels: LogLevelModel[]) { - this.#logLevel.next(logLevels); + setLogLevelsFilter(logLevels: LogLevelModel[]) { + this.#logLevelsFilter.next(logLevels); } togglePolling() { - const isEnabled = !this.#polling.getValue().enabled; this.#polling.update({ enabled: isEnabled, diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/components/index.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/components/index.ts index 14acdff6af..682d1ed887 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/components/index.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/components/index.ts @@ -1,3 +1,4 @@ export * from './log-viewer-level-tag.element'; +export * from './log-viewer-log-level-filter-menu.element'; export * from './log-viewer-message.element'; export * from './log-viewer-polling-button.element'; diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/components/log-viewer-log-level-filter-menu.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/components/log-viewer-log-level-filter-menu.element.ts new file mode 100644 index 0000000000..3a7cb253dc --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/components/log-viewer-log-level-filter-menu.element.ts @@ -0,0 +1,118 @@ +import { UUICheckboxElement } from '@umbraco-ui/uui'; +import { UUITextStyles } from '@umbraco-ui/uui-css'; +import { css, html } from 'lit'; +import { customElement, queryAll, state } from 'lit/decorators.js'; +import _ from 'lodash'; +import { UmbLogViewerWorkspaceContext, UMB_APP_LOG_VIEWER_CONTEXT_TOKEN } from '../../logviewer.context'; +import { LogLevelModel } from '@umbraco-cms/backend-api'; +import { UmbLitElement } from '@umbraco-cms/element'; + +@customElement('umb-log-viewer-log-level-filter-menu') +export class UmbLogViewerLogLevelFilterMenuElement extends UmbLitElement { + static styles = [ + UUITextStyles, + css` + #log-level-selector { + padding: var(--uui-box-default-padding, var(--uui-size-space-5, 18px)); + width: 150px; + background-color: var(--uui-color-surface); + box-shadow: var(--uui-shadow-depth-3); + display: flex; + flex-direction: column; + gap: var(--uui-size-space-3); + } + + .log-level-button-indicator { + font-weight: 600; + } + + .log-level-button-indicator:not(:last-of-type)::after { + content: ', '; + } + `, + ]; + + @queryAll('#log-level-selector > uui-checkbox') + private _logLevelSelectorCheckboxes!: NodeListOf; + + @state() + private _logLevelFilter: LogLevelModel[] = []; + + #logViewerContext?: UmbLogViewerWorkspaceContext; + + constructor() { + super(); + this.consumeContext(UMB_APP_LOG_VIEWER_CONTEXT_TOKEN, (instance) => { + this.#logViewerContext = instance; + this.#observeLogLevelFilter(); + }); + } + + #observeLogLevelFilter() { + if (!this.#logViewerContext) return; + + this.observe(this.#logViewerContext.logLevelsFilter, (levelsFilter) => { + this._logLevelFilter = levelsFilter ?? []; + }); + } + + #setLogLevel() { + if (!this.#logViewerContext) return; + this.#logViewerContext?.setCurrentPage(1); + + const logLevels = Array.from(this._logLevelSelectorCheckboxes) + .filter((checkbox) => checkbox.checked) + .map((checkbox) => checkbox.value as LogLevelModel); + this.#logViewerContext?.setLogLevelsFilter(logLevels); + this.#logViewerContext.getLogs(); + } + + setLogLevelDebounce = _.debounce(this.#setLogLevel, 300); + + #selectAllLogLevels() { + this._logLevelSelectorCheckboxes.forEach((checkbox) => (checkbox.checked = true)); + this.#setLogLevel(); + } + + #deselectAllLogLevels() { + this._logLevelSelectorCheckboxes.forEach((checkbox) => (checkbox.checked = false)); + this.#setLogLevel(); + } + + #renderLogLevelSelector() { + return html` +
    + ${Object.values(LogLevelModel).map( + (logLevel) => + html`` + )} + Select all + Deselect all +
    + `; + } + + render() { + return html` + Log Level: + ${this._logLevelFilter.length > 0 + ? this._logLevelFilter.map((level) => html`${level}`) + : 'All'} + ${this.#renderLogLevelSelector()} + + `; + } +} + +declare global { + interface HTMLElementTagNameMap { + 'umb-log-viewer-log-level-filter-menu': UmbLogViewerLogLevelFilterMenuElement; + } +} diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/components/log-viewer-polling-button.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/components/log-viewer-polling-button.element.ts index 397dfe28ef..2a579bd1a6 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/components/log-viewer-polling-button.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/components/log-viewer-polling-button.element.ts @@ -65,10 +65,10 @@ export class UmbLogViewerPollingButtonElement extends UmbLitElement { @state() private _poolingConfig: PoolingCOnfig = { enabled: false, interval: 0 }; - #logViewerContext?: UmbLogViewerWorkspaceContext; - #pollingIntervals: PoolingInterval[] = [2000, 5000, 10000, 20000, 30000]; + #logViewerContext?: UmbLogViewerWorkspaceContext; + constructor() { super(); this.consumeContext(UMB_APP_LOG_VIEWER_CONTEXT_TOKEN, (instance) => { diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/log-search.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/log-search.element.ts index fbb07ade22..448d418a36 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/log-search.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/log-search.element.ts @@ -1,24 +1,20 @@ import { UUITextStyles } from '@umbraco-ui/uui-css'; import { css, html } from 'lit'; -import { customElement, state, query, queryAll } from 'lit/decorators.js'; +import { customElement, state, query } from 'lit/decorators.js'; import { - LogViewerDateRange, - PoolingCOnfig, - PoolingInterval, - UmbLogViewerWorkspaceContext, - UMB_APP_LOG_VIEWER_CONTEXT_TOKEN, -} from '../logviewer.context'; -import { UmbLitElement } from '@umbraco-cms/element'; -import { DirectionModel, LogLevelModel, LogMessageModel, SavedLogSearchModel } from '@umbraco-cms/backend-api'; -import { - UUICheckboxElement, UUIInputElement, UUIPaginationElement, UUIPopoverElement, UUIScrollContainerElement, UUISymbolExpandElement, } from '@umbraco-ui/uui'; -import _ from 'lodash'; +import { + LogViewerDateRange, + UmbLogViewerWorkspaceContext, + UMB_APP_LOG_VIEWER_CONTEXT_TOKEN, +} from '../logviewer.context'; +import { DirectionModel, LogMessageModel, SavedLogSearchModel } from '@umbraco-cms/backend-api'; +import { UmbLitElement } from '@umbraco-cms/element'; @customElement('umb-log-viewer-search-view') export class UmbLogViewerSearchViewElement extends UmbLitElement { @@ -130,24 +126,6 @@ export class UmbLogViewerSearchViewElement extends UmbLitElement { flex: 6 0 14ch; } - #log-level-selector { - padding: var(--uui-box-default-padding, var(--uui-size-space-5, 18px)); - width: 150px; - background-color: var(--uui-color-surface); - box-shadow: var(--uui-shadow-depth-3); - display: flex; - flex-direction: column; - gap: var(--uui-size-space-3); - } - - .log-level-button-indicator { - font-weight: 600; - } - - .log-level-button-indicator:not(:last-of-type)::after { - content: ', '; - } - #empty { display: flex; justify-content: center; @@ -164,21 +142,12 @@ export class UmbLogViewerSearchViewElement extends UmbLitElement { @query('#saved-searches-popover') private _savedSearchesPopover!: UUIPopoverElement; - @query('#polling-popover') - private _pollingPopover!: UUIPopoverElement; - - @query('#polling-expand-symbol') - private _polingExpandSymbol!: UUISymbolExpandElement; - @query('#saved-search-expand-symbol') private _savedSearchesExpandSymbol!: UUISymbolExpandElement; @query('#logs-scroll-container') private _logsScrollContainer!: UUIScrollContainerElement; - @queryAll('#log-level-selector > uui-checkbox') - private _logLevelSelectorCheckboxes!: NodeListOf; - @state() private _savedSearches: SavedLogSearchModel[] = []; @@ -200,11 +169,6 @@ export class UmbLogViewerSearchViewElement extends UmbLitElement { @state() private _logsTotal = 0; - @state() - private _logLevel: LogLevelModel[] = []; - - @state() - private _poolingConfig: PoolingCOnfig = { enabled: false, interval: 0 }; #logViewerContext?: UmbLogViewerWorkspaceContext; @@ -240,14 +204,6 @@ export class UmbLogViewerSearchViewElement extends UmbLitElement { this._logsTotal = total ?? 0; }); - this.observe(this.#logViewerContext.logLevel, (levels) => { - this._logLevel = levels ?? []; - }); - - this.observe(this.#logViewerContext.polling, (poolingConfig) => { - this._poolingConfig = { ...poolingConfig }; - }); - this.observe(this.#logViewerContext.sortingDirection, (direction) => { this._sortingDirection = direction; }); @@ -342,47 +298,6 @@ export class UmbLogViewerSearchViewElement extends UmbLitElement { Search`; } - #setLogLevel() { - if (!this.#logViewerContext) return; - this.#logViewerContext?.setCurrentPage(1); - - const logLevels = Array.from(this._logLevelSelectorCheckboxes) - .filter((checkbox) => checkbox.checked) - .map((checkbox) => checkbox.value as LogLevelModel); - this.#logViewerContext?.setLogLevels(logLevels); - this.#logViewerContext.getLogs(); - } - - setLogLevelDebounce = _.debounce(this.#setLogLevel, 300); - - #selectAllLogLevels() { - this._logLevelSelectorCheckboxes.forEach((checkbox) => (checkbox.checked = true)); - this.#setLogLevel(); - } - - #deselectAllLogLevels() { - this._logLevelSelectorCheckboxes.forEach((checkbox) => (checkbox.checked = false)); - this.#setLogLevel(); - } - - #renderLogLevelSelector() { - return html` -
    - ${Object.values(LogLevelModel).map( - (logLevel) => - html`` - )} - Select all - Deselect all -
    - `; - } #renderPolingTimeSelector() { return html` `; @@ -398,13 +313,7 @@ export class UmbLogViewerSearchViewElement extends UmbLitElement { return html`
    - Log Level: - ${this._logLevel.length > 0 - ? this._logLevel.map((level) => html`${level}`) - : 'All'} - ${this.#renderLogLevelSelector()} - + ${this.#renderPolingTimeSelector()}
    ${this.#renderSearchInput()}
    From 9f9c9e3443fdb69ef2e3ec17bc973663a8a9b09d Mon Sep 17 00:00:00 2001 From: Julia Gru <56249914+julczka@users.noreply.github.com> Date: Fri, 3 Mar 2023 12:48:39 +0100 Subject: [PATCH 43/57] extract input to a separate component --- .../workspace/views/components/index.ts | 1 + .../log-viewer-search-input.element.ts | 211 ++++++++++++++++++ .../workspace/views/log-search.element.ts | 181 +-------------- 3 files changed, 214 insertions(+), 179 deletions(-) create mode 100644 src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/components/log-viewer-search-input.element.ts diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/components/index.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/components/index.ts index 682d1ed887..e08b412420 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/components/index.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/components/index.ts @@ -2,3 +2,4 @@ export * from './log-viewer-level-tag.element'; export * from './log-viewer-log-level-filter-menu.element'; export * from './log-viewer-message.element'; export * from './log-viewer-polling-button.element'; +export * from './log-viewer-search-input.element'; diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/components/log-viewer-search-input.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/components/log-viewer-search-input.element.ts new file mode 100644 index 0000000000..3836a896f2 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/components/log-viewer-search-input.element.ts @@ -0,0 +1,211 @@ +import { UUIInputElement, UUIPopoverElement, UUISymbolExpandElement } from '@umbraco-ui/uui'; +import { UUITextStyles } from '@umbraco-ui/uui-css'; +import { css, html } from 'lit'; +import { customElement, query, state } from 'lit/decorators.js'; +import { UmbLogViewerWorkspaceContext, UMB_APP_LOG_VIEWER_CONTEXT_TOKEN } from '../../logviewer.context'; +import { SavedLogSearchModel } from '@umbraco-cms/backend-api'; +import { UmbLitElement } from '@umbraco-cms/element'; + +@customElement('umb-log-viewer-search-input') +export class UmbLogViewerSearchInputElement extends UmbLitElement { + static styles = [ + UUITextStyles, + css` + :host { + display: flex; + align-items: center; + justify-content: space-between; + gap: var(--uui-size-space-4); + } + + #search-input { + width: 100%; + } + + #saved-searches-button { + flex-shrink: 0; + } + + #saved-searches-popover { + flex: 1; + } + + #saved-searches-container { + width: 100%; + max-height: 300px; + background-color: var(--uui-color-surface); + box-shadow: var(--uui-shadow-depth-1); + } + + .saved-search-item { + display: flex; + justify-content: space-between; + align-items: stretch; + border-bottom: 1px solid #e9e9eb; + } + + .saved-search-item-button { + display: flex; + font-family: inherit; + flex: 1; + background: 0 0; + padding: 0 0; + border: 0; + clear: both; + cursor: pointer; + display: flex; + font-weight: 400; + line-height: 20px; + text-align: left; + align-items: center; + white-space: nowrap; + color: var(--uui-color-interactive); + } + + .saved-search-item-button:hover { + background-color: var(--uui-color-surface-emphasis, rgb(250, 250, 250)); + color: var(--color-standalone); + } + + .saved-search-item-name { + font-weight: 600; + margin: 0 var(--uui-size-space-3); + } + + #polling-symbol-expand, + #saved-search-expand-symbol, + uui-symbol-sort { + margin-left: var(--uui-size-space-3); + } + `, + ]; + + @query('#saved-searches-popover') + private _savedSearchesPopover!: UUIPopoverElement; + + @query('#saved-search-expand-symbol') + private _savedSearchesExpandSymbol!: UUISymbolExpandElement; + + @state() + private _savedSearches: SavedLogSearchModel[] = []; + + @state() + private _inputQuery = ''; + + #logViewerContext?: UmbLogViewerWorkspaceContext; + + constructor() { + super(); + this.consumeContext(UMB_APP_LOG_VIEWER_CONTEXT_TOKEN, (instance) => { + this.#logViewerContext = instance; + this.#observeStuff(); + this.#logViewerContext.getLogs(); + }); + } + + #observeStuff() { + if (!this.#logViewerContext) return; + this.observe(this.#logViewerContext.savedSearches, (savedSearches) => { + this._savedSearches = savedSearches ?? []; + }); + + this.observe(this.#logViewerContext.filterExpression, (query) => { + this._inputQuery = query; + }); + } + + #toggleSavedSearchesPopover() { + this._savedSearchesPopover.open = !this._savedSearchesPopover.open; + } + + #toggleSavedSearchesExpandSymbol() { + this._savedSearchesExpandSymbol.open = !this._savedSearchesExpandSymbol.open; + } + + #openSavedSearchesPopover() { + this.#toggleSavedSearchesPopover(); + this.#toggleSavedSearchesExpandSymbol(); + } + + #setQuery(event: Event) { + const target = event.target as UUIInputElement; + this._inputQuery = target.value as string; + this.#logViewerContext?.setFilterExpression(this._inputQuery); + } + + #setQueryFromSavedSearch(query: string) { + this._inputQuery = query; + this.#logViewerContext?.setFilterExpression(query); + this.#logViewerContext?.setCurrentPage(1); + + this.#logViewerContext?.getLogs(); + this._savedSearchesPopover.open = false; + } + + #clearQuery() { + this._inputQuery = ''; + this.#logViewerContext?.setFilterExpression(''); + this.#logViewerContext?.getLogs(); + } + + #search() { + this.#logViewerContext?.setCurrentPage(1); + + this.#logViewerContext?.getLogs(); + } + + render() { + return html` + + ${this._inputQuery + ? html`` + : html``} + Saved searches + + + + ${this._savedSearches.map( + (search) => + html`
  • + +
  • ` + )} +
    +
    + Search`; + } +} + +declare global { + interface HTMLElementTagNameMap { + 'umb-log-viewer-search-input': UmbLogViewerSearchInputElement; + } +} diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/log-search.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/log-search.element.ts index 448d418a36..180a338044 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/log-search.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/log-search.element.ts @@ -37,70 +37,10 @@ export class UmbLogViewerSearchViewElement extends UmbLitElement { justify-content: space-between; } - #input-container { - justify-content: space-between; - } - - #search-input { - width: 100%; - } - - #saved-searches-button { - flex-shrink: 0; - } - - #saved-searches-popover { + umb-log-viewer-search-input { flex: 1; } - #saved-searches-container { - width: 100%; - max-height: 300px; - background-color: var(--uui-color-surface); - box-shadow: var(--uui-shadow-depth-1); - } - - .saved-search-item { - display: flex; - justify-content: space-between; - align-items: stretch; - border-bottom: 1px solid #e9e9eb; - } - - .saved-search-item-button { - display: flex; - font-family: inherit; - flex: 1; - background: 0 0; - padding: 0 0; - border: 0; - clear: both; - cursor: pointer; - display: flex; - font-weight: 400; - line-height: 20px; - text-align: left; - align-items: center; - white-space: nowrap; - color: var(--uui-color-interactive); - } - - .saved-search-item-button:hover { - background-color: var(--uui-color-surface-emphasis, rgb(250, 250, 250)); - color: var(--color-standalone); - } - - .saved-search-item-name { - font-weight: 600; - margin: 0 var(--uui-size-space-3); - } - - #polling-symbol-expand, - #saved-search-expand-symbol, - uui-symbol-sort { - margin-left: var(--uui-size-space-3); - } - #message-list-header { display: flex; font-weight: 600; @@ -139,27 +79,9 @@ export class UmbLogViewerSearchViewElement extends UmbLitElement { `, ]; - @query('#saved-searches-popover') - private _savedSearchesPopover!: UUIPopoverElement; - - @query('#saved-search-expand-symbol') - private _savedSearchesExpandSymbol!: UUISymbolExpandElement; - @query('#logs-scroll-container') private _logsScrollContainer!: UUIScrollContainerElement; - @state() - private _savedSearches: SavedLogSearchModel[] = []; - - @state() - private _startDate = ''; - - @state() - private _endDate = ''; - - @state() - private _inputQuery = ''; - @state() private _sortingDirection: DirectionModel = DirectionModel.ASCENDING; @@ -169,7 +91,6 @@ export class UmbLogViewerSearchViewElement extends UmbLitElement { @state() private _logsTotal = 0; - #logViewerContext?: UmbLogViewerWorkspaceContext; constructor() { @@ -183,18 +104,6 @@ export class UmbLogViewerSearchViewElement extends UmbLitElement { #observeStuff() { if (!this.#logViewerContext) return; - this.observe(this.#logViewerContext.savedSearches, (savedSearches) => { - this._savedSearches = savedSearches ?? []; - }); - - this.observe(this.#logViewerContext.dateRange, (dateRange: LogViewerDateRange) => { - this._startDate = dateRange?.startDate; - this._endDate = dateRange?.endDate; - }); - - this.observe(this.#logViewerContext.filterExpression, (query) => { - this._inputQuery = query; - }); this.observe(this.#logViewerContext.logs, (logs) => { this._logs = logs ?? []; @@ -209,96 +118,10 @@ export class UmbLogViewerSearchViewElement extends UmbLitElement { }); } - #toggleSavedSearchesPopover() { - this._savedSearchesPopover.open = !this._savedSearchesPopover.open; - } - - #toggleSavedSearchesExpandSymbol() { - this._savedSearchesExpandSymbol.open = !this._savedSearchesExpandSymbol.open; - } - - #openSavedSearchesPopover() { - this.#toggleSavedSearchesPopover(); - this.#toggleSavedSearchesExpandSymbol(); - } - - #setQuery(event: Event) { - const target = event.target as UUIInputElement; - this._inputQuery = target.value as string; - this.#logViewerContext?.setFilterExpression(this._inputQuery); - } - - #setQueryFromSavedSearch(query: string) { - this._inputQuery = query; - this.#logViewerContext?.setFilterExpression(query); - this.#logViewerContext?.setCurrentPage(1); - - this.#logViewerContext?.getLogs(); - this._savedSearchesPopover.open = false; - } - - #clearQuery() { - this._inputQuery = ''; - this.#logViewerContext?.setFilterExpression(''); - this.#logViewerContext?.getLogs(); - } - - #search() { - this.#logViewerContext?.setCurrentPage(1); - - this.#logViewerContext?.getLogs(); - } - #renderSearchInput() { - return html` - - ${this._inputQuery - ? html`` - : html``} - Saved searches - - - - ${this._savedSearches.map( - (search) => - html`
  • - -
  • ` - )} -
    -
    - Search`; + return html``; } - #renderPolingTimeSelector() { return html` `; } From 91fcd24278843ae37795cb0acc2d070c4aa1e59f Mon Sep 17 00:00:00 2001 From: Julia Gru <56249914+julczka@users.noreply.github.com> Date: Fri, 3 Mar 2023 14:18:14 +0100 Subject: [PATCH 44/57] add view tabs --- .../.vscode/settings.json | 3 +- .../logviewer-root-workspace.element.ts | 41 ++++- .../workspace/logviewer-root/manifests.ts | 8 +- .../workspace/views/components/index.ts | 1 + .../log-viewer-level-tag.element.ts | 2 +- .../log-viewer-messages-list.element.ts | 158 ++++++++++++++++++ .../workspace/views/log-search.element.ts | 149 +---------------- 7 files changed, 203 insertions(+), 159 deletions(-) create mode 100644 src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/components/log-viewer-messages-list.element.ts diff --git a/src/Umbraco.Web.UI.Client/.vscode/settings.json b/src/Umbraco.Web.UI.Client/.vscode/settings.json index 30aabc0572..196b1d2b83 100644 --- a/src/Umbraco.Web.UI.Client/.vscode/settings.json +++ b/src/Umbraco.Web.UI.Client/.vscode/settings.json @@ -1,5 +1,6 @@ { "cssVariables.lookupFiles": ["node_modules/@umbraco-ui/uui-css/dist/custom-properties.css"], "cSpell.words": ["combobox", "variantable"], - "exportall.config.folderListener": ["/src/backoffice/settings/logviewer/workspace/views/components"] + "exportall.config.folderListener": [], + "exportall.config.relExclusion": [] } diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/logviewer-root/logviewer-root-workspace.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/logviewer-root/logviewer-root-workspace.element.ts index 017d04f418..189d98490f 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/logviewer-root/logviewer-root-workspace.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/logviewer-root/logviewer-root-workspace.element.ts @@ -10,6 +10,7 @@ import { umbExtensionsRegistry, createExtensionElement } from '@umbraco-cms/exte import { ManifestWorkspaceView, ManifestWorkspaceViewCollection } from '@umbraco-cms/extensions-registry'; import { UmbRouterSlotInitEvent, UmbRouterSlotChangeEvent } from '@umbraco-cms/router'; import { UmbLogViewerWorkspaceContext, UMB_APP_LOG_VIEWER_CONTEXT_TOKEN } from '../logviewer.context'; +import { repeat } from 'lit-html/directives/repeat.js'; //TODO make uui-input accept min and max values @customElement('umb-logviewer-workspace') @@ -34,13 +35,18 @@ export class UmbLogViewerWorkspaceElement extends UmbLitElement { display: flex; padding: 0 var(--uui-size-space-6); gap: var(--uui-size-space-4); - width: 100%; align-items: center; } #router-slot { height: 100%; } + + uui-tab-group { + --uui-tab-divider: var(--uui-color-border); + border-left: 1px solid var(--uui-color-border); + border-right: 1px solid var(--uui-color-border); + } `, ]; @@ -137,22 +143,39 @@ export class UmbLogViewerWorkspaceElement extends UmbLitElement { `; } + #renderViews() { + return html` + ${this._workspaceViews.length > 1 + ? html` + + ${repeat( + this._workspaceViews, + (view) => view.alias, + (view) => html` + + + ${view.meta.label || view.name} + + ` + )} + + ` + : nothing} + `; + } + render() { return html` - ${this.#renderRoutes()} + ${this.#renderViews()} ${this.#renderRoutes()} `; diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/logviewer-root/manifests.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/logviewer-root/manifests.ts index 635b8058a4..375a230dff 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/logviewer-root/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/logviewer-root/manifests.ts @@ -21,9 +21,9 @@ const workspaceViews: Array = [ weight: 300, meta: { workspaces: [workspaceAlias], - label: '', + label: 'Overview', pathname: 'overview', - icon: '', + icon: 'umb:box-alt', }, }, { @@ -34,9 +34,9 @@ const workspaceViews: Array = [ weight: 200, meta: { workspaces: [workspaceAlias], - label: '', + label: 'Search', pathname: 'search', - icon: '', + icon: 'umb:search', }, }, ]; diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/components/index.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/components/index.ts index e08b412420..16a3e7076f 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/components/index.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/components/index.ts @@ -1,3 +1,4 @@ +export * from './log-viewer-messages-list.element'; export * from './log-viewer-level-tag.element'; export * from './log-viewer-log-level-filter-menu.element'; export * from './log-viewer-message.element'; diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/components/log-viewer-level-tag.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/components/log-viewer-level-tag.element.ts index 958a291f2d..d0fc55eb86 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/components/log-viewer-level-tag.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/components/log-viewer-level-tag.element.ts @@ -1,9 +1,9 @@ import { UUITextStyles } from '@umbraco-ui/uui-css'; import { css, html, LitElement } from 'lit'; import { customElement, property } from 'lit/decorators.js'; -import { LogLevelModel } from '@umbraco-cms/backend-api'; import { ifDefined } from 'lit-html/directives/if-defined.js'; import { InterfaceColor, InterfaceLook } from '@umbraco-ui/uui-base/lib/types'; +import { LogLevelModel } from '@umbraco-cms/backend-api'; interface LevelMapStyles { look?: InterfaceLook; diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/components/log-viewer-messages-list.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/components/log-viewer-messages-list.element.ts new file mode 100644 index 0000000000..48efa35bfe --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/components/log-viewer-messages-list.element.ts @@ -0,0 +1,158 @@ +import { DirectionModel, LogMessageModel } from '@umbraco-cms/backend-api'; +import { UmbLitElement } from '@umbraco-cms/element'; +import { UUIScrollContainerElement, UUIPaginationElement } from '@umbraco-ui/uui'; +import { UUITextStyles } from '@umbraco-ui/uui-css'; +import { css, html, LitElement } from 'lit'; +import { customElement, query, state } from 'lit/decorators.js'; +import { UmbLogViewerWorkspaceContext, UMB_APP_LOG_VIEWER_CONTEXT_TOKEN } from '../../logviewer.context'; + +@customElement('umb-log-viewer-messages-list') +export class UmbLogViewerMessagesListElement extends UmbLitElement { + static styles = [ + UUITextStyles, + css` + #message-list-header { + display: flex; + font-weight: 600; + } + + #message-list-header > div { + box-sizing: border-box; + padding: 10px 20px; + display: flex; + align-items: center; + } + + #timestamp { + flex: 1 0 14ch; + } + + #level, + #machine { + flex: 1 0 14ch; + } + + #message { + flex: 6 0 14ch; + } + + #empty { + display: flex; + justify-content: center; + align-items: center; + gap: var(--uui-size-space-3); + } + + #pagination { + margin: var(--uui-size-space-5, 18px) 0; + } + `, + ]; + + @query('#logs-scroll-container') + private _logsScrollContainer!: UUIScrollContainerElement; + + @state() + private _sortingDirection: DirectionModel = DirectionModel.ASCENDING; + + @state() + private _logs: LogMessageModel[] = []; + + @state() + private _logsTotal = 0; + + #logViewerContext?: UmbLogViewerWorkspaceContext; + + constructor() { + super(); + this.consumeContext(UMB_APP_LOG_VIEWER_CONTEXT_TOKEN, (instance) => { + this.#logViewerContext = instance; + this.#observeLogs(); + this.#logViewerContext.getLogs(); + }); + } + + #observeLogs() { + if (!this.#logViewerContext) return; + + this.observe(this.#logViewerContext.logs, (logs) => { + this._logs = logs ?? []; + }); + + this.observe(this.#logViewerContext.logsTotal, (total) => { + this._logsTotal = total ?? 0; + }); + + this.observe(this.#logViewerContext.sortingDirection, (direction) => { + this._sortingDirection = direction; + }); + } + + #sortLogs() { + this.#logViewerContext?.toggleSortOrder(); + this.#logViewerContext?.setCurrentPage(1); + this.#logViewerContext?.getLogs(); + } + + _onPageChange(event: Event): void { + const current = (event.target as UUIPaginationElement).current; + this.#logViewerContext?.setCurrentPage(current); + this.#logViewerContext?.getLogs(); + this._logsScrollContainer.scrollTop = 0; + } + + private _renderPagination() { + if (!this._logsTotal) return ''; + + const totalPages = Math.ceil(this._logsTotal / 100); + + if (totalPages <= 1) return ''; + + return html``; + } + + render() { + return html` +

    Total items: ${this._logsTotal}

    +
    +
    + Timestamp + + + +
    +
    Level
    +
    Machine name
    +
    Message
    +
    + + ${this._logs.length > 0 + ? html` ${this._logs.map( + (log) => html`` + )}` + : html` + Sorry, we cannot find what you are looking for. + `} + + ${this._renderPagination()} +
    `; + } +} + +declare global { + interface HTMLElementTagNameMap { + 'umb-log-viewer-messages-list': UmbLogViewerMessagesListElement; + } +} diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/log-search.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/log-search.element.ts index 180a338044..13841fbbf3 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/log-search.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/log-search.element.ts @@ -40,162 +40,23 @@ export class UmbLogViewerSearchViewElement extends UmbLitElement { umb-log-viewer-search-input { flex: 1; } - - #message-list-header { - display: flex; - font-weight: 600; - } - - #message-list-header > div { - box-sizing: border-box; - padding: 10px 20px; - display: flex; - align-items: center; - } - - #timestamp { - flex: 1 0 14ch; - } - - #level, - #machine { - flex: 1 0 14ch; - } - - #message { - flex: 6 0 14ch; - } - - #empty { - display: flex; - justify-content: center; - align-items: center; - gap: var(--uui-size-space-3); - } - - #pagination { - margin: var(--uui-size-space-5, 18px) 0; - } `, ]; - @query('#logs-scroll-container') - private _logsScrollContainer!: UUIScrollContainerElement; - - @state() - private _sortingDirection: DirectionModel = DirectionModel.ASCENDING; - - @state() - private _logs: LogMessageModel[] = []; - - @state() - private _logsTotal = 0; - - #logViewerContext?: UmbLogViewerWorkspaceContext; - - constructor() { - super(); - this.consumeContext(UMB_APP_LOG_VIEWER_CONTEXT_TOKEN, (instance) => { - this.#logViewerContext = instance; - this.#observeStuff(); - this.#logViewerContext.getLogs(); - }); - } - - #observeStuff() { - if (!this.#logViewerContext) return; - - this.observe(this.#logViewerContext.logs, (logs) => { - this._logs = logs ?? []; - }); - - this.observe(this.#logViewerContext.logsTotal, (total) => { - this._logsTotal = total ?? 0; - }); - - this.observe(this.#logViewerContext.sortingDirection, (direction) => { - this._sortingDirection = direction; - }); - } - - #renderSearchInput() { - return html``; - } - - #renderPolingTimeSelector() { - return html` `; - } - - #sortLogs() { - this.#logViewerContext?.toggleSortOrder(); - this.#logViewerContext?.setCurrentPage(1); - this.#logViewerContext?.getLogs(); - } - render() { return html`
    - ${this.#renderPolingTimeSelector()} +
    -
    ${this.#renderSearchInput()}
    - -

    Total items: ${this._logsTotal}

    -
    -
    - Timestamp - - - -
    -
    Level
    -
    Machine name
    -
    Message
    -
    - - ${this._logs.length > 0 - ? html` ${this._logs.map( - (log) => html`` - )}` - : html` - Sorry, we cannot find what you are looking for. - `} - - ${this._renderPagination()} -
    +
    + +
    +
    `; } - - _onPageChange(event: Event): void { - const current = (event.target as UUIPaginationElement).current; - this.#logViewerContext?.setCurrentPage(current); - this.#logViewerContext?.getLogs(); - this._logsScrollContainer.scrollTop = 0; - } - - private _renderPagination() { - if (!this._logsTotal) return ''; - - const totalPages = Math.ceil(this._logsTotal / 100); - - if (totalPages <= 1) return ''; - - return html``; - } } export default UmbLogViewerSearchViewElement; From 00da3d4f7a53e33c6d061c1a90c3a56e76866f14 Mon Sep 17 00:00:00 2001 From: Julia Gru <56249914+julczka@users.noreply.github.com> Date: Fri, 3 Mar 2023 15:13:11 +0100 Subject: [PATCH 45/57] restructure overview bundle, move search box to separate component --- .../src/backoffice/backoffice.element.ts | 2 - .../workspace/data/log-search.store.ts | 47 -------- .../workspace/data/log-viewer.repository.ts | 9 +- .../logviewer/workspace/data/sources/index.ts | 9 +- .../logviewer-root-workspace.element.ts | 11 +- .../workspace/logviewer-root/manifests.ts | 4 +- .../logviewer/workspace/logviewer.context.ts | 24 +---- .../workspace/views/components/index.ts | 5 - .../views/overview/components/index.ts | 1 + ...-viewer-saved-searches-overview.element.ts | 101 ++++++++++++++++++ .../workspace/views/overview/index.ts | 4 + .../{ => overview}/log-overview.element.ts | 45 ++------ .../views/search/components/index.ts | 5 + ...og-viewer-log-level-filter-menu.element.ts | 2 +- .../components/log-viewer-message.element.ts | 2 +- .../log-viewer-messages-list.element.ts | 4 +- .../log-viewer-polling-button.element.ts | 2 +- .../log-viewer-search-input.element.ts | 2 +- .../logviewer/workspace/views/search/index.ts | 4 + .../log-search-view.element.ts} | 17 +-- .../components}/donut-chart/donut-chart.ts | 0 .../components}/donut-chart/donut-slice.ts | 0 .../components}/donut-chart/index.ts | 0 .../src/backoffice/shared/components/index.ts | 1 + 24 files changed, 145 insertions(+), 156 deletions(-) delete mode 100644 src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/data/log-search.store.ts create mode 100644 src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/overview/components/index.ts create mode 100644 src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/overview/components/log-viewer-saved-searches-overview.element.ts create mode 100644 src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/overview/index.ts rename src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/{ => overview}/log-overview.element.ts (92%) create mode 100644 src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/search/components/index.ts rename src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/{ => search}/components/log-viewer-log-level-filter-menu.element.ts (98%) rename src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/{ => search}/components/log-viewer-message.element.ts (99%) rename src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/{ => search}/components/log-viewer-messages-list.element.ts (97%) rename src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/{ => search}/components/log-viewer-polling-button.element.ts (99%) rename src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/{ => search}/components/log-viewer-search-input.element.ts (99%) create mode 100644 src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/search/index.ts rename src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/{log-search.element.ts => search/log-search-view.element.ts} (70%) rename src/Umbraco.Web.UI.Client/src/backoffice/{settings/logviewer/workspace => shared/components}/donut-chart/donut-chart.ts (100%) rename src/Umbraco.Web.UI.Client/src/backoffice/{settings/logviewer/workspace => shared/components}/donut-chart/donut-slice.ts (100%) rename src/Umbraco.Web.UI.Client/src/backoffice/{settings/logviewer/workspace => shared/components}/donut-chart/index.ts (100%) diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/backoffice.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/backoffice.element.ts index 7c03612c1b..cee5fd1db9 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/backoffice.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/backoffice.element.ts @@ -38,7 +38,6 @@ import { UmbDataTypeTreeStore } from './settings/data-types/repository/data-type import { UmbTemplateTreeStore } from './templating/templates/tree/data/template.tree.store'; import { UmbTemplateDetailStore } from './templating/templates/workspace/data/template.detail.store'; import { UmbThemeContext } from './themes/theme.context'; -import { UmbLogSearchesStore } from './settings/logviewer/workspace/data/log-search.store'; import { UmbLanguageStore } from './settings/languages/repository/language.store'; import { UMB_APP_LANGUAGE_CONTEXT_TOKEN, @@ -115,7 +114,6 @@ export class UmbBackofficeElement extends UmbLitElement { new UmbTemplateTreeStore(this); new UmbTemplateDetailStore(this); new UmbLanguageStore(this); - new UmbLogSearchesStore(this); this.provideContext(UMB_APP_LANGUAGE_CONTEXT_TOKEN, new UmbAppLanguageContext(this)); this.provideContext(UMB_BACKOFFICE_CONTEXT_TOKEN, new UmbBackofficeContext()); diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/data/log-search.store.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/data/log-search.store.ts deleted file mode 100644 index 62f8d644a5..0000000000 --- a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/data/log-search.store.ts +++ /dev/null @@ -1,47 +0,0 @@ -import { UmbContextToken } from '@umbraco-cms/context-api'; -import { ArrayState } from '@umbraco-cms/observable-api'; -import { UmbStoreBase } from '@umbraco-cms/store'; -import { UmbControllerHostInterface } from '@umbraco-cms/controller'; -import { SavedLogSearchModel } from '@umbraco-cms/backend-api'; - -/** - * @export - * @class UmbLogSearchesStore - * @extends {UmbStoreBase} - * @description - Data Store for log searches - */ -export class UmbLogSearchesStore extends UmbStoreBase { - #data = new ArrayState([], (x) => x.name); - - /** - * Creates an instance of UmbLogSearchesStore. - * @param {UmbControllerHostInterface} host - * @memberof UmbLogSearchesStore - */ - constructor(host: UmbControllerHostInterface) { - super(host, UmbLogSearchesStore.name); - } - - /** - * Append a template to the store - * @param {SavedLogSearch} search - * @memberof UmbLogSearchesStore - */ - append(search: SavedLogSearchModel) { - this.#data.append([search]); - } - - /** - * Removes templates in the store with the given uniques - * @param {string[]} searchNames - * @memberof UmbLogSearchesStore - */ - remove(searchNames: string[]) { - this.#data.remove(searchNames); - } -} - -export const UMB_LOG_SEARCHES_STORE_CONTEXT_TOKEN = new UmbContextToken( - UmbLogSearchesStore.name, - 'LogSearchesStore TOKEN XXX' -); diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/data/log-viewer.repository.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/data/log-viewer.repository.ts index a1b1612377..4b2c334529 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/data/log-viewer.repository.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/data/log-viewer.repository.ts @@ -1,5 +1,4 @@ import { UmbLogMessagesServerDataSource, UmbLogSearchesServerDataSource } from './sources/log-viewer.server.data'; -import { UmbLogSearchesStore, UMB_LOG_SEARCHES_STORE_CONTEXT_TOKEN } from './log-search.store'; import { UmbContextConsumerController } from '@umbraco-cms/context-api'; import { UmbControllerHostInterface } from '@umbraco-cms/controller'; import { UmbNotificationContext, UMB_NOTIFICATION_CONTEXT_TOKEN } from '@umbraco-cms/notification'; @@ -13,7 +12,6 @@ export class UmbLogViewerRepository { #host: UmbControllerHostInterface; #searchDataSource: UmbLogSearchesServerDataSource; #messagesDataSource: UmbLogMessagesServerDataSource; - #searchStore?: UmbLogSearchesStore; #notificationService?: UmbNotificationContext; #initResolver?: () => void; #initialized = false; @@ -23,11 +21,6 @@ export class UmbLogViewerRepository { this.#searchDataSource = new UmbLogSearchesServerDataSource(this.#host); this.#messagesDataSource = new UmbLogMessagesServerDataSource(this.#host); - new UmbContextConsumerController(this.#host, UMB_LOG_SEARCHES_STORE_CONTEXT_TOKEN, (instance) => { - this.#searchStore = instance; - this.#checkIfInitialized(); - }); - new UmbContextConsumerController(this.#host, UMB_NOTIFICATION_CONTEXT_TOKEN, (instance) => { this.#notificationService = instance; this.#checkIfInitialized(); @@ -42,7 +35,7 @@ export class UmbLogViewerRepository { } #checkIfInitialized() { - if (this.#searchStore && this.#notificationService) { + if (this.#notificationService) { this.#initialized = true; this.#initResolver?.(); } diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/data/sources/index.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/data/sources/index.ts index e01b65b3a9..518a5e18af 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/data/sources/index.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/data/sources/index.ts @@ -1,5 +1,6 @@ import { DirectionModel, + LogLevelCountsModel, LogLevelModel, PagedLoggerModel, PagedLogMessageModel, @@ -9,13 +10,7 @@ import { } from '@umbraco-cms/backend-api'; import type { DataSourceResponse } from '@umbraco-cms/models'; -interface LogLevelCountsModel { - information: number; - debug: number; - warning: number; - error: number; - fatal: number; -} + export interface LogSearchDataSource { getAllSavedSearches({ diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/logviewer-root/logviewer-root-workspace.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/logviewer-root/logviewer-root-workspace.element.ts index 189d98490f..7e6c4e1ef8 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/logviewer-root/logviewer-root-workspace.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/logviewer-root/logviewer-root-workspace.element.ts @@ -1,4 +1,3 @@ -import '../donut-chart'; import '../views/components'; import { map } from 'rxjs'; import { css, html, nothing } from 'lit'; @@ -50,9 +49,6 @@ export class UmbLogViewerWorkspaceElement extends UmbLitElement { `, ]; - @property() - public headline = 'Log Overview for Selected Time Period'; - private _alias = 'Umb.Workspace.LogviewerRoot'; @state() @@ -69,10 +65,15 @@ export class UmbLogViewerWorkspaceElement extends UmbLitElement { #logViewerContext = new UmbLogViewerWorkspaceContext(this); + constructor() { + super(); + console.log('LogViewerWorkspaceElement constructor'); + this.#logViewerContext.init(); + } + connectedCallback() { super.connectedCallback(); this._observeWorkspaceViews(); - this.#logViewerContext.init(); this.provideContext(UMB_APP_LOG_VIEWER_CONTEXT_TOKEN, this.#logViewerContext); } diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/logviewer-root/manifests.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/logviewer-root/manifests.ts index 375a230dff..c740c29aa1 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/logviewer-root/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/logviewer-root/manifests.ts @@ -17,7 +17,7 @@ const workspaceViews: Array = [ type: 'workspaceView', alias: 'Umb.WorkspaceView.Logviewer.Overview', name: 'LogViewer Root Workspace Overview View', - loader: () => import('../views/log-overview.element'), + loader: () => import('../views/overview/index'), weight: 300, meta: { workspaces: [workspaceAlias], @@ -30,7 +30,7 @@ const workspaceViews: Array = [ type: 'workspaceView', alias: 'Umb.WorkspaceView.Logviewer.Search', name: 'LogViewer Root Workspace Search View', - loader: () => import('../views/log-search.element'), + loader: () => import('../views/search/index'), weight: 200, meta: { workspaces: [workspaceAlias], diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/logviewer.context.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/logviewer.context.ts index 782ae76e43..ba3da7be80 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/logviewer.context.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/logviewer.context.ts @@ -2,6 +2,7 @@ import { UmbLogViewerRepository } from './data/log-viewer.repository'; import { ArrayState, createObservablePart, DeepState, ObjectState, StringState } from '@umbraco-cms/observable-api'; import { DirectionModel, + LogLevelCountsModel, LogLevelModel, PagedLogMessageModel, PagedLogTemplateModel, @@ -11,16 +12,6 @@ import { UmbControllerHostInterface } from '@umbraco-cms/controller'; import { UmbContextToken } from '@umbraco-cms/context-api'; import { BasicState } from 'libs/observable-api/basic-state'; -const logLevels = { - Information: 171, - Debug: 39, - Warning: 31, - Error: 1, - Fatal: 0, -}; - -export type LogLevel = Record; - export type PoolingInterval = 0 | 2000 | 5000 | 10000 | 20000 | 30000; export interface PoolingCOnfig { enabled: boolean; @@ -61,7 +52,7 @@ export class UmbLogViewerWorkspaceContext { #savedSearches = new DeepState(undefined); savedSearches = createObservablePart(this.#savedSearches, (data) => data?.items); - #logCount = new DeepState(null); + #logCount = new DeepState(null); logCount = createObservablePart(this.#logCount, (data) => data); #dateRange = new DeepState(this.defaultDateRange); @@ -96,15 +87,8 @@ export class UmbLogViewerWorkspaceContext { } async init() { - try { - await Promise.all([ - this.getMessageTemplates(0, 10), - this.getLogCount(this.defaultDateRange), - this.getSavedSearches(), - ]); - } catch (error) { - console.error(error); - } + this.getMessageTemplates(0, 10); + this.getLogCount(this.defaultDateRange); } setDateRange(dateRange: LogViewerDateRange) { diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/components/index.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/components/index.ts index 16a3e7076f..7d089a3a1e 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/components/index.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/components/index.ts @@ -1,6 +1 @@ -export * from './log-viewer-messages-list.element'; export * from './log-viewer-level-tag.element'; -export * from './log-viewer-log-level-filter-menu.element'; -export * from './log-viewer-message.element'; -export * from './log-viewer-polling-button.element'; -export * from './log-viewer-search-input.element'; diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/overview/components/index.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/overview/components/index.ts new file mode 100644 index 0000000000..451adfc39f --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/overview/components/index.ts @@ -0,0 +1 @@ +export * from './log-viewer-saved-searches-overview.element'; diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/overview/components/log-viewer-saved-searches-overview.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/overview/components/log-viewer-saved-searches-overview.element.ts new file mode 100644 index 0000000000..588e51bd9f --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/overview/components/log-viewer-saved-searches-overview.element.ts @@ -0,0 +1,101 @@ +import { UUITextStyles } from '@umbraco-ui/uui-css'; +import { css, html } from 'lit'; +import { customElement, state } from 'lit/decorators.js'; +import { UmbLogViewerWorkspaceContext, UMB_APP_LOG_VIEWER_CONTEXT_TOKEN } from '../../../logviewer.context'; +import { UmbLitElement } from '@umbraco-cms/element'; +import { SavedLogSearchModel } from '@umbraco-cms/backend-api'; + +//TODO: implement the saved searches pagination when the API total bug is fixed +@customElement('umb-log-viewer-saved-searches-overview') +export class UmbLogViewerSavedSearchesOverviewElement extends UmbLitElement { + static styles = [ + UUITextStyles, + css` + uui-box { + height: 100%; + } + + ul { + list-style: none; + margin: 0; + padding: 0; + border: 0; + font-size: 100%; + font: inherit; + vertical-align: baseline; + } + + li { + display: flex; + align-items: center; + } + + li uui-icon { + margin-right: 1em; + } + `, + ]; + + @state() + private _savedSearches: SavedLogSearchModel[] = []; + + #logViewerContext?: UmbLogViewerWorkspaceContext; + constructor() { + super(); + this.consumeContext(UMB_APP_LOG_VIEWER_CONTEXT_TOKEN, (instance) => { + this.#logViewerContext = instance; + this.#logViewerContext?.getSavedSearches(); + this.#observeStuff(); + }); + } + + #observeStuff() { + if (!this.#logViewerContext) return; + this.observe(this.#logViewerContext.savedSearches, (savedSearches) => { + this._savedSearches = savedSearches ?? []; + }); + } + + #setCurrentQuery(query: string) { + this.#logViewerContext?.setFilterExpression(query); + } + + #renderSearchItem = (searchListItem: SavedLogSearchModel) => { + return html`
  • + { + this.#setCurrentQuery(searchListItem.query ?? ''); + }} + label="${searchListItem.name ?? ''}" + title="${searchListItem.name ?? ''}" + href=${'/section/settings/logviewer/search?lq=' + searchListItem.query} + >${searchListItem.name} +
  • `; + }; + + render() { + return html` +
      +
    • + { + this.#setCurrentQuery(''); + }} + label="All logs" + title="All logs" + href="/section/settings/logviewer/search" + >All logs +
    • + ${this._savedSearches.map(this.#renderSearchItem)} +
    +
    `; + } +} + +declare global { + interface HTMLElementTagNameMap { + 'umb-log-viewer-saved-searches-overview': UmbLogViewerSavedSearchesOverviewElement; + } +} diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/overview/index.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/overview/index.ts new file mode 100644 index 0000000000..58b61b81b7 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/overview/index.ts @@ -0,0 +1,4 @@ +import './components'; +import { UmbLogViewerOverviewViewElement } from './log-overview.element'; + +export default UmbLogViewerOverviewViewElement; diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/log-overview.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/overview/log-overview.element.ts similarity index 92% rename from src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/log-overview.element.ts rename to src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/overview/log-overview.element.ts index 933cf0825c..23c77ee392 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/log-overview.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/overview/log-overview.element.ts @@ -1,7 +1,12 @@ import { css, html } from 'lit'; import { customElement, state } from 'lit/decorators.js'; import { clamp } from 'lodash-es'; -import { LogLevel, LogViewerDateRange, UmbLogViewerWorkspaceContext, UMB_APP_LOG_VIEWER_CONTEXT_TOKEN } from '../logviewer.context'; +import { + LogLevel, + LogViewerDateRange, + UmbLogViewerWorkspaceContext, + UMB_APP_LOG_VIEWER_CONTEXT_TOKEN, +} from '../../logviewer.context'; import { SavedLogSearchModel, PagedLogTemplateModel } from '@umbraco-cms/backend-api'; import { UmbLitElement } from '@umbraco-cms/element'; @@ -75,7 +80,6 @@ export class UmbLogViewerOverviewViewElement extends UmbLitElement { var(--uui-size-space-5, 18px); } - #saved-searches-container > uui-box, #common-messages-container > uui-box { height: 100%; } @@ -101,25 +105,6 @@ export class UmbLogViewerOverviewViewElement extends UmbLitElement { border-color: var(--uui-color-danger); } - ul { - list-style: none; - margin: 0; - padding: 0; - border: 0; - font-size: 100%; - font: inherit; - vertical-align: baseline; - } - - li { - display: flex; - align-items: center; - } - - li uui-icon { - margin-right: 1em; - } - uui-table-cell { padding: 10px 20px; height: unset; @@ -401,21 +386,7 @@ export class UmbLogViewerOverviewViewElement extends UmbLitElement {
    - -
      -
    • - { - this.setCurrentQuery(''); - }} - label="All logs" - title="All logs" - href="/section/settings/logviewer/search" - >All logs -
    • - ${this._savedSearches.map(this.renderSearchItem)}
    -
    +
    @@ -454,8 +425,6 @@ export class UmbLogViewerOverviewViewElement extends UmbLitElement { } } -export default UmbLogViewerOverviewViewElement; - declare global { interface HTMLElementTagNameMap { 'umb-log-viewer-overview-view': UmbLogViewerOverviewViewElement; diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/search/components/index.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/search/components/index.ts new file mode 100644 index 0000000000..2157e5df73 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/search/components/index.ts @@ -0,0 +1,5 @@ +export * from './log-viewer-log-level-filter-menu.element'; +export * from './log-viewer-message.element'; +export * from './log-viewer-messages-list.element'; +export * from './log-viewer-polling-button.element'; +export * from './log-viewer-search-input.element'; diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/components/log-viewer-log-level-filter-menu.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/search/components/log-viewer-log-level-filter-menu.element.ts similarity index 98% rename from src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/components/log-viewer-log-level-filter-menu.element.ts rename to src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/search/components/log-viewer-log-level-filter-menu.element.ts index 3a7cb253dc..dc72dcec91 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/components/log-viewer-log-level-filter-menu.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/search/components/log-viewer-log-level-filter-menu.element.ts @@ -3,7 +3,7 @@ import { UUITextStyles } from '@umbraco-ui/uui-css'; import { css, html } from 'lit'; import { customElement, queryAll, state } from 'lit/decorators.js'; import _ from 'lodash'; -import { UmbLogViewerWorkspaceContext, UMB_APP_LOG_VIEWER_CONTEXT_TOKEN } from '../../logviewer.context'; +import { UmbLogViewerWorkspaceContext, UMB_APP_LOG_VIEWER_CONTEXT_TOKEN } from '../../../logviewer.context'; import { LogLevelModel } from '@umbraco-cms/backend-api'; import { UmbLitElement } from '@umbraco-cms/element'; diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/components/log-viewer-message.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/search/components/log-viewer-message.element.ts similarity index 99% rename from src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/components/log-viewer-message.element.ts rename to src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/search/components/log-viewer-message.element.ts index 7209d51872..8bc5edb9c6 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/components/log-viewer-message.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/search/components/log-viewer-message.element.ts @@ -1,7 +1,7 @@ import { UUITextStyles } from '@umbraco-ui/uui-css'; import { css, html, PropertyValueMap } from 'lit'; import { customElement, property, query, state } from 'lit/decorators.js'; -import { UmbLogViewerWorkspaceContext, UMB_APP_LOG_VIEWER_CONTEXT_TOKEN } from '../../logviewer.context'; +import { UmbLogViewerWorkspaceContext, UMB_APP_LOG_VIEWER_CONTEXT_TOKEN } from '../../../logviewer.context'; import { LogLevelModel, LogMessagePropertyModel } from '@umbraco-cms/backend-api'; import { UmbLitElement } from '@umbraco-cms/element'; diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/components/log-viewer-messages-list.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/search/components/log-viewer-messages-list.element.ts similarity index 97% rename from src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/components/log-viewer-messages-list.element.ts rename to src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/search/components/log-viewer-messages-list.element.ts index 48efa35bfe..4bccce5cb7 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/components/log-viewer-messages-list.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/search/components/log-viewer-messages-list.element.ts @@ -2,9 +2,9 @@ import { DirectionModel, LogMessageModel } from '@umbraco-cms/backend-api'; import { UmbLitElement } from '@umbraco-cms/element'; import { UUIScrollContainerElement, UUIPaginationElement } from '@umbraco-ui/uui'; import { UUITextStyles } from '@umbraco-ui/uui-css'; -import { css, html, LitElement } from 'lit'; +import { css, html } from 'lit'; import { customElement, query, state } from 'lit/decorators.js'; -import { UmbLogViewerWorkspaceContext, UMB_APP_LOG_VIEWER_CONTEXT_TOKEN } from '../../logviewer.context'; +import { UmbLogViewerWorkspaceContext, UMB_APP_LOG_VIEWER_CONTEXT_TOKEN } from '../../../logviewer.context'; @customElement('umb-log-viewer-messages-list') export class UmbLogViewerMessagesListElement extends UmbLitElement { diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/components/log-viewer-polling-button.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/search/components/log-viewer-polling-button.element.ts similarity index 99% rename from src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/components/log-viewer-polling-button.element.ts rename to src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/search/components/log-viewer-polling-button.element.ts index 2a579bd1a6..5ee674f1d4 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/components/log-viewer-polling-button.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/search/components/log-viewer-polling-button.element.ts @@ -7,7 +7,7 @@ import { PoolingInterval, UmbLogViewerWorkspaceContext, UMB_APP_LOG_VIEWER_CONTEXT_TOKEN, -} from '../../logviewer.context'; +} from '../../../logviewer.context'; import { UmbLitElement } from '@umbraco-cms/element'; @customElement('umb-log-viewer-polling-button') diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/components/log-viewer-search-input.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/search/components/log-viewer-search-input.element.ts similarity index 99% rename from src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/components/log-viewer-search-input.element.ts rename to src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/search/components/log-viewer-search-input.element.ts index 3836a896f2..c4ca1a8ffa 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/components/log-viewer-search-input.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/search/components/log-viewer-search-input.element.ts @@ -2,7 +2,7 @@ import { UUIInputElement, UUIPopoverElement, UUISymbolExpandElement } from '@umb import { UUITextStyles } from '@umbraco-ui/uui-css'; import { css, html } from 'lit'; import { customElement, query, state } from 'lit/decorators.js'; -import { UmbLogViewerWorkspaceContext, UMB_APP_LOG_VIEWER_CONTEXT_TOKEN } from '../../logviewer.context'; +import { UmbLogViewerWorkspaceContext, UMB_APP_LOG_VIEWER_CONTEXT_TOKEN } from '../../../logviewer.context'; import { SavedLogSearchModel } from '@umbraco-cms/backend-api'; import { UmbLitElement } from '@umbraco-cms/element'; diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/search/index.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/search/index.ts new file mode 100644 index 0000000000..4760a61f5a --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/search/index.ts @@ -0,0 +1,4 @@ +import './components'; +import { UmbLogViewerSearchViewElement } from './log-search-view.element'; + +export default UmbLogViewerSearchViewElement; diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/log-search.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/search/log-search-view.element.ts similarity index 70% rename from src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/log-search.element.ts rename to src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/search/log-search-view.element.ts index 13841fbbf3..42dcc2fce1 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/log-search.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/search/log-search-view.element.ts @@ -1,19 +1,6 @@ import { UUITextStyles } from '@umbraco-ui/uui-css'; import { css, html } from 'lit'; -import { customElement, state, query } from 'lit/decorators.js'; -import { - UUIInputElement, - UUIPaginationElement, - UUIPopoverElement, - UUIScrollContainerElement, - UUISymbolExpandElement, -} from '@umbraco-ui/uui'; -import { - LogViewerDateRange, - UmbLogViewerWorkspaceContext, - UMB_APP_LOG_VIEWER_CONTEXT_TOKEN, -} from '../logviewer.context'; -import { DirectionModel, LogMessageModel, SavedLogSearchModel } from '@umbraco-cms/backend-api'; +import { customElement } from 'lit/decorators.js'; import { UmbLitElement } from '@umbraco-cms/element'; @customElement('umb-log-viewer-search-view') @@ -59,8 +46,6 @@ export class UmbLogViewerSearchViewElement extends UmbLitElement { } } -export default UmbLogViewerSearchViewElement; - declare global { interface HTMLElementTagNameMap { 'umb-log-viewer-search-view': UmbLogViewerSearchViewElement; diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/donut-chart/donut-chart.ts b/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/donut-chart/donut-chart.ts similarity index 100% rename from src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/donut-chart/donut-chart.ts rename to src/Umbraco.Web.UI.Client/src/backoffice/shared/components/donut-chart/donut-chart.ts diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/donut-chart/donut-slice.ts b/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/donut-chart/donut-slice.ts similarity index 100% rename from src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/donut-chart/donut-slice.ts rename to src/Umbraco.Web.UI.Client/src/backoffice/shared/components/donut-chart/donut-slice.ts diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/donut-chart/index.ts b/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/donut-chart/index.ts similarity index 100% rename from src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/donut-chart/index.ts rename to src/Umbraco.Web.UI.Client/src/backoffice/shared/components/donut-chart/index.ts diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/index.ts b/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/index.ts index 53be448e4c..c39083657c 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/index.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/index.ts @@ -10,6 +10,7 @@ import './backoffice-frame/backoffice-notification-container.element'; import './button-with-dropdown/button-with-dropdown.element'; import './code-block/code-block.element'; import './debug/debug.element'; +import './donut-chart'; import './dropdown/dropdown.element'; import './empty-state/empty-state.element'; import './extension-slot/extension-slot.element'; From bb9abb972ee91651bc87aa4d491542fe64d584b0 Mon Sep 17 00:00:00 2001 From: Julia Gru <56249914+julczka@users.noreply.github.com> Date: Fri, 3 Mar 2023 16:04:09 +0100 Subject: [PATCH 46/57] move date picker to a separate component add date picker to search view --- .../logviewer-root-workspace.element.ts | 1 - .../logviewer/workspace/logviewer.context.ts | 1 - .../workspace/views/components/index.ts | 1 + .../log-viewer-date-range-selector.element.ts | 132 ++++++++++++ .../views/overview/components/index.ts | 1 + ...ewer-message-templates-overview.element.ts | 124 +++++++++++ .../workspace/views/overview/index.ts | 2 +- ...lement.ts => log-overview-view.element.ts} | 194 +++--------------- .../views/search/log-search-view.element.ts | 14 +- 9 files changed, 300 insertions(+), 170 deletions(-) create mode 100644 src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/components/log-viewer-date-range-selector.element.ts create mode 100644 src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/overview/components/log-viewer-message-templates-overview.element.ts rename src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/overview/{log-overview.element.ts => log-overview-view.element.ts} (57%) diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/logviewer-root/logviewer-root-workspace.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/logviewer-root/logviewer-root-workspace.element.ts index 7e6c4e1ef8..6e65aee319 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/logviewer-root/logviewer-root-workspace.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/logviewer-root/logviewer-root-workspace.element.ts @@ -67,7 +67,6 @@ export class UmbLogViewerWorkspaceElement extends UmbLitElement { constructor() { super(); - console.log('LogViewerWorkspaceElement constructor'); this.#logViewerContext.init(); } diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/logviewer.context.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/logviewer.context.ts index ba3da7be80..fd00a80746 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/logviewer.context.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/logviewer.context.ts @@ -87,7 +87,6 @@ export class UmbLogViewerWorkspaceContext { } async init() { - this.getMessageTemplates(0, 10); this.getLogCount(this.defaultDateRange); } diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/components/index.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/components/index.ts index 7d089a3a1e..07f569571e 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/components/index.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/components/index.ts @@ -1 +1,2 @@ +export * from './log-viewer-date-range-selector.element'; export * from './log-viewer-level-tag.element'; diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/components/log-viewer-date-range-selector.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/components/log-viewer-date-range-selector.element.ts new file mode 100644 index 0000000000..045bb0f849 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/components/log-viewer-date-range-selector.element.ts @@ -0,0 +1,132 @@ +import { UUITextStyles } from '@umbraco-ui/uui-css'; +import { css, html } from 'lit'; +import { customElement, property, queryAll, state } from 'lit/decorators.js'; +import { + LogViewerDateRange, + UmbLogViewerWorkspaceContext, + UMB_APP_LOG_VIEWER_CONTEXT_TOKEN, +} from '../../logviewer.context'; +import { UmbLitElement } from '@umbraco-cms/element'; +import { query } from 'router-slot'; + +@customElement('umb-log-viewer-date-range-selector') +export class UmbLogViewerDateRangeSelectorElement extends UmbLitElement { + static styles = [ + UUITextStyles, + css` + :host { + display: flex; + flex-direction: column; + gap: var(--uui-size-space-3); + } + + input { + font-family: inherit; + padding: var(--uui-size-1) var(--uui-size-space-3); + font-size: inherit; + color: inherit; + border-radius: 0; + box-sizing: border-box; + border: none; + background: none; + width: 100%; + height: 100%; + outline: none; + position: relative; + border-bottom: 2px solid transparent; + } + + /* find out better validation for that */ + input:out-of-range { + border-color: var(--uui-color-danger); + } + + :host([horizontal]) .input-container { + display: flex; + align-items: baseline; + } + `, + ]; + + @state() + private _startDate = ''; + + @state() + private _endDate = ''; + + @queryAll('input') + private _inputs!: NodeListOf; + + @property({ type: Boolean, reflect: true }) + horizontal = false; + + #logViewerContext?: UmbLogViewerWorkspaceContext; + constructor() { + super(); + this.addEventListener('input', this.#setDates); + this.consumeContext(UMB_APP_LOG_VIEWER_CONTEXT_TOKEN, (instance) => { + this.#logViewerContext = instance; + this.#logViewerContext?.getMessageTemplates(0, 10); + this.#observeStuff(); + }); + } + + #observeStuff() { + if (!this.#logViewerContext) return; + this.observe(this.#logViewerContext.dateRange, (dateRange: LogViewerDateRange) => { + this._startDate = dateRange?.startDate; + this._endDate = dateRange?.endDate; + }); + } + + #setDates() { + this._inputs.forEach((input) => { + if (input.id === 'start-date') { + this._startDate = input.value; + } else if (input.id === 'end-date') { + this._endDate = input.value; + } + }); + const newDateRange: LogViewerDateRange = { startDate: this._startDate, endDate: this._endDate }; + this.#logViewerContext?.setDateRange(newDateRange); + } + + render() { + return html` +
    + From: + { + (e.target as HTMLInputElement).showPicker(); + }} + + id="start-date" + type="date" + label="From" + .max=${this.#logViewerContext?.today ?? ''} + .value=${this._startDate}> + +
    +
    + To: + { + (e.target as HTMLInputElement).showPicker(); + }} + id="end-date" + type="date" + label="To" + .min=${this._startDate} + .max=${this.#logViewerContext?.today ?? ''} + .value=${this._endDate}> + +
    + `; + } +} + +declare global { + interface HTMLElementTagNameMap { + 'umb-log-viewer-date-range-selector': UmbLogViewerDateRangeSelectorElement; + } +} diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/overview/components/index.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/overview/components/index.ts index 451adfc39f..704f2198b2 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/overview/components/index.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/overview/components/index.ts @@ -1 +1,2 @@ export * from './log-viewer-saved-searches-overview.element'; +export * from './log-viewer-message-templates-overview.element'; \ No newline at end of file diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/overview/components/log-viewer-message-templates-overview.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/overview/components/log-viewer-message-templates-overview.element.ts new file mode 100644 index 0000000000..5c9cd6f754 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/overview/components/log-viewer-message-templates-overview.element.ts @@ -0,0 +1,124 @@ +import { UUITextStyles } from '@umbraco-ui/uui-css'; +import { css, html } from 'lit'; +import { customElement, state } from 'lit/decorators.js'; +import { UmbLogViewerWorkspaceContext, UMB_APP_LOG_VIEWER_CONTEXT_TOKEN } from '../../../logviewer.context'; +import { UmbLitElement } from '@umbraco-cms/element'; +import { PagedLogTemplateModel, SavedLogSearchModel } from '@umbraco-cms/backend-api'; + +//TODO: fix pagination bug when API is fixed +@customElement('umb-log-viewer-message-templates-overview') +export class UmbLogViewerMessageTemplatesOverviewElement extends UmbLitElement { + static styles = [ + UUITextStyles, + css` + #show-more-templates-btn { + margin-top: var(--uui-size-space-5); + } + + a { + display: flex; + align-items: center; + justify-content: space-between; + text-decoration: none; + color: inherit; + } + + uui-table-cell { + padding: 10px 20px; + height: unset; + } + + uui-table-row { + cursor: pointer; + } + + uui-table-row:hover > uui-table-cell { + background-color: var(--uui-color-surface-alt); + } + `, + ]; + + @state() + private _messageTemplates: PagedLogTemplateModel | null = null; + + #logViewerContext?: UmbLogViewerWorkspaceContext; + constructor() { + super(); + this.consumeContext(UMB_APP_LOG_VIEWER_CONTEXT_TOKEN, (instance) => { + this.#logViewerContext = instance; + this.#logViewerContext?.getMessageTemplates(0, 10); + this.#observeStuff(); + }); + } + + #observeStuff() { + if (!this.#logViewerContext) return; + this.observe(this.#logViewerContext.messageTemplates, (templates) => { + this._messageTemplates = templates ?? null; + }); + } + + #getMessageTemplates() { + const take = this._messageTemplates?.items?.length ?? 0; + this.#logViewerContext?.getMessageTemplates(0, take + 10); + } + + #renderSearchItem = (searchListItem: SavedLogSearchModel) => { + return html`
  • + { + this.#setCurrentQuery(searchListItem.query ?? ''); + }} + label="${searchListItem.name ?? ''}" + title="${searchListItem.name ?? ''}" + href=${'/section/settings/logviewer/search?lq=' + searchListItem.query} + >${searchListItem.name} +
  • `; + }; + + #setCurrentQuery = (query: string) => { + this.#logViewerContext?.setFilterExpression(query); + }; + + render() { + return html` + +

    Total Unique Message types: ${this._messageTemplates?.total}

    + + + ${this._messageTemplates + ? this._messageTemplates.items.map( + (template) => + html` +
    { + this.#setCurrentQuery(`@MessageTemplate='${template.messageTemplate}'` ?? ''); + }} + href=${'/section/settings/logviewer/search?lg=@MessageTemplate%3D' + template.messageTemplate}> + ${template.messageTemplate} ${template.count} + + + ` + ) + : ''} + + + Show more + + `; + } +} + +declare global { + interface HTMLElementTagNameMap { + 'umb-log-viewer-message-templates-overview': UmbLogViewerMessageTemplatesOverviewElement; + } +} diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/overview/index.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/overview/index.ts index 58b61b81b7..cf7acfb3b9 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/overview/index.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/overview/index.ts @@ -1,4 +1,4 @@ import './components'; -import { UmbLogViewerOverviewViewElement } from './log-overview.element'; +import { UmbLogViewerOverviewViewElement } from './log-overview-view.element'; export default UmbLogViewerOverviewViewElement; diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/overview/log-overview.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/overview/log-overview-view.element.ts similarity index 57% rename from src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/overview/log-overview.element.ts rename to src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/overview/log-overview-view.element.ts index 23c77ee392..cfd2b54034 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/overview/log-overview.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/overview/log-overview-view.element.ts @@ -2,12 +2,11 @@ import { css, html } from 'lit'; import { customElement, state } from 'lit/decorators.js'; import { clamp } from 'lodash-es'; import { - LogLevel, LogViewerDateRange, UmbLogViewerWorkspaceContext, UMB_APP_LOG_VIEWER_CONTEXT_TOKEN, } from '../../logviewer.context'; -import { SavedLogSearchModel, PagedLogTemplateModel } from '@umbraco-cms/backend-api'; +import { LogLevelCountsModel } from '@umbraco-cms/backend-api'; import { UmbLitElement } from '@umbraco-cms/element'; //TODO: add a disabled attribute to the show more button when the total number of items is correctly returned from the endpoint @@ -84,40 +83,6 @@ export class UmbLogViewerOverviewViewElement extends UmbLitElement { height: 100%; } - input { - font-family: inherit; - padding: var(--uui-size-1) var(--uui-size-space-3); - font-size: inherit; - color: inherit; - border-radius: 0; - box-sizing: border-box; - border: none; - background: none; - width: 100%; - text-align: inherit; - outline: none; - position: relative; - border-bottom: 2px solid transparent; - } - - /* find out better validation for that */ - input:out-of-range { - border-color: var(--uui-color-danger); - } - - uui-table-cell { - padding: 10px 20px; - height: unset; - } - - uui-table-row { - cursor: pointer; - } - - uui-table-row:hover > uui-table-cell { - background-color: var(--uui-color-surface-alt); - } - uui-label:nth-of-type(2) { display: block; margin-top: var(--uui-size-space-5); @@ -154,18 +119,6 @@ export class UmbLogViewerOverviewViewElement extends UmbLitElement { border-radius: 50%; } - #show-more-templates-btn { - margin-top: var(--uui-size-space-5); - } - - a { - display: flex; - align-items: center; - justify-content: space-between; - text-decoration: none; - color: inherit; - } - #error-count { font-size: 4rem; text-align: center; @@ -174,12 +127,6 @@ export class UmbLogViewerOverviewViewElement extends UmbLitElement { `, ]; - @state() - private _savedSearches: SavedLogSearchModel[] = []; - - @state() - private _messageTemplates: PagedLogTemplateModel | null = null; - @state() private _totalLogCount = 0; @@ -193,7 +140,7 @@ export class UmbLogViewerOverviewViewElement extends UmbLitElement { private logLevelCount: [string, number][] = []; @state() - private _logLevelCount: LogLevel | null = null; + private _logLevelCount: LogLevelCountsModel | null = null; @state() private _startDate = ''; @@ -221,20 +168,13 @@ export class UmbLogViewerOverviewViewElement extends UmbLitElement { #observeStuff() { if (!this.#logViewerContext) return; - this.observe(this.#logViewerContext.savedSearches, (savedSearches) => { - this._savedSearches = savedSearches ?? []; - }); this.observe(this.#logViewerContext.logCount, (logLevel) => { this._logLevelCount = logLevel ?? null; - this._errorCount = this._logLevelCount?.Error ?? 0; + this._errorCount = this._logLevelCount?.error ?? 0; this.setLogLevelCount(); }); - this.observe(this.#logViewerContext.messageTemplates, (templates) => { - this._messageTemplates = templates ?? null; - }); - this.observe(this.#logViewerContext.dateRange, (dateRange: LogViewerDateRange) => { this._startDate = dateRange?.startDate; this._endDate = dateRange?.endDate; @@ -250,11 +190,6 @@ export class UmbLogViewerOverviewViewElement extends UmbLitElement { } } - async #getMessageTemplates() { - const take = this._messageTemplates?.items?.length ?? 0; - await this.#logViewerContext?.getMessageTemplates(0, take + 10); - } - #calculatePercentage(partialValue: number) { if (this._totalLogCount === 0) return 0; const percent = Math.round((100 * partialValue) / this._totalLogCount); @@ -272,20 +207,6 @@ export class UmbLogViewerOverviewViewElement extends UmbLitElement { this.#logViewerContext?.setDateRange(newDateRange); } - renderSearchItem = (searchListItem: SavedLogSearchModel) => { - return html`
  • - { - this.setCurrentQuery(searchListItem.query ?? ''); - }} - label="${searchListItem.name}" - title="${searchListItem.name}" - href=${'/section/settings/logviewer/search?lq=' + searchListItem.query} - >${searchListItem.name} -
  • `; - }; - #setCountFilter(level: string) { if (this._logLevelCountFilter.includes(level)) { this._logLevelCountFilter = this._logLevelCountFilter.filter((item) => item !== level); @@ -300,37 +221,11 @@ export class UmbLogViewerOverviewViewElement extends UmbLitElement { } render() { - return html` - + return html`
    - -
    - From: - { - (e.target as HTMLInputElement).showPicker(); - }} - id="start-date" - type="date" - label="From" - .max=${this.#logViewerContext?.today ?? ''} - .value=${this._startDate}> - - To: - { - (e.target as HTMLInputElement).showPicker(); - }} - id="end-date" - type="date" - label="To" - .min=${this._startDate} - .max=${this.#logViewerContext?.today ?? ''} - .value=${this._endDate}> - -
    +
    @@ -338,38 +233,34 @@ export class UmbLogViewerOverviewViewElement extends UmbLitElement { -

    Info

    - +

    Info

      - ${ - this._logLevelCount - ? Object.keys(this._logLevelCount).map( - (level) => - html`
    • - -
    • ` - ) - : '' - } + ${this._logLevelCount + ? Object.keys(this._logLevelCount).map( + (level) => + html`
    • + +
    • ` + ) + : ''}
    - ${ - this._logLevelCount + ${this._logLevelCount ? this.logLevelCount.map( ([level, number]) => html` ` ) - : '' - } + : ''}
    - +
    - -

    Total Unique Message types: ${this._messageTemplates?.total}

    - - - ${ - this._messageTemplates - ? this._messageTemplates.items.map( - (template) => - html` - { - this.setCurrentQuery(`@MessageTemplate='${template.messageTemplate}'` ?? ''); - }} - href=${'/section/settings/logviewer/search?lg=@MessageTemplate%3D' + - template.messageTemplate}> - ${template.messageTemplate} ${template.count} - - - ` - ) - : '' - } - - - Show more -
    +
    -`; + `; } } diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/search/log-search-view.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/search/log-search-view.element.ts index 42dcc2fce1..2696aab4cf 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/search/log-search-view.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/search/log-search-view.element.ts @@ -24,9 +24,18 @@ export class UmbLogViewerSearchViewElement extends UmbLitElement { justify-content: space-between; } + #dates-polling-container { + display: flex; + align-items: baseline; + } + umb-log-viewer-search-input { flex: 1; } + + umb-log-viewer-date-range-selector { + flex-direction: row; + } `, ]; @@ -35,7 +44,10 @@ export class UmbLogViewerSearchViewElement extends UmbLitElement {
    - +
    + + +
    From 02146b338943f04ed8ed9a0831ce0fddfec8be74 Mon Sep 17 00:00:00 2001 From: Julia Gru <56249914+julczka@users.noreply.github.com> Date: Fri, 3 Mar 2023 16:36:13 +0100 Subject: [PATCH 47/57] move percentage calculations to chart component --- .../views/overview/components/index.ts | 3 +- .../log-viewer-log-types-chart.element.ts | 168 ++++++++++++++++++ .../overview/log-overview-view.element.ts | 141 +-------------- .../components/donut-chart/donut-chart.ts | 15 +- 4 files changed, 184 insertions(+), 143 deletions(-) create mode 100644 src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/overview/components/log-viewer-log-types-chart.element.ts diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/overview/components/index.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/overview/components/index.ts index 704f2198b2..95f7c15a2c 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/overview/components/index.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/overview/components/index.ts @@ -1,2 +1,3 @@ export * from './log-viewer-saved-searches-overview.element'; -export * from './log-viewer-message-templates-overview.element'; \ No newline at end of file +export * from './log-viewer-message-templates-overview.element'; +export * from './log-viewer-log-types-chart.element'; \ No newline at end of file diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/overview/components/log-viewer-log-types-chart.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/overview/components/log-viewer-log-types-chart.element.ts new file mode 100644 index 0000000000..7e676037a4 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/overview/components/log-viewer-log-types-chart.element.ts @@ -0,0 +1,168 @@ +import { UUITextStyles } from '@umbraco-ui/uui-css'; +import { css, html } from 'lit'; +import { customElement, state } from 'lit/decorators.js'; +import { clamp } from 'lodash-es'; +import { UmbLogViewerWorkspaceContext, UMB_APP_LOG_VIEWER_CONTEXT_TOKEN } from '../../../logviewer.context'; +import { UmbLitElement } from '@umbraco-cms/element'; +import { LogLevelCountsModel } from '@umbraco-cms/backend-api'; + +@customElement('umb-log-viewer-log-types-chart') +export class UmbLogViewerLogTypesChartElement extends UmbLitElement { + static styles = [ + UUITextStyles, + css` + #log-types-container { + display: flex; + gap: var(--uui-size-space-4); + flex-direction: column-reverse; + align-items: center; + justify-content: space-between; + } + + button { + all: unset; + display: flex; + align-items: center; + cursor: pointer; + } + + button:focus { + outline: 1px solid var(--uui-color-focus); + } + + button.active { + text-decoration: line-through; + } + + #chart { + width: 150px; + aspect-ratio: 1; + background: radial-gradient(white 40%, transparent 41%), + conic-gradient( + var(--umb-log-viewer-debug-color) 0% 20%, + var(--umb-log-viewer-information-color) 20% 40%, + var(--umb-log-viewer-warning-color) 40% 60%, + var(--umb-log-viewer-error-color) 60% 80%, + var(--umb-log-viewer-fatal-color) 80% 100% + ); + margin: 10px; + display: inline-block; + border-radius: 50%; + } + + ul { + list-style: none; + margin: 0; + padding: 0; + border: 0; + font-size: 100%; + font: inherit; + vertical-align: baseline; + } + + li { + display: flex; + align-items: center; + } + + li uui-icon { + margin-right: 1em; + } + `, + ]; + + #logViewerContext?: UmbLogViewerWorkspaceContext; + constructor() { + super(); + this.consumeContext(UMB_APP_LOG_VIEWER_CONTEXT_TOKEN, (instance) => { + this.#logViewerContext = instance; + this.#logViewerContext?.getMessageTemplates(0, 10); + this.#observeStuff(); + }); + } + + @state() + private _logLevelCount: LogLevelCountsModel | null = null; + + @state() + private logLevelCount: [string, number][] = []; + + @state() + private _logLevelCountFilter: string[] = []; + + protected willUpdate(_changedProperties: Map): void { + if (_changedProperties.has('_logLevelCountFilter')) { + this.setLogLevelCount(); + } + } + + #setCountFilter(level: string) { + if (this._logLevelCountFilter.includes(level)) { + this._logLevelCountFilter = this._logLevelCountFilter.filter((item) => item !== level); + return; + } + + this._logLevelCountFilter = [...this._logLevelCountFilter, level]; + } + + setLogLevelCount() { + this.logLevelCount = this._logLevelCount + ? Object.entries(this._logLevelCount).filter(([level, number]) => !this._logLevelCountFilter.includes(level)) + : []; + } + + #observeStuff() { + if (!this.#logViewerContext) return; + this.observe(this.#logViewerContext.logCount, (logLevel) => { + this._logLevelCount = logLevel ?? null; + this.setLogLevelCount(); + }); + } + + render() { + return html` + +
    +
    +
      + ${this._logLevelCount + ? Object.keys(this._logLevelCount).map( + (level) => + html`
    • + +
    • ` + ) + : ''} +
    +
    + + ${this._logLevelCount + ? this.logLevelCount.map( + ([level, number]) => + html` ` + ) + : ''} + +
    +
    + `; + } +} + +declare global { + interface HTMLElementTagNameMap { + 'umb-log-viewer-log-types-chart': UmbLogViewerLogTypesChartElement; + } +} diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/overview/log-overview-view.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/overview/log-overview-view.element.ts index cfd2b54034..6f26d8fc7a 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/overview/log-overview-view.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/overview/log-overview-view.element.ts @@ -61,14 +61,6 @@ export class UmbLogViewerOverviewViewElement extends UmbLitElement { grid-area: 3 / 1 / 5 / 3; } - #log-types-container { - display: flex; - gap: var(--uui-size-space-4); - flex-direction: column-reverse; - align-items: center; - justify-content: space-between; - } - #saved-searches-container { grid-area: saved-searches; } @@ -88,37 +80,6 @@ export class UmbLogViewerOverviewViewElement extends UmbLitElement { margin-top: var(--uui-size-space-5); } - button { - all: unset; - display: flex; - align-items: center; - cursor: pointer; - } - - button:focus { - outline: 1px solid var(--uui-color-focus); - } - - button.active { - text-decoration: line-through; - } - - #chart { - width: 150px; - aspect-ratio: 1; - background: radial-gradient(white 40%, transparent 41%), - conic-gradient( - var(--umb-log-viewer-debug-color) 0% 20%, - var(--umb-log-viewer-information-color) 20% 40%, - var(--umb-log-viewer-warning-color) 40% 60%, - var(--umb-log-viewer-error-color) 60% 80%, - var(--umb-log-viewer-fatal-color) 80% 100% - ); - margin: 10px; - display: inline-block; - border-radius: 50%; - } - #error-count { font-size: 4rem; text-align: center; @@ -127,9 +88,6 @@ export class UmbLogViewerOverviewViewElement extends UmbLitElement { `, ]; - @state() - private _totalLogCount = 0; - @state() private _errorCount = 0; @@ -142,21 +100,6 @@ export class UmbLogViewerOverviewViewElement extends UmbLitElement { @state() private _logLevelCount: LogLevelCountsModel | null = null; - @state() - private _startDate = ''; - - @state() - private _endDate = ''; - - setLogLevelCount() { - this.logLevelCount = this._logLevelCount - ? Object.entries(this._logLevelCount).filter(([level, number]) => !this._logLevelCountFilter.includes(level)) - : []; - this._totalLogCount = this._logLevelCount - ? this.logLevelCount.flatMap((arr) => arr[1]).reduce((acc, count) => acc + count, 0) - : 0; - } - #logViewerContext?: UmbLogViewerWorkspaceContext; constructor() { super(); @@ -170,54 +113,8 @@ export class UmbLogViewerOverviewViewElement extends UmbLitElement { if (!this.#logViewerContext) return; this.observe(this.#logViewerContext.logCount, (logLevel) => { - this._logLevelCount = logLevel ?? null; this._errorCount = this._logLevelCount?.error ?? 0; - this.setLogLevelCount(); }); - - this.observe(this.#logViewerContext.dateRange, (dateRange: LogViewerDateRange) => { - this._startDate = dateRange?.startDate; - this._endDate = dateRange?.endDate; - }); - } - - protected willUpdate(_changedProperties: Map): void { - if (_changedProperties.has('_logLevelCountFilter')) { - this.setLogLevelCount(); - this._totalLogCount = this._logLevelCount - ? this.logLevelCount.flatMap((arr) => arr[1]).reduce((acc, count) => acc + count, 0) - : 0; - } - } - - #calculatePercentage(partialValue: number) { - if (this._totalLogCount === 0) return 0; - const percent = Math.round((100 * partialValue) / this._totalLogCount); - return clamp(percent, 0, 99); - } - - #setDates(event: Event) { - const target = event.target as HTMLInputElement; - if (target.id === 'start-date') { - this._startDate = target.value; - } else if (target.id === 'end-date') { - this._endDate = target.value; - } - const newDateRange: LogViewerDateRange = { startDate: this._startDate, endDate: this._endDate }; - this.#logViewerContext?.setDateRange(newDateRange); - } - - #setCountFilter(level: string) { - if (this._logLevelCountFilter.includes(level)) { - this._logLevelCountFilter = this._logLevelCountFilter.filter((item) => item !== level); - return; - } - - this._logLevelCountFilter = [...this._logLevelCountFilter, level]; - } - - setCurrentQuery(query: string) { - this.#logViewerContext?.setFilterExpression(query); } render() { @@ -236,43 +133,7 @@ export class UmbLogViewerOverviewViewElement extends UmbLitElement {

    Info

    - -
    -
    -
      - ${this._logLevelCount - ? Object.keys(this._logLevelCount).map( - (level) => - html`
    • - -
    • ` - ) - : ''} -
    -
    - - ${this._logLevelCount - ? this.logLevelCount.map( - ([level, number]) => - html` ` - ) - : ''} - -
    -
    +
    diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/donut-chart/donut-chart.ts b/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/donut-chart/donut-chart.ts index 0e7cb81cd8..7584db2ed8 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/donut-chart/donut-chart.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/donut-chart/donut-chart.ts @@ -1,12 +1,13 @@ import { UUITextStyles } from '@umbraco-ui/uui-css'; import { css, html, LitElement, svg } from 'lit'; import { customElement, query, queryAssignedElements, state } from 'lit/decorators.js'; +import { clamp } from 'lodash-es'; import { UmbDonutSliceElement } from './donut-slice'; export interface Circle { - percent: number; color: string; name: string; + percent: number; } interface CircleWithCommands extends Circle { @@ -129,12 +130,22 @@ export class UmbDonutChartElement extends LitElement { @state() detailColor = 'red'; + @state() + _totalAmount = 0; + + #calculatePercentage(partialValue: number) { + if (this._totalAmount === 0) return 0; + const percent = Math.round((100 * partialValue) / this._totalAmount); + return clamp(percent, 0, 99); + } + #printCircles(event: Event) { + this._totalAmount = this.slices.reduce((acc, slice) => acc + slice.amount, 0); event.stopPropagation(); this.circles = this.#addCommands( this.slices.map((slice) => { return { - percent: slice.percent, + percent: this.#calculatePercentage(slice.amount), color: slice.color, name: slice.name, }; From 56a9c425616a8f184f7e524802ae4f928f9dcdb9 Mon Sep 17 00:00:00 2001 From: Julia Gru <56249914+julczka@users.noreply.github.com> Date: Fri, 3 Mar 2023 17:25:56 +0100 Subject: [PATCH 48/57] generate autodocs for all storybook stories --- src/Umbraco.Web.UI.Client/.storybook/main.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Umbraco.Web.UI.Client/.storybook/main.ts b/src/Umbraco.Web.UI.Client/.storybook/main.ts index 1904aec0d2..58d9e365e4 100644 --- a/src/Umbraco.Web.UI.Client/.storybook/main.ts +++ b/src/Umbraco.Web.UI.Client/.storybook/main.ts @@ -12,7 +12,7 @@ const config: StorybookConfig = { check: true, }, docs: { - autodocs: 'tag' + autodocs: true, }, }; export default config; From 3c58cd143cab9c4379c7382fc3b6759e5ea94949 Mon Sep 17 00:00:00 2001 From: Julia Gru <56249914+julczka@users.noreply.github.com> Date: Fri, 3 Mar 2023 17:26:10 +0100 Subject: [PATCH 49/57] refactor chart --- .../components/index.ts | 0 .../log-viewer-date-range-selector.element.ts | 0 .../log-viewer-level-tag.element.ts | 0 .../logviewer-root-workspace.element.ts | 2 +- .../log-viewer-log-types-chart.element.ts | 3 +- .../donut-chart/donut-chart.stories.ts | 20 +++ .../components/donut-chart/donut-chart.ts | 156 ++++++++++++------ .../components/donut-chart/donut-slice.ts | 3 + 8 files changed, 128 insertions(+), 56 deletions(-) rename src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/{views => logviewer-root}/components/index.ts (100%) rename src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/{views => logviewer-root}/components/log-viewer-date-range-selector.element.ts (100%) rename src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/{views => logviewer-root}/components/log-viewer-level-tag.element.ts (100%) create mode 100644 src/Umbraco.Web.UI.Client/src/backoffice/shared/components/donut-chart/donut-chart.stories.ts diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/components/index.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/logviewer-root/components/index.ts similarity index 100% rename from src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/components/index.ts rename to src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/logviewer-root/components/index.ts diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/components/log-viewer-date-range-selector.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/logviewer-root/components/log-viewer-date-range-selector.element.ts similarity index 100% rename from src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/components/log-viewer-date-range-selector.element.ts rename to src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/logviewer-root/components/log-viewer-date-range-selector.element.ts diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/components/log-viewer-level-tag.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/logviewer-root/components/log-viewer-level-tag.element.ts similarity index 100% rename from src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/components/log-viewer-level-tag.element.ts rename to src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/logviewer-root/components/log-viewer-level-tag.element.ts diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/logviewer-root/logviewer-root-workspace.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/logviewer-root/logviewer-root-workspace.element.ts index 6e65aee319..1e4bac4de6 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/logviewer-root/logviewer-root-workspace.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/logviewer-root/logviewer-root-workspace.element.ts @@ -1,4 +1,4 @@ -import '../views/components'; +import './components'; import { map } from 'rxjs'; import { css, html, nothing } from 'lit'; import { customElement, state, property } from 'lit/decorators.js'; diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/overview/components/log-viewer-log-types-chart.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/overview/components/log-viewer-log-types-chart.element.ts index 7e676037a4..c7e9c26450 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/overview/components/log-viewer-log-types-chart.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/overview/components/log-viewer-log-types-chart.element.ts @@ -144,13 +144,14 @@ export class UmbLogViewerLogTypesChartElement extends UmbLitElement { : ''}
    - + ${this._logLevelCount ? this.logLevelCount.map( ([level, number]) => html` ` ) : ''} diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/donut-chart/donut-chart.stories.ts b/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/donut-chart/donut-chart.stories.ts new file mode 100644 index 0000000000..72529b5b1e --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/donut-chart/donut-chart.stories.ts @@ -0,0 +1,20 @@ +import './donut-slice'; +import './donut-chart'; + +import { Meta } from '@storybook/web-components'; +import { html } from 'lit-html'; + +export default { + title: 'Components/Donut chart', + component: 'umb-donut-chart', + id: 'umb-donut-chart', + tags: ['autodocs'], +} as Meta; + +export const AAAOverview = () => html` + + + + +`; +AAAOverview.storyName = 'Overview'; diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/donut-chart/donut-chart.ts b/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/donut-chart/donut-chart.ts index 7584db2ed8..8b01e76fd0 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/donut-chart/donut-chart.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/donut-chart/donut-chart.ts @@ -1,6 +1,6 @@ import { UUITextStyles } from '@umbraco-ui/uui-css'; import { css, html, LitElement, svg } from 'lit'; -import { customElement, query, queryAssignedElements, state } from 'lit/decorators.js'; +import { customElement, property, query, queryAssignedElements, state } from 'lit/decorators.js'; import { clamp } from 'lodash-es'; import { UmbDonutSliceElement } from './donut-slice'; @@ -8,13 +8,21 @@ export interface Circle { color: string; name: string; percent: number; + kind: string; } interface CircleWithCommands extends Circle { offset: number; commands: string; } - +//TODO: maybe move to UI Library +/** + * This is a donut chart component that can be used to display data in a circular way. + * + * @export + * @class UmbDonutChartElement + * @extends {LitElement} + */ @customElement('umb-donut-chart') export class UmbDonutChartElement extends LitElement { static percentToDegrees(percent: number): number { @@ -82,56 +90,93 @@ export class UmbDonutChartElement extends LitElement { `, ]; - @query('slot') - slicesSlot!: HTMLSlotElement; - - @queryAssignedElements({ selector: 'umb-donut-slice' }) - slices!: UmbDonutSliceElement[]; - - @query('#circle-container') - circleContainer!: HTMLSlotElement; - - @query('#container') - container!: HTMLDivElement; - - @query('#details-box') - detailsBox!: HTMLDivElement; - - @state() - circles: CircleWithCommands[] = []; - - @state() + /** + * Circle radius in pixels + * + * @memberof UmbDonutChartElement + */ + @property({ type: Number }) radius = 45; - @state() - viewBox = 100; - - @state() + /** + * The circle thickness in pixels + * + * @memberof UmbDonutChartElement + */ + @property({ type: Number, attribute: 'border-size' }) borderSize = 20; - @state() + /** + * The size of SVG element in pixels + * + * @memberof UmbDonutChartElement + */ + @property({ type: Number, attribute: 'svg-size' }) svgSize = 100; - @state() - posY = 0; + /** + * Description of the graph, added for accessibility purposes + * + * @memberof UmbDonutChartElement + */ + @property() + description = ''; + + /** + * Hides the box that appears oh hover with the details of the slice + * + * @memberof UmbDonutChartElement + */ + @property({ type: Boolean }) + hideDetailBox = false; + + @queryAssignedElements({ selector: 'umb-donut-slice' }) + private _slices!: UmbDonutSliceElement[]; + + @query('#container') + private _container!: HTMLDivElement; + + @query('#details-box') + private _detailsBox!: HTMLDivElement; @state() - posX = 0; + private circles: CircleWithCommands[] = []; @state() - detailName = ''; + private viewBox = 100; @state() - detailAmount = 0; + private _posY = 0; @state() - detailPercent = 0; + private _posX = 0; @state() - detailColor = 'red'; + private _detailName = ''; @state() - _totalAmount = 0; + private _detailAmount = 0; + + @state() + private _detailColor = 'black'; + + @state() + private _totalAmount = 0; + + @state() + private _detailKind = ''; + + #containerBounds: DOMRect | undefined; + + firstUpdated() { + this.#containerBounds = this._container.getBoundingClientRect(); + } + + protected willUpdate(_changedProperties: Map): void { + if (_changedProperties.has('radius') || _changedProperties.has('borderSize') || _changedProperties.has('svgSize')) { + this.#printCircles(); + } + } #calculatePercentage(partialValue: number) { if (this._totalAmount === 0) return 0; @@ -139,15 +184,16 @@ export class UmbDonutChartElement extends LitElement { return clamp(percent, 0, 99); } - #printCircles(event: Event) { - this._totalAmount = this.slices.reduce((acc, slice) => acc + slice.amount, 0); - event.stopPropagation(); + #printCircles(event: Event | null = null) { + this._totalAmount = this._slices.reduce((acc, slice) => acc + slice.amount, 0); + event?.stopPropagation(); this.circles = this.#addCommands( - this.slices.map((slice) => { + this._slices.map((slice) => { return { percent: this.#calculatePercentage(slice.amount), color: slice.color, name: slice.name, + kind: slice.kind, }; }) ); @@ -187,31 +233,33 @@ export class UmbDonutChartElement extends LitElement { return [coordX, coordY].join(' '); } - #calculateDetailsBoxPosition(event: MouseEvent) { - const rect = this.container.getBoundingClientRect(); - const x = event.clientX - rect.left; - const y = event.clientY - rect.top; - this.posX = x - 10; - this.posY = y - 70; - } + #calculateDetailsBoxPosition = (event: MouseEvent) => { + const x = this.#containerBounds ? event.clientX - this.#containerBounds?.left : 0; + const y = this.#containerBounds ? event.clientY - this.#containerBounds?.top : 0; + this._posX = x - 10; + this._posY = y - 70; + }; #setDetailsBoxData(event: MouseEvent) { const target = event.target as SVGPathElement; const index = target.dataset.index as unknown as number; const circle = this.circles[index]; - this.detailName = circle.name; - this.detailAmount = circle.percent; + this._detailName = circle.name; + this._detailAmount = circle.percent; this.detailPercent = circle.percent; - this.detailColor = circle.color; + this._detailColor = circle.color; + this._detailKind = circle.kind; } #showDetailsBox(event: MouseEvent) { + if (this.hideDetailBox) return; this.#setDetailsBoxData(event); - this.detailsBox.classList.add('show'); + this._detailsBox.classList.add('show'); } #hideDetailsBox() { - this.detailsBox.classList.remove('show'); + if (this.hideDetailBox) return; + this._detailsBox.classList.remove('show'); } #renderCircles() { @@ -236,7 +284,7 @@ export class UmbDonutChartElement extends LitElement { - In chosen date range you have this number of log message of type: + ${this.description} ${this.circles.map( (circle, i) => svg` ${this.#renderCircles()}
    -
    ${this.detailName}
    - ${this.detailAmount} messages + style="--pos-y: ${this._posY}px; --pos-x: ${this._posX}px; --umb-donut-detail-color: ${this._detailColor}"> +
    ${this._detailName}
    + ${this._detailAmount} ${this._detailKind}
    `; diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/donut-chart/donut-slice.ts b/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/donut-chart/donut-slice.ts index 65ac6b9746..25c981ff89 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/donut-chart/donut-slice.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/donut-chart/donut-slice.ts @@ -15,6 +15,9 @@ export class UmbDonutSliceElement extends LitElement { @property() name = ''; + @property() + kind = ''; + willUpdate() { this.dispatchEvent(new CustomEvent('slice-update', { composed: true, bubbles: true })); } From 02a8999687ef64f14c3402c2f866b5628e17d517 Mon Sep 17 00:00:00 2001 From: Julia Gru <56249914+julczka@users.noreply.github.com> Date: Fri, 3 Mar 2023 17:32:01 +0100 Subject: [PATCH 50/57] document donut slice --- .../components/donut-chart/donut-chart.ts | 6 ++++ .../components/donut-chart/donut-slice.ts | 35 +++++++++++++++---- 2 files changed, 34 insertions(+), 7 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/donut-chart/donut-chart.ts b/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/donut-chart/donut-chart.ts index 8b01e76fd0..12bb0385a7 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/donut-chart/donut-chart.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/donut-chart/donut-chart.ts @@ -174,8 +174,14 @@ export class UmbDonutChartElement extends LitElement { protected willUpdate(_changedProperties: Map): void { if (_changedProperties.has('radius') || _changedProperties.has('borderSize') || _changedProperties.has('svgSize')) { + if (this.borderSize > this.radius) { + throw new Error('Border size cannot be bigger than radius'); + } + this.#printCircles(); } + + } #calculatePercentage(partialValue: number) { diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/donut-chart/donut-slice.ts b/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/donut-chart/donut-slice.ts index 25c981ff89..b485803986 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/donut-chart/donut-slice.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/donut-chart/donut-slice.ts @@ -1,20 +1,41 @@ import { LitElement } from 'lit'; import { customElement, property } from 'lit/decorators.js'; - +/** + * This component is used to display a single slice of a donut chart. It only makes sense insice the donut chart + * + * @export + * @class UmbDonutSliceElement + * @fires slice-update - This event is fired when the slice is updated + * @extends {LitElement} + */ @customElement('umb-donut-slice') export class UmbDonutSliceElement extends LitElement { - @property({ type: Number }) - percent = 0; - + /** + * Number of items that this slice represents + * + * @memberof UmbDonutSliceElement + */ @property({ type: Number }) amount = 0; - + /** + * Color of the slice. Any valid css color is accepted, custom properties are also supported + * + * @memberof UmbDonutSliceElement + */ @property() color = 'red'; - + /** + * Name of the slice. This is used to display the name of the slice in the donut chart + * + * @memberof UmbDonutSliceElement + */ @property() name = ''; - + /** + * Kind of the slice. This is shown on a details box when hovering over the slice + * + * @memberof UmbDonutSliceElement + */ @property() kind = ''; From 2013e73d5142370c6dbb904c122cea4d3f62ff2b Mon Sep 17 00:00:00 2001 From: Julia Gru <56249914+julczka@users.noreply.github.com> Date: Fri, 3 Mar 2023 17:35:31 +0100 Subject: [PATCH 51/57] move and rename repository folder --- .../{workspace/data => repository}/log-viewer.repository.ts | 0 .../logviewer/{workspace/data => repository}/sources/index.ts | 0 .../data => repository}/sources/log-viewer.server.data.ts | 0 .../settings/logviewer/workspace/logviewer.context.ts | 2 +- 4 files changed, 1 insertion(+), 1 deletion(-) rename src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/{workspace/data => repository}/log-viewer.repository.ts (100%) rename src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/{workspace/data => repository}/sources/index.ts (100%) rename src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/{workspace/data => repository}/sources/log-viewer.server.data.ts (100%) diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/data/log-viewer.repository.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/repository/log-viewer.repository.ts similarity index 100% rename from src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/data/log-viewer.repository.ts rename to src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/repository/log-viewer.repository.ts diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/data/sources/index.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/repository/sources/index.ts similarity index 100% rename from src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/data/sources/index.ts rename to src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/repository/sources/index.ts diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/data/sources/log-viewer.server.data.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/repository/sources/log-viewer.server.data.ts similarity index 100% rename from src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/data/sources/log-viewer.server.data.ts rename to src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/repository/sources/log-viewer.server.data.ts diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/logviewer.context.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/logviewer.context.ts index fd00a80746..949118bf6a 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/logviewer.context.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/logviewer.context.ts @@ -1,4 +1,4 @@ -import { UmbLogViewerRepository } from './data/log-viewer.repository'; +import { UmbLogViewerRepository } from '../repository/log-viewer.repository'; import { ArrayState, createObservablePart, DeepState, ObjectState, StringState } from '@umbraco-cms/observable-api'; import { DirectionModel, From 69fe1c94b4af5fd8a61552b2110cd6efc69eb481 Mon Sep 17 00:00:00 2001 From: Julia Gru <56249914+julczka@users.noreply.github.com> Date: Fri, 3 Mar 2023 17:47:07 +0100 Subject: [PATCH 52/57] remove undefined property --- .../src/backoffice/shared/components/donut-chart/donut-chart.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/donut-chart/donut-chart.ts b/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/donut-chart/donut-chart.ts index 12bb0385a7..916ce79310 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/donut-chart/donut-chart.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/donut-chart/donut-chart.ts @@ -252,7 +252,6 @@ export class UmbDonutChartElement extends LitElement { const circle = this.circles[index]; this._detailName = circle.name; this._detailAmount = circle.percent; - this.detailPercent = circle.percent; this._detailColor = circle.color; this._detailKind = circle.kind; } From 6a91fd33c0ce385abbd488f9ac38dab5de6cf638 Mon Sep 17 00:00:00 2001 From: Julia Gru <56249914+julczka@users.noreply.github.com> Date: Mon, 6 Mar 2023 09:47:40 +0100 Subject: [PATCH 53/57] add log level component --- .../repository/log-viewer.repository.ts | 5 ++ .../sources/log-viewer.server.data.ts | 16 +++---- .../logviewer-root-workspace.element.ts | 1 - .../logviewer/workspace/logviewer.context.ts | 12 +++++ .../views/overview/components/index.ts | 3 +- .../log-viewer-log-level-overview.element.ts | 48 +++++++++++++++++++ .../overview/log-overview-view.element.ts | 12 ++--- 7 files changed, 79 insertions(+), 18 deletions(-) create mode 100644 src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/overview/components/log-viewer-log-level-overview.element.ts diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/repository/log-viewer.repository.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/repository/log-viewer.repository.ts index 4b2c334529..5878734a15 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/repository/log-viewer.repository.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/repository/log-viewer.repository.ts @@ -88,4 +88,9 @@ export class UmbLogViewerRepository { endDate, }); } + + async getLogLevels({ skip = 0, take = 100 }: { skip: number; take: number }) { + await this.#init(); + return this.#messagesDataSource.getLogViewerLevel({ skip, take }); + } } diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/repository/sources/log-viewer.server.data.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/repository/sources/log-viewer.server.data.ts index 733c20bcfb..727b529835 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/repository/sources/log-viewer.server.data.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/repository/sources/log-viewer.server.data.ts @@ -63,14 +63,14 @@ export class UmbLogSearchesServerDataSource implements LogSearchDataSource { return await tryExecuteAndNotify(this.#host, LogViewerResource.deleteLogViewerSavedSearchByName({ name })); } } -/** - * A data source for the log messages and levels - * - * @export - * @class UmbLogMessagesServerDataSource - * @implements {LogMessagesDataSource} - */ -export class UmbLogMessagesServerDataSource implements LogMessagesDataSource { + /** + * A data source for the log messages and levels + * + * @export + * @class UmbLogMessagesServerDataSource + * @implements {LogMessagesDataSource} + */ + export class UmbLogMessagesServerDataSource implements LogMessagesDataSource { #host: UmbControllerHostInterface; /** diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/logviewer-root/logviewer-root-workspace.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/logviewer-root/logviewer-root-workspace.element.ts index 1e4bac4de6..fc2f769528 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/logviewer-root/logviewer-root-workspace.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/logviewer-root/logviewer-root-workspace.element.ts @@ -78,7 +78,6 @@ export class UmbLogViewerWorkspaceElement extends UmbLitElement { load(): void { // Not relevant for this workspace -added to prevent the error from popping up - console.log('Loading something from somewhere'); } private _observeWorkspaceViews() { diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/logviewer.context.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/logviewer.context.ts index 949118bf6a..c201f5c2af 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/logviewer.context.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/logviewer.context.ts @@ -4,6 +4,7 @@ import { DirectionModel, LogLevelCountsModel, LogLevelModel, + PagedLoggerModel, PagedLogMessageModel, PagedLogTemplateModel, PagedSavedLogSearchModel, @@ -58,6 +59,9 @@ export class UmbLogViewerWorkspaceContext { #dateRange = new DeepState(this.defaultDateRange); dateRange = createObservablePart(this.#dateRange, (data) => data); + #loggers = new DeepState(null); + loggers = createObservablePart(this.#loggers, (data) => data?.items); + #filterExpression = new StringState(''); filterExpression = createObservablePart(this.#filterExpression, (data) => data); @@ -157,6 +161,14 @@ export class UmbLogViewerWorkspaceContext { } } + async getLogLevels(skip: number, take: number) { + const { data } = await this.#repository.getLogLevels({ skip, take }); + + if (data) { + this.#loggers.next(data); + } + } + setCurrentPage(page: number) { this.currentPage = page; } diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/overview/components/index.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/overview/components/index.ts index 95f7c15a2c..926372cc6e 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/overview/components/index.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/overview/components/index.ts @@ -1,3 +1,4 @@ export * from './log-viewer-saved-searches-overview.element'; export * from './log-viewer-message-templates-overview.element'; -export * from './log-viewer-log-types-chart.element'; \ No newline at end of file +export * from './log-viewer-log-types-chart.element'; +export * from './log-viewer-log-level-overview.element'; \ No newline at end of file diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/overview/components/log-viewer-log-level-overview.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/overview/components/log-viewer-log-level-overview.element.ts new file mode 100644 index 0000000000..2aeafb27fa --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/overview/components/log-viewer-log-level-overview.element.ts @@ -0,0 +1,48 @@ +import { html } from 'lit'; +import { customElement, property, state } from 'lit/decorators.js'; +import { UmbLogViewerWorkspaceContext, UMB_APP_LOG_VIEWER_CONTEXT_TOKEN } from '../../../logviewer.context'; +import { UmbLitElement } from '@umbraco-cms/element'; +import { LoggerModel } from '@umbraco-cms/backend-api'; + +//TODO: implement the saved searches pagination when the API total bug is fixed +@customElement('umb-log-viewer-log-level-overview') +export class UmbLogViewerLogLevelOverviewElement extends UmbLitElement { + #logViewerContext?: UmbLogViewerWorkspaceContext; + constructor() { + super(); + this.consumeContext(UMB_APP_LOG_VIEWER_CONTEXT_TOKEN, (instance) => { + this.#logViewerContext = instance; + this.#logViewerContext?.getSavedSearches(); + this.#observeLogLevels(); + }); + } + + @state() + private _loggers: LoggerModel[] = []; + /** + * The name of the logger to get the level for. Defaults to 'Global'. + * + * @memberof UmbLogViewerLogLevelOverviewElement + */ + @property() + loggerName = 'Global'; + + #observeLogLevels() { + if (!this.#logViewerContext) return; + this.observe(this.#logViewerContext.loggers, (loggers) => { + this._loggers = loggers ?? []; + }); + } + + render() { + return html`${this._loggers.length > 0 + ? this._loggers.find((logger) => logger.name === this.loggerName)?.level + : ''}`; + } +} + +declare global { + interface HTMLElementTagNameMap { + 'umb-log-viewer-log-level-overview': UmbLogViewerLogLevelOverviewElement; + } +} diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/overview/log-overview-view.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/overview/log-overview-view.element.ts index 6f26d8fc7a..2be52cbde2 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/overview/log-overview-view.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/overview/log-overview-view.element.ts @@ -1,11 +1,6 @@ import { css, html } from 'lit'; import { customElement, state } from 'lit/decorators.js'; -import { clamp } from 'lodash-es'; -import { - LogViewerDateRange, - UmbLogViewerWorkspaceContext, - UMB_APP_LOG_VIEWER_CONTEXT_TOKEN, -} from '../../logviewer.context'; +import { UmbLogViewerWorkspaceContext, UMB_APP_LOG_VIEWER_CONTEXT_TOKEN } from '../../logviewer.context'; import { LogLevelCountsModel } from '@umbraco-cms/backend-api'; import { UmbLitElement } from '@umbraco-cms/element'; @@ -106,13 +101,14 @@ export class UmbLogViewerOverviewViewElement extends UmbLitElement { this.consumeContext(UMB_APP_LOG_VIEWER_CONTEXT_TOKEN, (instance) => { this.#logViewerContext = instance; this.#observeStuff(); + this.#logViewerContext?.getLogLevels(0, 100); }); } #observeStuff() { if (!this.#logViewerContext) return; - this.observe(this.#logViewerContext.logCount, (logLevel) => { + this.observe(this.#logViewerContext.logCount, () => { this._errorCount = this._logLevelCount?.error ?? 0; }); } @@ -130,7 +126,7 @@ export class UmbLogViewerOverviewViewElement extends UmbLitElement { -

    Info

    +

    From 2a3f57764d9f4961b196b8287452c89efd7327fd Mon Sep 17 00:00:00 2001 From: Julia Gru <56249914+julczka@users.noreply.github.com> Date: Mon, 6 Mar 2023 15:12:52 +0100 Subject: [PATCH 54/57] add validate log number enpoint --- .../repository/log-viewer.repository.ts | 5 + .../sources/log-viewer.server.data.ts | 262 +++++++++--------- .../logviewer/workspace/logviewer.context.ts | 13 + .../overview/log-overview-view.element.ts | 1 + 4 files changed, 155 insertions(+), 126 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/repository/log-viewer.repository.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/repository/log-viewer.repository.ts index 5878734a15..5870e28762 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/repository/log-viewer.repository.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/repository/log-viewer.repository.ts @@ -93,4 +93,9 @@ export class UmbLogViewerRepository { await this.#init(); return this.#messagesDataSource.getLogViewerLevel({ skip, take }); } + + async getLogViewerValidateLogsSize({ startDate, endDate }: { startDate?: string; endDate?: string }) { + await this.#init(); + return this.#messagesDataSource.getLogViewerValidateLogsSize({ startDate, endDate }); + } } diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/repository/sources/log-viewer.server.data.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/repository/sources/log-viewer.server.data.ts index 727b529835..ebdf1264e5 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/repository/sources/log-viewer.server.data.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/repository/sources/log-viewer.server.data.ts @@ -71,133 +71,143 @@ export class UmbLogSearchesServerDataSource implements LogSearchDataSource { * @implements {LogMessagesDataSource} */ export class UmbLogMessagesServerDataSource implements LogMessagesDataSource { - #host: UmbControllerHostInterface; + #host: UmbControllerHostInterface; - /** - * Creates an instance of UmbLogMessagesServerDataSource. - * @param {UmbControllerHostInterface} host - * @memberof UmbLogMessagesServerDataSource - */ - constructor(host: UmbControllerHostInterface) { - this.#host = host; - } + /** + * Creates an instance of UmbLogMessagesServerDataSource. + * @param {UmbControllerHostInterface} host + * @memberof UmbLogMessagesServerDataSource + */ + constructor(host: UmbControllerHostInterface) { + this.#host = host; + } - /** - * Grabs all the loggers from the server - * - * @param {{ skip?: number; take?: number }} { skip = 0, take = 100 } - * @return {*} - * @memberof UmbLogMessagesServerDataSource - */ - async getLogViewerLevel({ skip = 0, take = 100 }: { skip?: number; take?: number }) { - return await tryExecuteAndNotify(this.#host, LogViewerResource.getLogViewerLevel({ skip, take })); - } + /** + * Grabs all the loggers from the server + * + * @param {{ skip?: number; take?: number }} { skip = 0, take = 100 } + * @return {*} + * @memberof UmbLogMessagesServerDataSource + */ + async getLogViewerLevel({ skip = 0, take = 100 }: { skip?: number; take?: number }) { + return await tryExecuteAndNotify(this.#host, LogViewerResource.getLogViewerLevel({ skip, take })); + } - /** - * Grabs all the number of different log messages from the server - * - * @param {{ skip?: number; take?: number }} { skip = 0, take = 100 } - * @return {*} - * @memberof UmbLogMessagesServerDataSource - */ - async getLogViewerLevelCount({ startDate, endDate }: { startDate?: string; endDate?: string }) { - return await tryExecuteAndNotify( - this.#host, - LogViewerResource.getLogViewerLevelCount({ - startDate, - endDate, - }) - ); + /** + * Grabs all the number of different log messages from the server + * + * @param {{ skip?: number; take?: number }} { skip = 0, take = 100 } + * @return {*} + * @memberof UmbLogMessagesServerDataSource + */ + async getLogViewerLevelCount({ startDate, endDate }: { startDate?: string; endDate?: string }) { + return await tryExecuteAndNotify( + this.#host, + LogViewerResource.getLogViewerLevelCount({ + startDate, + endDate, + }) + ); + } + /** + * Grabs all the log messages from the server + * + * @param {{ + * skip?: number; + * take?: number; + * orderDirection?: DirectionModel; + * filterExpression?: string; + * logLevel?: Array; + * startDate?: string; + * endDate?: string; + * }} { + * skip = 0, + * take = 100, + * orderDirection, + * filterExpression, + * logLevel, + * startDate, + * endDate, + * } + * @return {*} + * @memberof UmbLogMessagesServerDataSource + */ + async getLogViewerLogs({ + skip = 0, + take = 100, + orderDirection, + filterExpression, + logLevel, + startDate, + endDate, + }: { + skip?: number; + take?: number; + orderDirection?: DirectionModel; + filterExpression?: string; + logLevel?: Array; + startDate?: string; + endDate?: string; + }) { + return await tryExecuteAndNotify( + this.#host, + LogViewerResource.getLogViewerLog({ + skip, + take, + orderDirection, + filterExpression, + logLevel, + startDate, + endDate, + }) + ); + } + /** + * Grabs all the log message templates from the server + * + * @param {{ + * skip?: number; + * take?: number; + * startDate?: string; + * endDate?: string; + * }} { + * skip, + * take = 100, + * startDate, + * endDate, + * } + * @return {*} + * @memberof UmbLogMessagesServerDataSource + */ + async getLogViewerMessageTemplate({ + skip, + take = 100, + startDate, + endDate, + }: { + skip?: number; + take?: number; + startDate?: string; + endDate?: string; + }) { + return await tryExecuteAndNotify( + this.#host, + LogViewerResource.getLogViewerMessageTemplate({ + skip, + take, + startDate, + endDate, + }) + ); + } + + async getLogViewerValidateLogsSize({ startDate, endDate }: { startDate?: string; endDate?: string }) { + return await tryExecuteAndNotify( + this.#host, + LogViewerResource.getLogViewerValidateLogsSize({ + startDate, + endDate, + }) + ); + } } - /** - * Grabs all the log messages from the server - * - * @param {{ - * skip?: number; - * take?: number; - * orderDirection?: DirectionModel; - * filterExpression?: string; - * logLevel?: Array; - * startDate?: string; - * endDate?: string; - * }} { - * skip = 0, - * take = 100, - * orderDirection, - * filterExpression, - * logLevel, - * startDate, - * endDate, - * } - * @return {*} - * @memberof UmbLogMessagesServerDataSource - */ - async getLogViewerLogs({ - skip = 0, - take = 100, - orderDirection, - filterExpression, - logLevel, - startDate, - endDate, - }: { - skip?: number; - take?: number; - orderDirection?: DirectionModel; - filterExpression?: string; - logLevel?: Array; - startDate?: string; - endDate?: string; - }) { - return await tryExecuteAndNotify( - this.#host, - LogViewerResource.getLogViewerLog({ - skip, - take, - orderDirection, - filterExpression, - logLevel, - startDate, - endDate, - }) - ); - } - /** - * Grabs all the log message templates from the server - * - * @param {{ - * skip?: number; - * take?: number; - * startDate?: string; - * endDate?: string; - * }} { - * skip, - * take = 100, - * startDate, - * endDate, - * } - * @return {*} - * @memberof UmbLogMessagesServerDataSource - */ - async getLogViewerMessageTemplate({ - skip, - take = 100, - startDate, - endDate, - }: { - skip?: number; - take?: number; - startDate?: string; - endDate?: string; - }) { - return await tryExecuteAndNotify( - this.#host, - LogViewerResource.getLogViewerMessageTemplate({ - skip, - take, - startDate, - endDate, - }) - ); - } -} diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/logviewer.context.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/logviewer.context.ts index c201f5c2af..86db97466c 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/logviewer.context.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/logviewer.context.ts @@ -62,6 +62,9 @@ export class UmbLogViewerWorkspaceContext { #loggers = new DeepState(null); loggers = createObservablePart(this.#loggers, (data) => data?.items); + #canShowLogs = new DeepState(null); + canShowLogs = createObservablePart(this.#canShowLogs, (data) => data); + #filterExpression = new StringState(''); filterExpression = createObservablePart(this.#filterExpression, (data) => data); @@ -169,6 +172,16 @@ export class UmbLogViewerWorkspaceContext { } } + async validateLogSize() { + const { data, error } = await this.#repository.getLogViewerValidateLogsSize({ ...this.#dateRange.getValue() }); + debugger; + if (error) { + this.#canShowLogs.next(false); + return; + } + this.#canShowLogs.next(true); + } + setCurrentPage(page: number) { this.currentPage = page; } diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/overview/log-overview-view.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/overview/log-overview-view.element.ts index 2be52cbde2..98da8e9a41 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/overview/log-overview-view.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/overview/log-overview-view.element.ts @@ -102,6 +102,7 @@ export class UmbLogViewerOverviewViewElement extends UmbLitElement { this.#logViewerContext = instance; this.#observeStuff(); this.#logViewerContext?.getLogLevels(0, 100); + this.#logViewerContext?.validateLogSize(); }); } From afba58ba169a437880917896646af5387de59294 Mon Sep 17 00:00:00 2001 From: Julia Gru <56249914+julczka@users.noreply.github.com> Date: Mon, 6 Mar 2023 15:20:42 +0100 Subject: [PATCH 55/57] remove debugger --- .../backoffice/settings/logviewer/workspace/logviewer.context.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/logviewer.context.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/logviewer.context.ts index 86db97466c..36d778dac7 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/logviewer.context.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/logviewer.context.ts @@ -174,7 +174,6 @@ export class UmbLogViewerWorkspaceContext { async validateLogSize() { const { data, error } = await this.#repository.getLogViewerValidateLogsSize({ ...this.#dateRange.getValue() }); - debugger; if (error) { this.#canShowLogs.next(false); return; From 90a2fe6422c1b80c7a6ca5a0a9a4bea2cc6bbd37 Mon Sep 17 00:00:00 2001 From: Julia Gru <56249914+julczka@users.noreply.github.com> Date: Tue, 7 Mar 2023 10:20:35 +0100 Subject: [PATCH 56/57] add log size validation --- .../logviewer-root/components/index.ts | 1 + ...log-viewer-to-many-logs-warning.element.ts | 27 +++++++++++++ .../logviewer/workspace/logviewer.context.ts | 17 +++++--- .../log-viewer-log-types-chart.element.ts | 4 +- .../overview/log-overview-view.element.ts | 39 +++++++++++-------- .../views/search/log-search-view.element.ts | 26 ++++++++++++- 6 files changed, 88 insertions(+), 26 deletions(-) create mode 100644 src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/logviewer-root/components/log-viewer-to-many-logs-warning.element.ts diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/logviewer-root/components/index.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/logviewer-root/components/index.ts index 07f569571e..e204c32424 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/logviewer-root/components/index.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/logviewer-root/components/index.ts @@ -1,2 +1,3 @@ export * from './log-viewer-date-range-selector.element'; export * from './log-viewer-level-tag.element'; +export * from './log-viewer-to-many-logs-warning.element'; \ No newline at end of file diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/logviewer-root/components/log-viewer-to-many-logs-warning.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/logviewer-root/components/log-viewer-to-many-logs-warning.element.ts new file mode 100644 index 0000000000..b0bdb0c1ce --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/logviewer-root/components/log-viewer-to-many-logs-warning.element.ts @@ -0,0 +1,27 @@ +import { css, html, LitElement } from 'lit'; +import { customElement } from 'lit/decorators.js'; + +@customElement('umb-log-viewer-to-many-logs-warning') +export class UmbLogViewerToManyLogsWarningElement extends LitElement { + static styles = [ + css` + :host { + text-align: center; + } + `, + ]; + + render() { + return html` +

    Unable to view logs

    +

    Today's log file is too large to be viewed and would cause performance problems.

    +

    If you need to view the log files, narrow your date range or try opening them manually.

    +
    `; + } +} + +declare global { + interface HTMLElementTagNameMap { + 'umb-log-viewer-to-many-logs-warning': UmbLogViewerToManyLogsWarningElement; + } +} diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/logviewer.context.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/logviewer.context.ts index 36d778dac7..93d7896cc6 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/logviewer.context.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/logviewer.context.ts @@ -62,7 +62,7 @@ export class UmbLogViewerWorkspaceContext { #loggers = new DeepState(null); loggers = createObservablePart(this.#loggers, (data) => data?.items); - #canShowLogs = new DeepState(null); + #canShowLogs = new BasicState(null); canShowLogs = createObservablePart(this.#canShowLogs, (data) => data); #filterExpression = new StringState(''); @@ -94,7 +94,7 @@ export class UmbLogViewerWorkspaceContext { } async init() { - this.getLogCount(this.defaultDateRange); + this.validateLogSize(); } setDateRange(dateRange: LogViewerDateRange) { @@ -107,7 +107,8 @@ export class UmbLogViewerWorkspaceContext { } this.#dateRange.next(dateRange); - this.getLogCount(dateRange); + this.validateLogSize(); + this.getLogCount(); } async getSavedSearches() { @@ -148,8 +149,8 @@ export class UmbLogViewerWorkspaceContext { } } - async getLogCount({ startDate, endDate }: LogViewerDateRange) { - const { data } = await this.#repository.getLogCount({ startDate, endDate }); + async getLogCount() { + const { data } = await this.#repository.getLogCount({ ...this.#dateRange.getValue() }); if (data) { this.#logCount.next(data); @@ -176,9 +177,11 @@ export class UmbLogViewerWorkspaceContext { const { data, error } = await this.#repository.getLogViewerValidateLogsSize({ ...this.#dateRange.getValue() }); if (error) { this.#canShowLogs.next(false); + console.info('LogViewer: ', error); return; } this.#canShowLogs.next(true); + console.info('LogViewer:showinfg logs'); } setCurrentPage(page: number) { @@ -186,6 +189,10 @@ export class UmbLogViewerWorkspaceContext { } getLogs = async () => { + if (!this.#canShowLogs.getValue()) { + return; + } + const skip = (this.currentPage - 1) * 100; const take = 100; diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/overview/components/log-viewer-log-types-chart.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/overview/components/log-viewer-log-types-chart.element.ts index c7e9c26450..1c7ec7a927 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/overview/components/log-viewer-log-types-chart.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/overview/components/log-viewer-log-types-chart.element.ts @@ -1,7 +1,6 @@ import { UUITextStyles } from '@umbraco-ui/uui-css'; import { css, html } from 'lit'; import { customElement, state } from 'lit/decorators.js'; -import { clamp } from 'lodash-es'; import { UmbLogViewerWorkspaceContext, UMB_APP_LOG_VIEWER_CONTEXT_TOKEN } from '../../../logviewer.context'; import { UmbLitElement } from '@umbraco-cms/element'; import { LogLevelCountsModel } from '@umbraco-cms/backend-api'; @@ -9,7 +8,6 @@ import { LogLevelCountsModel } from '@umbraco-cms/backend-api'; @customElement('umb-log-viewer-log-types-chart') export class UmbLogViewerLogTypesChartElement extends UmbLitElement { static styles = [ - UUITextStyles, css` #log-types-container { display: flex; @@ -76,7 +74,7 @@ export class UmbLogViewerLogTypesChartElement extends UmbLitElement { super(); this.consumeContext(UMB_APP_LOG_VIEWER_CONTEXT_TOKEN, (instance) => { this.#logViewerContext = instance; - this.#logViewerContext?.getMessageTemplates(0, 10); + this.#logViewerContext?.getLogCount(); this.#observeStuff(); }); } diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/overview/log-overview-view.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/overview/log-overview-view.element.ts index 98da8e9a41..38191cf274 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/overview/log-overview-view.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/overview/log-overview-view.element.ts @@ -56,7 +56,8 @@ export class UmbLogViewerOverviewViewElement extends UmbLitElement { grid-area: 3 / 1 / 5 / 3; } - #saved-searches-container { + #saved-searches-container, + to-many-logs-warning { grid-area: saved-searches; } @@ -86,27 +87,24 @@ export class UmbLogViewerOverviewViewElement extends UmbLitElement { @state() private _errorCount = 0; - @state() - private _logLevelCountFilter: string[] = []; - - @state() - private logLevelCount: [string, number][] = []; - @state() private _logLevelCount: LogLevelCountsModel | null = null; + @state() + private _canShowLogs = false; + #logViewerContext?: UmbLogViewerWorkspaceContext; constructor() { super(); this.consumeContext(UMB_APP_LOG_VIEWER_CONTEXT_TOKEN, (instance) => { this.#logViewerContext = instance; - this.#observeStuff(); + this.#observeErrorCount(); + this.#observeCanShowLogs(); this.#logViewerContext?.getLogLevels(0, 100); - this.#logViewerContext?.validateLogSize(); }); } - #observeStuff() { + #observeErrorCount() { if (!this.#logViewerContext) return; this.observe(this.#logViewerContext.logCount, () => { @@ -114,6 +112,13 @@ export class UmbLogViewerOverviewViewElement extends UmbLitElement { }); } + #observeCanShowLogs() { + if (!this.#logViewerContext) return; + this.observe(this.#logViewerContext.canShowLogs, (canShowLogs) => { + this._canShowLogs = canShowLogs ?? false; + }); + } + render() { return html`
    @@ -133,13 +138,15 @@ export class UmbLogViewerOverviewViewElement extends UmbLitElement {
    -
    - -
    + ${this._canShowLogs + ? html`
    + +
    -
    - -
    +
    + +
    ` + : html``}
    `; } diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/search/log-search-view.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/search/log-search-view.element.ts index 2696aab4cf..91d032a69e 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/search/log-search-view.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/search/log-search-view.element.ts @@ -1,7 +1,8 @@ import { UUITextStyles } from '@umbraco-ui/uui-css'; import { css, html } from 'lit'; -import { customElement } from 'lit/decorators.js'; +import { customElement, state } from 'lit/decorators.js'; import { UmbLitElement } from '@umbraco-cms/element'; +import { UmbLogViewerWorkspaceContext, UMB_APP_LOG_VIEWER_CONTEXT_TOKEN } from '../../logviewer.context'; @customElement('umb-log-viewer-search-view') export class UmbLogViewerSearchViewElement extends UmbLitElement { @@ -39,6 +40,25 @@ export class UmbLogViewerSearchViewElement extends UmbLitElement { `, ]; + @state() + private _canShowLogs = false; + + #logViewerContext?: UmbLogViewerWorkspaceContext; + constructor() { + super(); + this.consumeContext(UMB_APP_LOG_VIEWER_CONTEXT_TOKEN, (instance) => { + this.#logViewerContext = instance; + this.#observeCanShowLogs(); + }); + } + + #observeCanShowLogs() { + if (!this.#logViewerContext) return; + this.observe(this.#logViewerContext.canShowLogs, (canShowLogs) => { + this._canShowLogs = canShowLogs ?? false; + }); + } + render() { return html`
    @@ -52,7 +72,9 @@ export class UmbLogViewerSearchViewElement extends UmbLitElement {
    - + ${this._canShowLogs + ? html`` + : html``}
    `; } From 1a2857d1c923a000e3f48fa11cdb28749258b354 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20Lyngs=C3=B8?= Date: Thu, 9 Mar 2023 10:27:33 +0100 Subject: [PATCH 57/57] comments --- .../button-with-dropdown/button-with-dropdown.element.ts | 3 ++- .../backoffice/shared/components/dropdown/dropdown.element.ts | 1 + 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/button-with-dropdown/button-with-dropdown.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/button-with-dropdown/button-with-dropdown.element.ts index edd1112aee..b9aeb923cd 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/button-with-dropdown/button-with-dropdown.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/button-with-dropdown/button-with-dropdown.element.ts @@ -4,7 +4,8 @@ import { customElement, property, query } from 'lit/decorators.js'; import { PopoverPlacement, UUIPopoverElement, UUISymbolExpandElement } from '@umbraco-ui/uui'; import { InterfaceColor, InterfaceLook } from '@umbraco-ui/uui-base/lib/types'; -//TODO: maybe this should go to UI library? It's a common pattern +// TODO: maybe this should go to UI library? It's a common pattern +// TODO: consider not using this, but instead use dropdown, which is more generic shared component of backoffice. (this is at the movement only used in Log Viewer) @customElement('umb-button-with-dropdown') export class UmbButtonWithDropdownElement extends LitElement { static styles = [ diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/dropdown/dropdown.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/dropdown/dropdown.element.ts index ab21ee4f5e..20a72a57d9 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/dropdown/dropdown.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/dropdown/dropdown.element.ts @@ -3,6 +3,7 @@ import { css, html, nothing } from 'lit'; import { customElement, property } from 'lit/decorators.js'; import { UmbLitElement } from '@umbraco-cms/element'; +// TODO: maybe move this to UI Library. @customElement('umb-dropdown') export class UmbDropdownElement extends UmbLitElement { static styles = [