fix: resolve homepage sections editor and rendering issues
- Fix sections editor not showing by converting isHomepage getter to property - Add Alpine Collapse plugin for accordion animations - Fix Quill editor content not syncing after page load - Add platform dropdown to content page edit form - Create shared templates config (app/templates_config.py) with i18n globals to make _() translation function available in Jinja2 macros - Fix pricing template field names (monthly_price → price_monthly) - Fix translation key (pricing.save_20 → pricing.save_months) - Add tiers context to CMS homepage route for pricing section - Fix architecture validation issues (language defaults, inline SVGs → $icon) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
@@ -30,10 +30,13 @@ function contentPageEditor(pageId) {
|
||||
show_in_footer: true,
|
||||
show_in_legal: false,
|
||||
display_order: 0,
|
||||
platform_id: null,
|
||||
vendor_id: null
|
||||
},
|
||||
platforms: [],
|
||||
vendors: [],
|
||||
loading: false,
|
||||
loadingPlatforms: false,
|
||||
loadingVendors: false,
|
||||
saving: false,
|
||||
error: null,
|
||||
@@ -96,8 +99,8 @@ function contentPageEditor(pageId) {
|
||||
}
|
||||
window._contentPageEditInitialized = true;
|
||||
|
||||
// Load vendors for dropdown
|
||||
await this.loadVendors();
|
||||
// Load platforms and vendors for dropdowns
|
||||
await Promise.all([this.loadPlatforms(), this.loadVendors()]);
|
||||
|
||||
if (this.pageId) {
|
||||
// Edit mode - load existing page
|
||||
@@ -117,9 +120,34 @@ function contentPageEditor(pageId) {
|
||||
contentPageEditLog.info('=== CONTENT PAGE EDITOR INITIALIZATION COMPLETE ===');
|
||||
},
|
||||
|
||||
// Check if we should show section editor
|
||||
get isHomepage() {
|
||||
return this.form.slug === 'home';
|
||||
// Check if we should show section editor (property, not getter for Alpine compatibility)
|
||||
isHomepage: false,
|
||||
|
||||
// Update isHomepage when slug changes
|
||||
updateIsHomepage() {
|
||||
this.isHomepage = this.form.slug === 'home';
|
||||
},
|
||||
|
||||
// Load platforms for dropdown
|
||||
async loadPlatforms() {
|
||||
this.loadingPlatforms = true;
|
||||
try {
|
||||
contentPageEditLog.info('Loading platforms...');
|
||||
const response = await apiClient.get('/admin/platforms?is_active=true');
|
||||
const data = response.data || response;
|
||||
this.platforms = data.platforms || data.items || data || [];
|
||||
contentPageEditLog.info(`Loaded ${this.platforms.length} platforms`);
|
||||
|
||||
// Set default platform if not editing and no platform selected
|
||||
if (!this.pageId && !this.form.platform_id && this.platforms.length > 0) {
|
||||
this.form.platform_id = this.platforms[0].id;
|
||||
}
|
||||
} catch (err) {
|
||||
contentPageEditLog.error('Error loading platforms:', err);
|
||||
this.platforms = [];
|
||||
} finally {
|
||||
this.loadingPlatforms = false;
|
||||
}
|
||||
},
|
||||
|
||||
// Load vendors for dropdown
|
||||
@@ -170,11 +198,19 @@ function contentPageEditor(pageId) {
|
||||
show_in_footer: page.show_in_footer !== undefined ? page.show_in_footer : true,
|
||||
show_in_legal: page.show_in_legal || false,
|
||||
display_order: page.display_order || 0,
|
||||
platform_id: page.platform_id,
|
||||
vendor_id: page.vendor_id
|
||||
};
|
||||
|
||||
contentPageEditLog.info('Page loaded successfully');
|
||||
|
||||
// Update computed properties after loading
|
||||
this.updateIsHomepage();
|
||||
|
||||
// Re-initialize Quill editor content after page data is loaded
|
||||
// (Quill may have initialized before loadPage completed)
|
||||
this.syncQuillContent();
|
||||
|
||||
} catch (err) {
|
||||
contentPageEditLog.error('Error loading page:', err);
|
||||
this.error = err.message || 'Failed to load page';
|
||||
@@ -183,6 +219,26 @@ function contentPageEditor(pageId) {
|
||||
}
|
||||
},
|
||||
|
||||
// Sync Quill editor content after page data loads
|
||||
// Quill may initialize before loadPage completes, leaving editor empty
|
||||
syncQuillContent(retries = 5) {
|
||||
const quillContainer = document.getElementById('content-editor');
|
||||
|
||||
if (!quillContainer || !quillContainer.__quill) {
|
||||
// Quill not ready yet, retry
|
||||
if (retries > 0) {
|
||||
setTimeout(() => this.syncQuillContent(retries - 1), 100);
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
const quill = quillContainer.__quill;
|
||||
if (this.form.content && quill.root.innerHTML !== this.form.content) {
|
||||
quill.root.innerHTML = this.form.content;
|
||||
contentPageEditLog.debug('Synced Quill content after page load');
|
||||
}
|
||||
},
|
||||
|
||||
// ========================================
|
||||
// HOMEPAGE SECTIONS METHODS
|
||||
// ========================================
|
||||
@@ -355,6 +411,7 @@ function contentPageEditor(pageId) {
|
||||
show_in_footer: this.form.show_in_footer,
|
||||
show_in_legal: this.form.show_in_legal,
|
||||
display_order: this.form.display_order,
|
||||
platform_id: this.form.platform_id,
|
||||
vendor_id: this.form.vendor_id
|
||||
};
|
||||
|
||||
|
||||
Reference in New Issue
Block a user