32 lines
2.6 KiB
JavaScript
32 lines
2.6 KiB
JavaScript
import { readFileSync } from "node:fs";
|
|
|
|
function source(path) {
|
|
return readFileSync(new URL(path, import.meta.url), "utf8");
|
|
}
|
|
|
|
function assert(condition, message) {
|
|
if (!condition) throw new Error(message);
|
|
}
|
|
|
|
const admin = source("../src/features/views/ViewsAdminPanel.tsx");
|
|
const personal = source("../src/features/views/PersonalViewsPanel.tsx");
|
|
const selector = source("../src/components/ViewSelector.tsx");
|
|
const patterns = source("../src/features/views/interfacePatterns.ts");
|
|
const moduleSource = source("../src/module.ts");
|
|
const translations = source("../src/i18n/generatedTranslations.ts");
|
|
|
|
assert(admin.includes("DocumentationHelpLink") && personal.includes("VIEWS_FIELD_DOCUMENTATION"), "Views administration and personal settings expose contextual documentation");
|
|
assert(admin.includes("ActionBlockerHint") && personal.includes("ActionBlockerHint"), "Read-only and optional-capability states identify the required remedy");
|
|
assert(admin.includes("disabledReason"), "Unavailable Views actions explain their state");
|
|
assert(admin.includes("createDirty ? requestDiscard(closeCreate)") && admin.includes("assignmentDirty ? requestDiscard(closeAssignment)"), "Definition and assignment dialogs use the shared unsaved-change guard");
|
|
assert(admin.includes("ConfirmDialog") && admin.includes("archiveTarget") && admin.includes("deleteAssignmentTarget"), "Archive and assignment removal remain explicitly confirmed");
|
|
assert(admin.includes("LOCKOUT_SURFACES") && admin.includes("requiredMissing"), "Required Views retain the selector and administration escape paths");
|
|
assert(patterns.includes('topicId: "views.interface-projections"') && patterns.includes('topicId: "views.reference.fields-and-consequences"'), "Views uses stable manifest-backed help references");
|
|
assert(moduleSource.includes("generatedTranslations") && moduleSource.includes('label: "i18n:govoplan-views.views"'), "Module and surface labels are localized");
|
|
assert(selector.includes("usePlatformLanguage") && selector.includes("required_by_administrator"), "The global selector localizes and explains its locked state");
|
|
assert(selector.includes("View as ViewIcon") && selector.includes("is-context-active"), "The global selector uses the compact View icon and marks an effective projection");
|
|
assert(selector.includes("useUnsavedChanges") && selector.includes("requestNavigation"), "View changes retain the shared dirty-navigation guard");
|
|
assert(translations.includes('"i18n:govoplan-views.views_administration_is_read_only"'), "Availability explanations are present in the translation catalogue");
|
|
|
|
console.log("Views surfaces satisfy the recorded interface pattern-language contract.");
|