module Locomotive module API module Forms class PageForm < BaseForm attrs :title, :slug, :handle, :response_type, :published attrs :cache_enabled, :cache_control, :cache_vary # Tree attrs :parent_id, :position, :listed # Template attrs :is_layout, :allow_layout, :raw_template # Redirection attrs :redirect, :redirect_url, :redirect_type # Templatized attrs :templatized, :target_klass_slug # SEO attrs :seo_title, :meta_keywords, :meta_description # Editable elements attrs :editable_elements_attributes # Sections attrs :sections_content, :sections_dropzone_content # Display settings attrs :display_settings def initialize(site, attributes = {}, existing_page = nil) @site = site @existing_page = existing_page super(attributes) end ## Custom setters ## def parent=(id_or_path) self.parent_id = @site.pages.by_id_or_fullpath(id_or_path).pluck(:_id).first end def template=(template) self.raw_template = template end def editable_elements=(elements) self.editable_elements_attributes = elements.map do |attrs| if element = @existing_page.try(:find_editable_element, attrs[:block], attrs[:slug]) attrs[:_id] = element._id end EditableElementForm.new(attrs).serializable_hash end end def sections_content=(value) set_attribute(:sections_content, JSON.parse(value)) end def sections_dropzone_content=(value) set_attribute(:sections_dropzone_content, JSON.parse(value)) end def content_type=(value) self.templatized = true if value.present? self.target_klass_slug = value end def redirect_url=(value) self.redirect = true if value.present? set_attribute :redirect_url, value end def display_settings=(settings) (settings || {}).each do |k, v| settings[k] = v == 'true' end set_attribute(:display_settings, settings) end end end end end