@yuneta/gobj-ui 7.5.4 → 7.5.6

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.
@@ -55701,31 +55701,34 @@ function show_node_detail_popover(gobj, node_id) {
55701
55701
  * junction diamonds get their neutral fill/stroke re-themed.
55702
55702
  ************************************************************/
55703
55703
  /************************************************************
55704
- * Has anybody ever PLACED a node of this treedb?
55705
- *
55706
- * Saved positions live in `__graphs__` (per topic, per node) and, on
55707
- * older data, in a `_geometry` on the record itself. Both are read.
55704
+ * How many nodes of this treedb carry a saved position, and how many
55705
+ * there are. Positions live in `__graphs__` (per topic, per node) and,
55706
+ * on older data, in a `_geometry` on the record itself; both are read.
55708
55707
  ************************************************************/
55709
55708
  function geometry_has_position(g) {
55710
55709
  if (!(0, _yuneta_gobj_js.is_object)(g)) return false;
55711
55710
  return (0, _yuneta_gobj_js.is_number)(g.x) || (0, _yuneta_gobj_js.is_number)(g.y);
55712
55711
  }
55713
- function has_saved_geometry(gobj) {
55712
+ function count_saved_geometry(gobj) {
55714
55713
  let priv = gobj.priv;
55715
- for (let topic of Object.keys(priv._graph_properties || {})) {
55716
- let props = priv._graph_properties[topic];
55717
- if (!props || !(0, _yuneta_gobj_js.is_object)(props.nodes)) continue;
55718
- for (let node_id of Object.keys(props.nodes)) if (geometry_has_position(props.nodes[node_id])) return true;
55719
- }
55714
+ let saved = 0;
55715
+ let total = 0;
55720
55716
  for (let topic of Object.keys(priv.records || {})) {
55721
55717
  let records = priv.records[topic];
55722
55718
  if (!(0, _yuneta_gobj_js.is_array)(records)) continue;
55723
- for (let record of records) if (record && geometry_has_position(record._geometry)) {
55724
- (0, _yuneta_gobj_js.log_warning)(`${(0, _yuneta_gobj_js.gobj_short_name)(gobj)}: saved geometry: ${topic}/${record.id} = ${JSON.stringify(record._geometry)}`);
55725
- return true;
55719
+ let props = priv._graph_properties ? priv._graph_properties[topic] : null;
55720
+ let nodes = props && (0, _yuneta_gobj_js.is_object)(props.nodes) ? props.nodes : null;
55721
+ for (let record of records) {
55722
+ if (!record) continue;
55723
+ total++;
55724
+ if (nodes && geometry_has_position(nodes[record.id])) saved++;
55725
+ else if (geometry_has_position(record._geometry)) saved++;
55726
55726
  }
55727
55727
  }
55728
- return false;
55728
+ return {
55729
+ saved,
55730
+ total
55731
+ };
55729
55732
  }
55730
55733
  /************************************************************
55731
55734
  * Choose a layout for a treedb nobody has arranged yet.
@@ -55744,10 +55747,20 @@ function has_saved_geometry(gobj) {
55744
55747
  ************************************************************/
55745
55748
  function auto_layout(gobj) {
55746
55749
  let priv = gobj.priv;
55747
- (0, _yuneta_gobj_js.log_warning)(`${(0, _yuneta_gobj_js.gobj_short_name)(gobj)}: auto_layout: asked='${priv._layout_asked}' saved=${has_saved_geometry(gobj)} graph=${!!priv.graph} topics=${Object.keys(priv.records || {}).length} gprops=${JSON.stringify(Object.keys(priv._graph_properties || {}))}`);
55748
- if (priv._layout_asked) return;
55749
- if (has_saved_geometry(gobj)) return;
55750
- if (!priv.graph) return;
55750
+ if (priv._layout_asked) {
55751
+ (0, _yuneta_gobj_js.log_warning)(`${(0, _yuneta_gobj_js.gobj_short_name)(gobj)}: AL: bail asked='${priv._layout_asked}'`);
55752
+ return;
55753
+ }
55754
+ let g = count_saved_geometry(gobj);
55755
+ (0, _yuneta_gobj_js.log_warning)(`${(0, _yuneta_gobj_js.gobj_short_name)(gobj)}: AL: saved=${g.saved}/${g.total} graph=${!!priv.graph}`);
55756
+ if (g.total > 0 && g.saved * 2 > g.total) {
55757
+ (0, _yuneta_gobj_js.log_warning)(`${(0, _yuneta_gobj_js.gobj_short_name)(gobj)}: AL: bail majority`);
55758
+ return;
55759
+ }
55760
+ if (!priv.graph) {
55761
+ (0, _yuneta_gobj_js.log_warning)(`${(0, _yuneta_gobj_js.gobj_short_name)(gobj)}: AL: bail no graph`);
55762
+ return;
55763
+ }
55751
55764
  let name = "dagre";
55752
55765
  (0, _yuneta_gobj_js.gobj_write_attr)(gobj, "layout", name);
55753
55766
  try {
@@ -55756,7 +55769,7 @@ function auto_layout(gobj) {
55756
55769
  (0, _yuneta_gobj_js.log_error)(`${(0, _yuneta_gobj_js.gobj_short_name)(gobj)}: cannot set the '${name}' layout: ${e}`);
55757
55770
  return;
55758
55771
  }
55759
- (0, _yuneta_gobj_js.log_warning)(`${(0, _yuneta_gobj_js.gobj_short_name)(gobj)}: auto_layout: set '${name}'`);
55772
+ (0, _yuneta_gobj_js.log_warning)(`${(0, _yuneta_gobj_js.gobj_short_name)(gobj)}: AL: set dagre, publishing`);
55760
55773
  (0, _yuneta_gobj_js.gobj_publish_event)(gobj, "EV_LAYOUT_AUTOSET", { layout: name });
55761
55774
  }
55762
55775
  /************************************************************
@@ -55688,31 +55688,34 @@ function show_node_detail_popover(gobj, node_id) {
55688
55688
  * junction diamonds get their neutral fill/stroke re-themed.
55689
55689
  ************************************************************/
55690
55690
  /************************************************************
55691
- * Has anybody ever PLACED a node of this treedb?
55692
- *
55693
- * Saved positions live in `__graphs__` (per topic, per node) and, on
55694
- * older data, in a `_geometry` on the record itself. Both are read.
55691
+ * How many nodes of this treedb carry a saved position, and how many
55692
+ * there are. Positions live in `__graphs__` (per topic, per node) and,
55693
+ * on older data, in a `_geometry` on the record itself; both are read.
55695
55694
  ************************************************************/
55696
55695
  function geometry_has_position(g) {
55697
55696
  if (!is_object(g)) return false;
55698
55697
  return is_number(g.x) || is_number(g.y);
55699
55698
  }
55700
- function has_saved_geometry(gobj) {
55699
+ function count_saved_geometry(gobj) {
55701
55700
  let priv = gobj.priv;
55702
- for (let topic of Object.keys(priv._graph_properties || {})) {
55703
- let props = priv._graph_properties[topic];
55704
- if (!props || !is_object(props.nodes)) continue;
55705
- for (let node_id of Object.keys(props.nodes)) if (geometry_has_position(props.nodes[node_id])) return true;
55706
- }
55701
+ let saved = 0;
55702
+ let total = 0;
55707
55703
  for (let topic of Object.keys(priv.records || {})) {
55708
55704
  let records = priv.records[topic];
55709
55705
  if (!is_array(records)) continue;
55710
- for (let record of records) if (record && geometry_has_position(record._geometry)) {
55711
- log_warning(`${gobj_short_name(gobj)}: saved geometry: ${topic}/${record.id} = ${JSON.stringify(record._geometry)}`);
55712
- return true;
55706
+ let props = priv._graph_properties ? priv._graph_properties[topic] : null;
55707
+ let nodes = props && is_object(props.nodes) ? props.nodes : null;
55708
+ for (let record of records) {
55709
+ if (!record) continue;
55710
+ total++;
55711
+ if (nodes && geometry_has_position(nodes[record.id])) saved++;
55712
+ else if (geometry_has_position(record._geometry)) saved++;
55713
55713
  }
55714
55714
  }
55715
- return false;
55715
+ return {
55716
+ saved,
55717
+ total
55718
+ };
55716
55719
  }
55717
55720
  /************************************************************
55718
55721
  * Choose a layout for a treedb nobody has arranged yet.
@@ -55731,10 +55734,20 @@ function has_saved_geometry(gobj) {
55731
55734
  ************************************************************/
55732
55735
  function auto_layout(gobj) {
55733
55736
  let priv = gobj.priv;
55734
- log_warning(`${gobj_short_name(gobj)}: auto_layout: asked='${priv._layout_asked}' saved=${has_saved_geometry(gobj)} graph=${!!priv.graph} topics=${Object.keys(priv.records || {}).length} gprops=${JSON.stringify(Object.keys(priv._graph_properties || {}))}`);
55735
- if (priv._layout_asked) return;
55736
- if (has_saved_geometry(gobj)) return;
55737
- if (!priv.graph) return;
55737
+ if (priv._layout_asked) {
55738
+ log_warning(`${gobj_short_name(gobj)}: AL: bail asked='${priv._layout_asked}'`);
55739
+ return;
55740
+ }
55741
+ let g = count_saved_geometry(gobj);
55742
+ log_warning(`${gobj_short_name(gobj)}: AL: saved=${g.saved}/${g.total} graph=${!!priv.graph}`);
55743
+ if (g.total > 0 && g.saved * 2 > g.total) {
55744
+ log_warning(`${gobj_short_name(gobj)}: AL: bail majority`);
55745
+ return;
55746
+ }
55747
+ if (!priv.graph) {
55748
+ log_warning(`${gobj_short_name(gobj)}: AL: bail no graph`);
55749
+ return;
55750
+ }
55738
55751
  let name = "dagre";
55739
55752
  gobj_write_attr(gobj, "layout", name);
55740
55753
  try {
@@ -55743,7 +55756,7 @@ function auto_layout(gobj) {
55743
55756
  log_error(`${gobj_short_name(gobj)}: cannot set the '${name}' layout: ${e}`);
55744
55757
  return;
55745
55758
  }
55746
- log_warning(`${gobj_short_name(gobj)}: auto_layout: set '${name}'`);
55759
+ log_warning(`${gobj_short_name(gobj)}: AL: set dagre, publishing`);
55747
55760
  gobj_publish_event(gobj, "EV_LAYOUT_AUTOSET", { layout: name });
55748
55761
  }
55749
55762
  /************************************************************
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@yuneta/gobj-ui",
3
- "version": "7.5.4",
3
+ "version": "7.5.6",
4
4
  "type": "module",
5
5
  "main": "dist/gobj-ui.cjs.js",
6
6
  "module": "dist/gobj-ui.es.js",
@@ -4495,54 +4495,50 @@ function show_node_detail_popover(gobj, node_id)
4495
4495
  * junction diamonds get their neutral fill/stroke re-themed.
4496
4496
  ************************************************************/
4497
4497
  /************************************************************
4498
- * Has anybody ever PLACED a node of this treedb?
4499
- *
4500
- * Saved positions live in `__graphs__` (per topic, per node) and, on
4501
- * older data, in a `_geometry` on the record itself. Both are read.
4498
+ * How many nodes of this treedb carry a saved position, and how many
4499
+ * there are. Positions live in `__graphs__` (per topic, per node) and,
4500
+ * on older data, in a `_geometry` on the record itself; both are read.
4502
4501
  ************************************************************/
4503
4502
  function geometry_has_position(g)
4504
4503
  {
4505
- /* An EMPTY object is not a position. A treedb hands back `_geometry: {}`
4506
- * for a record nobody ever moved, and a node entry can hold a port size
4507
- * with no coordinates — both are objects, and taking either for "this
4508
- * was arranged" is what kept the cascade in place. Only x or y counts. */
4504
+ /* An EMPTY object is not a position. A treedb hands back
4505
+ * `_geometry: {}` for a record nobody ever moved, and a `__graphs__`
4506
+ * node entry can hold a port size with no coordinates — both are
4507
+ * objects, and taking either for "this was placed" is wrong. */
4509
4508
  if(!is_object(g)) {
4510
4509
  return false;
4511
4510
  }
4512
4511
  return is_number(g.x) || is_number(g.y);
4513
4512
  }
4514
4513
 
4515
- function has_saved_geometry(gobj)
4514
+ function count_saved_geometry(gobj)
4516
4515
  {
4517
4516
  let priv = gobj.priv;
4518
-
4519
- for(let topic of Object.keys(priv._graph_properties || {})) {
4520
- let props = priv._graph_properties[topic];
4521
- if(!props || !is_object(props.nodes)) {
4522
- continue;
4523
- }
4524
- for(let node_id of Object.keys(props.nodes)) {
4525
- if(geometry_has_position(props.nodes[node_id])) {
4526
- return true;
4527
- }
4528
- }
4529
- }
4517
+ let saved = 0;
4518
+ let total = 0;
4530
4519
 
4531
4520
  for(let topic of Object.keys(priv.records || {})) {
4532
4521
  let records = priv.records[topic];
4533
4522
  if(!is_array(records)) {
4534
4523
  continue;
4535
4524
  }
4525
+ let props = priv._graph_properties? priv._graph_properties[topic] : null;
4526
+ let nodes = (props && is_object(props.nodes))? props.nodes : null;
4527
+
4536
4528
  for(let record of records) {
4537
- if(record && geometry_has_position(record._geometry)) {
4538
- log_warning(`${gobj_short_name(gobj)}: saved geometry: ` +
4539
- `${topic}/${record.id} = ${JSON.stringify(record._geometry)}`);
4540
- return true;
4529
+ if(!record) {
4530
+ continue;
4531
+ }
4532
+ total++;
4533
+ if(nodes && geometry_has_position(nodes[record.id])) {
4534
+ saved++;
4535
+ } else if(geometry_has_position(record._geometry)) {
4536
+ saved++;
4541
4537
  }
4542
4538
  }
4543
4539
  }
4544
4540
 
4545
- return false;
4541
+ return {saved: saved, total: total};
4546
4542
  }
4547
4543
 
4548
4544
  /************************************************************
@@ -4564,20 +4560,25 @@ function auto_layout(gobj)
4564
4560
  {
4565
4561
  let priv = gobj.priv;
4566
4562
 
4567
- log_warning(`${gobj_short_name(gobj)}: auto_layout: ` +
4568
- `asked='${priv._layout_asked}' ` +
4569
- `saved=${has_saved_geometry(gobj)} ` +
4570
- `graph=${!!priv.graph} ` +
4571
- `topics=${Object.keys(priv.records || {}).length} ` +
4572
- `gprops=${JSON.stringify(Object.keys(priv._graph_properties || {}))}`);
4573
-
4574
4563
  if(priv._layout_asked) {
4564
+ log_warning(`${gobj_short_name(gobj)}: AL: bail asked='${priv._layout_asked}'`);
4575
4565
  return; /* the user picked one for this treedb */
4576
4566
  }
4577
- if(has_saved_geometry(gobj)) {
4567
+ /* MOST of the nodes, not one of them.
4568
+ *
4569
+ * The app saves the position it invented as readily as one a human
4570
+ * chose, so a single stored coordinate proves nothing: the treedb
4571
+ * that forced this had exactly ONE node of 126 carrying a geometry,
4572
+ * and it was `{x:100, y:100}` — the first cascade slot, saved. One
4573
+ * leftover is not an arrangement. A majority is. */
4574
+ let g = count_saved_geometry(gobj);
4575
+ log_warning(`${gobj_short_name(gobj)}: AL: saved=${g.saved}/${g.total} graph=${!!priv.graph}`);
4576
+ if(g.total > 0 && g.saved * 2 > g.total) {
4577
+ log_warning(`${gobj_short_name(gobj)}: AL: bail majority`);
4578
4578
  return; /* somebody arranged it: leave it alone */
4579
4579
  }
4580
4580
  if(!priv.graph) {
4581
+ log_warning(`${gobj_short_name(gobj)}: AL: bail no graph`);
4581
4582
  return;
4582
4583
  }
4583
4584
 
@@ -4591,7 +4592,7 @@ function auto_layout(gobj)
4591
4592
  }
4592
4593
  /* The toolbar's select was filled before the data arrived, so it is
4593
4594
  * still showing `manual`: tell it what the graph is actually doing. */
4594
- log_warning(`${gobj_short_name(gobj)}: auto_layout: set '${name}'`);
4595
+ log_warning(`${gobj_short_name(gobj)}: AL: set dagre, publishing`);
4595
4596
  gobj_publish_event(gobj, "EV_LAYOUT_AUTOSET", {layout: name});
4596
4597
  }
4597
4598