refactor(policies): migrate to block-based content editor

Replace the legacy section-based policy editor with a flexible block-based system. This transition enables real-time previews, a wider variety of content types (headings, quotes, callouts), and improved data normalization.
- Implement `policies-block-editor.js` for dynamic content management
- Add `normalizePoliciesDocument` and `validateContent` utilities to handle data migration and integrity
- Update `policiesController.js` to support the new block structure and validation logic
- Migrate `policies.json` from `sections` array to a `content.blocks` structure
- Remove obsolete section editor views and partials
- Update `policiesConfig.js` to reflect the new editor capabilities
This commit is contained in:
Tống Thành Đạt
2026-04-22 10:14:54 +07:00
parent f26b072954
commit cdaddddfeb
10 changed files with 2438 additions and 1265 deletions
@@ -1,8 +1,8 @@
<script>
(function () {
const config = window.pageEditorConfig;
const initialData = window.pageEditorData;
const backendUrl = (window.pageEditorBackendUrl || "").replace(/\/$/, "");
const config = readJsonScript("pageEditorConfigData");
const initialData = readJsonScript("pageEditorDataPayload");
const backendUrl = String(readJsonScript("pageEditorBackendUrlData") || "").replace(/\/$/, "");
const form = document.getElementById("cmsEditorForm");
const pageJsonInput = document.getElementById("pageJson");
const activeTabInput = document.getElementById("activeTabInput");
@@ -52,6 +52,17 @@
config.tabs.forEach((tab) => renderSection(tab.key));
}
function readJsonScript(id) {
const node = document.getElementById(id);
if (!node) return null;
try {
return JSON.parse(node.textContent || "null");
} catch (error) {
console.error(`Failed to parse JSON script "${id}"`, error);
return null;
}
}
function updateTabUrl(tabKey) {
const url = new URL(window.location.href);
url.searchParams.set("tab", tabKey);