wunderbaum 0.9.0 → 0.10.0

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.
@@ -94,6 +94,8 @@ div.wunderbaum div.wb-header {
94
94
  position: sticky;
95
95
  top: 0;
96
96
  z-index: 2;
97
+ user-select: none;
98
+ -webkit-user-select: none; /* Safari */
97
99
  }
98
100
  div.wunderbaum div.wb-header,
99
101
  div.wunderbaum div.wb-list-container {
@@ -202,6 +204,10 @@ div.wunderbaum div.wb-header span.wb-col-resizer {
202
204
  border: none;
203
205
  border-right: 2px solid var(--wb-border-color);
204
206
  height: 100%;
207
+ user-select: none;
208
+ -webkit-user-select: none;
209
+ }
210
+ div.wunderbaum div.wb-header span.wb-col-resizer.wb-col-resizer-active {
205
211
  cursor: col-resize;
206
212
  }
207
213
  div.wunderbaum span.wb-col {
@@ -219,6 +225,7 @@ div.wunderbaum span.wb-col:last-of-type {
219
225
  }
220
226
  div.wunderbaum span.wb-node {
221
227
  user-select: none;
228
+ -webkit-user-select: none;
222
229
  /* Fix Bootstrap Icon alignment */
223
230
  }
224
231
  div.wunderbaum span.wb-node i.wb-checkbox,
@@ -1 +1 @@
1
- {"version":3,"sourceRoot":"","sources":["../src/wunderbaum.scss"],"names":[],"mappings":";AAAA;AAAA;AAAA;AAAA;AAAA;AA2EA;AAAA;EAME;EAGA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EAGA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EAEA;EACA;EAEA;EACA;EACA;EACA;EAEA;EACA;EACA;EACA;EACA;EACA;EAEA;;;AAMF;EACE;;;AAGF;EACE;EACA;EACA;EACA;EACA;EAEA;EACA;EAEA;EACA;EACA;EACA;EACA;EAGA;AAsBA;AAuBA;AAwQA;AAoHA;AA8BA;AAgEA;AAEA;AAUA;AAoBA;AAYA;;AA/iBA;EAEE;;AAIF;EACE;EACA;;AAGF;EACE;EAEA;;AAMF;EACE;EACA;EACA;;AAGF;AAAA;EAEE;;AAKF;EACE;EACA;EACA;EACA;EACA;;AAMA;EACE;EACA;EACA;EACA;;AAIA;EACE;;AAKF;EAEE;;AAGF;EAEE;;AAGF;EACE;;AAOA;EAEE;EACA;;AAEA;EACE;;AAaN;EAEE;EACA;;AAEA;EACE;;AAON;EACE;;AAEA;EACE;;AAOF;EACE;;AAGF;EAEE;;AAGA;EACE;;AAKJ;EACE;EACA;;AAGF;EAEE;EACA;;AAEA;EAEE;;AAIJ;EACE;;AAGF;AAAA;AAAA;EAGE;EAcA;EASA;;AAGF;EAEE;;AAON;EACE;EACA;EACA;EACA;EACA;;AAEA;EACE;EAIA;;AAIF;EACE;EACA;EACA;EACA;;AAGF;EACE;EACA;EAEA;EACA;EAEA;EACA;EACA;EACA;;AAIJ;EACE;EACA;EAEA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACE;;AAIJ;EACE;AAqBA;;AAhBA;AAAA;AAAA;AAAA;EAIE;EACA;EACA;EACA;;AAGF;AAAA;EAEE;EACA;;AAIF;EACE;;AAGF;EACE;EACA;EACA;;AAMA;EACE;;AAIJ;AAAA;EAEE;EACA;EACA;EACA;;AAGF;EACE;EAEA;EACA;EACA;EACA;EACA;;AAUI;EACE;;AAON;EACE;;AAIJ;EACE;;AAEA;EACE;;AAIF;EACE;;AAGF;EACE;;AAEA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EAgBE;EACA;EACA;;AAGF;AAAA;EAEE;;AAcA;EACE;;AAWJ;EACE;;AAGF;EACE;;AAEA;EACE;;AAON;EACE;;AAEA;EACE;;AAQJ;EACE;;AASJ;EACE;;AAEA;EACE;;AAGF;EACE;;AAMJ;EACE;;AAaJ;EACE;;AAEA;EACE;;AAIJ;EACE;;AAEA;EACE;EACA;;AAGA;EACE;EACA;;AAEA;EAGE;EACA;EAGA;EACA;EACA;;AAgBR;AAAA;EAIE;EACA;EACA;;AAKF;EACE;;AAUE;AAAA;EAEE;;AAFF;AAAA;EAEE;;AAFF;AAAA;EAEE;;AAFF;AAAA;EAEE;;AAOJ;EAIE;EACA;;AAGF;AAAA;EAKE;EACA;;AAMF;AAAA;EAEE;EACA;EACA;EACA;;AAOF;EACE;;AAGF;AAAA;EAEE;;AAKA;EACE;;;AAMR;AAEA;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;EACA;;AAEA;EACE;EACA;;;AAQJ;AACA;AAAA;EAEE;;;AAGF;AAAA;EAEE;;;AAIA;AAAA;EAEE;;AAGF;AAAA;EAEE;;;AAIJ;EACE;;AAEA;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EAEA;EACA;;;AAIJ;AAAA;AAAA;AAMA;EACE;EACA;;;AAGF;EAGE;;;AAGF;EACE;;;AAKF;EACE;IACE;;EAGF;IACE;;;AAIJ;EACE;IACE;;EAGF;IACE;;;AAIJ;EACE;IACE;;EAGF;IACE","file":"wunderbaum.css"}
1
+ {"version":3,"sourceRoot":"","sources":["../src/wunderbaum.scss"],"names":[],"mappings":";AAAA;AAAA;AAAA;AAAA;AAAA;AA2EA;AAAA;EAME;EAGA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EAGA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EAEA;EACA;EAEA;EACA;EACA;EACA;EAEA;EACA;EACA;EACA;EACA;EACA;EAEA;;;AAMF;EACE;;;AAGF;EACE;EACA;EACA;EACA;EACA;EAEA;EACA;EAEA;EACA;EACA;EACA;EACA;EAGA;AAsBA;AAyBA;AA8QA;AAoHA;AA8BA;AAgEA;AAEA;AAUA;AAoBA;AAYA;;AAvjBA;EAEE;;AAIF;EACE;EACA;;AAGF;EACE;EAEA;;AAMF;EACE;EACA;EACA;EACA;EACA;;AAGF;AAAA;EAEE;;AAKF;EACE;EACA;EACA;EACA;EACA;;AAMA;EACE;EACA;EACA;EACA;;AAIA;EACE;;AAKF;EAEE;;AAGF;EAEE;;AAGF;EACE;;AAOA;EAEE;EACA;;AAEA;EACE;;AAaN;EAEE;EACA;;AAEA;EACE;;AAON;EACE;;AAEA;EACE;;AAOF;EACE;;AAGF;EAEE;;AAGA;EACE;;AAKJ;EACE;EACA;;AAGF;EAEE;EACA;;AAEA;EAEE;;AAIJ;EACE;;AAGF;AAAA;AAAA;EAGE;EAcA;EASA;;AAGF;EAEE;;AAON;EACE;EACA;EACA;EACA;EACA;;AAEA;EACE;EAIA;;AAIF;EACE;EACA;EACA;EACA;;AAGF;EACE;EACA;EAEA;EACA;EAEA;EACA;EACA;EACA;EACA;;AACA;EACE;;AAMN;EACE;EACA;EAEA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACE;;AAIJ;EACE;EACA;AAqBA;;AAhBA;AAAA;AAAA;AAAA;EAIE;EACA;EACA;EACA;;AAGF;AAAA;EAEE;EACA;;AAIF;EACE;;AAGF;EACE;EACA;EACA;;AAMA;EACE;;AAIJ;AAAA;EAEE;EACA;EACA;EACA;;AAGF;EACE;EAEA;EACA;EACA;EACA;EACA;;AAUI;EACE;;AAON;EACE;;AAIJ;EACE;;AAEA;EACE;;AAIF;EACE;;AAGF;EACE;;AAEA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EAgBE;EACA;EACA;;AAGF;AAAA;EAEE;;AAcA;EACE;;AAWJ;EACE;;AAGF;EACE;;AAEA;EACE;;AAON;EACE;;AAEA;EACE;;AAQJ;EACE;;AASJ;EACE;;AAEA;EACE;;AAGF;EACE;;AAMJ;EACE;;AAaJ;EACE;;AAEA;EACE;;AAIJ;EACE;;AAEA;EACE;EACA;;AAGA;EACE;EACA;;AAEA;EAGE;EACA;EAGA;EACA;EACA;;AAgBR;AAAA;EAIE;EACA;EACA;;AAKF;EACE;;AAUE;AAAA;EAEE;;AAFF;AAAA;EAEE;;AAFF;AAAA;EAEE;;AAFF;AAAA;EAEE;;AAOJ;EAIE;EACA;;AAGF;AAAA;EAKE;EACA;;AAMF;AAAA;EAEE;EACA;EACA;EACA;;AAOF;EACE;;AAGF;AAAA;EAEE;;AAKA;EACE;;;AAMR;AAEA;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;EACA;;AAEA;EACE;EACA;;;AAQJ;AACA;AAAA;EAEE;;;AAGF;AAAA;EAEE;;;AAIA;AAAA;EAEE;;AAGF;AAAA;EAEE;;;AAIJ;EACE;;AAEA;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EAEA;EACA;;;AAIJ;AAAA;AAAA;AAMA;EACE;EACA;;;AAGF;EAGE;;;AAGF;EACE;;;AAKF;EACE;IACE;;EAGF;IACE;;;AAIJ;EACE;IACE;;EAGF;IACE;;;AAIJ;EACE;IACE;;EAGF;IACE","file":"wunderbaum.css"}
@@ -374,6 +374,24 @@ declare module "util" {
374
374
  export function getOption(opts: any, name: string, defaultValue?: any): any;
375
375
  /** Convert an Array or space-separated string to a Set. */
376
376
  export function toSet(val: any): Set<string>;
377
+ /** Convert a pixel string to number.
378
+ * We accept a number or a string like '123px'. If undefined, the first default
379
+ * value that is a number or a string ending with 'px' is returned.
380
+ *
381
+ * Example:
382
+ * ```js
383
+ * const width = util.toPixel("123px", 100);
384
+ * ```
385
+ */
386
+ export function toPixel(...defaults: (string | number | undefined | null)[]): number;
387
+ /** Evaluate a boolean value using default if undefined.
388
+ * Example:
389
+ * ```js
390
+ * const opts = { flag: true };
391
+ * const value = util.toBool(opts.flag, otherVar, false);
392
+ * ```
393
+ */
394
+ export function toBool(...boolDefaults: (boolean | undefined | null)[]): boolean;
377
395
  /** Return a canonical string representation for an object's type (e.g. 'array', 'number', ...). */
378
396
  export function type(obj: any): string;
379
397
  /**
@@ -416,6 +434,8 @@ declare module "common" {
416
434
  export const RENDER_MAX_PREFETCH = 5;
417
435
  /** Skip rendering new rows when we have at least N nodes rendeed above and below the viewport. */
418
436
  export const RENDER_MIN_PREFETCH = 5;
437
+ /** Minimum column width if not set otherwise. */
438
+ export const DEFAULT_MIN_COL_WIDTH = 4;
419
439
  /** Regular expression to detect if a string describes an image URL (in contrast
420
440
  * to a class name). Strings are considered image urls if they contain '.' or '/'.
421
441
  */
@@ -1217,6 +1237,11 @@ declare module "wb_options" {
1217
1237
  * Default: false
1218
1238
  */
1219
1239
  fixedCol?: boolean;
1240
+ /**
1241
+ * Default value for ColumnDefinition.resizable option.
1242
+ * Default: false
1243
+ */
1244
+ resizableColumns?: boolean;
1220
1245
  /**
1221
1246
  * Default: "multi"
1222
1247
  */
@@ -1386,6 +1411,8 @@ declare module "types" {
1386
1411
  export type TristateType = boolean | undefined;
1387
1412
  /** Show/hide checkbox or display a radiobutton icon instead. */
1388
1413
  export type CheckboxOption = boolean | "radio";
1414
+ /** A value that can either be true, false, or undefined. */
1415
+ export type SortOrderType = "asc" | "desc" | undefined;
1389
1416
  /** An icon may either be
1390
1417
  * a string-tag that references an entry in the `iconMap` (e.g. `"folderOpen"`)),
1391
1418
  * an HTML string that contains a `<` and is used as-is,
@@ -1667,6 +1694,22 @@ declare module "types" {
1667
1694
  * Default: `4px`.
1668
1695
  */
1669
1696
  minWidth?: string | number;
1697
+ /** Allow user to resize the column.
1698
+ * Default: false.
1699
+ */
1700
+ resizable?: boolean;
1701
+ /** Optional custom column width when user resized by mouse drag.
1702
+ * Default: unset.
1703
+ */
1704
+ customWidthPx?: number;
1705
+ /** Allow user to sort the column.
1706
+ * Default: false.
1707
+ */
1708
+ sortable?: boolean;
1709
+ /** Optional custom column sort orde when user clicked the sort icon.
1710
+ * Default: unset.
1711
+ */
1712
+ sortOrder?: SortOrderType;
1670
1713
  /** Optional class names that are added to all `span.wb-col` header AND data
1671
1714
  * elements of that column.
1672
1715
  */
@@ -2372,8 +2415,15 @@ declare module "drag_observer" {
2372
2415
  export type DragCallbackArgType = {
2373
2416
  /** "dragstart", "drag", or "dragstop". */
2374
2417
  type: string;
2375
- /** Original mouse or touch event that triggered the drag event. */
2418
+ /** Original mousedown or touch event that triggered the dragstart event. */
2419
+ startEvent: MouseEvent | TouchEvent;
2420
+ /** Original mouse or touch event that triggered the current drag event.
2421
+ * Note that this is not the same as `startEvent`, but a mousemove in case of
2422
+ * a dragstart threshold.
2423
+ */
2376
2424
  event: MouseEvent | TouchEvent;
2425
+ /** Custom data that was passed to the DragObserver, typically on dragstart. */
2426
+ customData: any;
2377
2427
  /** Element which is currently dragged. */
2378
2428
  dragElem: HTMLElement | null;
2379
2429
  /** Relative horizontal drag distance since start. */
@@ -2403,6 +2453,7 @@ declare module "drag_observer" {
2403
2453
  protected _handler: any;
2404
2454
  protected root: EventTarget;
2405
2455
  protected start: {
2456
+ event: MouseEvent | TouchEvent | null;
2406
2457
  x: number;
2407
2458
  y: number;
2408
2459
  altKey: boolean;
@@ -2412,6 +2463,7 @@ declare module "drag_observer" {
2412
2463
  };
2413
2464
  protected dragElem: HTMLElement | null;
2414
2465
  protected dragging: boolean;
2466
+ protected customData: object;
2415
2467
  protected events: string[];
2416
2468
  protected opts: DragObserverOptionsType;
2417
2469
  constructor(opts: DragObserverOptionsType);
@@ -2437,6 +2489,9 @@ declare module "wb_ext_grid" {
2437
2489
  protected observer: DragObserver;
2438
2490
  constructor(tree: Wunderbaum);
2439
2491
  init(): void;
2492
+ /**
2493
+ * Hanldes drag and sragstop events for column resizing.
2494
+ */
2440
2495
  protected handleDrag(e: DragCallbackArgType): void;
2441
2496
  }
2442
2497
  }
@@ -2871,6 +2926,8 @@ declare module "wunderbaum" {
2871
2926
  logTimeEnd(label: string): void;
2872
2927
  /** Write to `console.warn` with tree name as prefix with if opts.debugLevel >= 2. */
2873
2928
  logWarn(...args: any[]): void;
2929
+ /** Reset column widths to default. */
2930
+ resetColumns(): void;
2874
2931
  /**
2875
2932
  * Make sure that this node is vertically scrolled into the viewport.
2876
2933
  *
@@ -288,7 +288,7 @@ function throttle(func, wait = 0, options = {}) {
288
288
  /*!
289
289
  * Wunderbaum - util
290
290
  * Copyright (c) 2021-2024, Martin Wendt. Released under the MIT license.
291
- * v0.9.0, Sun, 05 May 2024 16:08:56 GMT (https://github.com/mar10/wunderbaum)
291
+ * v0.10.0, Mon, 24 Jun 2024 19:17:59 GMT (https://github.com/mar10/wunderbaum)
292
292
  */
293
293
  /** @module util */
294
294
  /** Readable names for `MouseEvent.button` */
@@ -937,6 +937,52 @@ function toSet(val) {
937
937
  }
938
938
  throw new Error("Cannot convert to Set<string>: " + val);
939
939
  }
940
+ /** Convert a pixel string to number.
941
+ * We accept a number or a string like '123px'. If undefined, the first default
942
+ * value that is a number or a string ending with 'px' is returned.
943
+ *
944
+ * Example:
945
+ * ```js
946
+ * const width = util.toPixel("123px", 100);
947
+ * ```
948
+ */
949
+ function toPixel(
950
+ // val: string | number | undefined | null,
951
+ ...defaults) {
952
+ // if (typeof val === "number") {
953
+ // return val;
954
+ // }
955
+ for (const d of defaults) {
956
+ if (typeof d === "number") {
957
+ return d;
958
+ }
959
+ if (typeof d === "string" && d.endsWith("px")) {
960
+ return parseInt(d, 10);
961
+ }
962
+ assert(d == null, `Expected a number or string like '123px': ${d}`);
963
+ }
964
+ throw new Error(`Expected a string like '123px': ${defaults}`);
965
+ }
966
+ /** Evaluate a boolean value using default if undefined.
967
+ * Example:
968
+ * ```js
969
+ * const opts = { flag: true };
970
+ * const value = util.toBool(opts.flag, otherVar, false);
971
+ * ```
972
+ */
973
+ function toBool(
974
+ // val: boolean | undefined | null,
975
+ ...boolDefaults) {
976
+ // if (val != null) {
977
+ // return !!val;
978
+ // }
979
+ for (const d of boolDefaults) {
980
+ if (d != null) {
981
+ return !!d;
982
+ }
983
+ }
984
+ throw new Error("No default boolean value provided");
985
+ }
940
986
  // /** Check if a string is contained in an Array or Set. */
941
987
  // export function isAnyOf(s: string, items: Array<string>|Set<string>): boolean {
942
988
  // return Array.prototype.includes.call(items, s)
@@ -1078,6 +1124,8 @@ var util = /*#__PURE__*/Object.freeze({
1078
1124
  setValueToElem: setValueToElem,
1079
1125
  sleep: sleep,
1080
1126
  throttle: throttle,
1127
+ toBool: toBool,
1128
+ toPixel: toPixel,
1081
1129
  toSet: toSet,
1082
1130
  toggleCheckbox: toggleCheckbox,
1083
1131
  type: type
@@ -1086,7 +1134,7 @@ var util = /*#__PURE__*/Object.freeze({
1086
1134
  /*!
1087
1135
  * Wunderbaum - types
1088
1136
  * Copyright (c) 2021-2024, Martin Wendt. Released under the MIT license.
1089
- * v0.9.0, Sun, 05 May 2024 16:08:56 GMT (https://github.com/mar10/wunderbaum)
1137
+ * v0.10.0, Mon, 24 Jun 2024 19:17:59 GMT (https://github.com/mar10/wunderbaum)
1090
1138
  */
1091
1139
  /**
1092
1140
  * Possible values for {@link WunderbaumNode.update()} and {@link Wunderbaum.update()}.
@@ -1150,7 +1198,7 @@ var NavModeEnum;
1150
1198
  /*!
1151
1199
  * Wunderbaum - wb_extension_base
1152
1200
  * Copyright (c) 2021-2024, Martin Wendt. Released under the MIT license.
1153
- * v0.9.0, Sun, 05 May 2024 16:08:56 GMT (https://github.com/mar10/wunderbaum)
1201
+ * v0.10.0, Mon, 24 Jun 2024 19:17:59 GMT (https://github.com/mar10/wunderbaum)
1154
1202
  */
1155
1203
  class WunderbaumExtension {
1156
1204
  constructor(tree, id, defaults) {
@@ -1209,7 +1257,7 @@ class WunderbaumExtension {
1209
1257
  /*!
1210
1258
  * Wunderbaum - ext-filter
1211
1259
  * Copyright (c) 2021-2024, Martin Wendt. Released under the MIT license.
1212
- * v0.9.0, Sun, 05 May 2024 16:08:56 GMT (https://github.com/mar10/wunderbaum)
1260
+ * v0.10.0, Mon, 24 Jun 2024 19:17:59 GMT (https://github.com/mar10/wunderbaum)
1213
1261
  */
1214
1262
  const START_MARKER = "\uFFF7";
1215
1263
  const END_MARKER = "\uFFF8";
@@ -1533,7 +1581,7 @@ function _markFuzzyMatchedChars(text, matches, escapeTitles = true) {
1533
1581
  /*!
1534
1582
  * Wunderbaum - ext-keynav
1535
1583
  * Copyright (c) 2021-2024, Martin Wendt. Released under the MIT license.
1536
- * v0.9.0, Sun, 05 May 2024 16:08:56 GMT (https://github.com/mar10/wunderbaum)
1584
+ * v0.10.0, Mon, 24 Jun 2024 19:17:59 GMT (https://github.com/mar10/wunderbaum)
1537
1585
  */
1538
1586
  const QUICKSEARCH_DELAY = 500;
1539
1587
  class KeynavExtension extends WunderbaumExtension {
@@ -1897,7 +1945,7 @@ class KeynavExtension extends WunderbaumExtension {
1897
1945
  /*!
1898
1946
  * Wunderbaum - ext-logger
1899
1947
  * Copyright (c) 2021-2024, Martin Wendt. Released under the MIT license.
1900
- * v0.9.0, Sun, 05 May 2024 16:08:56 GMT (https://github.com/mar10/wunderbaum)
1948
+ * v0.10.0, Mon, 24 Jun 2024 19:17:59 GMT (https://github.com/mar10/wunderbaum)
1901
1949
  */
1902
1950
  class LoggerExtension extends WunderbaumExtension {
1903
1951
  constructor(tree) {
@@ -1939,7 +1987,7 @@ class LoggerExtension extends WunderbaumExtension {
1939
1987
  /*!
1940
1988
  * Wunderbaum - common
1941
1989
  * Copyright (c) 2021-2024, Martin Wendt. Released under the MIT license.
1942
- * v0.9.0, Sun, 05 May 2024 16:08:56 GMT (https://github.com/mar10/wunderbaum)
1990
+ * v0.10.0, Mon, 24 Jun 2024 19:17:59 GMT (https://github.com/mar10/wunderbaum)
1943
1991
  */
1944
1992
  const DEFAULT_DEBUGLEVEL = 3; // Replaced by rollup script
1945
1993
  /**
@@ -1957,6 +2005,8 @@ const ICON_WIDTH = 20;
1957
2005
  const TITLE_SPAN_PAD_Y = 7;
1958
2006
  /** Render row markup for N nodes above and below the visible viewport. */
1959
2007
  const RENDER_MAX_PREFETCH = 5;
2008
+ /** Minimum column width if not set otherwise. */
2009
+ const DEFAULT_MIN_COL_WIDTH = 4;
1960
2010
  /** Regular expression to detect if a string describes an image URL (in contrast
1961
2011
  * to a class name). Strings are considered image urls if they contain '.' or '/'.
1962
2012
  */
@@ -2262,7 +2312,7 @@ function decompressSourceData(source) {
2262
2312
  /*!
2263
2313
  * Wunderbaum - ext-dnd
2264
2314
  * Copyright (c) 2021-2024, Martin Wendt. Released under the MIT license.
2265
- * v0.9.0, Sun, 05 May 2024 16:08:56 GMT (https://github.com/mar10/wunderbaum)
2315
+ * v0.10.0, Mon, 24 Jun 2024 19:17:59 GMT (https://github.com/mar10/wunderbaum)
2266
2316
  */
2267
2317
  const nodeMimeType = "application/x-wunderbaum-node";
2268
2318
  class DndExtension extends WunderbaumExtension {
@@ -2707,7 +2757,7 @@ class DndExtension extends WunderbaumExtension {
2707
2757
  /*!
2708
2758
  * Wunderbaum - drag_observer
2709
2759
  * Copyright (c) 2021-2024, Martin Wendt. Released under the MIT license.
2710
- * v0.9.0, Sun, 05 May 2024 16:08:56 GMT (https://github.com/mar10/wunderbaum)
2760
+ * v0.10.0, Mon, 24 Jun 2024 19:17:59 GMT (https://github.com/mar10/wunderbaum)
2711
2761
  */
2712
2762
  /**
2713
2763
  * Convert mouse- and touch events to 'dragstart', 'drag', and 'dragstop'.
@@ -2715,6 +2765,7 @@ class DndExtension extends WunderbaumExtension {
2715
2765
  class DragObserver {
2716
2766
  constructor(opts) {
2717
2767
  this.start = {
2768
+ event: null,
2718
2769
  x: 0,
2719
2770
  y: 0,
2720
2771
  altKey: false,
@@ -2724,6 +2775,7 @@ class DragObserver {
2724
2775
  };
2725
2776
  this.dragElem = null;
2726
2777
  this.dragging = false;
2778
+ this.customData = {};
2727
2779
  // TODO: touch events
2728
2780
  this.events = ["mousedown", "mouseup", "mousemove", "keydown"];
2729
2781
  if (!opts.root) {
@@ -2751,22 +2803,32 @@ class DragObserver {
2751
2803
  stopDrag(cb_event) {
2752
2804
  if (this.dragging && this.opts.dragstop && cb_event) {
2753
2805
  cb_event.type = "dragstop";
2754
- this.opts.dragstop(cb_event);
2806
+ try {
2807
+ this.opts.dragstop(cb_event);
2808
+ }
2809
+ catch (err) {
2810
+ console.error("dragstop error", err); // eslint-disable-line no-console
2811
+ }
2755
2812
  }
2756
2813
  this.dragElem = null;
2757
2814
  this.dragging = false;
2815
+ this.start.event = null;
2816
+ this.customData = {};
2758
2817
  }
2759
2818
  handleEvent(e) {
2760
2819
  const type = e.type;
2761
2820
  const opts = this.opts;
2762
2821
  const cb_event = {
2763
2822
  type: e.type,
2823
+ startEvent: type === "mousedown" ? e : this.start.event,
2764
2824
  event: e,
2825
+ customData: this.customData,
2765
2826
  dragElem: this.dragElem,
2766
2827
  dx: e.pageX - this.start.x,
2767
2828
  dy: e.pageY - this.start.y,
2768
2829
  apply: undefined,
2769
2830
  };
2831
+ // console.log("handleEvent", type, cb_event);
2770
2832
  switch (type) {
2771
2833
  case "keydown":
2772
2834
  this.stopDrag(cb_event);
@@ -2791,6 +2853,7 @@ class DragObserver {
2791
2853
  }
2792
2854
  }
2793
2855
  }
2856
+ this.start.event = e;
2794
2857
  this.start.x = e.pageX;
2795
2858
  this.start.y = e.pageY;
2796
2859
  this.start.altKey = e.altKey;
@@ -2843,7 +2906,7 @@ class DragObserver {
2843
2906
  /*!
2844
2907
  * Wunderbaum - ext-grid
2845
2908
  * Copyright (c) 2021-2024, Martin Wendt. Released under the MIT license.
2846
- * v0.9.0, Sun, 05 May 2024 16:08:56 GMT (https://github.com/mar10/wunderbaum)
2909
+ * v0.10.0, Mon, 24 Jun 2024 19:17:59 GMT (https://github.com/mar10/wunderbaum)
2847
2910
  */
2848
2911
  class GridExtension extends WunderbaumExtension {
2849
2912
  constructor(tree) {
@@ -2852,11 +2915,43 @@ class GridExtension extends WunderbaumExtension {
2852
2915
  });
2853
2916
  this.observer = new DragObserver({
2854
2917
  root: window.document,
2855
- selector: "span.wb-col-resizer",
2918
+ selector: "span.wb-col-resizer-active",
2856
2919
  thresh: 4,
2857
2920
  // throttle: 400,
2858
2921
  dragstart: (e) => {
2859
- return this.tree.element.contains(e.dragElem);
2922
+ const info = Wunderbaum.getEventInfo(e.startEvent);
2923
+ const colDef = info.colDef;
2924
+ const allow = colDef &&
2925
+ this.tree.element.contains(e.dragElem) &&
2926
+ toBool(colDef.resizable, tree.options.resizableColumns, false);
2927
+ // this.tree.log("dragstart", colDef, e, info);
2928
+ this.tree.element.classList.toggle("wb-col-resizing", !!allow);
2929
+ info.colElem.classList.toggle("wb-col-resizing", !!allow);
2930
+ // We start dagging, so we remember the actual width in *pixels*
2931
+ // (which may be 'auto' or '100%').
2932
+ // Since we we re-create the markup on each update, we also cannot store
2933
+ // the original event or DOM element, but only the colDef object.
2934
+ if (allow) {
2935
+ // Store initial target column infos in customData
2936
+ e.customData.colDef = colDef;
2937
+ e.customData.orgCustomWidthPx = colDef.customWidthPx;
2938
+ const curWidthPx = Number.parseInt(info.colElem.style.width, 10);
2939
+ e.customData.orgWidthPx = curWidthPx;
2940
+ // Set custom width to current width, so that we can modify it
2941
+ colDef.customWidthPx = curWidthPx;
2942
+ // this.tree.log(
2943
+ // `dragstart customWidthPx=${colDef.customWidthPx}`,
2944
+ // e,
2945
+ // info
2946
+ // );
2947
+ this.tree.update(ChangeType.colStructure);
2948
+ // this.tree.log(
2949
+ // `dragstart 2 customWidthPx=${colDef.customWidthPx}`,
2950
+ // e,
2951
+ // info
2952
+ // );
2953
+ }
2954
+ return allow;
2860
2955
  },
2861
2956
  drag: (e) => {
2862
2957
  // TODO: throttle
@@ -2870,17 +2965,39 @@ class GridExtension extends WunderbaumExtension {
2870
2965
  init() {
2871
2966
  super.init();
2872
2967
  }
2968
+ /**
2969
+ * Hanldes drag and sragstop events for column resizing.
2970
+ */
2873
2971
  handleDrag(e) {
2874
- const info = Wunderbaum.getEventInfo(e.event);
2875
- // this.tree.options.
2876
- this.tree.log(`${e.type}(${e.dx})`, e, info);
2972
+ const custom = e.customData;
2973
+ const colDef = custom.colDef;
2974
+ // this.tree.log(`${e.type} (dx=${e.dx})`, e, info);
2975
+ if (e.type === "dragstop" || e.type === "drag") {
2976
+ this.tree.element.classList.remove("wb-col-resizing");
2977
+ // info.colElem!.classList.remove("wb-col-resizing");
2978
+ if (e.apply || e.type === "drag") {
2979
+ const minWidth = toPixel(colDef.minWidth, DEFAULT_MIN_COL_WIDTH);
2980
+ const newWidth = Math.max(minWidth, custom.orgWidthPx + e.dx);
2981
+ colDef.customWidthPx = newWidth;
2982
+ // this.tree.log(
2983
+ // `${e.type} minWidth=${minWidth}, newWidth=${newWidth}`,
2984
+ // colDef
2985
+ // );
2986
+ }
2987
+ else {
2988
+ // Drag was cancelled
2989
+ this.tree.log("Column resize cancelled", e);
2990
+ colDef.customWidthPx = custom.orgCustomWidthPx; // Restore original width or undefined
2991
+ }
2992
+ this.tree.update(ChangeType.colStructure);
2993
+ }
2877
2994
  }
2878
2995
  }
2879
2996
 
2880
2997
  /*!
2881
2998
  * Wunderbaum - deferred
2882
2999
  * Copyright (c) 2021-2024, Martin Wendt. Released under the MIT license.
2883
- * v0.9.0, Sun, 05 May 2024 16:08:56 GMT (https://github.com/mar10/wunderbaum)
3000
+ * v0.10.0, Mon, 24 Jun 2024 19:17:59 GMT (https://github.com/mar10/wunderbaum)
2884
3001
  */
2885
3002
  /**
2886
3003
  * Implement a ES6 Promise, that exposes a resolve() and reject() method.
@@ -2933,7 +3050,7 @@ class Deferred {
2933
3050
  /*!
2934
3051
  * Wunderbaum - wunderbaum_node
2935
3052
  * Copyright (c) 2021-2024, Martin Wendt. Released under the MIT license.
2936
- * v0.9.0, Sun, 05 May 2024 16:08:56 GMT (https://github.com/mar10/wunderbaum)
3053
+ * v0.10.0, Mon, 24 Jun 2024 19:17:59 GMT (https://github.com/mar10/wunderbaum)
2937
3054
  */
2938
3055
  /** WunderbaumNode properties that can be passed with source data.
2939
3056
  * (Any other source properties will be stored as `node.data.PROP`.)
@@ -5342,7 +5459,7 @@ WunderbaumNode.sequence = 0;
5342
5459
  /*!
5343
5460
  * Wunderbaum - ext-edit
5344
5461
  * Copyright (c) 2021-2024, Martin Wendt. Released under the MIT license.
5345
- * v0.9.0, Sun, 05 May 2024 16:08:56 GMT (https://github.com/mar10/wunderbaum)
5462
+ * v0.10.0, Mon, 24 Jun 2024 19:17:59 GMT (https://github.com/mar10/wunderbaum)
5346
5463
  */
5347
5464
  // const START_MARKER = "\uFFF7";
5348
5465
  class EditExtension extends WunderbaumExtension {
@@ -5673,8 +5790,8 @@ class EditExtension extends WunderbaumExtension {
5673
5790
  * https://github.com/mar10/wunderbaum
5674
5791
  *
5675
5792
  * Released under the MIT license.
5676
- * @version v0.9.0
5677
- * @date Sun, 05 May 2024 16:08:56 GMT
5793
+ * @version v0.10.0
5794
+ * @date Mon, 24 Jun 2024 19:17:59 GMT
5678
5795
  */
5679
5796
  // import "./wunderbaum.scss";
5680
5797
  class WbSystemRoot extends WunderbaumNode {
@@ -6997,6 +7114,13 @@ class Wunderbaum {
6997
7114
  console.warn(this.toString(), ...args); // eslint-disable-line no-console
6998
7115
  }
6999
7116
  }
7117
+ /** Reset column widths to default. */
7118
+ resetColumns() {
7119
+ this.columns.forEach((col) => {
7120
+ delete col.customWidthPx;
7121
+ });
7122
+ this.update(ChangeType.colStructure);
7123
+ }
7000
7124
  /**
7001
7125
  * Make sure that this node is vertically scrolled into the viewport.
7002
7126
  *
@@ -7354,7 +7478,7 @@ class Wunderbaum {
7354
7478
  this._columnsById = {};
7355
7479
  for (const col of columns) {
7356
7480
  this._columnsById[col.id] = col;
7357
- const cw = col.width;
7481
+ const cw = col.customWidthPx ? `${col.customWidthPx}px` : col.width;
7358
7482
  if (col.id === "*" && col !== col0) {
7359
7483
  throw new Error(`Column id '*' must be defined only once: '${col.title}'.`);
7360
7484
  }
@@ -7460,7 +7584,13 @@ class Wunderbaum {
7460
7584
  }
7461
7585
  let resizer = "";
7462
7586
  if (i < colCount - 1) {
7463
- resizer = '<span class="wb-col-resizer"></span>';
7587
+ if (toBool(col.resizable, this.options.resizableColumns, false)) {
7588
+ resizer =
7589
+ '<span class="wb-col-resizer wb-col-resizer-active"></span>';
7590
+ }
7591
+ else {
7592
+ resizer = '<span class="wb-col-resizer"></span>';
7593
+ }
7464
7594
  }
7465
7595
  colElem.innerHTML = `<span class="wb-col-title"${tooltip}>${title}</span>${resizer}`;
7466
7596
  if (this.isCellNav()) {
@@ -7910,7 +8040,7 @@ class Wunderbaum {
7910
8040
  }
7911
8041
  Wunderbaum.sequence = 0;
7912
8042
  /** Wunderbaum release version number "MAJOR.MINOR.PATCH". */
7913
- Wunderbaum.version = "v0.9.0"; // Set to semver by 'grunt release'
8043
+ Wunderbaum.version = "v0.10.0"; // Set to semver by 'grunt release'
7914
8044
  /** Expose some useful methods of the util.ts module as `Wunderbaum.util`. */
7915
8045
  Wunderbaum.util = util;
7916
8046