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()