From 548a22761796020cac08fcf3d3a85e77d6f8c4df Mon Sep 17 00:00:00 2001 From: BenClaw Date: Sat, 30 May 2026 20:33:15 +0200 Subject: [PATCH] feat: add page_settings JSON property + ACE JSON mode - Add property :page_settings (Hash, default {}) to Page model - JSON.parse string input in setter (form submits as text) - Add collapsible 'Page Settings (JSON)' section to page form - Support data-mode='json' attribute for ACE editor (html_edit.js.coffee: check textarea data-mode attribute) --- app/assets/javascripts/cmtool/html_edit.js.coffee | 4 ++++ app/views/cmtool/pages/_form.html.slim | 6 ++++++ lib/cmtool/includes/page.rb | 7 +++++++ 3 files changed, 17 insertions(+) diff --git a/app/assets/javascripts/cmtool/html_edit.js.coffee b/app/assets/javascripts/cmtool/html_edit.js.coffee index a2ff351..08416e2 100644 --- a/app/assets/javascripts/cmtool/html_edit.js.coffee +++ b/app/assets/javascripts/cmtool/html_edit.js.coffee @@ -17,6 +17,10 @@ class HtmlEdit editor.setValue template_field.val(), -1 editor.getSession().setMode 'ace/mode/slim' console.log "Editing Emblem using Slim mode for ACE editor" + else if data_mode = text_field.data('mode') + editor.setValue text_field.val(), -1 + editor.getSession().setMode "ace/mode/#{data_mode}" + console.log "Editing #{data_mode} using ACE editor" else editor.setValue text_field.val(), -1 editor.getSession().setMode 'ace/mode/handlebars' diff --git a/app/views/cmtool/pages/_form.html.slim b/app/views/cmtool/pages/_form.html.slim index fd304fa..af27948 100644 --- a/app/views/cmtool/pages/_form.html.slim +++ b/app/views/cmtool/pages/_form.html.slim @@ -37,6 +37,12 @@ javascript: .field = f.label :footer = f.text_area :footer, rows: 15, cols: 80, class: 'html-content' + = collapsible_content 'Page Settings (JSON)' do + .field + = f.label :page_settings + %p.help-text JSON configuration for this page. Use Ace editor in JSON mode. + = f.text_area :page_settings, rows: 12, cols: 80, class: 'html-content', 'data-mode' => 'json', + value: (f.object.page_settings.presence || {}).to_json .form-row .form-label= f.label :parent_id .form-field= f.select :parent_id, tree_options_for_select(Page.full_tree(@page.locale || Page.locales.first), exclude: @page.id, selected: @page.parent_id), include_blank: ' -- ' diff --git a/lib/cmtool/includes/page.rb b/lib/cmtool/includes/page.rb index 9bab51a..35ed4ae 100644 --- a/lib/cmtool/includes/page.rb +++ b/lib/cmtool/includes/page.rb @@ -21,6 +21,13 @@ module Cmtool klass.property :active, type: :boolean, default: true klass.property :layout klass.property :in_menu, type: :boolean, default: true + klass.property :page_settings, default: {} + + # Parse JSON string from form submission + klass.send(:define_method, :page_settings=) do |val| + val = JSON.parse(val) if val.is_a?(String) + super(val) + end klass.has_ancestry by_property: :locale