Files
cms.techvanguard.vn/views/admin/partnerships/partials/hero-tab.ejs
T
Tống Thành Đạt 7df3a6f6bf feat(cms): refactor page content management and implement detailed editors
Refactor the CMS page content system to use a more modular configuration-driven approach. This replaces the monolithic `pageContentConfig.js` with individual configuration files for each page and introduces a shared field utility to standardize editor components.
Key changes:
- Implement a generic `_renderSingletonPageView` helper to reduce duplication across controllers.
- Enhance `_createPageContentController` with `normalizeForEditor`, `normalizeForApi`, and `preparePayload` hooks for custom data transformation.
- Create dedicated configuration and view structures for Partnerships, History, Accreditation, Admissions, and Policies pages.
- Add a specialized section editor for Policies to manage complex nested content.
- Improve the frontend `page-content-editor.js` with support for visibility logic, auto-sequencing for arrays, and URL synchronization for active tabs.
- Update data JSON files to align with the new schema.
2026-04-20 19:43:28 +07:00

46 lines
2.2 KiB
Plaintext

<div class="tab-pane fade <%= activeTab === 'hero' ? 'show active' : '' %>" id="hero" role="tabpanel">
<div class="card border shadow-sm">
<div class="card-header bg-white">
<h6 class="mb-0"><i class="fas fa-image me-2"></i>Hero</h6>
</div>
<div class="card-body p-4">
<div class="row g-3">
<div class="col-md-6">
<label class="form-label fw-semibold">Eyebrow label</label>
<input class="form-control" id="heroBadge" maxlength="40" value="<%= data.hero?.badge || '' %>">
</div>
<div class="col-md-6">
<label class="form-label fw-semibold">Scroll link label</label>
<input class="form-control" id="heroLinkLabel" maxlength="40" value="<%= data.hero?.linkLabel || '' %>">
</div>
<div class="col-12">
<label class="form-label fw-semibold">Headline</label>
<input class="form-control" id="heroTitle" maxlength="90" value="<%= data.hero?.title || '' %>">
</div>
<div class="col-12">
<label class="form-label fw-semibold">Supporting text</label>
<textarea class="form-control" id="heroDescription" rows="4" maxlength="220"><%= data.hero?.description || '' %></textarea>
</div>
<div class="col-12">
<label class="form-label fw-semibold">Hero image</label>
<div class="input-group">
<input class="form-control" id="heroImage" value="<%= data.hero?.image || '' %>">
<button class="btn btn-outline-primary" type="button" data-upload-target="heroImage" data-preview-target="heroImagePreview">
<i class="fas fa-upload me-1"></i>Upload
</button>
</div>
<div class="form-text">Recommended 720x630 px</div>
<img id="heroImagePreview" src="<%= data.hero?.image ? `${backendUrl}${data.hero.image}` : '' %>" class="img-thumbnail mt-2 <%= data.hero?.image ? '' : 'd-none' %>" style="max-height: 200px;">
</div>
<div class="col-12">
<label class="form-label fw-semibold">Hero image alt text</label>
<input class="form-control" id="heroImageAlt" maxlength="120" value="<%= data.hero?.imageAlt || '' %>">
</div>
</div>
</div>
</div>
</div>