feat(dees-table): add configurable cell flash comparison and border highlight mode
This commit is contained in:
@@ -695,6 +695,7 @@ export class DeesTable<T> extends DeesElement {
|
||||
this.__editingCell?.rowId === rowId &&
|
||||
this.__editingCell?.colKey === editKey;
|
||||
const isFlashing = !!flashSet?.has(editKey);
|
||||
const useFlashBorder = isFlashing && !!col.flashBorder;
|
||||
const cellClasses = [
|
||||
isEditable ? 'editable' : '',
|
||||
isFocused && !isEditing ? 'focused' : '',
|
||||
@@ -702,8 +703,13 @@ export class DeesTable<T> extends DeesElement {
|
||||
]
|
||||
.filter(Boolean)
|
||||
.join(' ');
|
||||
const flashClass = isFlashing
|
||||
? useFlashBorder
|
||||
? 'innerCellContainer flashing-border'
|
||||
: 'innerCellContainer flashing'
|
||||
: 'innerCellContainer';
|
||||
const innerHtml = html`<div
|
||||
class=${isFlashing ? 'innerCellContainer flashing' : 'innerCellContainer'}
|
||||
class=${flashClass}
|
||||
>
|
||||
${isEditing ? this.renderCellEditor(itemArg, col) : content}
|
||||
</div>`;
|
||||
@@ -1362,6 +1368,7 @@ export class DeesTable<T> extends DeesElement {
|
||||
|
||||
const effectiveColumns = this.__getEffectiveColumns();
|
||||
const visibleCols = effectiveColumns.filter((c) => !c.hidden);
|
||||
const colByKey = new Map<string, Column<T>>(visibleCols.map((c) => [String(c.key), c]));
|
||||
const nextSnapshot = new Map<string, Map<string, unknown>>();
|
||||
const newlyFlashing = new Map<string, Set<string>>();
|
||||
|
||||
@@ -1376,7 +1383,26 @@ export class DeesTable<T> extends DeesElement {
|
||||
const prevCells = this.__prevSnapshot?.get(rowId);
|
||||
if (!prevCells) continue; // new row — not an "update"
|
||||
for (const [colKey, nextVal] of cellMap) {
|
||||
if (prevCells.get(colKey) !== nextVal) {
|
||||
const prevVal = prevCells.get(colKey);
|
||||
|
||||
// Look up the column definition for flash options.
|
||||
const colDef = colByKey.get(colKey);
|
||||
|
||||
// Determine whether the cell changed.
|
||||
let changed: boolean;
|
||||
if (colDef?.flashCompare) {
|
||||
// Explicit custom comparator — caller decides.
|
||||
changed = colDef.flashCompare(prevVal, nextVal);
|
||||
} else if (nextVal !== null && nextVal !== undefined && typeof nextVal === 'object') {
|
||||
// Non-primitive (TemplateResult, object, array, etc.) — skip by
|
||||
// default. Custom renderings don't benefit from the text-color
|
||||
// flash and reference inequality causes false positives.
|
||||
changed = false;
|
||||
} else {
|
||||
changed = prevVal !== nextVal;
|
||||
}
|
||||
|
||||
if (changed) {
|
||||
// Don't flash the cell the user is actively editing.
|
||||
if (
|
||||
this.__editingCell &&
|
||||
|
||||
Reference in New Issue
Block a user