@yuneta/gobj-ui 7.25.9 → 7.25.11

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.
package/README.md CHANGED
@@ -2077,9 +2077,13 @@ that makes the schema file win over the literal), once, and puts it in use with
2077
2077
  `apply-schema` and a restart of the owning yuno. Until 7.23.195 every write
2078
2078
  here raised both numbers, so an edit half made was already the schema of the
2079
2079
  next start. The topic list marks what this session wrote and has not saved,
2080
- and the column screen says so in a banner; the host sends `EV_REFRESH` after a
2081
- save, and the reload forgets the drafts. The export (C literal and JSON) warns
2082
- while there are drafts: the literal carries the versions a save publishes.
2080
+ and the column screen says so in a banner; an `EV_REFRESH` -- the view's own
2081
+ Refresh button, or a host that sends one after a save -- forgets the drafts this
2082
+ session wrote, and the host's `EV_DRAFTS` replaces what it said before. The
2083
+ export (C literal and JSON) warns while there are drafts: the literal carries
2084
+ the versions a save publishes. Its two views are two named buttons (`schema as
2085
+ c source`, `schema as json`, i18n keys the consumer's locales carry), the one
2086
+ shown pressed.
2083
2087
 
2084
2088
  **A draft survives a reload** (7.25.3). The mark of a write lived in the
2085
2089
  session's memory only, so a reload of the page, a reconnect or a refresh of
@@ -2197,8 +2201,12 @@ else.
2197
2201
  column form sends every field it shows, so its Save after a reload wrote
2198
2202
  the OLD record over the newer one -- 7.25.8 told the operator to "try
2199
2203
  again", which did exactly that. The import plan is forgotten when a load
2200
- starts. A load that failed or never left replaced nothing, and the dialog
2201
- stays with what was typed.
2204
+ LEAVES (7.25.10: one that could not be sent keeps it), and a Yes that finds
2205
+ it gone is said (`the import plan is gone: preview it again`). A load that
2206
+ failed or never left replaced nothing, and the dialog stays with what was
2207
+ typed. A confirmation is a shell modal and outlives a load: its Yes in
2208
+ `ST_EMPTY` or `ST_IDLE` is refused with the same words, not *"NOT
2209
+ DEFINED"* (7.25.10).
2202
2210
 
2203
2211
  ```js
2204
2212
  gobj_send_event(editor, "EV_EDIT_COLUMN", {col: "id"}, host); // form, model_gen N
@@ -2207,10 +2215,27 @@ else.
2207
2215
  ```
2208
2216
  - **A load refused IN session keeps the model it was replacing** (7.25.9): a
2209
2217
  routing adapter's deadline on a slow `nodes` answers -1 while the session
2210
- is up. The records are put back, the screen and any open dialog stay, the
2211
- operator is told `cannot read the schemas again: the previous ones stay`,
2212
- and the reload is owed. Only a first load, with no model before it, ends
2213
- on the empty screen. A write answered with no record reloads the model and
2218
+ is up. The records are put back, the screen and any open dialog stay, and
2219
+ the operator is told
2220
+ `cannot read the schemas again: the ones shown may be out of date, your next change reads them first`.
2221
+ **The owed reload runs on the operator's next action** (7.25.10; before, it
2222
+ waited for a reconnect that never came while the session stayed up, and a
2223
+ form opened on the old model wrote over the newer record): an edit -- a
2224
+ form, a Save, a delete, a drag, a confirmation, Check, Export, Import, the
2225
+ orphans -- is refused with
2226
+ `the schemas shown may be out of date: they are read again, try again when they are in`
2227
+ and the model is read again (keeping the draft chips); a move goes where it
2228
+ was going and reads there. Not at once and not on a timer: a load refused
2229
+ on a deadline asked again at once is refused the same way, and one asked
2230
+ on a clock is polling. A Refresh asked while a load is in flight keeps the
2231
+ records of the model shown (7.25.10), not the half the first load got.
2232
+ Only a first load, with no model before it, ends on the empty screen.
2233
+
2234
+ ```js
2235
+ // the load failed in session: model kept, reload owed
2236
+ gobj_send_event(editor, "EV_EDIT_COLUMN", {col: "id"}, host); // refused, said; ST_LOADING
2237
+ // ... the load lands: the same click now opens the form
2238
+ ``` A write answered with no record reloads the model and
2214
2239
  says what it did not send after it
2215
2240
  (`the treedb did not describe a write back: the writes after it were not sent`).
2216
2241
  - The toolbar offers Diagram, Check, Export, Import, New topic and New column
@@ -2220,8 +2245,10 @@ else.
2220
2245
  was DONE makes the editor read the model again (at once, after the write in
2221
2246
  flight, or on the reconnect), and it is a write for the host too: it
2222
2247
  publishes `EV_RECORD_WRITTEN` and marks the topic of the record answered.
