From e5e5df4f44fdc56f32f5a8121deb1ddad47da0ca Mon Sep 17 00:00:00 2001 From: Chris Mason Date: Sat, 1 Feb 2025 07:54:07 +0000 Subject: [PATCH 1/5] bump version --- CHANGELOG.md | 4 ++++ jinjafx_server.py | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 682ac33..e079049 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,8 @@ ## CHANGELOG +### [25.4.0] - In Development +- Add the ability to hide the `GLOBAL.YML` pane via a toggle switch + ### [25.3.2] - Jan 28, 2025 - Allow `/` and `.` to be used in template names - Updated code to call `JinjaFx()._jinjafx()` instead of `JinjaFx().jinjafx()` @@ -396,6 +399,7 @@ - Initial release +[25.4.0]: https://github.com/cmason3/jinjafx_server/compare/25.3.2...25.4.0 [25.3.2]: https://github.com/cmason3/jinjafx_server/compare/25.3.1...25.3.2 [25.3.1]: https://github.com/cmason3/jinjafx_server/compare/25.3.0...25.3.1 [25.3.0]: https://github.com/cmason3/jinjafx_server/compare/25.2.2...25.3.0 diff --git a/jinjafx_server.py b/jinjafx_server.py index f4647f8..71e15bd 100755 --- a/jinjafx_server.py +++ b/jinjafx_server.py @@ -27,7 +27,7 @@ import re, argparse, hashlib, traceback, glob, hmac, uuid, struct, binascii, gzip, requests, ctypes, subprocess import cmarkgfm, emoji -__version__ = '25.3.2' +__version__ = '25.4.0' llock = threading.RLock() rlock = threading.RLock() From a468f5187f1e4a41110f3fd3c1126ce2f3a30e4d Mon Sep 17 00:00:00 2001 From: Chris Mason Date: Sat, 1 Feb 2025 12:41:41 +0000 Subject: [PATCH 2/5] add toggle for global.yml --- www/index.html | 4 ++-- www/jinjafx_m.css | 14 ++++++++++++++ www/jinjafx_m.js | 28 ++++++++++++++++++++++++++++ 3 files changed, 44 insertions(+), 2 deletions(-) diff --git a/www/index.html b/www/index.html index 8eaeaa7..059408e 100644 --- a/www/index.html +++ b/www/index.html @@ -13,7 +13,7 @@ - + @@ -32,7 +32,7 @@ - +
diff --git a/www/jinjafx_m.css b/www/jinjafx_m.css index f1f261f..17766d9 100644 --- a/www/jinjafx_m.css +++ b/www/jinjafx_m.css @@ -65,6 +65,20 @@ textarea { border-top-left-radius: 0.3rem !important; border-bottom-left-radius: 0.3rem !important; } +.dropdown-item-nofocus { + display: block; + width: 100%; + padding: var(--bs-dropdown-item-padding-y) var(--bs-dropdown-item-padding-x); + clear: both; + font-weight: 400; + color: var(--bs-dropdown-link-color); + text-align: inherit; + text-decoration: none; + white-space: nowrap; + background-color: transparent; + border: 0; + border-radius: var(--bs-dropdown-item-border-radius, 0); +} .code-block { border: 1px dashed gray; background-color: lightgray; diff --git a/www/jinjafx_m.js b/www/jinjafx_m.js index e9de302..0748b91 100644 --- a/www/jinjafx_m.js +++ b/www/jinjafx_m.js @@ -193,9 +193,37 @@ function getStatusText(code) { fe.focus(); } + function toggle_global() { + // alert(document.getElementById('toggle_global').checked); + } + function rebuild_datasets() { document.getElementById('datasets').innerHTML = ''; + var cbl = document.createElement('label'); + cbl.for = 'toggle_global'; + cbl.classList.add('form-check-label'); + cbl.innerHTML = 'Global.yml'; + + var cb = document.createElement('input'); + cb.classList.add('form-check-input', 'float-end'); + cb.type = 'checkbox'; + cb.checked = 'checked'; + cb.addEventListener('change', toggle_global, false); + cb.id = 'toggle_global'; + + var e = document.createElement('div'); + e.classList.add('dropdown-item-nofocus', 'form-check', 'form-switch'); + e.style.minWidth = '200px'; + e.appendChild(cbl); + e.appendChild(cb); + + document.getElementById('datasets').appendChild(e); + + e = document.createElement('div'); + e.classList.add('dropdown-divider'); + document.getElementById('datasets').appendChild(e); + Object.keys(datasets).sort(default_on_top).forEach(function(ds) { var e = document.createElement('button'); e.classList.add('dropdown-item', 'text-decoration-none'); From e7bc60ee9bf1fc1c9df06c627908a97156a913ee Mon Sep 17 00:00:00 2001 From: Chris Mason Date: Sat, 1 Feb 2025 13:07:42 +0000 Subject: [PATCH 3/5] add toggle for global.yml --- CHANGELOG.md | 2 ++ www/index.html | 2 +- www/jinjafx_m.js | 86 ++++++++++++++++++++++++++++++++---------------- 3 files changed, 60 insertions(+), 30 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e079049..306deab 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,8 @@ ### [25.4.0] - In Development - Add the ability to hide the `GLOBAL.YML` pane via a toggle switch +-- Issue with deleting DataSets and Templates with the dropdown open + ### [25.3.2] - Jan 28, 2025 - Allow `/` and `.` to be used in template names - Updated code to call `JinjaFx()._jinjafx()` instead of `JinjaFx().jinjafx()` diff --git a/www/index.html b/www/index.html index 059408e..14bfd9c 100644 --- a/www/index.html +++ b/www/index.html @@ -32,7 +32,7 @@ - +
diff --git a/www/jinjafx_m.js b/www/jinjafx_m.js index 0748b91..2ff3a7f 100644 --- a/www/jinjafx_m.js +++ b/www/jinjafx_m.js @@ -127,6 +127,7 @@ function getStatusText(code) { var csv_on = false; var cDataPos = null; var xsplit = null; + var global_visible = true; var jsyaml_schema = { schema: jsyaml.DEFAULT_SCHEMA.extend(['scalar', 'sequence', 'mapping'].map(function(kind) { @@ -194,7 +195,49 @@ function getStatusText(code) { } function toggle_global() { - // alert(document.getElementById('toggle_global').checked); + if (document.getElementById('toggle_global').checked) { + global_visible = true; + split_vars(); + } + else { + global_visible = false; + unsplit_vars(false); + } + } + + function split_vars() { + document.getElementById('xgvars').classList.remove('d-none'); + document.getElementById('xlvars').classList.remove('h-100'); + + xsplit = Split(["#xgvars", "#xlvars"], { + direction: "vertical", + cursor: "row-resize", + sizes: [50, 50], + snapOffset: 0, + minSize: 30, + onDragStart: remove_info + }); + window.cmgVars.refresh(); + } + + function unsplit_vars(copy) { + document.getElementById('xgvars').classList.add('d-none'); + document.getElementById('xlvars').classList.add('h-100'); + + if (xsplit != null) { + xsplit.destroy(); + xsplit = null; + + if (copy) { + if (window.cmgVars.getValue().match(/\S/)) { + var ds = Object.keys(datasets).sort(default_on_top)[0]; + datasets[ds][1].setValue(window.cmgVars.getValue().trimEnd() + "\n\n" + datasets[ds][1].getValue()); + } + + window.cmgVars.setValue(""); + window.cmgVars.getDoc().clearHistory(); + } + } } function rebuild_datasets() { @@ -208,7 +251,7 @@ function getStatusText(code) { var cb = document.createElement('input'); cb.classList.add('form-check-input', 'float-end'); cb.type = 'checkbox'; - cb.checked = 'checked'; + cb.checked = global_visible ? 'checked' : ''; cb.addEventListener('change', toggle_global, false); cb.id = 'toggle_global'; @@ -235,18 +278,9 @@ function getStatusText(code) { if (Object.keys(datasets).length > 1) { if (document.getElementById('select_ds').disabled == true) { - document.getElementById('xgvars').classList.remove('d-none'); - document.getElementById('xlvars').classList.remove('h-100'); - - xsplit = Split(["#xgvars", "#xlvars"], { - direction: "vertical", - cursor: "row-resize", - sizes: [50, 50], - snapOffset: 0, - minSize: 30, - onDragStart: remove_info - }); - window.cmgVars.refresh(); + if (global_visible) { + split_vars(); + } } document.getElementById('select_ds').disabled = false; document.getElementById('delete_ds').disabled = false; @@ -254,21 +288,7 @@ function getStatusText(code) { else { document.getElementById('select_ds').disabled = true; document.getElementById('delete_ds').disabled = true; - document.getElementById('xgvars').classList.add('d-none'); - document.getElementById('xlvars').classList.add('h-100'); - - if (xsplit != null) { - xsplit.destroy(); - xsplit = null; - - if (window.cmgVars.getValue().match(/\S/)) { - var ds = Object.keys(datasets).sort(default_on_top)[0]; - datasets[ds][1].setValue(window.cmgVars.getValue().trimEnd() + "\n\n" + datasets[ds][1].getValue()); - } - - window.cmgVars.setValue(""); - window.cmgVars.getDoc().clearHistory(); - } + unsplit_vars(true); } document.getElementById('selected_ds').innerHTML = current_ds; } @@ -1052,6 +1072,8 @@ function getStatusText(code) { var obj = jsyaml.load(contents, jsyaml_schema); if (obj != null) { pending_dt = obj['dt']; + global_visible = true; + split_vars(); apply_dt(false); return true; } @@ -1077,6 +1099,8 @@ function getStatusText(code) { var obj = jsyaml.load(e2.target.result, jsyaml_schema); if (obj != null) { pending_dt = obj['dt']; + global_visible = true; + split_vars(); apply_dt(false); return true; } @@ -2012,10 +2036,14 @@ function getStatusText(code) { if (dirty) { if (confirm("Are You Sure?") === true) { + global_visible = true; + split_vars(); apply_dt(false); } } else { + global_visible = true; + split_vars(); apply_dt(false); } } From e1e35f6de3e07e0ec7450755e3004fa597d0f220 Mon Sep 17 00:00:00 2001 From: Chris Mason Date: Sat, 1 Feb 2025 22:09:27 +0000 Subject: [PATCH 4/5] add toggle for global.yml --- CHANGELOG.md | 1 + www/index.html | 2 +- www/jinjafx_m.js | 17 +++++++++-------- 3 files changed, 11 insertions(+), 9 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 306deab..ddad7aa 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,7 @@ - Add the ability to hide the `GLOBAL.YML` pane via a toggle switch -- Issue with deleting DataSets and Templates with the dropdown open +-- Save global visible status on saved datatemplates ### [25.3.2] - Jan 28, 2025 - Allow `/` and `.` to be used in template names diff --git a/www/index.html b/www/index.html index 14bfd9c..a51b99b 100644 --- a/www/index.html +++ b/www/index.html @@ -32,7 +32,7 @@ - +
diff --git a/www/jinjafx_m.js b/www/jinjafx_m.js index 2ff3a7f..c3ba769 100644 --- a/www/jinjafx_m.js +++ b/www/jinjafx_m.js @@ -277,18 +277,23 @@ function getStatusText(code) { }); if (Object.keys(datasets).length > 1) { - if (document.getElementById('select_ds').disabled == true) { - if (global_visible) { - split_vars(); + if (global_visible && (xsplit == null)) { + split_vars(); + } + else if (!global_visible) { + if (xsplit != null) { + unsplit_vars(true); } } document.getElementById('select_ds').disabled = false; document.getElementById('delete_ds').disabled = false; } else { + if (xsplit != null) { + unsplit_vars(true); + } document.getElementById('select_ds').disabled = true; document.getElementById('delete_ds').disabled = true; - unsplit_vars(true); } document.getElementById('selected_ds').innerHTML = current_ds; } @@ -1073,7 +1078,6 @@ function getStatusText(code) { if (obj != null) { pending_dt = obj['dt']; global_visible = true; - split_vars(); apply_dt(false); return true; } @@ -1100,7 +1104,6 @@ function getStatusText(code) { if (obj != null) { pending_dt = obj['dt']; global_visible = true; - split_vars(); apply_dt(false); return true; } @@ -2037,13 +2040,11 @@ function getStatusText(code) { if (dirty) { if (confirm("Are You Sure?") === true) { global_visible = true; - split_vars(); apply_dt(false); } } else { global_visible = true; - split_vars(); apply_dt(false); } } From 6acaea3251d4afd658d43bd5c04eb09821d5a230 Mon Sep 17 00:00:00 2001 From: Chris Mason Date: Mon, 3 Feb 2025 08:04:55 +0000 Subject: [PATCH 5/5] add toggle for global.yml --- CHANGELOG.md | 8 +++----- jinjafx_server.py | 3 +++ www/index.html | 2 +- www/jinjafx_m.js | 15 +++++++++++++++ 4 files changed, 22 insertions(+), 6 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index ddad7aa..21cf809 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,10 +1,8 @@ ## CHANGELOG -### [25.4.0] - In Development -- Add the ability to hide the `GLOBAL.YML` pane via a toggle switch - --- Issue with deleting DataSets and Templates with the dropdown open --- Save global visible status on saved datatemplates +### [25.4.0] - Feb 3, 2025 +- Add the ability to hide the `Global.yml` pane via a toggle switch +- If you delete a DataSet or Template with the dropdown open it will now close automatically. ### [25.3.2] - Jan 28, 2025 - Allow `/` and `.` to be used in template names diff --git a/jinjafx_server.py b/jinjafx_server.py index 71e15bd..dc3b495 100755 --- a/jinjafx_server.py +++ b/jinjafx_server.py @@ -767,6 +767,9 @@ def authenticate_dt(rdt, r): dt_yml += 'revision: ' + str(dt_revision) + '\n' dt_yml += 'dataset: "' + dt['dataset'] + '"\n' + + if 'show_global' in dt: + dt_yml += 'show_global: ' + dt['show_global'] + '\n' if dt_encrypted: dt_yml += 'encrypted: 1\n' diff --git a/www/index.html b/www/index.html index a51b99b..2cfecc5 100644 --- a/www/index.html +++ b/www/index.html @@ -32,7 +32,7 @@ - +
diff --git a/www/jinjafx_m.js b/www/jinjafx_m.js index c3ba769..b512906 100644 --- a/www/jinjafx_m.js +++ b/www/jinjafx_m.js @@ -203,6 +203,11 @@ function getStatusText(code) { global_visible = false; unsplit_vars(false); } + window.addEventListener('beforeunload', onBeforeUnload); + if (document.getElementById('get_link').value != 'false') { + document.title = 'JinjaFx [unsaved]'; + } + dirty = true; } function split_vars() { @@ -413,6 +418,7 @@ function getStatusText(code) { fe.focus(); if (method == "delete_dataset") { + document.getElementById('datasets').classList.remove('show'); if ((window.cmData.getValue().match(/\S/) || window.cmVars.getValue().match(/\S/)) || ((Object.keys(datasets).length == 2) && window.cmgVars.getValue().match(/\S/))) { if (confirm("Are You Sure?") === true) { delete_dataset(current_ds); @@ -424,6 +430,7 @@ function getStatusText(code) { return false; } else if (method == "add_dataset") { + document.getElementById('datasets').classList.remove('show'); document.getElementById("ds_name").value = ''; new bootstrap.Modal(document.getElementById('dataset_input'), { keyboard: true @@ -431,6 +438,7 @@ function getStatusText(code) { return false; } else if (method == "delete_template") { + document.getElementById('templates').classList.remove('show'); if (window.cmTemplate.getValue().match(/\S/)) { if (confirm("Are You Sure?") === true) { delete_template(current_t); @@ -442,6 +450,7 @@ function getStatusText(code) { return false; } else if (method == "add_template") { + document.getElementById('templates').classList.remove('show'); document.getElementById("t_name").value = ''; new bootstrap.Modal(document.getElementById('template_input'), { keyboard: true @@ -714,6 +723,10 @@ function getStatusText(code) { dt.dataset = current_ds; + if (Object.keys(datasets).length > 1) { + dt.show_global = global_visible ? '1' : '0'; + } + if (Object.keys(templates).length === 1) { dt.template = e(window.cmTemplate.getValue().replace(/\t/g, " ")); } @@ -945,6 +958,8 @@ function getStatusText(code) { dt_encrypted = false; } + global_visible = (!dt.hasOwnProperty('show_global') || dt['show_global']) ? true : false; + if (qs.hasOwnProperty('ds')) { load_datatemplate(dt['dt'], qs, qs['ds']); }