adva-core 0.0.1 → 0.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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
|