build: sources for v0.9.24
This commit is contained in:
@@ -1,5 +1,18 @@
|
||||
# Changelog
|
||||
|
||||
## [0.9.24] – 2026-06-16
|
||||
|
||||
### Neu
|
||||
- **Objekte überspringen in jedem Druck-Flow (Issue #57).** Der „Objekte
|
||||
überspringen"-Bereich im Slot-Mapper erschien bisher nur beim Druck aus dem
|
||||
Browser-Tab. Er ist jetzt in allen Flows verfügbar (inkl. Upload / Print-Leiste),
|
||||
standardmäßig eingeklappt hinter einem `✂ Objekte überspringen (N)`-Header, damit
|
||||
der Dialog kompakt bleibt — Klick klappt Vorschau + Checkliste auf.
|
||||
- **Slot-Mapper zeigt konkreten Profilnamen (Issue #57).** Jeder Slot zeigt nun das
|
||||
zugeordnete Filament-Profil (z.B. „PolyTerra PLA — Polymaker") in den Dropdown-
|
||||
Optionen und als Hover-Tooltip am Slot-Marker, statt nur des generischen Typs.
|
||||
Fällt auf den generischen Typ zurück, wenn kein Profil gemappt ist.
|
||||
|
||||
## [0.9.23] – 2026-06-16
|
||||
|
||||
### Neu
|
||||
|
||||
13
CHANGELOG.md
13
CHANGELOG.md
@@ -1,5 +1,18 @@
|
||||
# Changelog
|
||||
|
||||
## [0.9.24] – 2026-06-16
|
||||
|
||||
### New
|
||||
- **Skip Objects available in every print flow (issue #57).** The "Skip objects"
|
||||
panel in the Slot Mapper used to appear only when printing from the Browser tab.
|
||||
It now shows in all flows (upload / print bar included), collapsed by default
|
||||
behind a `✂ Skip objects (N)` header to keep the dialog compact, expanding on
|
||||
click with the object preview and checklist.
|
||||
- **Slot Mapper shows the specific profile name (issue #57).** Each slot now
|
||||
displays its mapped filament profile (e.g. "PolyTerra PLA — Polymaker") in the
|
||||
dropdown options and as a hover tooltip on the slot marker, instead of just the
|
||||
generic type. Falls back to the generic type when no profile is mapped.
|
||||
|
||||
## [0.9.23] – 2026-06-16
|
||||
|
||||
### New
|
||||
|
||||
@@ -259,7 +259,7 @@ function applyLang(){
|
||||
setText('skip-title',T.skip_title);
|
||||
setText('skip-hint',T.skip_hint);
|
||||
setText('d-btn-skip-label',T.skip_btn_label);
|
||||
setText('fd-objects-hint',T.fd_objects_hint);
|
||||
setText('fd-objects-toggle-lbl',T.fd_objects_toggle);
|
||||
setText('apd-lbl-ip',T.apd_lbl_ip);
|
||||
setText('apd-lbl-name',T.apd_lbl_name);
|
||||
var apn=document.getElementById('apd-name');if(apn)apn.setAttribute('placeholder',T.apd_placeholder_name);
|
||||
@@ -2329,6 +2329,18 @@ function _normalizeMaterialKey(material){
|
||||
function _materialsCompatible(a,b){
|
||||
return _normalizeMaterialKey(a)===_normalizeMaterialKey(b);
|
||||
}
|
||||
// Issue #57 Punkt 4: konkreter Profilname (User-Override) statt generischem Typ.
|
||||
// Fällt auf den Material-Typ zurück wenn kein Profil gemappt ist.
|
||||
function _slotProfileLabel(slot){
|
||||
if(!slot)return '';
|
||||
if(slot.filament_name){
|
||||
return slot.filament_name+(slot.filament_vendor?' — '+slot.filament_vendor:'');
|
||||
}
|
||||
return slot.material||'';
|
||||
}
|
||||
function _escAttr(s){
|
||||
return String(s||'').replace(/&/g,'&').replace(/"/g,'"').replace(/</g,'<').replace(/>/g,'>');
|
||||
}
|
||||
function _updateSlotMarker(sel){
|
||||
var opt=sel.options[sel.selectedIndex];
|
||||
var color=opt&&opt.dataset.color?opt.dataset.color:'#888';
|
||||
@@ -2339,6 +2351,7 @@ function _updateSlotMarker(sel){
|
||||
marker.style.background=color;
|
||||
marker.style.color=_contrastText(color);
|
||||
marker.textContent=(slotIdx+1);
|
||||
marker.title=(opt&&opt.dataset.profile)?opt.dataset.profile:'';
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2353,12 +2366,19 @@ function openFilamentDialog(slots){
|
||||
// Auto-Leveling-Checkbox mit globalem Default vorbelegen
|
||||
var fdAl=document.getElementById('fd-auto-leveling');
|
||||
if(fdAl) fdAl.checked=(S.auto_leveling===undefined?true:!!S.auto_leveling);
|
||||
// Objekt-Liste laden (nur Store-Modus: per File-ID; Banner-Modus hat keine ID)
|
||||
// Objekt-Liste laden — sobald eine File-ID auflösbar ist (Issue #57 Punkt 3:
|
||||
// Skip-Parität auch im Banner-/Upload-Modus, nicht nur im Store-Modus).
|
||||
// startReadyFileWithSlots() setzt _storeFileId auch im Banner-Modus per
|
||||
// filename→fileObj-Lookup, daher reicht hier die _storeFileId-Prüfung.
|
||||
_printObjects=[];
|
||||
_printObjectsSvg='';
|
||||
var objSection=document.getElementById('fd-objects-section');
|
||||
var objBody=document.getElementById('fd-objects-body');
|
||||
var objArrow=document.getElementById('fd-objects-arrow');
|
||||
if(objSection)objSection.style.display='none';
|
||||
if(_filamentDialogMode==='store'&&_storeFileId){
|
||||
if(objBody)objBody.style.display='none'; // immer eingeklappt starten
|
||||
if(objArrow)objArrow.style.transform='';
|
||||
if(_storeFileId){
|
||||
fetch(_apiUrl('/kx/files/'+encodeURIComponent(_storeFileId)+'/objects'))
|
||||
.then(function(r){return r.json()})
|
||||
.then(function(d){
|
||||
@@ -2367,6 +2387,8 @@ function openFilamentDialog(slots){
|
||||
if(names.length>=2){
|
||||
_printObjects=names.map(function(n){return {name:n,skip:false};});
|
||||
renderObjectChecklist(); renderObjectSvg();
|
||||
var cnt=document.getElementById('fd-objects-count');
|
||||
if(cnt)cnt.textContent='('+names.length+')';
|
||||
if(objSection)objSection.style.display='block';
|
||||
}
|
||||
}).catch(function(){});
|
||||
@@ -2430,8 +2452,8 @@ function openFilamentDialog(slots){
|
||||
var defaultSlot=compatible.find(function(s){return s.slot_index===defaultSlotIndex;})||null;
|
||||
var opts=compatible.map(function(s){
|
||||
var sel=(defaultSlot&&s.slot_index===defaultSlot.slot_index)?'selected':'';
|
||||
return '<option value="'+s.slot_index+'" data-color="'+s.color_hex+'" data-material="'+s.material+'" '+sel+'>'+
|
||||
'● '+T.fd_slot+' '+(s.slot_index+1)+' · '+s.material+'</option>';
|
||||
return '<option value="'+s.slot_index+'" data-color="'+s.color_hex+'" data-material="'+s.material+'" data-profile="'+_escAttr(_slotProfileLabel(s))+'" '+sel+'>'+
|
||||
'● '+T.fd_slot+' '+(s.slot_index+1)+' · '+_slotProfileLabel(s)+'</option>';
|
||||
}).join('');
|
||||
if(!compatible.length){
|
||||
opts='<option value="-1" data-color="#888888" data-material="" selected>⚠ '+T.fd_no_matching_material+'</option>';
|
||||
@@ -2448,7 +2470,7 @@ function openFilamentDialog(slots){
|
||||
'<span style="font-size:11px;color:var(--txt2);min-width:36px">'+gc.material+'</span>'+
|
||||
usedBadge+
|
||||
'<span style="font-size:16px;color:var(--txt2)">→</span>'+
|
||||
'<span class="fd-slot-marker" data-for-paint="'+i+'" style="display:inline-flex;align-items:center;justify-content:center;width:24px;height:24px;border-radius:5px;background:'+slotColor+';color:'+slotTxt+';font-weight:700;font-size:12px;border:1px solid var(--border);flex-shrink:0">'+(defaultSlot?defaultSlot.slot_index+1:'?')+'</span>'+
|
||||
'<span class="fd-slot-marker" data-for-paint="'+i+'" title="'+_escAttr(defaultSlot?_slotProfileLabel(defaultSlot):'')+'" style="display:inline-flex;align-items:center;justify-content:center;width:24px;height:24px;border-radius:5px;background:'+slotColor+';color:'+slotTxt+';font-weight:700;font-size:12px;border:1px solid var(--border);flex-shrink:0">'+(defaultSlot?defaultSlot.slot_index+1:'?')+'</span>'+
|
||||
'<select data-paint="'+i+'" data-paint-color="'+gc.color_hex+'" data-is-used="'+(isUsed?'1':'0')+'" data-has-compatible="'+(compatible.length?'1':'0')+'" '+(compatible.length?'':'disabled')+' onchange="_updateSlotMarker(this)" style="flex:1;min-width:0;padding:4px 6px;border-radius:6px;border:1px solid var(--border);background:var(--raised);color:var(--txt);font-size:12px">'+
|
||||
opts+'</select>'+
|
||||
'</div>';
|
||||
@@ -2549,6 +2571,15 @@ function _toggleObjectSkip(idx,val){
|
||||
if(_printObjects[idx])_printObjects[idx].skip=!!val;
|
||||
renderObjectSvg();
|
||||
}
|
||||
// Issue #57 Punkt 3: Skip-Objekte-Bereich ein-/ausklappen
|
||||
function toggleFdObjects(){
|
||||
var body=document.getElementById('fd-objects-body');
|
||||
var arrow=document.getElementById('fd-objects-arrow');
|
||||
if(!body)return;
|
||||
var open=body.style.display!=='none';
|
||||
body.style.display=open?'none':'block';
|
||||
if(arrow)arrow.style.transform=open?'':'rotate(90deg)';
|
||||
}
|
||||
function renderObjectSvg(){
|
||||
var box=document.getElementById('fd-objects-svg');
|
||||
if(!box)return;
|
||||
|
||||
@@ -626,9 +626,16 @@
|
||||
<p id="fd-slots-hint" style="font-size:12px;color:var(--txt2);margin-bottom:10px">GCode-Kanal → AMS-Slot zuweisen:</p>
|
||||
<div id="fd-slots" style="display:flex;flex-direction:column;gap:8px;margin-bottom:16px"></div>
|
||||
<div id="fd-objects-section" style="display:none;margin-bottom:16px">
|
||||
<p id="fd-objects-hint" style="font-size:12px;color:var(--txt2);margin-bottom:8px">Objekte überspringen (optional):</p>
|
||||
<div id="fd-objects-svg" style="display:none;background:var(--raised);border:1px solid var(--border);border-radius:8px;padding:6px;margin-bottom:8px;text-align:center"></div>
|
||||
<div id="fd-objects" style="display:flex;flex-direction:column;gap:6px;max-height:140px;overflow-y:auto"></div>
|
||||
<button type="button" id="fd-objects-toggle" onclick="toggleFdObjects()"
|
||||
style="display:flex;align-items:center;gap:8px;width:100%;padding:8px 10px;background:var(--raised);border:1px solid var(--border);border-radius:8px;color:var(--txt);cursor:pointer;font-size:12px;text-align:left">
|
||||
<span id="fd-objects-arrow" style="font-size:10px;transition:transform .15s">▶</span>
|
||||
<span>✂ <span id="fd-objects-toggle-lbl">Objekte überspringen</span></span>
|
||||
<span id="fd-objects-count" style="margin-left:auto;color:var(--txt2);font-weight:600"></span>
|
||||
</button>
|
||||
<div id="fd-objects-body" style="display:none;margin-top:8px">
|
||||
<div id="fd-objects-svg" style="display:none;background:var(--raised);border:1px solid var(--border);border-radius:8px;padding:6px;margin-bottom:8px;text-align:center"></div>
|
||||
<div id="fd-objects" style="display:flex;flex-direction:column;gap:6px;max-height:140px;overflow-y:auto"></div>
|
||||
</div>
|
||||
</div>
|
||||
<div style="margin-bottom:14px;padding:10px 12px;background:var(--raised);border-radius:8px;border:1px solid var(--border)">
|
||||
<div style="font-size:11px;font-weight:600;color:var(--txt2);margin-bottom:8px;text-transform:uppercase;letter-spacing:.05em" id="fd-options-title">Druckoptionen</div>
|
||||
|
||||
@@ -206,6 +206,7 @@
|
||||
"skip_sending": "Sende …",
|
||||
"skip_success": "Objekte werden übersprungen.",
|
||||
"fd_objects_hint": "Objekte überspringen (optional):",
|
||||
"fd_objects_toggle": "Objekte überspringen",
|
||||
"fd_slots_hint": "GCode-Kanal → AMS-Slot zuweisen:",
|
||||
"fd_cancel": "Abbrechen",
|
||||
"fd_print": "▶ Drucken",
|
||||
|
||||
@@ -234,6 +234,7 @@
|
||||
"skip_sending": "Sending …",
|
||||
"skip_success": "Objects will be skipped.",
|
||||
"fd_objects_hint": "Skip objects (optional):",
|
||||
"fd_objects_toggle": "Skip objects",
|
||||
"fd_slots_hint": "Assign GCode channel to AMS slot:",
|
||||
"fd_cancel": "Cancel",
|
||||
"fd_print": "▶ Print",
|
||||
|
||||
@@ -206,6 +206,7 @@
|
||||
"skip_sending": "Enviando …",
|
||||
"skip_success": "Se omitirán los objetos.",
|
||||
"fd_objects_hint": "Omitir objetos (opcional):",
|
||||
"fd_objects_toggle": "Omitir objetos",
|
||||
"fd_slots_hint": "Asignar canal GCode a la ranura AMS:",
|
||||
"fd_cancel": "Cancelar",
|
||||
"fd_print": "▶ Imprimir",
|
||||
|
||||
@@ -206,6 +206,7 @@
|
||||
"skip_sending": "Envoi …",
|
||||
"skip_success": "Les objets seront ignorés.",
|
||||
"fd_objects_hint": "Ignorer des objets (optionnel) :",
|
||||
"fd_objects_toggle": "Ignorer des objets",
|
||||
"fd_slots_hint": "Associer le canal GCode au slot AMS :",
|
||||
"fd_cancel": "Annuler",
|
||||
"fd_print": "▶ Imprimer",
|
||||
|
||||
@@ -206,6 +206,7 @@
|
||||
"skip_sending": "发送中 …",
|
||||
"skip_success": "对象将被跳过。",
|
||||
"fd_objects_hint": "跳过对象 (可选):",
|
||||
"fd_objects_toggle": "跳过对象",
|
||||
"fd_slots_hint": "将 GCode 通道分配到 AMS 槽位:",
|
||||
"fd_cancel": "取消",
|
||||
"fd_print": "▶ 打印",
|
||||
|
||||
Reference in New Issue
Block a user