@yuneta/gobj-ui 7.5.3 → 7.5.5

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,28 +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)) 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
+ }
55724
55727
  }
55725
- return false;
55728
+ return {
55729
+ saved,
55730
+ total
55731
+ };
55726
55732
  }
55727
55733
  /************************************************************
55728
55734
  * Choose a layout for a treedb nobody has arranged yet.
@@ -55741,9 +55747,9 @@ function has_saved_geometry(gobj) {
55741
55747
  ************************************************************/
55742
55748
  function auto_layout(gobj) {
55743
55749
  let priv = gobj.priv;
55744
- (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 || {}))}`);
55745
55750
  if (priv._layout_asked) return;
55746
- if (has_saved_geometry(gobj)) return;
55751
+ let g = count_saved_geometry(gobj);
55752
+ if (g.total > 0 && g.saved * 2 > g.total) return;
55747
55753
  if (!priv.graph) return;
55748
55754
  let name = "dagre";
55749
55755
  (0, _yuneta_gobj_js.gobj_write_attr)(gobj, "layout", name);
@@ -55753,7 +55759,6 @@ function auto_layout(gobj) {
55753
55759
  (0, _yuneta_gobj_js.log_error)(`${(0, _yuneta_gobj_js.gobj_short_name)(gobj)}: cannot set the '${name}' layout: ${e}`);
55754
55760
  return;
55755
55761
  }
55756
- (0, _yuneta_gobj_js.log_warning)(`${(0, _yuneta_gobj_js.gobj_short_name)(gobj)}: auto_layout: set '${name}'`);
55757
55762
  (0, _yuneta_gobj_js.gobj_publish_event)(gobj, "EV_LAYOUT_AUTOSET", { layout: name });
55758
55763
  }
55759
55764
  /************************************************************
@@ -55688,28 +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)) 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
+ }
55711
55714
  }
55712
- return false;
55715
+ return {
55716
+ saved,
55717
+ total
55718
+ };
55713
55719
  }
55714
55720
  /************************************************************
55715
55721
  * Choose a layout for a treedb nobody has arranged yet.
@@ -55728,9 +55734,9 @@ function has_saved_geometry(gobj) {
55728
55734
  ************************************************************/
55729
55735
  function auto_layout(gobj) {
55730
55736
  let priv = gobj.priv;
55731
- 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 || {}))}`);
55732
55737
  if (priv._layout_asked) return;
55733
- if (has_saved_geometry(gobj)) return;
55738
+ let g = count_saved_geometry(gobj);
55739
+ if (g.total > 0 && g.saved * 2 > g.total) return;
55734
55740
  if (!priv.graph) return;
55735
55741
  let name = "dagre";
55736
55742
  gobj_write_attr(gobj, "layout", name);
@@ -55740,7 +55746,6 @@ function auto_layout(gobj) {
55740
55746
  log_error(`${gobj_short_name(gobj)}: cannot set the '${name}' layout: ${e}`);
55741
55747
  return;
55742
55748
  }
55743
- log_warning(`${gobj_short_name(gobj)}: auto_layout: set '${name}'`);
55744
55749
  gobj_publish_event(gobj, "EV_LAYOUT_AUTOSET", { layout: name });
55745
55750
  }
55746
55751
  /************************************************************
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@yuneta/gobj-ui",
3
- "version": "7.5.3",
3
+ "version": "7.5.5",
4
4
  "type": "module",
5
5
  "main": "dist/gobj-ui.cjs.js",
6
6
  "module": "dist/gobj-ui.es.js",
@@ -4495,52 +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
- 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++;
4539
4537
  }
4540
4538
  }
4541
4539
  }
4542
4540
 
4543
- return false;
4541
+ return {saved: saved, total: total};
4544
4542
  }
4545
4543
 
4546
4544
  /************************************************************
@@ -4562,17 +4560,18 @@ function auto_layout(gobj)
4562
4560
  {
4563
4561
  let priv = gobj.priv;
4564
4562
 
4565
- log_warning(`${gobj_short_name(gobj)}: auto_layout: ` +
4566
- `asked='${priv._layout_asked}' ` +
4567
- `saved=${has_saved_geometry(gobj)} ` +
4568
- `graph=${!!priv.graph} ` +
4569
- `topics=${Object.keys(priv.records || {}).length} ` +
4570
- `gprops=${JSON.stringify(Object.keys(priv._graph_properties || {}))}`);
4571
-
4572
4563
  if(priv._layout_asked) {
4573
4564
  return; /* the user picked one for this treedb */
4574
4565
  }
4575
- if(has_saved_geometry(gobj)) {
4566
+ /* MOST of the nodes, not one of them.
4567
+ *
4568
+ * The app saves the position it invented as readily as one a human
4569
+ * chose, so a single stored coordinate proves nothing: the treedb
4570
+ * that forced this had exactly ONE node of 126 carrying a geometry,
4571
+ * and it was `{x:100, y:100}` — the first cascade slot, saved. One
4572
+ * leftover is not an arrangement. A majority is. */
4573
+ let g = count_saved_geometry(gobj);
4574
+ if(g.total > 0 && g.saved * 2 > g.total) {
4576
4575
  return; /* somebody arranged it: leave it alone */
4577
4576
  }
4578
4577
  if(!priv.graph) {
@@ -4589,7 +4588,6 @@ function auto_layout(gobj)
4589
4588
  }
4590
4589
  /* The toolbar's select was filled before the data arrived, so it is
4591
4590
  * still showing `manual`: tell it what the graph is actually doing. */
4592
- log_warning(`${gobj_short_name(gobj)}: auto_layout: set '${name}'`);
4593
4591
  gobj_publish_event(gobj, "EV_LAYOUT_AUTOSET", {layout: name});
4594
4592
  }
4595
4593