Compare commits
1 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 7815c66a82 |
@@ -1,5 +1,23 @@
|
|||||||
# Changelog
|
# Changelog
|
||||||
|
|
||||||
|
## [0.9.15] – 2026-05-21
|
||||||
|
|
||||||
|
### Fixes (Issue #29)
|
||||||
|
- **UI im OrcaSlicer-Device-Tab kaputt:** OrcaSlicers eingebetteter Webview lädt
|
||||||
|
nur das nackte HTML und ignoriert externe `<script>`/`<link>`-Tags — nach der
|
||||||
|
v0.9.14-Theme-Auslagerung funktionierte dort kein Button mehr. Die Bridge
|
||||||
|
bettet CSS + JS jetzt inline in die Seite ein — funktioniert in Browser UND
|
||||||
|
OrcaSlicer-Webview.
|
||||||
|
- **Dropdowns unlesbar (weiß auf weiß) im OrcaSlicer-Webview:** `color-scheme` +
|
||||||
|
explizite `select`/`option`-Farben ergänzt, damit die nativen Dropdowns in
|
||||||
|
Hell- und Dunkel-Theme korrekt dargestellt werden.
|
||||||
|
- **„Select slots"-Button tat direkt nach Upload nichts:** eine fehlende
|
||||||
|
Variablen-Deklaration (`storeFiles`) warf einen `ReferenceError`, wenn vor dem
|
||||||
|
Laden des Browser-Tabs geklickt wurde. Behoben.
|
||||||
|
- **Upload-Banner kam nach abgeschlossenem Druck zurück:** der „file ready"-Status
|
||||||
|
wurde nur bei Stop/Abbruch geleert, nicht bei `finished`. Jetzt auch nach
|
||||||
|
erfolgreichem Druckende geleert.
|
||||||
|
|
||||||
## [0.9.14] – 2026-05-21
|
## [0.9.14] – 2026-05-21
|
||||||
|
|
||||||
### Neu
|
### Neu
|
||||||
|
|||||||
17
CHANGELOG.md
17
CHANGELOG.md
@@ -1,5 +1,22 @@
|
|||||||
# Changelog
|
# Changelog
|
||||||
|
|
||||||
|
## [0.9.15] – 2026-05-21
|
||||||
|
|
||||||
|
### Fixes (Issue #29)
|
||||||
|
- **UI in the OrcaSlicer device tab was broken:** OrcaSlicer's embedded webview
|
||||||
|
only loads the bare HTML and ignores external `<script>`/`<link>` tags, so after
|
||||||
|
the v0.9.14 theme split none of the buttons worked in the device tab. The
|
||||||
|
bridge now inlines CSS + JS into the page — works in both the browser and the
|
||||||
|
OrcaSlicer webview.
|
||||||
|
- **Dropdowns unreadable (white-on-white) in the OrcaSlicer webview:** added
|
||||||
|
`color-scheme` + explicit `select`/`option` colors so the native dropdowns
|
||||||
|
render correctly in dark and light theme.
|
||||||
|
- **"Select slots" button did nothing right after an upload:** a missing variable
|
||||||
|
declaration (`storeFiles`) threw a `ReferenceError` when clicked before the
|
||||||
|
Browser tab had loaded. Fixed.
|
||||||
|
- **Upload banner came back after a finished print:** the "file ready" state was
|
||||||
|
only cleared on stop/cancel, not on `finished`. Now cleared on completion too.
|
||||||
|
|
||||||
## [0.9.14] – 2026-05-21
|
## [0.9.14] – 2026-05-21
|
||||||
|
|
||||||
### New
|
### New
|
||||||
|
|||||||
@@ -687,6 +687,11 @@ class KobraXBridge:
|
|||||||
log.info(f"Job abgebrochen: {self._current_job_id}")
|
log.info(f"Job abgebrochen: {self._current_job_id}")
|
||||||
self._current_job_id = ""
|
self._current_job_id = ""
|
||||||
|
|
||||||
|
# Nach Druckende das Upload-Banner verschwinden lassen (Issue #29): der
|
||||||
|
# Drucker meldet "finished" nach erfolgreichem Druck — file_ready wurde
|
||||||
|
# bisher nur bei stoped/canceled geleert, dadurch kam das Banner zurück.
|
||||||
|
if kobra_state == "finished":
|
||||||
|
self._state["file_ready"] = ""
|
||||||
if kobra_state in ("stoped", "canceled"):
|
if kobra_state in ("stoped", "canceled"):
|
||||||
self._state["progress"] = 0.0
|
self._state["progress"] = 0.0
|
||||||
self._state["filename"] = ""
|
self._state["filename"] = ""
|
||||||
@@ -728,6 +733,10 @@ class KobraXBridge:
|
|||||||
if kobra_state:
|
if kobra_state:
|
||||||
self._state["print_state"] = KOBRA_TO_KLIPPER_STATE.get(kobra_state, "standby")
|
self._state["print_state"] = KOBRA_TO_KLIPPER_STATE.get(kobra_state, "standby")
|
||||||
self._state["kobra_state"] = kobra_state
|
self._state["kobra_state"] = kobra_state
|
||||||
|
# Upload-Banner nach Druckende ausblenden (Issue #29) – der State kommt
|
||||||
|
# je nach Drucker auch über info/report (project.state), nicht nur print/report.
|
||||||
|
if kobra_state in ("finished", "stoped", "canceled"):
|
||||||
|
self._state["file_ready"] = ""
|
||||||
if project:
|
if project:
|
||||||
if "filename" in project:
|
if "filename" in project:
|
||||||
self._state["filename"] = project["filename"]
|
self._state["filename"] = project["filename"]
|
||||||
@@ -2049,9 +2058,30 @@ class KobraXBridge:
|
|||||||
status=500,
|
status=500,
|
||||||
content_type="text/html; charset=utf-8",
|
content_type="text/html; charset=utf-8",
|
||||||
)
|
)
|
||||||
html = tpl.replace("__UI_ASSETS_VER__", self._ui_asset_cache_buster())
|
page = tpl.replace("__UI_ASSETS_VER__", self._ui_asset_cache_buster())
|
||||||
|
|
||||||
return web.Response(text=html, content_type="text/html",
|
# CSS + JS INLINE einbetten statt nur zu verlinken. OrcaSlicers
|
||||||
|
# eingebetteter Device-Tab-Webview lädt externe <link>/<script src>
|
||||||
|
# NICHT (nur das nackte HTML) → ohne Inlining funktioniert dort kein
|
||||||
|
# einziger Button (Issue #29). Im normalen Browser ist es ebenso korrekt.
|
||||||
|
base = os.path.join(_WEB_BASE, "web", "themes", self._ui_theme)
|
||||||
|
try:
|
||||||
|
css = pathlib.Path(os.path.join(base, "style.css")).read_text(encoding="utf-8")
|
||||||
|
page = page.replace(
|
||||||
|
'<link rel="stylesheet" href="/kx/ui/style.css">',
|
||||||
|
"<style>\n" + css + "\n</style>")
|
||||||
|
except OSError:
|
||||||
|
pass
|
||||||
|
try:
|
||||||
|
js = pathlib.Path(os.path.join(base, "app.js")).read_text(encoding="utf-8")
|
||||||
|
js = js.replace("'__VERSION__'", f"'{self._read_version()}'")
|
||||||
|
page = page.replace(
|
||||||
|
'<script src="/kx/ui/app.js"></script>',
|
||||||
|
"<script>\n" + js + "\n</script>")
|
||||||
|
except OSError:
|
||||||
|
pass
|
||||||
|
|
||||||
|
return web.Response(text=page, content_type="text/html",
|
||||||
headers={"Cache-Control": "no-store, no-cache, must-revalidate"})
|
headers={"Cache-Control": "no-store, no-cache, must-revalidate"})
|
||||||
|
|
||||||
async def handle_api_light(self, request):
|
async def handle_api_light(self, request):
|
||||||
|
|||||||
@@ -1577,6 +1577,10 @@ function formatDur(sec){
|
|||||||
var _storeFileId=null;
|
var _storeFileId=null;
|
||||||
var _storeFilename=null;
|
var _storeFilename=null;
|
||||||
var _filamentDialogMode='store'; // 'store' oder 'banner'
|
var _filamentDialogMode='store'; // 'store' oder 'banner'
|
||||||
|
// GCode-Store-Dateiliste. MUSS deklariert sein – sonst ReferenceError, wenn
|
||||||
|
// "Slots wählen" im Banner geklickt wird, bevor der Browser-Tab je geladen
|
||||||
|
// wurde (Issue #29 / Theme-Auslagerung PR #27).
|
||||||
|
var storeFiles=[];
|
||||||
|
|
||||||
var _gcodeFilaments=[];
|
var _gcodeFilaments=[];
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
:root{
|
:root{
|
||||||
|
color-scheme:dark; /* native Form-Controls (select) im Webview dunkel rendern */
|
||||||
--bg:#1a1a1f;--card:#24242c;--raised:#2e2e3a;--border:#3a3a4a;
|
--bg:#1a1a1f;--card:#24242c;--raised:#2e2e3a;--border:#3a3a4a;
|
||||||
--txt:#f0f0f5;--txt2:#8888aa;--accent:#00c8ff;--accent2:#ff6b35;
|
--txt:#f0f0f5;--txt2:#8888aa;--accent:#00c8ff;--accent2:#ff6b35;
|
||||||
--ok:#4cde80;--err:#ff4d6d;--warn:#ffb020;
|
--ok:#4cde80;--err:#ff4d6d;--warn:#ffb020;
|
||||||
@@ -6,12 +7,17 @@
|
|||||||
--mono:"JetBrains Mono","Fira Code",monospace;
|
--mono:"JetBrains Mono","Fira Code",monospace;
|
||||||
}
|
}
|
||||||
[data-theme=light]{
|
[data-theme=light]{
|
||||||
|
color-scheme:light;
|
||||||
--bg:#f0f0f5;--card:#fff;--raised:#e8e8f0;--border:#d0d0e0;
|
--bg:#f0f0f5;--card:#fff;--raised:#e8e8f0;--border:#d0d0e0;
|
||||||
--txt:#1a1a2e;--txt2:#666680;
|
--txt:#1a1a2e;--txt2:#666680;
|
||||||
}
|
}
|
||||||
*{box-sizing:border-box;margin:0;padding:0}
|
*{box-sizing:border-box;margin:0;padding:0}
|
||||||
body{background:var(--bg);color:var(--txt);font-family:var(--font);font-size:14px;min-height:100vh;display:flex;flex-direction:column}
|
body{background:var(--bg);color:var(--txt);font-family:var(--font);font-size:14px;min-height:100vh;display:flex;flex-direction:column}
|
||||||
a{color:var(--accent);text-decoration:none}
|
a{color:var(--accent);text-decoration:none}
|
||||||
|
/* select/option-Farben explizit setzen — OrcaSlicers Device-Tab-Webview erbt
|
||||||
|
sie sonst nicht und rendert weiße Schrift auf weißem Grund (Issue #29). */
|
||||||
|
select{background:var(--raised)!important;color:var(--txt)!important}
|
||||||
|
select option{background:var(--card)!important;color:var(--txt)!important}
|
||||||
|
|
||||||
/* ── HEADER ── */
|
/* ── HEADER ── */
|
||||||
header{background:var(--card);border-bottom:1px solid var(--border);
|
header{background:var(--card);border-bottom:1px solid var(--border);
|
||||||
|
|||||||
Reference in New Issue
Block a user