Merge remote-tracking branch 'origin/main' into feature/tinymce-servervariables
This commit is contained in:
@@ -40,7 +40,7 @@ jobs:
|
||||
- run: npx playwright install --with-deps
|
||||
- run: npm test
|
||||
- name: Upload Code Coverage reports
|
||||
uses: actions/upload-artifact@v3
|
||||
uses: actions/upload-artifact@v4
|
||||
if: always()
|
||||
with:
|
||||
name: code-coverage
|
||||
|
||||
@@ -42,7 +42,7 @@ jobs:
|
||||
|
||||
# Initializes the CodeQL tools for scanning.
|
||||
- name: Initialize CodeQL
|
||||
uses: github/codeql-action/init@v2
|
||||
uses: github/codeql-action/init@v3
|
||||
with:
|
||||
languages: ${{ matrix.language }}
|
||||
# If you wish to specify custom queries, you can do so here or in a config file.
|
||||
@@ -53,4 +53,4 @@ jobs:
|
||||
# queries: security-extended,security-and-quality
|
||||
|
||||
- name: Perform CodeQL Analysis
|
||||
uses: github/codeql-action/analyze@v2
|
||||
uses: github/codeql-action/analyze@v3
|
||||
|
||||
@@ -31,6 +31,6 @@ jobs:
|
||||
ignore-globs: "**/.git/**,*.md,*.mdx,*.stories.ts,*.js"
|
||||
|
||||
- name: Upload DevSkim scan results to GitHub Security tab
|
||||
uses: github/codeql-action/upload-sarif@v2
|
||||
uses: github/codeql-action/upload-sarif@v3
|
||||
with:
|
||||
sarif_file: devskim-results.sarif
|
||||
|
||||
@@ -23,6 +23,7 @@ export class UmbLogViewerDateRangeSelectorElement extends UmbLitElement {
|
||||
horizontal = false;
|
||||
|
||||
#logViewerContext?: UmbLogViewerWorkspaceContext;
|
||||
|
||||
constructor() {
|
||||
super();
|
||||
this.addEventListener('input', this.#setDates);
|
||||
@@ -31,13 +32,21 @@ export class UmbLogViewerDateRangeSelectorElement extends UmbLitElement {
|
||||
this.#observeStuff();
|
||||
});
|
||||
}
|
||||
disconnectedCallback(): void {
|
||||
super.disconnectedCallback();
|
||||
this.removeEventListener('input', this.#setDates);
|
||||
}
|
||||
|
||||
#observeStuff() {
|
||||
if (!this.#logViewerContext) return;
|
||||
this.observe(this.#logViewerContext.dateRange, (dateRange: LogViewerDateRange) => {
|
||||
this._startDate = dateRange?.startDate;
|
||||
this._endDate = dateRange?.endDate;
|
||||
});
|
||||
this.observe(
|
||||
this.#logViewerContext.dateRange,
|
||||
(dateRange: LogViewerDateRange) => {
|
||||
this._startDate = dateRange.startDate;
|
||||
this._endDate = dateRange.endDate;
|
||||
},
|
||||
'_observeDateRange',
|
||||
);
|
||||
}
|
||||
|
||||
#setDates() {
|
||||
@@ -48,6 +57,7 @@ export class UmbLogViewerDateRangeSelectorElement extends UmbLitElement {
|
||||
this._endDate = input.value;
|
||||
}
|
||||
});
|
||||
this.#logViewerContext?.setDateRange({ startDate: this._startDate, endDate: this._endDate });
|
||||
|
||||
const query = getQuery();
|
||||
const qs = toQueryString({
|
||||
@@ -61,35 +71,32 @@ export class UmbLogViewerDateRangeSelectorElement extends UmbLitElement {
|
||||
|
||||
render() {
|
||||
return html`
|
||||
<div class="input-container">
|
||||
<uui-label for="start-date">From:</uui-label>
|
||||
<input
|
||||
@click=${(e: Event) => {
|
||||
(e.target as HTMLInputElement).showPicker();
|
||||
}}
|
||||
|
||||
id="start-date"
|
||||
type="date"
|
||||
label="From"
|
||||
.max=${this.#logViewerContext?.today ?? ''}
|
||||
.value=${this._startDate}>
|
||||
</input>
|
||||
</div>
|
||||
<div class="input-container">
|
||||
<uui-label for="end-date">To: </uui-label>
|
||||
<input
|
||||
@click=${(e: Event) => {
|
||||
(e.target as HTMLInputElement).showPicker();
|
||||
}}
|
||||
id="end-date"
|
||||
type="date"
|
||||
label="To"
|
||||
.min=${this._startDate}
|
||||
.max=${this.#logViewerContext?.today ?? ''}
|
||||
.value=${this._endDate}>
|
||||
</input>
|
||||
</div>
|
||||
`;
|
||||
<div class="input-container">
|
||||
<uui-label for="start-date">From:</uui-label>
|
||||
<input
|
||||
@click=${(e: Event) => {
|
||||
(e.target as HTMLInputElement).showPicker();
|
||||
}}
|
||||
id="start-date"
|
||||
type="date"
|
||||
label="From"
|
||||
.max=${this.#logViewerContext?.today ?? ''}
|
||||
.value=${this._startDate} />
|
||||
</div>
|
||||
<div class="input-container">
|
||||
<uui-label for="end-date">To: </uui-label>
|
||||
<input
|
||||
@click=${(e: Event) => {
|
||||
(e.target as HTMLInputElement).showPicker();
|
||||
}}
|
||||
id="end-date"
|
||||
type="date"
|
||||
label="To"
|
||||
.min=${this._startDate}
|
||||
.max=${this.#logViewerContext?.today ?? ''}
|
||||
.value=${this._endDate} />
|
||||
</div>
|
||||
`;
|
||||
}
|
||||
|
||||
static styles = [
|
||||
|
||||
@@ -134,17 +134,12 @@ export class UmbLogViewerWorkspaceContext extends UmbBaseController implements U
|
||||
}
|
||||
this.setLogLevelsFilter(validLogLevels);
|
||||
|
||||
const dateRange: Partial<LogViewerDateRange> = {};
|
||||
const dateRange: LogViewerDateRange = this.getDateRange() as LogViewerDateRange;
|
||||
|
||||
if (searchQuery.startDate) {
|
||||
dateRange.startDate = searchQuery.startDate;
|
||||
}
|
||||
|
||||
if (searchQuery.endDate) {
|
||||
dateRange.endDate = searchQuery.endDate;
|
||||
}
|
||||
|
||||
this.setDateRange(dateRange);
|
||||
this.setDateRange({
|
||||
startDate: searchQuery.startDate || dateRange.startDate,
|
||||
endDate: searchQuery.endDate || dateRange.endDate,
|
||||
});
|
||||
|
||||
this.setCurrentPage(searchQuery.page ? Number(searchQuery.page) : 1);
|
||||
|
||||
@@ -169,6 +164,10 @@ export class UmbLogViewerWorkspaceContext extends UmbBaseController implements U
|
||||
this.getMessageTemplates(0, 10);
|
||||
}
|
||||
|
||||
getDateRange() {
|
||||
return this.#dateRange.getValue();
|
||||
}
|
||||
|
||||
async getSavedSearches() {
|
||||
const { data } = await this.#repository.getSavedSearches({ skip: 0, take: 100 });
|
||||
if (data) {
|
||||
|
||||
@@ -37,7 +37,7 @@ export class UmbLogViewerMessageTemplatesOverviewElement extends UmbLitElement {
|
||||
<uui-button
|
||||
label="${searchListItem.name ?? ''}"
|
||||
title="${searchListItem.name ?? ''}"
|
||||
href=${`section/settings/workspace/logviewer/search/?lq=${searchListItem.query}`}>
|
||||
href=${`section/settings/workspace/logviewer/view/search/?lq=${searchListItem.query}`}>
|
||||
<uui-icon name="icon-search"></uui-icon>${searchListItem.name}
|
||||
</uui-button>
|
||||
</li>`;
|
||||
@@ -59,7 +59,7 @@ export class UmbLogViewerMessageTemplatesOverviewElement extends UmbLitElement {
|
||||
html`<uui-table-row>
|
||||
<uui-table-cell>
|
||||
<a
|
||||
href=${`section/settings/workspace/logviewer/search/?lq=${encodeURIComponent(
|
||||
href=${`section/settings/workspace/logviewer/view/search/?lq=${encodeURIComponent(
|
||||
`@MessageTemplate='${template.messageTemplate}'`,
|
||||
)}`}>
|
||||
<span>${template.messageTemplate}</span> <span>${template.count}</span>
|
||||
|
||||
@@ -7,7 +7,7 @@ import { UmbLitElement } from '@umbraco-cms/internal/lit-element';
|
||||
@customElement('umb-log-viewer-overview-view')
|
||||
export class UmbLogViewerOverviewViewElement extends UmbLitElement {
|
||||
@state()
|
||||
private _errorCount = 0;
|
||||
private _errorCount?: number;
|
||||
|
||||
@state()
|
||||
private _logLevelCount: LogLevelCountsReponseModel | null = null;
|
||||
@@ -30,7 +30,7 @@ export class UmbLogViewerOverviewViewElement extends UmbLitElement {
|
||||
if (!this.#logViewerContext) return;
|
||||
|
||||
this.observe(this.#logViewerContext.logCount, (logLevelCount) => {
|
||||
this._errorCount = logLevelCount?.error ?? 0;
|
||||
this._errorCount = logLevelCount?.error;
|
||||
});
|
||||
}
|
||||
|
||||
@@ -52,11 +52,13 @@ export class UmbLogViewerOverviewViewElement extends UmbLitElement {
|
||||
<uui-box id="errors" headline="Number of Errors">
|
||||
<uui-button
|
||||
label="Show error logs"
|
||||
href=${`section/settings/workspace/logviewer/search/?lq=${encodeURIComponent(
|
||||
href=${`section/settings/workspace/logviewer/view/search/?lq=${encodeURIComponent(
|
||||
`@Level='Fatal' or @Level='Error' or Has(@Exception)`,
|
||||
)}`}>
|
||||
<h2 id="error-count">${this._errorCount}</h2></uui-button
|
||||
>
|
||||
<h2 id="error-count">
|
||||
${this._errorCount === undefined ? html`<uui-loader></uui-loader>` : this._errorCount}
|
||||
</h2>
|
||||
</uui-button>
|
||||
</uui-box>
|
||||
|
||||
<uui-box id="level" headline="Log level">
|
||||
|
||||
@@ -170,7 +170,9 @@ export class UmbLogViewerMessageElement extends UmbLitElement {
|
||||
look="secondary"
|
||||
label="Find logs with ${property.name}"
|
||||
title="Find logs with ${property.name}"
|
||||
href=${`section/settings/workspace/logviewer/search/?${this._findLogsWithProperty(property)}`}>
|
||||
href=${`section/settings/workspace/logviewer/view/search/?${this._findLogsWithProperty(
|
||||
property,
|
||||
)}`}>
|
||||
<uui-icon name="icon-search"></uui-icon>
|
||||
</uui-button>`
|
||||
: ''}
|
||||
|
||||
@@ -88,41 +88,46 @@ export class UmbLogViewerMessagesListElement extends UmbLitElement {
|
||||
.exception=${log.exception ?? ''}
|
||||
.messageTemplate=${log.messageTemplate ?? ''}></umb-log-viewer-message>`,
|
||||
)}`
|
||||
: html`<umb-empty-state size="small"
|
||||
><span id="empty">
|
||||
: html`<umb-empty-state size="small">
|
||||
<span id="empty">
|
||||
<uui-icon name="icon-search"></uui-icon>Sorry, we cannot find what you are looking for.
|
||||
</span></umb-empty-state
|
||||
>`}`;
|
||||
</span>
|
||||
</umb-empty-state>`}`;
|
||||
}
|
||||
|
||||
render() {
|
||||
// TODO: the table should scroll instead of the whole main div
|
||||
return html`
|
||||
<div id="header" slot="header">
|
||||
<div id="timestamp">
|
||||
Timestamp
|
||||
<uui-button compact @click=${this.#sortLogs} label="Sort logs">
|
||||
<uui-symbol-sort
|
||||
?descending=${this._sortingDirection === DirectionModel.DESCENDING}
|
||||
active></uui-symbol-sort>
|
||||
</uui-button>
|
||||
return html`<uui-box>
|
||||
<div id="header" slot="header">
|
||||
<div id="timestamp">
|
||||
Timestamp
|
||||
<uui-button compact @click=${this.#sortLogs} label="Sort logs">
|
||||
<uui-symbol-sort
|
||||
?descending=${this._sortingDirection === DirectionModel.DESCENDING}
|
||||
active></uui-symbol-sort>
|
||||
</uui-button>
|
||||
</div>
|
||||
<div id="level">Level</div>
|
||||
<div id="machine">Machine name</div>
|
||||
<div id="message">Message</div>
|
||||
</div>
|
||||
<div id="level">Level</div>
|
||||
<div id="machine">Machine name</div>
|
||||
<div id="message">Message</div>
|
||||
</div>
|
||||
<div id="main">
|
||||
${this._isLoading
|
||||
? html`<umb-empty-state size="small"
|
||||
><span id="empty"> <uui-loader-circle></uui-loader-circle>Loading log messages... </span></umb-empty-state
|
||||
>`
|
||||
: html`${this.#renderLogs()}${this._renderPagination()}`}
|
||||
</div>
|
||||
`;
|
||||
<div id="main">
|
||||
${this._isLoading
|
||||
? html`<umb-empty-state size="small">
|
||||
<span id="empty"> <uui-loader-circle></uui-loader-circle>Loading log messages... </span>
|
||||
</umb-empty-state>`
|
||||
: html`${this.#renderLogs()}`}
|
||||
</div>
|
||||
</uui-box>
|
||||
${this._renderPagination()} `;
|
||||
}
|
||||
|
||||
static styles = [
|
||||
css`
|
||||
uui-box {
|
||||
--uui-box-default-padding: 0;
|
||||
}
|
||||
|
||||
:host {
|
||||
height: 100%;
|
||||
display: flex;
|
||||
@@ -168,6 +173,7 @@ export class UmbLogViewerMessagesListElement extends UmbLitElement {
|
||||
}
|
||||
|
||||
#pagination {
|
||||
display: block;
|
||||
margin: var(--uui-size-space-5, 18px) 0;
|
||||
}
|
||||
`,
|
||||
|
||||
@@ -10,6 +10,7 @@ import {
|
||||
UmbModalManagerContext,
|
||||
UmbModalContext,
|
||||
UmbModalToken,
|
||||
UMB_CONFIRM_MODAL,
|
||||
} from '@umbraco-cms/backoffice/modal';
|
||||
|
||||
import './log-viewer-search-input-modal.element.js';
|
||||
@@ -130,7 +131,19 @@ export class UmbLogViewerSearchInputElement extends UmbLitElement {
|
||||
}
|
||||
|
||||
#removeSearch(name: string) {
|
||||
this.#logViewerContext?.removeSearch({ name });
|
||||
const modalContext = this._modalContext?.open(UMB_CONFIRM_MODAL, {
|
||||
data: {
|
||||
headline: this.localize.term('logViewer_deleteSavedSearch'),
|
||||
content: `${this.localize.term('defaultdialogs_confirmdelete')} ${name}?`,
|
||||
color: 'danger',
|
||||
confirmLabel: 'Delete',
|
||||
},
|
||||
});
|
||||
|
||||
modalContext?.onSubmit().then(() => {
|
||||
this.#logViewerContext?.removeSearch({ name });
|
||||
//this.dispatchEvent(new UmbDeleteEvent());
|
||||
});
|
||||
}
|
||||
|
||||
#openSaveSearchDialog() {
|
||||
@@ -168,8 +181,8 @@ export class UmbLogViewerSearchInputElement extends UmbLitElement {
|
||||
><uui-icon name="icon-delete"></uui-icon
|
||||
></uui-button>`
|
||||
: html``}
|
||||
<umb-dropdown id="search-dropdown" slot="append" label="Saved searches">
|
||||
<span slot="label">Saved searches</span>
|
||||
<umb-dropdown id="search-dropdown" slot="append" label=${this.localize.term('logViewer_savedSearches')}>
|
||||
<span slot="label"><umb-localize key="logViewer_savedSearches">Saved searches</umb-localize></span>
|
||||
<uui-scroll-container id="saved-searches-container" role="list">
|
||||
${this._savedSearches.map(
|
||||
(search) =>
|
||||
|
||||
@@ -46,12 +46,9 @@ export class UmbLogViewerSearchViewElement extends UmbLitElement {
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<uui-box>
|
||||
${this._canShowLogs
|
||||
? html`<umb-log-viewer-messages-list></umb-log-viewer-messages-list>`
|
||||
: html`<umb-log-viewer-to-many-logs-warning
|
||||
id="to-many-logs-warning"></umb-log-viewer-to-many-logs-warning>`}
|
||||
</uui-box>
|
||||
${this._canShowLogs
|
||||
? html`<umb-log-viewer-messages-list></umb-log-viewer-messages-list>`
|
||||
: html`<umb-log-viewer-to-many-logs-warning id="to-many-logs-warning"></umb-log-viewer-to-many-logs-warning>`}
|
||||
</umb-body-layout>
|
||||
`;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user