");
+ page_part.prepend(newsub);
+ })
+ })
+ })
+
+ $("*[data-pp]").each(function(){
+ var add_btn = $(""),
+ part = $(this);
+ add_btn.click(function(){
+ if(part.find("*[data-ps]").length){
+ window.location.href = "/page_parts/" + part.data("pp") + "/edit?page_id=" + page_params["id"];
+ }else{
+ window.location.href = "/page_parts/new?part=" + part.data("pp") + "&page_id=" + page_params["id"];
+ }
+ })
+ $(this).append(add_btn);
+ })
+
+ })
+})();
\ No newline at end of file
diff --git a/app/assets/javascripts/edit.js b/app/assets/javascripts/edit.js
new file mode 100644
index 0000000..e3f1b00
--- /dev/null
+++ b/app/assets/javascripts/edit.js
@@ -0,0 +1,15 @@
+// This is a manifest file that'll be compiled into application.js, which will include all the files
+// listed below.
+//
+// Any JavaScript/Coffee file within this directory, lib/assets/javascripts, vendor/assets/javascripts,
+// or vendor/assets/javascripts of plugins, if any, can be referenced here using a relative path.
+//
+// It's not advisable to add code directly here, but if you do, it'll appear at the bottom of the
+// compiled file.
+//
+// Read Sprockets README (https://github.com/sstephenson/sprockets#sprockets-directives) for details
+// about supported directives.
+//
+
+//= require loadjquery
+//= require edit-main
\ No newline at end of file
diff --git a/app/assets/javascripts/users.js.coffee b/app/assets/javascripts/users.js.coffee
deleted file mode 100644
index 24f83d1..0000000
--- a/app/assets/javascripts/users.js.coffee
+++ /dev/null
@@ -1,3 +0,0 @@
-# Place all the behaviors and hooks related to the matching controller here.
-# All this logic will automatically be available in application.js.
-# You can use CoffeeScript in this file: http://coffeescript.org/
diff --git a/app/assets/stylesheets/home.css.scss b/app/assets/stylesheets/announcements.css.scss
similarity index 61%
rename from app/assets/stylesheets/home.css.scss
rename to app/assets/stylesheets/announcements.css.scss
index f0ddc68..72e63be 100644
--- a/app/assets/stylesheets/home.css.scss
+++ b/app/assets/stylesheets/announcements.css.scss
@@ -1,3 +1,3 @@
-// Place all the styles related to the home controller here.
+// Place all the styles related to the announcements controller here.
// They will automatically be included in application.css.
// You can use Sass (SCSS) here: http://sass-lang.com/
diff --git a/app/assets/stylesheets/pp-add-edit.css b/app/assets/stylesheets/pp-add-edit.css
new file mode 100644
index 0000000..b07b3cf
--- /dev/null
+++ b/app/assets/stylesheets/pp-add-edit.css
@@ -0,0 +1,70 @@
+/*
+
+
+
+
+*/
+*[data-pp] {
+ margin: 0 auto;
+ position: relative;
+}
+*[data-pp] > *[data-ps] {
+ padding: 3px;
+ height: 50px;
+ outline: thin dotted #EBB666;
+ cursor: pointer;
+ position: relative;
+}
+*[data-pp] > *[data-ps]:before {
+ content: "";
+ line-height: 100%;
+ position: absolute;
+ top: 0;
+ right: 0;
+ bottom: 0;
+ left: 0;
+ background-color: #a1a1a1;
+ opacity: 0.6;
+ filter: alpha(opacity=60);
+}
+*[data-pp] > *[data-ps]:after {
+ font-size: 1rem;
+ font-weight: 300;
+ content: "Edit";
+ text-align: center;
+ margin-top: -0.7rem;
+ position: absolute;
+ top: 50%;
+ right: 0;
+ left: 0;
+}
+*[data-pp] > *[data-ps]:hover:before {
+ opacity: 0.8;
+ filter: alpha(opacity=80);
+}
+*[data-pp] > *[data-ps]:hover:after {
+ font-weight: 400;
+}
+*[data-pp] > .add-ps {
+ text-align: center;
+ position: relative;
+ width: 100%;
+ min-height: 2rem;
+ line-height: 2rem;
+ cursor: pointer;
+}
+*[data-pp] > .add-ps:after {
+ font-size: 1rem;
+ font-weight: 300;
+ content: "Add";
+ position: absolute;
+ top: 0;
+ right: 0;
+ bottom: 0;
+ left: 0;
+ background-color: #e0dbcb;
+}
+*[data-pp] > .add-ps:hover:after {
+ font-weight: 400;
+ background-color: #923132;
+}
diff --git a/app/assets/stylesheets/users.css.scss b/app/assets/stylesheets/users.css.scss
deleted file mode 100644
index 1efc835..0000000
--- a/app/assets/stylesheets/users.css.scss
+++ /dev/null
@@ -1,3 +0,0 @@
-// Place all the styles related to the users controller here.
-// They will automatically be included in application.css.
-// You can use Sass (SCSS) here: http://sass-lang.com/
diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb
index d83690e..b2e9772 100644
--- a/app/controllers/application_controller.rb
+++ b/app/controllers/application_controller.rb
@@ -2,4 +2,21 @@ class ApplicationController < ActionController::Base
# Prevent CSRF attacks by raising an exception.
# For APIs, you may want to use :null_session instead.
protect_from_forgery with: :exception
+ before_action :set_locale
+ def default_url_options(options={})
+ { locale: I18n.locale }
+ end
+
+ def set_locale
+ I18n.locale = params[:locale] || I18n.default_locale
+ end
+
+ def get_layout
+ f = File.join("../../templates/", "#{@key}", '/home/page.html.erb')
+ end
+
+ def get_key
+ @key = Template::KEY
+ end
+
end
diff --git a/app/controllers/home_controller.rb b/app/controllers/home_controller.rb
index db4b80d..ed6bb7b 100644
--- a/app/controllers/home_controller.rb
+++ b/app/controllers/home_controller.rb
@@ -29,15 +29,11 @@ class HomeController < ApplicationController
private
- def get_key
- @key = Template::KEY
- end
-
def get_layout
if params[:name]
- File.join("../../templates", "#{@key}", '/home/page.html.erb')
+ File.join("../../templates/", "#{@key}", '/home/page.html.erb')
else
- false
+ false
end
end
end
diff --git a/app/controllers/page_parts_controller.rb b/app/controllers/page_parts_controller.rb
new file mode 100644
index 0000000..5615b9f
--- /dev/null
+++ b/app/controllers/page_parts_controller.rb
@@ -0,0 +1,72 @@
+class PagePartsController < ApplicationController
+ before_action :get_key
+ def new
+ @part = PagePart.new
+ @part.sub_parts.build
+ @modules = []
+ @part_number = params[:part]
+ @page_id = params[:page_id]
+ Dir.glob("#{Rails.root}/app/templates/#{@key}/modules/*").each do |m|
+ @modules << m.gsub("#{Rails.root}/app/templates/#{@key}/modules/","")
+ end
+ end
+
+ def edit
+ page = Page.find(params[:page_id])
+ @part = page.page_parts.where(:part_id => params[:id]).first
+ @part.sub_parts.build
+ @modules = []
+ @page_id = params[:page_id]
+ Dir.glob("#{Rails.root}/app/templates/#{@key}/modules/*").each do |m|
+ @modules << m.gsub("#{Rails.root}/app/templates/#{@key}/modules/","")
+ end
+ end
+
+ def getwidgets
+ module_name = params[:module]
+ @select_number = params[:number_of_select]
+ @widgets = []
+ Dir.glob("#{Rails.root}/app/templates/#{@key}/modules/#{module_name}/*").each do |w|
+ w = File.basename(w, ".*")
+ w = File.basename(w, ".*")
+ @widgets << w.gsub("_","") if w != "index" && w != "show"
+ end
+ render :layout => false
+ end
+
+ def info
+ page = Page.find(params[:page_id])
+ parts = page.page_parts
+ data = []
+ parts.each do |part|
+ partid = "data-pp=" + part.part_id.to_s
+ subparts = part.sub_parts
+ subpart = []
+ subparts.each do |p|
+ subpart << {"module" => p.module, "widget" => p.widget}
+ end
+ data << {"name" => partid, "subparts" => subpart}
+ end
+ render :json => {"parts" => data}.to_json
+ end
+
+ def create
+ @part = PagePart.new(part_params)
+ @part.save!
+ redirect_to pages_edit_view_path(:id => params[:page_part][:page_id])
+ end
+
+ def update
+ @part = PagePart.find(params[:page_part][:page_part_id])
+ @part.update_attributes(part_params)
+ redirect_to pages_edit_view_path(:id => params[:page_part][:page_id])
+
+ end
+
+ private
+
+ def part_params
+ params.require(:page_part).permit(:part_id, :page_id, sub_parts_attributes: [:module, :widget, :id])
+ end
+
+end
\ No newline at end of file
diff --git a/app/controllers/pages_controller.rb b/app/controllers/pages_controller.rb
new file mode 100644
index 0000000..4788d04
--- /dev/null
+++ b/app/controllers/pages_controller.rb
@@ -0,0 +1,153 @@
+class PagesController < ApplicationController
+ before_action :get_key
+ layout :get_layout
+ include PagesHelper
+
+ def index
+ @pages = Page.all
+ # render json: @pages
+ end
+
+ def edit_view
+ @manifest = @key
+ @dataApi = "edit"
+
+ # @qq = render_to_string(:partial => @p, :layout => false)
+ render get_view
+ end
+
+ def show
+ page = Page.find_by_param(params[:page_id]) rescue nil
+ module_app = page.module.downcase.pluralize
+ params[:target_controller] = "#{module_app}"
+ @manifest = @key
+ @dataApi = nil
+ OrbitHelper.set_params params
+ OrbitHelper.set_site_locale locale
+ params[:target_action] = "index"
+ params[:url] = page.url
+ render render_final_page("#{module_app}/show",page)
+ end
+
+ def moduleShow
+ page = Page.find_by_param(params[:page_id])
+ params[:target_action] = "show"
+ params[:uid] = params[:uid]
+ module_app = page.module.downcase.pluralize
+ params[:target_controller] = "#{module_app}"
+ @manifest = @key
+ @dataApi = nil
+ OrbitHelper.set_params params
+ OrbitHelper.set_site_locale locale
+ render render_final_page("#{module_app}/show",page)
+ end
+
+ def preview
+ render render_final_page
+ end
+
+
+
+ def new
+ @page = Page.new
+ @pages = Page.where(:page_id.ne => "" , :page_id.exists => true)
+ @modules = ModuleApp.all
+
+ end
+
+ def create
+ @page = Page.new(page_params)
+ @page.save!
+ redirect_to pages_path
+ end
+
+ private
+
+ def render_final_page(original_view=get_view,page)
+
+ parts = page.page_parts
+ @part_partials = {}
+
+ parts.each do |part|
+ subparts = part.sub_parts
+ partials = []
+ subparts.each do |subpart|
+ # partials << render_to_string(:partial => get_widget_path(widget_path))
+ partials << render_widget_for_frontend(params[:target_controller],"widget",subpart.widget)
+ end
+ @part_partials["data-pp='#{part.part_id}'"] = partials
+ end
+
+ @file = nil
+ @layout_html = nil
+ @file = File.join('../templates', "#{@key}", '/home/page.html.erb')
+ @layout_html = render_to_string(@file)
+ doc = Nokogiri::HTML(@layout_html)
+
+ @part_partials.each do |key, partial|
+ html_string = ""
+ partial.each do |p|
+ html_string = html_string + p
+ end
+ pp = doc.css("*[#{key}]")
+ pp = pp[0]
+ pp.inner_html = html_string
+ end
+
+ viewarea = doc.css("*[data-content='true']")
+ viewarea = viewarea[0]
+ viewarea.inner_html = render_to_string(original_view)
+ newlayout = "#{page.name}_layout.html.erb"
+ file_path = File.join(Rails.root, 'app', 'views', 'frontend', newlayout)
+
+ f = File.open(file_path,"w")
+ f.write(doc.to_html)
+ f.close
+ view_to_render = "frontend/#{newlayout}"
+ view_to_render
+ end
+
+ def get_widget_path(widget)
+ file = File.join('../templates', "#{@key}", "modules/#{widget}")
+ end
+
+ def get_view
+ page = Page.find(params[:id])
+
+ if page.page_id == "home"
+ @view = File.join(Rails.root, 'app', 'templates', "#{@key}", '/home/index.html.erb')
+ else
+ module_name = page.module.downcase.pluralize
+ @view = File.join(Rails.root, 'app', 'templates', "#{@key}", "modules/#{module_name}/index.html.erb")
+ end
+ end
+
+ def page_params
+ if params[:page][:parent_page] == ""
+ params[:page][:parent_page] = nil
+ @url = "/#{params[:page][:page_id]}"
+ else
+ page = Page.find(params[:page][:parent_page])
+ @url = page.url + "/#{params[:page][:page_id]}"
+ end
+ p = params.require(:page).permit(:number, :page_id, :module, :parent_page, name_translations: [:en, :zh_tw])
+ p["url"] = @url
+ p
+ end
+
+ def get_layout
+ if request[:action] == "edit_view"
+ page = Page.find(params[:id])
+ if page.page_id == "home"
+ false
+ else
+ File.join("../../templates", "#{@key}", '/home/page.html.erb')
+ end
+ # elsif request[:action] == "show" || request[:action] == "moduleShow"
+ # File.join("../../templates", "themes", "#{@key}", '/home/page.html.erb')
+ else
+ false
+ end
+ end
+
+end
diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb
index bd56f2c..b487258 100644
--- a/app/helpers/application_helper.rb
+++ b/app/helpers/application_helper.rb
@@ -2,7 +2,7 @@ require "json"
module ApplicationHelper
def render_widget(widget)
key = Template::KEY
- file = File.join('../templates', "#{key}", "modules/#{widget}")
+ file = File.join("../templates", "#{key}", "modules/#{widget}")
render :partial => file
end
@@ -10,11 +10,28 @@ module ApplicationHelper
"/module/#{module_name}/show"
end
+
+
def render_menu
- json_file = File.read(File.join(Rails.root, 'public', "menu.json"))
- @items = JSON.parse(json_file)
+ # json_file = File.read(File.join(Rails.root, 'public', "menu.json"))
+ # @items = JSON.parse(json_file)
+ @pages = Page.where(:parent_page_id.ne => "" , :parent_page_id.exists => false, :page_id.ne => "", :page_id.exists => true)
+
+ def create_json(pages)
+ item = {}
+ pages.each do |page|
+ if page.child_page.size > 0
+ item["#{page.name}"] = {"url"=> "/#{locale.to_s}" + page.url, "children"=>create_json(page.child_page)}
+ else
+ item["#{page.name}"] = {"url"=> "/#{locale.to_s}" + page.url}
+ end
+ end
+ item
+ end
+ @items = create_json(@pages)
+
key = Template::KEY
- menu_file = File.open(File.join(Rails.root, 'app', 'templates', "#{key}", '/home/menu.html.erb'))
+ menu_file = File.open(File.join(Rails.root, 'app', 'templates', "#{key}", '/home/menu.html.erb'))
doc = Nokogiri::HTML(menu_file)
menu_file.close
@@ -63,4 +80,48 @@ module ApplicationHelper
h.html_safe
end
+ def render_view
+ if params[:target_action] == "index"
+ file = File.open(File.join(Rails.root, 'app', 'templates', "#{@key}", 'modules', params[:target_controller], "#{params[:target_action]}.html.erb"))
+ doc = Nokogiri::HTML(file)
+ file.close
+ wrap_elements = doc.css("*[data-module]")
+ controller = "#{params[:target_controller].capitalize}Controller".classify.constantize.new
+ data = controller.send("#{params[:target_action]}")
+ wrap_elements.each do |wrap_element|
+ html_to_render = ""
+ data.each do |item|
+ el = wrap_element.inner_html
+ item.each do |key,value|
+ el = el.gsub("{{#{key}}}",value)
+ el = el.gsub("%7B%7B#{key}%7D%7D",value)
+ end
+ html_to_render = html_to_render + el
+ end
+ wrap_element.inner_html = html_to_render
+ end
+ doc.to_s.html_safe
+ elsif params[:target_action] == "show"
+ file = File.open(File.join(Rails.root, 'app', 'templates', "#{@key}", 'modules', params[:target_controller], "#{params[:target_action]}.html.erb"))
+ doc = Nokogiri::HTML(file)
+ file.close
+ wrap_element_html = doc.to_s
+ html_to_render = ""
+ controller = "#{params[:target_controller].capitalize}Controller".classify.constantize.new
+ data = controller.send("#{params[:target_action]}")
+ el = wrap_element_html
+ data.each do |key,value|
+ el = el.gsub("{{#{key}}}",value)
+ el = el.gsub("%7B%7B#{key}%7D%7D",value)
+ end
+ el.html_safe
+ end
+ end
+
+ def action_data
+ controller = "#{params[:target_controller].capitalize}Controller".constantize.new
+ data = controller.send("#{params[:target_action]}")
+ data
+ end
+
end
diff --git a/app/helpers/orbit_helper.rb b/app/helpers/orbit_helper.rb
new file mode 100644
index 0000000..5b17191
--- /dev/null
+++ b/app/helpers/orbit_helper.rb
@@ -0,0 +1,21 @@
+module OrbitHelper
+ def self.set_params(params)
+ @params = params
+ end
+
+ def self.get_params
+ @params
+ end
+
+ def self.url_to_show(uid,title)
+ "/#{self.get_site_locale.to_s}#{@params[:url]}/#{uid}/#{title.parameterize}"
+ end
+
+ def self.set_site_locale(locale)
+ @site_locale = locale
+ end
+
+ def self.get_site_locale
+ @site_locale
+ end
+end
diff --git a/app/helpers/pages_helper.rb b/app/helpers/pages_helper.rb
new file mode 100644
index 0000000..3c5053a
--- /dev/null
+++ b/app/helpers/pages_helper.rb
@@ -0,0 +1,36 @@
+module PagesHelper
+
+ def parse_pp_tags(file)
+ opened_file = File.open(file)
+ doc = Nokogiri::HTML(opened_file)
+ opened_file.close
+ pps = doc.css("*[data-pp]")
+ pps.each do |pp|
+ pp.content = ""
+ end
+ doc.to_html
+ end
+
+ def render_widget_for_frontend(controller_name, widget_method, widget_file)
+ file = File.open(File.join(Rails.root, 'app', 'templates', "#{Template::KEY}", 'modules', "#{controller_name}", "_#{widget_file}.html.erb"))
+ doc = Nokogiri::HTML(file)
+ file.close
+ wrap_elements = doc.css("*[data-repeat]")
+ controller = "#{controller_name.capitalize}Controller".classify.constantize.new
+ data = controller.send("#{widget_method}")
+ wrap_elements.each do |wrap_element|
+ html_to_render = ""
+ data.each do |item|
+ el = wrap_element.inner_html
+ item.each do |key,value|
+ el = el.gsub("{{#{key}}}",value)
+ el = el.gsub("%7B%7B#{key}%7D%7D",value)
+ end
+ html_to_render = html_to_render + el
+ end
+ wrap_element.inner_html = html_to_render
+ end
+ doc.to_s.html_safe
+ end
+
+end
diff --git a/app/models/concerns/slug.rb b/app/models/concerns/slug.rb
new file mode 100644
index 0000000..56a0537
--- /dev/null
+++ b/app/models/concerns/slug.rb
@@ -0,0 +1,16 @@
+ module Slug
+ extend ActiveSupport::Concern
+
+ def slug
+ if not respond_to? :title or title.empty?
+ id
+ else
+ I18n.locale
+ title.parameterize
+ end
+ end
+
+ def to_param
+ slug
+ end
+end
\ No newline at end of file
diff --git a/app/models/module_app.rb b/app/models/module_app.rb
new file mode 100644
index 0000000..6ea15b4
--- /dev/null
+++ b/app/models/module_app.rb
@@ -0,0 +1,5 @@
+class ModuleApp
+ include Mongoid::Document
+ field :title, type: String
+ field :key, type: String
+end
diff --git a/app/models/page.rb b/app/models/page.rb
new file mode 100644
index 0000000..45c8219
--- /dev/null
+++ b/app/models/page.rb
@@ -0,0 +1,23 @@
+class Page
+ include Mongoid::Document
+ include Mongoid::Timestamps
+
+ field :name, localize: true
+ field :number, type: Integer
+ field :module
+ field :url
+ field :page_id
+
+ has_many :page_parts, :autosave => true, :dependent => :destroy
+
+ has_many :child_page, :class_name => 'Page', :inverse_of => :parent_page
+ belongs_to :parent_page, :class_name => 'Page', :inverse_of => :child_page
+
+ def to_param
+ page_id.parameterize
+ end
+
+ def self.find_by_param(input)
+ self.find_by(page_id: input) rescue nil
+ end
+end
\ No newline at end of file
diff --git a/app/models/page_part.rb b/app/models/page_part.rb
new file mode 100644
index 0000000..c1d0851
--- /dev/null
+++ b/app/models/page_part.rb
@@ -0,0 +1,12 @@
+class PagePart
+ include Mongoid::Document
+ include Mongoid::Timestamps
+
+ field :part_id, type: Integer
+
+ belongs_to :page
+ has_many :sub_parts, :dependent => :destroy
+
+ accepts_nested_attributes_for :sub_parts, :allow_destroy => true
+
+end
\ No newline at end of file
diff --git a/app/models/page_relationship.rb b/app/models/page_relationship.rb
new file mode 100644
index 0000000..9268540
--- /dev/null
+++ b/app/models/page_relationship.rb
@@ -0,0 +1,10 @@
+class PageRelationship
+ include Mongoid::Document
+ include Mongoid::Timestamps
+
+ field :page_id, type: String
+ field :child_id, type: String
+
+ belongs_to :parent, :class_name => "Page"
+ belongs_to :child, :class_name => "Page"
+end
diff --git a/app/models/sub_part.rb b/app/models/sub_part.rb
new file mode 100644
index 0000000..6f49abc
--- /dev/null
+++ b/app/models/sub_part.rb
@@ -0,0 +1,9 @@
+class SubPart
+ include Mongoid::Document
+ include Mongoid::Timestamps
+
+ field :module
+ field :widget
+
+ belongs_to :page_part
+end
\ No newline at end of file
diff --git a/app/serializers/page_serializer.rb b/app/serializers/page_serializer.rb
new file mode 100644
index 0000000..df3f4b8
--- /dev/null
+++ b/app/serializers/page_serializer.rb
@@ -0,0 +1,4 @@
+class PageSerializer < ActiveModel::Serializer
+ attributes :url, :name
+ has_many :child_page
+end
diff --git a/app/templates/orbit_classic/home/index.html.erb b/app/templates/orbit_classic/home/index.html.erb
index 234b651..a993054 100644
--- a/app/templates/orbit_classic/home/index.html.erb
+++ b/app/templates/orbit_classic/home/index.html.erb
@@ -1,5 +1,4 @@
-
-
+
@@ -7,8 +6,7 @@
Orbit Classic
<%= stylesheet_link_tag "#{@manifest}"%>
<%= javascript_include_tag "#{@manifest}"%>
- <%= javascript_include_tag "#{@dataApi}"%>
-
+ <%= javascript_include_tag "#{@dataApi}" if @dataApi != nil%>