Relocate applications, geenforce, knowledgebase, and machines - each owns only its own views dir, so a clean move to plugins/<name>/frontend/ (views/ + routes.js, core imports rewritten to @/). geenforce's entryForm.js helper + its vitest spec move with it (ManifestEditor imports it as a sibling). Machinery fixes this batch surfaced: - routes.gen.js codegen uses namespace imports (import * as p_x). A route file without a `toplevel` export is undefined on the namespace instead of a strict- ESM missing-binding build error. - vitest gains a `pretest` stage so plugin-frontend specs (now under plugins/<name>/frontend/) run from their staged copy in src/.plugins-staged/. Verified live: GE-Enforce (the most complex, uses the entryForm sibling helper) renders fully from its staged frontend. Build + 58 vitest + naming green.
44 lines
1.3 KiB
Vue
44 lines
1.3 KiB
Vue
<template>
|
|
<div class="geenforce-section">
|
|
<div class="section-header">
|
|
<h1>GE-Enforce</h1>
|
|
<p class="section-sub">Desired-state install manifests for imaging PC types, and the fleet's reported results.</p>
|
|
</div>
|
|
<nav class="section-tabs">
|
|
<router-link to="/geenforce/manifests" class="tab">Manifests</router-link>
|
|
<router-link to="/geenforce/reports" class="tab">Enforcement Reports</router-link>
|
|
</nav>
|
|
<router-view />
|
|
</div>
|
|
</template>
|
|
|
|
<script setup>
|
|
// Tabbed shell for the GE-Enforce section. Children render the manifest editor
|
|
// and the fleet-compliance reports full-width (not squeezed into the settings rail).
|
|
</script>
|
|
|
|
<style scoped>
|
|
.geenforce-section { max-width: 1400px; }
|
|
.section-header { margin-bottom: 0.5rem; }
|
|
.section-header h1 { margin: 0; }
|
|
.section-sub { color: var(--text-light); margin: 0.25rem 0 0; }
|
|
.section-tabs {
|
|
display: flex;
|
|
gap: 0.25rem;
|
|
border-bottom: 1px solid var(--border);
|
|
margin: 1rem 0 1.25rem;
|
|
}
|
|
.tab {
|
|
padding: 0.5rem 0.9rem;
|
|
text-decoration: none;
|
|
color: var(--text-light);
|
|
border-bottom: 2px solid transparent;
|
|
font-weight: 500;
|
|
}
|
|
.tab:hover { color: var(--text); }
|
|
.tab.router-link-active {
|
|
color: var(--primary);
|
|
border-bottom-color: var(--primary);
|
|
}
|
|
</style>
|