diff --git a/frontend/src/views/geenforce/ManifestEditor.vue b/frontend/src/views/geenforce/ManifestEditor.vue index 1b8c72c..2837d7c 100644 --- a/frontend/src/views/geenforce/ManifestEditor.vue +++ b/frontend/src/views/geenforce/ManifestEditor.vue @@ -277,6 +277,16 @@ Preinstall runs at imaging and supports MSI/EXE only. +
+ +
@@ -566,6 +576,7 @@ const newScope = ref({ scopename: '', phase: 'runtime' }) const showEntry = ref(false) const entryForm = ref({}) +const applications = ref([]) const showVersions = ref(false) const versions = ref([]) @@ -645,7 +656,7 @@ async function deleteScope() { // -- entries -- function blankEntry() { return { Type: 'MSI', DetectionMethod: '', RegType: 'String', - inuseBehavior: '', inuseProcesses: [], + inuseBehavior: '', inuseProcesses: [], appid: null, PreEnrollment: false, KillAfterDetection: false, PCTypesStrict: false } } function openNewEntry() { @@ -682,7 +693,9 @@ function splitList(value) { } function buildEntryPayload() { const form = entryForm.value - const out = { Name: form.Name, Type: form.Type } + // appid is shopdb metadata, always sent (null unlinks); the backend keeps it + // off the manifest JSON. + const out = { Name: form.Name, Type: form.Type, appid: form.appid ?? null } const scalars = ['Installer', 'InstallArgs', 'Script', 'Args', 'Source', 'Destination', 'RegPath', 'RegName', 'RegType', 'DetectionPath', 'DetectionName', 'DetectionValue', 'DetectionPattern', '_CmmVersion', @@ -828,14 +841,20 @@ function describeEntry(entry) { } else if (entry.PCTypes && entry.PCTypes.length) { text += `; ${entry.PCTypes.length} PC type(s)` } + if (entry.appname) text += `; tracked: ${entry.appname}` return text } function formatDate(value) { return value ? new Date(value).toLocaleString() : '' } +async function loadApplications() { + try { applications.value = payload(await api.get('/geenforce/applications')) } catch (e) { /* optional */ } +} + loadScopes() loadConfig() +loadApplications()