wunderbaum 0.5.0 → 0.5.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -287,7 +287,6 @@ export class FilterExtension extends WunderbaumExtension {
287
287
  let tree = this.tree;
288
288
  // statusNode = tree.root.findDirectChild(KEY_NODATA),
289
289
  // escapeTitles = tree.options.escapeTitles;
290
- // enhanceTitle = tree.options.enhanceTitle,
291
290
  tree.enableUpdate(false);
292
291
 
293
292
  // if (statusNode) {
@@ -299,16 +298,10 @@ export class FilterExtension extends WunderbaumExtension {
299
298
  delete tree.root.subMatchCount;
300
299
 
301
300
  tree.visit((node) => {
302
- if (node.match && node._rowElem) {
303
- // #491, #601
304
- let titleElem = node._rowElem.querySelector("span.wb-title")!;
305
- // if (escapeTitles) {
306
- titleElem.textContent = node.title;
307
- // } else {
308
- // titleElem.innerHTML = node.title;
309
- // }
310
- node._callEvent("enhanceTitle", { titleElem: titleElem });
311
- }
301
+ // if (node.match && node._rowElem) {
302
+ // let titleElem = node._rowElem.querySelector("span.wb-title")!;
303
+ // node._callEvent("enhanceTitle", { titleElem: titleElem });
304
+ // }
312
305
  delete node.match;
313
306
  delete node.subMatchCount;
314
307
  delete node.titleWithHighlight;
@@ -11,7 +11,8 @@ import { Wunderbaum } from "./wunderbaum";
11
11
  export class LoggerExtension extends WunderbaumExtension {
12
12
  readonly prefix: string;
13
13
  protected ignoreEvents = new Set<string>([
14
- "enhanceTitle",
14
+ "iconBadge",
15
+ // "enhanceTitle",
15
16
  "render",
16
17
  "discard",
17
18
  ]);
package/src/wb_node.ts CHANGED
@@ -878,6 +878,11 @@ export class WunderbaumNode {
878
878
  return !this.selected && !!this._partsel;
879
879
  }
880
880
 
881
+ /** Return true if this node has DOM representaion, i.e. is displayed in the viewport. */
882
+ isRadio(): boolean {
883
+ return this.checkbox === "radio" || !!this.parent.radiogroup;
884
+ }
885
+
881
886
  /** Return true if this node has DOM representaion, i.e. is displayed in the viewport. */
882
887
  isRendered(): boolean {
883
888
  return !!this._rowElem;
@@ -1520,6 +1525,35 @@ export class WunderbaumNode {
1520
1525
  } else {
1521
1526
  parentElem.appendChild(iconSpan);
1522
1527
  }
1528
+
1529
+ // Event handler `tree.iconBadge` can return a badge text or HTMLSpanElement
1530
+
1531
+ let cbRes = this._callEvent("iconBadge", { iconSpan: iconSpan });
1532
+ let badge = null;
1533
+ if (cbRes != null && cbRes !== false) {
1534
+ let classes = "";
1535
+ let tooltip = "";
1536
+ if (util.isPlainObject(cbRes)) {
1537
+ badge = "" + cbRes.badge;
1538
+ classes = cbRes.badgeClass ? " " + cbRes.badgeClass : "";
1539
+ tooltip = cbRes.badgeTooltip ? ` title="${cbRes.badgeTooltip}"` : "";
1540
+ } else if (typeof cbRes === "number") {
1541
+ badge = "" + cbRes;
1542
+ } else {
1543
+ badge = cbRes; // string or HTMLSpanElement
1544
+ }
1545
+ if (typeof badge === "string") {
1546
+ badge = util.elemFromHtml(
1547
+ `<span class="wb-badge${classes}"${tooltip}>${util.escapeHtml(
1548
+ badge
1549
+ )}</span>`
1550
+ );
1551
+ }
1552
+ if (badge) {
1553
+ iconSpan.append(<HTMLSpanElement>badge);
1554
+ }
1555
+ }
1556
+
1523
1557
  // this.log("_createIcon: ", iconSpan);
1524
1558
  return iconSpan;
1525
1559
  }
@@ -1603,7 +1637,7 @@ export class WunderbaumNode {
1603
1637
  titleSpan.classList.add("wb-title");
1604
1638
  nodeElem.appendChild(titleSpan);
1605
1639
 
1606
- this._callEvent("enhanceTitle", { titleSpan: titleSpan });
1640
+ // this._callEvent("enhanceTitle", { titleSpan: titleSpan });
1607
1641
 
1608
1642
  // Store the width of leading icons with the node, so we can calculate
1609
1643
  // the width of the embedded title span later
@@ -2178,7 +2212,7 @@ export class WunderbaumNode {
2178
2212
  /** Toggle the check/uncheck state. */
2179
2213
  toggleSelected(options?: SetSelectedOptions): TristateType {
2180
2214
  let flag = this.isSelected();
2181
- if (flag === undefined) {
2215
+ if (flag === undefined && !this.isRadio()) {
2182
2216
  flag = this._anySelectable();
2183
2217
  } else {
2184
2218
  flag = !flag;
package/src/wb_options.ts CHANGED
@@ -18,8 +18,8 @@ import {
18
18
  WbChangeEventType,
19
19
  WbClickEventType,
20
20
  WbDeactivateEventType,
21
- WbEnhanceTitleEventType,
22
21
  WbErrorEventType,
22
+ WbIconBadgeCallback,
23
23
  WbInitEventType,
24
24
  WbKeydownEventType,
25
25
  WbNodeData,
@@ -258,7 +258,12 @@ export interface WunderbaumOptions {
258
258
  *
259
259
  * @category Callback
260
260
  */
261
- enhanceTitle?: (e: WbEnhanceTitleEventType) => void;
261
+ iconBadge?: WbIconBadgeCallback;
262
+ // /**
263
+ // *
264
+ // * @category Callback
265
+ // */
266
+ // enhanceTitle?: (e: WbEnhanceTitleEventType) => void;
262
267
  /**
263
268
  *
264
269
  * @category Callback
@@ -789,6 +789,26 @@ div.wunderbaum {
789
789
  }
790
790
  }
791
791
 
792
+ i.wb-icon {
793
+ position: relative;
794
+ > span.wb-badge {
795
+ position: absolute;
796
+ display: inline-block;
797
+ top: 0;
798
+ left: -0.6rem;
799
+ color: white; //var(--wb-dim-color);
800
+ background-color: var(--wb-bg-highlight-color);
801
+ padding: 0.2em 0.3rem 0.1em 0.3rem;
802
+ font-size: 60%;
803
+ font-weight: 200;
804
+ line-height: 1;
805
+ text-align: center;
806
+ white-space: nowrap;
807
+ // vertical-align: baseline;
808
+ border-radius: 0.5rem;
809
+ }
810
+ }
811
+
792
812
  /* Class 'wb-tristate' is used to mark checkboxes that should toggle like
793
813
  * indeterminate -> checked -> unchecked -> indeterminate ...
794
814
  */
package/src/wunderbaum.ts CHANGED
@@ -193,10 +193,11 @@ export class Wunderbaum {
193
193
  navigationModeOption: null, // NavModeEnum.startRow,
194
194
  quicksearch: true,
195
195
  // --- Events ---
196
- change: util.noop,
197
- enhanceTitle: util.noop,
198
- error: util.noop,
199
- receive: util.noop,
196
+ iconBadge: null,
197
+ change: null,
198
+ // enhanceTitle: null,
199
+ error: null,
200
+ receive: null,
200
201
  // --- Strings ---
201
202
  strings: {
202
203
  loadError: "Error",