adva-core 0.0.1 → 0.0.2
Sign up to get free protection for your applications and to get access to all the features.
- data/app/controllers/admin/pages_controller.rb +2 -4
- data/app/controllers/admin/sections_controller.rb +4 -1
- data/app/controllers/admin/sites_controller.rb +3 -0
- data/app/views/admin/contents/_menu.html.rb +17 -0
- data/app/views/admin/pages/_menu.html.rb +5 -25
- data/app/views/admin/sections/_menu.html.rb +38 -5
- data/app/views/admin/sections/index.html.rb +2 -2
- data/app/views/admin/sites/_menu.html.rb +1 -5
- data/app/views/layouts/admin/_top.rb +2 -0
- data/app/views/layouts/default.rb +26 -12
- data/app/views/layouts/default/_menu.rb +4 -9
- data/config/locales/en.yml +42 -50
- data/lib/adva/core.rb +3 -2
- data/lib/adva/i18n.rb +73 -0
- data/lib/adva/responder/redirect.rb +1 -1
- data/lib/adva/routing_filters/section_path.rb +1 -1
- data/lib/adva/routing_filters/section_root.rb +1 -1
- data/lib/adva/view/helper/i18n.rb +26 -0
- data/lib/adva/view/menu.rb +32 -10
- data/lib/adva/view/menu/admin.rb +63 -11
- data/lib/adva/view/menu/items.rb +26 -0
- data/lib/adva_core/version.rb +3 -0
- data/lib/patches/responders/flash_responder.rb +17 -0
- data/lib/testing/step_definitions/transforms.rb +10 -3
- data/public/javascripts/adva-core/admin.js +2 -1
- data/public/javascripts/adva-core/jquery/jquery.table_tree.js +14 -10
- data/public/stylesheets/adva-core/admin/navigation.css +1 -1
- data/public/stylesheets/adva-core/admin/styles.css +8 -0
- metadata +21 -17
- data/public/images/adva-core/rails.png +0 -0
- data/public/images/adva-core/sortable_tree/drag.png +0 -0
@@ -1,4 +1,7 @@
|
|
1
1
|
class Admin::SectionsController < Admin::BaseController
|
2
|
+
respond_to :html
|
3
|
+
respond_to :json, :only => :update
|
4
|
+
|
2
5
|
belongs_to :site
|
3
6
|
|
4
7
|
before_filter :set_params_for_nested_resources, :only => [:new, :create, :edit, :update]
|
@@ -29,7 +32,7 @@ class Admin::SectionsController < Admin::BaseController
|
|
29
32
|
|
30
33
|
def protect_last_section
|
31
34
|
if site.sections.count == 1
|
32
|
-
|
35
|
+
resource.errors[:error] = [:last_section_cant_be_destroyed]
|
33
36
|
respond_with(resources)
|
34
37
|
end
|
35
38
|
end
|
@@ -1,30 +1,10 @@
|
|
1
|
-
|
2
|
-
include do
|
3
|
-
def main
|
4
|
-
if resource.try(:persisted?)
|
5
|
-
label(resource.name)
|
6
|
-
item(:'.show', show_path)
|
7
|
-
else
|
8
|
-
item(:'.sections', index_path)
|
9
|
-
end
|
10
|
-
end
|
1
|
+
require_dependency 'admin/sections/_menu.html'
|
11
2
|
|
3
|
+
class Admin::Pages::Menu < Admin::Sections::Menu
|
4
|
+
include do
|
12
5
|
def right
|
13
|
-
|
14
|
-
|
15
|
-
item(:'.destroy', resource_path, :method => :delete, :confirm => t(:'.confirm_destroy', :model_name => resource.class.model_name.human))
|
16
|
-
else
|
17
|
-
item(:'.new', new_path)
|
18
|
-
end
|
6
|
+
super
|
7
|
+
destroy if show?
|
19
8
|
end
|
20
|
-
|
21
|
-
protected
|
22
|
-
|
23
|
-
def active?(url, options)
|
24
|
-
# hmmm ...
|
25
|
-
types = Section.types.map { |type| type.underscore.pluralize }.join('|')
|
26
|
-
return false if url =~ %r(/admin/sites/\d+/#{types}/\d+$) && request.path != url
|
27
|
-
super
|
28
|
-
end
|
29
9
|
end
|
30
10
|
end
|
@@ -1,12 +1,45 @@
|
|
1
|
+
# Base menu for sections. Also used on admin/sections/new.
|
1
2
|
class Admin::Sections::Menu < Adva::View::Menu::Admin::Actions
|
2
3
|
include do
|
3
4
|
def main
|
4
|
-
|
5
|
+
if collection?
|
6
|
+
index
|
7
|
+
else
|
8
|
+
resource_label
|
9
|
+
show
|
10
|
+
edit unless page?
|
11
|
+
end
|
5
12
|
end
|
6
|
-
|
13
|
+
|
7
14
|
def right
|
8
|
-
|
9
|
-
|
15
|
+
new if collection?
|
16
|
+
destroy if edit?
|
17
|
+
reorder if index? # TODO should only happen if we actually have more than 1 category
|
10
18
|
end
|
19
|
+
|
20
|
+
protected
|
21
|
+
|
22
|
+
def index
|
23
|
+
item(:".sections", index_parent_path(:sections))
|
24
|
+
end
|
25
|
+
|
26
|
+
def reorder
|
27
|
+
super( :'data-resource_type' => 'site', :'data-sortable_type' => 'sections')
|
28
|
+
end
|
29
|
+
|
30
|
+
def page?
|
31
|
+
resource.is_a?(Page)
|
32
|
+
end
|
33
|
+
|
34
|
+
def edit
|
35
|
+
item(:'.edit_section', edit_path)
|
36
|
+
end
|
37
|
+
|
38
|
+
def active?(url, options)
|
39
|
+
# hmmm ...
|
40
|
+
types = Section.types.map { |type| type.underscore.pluralize }.join('|')
|
41
|
+
return false if url =~ %r(/admin/sites/\d+/#{types}/\d+$) && request.path != url
|
42
|
+
super
|
43
|
+
end
|
11
44
|
end
|
12
|
-
end
|
45
|
+
end
|
@@ -18,11 +18,11 @@ class Admin::Sections::Index < Minimal::Template
|
|
18
18
|
end
|
19
19
|
|
20
20
|
def link_to_view(section)
|
21
|
-
capture { link_to(:'.view', public_url_for([section]), :class => :view) }
|
21
|
+
capture { link_to(:'.actions.view', public_url_for([section]), :class => :view) }
|
22
22
|
end
|
23
23
|
|
24
24
|
def status(section)
|
25
25
|
capture { span(t(:'.published'), :title => t(:'.published'), :class => 'status published') }
|
26
26
|
end
|
27
27
|
end
|
28
|
-
end
|
28
|
+
end
|
@@ -27,6 +27,7 @@ class Layouts::Admin::Top < Adva::View::Menu::Admin
|
|
27
27
|
item(site.name, url_for([:admin, site])) unless site.new_record?
|
28
28
|
end
|
29
29
|
item(:'.new_site', url_for([:new, :admin, :site]))
|
30
|
+
render_items
|
30
31
|
end
|
31
32
|
end
|
32
33
|
end
|
@@ -38,6 +39,7 @@ class Layouts::Admin::Top < Adva::View::Menu::Admin
|
|
38
39
|
item(section.name, url_for([:admin, site, section]), :class => :section)
|
39
40
|
end
|
40
41
|
item(:'.new_section', url_for([:new, :admin, site, :section]))
|
42
|
+
render_items
|
41
43
|
end
|
42
44
|
end
|
43
45
|
end
|
@@ -5,27 +5,41 @@ class Layouts::Default < Layouts::Base
|
|
5
5
|
end
|
6
6
|
|
7
7
|
def body
|
8
|
+
page
|
9
|
+
footer
|
10
|
+
end
|
11
|
+
|
12
|
+
def page
|
8
13
|
div :id => :page do
|
9
|
-
|
10
|
-
h1 site.title
|
11
|
-
h4 site.subtitle unless site.subtitle.blank?
|
12
|
-
render :partial => 'layouts/default/menu'
|
13
|
-
end
|
14
|
+
header
|
14
15
|
div :id => :main do
|
15
16
|
content
|
16
17
|
end
|
18
|
+
sidebar
|
17
19
|
end
|
18
|
-
|
19
|
-
|
20
|
+
end
|
21
|
+
|
22
|
+
def header
|
23
|
+
div :id => :header do
|
24
|
+
h1 site.title
|
25
|
+
h4 site.subtitle unless site.subtitle.blank?
|
26
|
+
render :partial => 'layouts/default/menu'
|
20
27
|
end
|
21
28
|
end
|
22
29
|
|
23
30
|
def footer
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
31
|
+
div :id => :footer do
|
32
|
+
ul :class => :left do
|
33
|
+
li :'.made_with'
|
34
|
+
end
|
35
|
+
ul :class => :right do
|
36
|
+
end
|
28
37
|
end
|
29
38
|
end
|
39
|
+
|
40
|
+
def sidebar
|
41
|
+
sidebar = capture { block.call(:sidebar) }
|
42
|
+
div sidebar, :id => 'sidebar', :class => 'left' unless sidebar.blank?
|
43
|
+
end
|
30
44
|
end
|
31
|
-
end
|
45
|
+
end
|
@@ -1,24 +1,19 @@
|
|
1
1
|
class Layouts::Default::Menu < Adva::View::Menu
|
2
2
|
include do
|
3
|
-
def
|
3
|
+
def build
|
4
4
|
ul(:id => :menu) do
|
5
5
|
site.sections.each do |section|
|
6
6
|
item(section.name, url_for(section))
|
7
7
|
end
|
8
|
+
render_items
|
8
9
|
end
|
9
10
|
end
|
10
|
-
|
11
|
+
|
11
12
|
protected
|
12
13
|
|
13
14
|
def active?(url, options)
|
14
15
|
return false if url =~ %r(/admin/sites(/\d+)?$) && request.fullpath != url
|
15
16
|
super
|
16
17
|
end
|
17
|
-
|
18
|
-
# def path_and_parents(path)
|
19
|
-
# paths = super
|
20
|
-
# paths.detect { |path| path.gsub!(/(#{Section.types.map(&:tableize).join('|')})$/) { 'sections' } }
|
21
|
-
# paths
|
22
|
-
# end
|
23
18
|
end
|
24
|
-
end
|
19
|
+
end
|
data/config/locales/en.yml
CHANGED
@@ -1,20 +1,49 @@
|
|
1
1
|
en:
|
2
2
|
a_or_b: '%{a} or %{b}'
|
3
|
+
|
3
4
|
flash:
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
alert: '%{resource_name} could not be deleted.'
|
5
|
+
create:
|
6
|
+
notice: '%{resource_name} successfully created.'
|
7
|
+
alert: '%{resource_name} could not be created.'
|
8
|
+
update:
|
9
|
+
notice: '%{resource_name} successfully updated.'
|
10
|
+
alert: '%{resource_name} could not be updated.'
|
11
|
+
destroy:
|
12
|
+
notice: '%{resource_name} successfully deleted.'
|
13
|
+
alert: '%{resource_name} could not be deleted.'
|
14
14
|
installation:
|
15
15
|
protected: "Installation for %{host} is already complete. Please log in with your admin account."
|
16
|
-
|
17
|
-
|
16
|
+
|
17
|
+
confirmations:
|
18
|
+
destroy: 'Do you really want to delete this %{model_name}?'
|
19
|
+
|
20
|
+
menu:
|
21
|
+
sections: Sections
|
22
|
+
page: Page
|
23
|
+
view: View
|
24
|
+
new: New
|
25
|
+
edit: Edit
|
26
|
+
edit_section: Settings
|
27
|
+
destroy: Delete
|
28
|
+
reorder: Reorder
|
29
|
+
confirm_destroy: "Do you really want to delete this %{model_name}?"
|
30
|
+
|
31
|
+
columns:
|
32
|
+
published: Published
|
33
|
+
author: Author
|
34
|
+
|
35
|
+
status:
|
36
|
+
published: Published
|
37
|
+
|
38
|
+
actions:
|
39
|
+
view: View
|
40
|
+
edit: Edit
|
41
|
+
destroy: Delete
|
42
|
+
|
43
|
+
section:
|
44
|
+
types:
|
45
|
+
page: Page
|
46
|
+
default_name: Home
|
18
47
|
|
19
48
|
installations:
|
20
49
|
new:
|
@@ -29,11 +58,6 @@ en:
|
|
29
58
|
confirm: You have successfully created your site. Enjoy!
|
30
59
|
link_to_admin: "Manage your new site »"
|
31
60
|
|
32
|
-
sections:
|
33
|
-
columns:
|
34
|
-
section: Section
|
35
|
-
actions: ""
|
36
|
-
|
37
61
|
admin:
|
38
62
|
sites:
|
39
63
|
index:
|
@@ -48,48 +72,21 @@ en:
|
|
48
72
|
new: New Section
|
49
73
|
site:
|
50
74
|
new: New Site
|
51
|
-
sections: All Sections
|
52
|
-
menu:
|
53
|
-
new: New Site
|
54
|
-
edit: Edit
|
55
|
-
destroy: Delete
|
56
|
-
new_item: New Section
|
57
|
-
confirm_destroy: "Do you really want to delete this %{model_name}?"
|
58
75
|
sections:
|
59
76
|
index:
|
60
77
|
title: Sections
|
61
|
-
view: View
|
62
|
-
edit: Edit
|
63
|
-
destroy: Delete
|
64
78
|
published: Published
|
65
|
-
confirm_destroy: "Do you really want to delete this %{model_name}?"
|
66
79
|
new:
|
67
80
|
title: Create a New Section
|
68
|
-
show:
|
69
|
-
title: Settings
|
70
|
-
menu:
|
71
|
-
sections: Sections
|
72
|
-
new: New
|
73
|
-
reorder: Reorder
|
74
81
|
pages:
|
75
82
|
show:
|
76
83
|
title: Edit Page
|
77
84
|
new:
|
78
85
|
title: Create a New Section
|
79
|
-
menu:
|
80
|
-
sections: Sections
|
81
|
-
new: New
|
82
|
-
show: Page
|
83
|
-
view: View
|
84
|
-
destroy: Delete
|
85
|
-
confirm_destroy: "Do you really want to delete this %{model_name}?"
|
86
|
-
posts:
|
87
|
-
edit:
|
88
|
-
title: Settings
|
89
|
-
|
90
86
|
tabs:
|
91
87
|
options: Options
|
92
88
|
assets: Assets
|
89
|
+
|
93
90
|
layouts:
|
94
91
|
default:
|
95
92
|
made_with: "Made with <a href=\"http://github.com/svenfuchs/adva-cms2\">adva cms 2</a>"
|
@@ -108,11 +105,6 @@ en:
|
|
108
105
|
change_language: "Change language:"
|
109
106
|
website: "Website »"
|
110
107
|
|
111
|
-
section:
|
112
|
-
types:
|
113
|
-
page: Page
|
114
|
-
default_name: Home
|
115
|
-
|
116
108
|
simple_form:
|
117
109
|
"yes": 'Yes'
|
118
110
|
"no": 'No'
|
data/lib/adva/core.rb
CHANGED
@@ -10,14 +10,15 @@ require 'has_many_polymorphs'
|
|
10
10
|
require 'minimal'
|
11
11
|
require 'silence_log_tailer'
|
12
12
|
|
13
|
-
require '
|
13
|
+
require 'adva/i18n'
|
14
14
|
require 'adva/routing_filters/section_path'
|
15
15
|
require 'adva/routing_filters/section_root'
|
16
16
|
require 'adva/controller/abstract_actions'
|
17
17
|
require 'adva/controller/references'
|
18
18
|
require 'adva/active_record/has_options'
|
19
|
-
require 'adva/view/tabs'
|
20
19
|
require 'adva/view/form'
|
20
|
+
require 'adva/view/helper/i18n'
|
21
|
+
require 'adva/view/tabs'
|
21
22
|
|
22
23
|
require 'core_ext/ruby/module/include_anonymous'
|
23
24
|
require 'core_ext/rails/action_view/has_many_through_collection_helpers'
|
data/lib/adva/i18n.rb
ADDED
@@ -0,0 +1,73 @@
|
|
1
|
+
require 'i18n/exceptions'
|
2
|
+
|
3
|
+
I18n.module_eval do
|
4
|
+
self.exception_handler = :log_missing_translations
|
5
|
+
|
6
|
+
class << self
|
7
|
+
attr_writer :missing_translations
|
8
|
+
|
9
|
+
def missing_translations
|
10
|
+
@missing_translations ||= MemoryLogger.new
|
11
|
+
end
|
12
|
+
|
13
|
+
def log_missing_translations(exception, locale, key, options)
|
14
|
+
missing_translations.log(exception.keys) if I18n::MissingTranslationData === exception
|
15
|
+
default_exception_handler(exception, locale, key, options)
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
class MemoryLogger < Hash
|
20
|
+
def initialize
|
21
|
+
at_exit { dump } if Rails.env.test?
|
22
|
+
end
|
23
|
+
|
24
|
+
def log(keys)
|
25
|
+
log = self
|
26
|
+
keys.each_with_index do |key, ix|
|
27
|
+
key = key.to_s
|
28
|
+
if ix < keys.size - 1
|
29
|
+
log = log.key?(key) ? log[key] : (log[key] = {})
|
30
|
+
else
|
31
|
+
log[key] = key.to_s.titleize
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
def dump
|
37
|
+
require 'yaml'
|
38
|
+
puts YAML.dump(Hash[*to_a.flatten]) unless empty?
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
# TODO move to I18n
|
44
|
+
I18n.module_eval do
|
45
|
+
class << self
|
46
|
+
def handle_exception(exception, locale, key, options)
|
47
|
+
case handler = options[:exception_handler] || config.exception_handler
|
48
|
+
when Symbol
|
49
|
+
send(handler, exception, locale, key, options)
|
50
|
+
else
|
51
|
+
handler.call(exception, locale, key, options)
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
def wrap_exception(exception, locale, key, options)
|
56
|
+
case exception
|
57
|
+
when MissingTranslationData
|
58
|
+
%(<span class="translation_missing">#{exception.keys.join('.')}</span>)
|
59
|
+
else
|
60
|
+
raise exception
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
I18n::MissingTranslationData.class_eval do
|
67
|
+
def keys
|
68
|
+
options.each { |k, v| options[k] = v.inspect if v.is_a?(Proc) }
|
69
|
+
keys = I18n.normalize_keys(locale, key, options[:scope])
|
70
|
+
keys << 'no key' if keys.size < 2
|
71
|
+
keys
|
72
|
+
end
|
73
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
I18n::Backend::Simple.send(:include, I18n::Backend::Cascade)
|
2
|
+
|
3
|
+
# TODO no idea how to use a module here :/
|
4
|
+
ActionView::Base.class_eval do
|
5
|
+
def translate(key, options = {})
|
6
|
+
# TODO must be fixed in I18n::Backend::Cascade
|
7
|
+
options.merge!(:cascade => { :step => 1, :offset => 2, :skip_root => false }) if key.to_s.include?('.')
|
8
|
+
super(key, options)
|
9
|
+
end
|
10
|
+
alias t translate
|
11
|
+
end
|
12
|
+
|
13
|
+
# TODO submit a Rails patch
|
14
|
+
ActionView::Helpers::TranslationHelper.module_eval do
|
15
|
+
def translate(key, options = {})
|
16
|
+
options.merge!(:wrap_exception => true) unless options.key?(:wrap_exception)
|
17
|
+
translation = I18n.translate(scope_key_by_partial(key), options)
|
18
|
+
if html_safe_translation_key?(key) && translation.respond_to?(:html_safe)
|
19
|
+
translation.html_safe
|
20
|
+
else
|
21
|
+
translation
|
22
|
+
end
|
23
|
+
end
|
24
|
+
alias :t :translate
|
25
|
+
end
|
26
|
+
|
data/lib/adva/view/menu.rb
CHANGED
@@ -2,25 +2,47 @@ module Adva
|
|
2
2
|
module View
|
3
3
|
class Menu < Minimal::Template
|
4
4
|
autoload :Admin, 'adva/view/menu/admin'
|
5
|
+
autoload :Items, 'adva/view/menu/items'
|
6
|
+
|
7
|
+
def to_html
|
8
|
+
build
|
9
|
+
render_items
|
10
|
+
end
|
5
11
|
|
6
12
|
def item(text, url = nil, options = {}, &block)
|
7
|
-
|
8
|
-
url = url_for(url) unless url.is_a?(String)
|
9
|
-
li(:class => active?(url, options) ? 'active' : nil) do
|
10
|
-
options[:type] == :label ? h4(text, options) : link_to(text, url, options)
|
11
|
-
self << capture { instance_eval(&block) } if block_given?
|
12
|
-
end
|
13
|
+
items.insert(text, url, options, block)
|
13
14
|
end
|
14
15
|
|
15
16
|
def label(text, url = nil, options = {}, &block)
|
16
17
|
item(text, url, options.merge(:type => :label), &block)
|
17
18
|
end
|
18
19
|
|
19
|
-
def link(text, url = '#', options = {}, &block)
|
20
|
-
item(text, url, options.merge(:type => :link), &block)
|
21
|
-
end
|
22
|
-
|
23
20
|
protected
|
21
|
+
def items
|
22
|
+
@items ||= Items.new
|
23
|
+
end
|
24
|
+
|
25
|
+
def render_items
|
26
|
+
items, @items = self.items, Items.new
|
27
|
+
items.each { |args| render_item(*args) }
|
28
|
+
end
|
29
|
+
|
30
|
+
def render_item(text, url, options, block)
|
31
|
+
options.merge!(:class => text.to_s.split('.').last) if text.is_a?(Symbol)
|
32
|
+
url = url_for(url) unless url.is_a?(String) || options[:type] == :label
|
33
|
+
|
34
|
+
li(:class => active?(url, options) ? 'active' : nil) do
|
35
|
+
options[:type] == :label ? h4(text, options) : link_to(text, url, options)
|
36
|
+
render_block(block) if block
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
def render_block(block)
|
41
|
+
self << capture do
|
42
|
+
instance_eval(&block)
|
43
|
+
render_items
|
44
|
+
end
|
45
|
+
end
|
24
46
|
|
25
47
|
def name
|
26
48
|
@name ||= self.class.name.demodulize.underscore
|
data/lib/adva/view/menu/admin.rb
CHANGED
@@ -12,18 +12,16 @@ module Adva
|
|
12
12
|
id :actions
|
13
13
|
end
|
14
14
|
|
15
|
-
def
|
15
|
+
def build
|
16
16
|
div :id => id, :class => 'menus' do
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
ul :class => 'menu right' do
|
26
|
-
right
|
17
|
+
ul :class => 'menu main' do
|
18
|
+
main
|
19
|
+
render_items
|
20
|
+
end
|
21
|
+
ul :class => 'menu right' do
|
22
|
+
right
|
23
|
+
render_items
|
24
|
+
end
|
27
25
|
end
|
28
26
|
end
|
29
27
|
|
@@ -39,9 +37,63 @@ module Adva
|
|
39
37
|
self.class.read_inheritable_attribute(:id)
|
40
38
|
end
|
41
39
|
|
40
|
+
def resource_label
|
41
|
+
label("#{resource.name}:")
|
42
|
+
end
|
43
|
+
|
44
|
+
def resource_section_label
|
45
|
+
label("#{resource.section.name}:")
|
46
|
+
end
|
47
|
+
|
48
|
+
def parent_resource_label
|
49
|
+
label("#{parent_resource.name}:")
|
50
|
+
end
|
51
|
+
|
52
|
+
def index
|
53
|
+
item(:".#{resource.class.name.pluralize.underscore}", index_path)
|
54
|
+
end
|
55
|
+
|
56
|
+
def show
|
57
|
+
item(:".#{resource.class.name.underscore}", show_path)
|
58
|
+
end
|
59
|
+
|
60
|
+
def edit
|
61
|
+
item(:'.edit', edit_path)
|
62
|
+
end
|
63
|
+
|
64
|
+
def edit_parent
|
65
|
+
item(:".edit_#{parent_resource.class.base_class.name.underscore}", edit_parent_path)
|
66
|
+
end
|
67
|
+
|
68
|
+
def categories(url = nil, options = { :before => :'.edit_section' })
|
69
|
+
item(:'.categories', url || index_path(:categories), options)
|
70
|
+
end
|
71
|
+
|
72
|
+
def new
|
73
|
+
item(:'.new', new_path)
|
74
|
+
end
|
75
|
+
|
76
|
+
def reorder(options = {})
|
77
|
+
item(:'.reorder', index_path, options.merge(:activate => false))
|
78
|
+
end
|
79
|
+
|
80
|
+
def destroy
|
81
|
+
item(:'.destroy', resource_path, :method => :delete, :confirm => t(:'.confirm_destroy', :model_name => resource.class.model_name.human))
|
82
|
+
end
|
83
|
+
|
42
84
|
def persisted?
|
43
85
|
resource.try(:persisted?)
|
44
86
|
end
|
87
|
+
|
88
|
+
def collection?
|
89
|
+
index? || new? || create?
|
90
|
+
end
|
91
|
+
|
92
|
+
%w(index show new create edit update).each do |action|
|
93
|
+
define_method(:"#{action}?") do
|
94
|
+
params[:action] == action
|
95
|
+
end
|
96
|
+
end
|
45
97
|
end
|
46
98
|
end
|
47
99
|
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
module Adva
|
2
|
+
module View
|
3
|
+
class Menu
|
4
|
+
class Items < Array
|
5
|
+
def insert(text, url, options, block)
|
6
|
+
item = [text, url, options, block]
|
7
|
+
if ix = options.delete(:at)
|
8
|
+
super(ix, item)
|
9
|
+
elsif ix = index(options.delete(:before))
|
10
|
+
super(ix, item)
|
11
|
+
elsif ix = index(options.delete(:after))
|
12
|
+
super(ix + 1, item)
|
13
|
+
elsif ix = index(options.delete(:replace))
|
14
|
+
self[ix] = item
|
15
|
+
else
|
16
|
+
push(item)
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
def index(text)
|
21
|
+
each_with_index { |item, ix| return ix if item[0] == text } and nil
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
require 'responders/flash_responder'
|
2
|
+
|
3
|
+
Responders::FlashResponder.class_eval do
|
4
|
+
def flash_defaults_by_namespace(status)
|
5
|
+
defaults = []
|
6
|
+
slices = controller.controller_path.split('/')
|
7
|
+
|
8
|
+
while slices.size > 0
|
9
|
+
defaults << :"flash.#{slices.fill(controller.controller_name, -1).join('.')}.#{controller.action_name}.#{status}"
|
10
|
+
defaults << :"flash.#{slices.join('.')}.#{controller.action_name}.#{status}"
|
11
|
+
slices.shift
|
12
|
+
end
|
13
|
+
|
14
|
+
defaults << :"flash.#{controller.action_name}.#{status}"
|
15
|
+
defaults.uniq << ""
|
16
|
+
end
|
17
|
+
end
|
@@ -14,11 +14,18 @@ objectify = lambda do |table|
|
|
14
14
|
table.transpose
|
15
15
|
end
|
16
16
|
|
17
|
+
TRANSFORM_FOREIGN_KEY_TYPES = Section.types.map(&:underscore) << 'section' << 'site'
|
18
|
+
TRANSFORM_FOREIGN_KEY_MAP = {}
|
19
|
+
|
17
20
|
foreign_keyify = lambda do |table|
|
18
|
-
|
19
|
-
keys = types.map { |type| "#{type}_id" }
|
21
|
+
keys = TRANSFORM_FOREIGN_KEY_TYPES.map { |type| "#{type}_id" }
|
20
22
|
keys = table.headers.select { |header| keys.include?(header) }
|
21
|
-
keys.each
|
23
|
+
keys.each do |key|
|
24
|
+
table.map_column!(key) do |value|
|
25
|
+
klass = TRANSFORM_FOREIGN_KEY_MAP[key] || key.gsub('_id', '').classify.constantize
|
26
|
+
Array(klass.find_by_name(value)).first.try(:id).to_s
|
27
|
+
end
|
28
|
+
end
|
22
29
|
table.transpose
|
23
30
|
end
|
24
31
|
|
@@ -5,7 +5,8 @@ $(document).ready(function() {
|
|
5
5
|
|
6
6
|
$('a.reorder').click(function(event) {
|
7
7
|
$(this).parent().toggleClass('active');
|
8
|
-
|
8
|
+
var url = this.href.split('/').slice(0, -1).join('/');
|
9
|
+
TableTree.toggle($('table.list'), $(this).attr('data-resource_type'), $(this).attr('data-sortable_type'), url);
|
9
10
|
event.preventDefault();
|
10
11
|
return false;
|
11
12
|
})
|
@@ -23,12 +23,12 @@ TableTree = {
|
|
23
23
|
return $(row).ttnode() ? true : false;
|
24
24
|
}
|
25
25
|
},
|
26
|
-
toggle: function(table, resource_type, sortable_type,
|
27
|
-
TableTree.current_table ? TableTree.teardown(table) : TableTree.setup(table, resource_type, sortable_type,
|
26
|
+
toggle: function(table, resource_type, sortable_type, remote_url) {
|
27
|
+
TableTree.current_table ? TableTree.teardown(table) : TableTree.setup(table, resource_type, sortable_type, remote_url);
|
28
28
|
},
|
29
|
-
setup: function(table, resource_type, sortable_type,
|
29
|
+
setup: function(table, resource_type, sortable_type, remote_url) {
|
30
30
|
$('tbody', table).tableDnD(TableTree.tableDnDOptions);
|
31
|
-
TableTree.current_table = new TableTree.Table($(table).get(0), resource_type, sortable_type,
|
31
|
+
TableTree.current_table = new TableTree.Table($(table).get(0), resource_type, sortable_type, remote_url);
|
32
32
|
TableTree.current_table.setSortable();
|
33
33
|
},
|
34
34
|
teardown: function(table) {
|
@@ -54,13 +54,13 @@ TableTree = {
|
|
54
54
|
}
|
55
55
|
},
|
56
56
|
Base: function() {},
|
57
|
-
Table: function(table, resource_type, sortable_type,
|
57
|
+
Table: function(table, resource_type, sortable_type, remote_url) {
|
58
58
|
this.is_tree = $(table).hasClass('tree')
|
59
59
|
this.table = table; //$('tbody', table)
|
60
60
|
this.resource_type = resource_type;
|
61
61
|
this.sortable_type = sortable_type;
|
62
62
|
this.level = -1;
|
63
|
-
this.
|
63
|
+
this.remote_url = remote_url;
|
64
64
|
this.rebuild();
|
65
65
|
},
|
66
66
|
Node: function(parent, element, level) {
|
@@ -156,7 +156,8 @@ TableTree.Table.prototype = jQuery.extend(new TableTree.Base(), {
|
|
156
156
|
this.show_spinner(row);
|
157
157
|
$.ajax({
|
158
158
|
type: "POST",
|
159
|
-
url: this.
|
159
|
+
url: this.remote_url,
|
160
|
+
dataType: 'json',
|
160
161
|
data: jQuery.extend(this.serialize(row), { authenticity_token: window._auth_token, '_method': 'put' }),
|
161
162
|
success: function(msg) { _this.hide_spinner(row); },
|
162
163
|
error: function(msg) { _this.hide_spinner(row); }
|
@@ -167,13 +168,13 @@ TableTree.Table.prototype = jQuery.extend(new TableTree.Base(), {
|
|
167
168
|
var data = {};
|
168
169
|
var key = this.resource_type + '[' + this.sortable_type + '_attributes][0]'
|
169
170
|
data[key + '[id]'] = row.id() || '';
|
170
|
-
data[key + '[parent_id]'] = row.parent_id() || '';
|
171
|
-
data[key + '[left_id]'] = row.left_id() || '';
|
171
|
+
data[key + '[parent_id]'] = row.parent_id() || 'null';
|
172
|
+
data[key + '[left_id]'] = row.left_id() || 'null';
|
172
173
|
return data;
|
173
174
|
},
|
174
175
|
show_spinner: function(row) {
|
175
176
|
img = document.createElement('img');
|
176
|
-
img.src = '/images/
|
177
|
+
img.src = '/images/adva-core/indicator.gif';
|
177
178
|
img.className = 'spinner';
|
178
179
|
$('td', row)[0].appendChild(img);
|
179
180
|
},
|
@@ -257,12 +258,15 @@ TableTree.Node.prototype = jQuery.extend(new TableTree.Base(), {
|
|
257
258
|
|
258
259
|
this.level = level;
|
259
260
|
this.children.each(function() { this.update_level(event, level + 1); });
|
261
|
+
|
262
|
+
TableTree.current_table.dirty = true;
|
260
263
|
},
|
261
264
|
adjust_level: function() {
|
262
265
|
var prev = $(this.element).prev().ttnode();
|
263
266
|
if(!prev) {
|
264
267
|
this.update_level(null, 0);
|
265
268
|
} else if(prev.level + 1 < this.level) {
|
269
|
+
// } else {
|
266
270
|
this.update_level(null, prev.level + 1);
|
267
271
|
}
|
268
272
|
},
|
@@ -121,6 +121,14 @@ p.active a {
|
|
121
121
|
-moz-border-radius:4px 4px 4px 4px;
|
122
122
|
}
|
123
123
|
|
124
|
+
.tree .drag {
|
125
|
+
background-color: lightyellow;
|
126
|
+
}
|
127
|
+
.tree .spinner {
|
128
|
+
float: right;
|
129
|
+
padding-top: 2px;
|
130
|
+
}
|
131
|
+
|
124
132
|
/* TODO move to adva-assets */
|
125
133
|
|
126
134
|
ul#uploaded_images {
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: adva-core
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 27
|
5
5
|
prerelease: false
|
6
6
|
segments:
|
7
7
|
- 0
|
8
8
|
- 0
|
9
|
-
-
|
10
|
-
version: 0.0.
|
9
|
+
- 2
|
10
|
+
version: 0.0.2
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Ingo Weiss
|
@@ -16,7 +16,7 @@ autorequire:
|
|
16
16
|
bindir: bin
|
17
17
|
cert_chain: []
|
18
18
|
|
19
|
-
date: 2010-
|
19
|
+
date: 2010-11-08 00:00:00 +01:00
|
20
20
|
default_executable:
|
21
21
|
dependencies:
|
22
22
|
- !ruby/object:Gem::Dependency
|
@@ -91,12 +91,12 @@ dependencies:
|
|
91
91
|
requirements:
|
92
92
|
- - "="
|
93
93
|
- !ruby/object:Gem::Version
|
94
|
-
hash:
|
94
|
+
hash: 3
|
95
95
|
segments:
|
96
96
|
- 0
|
97
97
|
- 0
|
98
|
-
-
|
99
|
-
version: 0.0.
|
98
|
+
- 14
|
99
|
+
version: 0.0.14
|
100
100
|
type: :runtime
|
101
101
|
version_requirements: *id005
|
102
102
|
- !ruby/object:Gem::Dependency
|
@@ -155,12 +155,12 @@ dependencies:
|
|
155
155
|
requirements:
|
156
156
|
- - "="
|
157
157
|
- !ruby/object:Gem::Version
|
158
|
-
hash:
|
158
|
+
hash: 11
|
159
159
|
segments:
|
160
160
|
- 0
|
161
161
|
- 0
|
162
|
-
-
|
163
|
-
version: 0.0.
|
162
|
+
- 10
|
163
|
+
version: 0.0.10
|
164
164
|
type: :runtime
|
165
165
|
version_requirements: *id009
|
166
166
|
- !ruby/object:Gem::Dependency
|
@@ -171,12 +171,12 @@ dependencies:
|
|
171
171
|
requirements:
|
172
172
|
- - "="
|
173
173
|
- !ruby/object:Gem::Version
|
174
|
-
hash:
|
174
|
+
hash: 57
|
175
175
|
segments:
|
176
176
|
- 0
|
177
177
|
- 0
|
178
|
-
-
|
179
|
-
version: 0.0.
|
178
|
+
- 19
|
179
|
+
version: 0.0.19
|
180
180
|
type: :runtime
|
181
181
|
version_requirements: *id010
|
182
182
|
- !ruby/object:Gem::Dependency
|
@@ -211,7 +211,7 @@ dependencies:
|
|
211
211
|
version: 0.0.1
|
212
212
|
type: :runtime
|
213
213
|
version_requirements: *id012
|
214
|
-
description:
|
214
|
+
description: Core engine for adva-cms2
|
215
215
|
email: nobody@adva-cms.org
|
216
216
|
executables: []
|
217
217
|
|
@@ -244,6 +244,7 @@ files:
|
|
244
244
|
- app/views/pages/show.html.rb
|
245
245
|
- app/views/installations/show.html.rb
|
246
246
|
- app/views/installations/new.html.rb
|
247
|
+
- app/views/admin/contents/_menu.html.rb
|
247
248
|
- app/views/admin/pages/show.html.rb
|
248
249
|
- app/views/admin/pages/new.html.rb
|
249
250
|
- app/views/admin/pages/_menu.html.rb
|
@@ -285,6 +286,7 @@ files:
|
|
285
286
|
- lib/patches/rails/url_for.rb
|
286
287
|
- lib/patches/rails/sti_associations.rb
|
287
288
|
- lib/patches/inherited_resources.rb
|
289
|
+
- lib/patches/responders/flash_responder.rb
|
288
290
|
- lib/patches/simple_form.rb
|
289
291
|
- lib/patches/thor/group/symbolized_options.rb
|
290
292
|
- lib/patches/thor/core_ext/hash.rb
|
@@ -318,6 +320,7 @@ files:
|
|
318
320
|
- lib/adva/active_record/has_options.rb
|
319
321
|
- lib/adva/rack/static.rb
|
320
322
|
- lib/adva/rack.rb
|
323
|
+
- lib/adva/i18n.rb
|
321
324
|
- lib/adva/view.rb
|
322
325
|
- lib/adva/testing/engine.rb
|
323
326
|
- lib/adva/responder.rb
|
@@ -325,8 +328,10 @@ files:
|
|
325
328
|
- lib/adva/routing_filters/section_path.rb
|
326
329
|
- lib/adva/view/tabs.rb
|
327
330
|
- lib/adva/view/menu/admin.rb
|
331
|
+
- lib/adva/view/menu/items.rb
|
328
332
|
- lib/adva/view/form.rb
|
329
333
|
- lib/adva/view/menu.rb
|
334
|
+
- lib/adva/view/helper/i18n.rb
|
330
335
|
- lib/adva/view/form/tabs.rb
|
331
336
|
- lib/adva/controller.rb
|
332
337
|
- lib/adva/engine.rb
|
@@ -341,6 +346,7 @@ files:
|
|
341
346
|
- lib/testing/factories.rb
|
342
347
|
- lib/testing/assertions.rb
|
343
348
|
- lib/testing/paths.rb
|
349
|
+
- lib/adva_core/version.rb
|
344
350
|
- public/stylesheets/adva-core/common/styles.css
|
345
351
|
- public/stylesheets/adva-core/common/layout.css
|
346
352
|
- public/stylesheets/adva-core/common/reset.css
|
@@ -481,13 +487,11 @@ files:
|
|
481
487
|
- public/images/adva-core/icons/bullet_yellow.png
|
482
488
|
- public/images/adva-core/icons/bullet_white.png
|
483
489
|
- public/images/adva-core/asset_selected.png
|
484
|
-
- public/images/adva-core/sortable_tree/drag.png
|
485
490
|
- public/images/adva-core/avatar.gif
|
486
491
|
- public/images/adva-core/lines.png
|
487
492
|
- public/images/adva-core/feed.mini.png
|
488
493
|
- public/images/adva-core/indicator.gif
|
489
494
|
- public/images/adva-core/preview.png
|
490
|
-
- public/images/adva-core/rails.png
|
491
495
|
- public/images/adva-core/admin/section_menu_bg.png
|
492
496
|
- public/images/adva-core/admin/tab_action_active.png
|
493
497
|
- public/images/adva-core/admin/tab_sidebar_active.png
|
@@ -531,6 +535,6 @@ rubyforge_project: "[none]"
|
|
531
535
|
rubygems_version: 1.3.7
|
532
536
|
signing_key:
|
533
537
|
specification_version: 3
|
534
|
-
summary:
|
538
|
+
summary: Core engine for adva-cms2
|
535
539
|
test_files: []
|
536
540
|
|
Binary file
|
Binary file
|