Compare commits
6 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 26ca16a284 | |||
| 3ab3eb5e5e | |||
| da5dbc70e2 | |||
| 19b7981542 | |||
| bad105074e | |||
| f124091784 |
23
changelog.md
23
changelog.md
@@ -1,5 +1,28 @@
|
||||
# Changelog
|
||||
|
||||
## 2026-02-24 - 3.43.3 - fix(dees-table)
|
||||
use lucide icon identifier for Search action in dees-table
|
||||
|
||||
- Replaced iconName 'magnifyingGlass' with 'lucide:Search' in ts_web/elements/00group-dataview/dees-table/dees-table.ts
|
||||
- Updates the icon identifier for the header 'Search' action; no functional behavior changed
|
||||
|
||||
## 2026-02-21 - 3.43.2 - fix(dees-chart-log)
|
||||
avoid duplicate log entries, optimize incremental updates, enforce maxEntries, and respect filters when writing logs
|
||||
|
||||
- Prevent property-bound logEntries from duplicating entries already present in logBuffer by deduplicating on timestamp|message
|
||||
- Call updateMetrics() when replaying or appending log entries so metrics stay accurate
|
||||
- Skip processing entirely when the incoming logEntries array is unchanged
|
||||
- Optimize append-only updates by writing only the new tail entries instead of full re-render
|
||||
- Enforce maxEntries when appending to the logBuffer to maintain buffer size
|
||||
- Respect filterMode and searchQuery when deciding whether to write appended entries to the terminal
|
||||
|
||||
## 2026-02-21 - 3.43.1 - fix(dees-chart-log)
|
||||
replay buffered log entries when terminal becomes ready and sync logEntries updates to re-render filtered logs
|
||||
|
||||
- Replay entries stored in logBuffer after terminal initialization to avoid losing entries that arrived early
|
||||
- Add updated() lifecycle hook to copy logEntries into logBuffer and call reRenderFilteredLogs when terminalReady
|
||||
- Call super.updated(changedProperties) to preserve base class behavior
|
||||
|
||||
## 2026-02-17 - 3.43.0 - feat(dees-form)
|
||||
add layout styles to dees-form and standardize demo input grouping
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@design.estate/dees-catalog",
|
||||
"version": "3.43.0",
|
||||
"version": "3.43.3",
|
||||
"private": false,
|
||||
"description": "A comprehensive library that provides dynamic web components for building sophisticated and modern web applications using JavaScript and TypeScript.",
|
||||
"main": "dist_ts_web/index.js",
|
||||
|
||||
@@ -3,6 +3,6 @@
|
||||
*/
|
||||
export const commitinfo = {
|
||||
name: '@design.estate/dees-catalog',
|
||||
version: '3.43.0',
|
||||
version: '3.43.3',
|
||||
description: 'A comprehensive library that provides dynamic web components for building sophisticated and modern web applications using JavaScript and TypeScript.'
|
||||
}
|
||||
|
||||
@@ -385,11 +385,23 @@ export class DeesChartLog extends DeesElement {
|
||||
this.domtoolsInstance = await this.domtoolsPromise;
|
||||
await this.initializeTerminal();
|
||||
|
||||
// Process any initial log entries
|
||||
if (this.logEntries.length > 0) {
|
||||
// initializeTerminal() already replayed logBuffer (from addLog/updateLog).
|
||||
// Now handle logEntries set via property binding before terminal was ready.
|
||||
if (this.logEntries.length > 0 && this.logBuffer.length === 0) {
|
||||
this.logBuffer = [...this.logEntries];
|
||||
for (const entry of this.logEntries) {
|
||||
this.updateMetrics(entry.level);
|
||||
this.writeLogEntry(entry);
|
||||
}
|
||||
} else if (this.logEntries.length > 0 && this.logBuffer.length > 0) {
|
||||
const bufferSet = new Set(this.logBuffer.map(e => `${e.timestamp}|${e.message}`));
|
||||
for (const entry of this.logEntries) {
|
||||
if (!bufferSet.has(`${entry.timestamp}|${entry.message}`)) {
|
||||
this.logBuffer.push(entry);
|
||||
this.updateMetrics(entry.level);
|
||||
this.writeLogEntry(entry);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -445,6 +457,58 @@ export class DeesChartLog extends DeesElement {
|
||||
this.rateInterval = setInterval(() => this.calculateRate(), 1000);
|
||||
|
||||
this.terminalReady = true;
|
||||
|
||||
// Replay any entries that arrived via updateLog()/addLog() before terminal was ready
|
||||
for (const entry of this.logBuffer) {
|
||||
this.writeLogEntry(entry);
|
||||
}
|
||||
}
|
||||
|
||||
public updated(changedProperties: Map<string, any>) {
|
||||
super.updated(changedProperties);
|
||||
if (changedProperties.has('logEntries') && this.terminalReady && this.logEntries.length > 0) {
|
||||
const oldEntries: ILogEntry[] = changedProperties.get('logEntries') || [];
|
||||
const newEntries = this.logEntries;
|
||||
|
||||
// Same content? Skip entirely.
|
||||
if (
|
||||
oldEntries.length === newEntries.length &&
|
||||
oldEntries.length > 0 &&
|
||||
oldEntries[oldEntries.length - 1].timestamp === newEntries[newEntries.length - 1].timestamp &&
|
||||
oldEntries[oldEntries.length - 1].message === newEntries[newEntries.length - 1].message
|
||||
) {
|
||||
return;
|
||||
}
|
||||
|
||||
// Append-only? Write only the new tail entries incrementally.
|
||||
if (
|
||||
newEntries.length > oldEntries.length &&
|
||||
oldEntries.length > 0 &&
|
||||
oldEntries[oldEntries.length - 1].timestamp === newEntries[oldEntries.length - 1].timestamp &&
|
||||
oldEntries[oldEntries.length - 1].message === newEntries[oldEntries.length - 1].message
|
||||
) {
|
||||
const tailEntries = newEntries.slice(oldEntries.length);
|
||||
for (const entry of tailEntries) {
|
||||
this.logBuffer.push(entry);
|
||||
this.updateMetrics(entry.level);
|
||||
|
||||
// Enforce maxEntries
|
||||
if (this.logBuffer.length > this.maxEntries) {
|
||||
this.logBuffer.shift();
|
||||
}
|
||||
|
||||
// Respect filter mode
|
||||
if (!this.filterMode || !this.searchQuery || this.entryMatchesFilter(entry)) {
|
||||
this.writeLogEntry(entry);
|
||||
}
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
// Different content — full re-render
|
||||
this.logBuffer = [...newEntries];
|
||||
this.reRenderFilteredLogs();
|
||||
}
|
||||
}
|
||||
|
||||
private getTerminalTheme() {
|
||||
|
||||
@@ -544,7 +544,7 @@ export class DeesTable<T> extends DeesElement {
|
||||
if (!existing) {
|
||||
this.dataActions.unshift({
|
||||
name: 'Search',
|
||||
iconName: 'magnifyingGlass',
|
||||
iconName: 'lucide:Search',
|
||||
type: ['header'],
|
||||
actionFunc: async () => {
|
||||
console.log('open search');
|
||||
|
||||
Reference in New Issue
Block a user