From 708c652d21de4e07d6b718ddfee450ff35731a36 Mon Sep 17 00:00:00 2001 From: "Markus F.J. Busche" Date: Sun, 21 Sep 2025 12:21:26 +0200 Subject: [PATCH 01/10] =?UTF-8?q?Navbar=20step1:=20statischer=20Navbar-Ein?= =?UTF-8?q?trag=20ohne=20JS-Bindings=20hinzugef=C3=BCgt?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../octoprint_tailscale_funnel/__init__.py | 3 ++- .../templates/tailscale_funnel_navbar.jinja2 | 12 ++++++++++++ 2 files changed, 14 insertions(+), 1 deletion(-) create mode 100644 octoprint_tailscale_funnel/octoprint_tailscale_funnel/templates/tailscale_funnel_navbar.jinja2 diff --git a/octoprint_tailscale_funnel/octoprint_tailscale_funnel/__init__.py b/octoprint_tailscale_funnel/octoprint_tailscale_funnel/__init__.py index 69ff9f6..043f64b 100644 --- a/octoprint_tailscale_funnel/octoprint_tailscale_funnel/__init__.py +++ b/octoprint_tailscale_funnel/octoprint_tailscale_funnel/__init__.py @@ -100,7 +100,8 @@ class TailscaleFunnelPlugin(octoprint.plugin.StartupPlugin, def get_template_configs(self): return [ - dict(type="settings", custom_bindings=True, template="tailscale_funnel_settings.jinja2") + dict(type="settings", custom_bindings=True, template="tailscale_funnel_settings.jinja2"), + dict(type="navbar", name="Funnel", custom_bindings=False, template="tailscale_funnel_navbar.jinja2") ] ##~~ BlueprintPlugin mixin diff --git a/octoprint_tailscale_funnel/octoprint_tailscale_funnel/templates/tailscale_funnel_navbar.jinja2 b/octoprint_tailscale_funnel/octoprint_tailscale_funnel/templates/tailscale_funnel_navbar.jinja2 new file mode 100644 index 0000000..1ca66a7 --- /dev/null +++ b/octoprint_tailscale_funnel/octoprint_tailscale_funnel/templates/tailscale_funnel_navbar.jinja2 @@ -0,0 +1,12 @@ + + From ac3298c40e6a05c0c084a6a39a0ee828b763b5a8 Mon Sep 17 00:00:00 2001 From: "Markus F.J. Busche" Date: Sun, 21 Sep 2025 12:25:42 +0200 Subject: [PATCH 02/10] build: build_plugin.sh wiederhergestellt (venv, optionaler Versionsbump, ZIP) --- scripts/build_plugin.sh | 142 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 142 insertions(+) create mode 100755 scripts/build_plugin.sh diff --git a/scripts/build_plugin.sh b/scripts/build_plugin.sh new file mode 100755 index 0000000..14acf18 --- /dev/null +++ b/scripts/build_plugin.sh @@ -0,0 +1,142 @@ +#!/usr/bin/env bash +set -euo pipefail + +# Usage: scripts/build_plugin.sh [VERSION] +# - Läuft im Projekt-.venv +# - Optional: VERSION (z.B. 0.1.6.4). Wenn gesetzt, wird setup.py gepatcht. +# - Baut wheel + sdist und erstellt zusätzlich ein "normales" ZIP der sdist-Struktur. + +ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")"/.. && pwd)" +PLUGIN_DIR="$ROOT_DIR/octoprint_tailscale_funnel" +DIST_DIR="$PLUGIN_DIR/dist" +VENV_DIR="$ROOT_DIR/.venv" + +VERSION_INPUT="${1:-}" + +echo "Project root: $ROOT_DIR" +echo "Plugin dir: $PLUGIN_DIR" +echo "Venv dir: $VENV_DIR" + +# Ensure venv +if [[ ! -x "$VENV_DIR/bin/python" ]]; then + echo "Creating venv at $VENV_DIR" + python3 -m venv "$VENV_DIR" +fi + +"$VENV_DIR/bin/pip" install -q --upgrade pip setuptools wheel build packaging octoprint_setuptools + +# Optional: bump version +if [[ -n "$VERSION_INPUT" ]]; then + echo "Setting version to $VERSION_INPUT" + "$VENV_DIR/bin/python" - "$VERSION_INPUT" "$PLUGIN_DIR/setup.py" <<'PY' +import sys, re, pathlib +ver = sys.argv[1] +setup_path = pathlib.Path(sys.argv[2]) +text = setup_path.read_text() +new_text = re.sub(r'^(plugin_version\s*=\s*")([^"]*)(")', lambda m: m.group(1) + ver + m.group(3), text, flags=re.M) +setup_path.write_text(new_text) +print("Updated version to", ver) +PY +fi + +# Clean dist +mkdir -p "$DIST_DIR" +rm -f "$DIST_DIR"/* + +# Build wheel + sdist +echo "Building (wheel + sdist)..." +"$VENV_DIR/bin/python" -m build --no-isolation "$PLUGIN_DIR" + +# Create additional plain ZIP from sdist content (flat source zip) +SDIST_TGZ=$(ls -1 "$DIST_DIR"/*.tar.gz | tail -n1 || true) +if [[ -n "$SDIST_TGZ" ]]; then + echo "Creating plain ZIP from sdist: $SDIST_TGZ" + TMP_DIR="$(mktemp -d)" + tar -xzf "$SDIST_TGZ" -C "$TMP_DIR" + SRC_DIR="$(find "$TMP_DIR" -maxdepth 1 -type d -name 'octoprint_tailscale_funnel-*' | head -n1)" + if [[ -n "$SRC_DIR" ]]; then + ZIP_NAME="$(basename "$SRC_DIR").zip" + (cd "$SRC_DIR" && zip -rq "$DIST_DIR/$ZIP_NAME" .) + echo "Created: $DIST_DIR/$ZIP_NAME" + else + echo "WARN: Could not find extracted sdist directory to zip" + fi + rm -rf "$TMP_DIR" +else + echo "WARN: No sdist .tar.gz found, skipping plain ZIP creation" +fi + +echo "Artifacts in $DIST_DIR:" +ls -lah "$DIST_DIR" + +#!/usr/bin/env bash +set -euo pipefail + +# Usage: scripts/build_plugin.sh [VERSION] +# - Läuft im Projekt-.venv +# - Optional: VERSION (z.B. 0.1.6.4). Wenn gesetzt, wird setup.py gepatcht. +# - Baut wheel + sdist und erstellt zusätzlich ein "normales" ZIP der sdist-Struktur. + +ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")"/.. && pwd)" +PLUGIN_DIR="$ROOT_DIR/octoprint_tailscale_funnel" +DIST_DIR="$PLUGIN_DIR/dist" +VENV_DIR="$ROOT_DIR/.venv" + +VERSION_INPUT="${1:-}" + +echo "Project root: $ROOT_DIR" +echo "Plugin dir: $PLUGIN_DIR" +echo "Venv dir: $VENV_DIR" + +# Ensure venv +if [[ ! -x "$VENV_DIR/bin/python" ]]; then + echo "Creating venv at $VENV_DIR" + python3 -m venv "$VENV_DIR" +fi + +"$VENV_DIR/bin/pip" install -q --upgrade pip setuptools wheel build packaging octoprint_setuptools + +# Optional: bump version +if [[ -n "$VERSION_INPUT" ]]; then + echo "Setting version to $VERSION_INPUT" + "$VENV_DIR/bin/python" - "$VERSION_INPUT" "$PLUGIN_DIR/setup.py" <<'PY' +import sys, re, pathlib +ver = sys.argv[1] +setup_path = pathlib.Path(sys.argv[2]) +text = setup_path.read_text() +new_text = re.sub(r'^(plugin_version\s*=\s*")([^"]*)(")', lambda m: m.group(1) + ver + m.group(3), text, flags=re.M) +setup_path.write_text(new_text) +print("Updated version to", ver) +PY +fi + +# Clean dist +mkdir -p "$DIST_DIR" +rm -f "$DIST_DIR"/* + +# Build wheel + sdist +echo "Building (wheel + sdist)..." +"$VENV_DIR/bin/python" -m build --no-isolation "$PLUGIN_DIR" + +# Create additional plain ZIP from sdist content (flat source zip) +SDIST_TGZ=$(ls -1 "$DIST_DIR"/*.tar.gz | tail -n1 || true) +if [[ -n "$SDIST_TGZ" ]]; then + echo "Creating plain ZIP from sdist: $SDIST_TGZ" + TMP_DIR="$(mktemp -d)" + tar -xzf "$SDIST_TGZ" -C "$TMP_DIR" + SRC_DIR="$(find "$TMP_DIR" -maxdepth 1 -type d -name 'octoprint_tailscale_funnel-*' | head -n1)" + if [[ -n "$SRC_DIR" ]]; then + ZIP_NAME="$(basename "$SRC_DIR").zip" + (cd "$SRC_DIR" && zip -rq "$DIST_DIR/$ZIP_NAME" .) + echo "Created: $DIST_DIR/$ZIP_NAME" + else + echo "WARN: Could not find extracted sdist directory to zip" + fi + rm -rf "$TMP_DIR" +else + echo "WARN: No sdist .tar.gz found, skipping plain ZIP creation" +fi + +echo "Artifacts in $DIST_DIR:" +ls -lah "$DIST_DIR" + From dd89c5f65086f8c431096c3e19cfb3387cd91317 Mon Sep 17 00:00:00 2001 From: "Markus F.J. Busche" Date: Sun, 21 Sep 2025 12:28:43 +0200 Subject: [PATCH 03/10] =?UTF-8?q?build:=20setup.py=20ohne=20OctoPrint-Buil?= =?UTF-8?q?d-Abh=C3=A4ngigkeit=20(dict=5Fmerge=20Fallback);=20project=20re?= =?UTF-8?q?quirements.txt;=20build=20script=20nutzt=20requirements.txt?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- octoprint_tailscale_funnel/setup.py | 13 ++++++++++++- requirements.txt | 6 ++++++ scripts/build_plugin.sh | 7 ++++++- 3 files changed, 24 insertions(+), 2 deletions(-) create mode 100644 requirements.txt diff --git a/octoprint_tailscale_funnel/setup.py b/octoprint_tailscale_funnel/setup.py index 20f7801..0ef0b88 100644 --- a/octoprint_tailscale_funnel/setup.py +++ b/octoprint_tailscale_funnel/setup.py @@ -88,7 +88,18 @@ setup_parameters = octoprint_setuptools.create_plugin_setup_parameters( ) if len(additional_setup_parameters): - from octoprint.util import dict_merge + try: + from octoprint.util import dict_merge + except Exception: + # Fallback to allow building without the octoprint package installed + def dict_merge(a, b): + result = dict(a) + for k, v in b.items(): + if k in result and isinstance(result[k], dict) and isinstance(v, dict): + result[k] = dict_merge(result[k], v) + else: + result[k] = v + return result setup_parameters = dict_merge(setup_parameters, additional_setup_parameters) setup(**setup_parameters) \ No newline at end of file diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..a8cfc1f --- /dev/null +++ b/requirements.txt @@ -0,0 +1,6 @@ +setuptools>=68 +wheel>=0.41 +build>=1.0 +packaging>=23 +octoprint_setuptools>=1.7.0 + diff --git a/scripts/build_plugin.sh b/scripts/build_plugin.sh index 14acf18..7d1e90f 100755 --- a/scripts/build_plugin.sh +++ b/scripts/build_plugin.sh @@ -23,7 +23,12 @@ if [[ ! -x "$VENV_DIR/bin/python" ]]; then python3 -m venv "$VENV_DIR" fi -"$VENV_DIR/bin/pip" install -q --upgrade pip setuptools wheel build packaging octoprint_setuptools +if [[ -f "$ROOT_DIR/requirements.txt" ]]; then + "$VENV_DIR/bin/pip" install -q --upgrade pip + "$VENV_DIR/bin/pip" install -q -r "$ROOT_DIR/requirements.txt" +else + "$VENV_DIR/bin/pip" install -q --upgrade pip setuptools wheel build packaging octoprint_setuptools +fi # Optional: bump version if [[ -n "$VERSION_INPUT" ]]; then From 7bffb767494993767d16235ec13051998ab51358 Mon Sep 17 00:00:00 2001 From: "Markus F.J. Busche" Date: Sun, 21 Sep 2025 12:33:15 +0200 Subject: [PATCH 04/10] =?UTF-8?q?build(pkg):=20MANIFEST.in=20korrigiert=20?= =?UTF-8?q?(static/templates=20unter=20Paketpfad);=20Plugin=20requirements?= =?UTF-8?q?.txt=20belassen;=20Struktur=20aufger=C3=A4umt?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- octoprint_tailscale_funnel/MANIFEST.in | 5 ++--- octoprint_tailscale_funnel/requirements.txt | 1 + 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/octoprint_tailscale_funnel/MANIFEST.in b/octoprint_tailscale_funnel/MANIFEST.in index 5122ed1..e699ade 100644 --- a/octoprint_tailscale_funnel/MANIFEST.in +++ b/octoprint_tailscale_funnel/MANIFEST.in @@ -1,7 +1,6 @@ include README.md include LICENSE -include requirements.txt include setup.py -recursive-include static * -recursive-include templates * +recursive-include octoprint_tailscale_funnel/static * +recursive-include octoprint_tailscale_funnel/templates * recursive-include tests * \ No newline at end of file diff --git a/octoprint_tailscale_funnel/requirements.txt b/octoprint_tailscale_funnel/requirements.txt index e90264b..eaf6289 100644 --- a/octoprint_tailscale_funnel/requirements.txt +++ b/octoprint_tailscale_funnel/requirements.txt @@ -1 +1,2 @@ +# Runtime dependency for installation via OctoPrint's Plugin Manager OctoPrint>=1.3.0 \ No newline at end of file From 5e448e804112b5ad4f3579e2f0bbadd321e1ffbe Mon Sep 17 00:00:00 2001 From: "Markus F.J. Busche" Date: Sun, 21 Sep 2025 12:40:37 +0200 Subject: [PATCH 05/10] Navbar: Dropdown korrekt positionieren (li.dropdown) --- .../templates/tailscale_funnel_navbar.jinja2 | 2 +- requirements.txt | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/octoprint_tailscale_funnel/octoprint_tailscale_funnel/templates/tailscale_funnel_navbar.jinja2 b/octoprint_tailscale_funnel/octoprint_tailscale_funnel/templates/tailscale_funnel_navbar.jinja2 index 1ca66a7..373daa4 100644 --- a/octoprint_tailscale_funnel/octoprint_tailscale_funnel/templates/tailscale_funnel_navbar.jinja2 +++ b/octoprint_tailscale_funnel/octoprint_tailscale_funnel/templates/tailscale_funnel_navbar.jinja2 @@ -1,4 +1,4 @@ - From 13dd1dbd44661b93343e5d7ea74f1db4d8a7f68d Mon Sep 17 00:00:00 2001 From: "Markus F.J. Busche" Date: Sun, 21 Sep 2025 13:03:49 +0200 Subject: [PATCH 07/10] Navbar step3: Toggle Enable/Disable im Dropdown mit einfachem Confirm und Auto-Refresh --- .../static/js/tailscale_funnel_navbar.js | 51 +++++++++++++++++++ .../templates/tailscale_funnel_navbar.jinja2 | 1 + 2 files changed, 52 insertions(+) diff --git a/octoprint_tailscale_funnel/octoprint_tailscale_funnel/static/js/tailscale_funnel_navbar.js b/octoprint_tailscale_funnel/octoprint_tailscale_funnel/static/js/tailscale_funnel_navbar.js index 37f3efd..8d444a0 100644 --- a/octoprint_tailscale_funnel/octoprint_tailscale_funnel/static/js/tailscale_funnel_navbar.js +++ b/octoprint_tailscale_funnel/octoprint_tailscale_funnel/static/js/tailscale_funnel_navbar.js @@ -1,8 +1,11 @@ $(function() { + var lastEnabled = null; + function refreshNavbarStatus() { var $status = $("#tsf_nav_status"); var $openLi = $("#tsf_nav_open_li"); var $open = $("#tsf_nav_open"); + var $toggleText = $("#tsf_nav_toggle_text"); if ($status.length === 0) return; $status.text("Checking..."); $.ajax({ @@ -14,6 +17,8 @@ $(function() { var enabled = !!(resp.data && resp.data.funnel_enabled); var url = resp.data && resp.data.public_url ? resp.data.public_url : ""; $status.text(enabled ? "Enabled" : "Disabled"); + $toggleText.text(enabled ? "Disable" : "Enable"); + lastEnabled = enabled; if (enabled && url) { $open.attr("href", url); $openLi.removeClass("hidden"); @@ -23,11 +28,13 @@ $(function() { } } else { $status.text("Error"); + $toggleText.text("Enable"); $openLi.addClass("hidden"); } }, error: function() { $status.text("Error"); + $toggleText.text("Enable"); $openLi.addClass("hidden"); } }); @@ -39,5 +46,49 @@ $(function() { e.preventDefault(); refreshNavbarStatus(); }); + + $(document).on('click', '#tsf_nav_toggle', function(e) { + e.preventDefault(); + var enable = !(lastEnabled === true); + // Optional simpler confirm: nur beim Aktivieren + if (enable) { + var c = window.confirm("Enabling Funnel will make your OctoPrint instance accessible from the public internet. Continue?"); + if (!c) return; + } + var action = enable ? 'enable' : 'disable'; + var $status = $("#tsf_nav_status"); + var $toggleText = $("#tsf_nav_toggle_text"); + $status.text(enable ? 'Enabling...' : 'Disabling...'); + $.ajax({ + url: PLUGIN_BASEURL + 'tailscale_funnel/' + action, + type: 'POST', + dataType: 'json', + success: function(resp) { + if (resp && resp.status === 'success') { + if (enable) { + $status.text('Enabled'); + $toggleText.text('Disable'); + var url = resp.data && resp.data.public_url ? resp.data.public_url : ''; + if (url) { + $("#tsf_nav_open").attr('href', url); + $("#tsf_nav_open_li").removeClass('hidden'); + } + lastEnabled = true; + } else { + $status.text('Disabled'); + $toggleText.text('Enable'); + $("#tsf_nav_open").attr('href', '#'); + $("#tsf_nav_open_li").addClass('hidden'); + lastEnabled = false; + } + } else { + $status.text('Error'); + } + }, + error: function() { + $status.text('Error'); + } + }); + }); }); diff --git a/octoprint_tailscale_funnel/octoprint_tailscale_funnel/templates/tailscale_funnel_navbar.jinja2 b/octoprint_tailscale_funnel/octoprint_tailscale_funnel/templates/tailscale_funnel_navbar.jinja2 index 28a49e9..2ddbcca 100644 --- a/octoprint_tailscale_funnel/octoprint_tailscale_funnel/templates/tailscale_funnel_navbar.jinja2 +++ b/octoprint_tailscale_funnel/octoprint_tailscale_funnel/templates/tailscale_funnel_navbar.jinja2 @@ -6,6 +6,7 @@ From f225acc7526369dc645fca163e7f1876ce89de72 Mon Sep 17 00:00:00 2001 From: "Markus F.J. Busche" Date: Sun, 21 Sep 2025 13:09:14 +0200 Subject: [PATCH 08/10] Navbar: sofortiger Status-Refresh nach Toggle (UX-Fix) --- .../static/js/tailscale_funnel_navbar.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/octoprint_tailscale_funnel/octoprint_tailscale_funnel/static/js/tailscale_funnel_navbar.js b/octoprint_tailscale_funnel/octoprint_tailscale_funnel/static/js/tailscale_funnel_navbar.js index 8d444a0..685e520 100644 --- a/octoprint_tailscale_funnel/octoprint_tailscale_funnel/static/js/tailscale_funnel_navbar.js +++ b/octoprint_tailscale_funnel/octoprint_tailscale_funnel/static/js/tailscale_funnel_navbar.js @@ -81,6 +81,8 @@ $(function() { $("#tsf_nav_open_li").addClass('hidden'); lastEnabled = false; } + // Finaler Abgleich mit Backendstatus + setTimeout(refreshNavbarStatus, 250); } else { $status.text('Error'); } From 73c5da01f9312139d90a8c95d20139d87b9cf791 Mon Sep 17 00:00:00 2001 From: "Markus F.J. Busche" Date: Sun, 21 Sep 2025 13:14:55 +0200 Subject: [PATCH 09/10] Navbar: Farbkennung am Button (tsf-enabled/tsf-disabled) mit Live-Umschalten --- .../static/css/tailscale_funnel.css | 11 +++++++++++ .../static/js/tailscale_funnel_navbar.js | 9 +++++++++ 2 files changed, 20 insertions(+) diff --git a/octoprint_tailscale_funnel/octoprint_tailscale_funnel/static/css/tailscale_funnel.css b/octoprint_tailscale_funnel/octoprint_tailscale_funnel/static/css/tailscale_funnel.css index 0a42fe9..dc05e1e 100644 --- a/octoprint_tailscale_funnel/octoprint_tailscale_funnel/static/css/tailscale_funnel.css +++ b/octoprint_tailscale_funnel/octoprint_tailscale_funnel/static/css/tailscale_funnel.css @@ -38,4 +38,15 @@ background-color: #fcf8e3; border-color: #faebcc; color: #8a6d3b; +} + +/* Navbar Button Farbkennung */ +#navbar_plugin_tailscale_funnel > a.tsf-enabled { + background-color: #5cb85c; + color: #fff; +} + +#navbar_plugin_tailscale_funnel > a.tsf-disabled { + background-color: #777; + color: #fff; } \ No newline at end of file diff --git a/octoprint_tailscale_funnel/octoprint_tailscale_funnel/static/js/tailscale_funnel_navbar.js b/octoprint_tailscale_funnel/octoprint_tailscale_funnel/static/js/tailscale_funnel_navbar.js index 685e520..0d72706 100644 --- a/octoprint_tailscale_funnel/octoprint_tailscale_funnel/static/js/tailscale_funnel_navbar.js +++ b/octoprint_tailscale_funnel/octoprint_tailscale_funnel/static/js/tailscale_funnel_navbar.js @@ -6,6 +6,7 @@ $(function() { var $openLi = $("#tsf_nav_open_li"); var $open = $("#tsf_nav_open"); var $toggleText = $("#tsf_nav_toggle_text"); + var $btn = $("#navbar_plugin_tailscale_funnel > a"); if ($status.length === 0) return; $status.text("Checking..."); $.ajax({ @@ -18,6 +19,7 @@ $(function() { var url = resp.data && resp.data.public_url ? resp.data.public_url : ""; $status.text(enabled ? "Enabled" : "Disabled"); $toggleText.text(enabled ? "Disable" : "Enable"); + $btn.toggleClass('tsf-enabled', enabled).toggleClass('tsf-disabled', !enabled); lastEnabled = enabled; if (enabled && url) { $open.attr("href", url); @@ -29,12 +31,14 @@ $(function() { } else { $status.text("Error"); $toggleText.text("Enable"); + $btn.removeClass('tsf-enabled tsf-disabled'); $openLi.addClass("hidden"); } }, error: function() { $status.text("Error"); $toggleText.text("Enable"); + $btn.removeClass('tsf-enabled tsf-disabled'); $openLi.addClass("hidden"); } }); @@ -58,6 +62,7 @@ $(function() { var action = enable ? 'enable' : 'disable'; var $status = $("#tsf_nav_status"); var $toggleText = $("#tsf_nav_toggle_text"); + var $btn = $("#navbar_plugin_tailscale_funnel > a"); $status.text(enable ? 'Enabling...' : 'Disabling...'); $.ajax({ url: PLUGIN_BASEURL + 'tailscale_funnel/' + action, @@ -68,6 +73,7 @@ $(function() { if (enable) { $status.text('Enabled'); $toggleText.text('Disable'); + $btn.addClass('tsf-enabled').removeClass('tsf-disabled'); var url = resp.data && resp.data.public_url ? resp.data.public_url : ''; if (url) { $("#tsf_nav_open").attr('href', url); @@ -77,6 +83,7 @@ $(function() { } else { $status.text('Disabled'); $toggleText.text('Enable'); + $btn.addClass('tsf-disabled').removeClass('tsf-enabled'); $("#tsf_nav_open").attr('href', '#'); $("#tsf_nav_open_li").addClass('hidden'); lastEnabled = false; @@ -85,10 +92,12 @@ $(function() { setTimeout(refreshNavbarStatus, 250); } else { $status.text('Error'); + $btn.removeClass('tsf-enabled tsf-disabled'); } }, error: function() { $status.text('Error'); + $btn.removeClass('tsf-enabled tsf-disabled'); } }); }); From a68b7c64639d65d7d82f6f6c24d8b0975f8a5e74 Mon Sep 17 00:00:00 2001 From: "Markus F.J. Busche" Date: Sun, 21 Sep 2025 13:20:26 +0200 Subject: [PATCH 10/10] chore(release): bump version to 0.1.6.3 (setup.py, update.json) --- octoprint_tailscale_funnel/setup.py | 2 +- octoprint_tailscale_funnel/update.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/octoprint_tailscale_funnel/setup.py b/octoprint_tailscale_funnel/setup.py index 0ef0b88..81506c7 100644 --- a/octoprint_tailscale_funnel/setup.py +++ b/octoprint_tailscale_funnel/setup.py @@ -14,7 +14,7 @@ plugin_package = "octoprint_tailscale_funnel" plugin_name = "OctoPrint-Tailscale-Funnel" # The plugin's version. Can be overwritten within OctoPrint's internal data via __plugin_version__ in the plugin module -plugin_version = "0.1.6.2" +plugin_version = "0.1.6.3" # The plugin's description. Can be overwritten within OctoPrint's internal data via __plugin_description__ in the plugin # module diff --git a/octoprint_tailscale_funnel/update.json b/octoprint_tailscale_funnel/update.json index 64643f2..5cfab55 100644 --- a/octoprint_tailscale_funnel/update.json +++ b/octoprint_tailscale_funnel/update.json @@ -1,4 +1,4 @@ { - "version": "0.1.6.2" + "version": "0.1.6.3" }