GE-Enforce editor: onboarding field guidance
All checks were successful
CI / backend (push) Successful in 1m38s
CI / naming (push) Successful in 1s
CI / frontend (push) Successful in 8s

Per-method detection hint: a plain-language line explains what "already
correct" means for the selected detection method (Registry/File/FileVersion/
Hash/MarkerFile/ValueMatches/pnputil/Always), updating live as the author
picks one. Lives in entryForm.js (DETECTION_METHOD_HINTS + detectionMethodHint)
with 4 new vitest cases; the editor renders it under the dropdown.

Also: relative-path hint on Installer/Source (path under the scope payload
folder or an inline payload), an InUseCheck behavior hint, and refresh the
entryForm.js header now that the editor imports these helpers directly.

vitest 49 pass; frontend build green; naming green.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
cproudlock
2026-07-13 07:31:43 -04:00
parent 456a44104b
commit d7b777a7a0
3 changed files with 57 additions and 9 deletions

View File

@@ -334,7 +334,11 @@
<!-- payload fields per type -->
<div v-if="['MSI','EXE','CMD','BAT','INF'].includes(entryForm.Type)" class="settings-grid">
<div class="setting-row">
<label><span>Installer (relative path)</span><input v-model="entryForm.Installer" /></label>
<label>
<span>Installer (relative path)</span>
<input v-model="entryForm.Installer" />
<small class="input-hint">Path under the scope payload folder on the share, or an inline payload attached below.</small>
</label>
</div>
<div class="setting-row">
<label><span>Install args</span><input v-model="entryForm.InstallArgs" /></label>
@@ -350,7 +354,11 @@
</div>
<div v-if="entryForm.Type === 'File'" class="settings-grid">
<div class="setting-row">
<label><span>Source (relative)</span><input v-model="entryForm.Source" /></label>
<label>
<span>Source (relative)</span>
<input v-model="entryForm.Source" />
<small class="input-hint">Path under the scope payload folder on the share, or an inline payload attached below.</small>
</label>
</div>
<div class="setting-row">
<label><span>Destination (absolute)</span><input v-model="entryForm.Destination" /></label>
@@ -408,6 +416,7 @@
<option value="">(none: always installs)</option>
<option v-for="method in availableDetectionMethods" :key="method" :value="method">{{ method }}</option>
</select>
<small v-if="detectionMethodHint" class="input-hint">{{ detectionMethodHint }}</small>
<small v-if="isPreinstallScope" class="input-hint">Preinstall supports Registry/File detection only.</small>
</label>
</div>
@@ -497,6 +506,7 @@
<option value="">(none)</option>
<option v-for="behavior in INUSE_BEHAVIORS" :key="behavior" :value="behavior">{{ behavior }}</option>
</select>
<small class="input-hint">What to do when a process below is running: Defer skips this cycle, CloseAndReopen restarts it, ForceClose kills it, ScheduleForReboot defers to next reboot.</small>
</label>
</div>
<div v-if="entryForm.inuseBehavior" class="process-editor">
@@ -569,7 +579,7 @@ import {
describeEntry, availableEntryTypes as availableEntryTypesFor,
availableDetectionMethods as availableDetectionMethodsFor,
targetingGates as targetingGatesFor, targetingHint as targetingHintFor,
scopeSummary as scopeSummaryFor,
scopeSummary as scopeSummaryFor, detectionMethodHint as detectionMethodHintFor,
} from './entryForm'
const scopes = ref([])
@@ -588,6 +598,8 @@ const availableEntryTypes = computed(() =>
availableEntryTypesFor(isPreinstallScope.value, entryForm.value?.Type))
const availableDetectionMethods = computed(() =>
availableDetectionMethodsFor(isPreinstallScope.value, entryForm.value?.DetectionMethod))
const detectionMethodHint = computed(() =>
detectionMethodHintFor(entryForm.value?.DetectionMethod))
const scopeSummary = computed(() => scopeSummaryFor(detail.value))
const showAllTargeting = ref(false)
const targetingGates = computed(() => targetingGatesFor(detail.value))