2223
- Only the host's `EV_REFRESH` (a Save sends it) forgets what this session
2224
- wrote; the reloads the editor asks itself (the reconnect's, a late write's)
2248
+ Only `EV_REFRESH` forgets what this session wrote -- the view's own Refresh
2249
+ button sends it, and a host may after a Save (the agent console does not:
2250
+ there the chips of this session stay until Refresh); the reloads the editor
2251
+ asks itself (the reconnect's, a late write's, the one a refused load owed)
2225
2252
  keep the draft chips. Through a routing adapter that settled the
2226
2253
  write on its OWN deadline the late answer does not reach the view -- the
2227
2254
  adapter echoes a node event instead, which this view does not hear -- and
@@ -3170,7 +3197,12 @@ a modal
3170
3197
  `MODAL` / `MODAL_BACKDROP` / `MODAL_CONTENT` / `MODAL_HEADER` / `MODAL_BACK` /
3171
3198
  `MODAL_TITLE` (+ `MODAL_TITLE_PREFIX` / `MODAL_TITLE_KIND`) / `MODAL_CLOSE` /
3172
3199
  `MODAL_BODY`, a confirm `CONFIRM*` and a toast
3173
- `TOAST*`.
3200
+ `TOAST*`. Every button of that chrome -- each ✕, a dialog's back arrow, a
3201
+ confirmation's answers (`CONFIRM_BTN`) -- carries a translatable `title` and
3202
+ `aria-label` (7.25.10). An answer is named by its own label, so pass i18n
3203
+ KEYS as `yes_label` / `confirm_label` / … (`{yes_label: "install"}`): the
3204
+ defaults (`"Yes"`, `"Delete"`) are not lower-case and no validated locale
3205
+ can hold them.
3174
3206
 
3175
3207
  Those names identify the *kind* of block, not the *instance*: every window in
3176
3208
  the app is a `C_YUI_WINDOW`, every popup is a `MODAL`. To target **one**
