sunrise-cms 0.4.1 → 0.4.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/README.rdoc +50 -2
- data/app/assets/javascripts/sunrise/manage.js.coffee +18 -0
- data/app/assets/stylesheets/sunrise/customize.css +43 -0
- data/app/controllers/sunrise/dashboard_controller.rb +2 -1
- data/app/helpers/sunrise/manager_helper.rb +30 -0
- data/app/views/sunrise/manager/_field.html.erb +15 -1
- data/app/views/sunrise/manager/_nested_field.html.erb +4 -0
- data/config/locales/sunrise/en.yml +1 -0
- data/config/locales/sunrise/ru.yml +1 -0
- data/config/locales/sunrise/uk.yml +1 -0
- data/lib/sunrise/abstract_model.rb +3 -6
- data/lib/sunrise/config/field.rb +5 -1
- data/lib/sunrise/config/has_fields.rb +9 -0
- data/lib/sunrise/config/nested_field.rb +27 -0
- data/lib/sunrise/config.rb +1 -1
- data/lib/sunrise/models/settings.rb +4 -0
- data/lib/sunrise/version.rb +1 -1
- data/spec/dummy/log/test.log +2704 -0
- metadata +6 -4
data/README.rdoc
CHANGED
@@ -6,8 +6,7 @@ Open source mini content management system for programmers.
|
|
6
6
|
|
7
7
|
Create new project
|
8
8
|
|
9
|
-
rails new [PROJECT_NAME] -d mysql -T -m https://
|
10
|
-
|
9
|
+
rails new [PROJECT_NAME] -d mysql -T -m https://raw.github.com/gist/2700424
|
11
10
|
|
12
11
|
== Export data
|
13
12
|
|
@@ -28,4 +27,53 @@ For more info look at jbuilder https://rubygems.org/gems/jbuilder.
|
|
28
27
|
|
29
28
|
GET /manage/users/export.xlsx
|
30
29
|
|
30
|
+
== Usage
|
31
|
+
|
32
|
+
Just create class:
|
33
|
+
|
34
|
+
class SunriseProduct < Sunrise::AbstractModel
|
35
|
+
self.resource_name = "Product"
|
36
|
+
|
37
|
+
list :thumbs do
|
38
|
+
scope { Product.includes(:picture) }
|
39
|
+
preview { lambda { |product| product.picture.try(:url, :thumb) } }
|
40
|
+
|
41
|
+
field :title
|
42
|
+
field :price
|
43
|
+
field :total_stock
|
44
|
+
end
|
45
|
+
|
46
|
+
show do
|
47
|
+
field :title
|
48
|
+
field :price
|
49
|
+
field :total_stock
|
50
|
+
field :sort_order
|
51
|
+
field :is_visible
|
52
|
+
end
|
53
|
+
|
54
|
+
edit do
|
55
|
+
field :title
|
56
|
+
field :price
|
57
|
+
field :total_stock
|
58
|
+
field :notes
|
59
|
+
|
60
|
+
group :sidebar, :holder => :sidebar do
|
61
|
+
field :sale_limit_id, :collection => lambda { SaleLimit.all }, :include_blank => false
|
62
|
+
field :sort_order
|
63
|
+
field :is_visible, :boolean => true
|
64
|
+
end
|
65
|
+
|
66
|
+
group :bottom, :holder => :bottom do
|
67
|
+
nested_attributes :variants do
|
68
|
+
field :size
|
69
|
+
field :total_stock
|
70
|
+
field :item_model_id, :collection => lambda { ItemModel.all }, :include_blank => false
|
71
|
+
end
|
72
|
+
|
73
|
+
field :picture, :as => :uploader
|
74
|
+
end
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
|
31
79
|
Copyright (c) 2012 Fodojo, released under the MIT license
|
@@ -136,6 +136,24 @@ class Sunrise
|
|
136
136
|
else
|
137
137
|
return ret
|
138
138
|
|
139
|
+
insert_fields: (link, method, content) ->
|
140
|
+
new_id = new Date().getTime();
|
141
|
+
regexp = new RegExp("new_" + method, "g")
|
142
|
+
|
143
|
+
console.log link
|
144
|
+
|
145
|
+
$(link).parents("div.nested_bottom").before(content.replace(regexp, new_id))
|
146
|
+
|
147
|
+
remove_fields: (link) ->
|
148
|
+
hidden_field = $(link).prev("input[type=hidden]")
|
149
|
+
|
150
|
+
if hidden_field.length isnt 0
|
151
|
+
hidden_field.val('1')
|
152
|
+
|
153
|
+
console.log link
|
154
|
+
|
155
|
+
$(link).closest("div.nested_item").hide()
|
156
|
+
|
139
157
|
$(document).ready ->
|
140
158
|
window['sunrise'] ?= new Sunrise(window.location.pathname)
|
141
159
|
window['sunrise'].setup()
|
@@ -57,3 +57,46 @@ input[type="text"]:focus, input[type="password"]:focus, input[type="email"]:focu
|
|
57
57
|
.treeHolder li.ui-sortable-helper {
|
58
58
|
background: none;
|
59
59
|
}
|
60
|
+
|
61
|
+
/* Nested form */
|
62
|
+
.nested {
|
63
|
+
overflow: hidden;
|
64
|
+
background-color: #f5f5f5;
|
65
|
+
border: 1px solid #dbdbdb;
|
66
|
+
border-radius: 2px;
|
67
|
+
-moz-border-radius: 2px;
|
68
|
+
-webkit-box-shadow: 0px 0px 1px 1px #fff;
|
69
|
+
-moz-box-shadow: 0px 0px 1px 1px #fff;
|
70
|
+
box-shadow: 0px 0px 1px 1px #fff;
|
71
|
+
padding: 15px 0;
|
72
|
+
margin-bottom: 20px;
|
73
|
+
}
|
74
|
+
.nested .nested_item {
|
75
|
+
border-top: 1px solid #DBDBDB;
|
76
|
+
border-bottom: 1px solid #DBDBDB;
|
77
|
+
margin: 5px 0 -6px 0;
|
78
|
+
box-shadow: 0 0 1px 1px #FFFFFF;
|
79
|
+
padding: 15px 0 0px;
|
80
|
+
position: relative;
|
81
|
+
overflow: hidden;
|
82
|
+
}
|
83
|
+
.nested .nested_bottom {
|
84
|
+
margin-left: 20px;
|
85
|
+
margin-right: 20px;
|
86
|
+
margin-top: 20px;
|
87
|
+
clear: both;
|
88
|
+
}
|
89
|
+
.nested .nested_bottom .button {
|
90
|
+
display: inline-block;
|
91
|
+
}
|
92
|
+
.nested .padder {
|
93
|
+
margin-left: 20px;
|
94
|
+
margin-right: 20px;
|
95
|
+
float:left;
|
96
|
+
width:200px;
|
97
|
+
clear: none;
|
98
|
+
}
|
99
|
+
.nested .title-switcher {
|
100
|
+
float:none;
|
101
|
+
}
|
102
|
+
/* End nested form */
|
@@ -6,10 +6,11 @@ module Sunrise
|
|
6
6
|
|
7
7
|
def index
|
8
8
|
per_page = Sunrise::Config.audit_events_per_page
|
9
|
+
sort_mode = Sunrise::Config.default_sort_mode
|
9
10
|
cur_page = (params[:page] || 1).to_i
|
10
11
|
offset = (cur_page - 1) * per_page
|
11
12
|
|
12
|
-
@events = Audited.audit_class.includes(:user).limit(per_page).offset(offset)
|
13
|
+
@events = Audited.audit_class.includes(:user).limit(per_page).offset(offset).order("audits.id #{sort_mode}")
|
13
14
|
|
14
15
|
respond_with(@events) do |format|
|
15
16
|
format.html { render :layout => params[:time].blank? }
|
@@ -31,5 +31,35 @@ module Sunrise
|
|
31
31
|
item.to_s
|
32
32
|
end
|
33
33
|
end
|
34
|
+
|
35
|
+
def manage_remove_child_link(name, form, options = {})
|
36
|
+
options[:onclick] = h("sunrise.remove_fields(this);")
|
37
|
+
form.hidden_field(:_destroy) + link_to(name, "javascript:void(0);", options)
|
38
|
+
end
|
39
|
+
|
40
|
+
def manage_add_child_link(name, form, field, options={})
|
41
|
+
options.symbolize_keys!
|
42
|
+
|
43
|
+
method = field.name.to_sym
|
44
|
+
html_options = (options.delete(:html) || {})
|
45
|
+
fields = manage_new_child_fields(form, field, options)
|
46
|
+
|
47
|
+
html_options[:class] ||= "button"
|
48
|
+
html_options[:onclick] = h("sunrise.insert_fields(this, \"#{method}\", \"#{escape_javascript(fields)}\");")
|
49
|
+
|
50
|
+
link_to(name, "javascript:void(0);", html_options)
|
51
|
+
end
|
52
|
+
|
53
|
+
def manage_new_child_fields(form_builder, field, options = {})
|
54
|
+
method = field.name.to_sym
|
55
|
+
|
56
|
+
options[:object] ||= form_builder.object.class.reflect_on_association(method).klass.new
|
57
|
+
options[:partial] ||= method.to_s.singularize
|
58
|
+
options[:form_builder_local] ||= :form
|
59
|
+
|
60
|
+
form_builder.fields_for(method, options[:object], :child_index => "new_#{method}") do |f|
|
61
|
+
render(:partial => options[:partial], :locals => { options[:form_builder_local] => f, :field => field })
|
62
|
+
end
|
63
|
+
end
|
34
64
|
end
|
35
65
|
end
|
@@ -1,7 +1,21 @@
|
|
1
1
|
<% options ||= {} %>
|
2
2
|
<%= content_tag :div, field.html_options do %>
|
3
3
|
<% if field.visible?(form.object) -%>
|
4
|
-
<% if field.
|
4
|
+
<% if field.nested? -%>
|
5
|
+
<div class="nested">
|
6
|
+
<div class="title-switcher up"><%= form.label field.name %></div>
|
7
|
+
|
8
|
+
<%= form.simple_fields_for field.name.to_sym do |nested| %>
|
9
|
+
<%= render :partial => "nested_field", :locals => { :form => nested, :field => field } %>
|
10
|
+
<% end -%>
|
11
|
+
|
12
|
+
<% if field.multiply? %>
|
13
|
+
<div class="nested_bottom">
|
14
|
+
<%= manage_add_child_link t('manage.buttons.add_nested_field'), form, field, {:partial=>"nested_field"} %>
|
15
|
+
</div>
|
16
|
+
<% end -%>
|
17
|
+
</div>
|
18
|
+
<% elsif field.association? -%>
|
5
19
|
<%= form.association field.name.to_sym, field.input_options.merge(options) %>
|
6
20
|
<% else -%>
|
7
21
|
<%= form.input field.name, field.input_options.merge(options) %>
|
@@ -151,14 +151,11 @@ module Sunrise
|
|
151
151
|
model.update_all("#{@sort_column} = CASE id #{sql_case}", ["id IN (?)", ids.keys.map(&:to_i)])
|
152
152
|
end
|
153
153
|
|
154
|
-
# Initialize new model and
|
154
|
+
# Initialize new model, sets parent record and call build_defaults method
|
155
155
|
def build_record
|
156
156
|
record = model.new
|
157
|
-
|
158
|
-
if
|
159
|
-
record.send("#{parent_association.name}=", parent_record)
|
160
|
-
end
|
161
|
-
|
157
|
+
record.send("#{parent_association.name}=", parent_record) if parent_record
|
158
|
+
record.build_defaults if record.respond_to?(:build_defaults)
|
162
159
|
record
|
163
160
|
end
|
164
161
|
|
data/lib/sunrise/config/field.rb
CHANGED
@@ -4,7 +4,7 @@ module Sunrise
|
|
4
4
|
module Config
|
5
5
|
class Field < Base
|
6
6
|
include Sunrise::Utils::EvalHelpers
|
7
|
-
|
7
|
+
|
8
8
|
# The condition that must be met on an object
|
9
9
|
attr_reader :if_condition
|
10
10
|
|
@@ -46,6 +46,10 @@ module Sunrise
|
|
46
46
|
def label?
|
47
47
|
@config_options[:label] != false
|
48
48
|
end
|
49
|
+
|
50
|
+
def nested?
|
51
|
+
false
|
52
|
+
end
|
49
53
|
|
50
54
|
protected
|
51
55
|
|
@@ -1,4 +1,5 @@
|
|
1
1
|
require 'sunrise/config/field'
|
2
|
+
require 'sunrise/config/nested_field'
|
2
3
|
|
3
4
|
module Sunrise
|
4
5
|
module Config
|
@@ -15,6 +16,14 @@ module Sunrise
|
|
15
16
|
options = { :name => name.to_sym }.merge(options)
|
16
17
|
fields << Field.new(abstract_model, self, options)
|
17
18
|
end
|
19
|
+
|
20
|
+
# Defines a configuration for a nested attributes
|
21
|
+
def nested_attributes(name, options = {}, &block)
|
22
|
+
options = { :name => name.to_sym }.merge(options)
|
23
|
+
nested_field = NestedField.new(abstract_model, self, options)
|
24
|
+
nested_field.instance_eval &block if block
|
25
|
+
fields << nested_field
|
26
|
+
end
|
18
27
|
end
|
19
28
|
end
|
20
29
|
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
require 'sunrise/config/field'
|
2
|
+
|
3
|
+
module Sunrise
|
4
|
+
module Config
|
5
|
+
class NestedField < Field
|
6
|
+
|
7
|
+
# Array for store all defined fields
|
8
|
+
def fields
|
9
|
+
@fields ||= []
|
10
|
+
end
|
11
|
+
|
12
|
+
# Defines a configuration for a field.
|
13
|
+
def field(name, options = {})
|
14
|
+
options = { :name => name.to_sym }.merge(options)
|
15
|
+
fields << Field.new(abstract_model, self, options)
|
16
|
+
end
|
17
|
+
|
18
|
+
def nested?
|
19
|
+
true
|
20
|
+
end
|
21
|
+
|
22
|
+
def multiply?
|
23
|
+
@config_options[:multiply] != false
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
data/lib/sunrise/config.rb
CHANGED
@@ -12,7 +12,7 @@ module Sunrise
|
|
12
12
|
|
13
13
|
# By default show latest first
|
14
14
|
mattr_accessor :default_sort_mode
|
15
|
-
@@
|
15
|
+
@@default_sort_mode = :desc
|
16
16
|
|
17
17
|
# The display for a model instance (i.e. a single database record).
|
18
18
|
mattr_accessor :label_methods
|
data/lib/sunrise/version.rb
CHANGED