v0.1.30 — Policy-Bulk-Import gehaertet, macOS-Apps, Gruppen-Suche & Direkt-Zuweisung
Build & Release MSI / build-msi (push) Canceled after 0s

- Bulk-Import von Policies (Batches + Fortschritt, Fehler-Isolierung)
- Export/Import-Treue via Raw-JSON (-OutputType Json), null-Collections-Strip,
  Settings-Catalog-Reparatur + Korruptions-Erkennung, Git-Resolver
- macOS-Apps in Liste/Suche + Plattform-Filter
- "Gruppe"-Tab durchsucht alle Gruppen (Live-Suche) statt nur Praefix-Gruppen
- Bestehende Gruppe(n) direkt an Apps zuweisen inkl. Mehrfachauswahl
- Fix: Add-GraphAppAssignment merged bestehende Zuweisungen (/assign ersetzt sonst
  die komplette Liste) -> kein Ueberschreiben mehr, ein Request fuer alle Ziele

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
2026-09-03 09:03:22 +02:00
co-authored by Claude Opus 4.8
parent 5c60eacc12
commit 446c53f409
9 changed files with 642 additions and 100 deletions
+29 -4
View File
@@ -126,7 +126,7 @@
<section class="panel panel-targets">
<div class="panel-head">
<div class="panel-title">
<h2>Abteilungen &amp; Benutzer</h2>
<h2>Gruppen &amp; Benutzer</h2>
<span id="targetCount" class="count-badge">0</span>
</div>
<button id="btnReloadTargets" class="icon-btn" title="Neu laden" aria-label="Neu laden">
@@ -135,7 +135,7 @@
</div>
<div class="mode-segment" role="tablist">
<button class="seg active" data-mode="dept" role="tab">Abteilung</button>
<button class="seg active" data-mode="dept" role="tab">Gruppe</button>
<button class="seg" data-mode="user" role="tab">Benutzer</button>
</div>
@@ -193,6 +193,11 @@
<option value="srcIntune">Nur Intune-Apps</option>
<!-- Vendor-Optionen werden dynamisch von rebuildVendorFilterOptions() ergaenzt -->
</select>
<select id="appPlatformFilter" class="select" title="Nach Plattform filtern">
<option value="all">Alle Plattformen</option>
<option value="windows">Windows</option>
<option value="macos">macOS</option>
</select>
<select id="appCategoryFilter" class="select" title="Nach App-Kategorie filtern">
<option value="">Alle Kategorien</option>
<!-- Kategorie-Optionen werden dynamisch von rebuildCategoryFilterOptions() befuellt -->
@@ -244,7 +249,7 @@
<div class="summary-section">
<div class="summary-section-title">Ausgewählte Empfänger</div>
<div class="summary-row sub">
<span class="muted">Abteilungsgruppen</span>
<span class="muted">Gruppen</span>
<span id="sumGroupsSel">0</span>
</div>
<div class="summary-row sub">
@@ -255,7 +260,7 @@
<div class="summary-section">
<div class="summary-section-title">Zuweisungen erhalten</div>
<div class="summary-row sub">
<span class="muted">Abteilungsgruppen</span>
<span class="muted">Gruppen</span>
<span id="sumGroupsOps">0</span>
</div>
<div class="summary-row sub">
@@ -711,6 +716,13 @@
<span class="cg-mode-desc">Neue Required-Gruppe nach Naming-Schema erstellen und zuweisen.</span>
</span>
</label>
<label class="cg-mode">
<input type="radio" name="cgMode" value="req-existing">
<span class="cg-mode-body">
<span class="cg-mode-title">Bestehende Gruppe</span>
<span class="cg-mode-desc">Eine vorhandene Entra-Gruppe als Required zuweisen.</span>
</span>
</label>
<label class="cg-mode">
<input type="radio" name="cgMode" value="req-allusers">
<span class="cg-mode-body">
@@ -739,6 +751,13 @@
<span class="cg-mode-desc">Neue Available-Gruppe nach Naming-Schema erstellen und zuweisen.</span>
</span>
</label>
<label class="cg-mode">
<input type="radio" name="cgMode" value="avail-existing">
<span class="cg-mode-body">
<span class="cg-mode-title">Bestehende Gruppe</span>
<span class="cg-mode-desc">Eine vorhandene Entra-Gruppe als Available zuweisen.</span>
</span>
</label>
<label class="cg-mode">
<input type="radio" name="cgMode" value="avail-allusers">
<span class="cg-mode-body">
@@ -762,6 +781,12 @@
<input type="text" id="cgGroupName" class="input">
<div id="cgStatus" class="form-hint"></div>
</div>
<div class="form-group" id="cgExistingGroup" hidden>
<label class="lbl" for="cgExistingSearch">Bestehende Gruppe suchen</label>
<input type="search" id="cgExistingSearch" class="input" placeholder="Gruppenname… (min. 2 Zeichen)" autocomplete="off">
<div id="cgExistingResults" class="cg-existing-results"></div>
<div id="cgExistingSelected" class="form-hint"></div>
</div>
<label class="check-chip" id="cgAssignToAppWrap">
<input type="checkbox" id="cgAssignToApp" checked>
<span>Gruppe direkt der App zuweisen</span>