@@ -3161,6 +3161,8 @@ function yui_shell_show_modal(shell, content, opts) {
3161
3161
  {
3162
3162
  class: "MODAL_BACK yui-dialog-back",
3163
3163
  type: "button",
3164
+ title: (0, i18next.t)("back"),
3165
+ "data-i18n-title": "back",
3164
3166
  "aria-label": (0, i18next.t)("back"),
3165
3167
  "data-i18n-aria-label": "back"
3166
3168
  },
@@ -3341,7 +3343,13 @@ function build_dialog(shell, message, buttons, opts) {
3341
3343
  type: "button",
3342
3344
  "data-modal-button-value": b.value
3343
3345
  };
3344
- if (typeof b.label === "string") btn_attrs.i18n = b.label;
3346
+ if (typeof b.label === "string") {
3347
+ btn_attrs.i18n = b.label;
3348
+ btn_attrs.title = (0, i18next.t)(b.label);
3349
+ btn_attrs["data-i18n-title"] = b.label;
3350
+ btn_attrs["aria-label"] = (0, i18next.t)(b.label);
3351
+ btn_attrs["data-i18n-aria-label"] = b.label;
3352
+ }
3345
3353
  return [
3346
3354
  "button",
3347
3355
  btn_attrs,
@@ -72102,9 +72110,10 @@ function write_options(op) {
72102
72110
  * the owner's design of M36 (2026-09-21 review) every write here
72103
72111
  * raised both versions, so an edit half made was already the
72104
72112
  * schema of the next start. The topic list marks what this session
72105
- * wrote and has not saved (the host's EV_REFRESH after a save is
72106
- * what forgets it) and what the host says is not saved (EV_DRAFTS,
72107
- * replaced whole each time it is sent).
72113
+ * wrote and has not saved (EV_REFRESH forgets it: the view's own
72114
+ * Refresh button sends it, and a host may after a save -- the
72115
+ * agent console's does not) and what the host says is not saved
72116
+ * (EV_DRAFTS, replaced whole each time it is sent).
72108
72117
  *
72109
72118
  * WHAT ELSE IS HERE, and why each is here and not somewhere else:
72110
72119
  *
@@ -72382,6 +72391,45 @@ function built_on_a_replaced_model(gobj, event, kw) {
72382
72391
  yui_shell_show_error(yui_shell_of(gobj), "the schemas were read again: open the dialog again", { t: i18next.t });
72383
72392
  return true;
72384
72393
  }
72394
+ /***************************************************************
72395
+ * The reload a load refused IN session left owed (a routing
72396
+ * adapter's deadline on a slow `nodes`, ac_mt_command_answer()):
72397
+ * the model shown is kept, and it may be older than the store.
72398
+ * The session is up, so no reconnect will ask for it again -- it
72399
+ * was owed for as long as the session lasted, and a form opened
72400
+ * on that model wrote every field of it over the newer record
72401
+ * (fifth independent review; A3 of the fourth, by another path).
72402
+ *
72403
+ * So the operator's NEXT action asks it. An edit -- a form, a
72404
+ * write, a confirmation, what reads the model whole (check,
72405
+ * export) -- is refused and said: it would be computed on what
72406
+ * the store may no longer hold, and the load that lands closes a
72407
+ * dialog built on the old model anyway (end_load()). A move is
72408
+ * not refused (reload_after_move()): it goes, and reads there.
72409
+ *
72410
+ * Not on a timer, and not at once: a load refused on a deadline
72411
+ * asked again at once is refused the same way, and one asked on a
72412
+ * clock is polling. Out of session nothing is asked; the reconnect
72413
+ * does it (ac_transport_state()). The reload keeps this session's
72414
+ * draft chips: the host did not ask for it.
72415
+ ***************************************************************/
72416
+ function owes_reload(gobj) {
72417
+ let state = (0, _yuneta_gobj_js.gobj_current_state)(gobj);
72418
+ return gobj.priv.reload_on_open && transport_in_session(gobj) && state !== "ST_LOADING" && state !== "ST_SAVING";
72419
+ }
72420
+ function reload_first(gobj, event) {
72421
+ if (!owes_reload(gobj)) return false;
72422
+ gobj.priv.reload_on_open = false;
72423
+ (0, _yuneta_gobj_js.log_warning)(`${(0, _yuneta_gobj_js.gobj_short_name)(gobj)}: ${event} refused, the schemas shown may be out of date: they are read again first`);
72424
+ yui_shell_show_error(yui_shell_of(gobj), "the schemas shown may be out of date: they are read again, try again when they are in", { t: i18next.t });
72425
+ request_model(gobj, true);
72426
+ return true;
72427
+ }
72428
+ function reload_after_move(gobj) {
72429
+ if (!owes_reload(gobj)) return 0;
72430
+ gobj.priv.reload_on_open = false;
72431
+ return request_model(gobj, true);
72432
+ }
72385
72433
  /***************************
72386
72434
  * The model
72387
72435
  ***************************/
@@ -72400,11 +72448,14 @@ function built_on_a_replaced_model(gobj, event, kw) {
72400
72448
  * and a load that LANDS closes it (end_load()): it was built on the
72401
72449
  * model the load replaced, and its Save sends every field it shows.
72402
72450
  * An import plan is forgotten here for the same reason: it is a list
72403
- * of writes computed against the model going away.
72451
+ * of writes computed against the model going away -- once the load
72452
+ * has LEFT (one that could not be sent replaces nothing).
72404
72453
  *
72405
- * `keep_written`: a load the host did not ask for -- the reconnect,
72406
- * a write that turned out done -- keeps what this session wrote.
72407
- * Only the host's EV_REFRESH (a Save sends it) forgets it.
72454
+ * `keep_written`: a load nobody ASKED for -- the reconnect, a write
72455
+ * that turned out done, the reload a refused load owed -- keeps what
72456
+ * this session wrote. Only EV_REFRESH forgets it: the view's own
72457
+ * Refresh button, or a host that sends it (after a Save, say; the
72458
+ * agent console does not).
72408
72459
  *
72409
72460
  * A load that cannot leave WHOLE did not happen (out of session it
72410
72461
  * is not even asked): the records the model was built on are put
@@ -72417,8 +72468,7 @@ function built_on_a_replaced_model(gobj, event, kw) {
72417
72468
  function request_model(gobj, keep_written) {
72418
72469
  let priv = gobj.priv;
72419
72470
  if (!(0, _yuneta_gobj_js.gobj_read_pointer_attr)(gobj, "gobj_remote_yuno")) return -1;
72420
- forget_import_plan(gobj);
72421
- let previous = priv.records;
72471
+ let previous = (0, _yuneta_gobj_js.gobj_current_state)(gobj) === "ST_LOADING" ? priv.records_before : priv.records;
72422
72472
  priv.records_before = previous;
72423
72473
  priv.records = {
72424
72474
  treedbs: [],
@@ -72453,6 +72503,7 @@ function request_model(gobj, keep_written) {
72453
72503
  end_load(gobj);
72454
72504
  return -1;
72455
72505
  }
72506
+ forget_import_plan(gobj);
72456
72507
  priv.pending = left;
72457
72508
  return 0;
72458
72509
  }
@@ -72518,8 +72569,8 @@ function build_model(gobj) {
72518
72569
  * Called ONLY when records arrive from the store: that is what a
72519
72570
  * measurement of "changed since" can be measured against.
72520
72571
  *
72521
- * `written` is forgotten only by a load the HOST asked for (its
72522
- * EV_REFRESH, which a Save sends). Since M36 a write moves no
72572
+ * `written` is forgotten only by an EV_REFRESH (the view's own
72573
+ * Refresh button, or a host that sends one). Since M36 a write moves no
72523
72574
  * version, so `written` is the draft chip of what this session
72524
72575
  * wrote and no longer half of a version measurement: a reload of
72525
72576
  * the reconnect, or of a write that turned out done, forgot the
@@ -72541,10 +72592,12 @@ function start_measuring(gobj) {
72541
72592
  * until the host saves it (C_TREEDB's save-schema, which raises the
72542
72593
  * versions of what changed). Two sources say a topic is one, and
72543
72594
  * they are kept APART because they are forgotten differently:
72544
- * - `written`: what THIS session wrote. Only a load the HOST asked
72545
- * for forgets it (its EV_REFRESH, which a Save sends); the
72546
- * reconnect's reload, the one owed after a write and a late
72547
- * write's keep it (start_measuring(), request_model());
72595
+ * - `written`: what THIS session wrote. Only EV_REFRESH forgets
72596
+ * it -- the view's own Refresh button sends it (in the agent
72597
+ * console that is the only sender), and a host may after a
72598
+ * Save; the reconnect's reload, the one owed after a write, a
72599
+ * refused load's and a late write's keep it (start_measuring(),
72600
+ * request_model());
72548
72601
  * - `host_ids`: what the host said last (EV_DRAFTS), replaced WHOLE
72549
72602
  * by the next EV_DRAFTS. Folded into `written`, a topic the host
72550
72603
  * named once stayed a draft after the Save that published it.
@@ -74253,40 +74306,40 @@ function open_export(gobj, treedb) {
74253
74306
  [
74254
74307
  [
74255
74308
  "div",
74256
- { class: "SCHEMA_EXPORT_TABS tabs is-toggle mb-2" },
74309
+ { class: "SCHEMA_EXPORT_TABS buttons has-addons mb-2" },
74257
74310
  [[
74258
- "ul",
74259
- {},
74311
+ "button",
74312
+ {
74313
+ class: "SCHEMA_EXPORT_TAB button selected_state",
74314
+ type: "button",
74315
+ "data-pane": "c",
74316
+ "aria-pressed": "true",
74317
+ title: (0, i18next.t)("schema as c source"),
74318
+ "data-i18n-title": "schema as c source",
74319
+ "aria-label": (0, i18next.t)("schema as c source"),
74320
+ "data-i18n-aria-label": "schema as c source"
74321
+ },
74260
74322
  [[
74261
- "li",
74262
- {
74263
- class: "SCHEMA_EXPORT_TAB is-active",
74264
- "data-pane": "c"
74265
- },
74266
- [[
74267
- "a",
74268
- {},
74269
- [[
74270
- "span",
74271
- {},
74272
- "C"
74273
- ]]
74274
- ]]
74275
- ], [
74276
- "li",
74277
- {
74278
- class: "SCHEMA_EXPORT_TAB",
74279
- "data-pane": "json"
74280
- },
74281
- [[
74282
- "a",
74283
- {},
74284
- [[
74285
- "span",
74286
- {},
74287
- "JSON"
74288
- ]]
74289
- ]]
74323
+ "span",
74324
+ {},
74325
+ "C"
74326
+ ]]
74327
+ ], [
74328
+ "button",
74329
+ {
74330
+ class: "SCHEMA_EXPORT_TAB button",
74331
+ type: "button",
74332
+ "data-pane": "json",
74333
+ "aria-pressed": "false",
74334
+ title: (0, i18next.t)("schema as json"),
74335
+ "data-i18n-title": "schema as json",
74336
+ "aria-label": (0, i18next.t)("schema as json"),
74337
+ "data-i18n-aria-label": "schema as json"
74338
+ },
74339
+ [[
74340
+ "span",
74341
+ {},
74342
+ "JSON"
74290
74343
  ]]
74291
74344
  ]]
74292
74345
  ],
@@ -74356,7 +74409,10 @@ function open_export(gobj, treedb) {
74356
74409
  let $text = $content.querySelector(".SCHEMA_EXPORT_TEXT");
74357
74410
  for (let $tab of $content.querySelectorAll(".SCHEMA_EXPORT_TAB")) $tab.addEventListener("click", (evt) => {
74358
74411
  evt.stopPropagation();
74359
- for (let $other of $content.querySelectorAll(".SCHEMA_EXPORT_TAB")) $other.classList.toggle("is-active", $other === $tab);
74412
+ for (let $other of $content.querySelectorAll(".SCHEMA_EXPORT_TAB")) {
74413
+ $other.classList.toggle("selected_state", $other === $tab);
74414
+ $other.setAttribute("aria-pressed", $other === $tab ? "true" : "false");
74415
+ }
74360
74416
  $text.value = $tab.dataset.pane === "c" ? c_text : json_text;
74361
74417
  });
74362
74418
  $content.querySelector(".SCHEMA_EXPORT_COPY").addEventListener("click", (evt) => {
@@ -75078,7 +75134,7 @@ function ac_mt_command_answer(gobj, event, kw, src) {
75078
75134
  priv.records = priv.records_before;
75079
75135
  priv.records_before = null;
75080
75136
  priv.reload_on_open = true;
75081
- yui_shell_show_error(yui_shell_of(gobj), "cannot read the schemas again: the previous ones stay", { t: i18next.t });
75137
+ yui_shell_show_error(yui_shell_of(gobj), "cannot read the schemas again: the ones shown may be out of date, your next change reads them first", { t: i18next.t });
75082
75138
  return end_load(gobj);
75083
75139
  }
75084
75140
  priv.model = null;
@@ -75290,6 +75346,23 @@ function ac_wait_for_the_load(gobj, event, kw, src) {
75290
75346
  return -1;
75291
75347
  }
75292
75348
  /***************************************************************
75349
+ * A confirmation answered where no treedb is open: ST_EMPTY (a
75350
+ * reload landed on zero treedbs while it was up) or ST_IDLE (no
75351
+ * model). A confirmation is a shell modal, not this view's dialog,
75352
+ * so the load that lands does not close it, and its Yes arrives
75353
+ * anyway. Undeclared, it answered "Event NOT DEFINED" (fifth
75354
+ * independent review).
75355
+ *
75356
+ * Refused with the stamp's own words: whatever it was decided on
75357
+ * is not on screen any more.
75358
+ ***************************************************************/
75359
+ function ac_confirmed_on_nothing(gobj, event, kw, src) {
75360
+ if (built_on_a_replaced_model(gobj, event, kw)) return -1;
75361
+ (0, _yuneta_gobj_js.log_warning)(`${(0, _yuneta_gobj_js.gobj_short_name)(gobj)}: ${event} refused, no treedb is open`);
75362
+ yui_shell_show_error(yui_shell_of(gobj), "the schemas were read again: open the dialog again", { t: i18next.t });
75363
+ return -1;
75364
+ }
75365
+ /***************************************************************
75293
75366
  * {drafts: {treedb_name: [topic names]}} -- the host says which
75294
75367
  * topics hold a draft in __system__ that is not saved (C_TREEDB's
75295
75368
  * saved-schema, `draft_changed`). The mark of a write lived in this
@@ -75314,20 +75387,23 @@ function ac_drafts(gobj, event, kw, src) {
75314
75387
  * Moving about.
75315
75388
  ***************************************************************/
75316
75389
  function ac_select_treedb(gobj, event, kw, src) {
75317
- return go(gobj, kw.treedb, "", false, true);
75390
+ go(gobj, kw.treedb, "", false, true);
75391
+ return reload_after_move(gobj);
75318
75392
  }
75319
75393
  function ac_select_topic(gobj, event, kw, src) {
75320
- return go(gobj, gobj.priv.treedb_id, kw.topic, false, true);
75394
+ go(gobj, gobj.priv.treedb_id, kw.topic, false, true);
75395
+ return reload_after_move(gobj);
75321
75396
  }
75322
75397
  function ac_back(gobj, event, kw, src) {
75323
75398
  let priv = gobj.priv;
75324
- if (priv.diagram) return go(gobj, priv.treedb_id, "", false, true);
75325
- if (priv.topic_name) return go(gobj, priv.treedb_id, "", false, true);
75326
- return go(gobj, "", "", false, true);
75399
+ if (priv.diagram || priv.topic_name) go(gobj, priv.treedb_id, "", false, true);
75400
+ else go(gobj, "", "", false, true);
75401
+ return reload_after_move(gobj);
75327
75402
  }
75328
75403
  function ac_toggle_diagram(gobj, event, kw, src) {
75329
75404
  let priv = gobj.priv;
75330
- return go(gobj, priv.treedb_id, priv.topic_name, !priv.diagram, true);
75405
+ go(gobj, priv.treedb_id, priv.topic_name, !priv.diagram, true);
75406
+ return reload_after_move(gobj);
75331
75407
  }
75332
75408
  /***************************************************************
75333
75409
  * A topic clicked in the drawing. The diagram is a CHILD here
@@ -75337,9 +75413,11 @@ function ac_toggle_diagram(gobj, event, kw, src) {
75337
75413
  function ac_node_click(gobj, event, kw, src) {
75338
75414
  let topic = kw && kw.topic;
75339
75415
  if (!topic) return 0;
75340
- return go(gobj, gobj.priv.treedb_id, topic, false, true);
75416
+ go(gobj, gobj.priv.treedb_id, topic, false, true);
75417
+ return reload_after_move(gobj);
75341
75418
  }
75342
75419
  function ac_show_orphans(gobj, event, kw, src) {
75420
+ if (reload_first(gobj, event)) return -1;
75343
75421
  open_orphans(gobj);
75344
75422
  return 0;
75345
75423
  }
@@ -75355,7 +75433,9 @@ function confirm_then(gobj, message, detail, kw) {
75355
75433
  kw = Object.assign({ model_gen: gobj.priv.model_gen }, kw);
75356
75434
  yui_shell_confirm_danger(yui_shell_of(gobj), message, {
75357
75435
  t: i18next.t,
75358
- detail
75436
+ detail,
75437
+ confirm_label: "delete",
75438
+ cancel_label: "cancel"
75359
75439
  }).then((yes) => {
75360
75440
  if (!yes || (0, _yuneta_gobj_js.gobj_is_destroying)(gobj)) return;
75361
75441
  (0, _yuneta_gobj_js.gobj_send_event)(gobj, "EV_CONFIRMED", kw, gobj);
@@ -75367,6 +75447,7 @@ function confirm_then(gobj, message, detail, kw) {
75367
75447
  function ac_add_column(gobj, event, kw, src) {
75368
75448
  let topic = current_topic(gobj);
75369
75449
  if (refuse_if_readonly(gobj, event)) return -1;
75450
+ if (reload_first(gobj, event)) return -1;
75370
75451
  if (!topic) {
75371
75452
  (0, _yuneta_gobj_js.log_error)(`${(0, _yuneta_gobj_js.gobj_short_name)(gobj)}: ${event} with no topic open`);
75372
75453
  return -1;
@@ -75379,6 +75460,7 @@ function ac_edit_column(gobj, event, kw, src) {
75379
75460
  let topic = current_topic(gobj);
75380
75461
  let col = topic ? find_col(priv.model, priv.treedb_id, topic.name, kw.col) : null;
75381
75462
  if (refuse_if_readonly(gobj, event)) return -1;
75463
+ if (reload_first(gobj, event)) return -1;
75382
75464
  if (!col) {
75383
75465
  (0, _yuneta_gobj_js.log_error)(`${(0, _yuneta_gobj_js.gobj_short_name)(gobj)}: ${event} names no column: ${kw.col}`);
75384
75466
  return -1;
@@ -75396,6 +75478,7 @@ function ac_duplicate_column(gobj, event, kw, src) {
75396
75478
  let topic = current_topic(gobj);
75397
75479
  let col = topic ? find_col(priv.model, priv.treedb_id, topic.name, kw.col) : null;
75398
75480
  if (refuse_if_readonly(gobj, event)) return -1;
75481
+ if (reload_first(gobj, event)) return -1;
75399
75482
  if (!col) {
75400
75483
  (0, _yuneta_gobj_js.log_error)(`${(0, _yuneta_gobj_js.gobj_short_name)(gobj)}: ${event} names no column: ${kw.col}`);
75401
75484
  return -1;
@@ -75414,6 +75497,7 @@ function ac_save_column(gobj, event, kw, src) {
75414
75497
  let topic = find_topic(priv.model, priv.treedb_id, kw.topic);
75415
75498
  let col = kw.creating ? null : find_col(priv.model, priv.treedb_id, kw.topic, kw.col);
75416
75499
  if (refuse_if_readonly(gobj, event)) return -1;
75500
+ if (reload_first(gobj, event)) return -1;
75417
75501
  if (built_on_a_replaced_model(gobj, event, kw)) return -1;
75418
75502
  if (!topic || !kw.creating && !col) {
75419
75503
  (0, _yuneta_gobj_js.log_error)(`${(0, _yuneta_gobj_js.gobj_short_name)(gobj)}: ${event} names no column: ${kw.topic}.${kw.col}`);
@@ -75440,6 +75524,7 @@ function ac_delete_column(gobj, event, kw, src) {
75440
75524
  let topic = current_topic(gobj);
75441
75525
  let col = topic ? find_col(priv.model, priv.treedb_id, topic.name, kw.col) : null;
75442
75526
  if (refuse_if_readonly(gobj, event)) return -1;
75527
+ if (reload_first(gobj, event)) return -1;
75443
75528
  if (!col) {
75444
75529
  (0, _yuneta_gobj_js.log_error)(`${(0, _yuneta_gobj_js.gobj_short_name)(gobj)}: ${event} names no column: ${kw.col}`);
75445
75530
  return -1;
@@ -75459,6 +75544,7 @@ function ac_delete_column(gobj, event, kw, src) {
75459
75544
  function ac_move_column(gobj, event, kw, src) {
75460
75545
  let topic = current_topic(gobj);
75461
75546
  if (refuse_if_readonly(gobj, event)) return -1;
75547
+ if (reload_first(gobj, event)) return -1;
75462
75548
  if (!topic) {
75463
75549
  (0, _yuneta_gobj_js.log_error)(`${(0, _yuneta_gobj_js.gobj_short_name)(gobj)}: ${event} with no topic open`);
75464
75550
  return -1;
@@ -75494,6 +75580,7 @@ function ac_undo_order(gobj, event, kw, src) {
75494
75580
  let priv = gobj.priv;
75495
75581
  let topic = current_topic(gobj);
75496
75582
  if (refuse_if_readonly(gobj, event)) return -1;
75583
+ if (reload_first(gobj, event)) return -1;
75497
75584
  if (!topic) {
75498
75585
  (0, _yuneta_gobj_js.log_error)(`${(0, _yuneta_gobj_js.gobj_short_name)(gobj)}: ${event} with no topic open`);
75499
75586
  return -1;
@@ -75512,6 +75599,7 @@ function ac_undo_order(gobj, event, kw, src) {
75512
75599
  function ac_add_topic(gobj, event, kw, src) {
75513
75600
  let treedb = current_treedb(gobj);
75514
75601
  if (refuse_if_readonly(gobj, event)) return -1;
75602
+ if (reload_first(gobj, event)) return -1;
75515
75603
  if (!treedb) {
75516
75604
  (0, _yuneta_gobj_js.log_error)(`${(0, _yuneta_gobj_js.gobj_short_name)(gobj)}: ${event} with no treedb open`);
75517
75605
  return -1;
@@ -75524,6 +75612,7 @@ function ac_edit_topic(gobj, event, kw, src) {
75524
75612
  let treedb = current_treedb(gobj);
75525
75613
  let topic = treedb ? find_topic(priv.model, priv.treedb_id, kw.topic) : null;
75526
75614
  if (refuse_if_readonly(gobj, event)) return -1;
75615
+ if (reload_first(gobj, event)) return -1;
75527
75616
  if (!topic) {
75528
75617
  (0, _yuneta_gobj_js.log_error)(`${(0, _yuneta_gobj_js.gobj_short_name)(gobj)}: ${event} names no topic: ${kw.topic}`);
75529
75618
  return -1;
@@ -75536,6 +75625,7 @@ function ac_save_topic(gobj, event, kw, src) {
75536
75625
  let treedb = current_treedb(gobj);
75537
75626
  let topic = kw.creating ? null : find_topic(priv.model, priv.treedb_id, kw.topic);
75538
75627
  if (refuse_if_readonly(gobj, event)) return -1;
75628
+ if (reload_first(gobj, event)) return -1;
75539
75629
  if (built_on_a_replaced_model(gobj, event, kw)) return -1;
75540
75630
  if (!treedb || !kw.creating && !topic) {
75541
75631
  (0, _yuneta_gobj_js.log_error)(`${(0, _yuneta_gobj_js.gobj_short_name)(gobj)}: ${event} names no topic: ${kw.topic}`);
@@ -75564,6 +75654,7 @@ function ac_delete_topic(gobj, event, kw, src) {
75564
75654
  let priv = gobj.priv;
75565
75655
  let topic = find_topic(priv.model, priv.treedb_id, kw.topic);
75566
75656
  if (refuse_if_readonly(gobj, event)) return -1;
75657
+ if (reload_first(gobj, event)) return -1;
75567
75658
  if (!topic) {
75568
75659
  (0, _yuneta_gobj_js.log_error)(`${(0, _yuneta_gobj_js.gobj_short_name)(gobj)}: ${event} names no topic: ${kw.topic}`);
75569
75660
  return -1;
@@ -75579,6 +75670,7 @@ function ac_delete_topic(gobj, event, kw, src) {
75579
75670
  ***************************************************************/
75580
75671
  function ac_delete_orphan(gobj, event, kw, src) {
75581
75672
  if (refuse_if_readonly(gobj, event)) return -1;
75673
+ if (reload_first(gobj, event)) return -1;
75582
75674
  if (built_on_a_replaced_model(gobj, event, kw)) return -1;
75583
75675
  if ((0, _yuneta_gobj_js.empty_string)(kw.id)) {
75584
75676
  (0, _yuneta_gobj_js.log_error)(`${(0, _yuneta_gobj_js.gobj_short_name)(gobj)}: ${event} names nothing`);
@@ -75597,6 +75689,7 @@ function ac_delete_orphan(gobj, event, kw, src) {
75597
75689
  function ac_validate(gobj, event, kw, src) {
75598
75690
  let priv = gobj.priv;
75599
75691
  let treedb = current_treedb(gobj);
75692
+ if (reload_first(gobj, event)) return -1;
75600
75693
  if (!treedb) {
75601
75694
  (0, _yuneta_gobj_js.log_error)(`${(0, _yuneta_gobj_js.gobj_short_name)(gobj)}: ${event} with no treedb open`);
75602
75695
  return -1;
@@ -75611,6 +75704,7 @@ function ac_validate(gobj, event, kw, src) {
75611
75704
  }
75612
75705
  function ac_export(gobj, event, kw, src) {
75613
75706
  let treedb = current_treedb(gobj);
75707
+ if (reload_first(gobj, event)) return -1;
75614
75708
  if (!treedb) {
75615
75709
  (0, _yuneta_gobj_js.log_error)(`${(0, _yuneta_gobj_js.gobj_short_name)(gobj)}: ${event} with no treedb open`);
75616
75710
  return -1;
@@ -75621,6 +75715,7 @@ function ac_export(gobj, event, kw, src) {
75621
75715
  function ac_import(gobj, event, kw, src) {
75622
75716
  let treedb = current_treedb(gobj);
75623
75717
  if (refuse_if_readonly(gobj, event)) return -1;
75718
+ if (reload_first(gobj, event)) return -1;
75624
75719
  if (!treedb) {
75625
75720
  (0, _yuneta_gobj_js.log_error)(`${(0, _yuneta_gobj_js.gobj_short_name)(gobj)}: ${event} with no treedb open`);
75626
75721
  return -1;
@@ -75636,6 +75731,7 @@ function ac_preview_import(gobj, event, kw, src) {
75636
75731
  let priv = gobj.priv;
75637
75732
  let treedb = current_treedb(gobj);
75638
75733
  let incoming = null;
75734
+ if (reload_first(gobj, event)) return -1;
75639
75735
  if (built_on_a_replaced_model(gobj, event, kw)) return -1;
75640
75736
  if (!treedb) {
75641
75737
  (0, _yuneta_gobj_js.log_error)(`${(0, _yuneta_gobj_js.gobj_short_name)(gobj)}: ${event} with no treedb open`);
@@ -75664,6 +75760,7 @@ function ac_preview_import(gobj, event, kw, src) {
75664
75760
  function ac_apply_import(gobj, event, kw, src) {
75665
75761
  let plan = gobj.priv.import_plan;
75666
75762
  if (refuse_if_readonly(gobj, event)) return -1;
75763
+ if (reload_first(gobj, event)) return -1;
75667
75764
  if (built_on_a_replaced_model(gobj, event, kw)) return -1;
75668
75765
  if (!plan || plan.writes.length === 0) {
75669
75766
  (0, _yuneta_gobj_js.log_error)(`${(0, _yuneta_gobj_js.gobj_short_name)(gobj)}: ${event} with no plan to run`);
@@ -75682,7 +75779,8 @@ function run_import(gobj) {
75682
75779
  let priv = gobj.priv;
75683
75780
  let plan = priv.import_plan;
75684
75781
  if (!plan) {
75685
- (0, _yuneta_gobj_js.log_error)(`${(0, _yuneta_gobj_js.gobj_short_name)(gobj)}: the import plan is gone`);
75782
+ (0, _yuneta_gobj_js.log_warning)(`${(0, _yuneta_gobj_js.gobj_short_name)(gobj)}: the import plan is gone`);
75783
+ yui_shell_show_error(yui_shell_of(gobj), "the import plan is gone: preview it again", { t: i18next.t });
75686
75784
  return -1;
75687
75785
  }
75688
75786
  close_dialog(gobj);
@@ -75707,6 +75805,7 @@ function run_import(gobj) {
75707
75805
  function ac_confirmed(gobj, event, kw, src) {
75708
75806
  let priv = gobj.priv;
75709
75807
  if (refuse_if_readonly(gobj, event)) return -1;
75808
+ if (reload_first(gobj, event)) return -1;
75710
75809
  if (built_on_a_replaced_model(gobj, event, kw)) return -1;
75711
75810
  if (kw.what === "import") return run_import(gobj);
75712
75811
  if (kw.what === "topic") {
@@ -75841,7 +75940,11 @@ function create_gclass$1(gclass_name) {
75841
75940
  ]
75842
75941
  ];
75843
75942
  const states = [
75844
- ["ST_IDLE", COMMON.slice()],
75943
+ ["ST_IDLE", COMMON.concat([[
75944
+ "EV_CONFIRMED",
75945
+ ac_confirmed_on_nothing,
75946
+ null
75947
+ ]])],
75845
75948
  ["ST_LOADING", COMMON.concat([
75846
75949
  [
75847
75950
  "EV_SAVE_COLUMN",
@@ -75874,7 +75977,11 @@ function create_gclass$1(gclass_name) {
75874
75977
  null
75875
75978
  ]
75876
75979
  ])],
75877
- ["ST_EMPTY", COMMON.slice()],
75980
+ ["ST_EMPTY", COMMON.concat([[
75981
+ "EV_CONFIRMED",
75982
+ ac_confirmed_on_nothing,
75983
+ null
75984
+ ]])],
75878
75985
  ["ST_TREEDBS", COMMON.concat([
75879
75986
  [
75880
75987
  "EV_SELECT_TREEDB",