sunrise-cms 1.1.0 → 1.1.1
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.
- checksums.yaml +4 -4
- data/.gitignore +1 -0
- data/CHANGELOG.rdoc +8 -3
- data/Gemfile +5 -8
- data/README.md +6 -0
- data/Rakefile +1 -0
- data/app/assets/images/sunrise/icons/export.svg +4 -0
- data/app/assets/images/sunrise/icons/import.svg +5 -0
- data/app/assets/javascripts/sunrise/application.js +0 -1
- data/app/assets/javascripts/sunrise/jquery.dialog.js.coffee +113 -40
- data/app/assets/javascripts/sunrise/jquery.editable.js.coffee +21 -21
- data/app/assets/javascripts/sunrise/manage.js.coffee +29 -28
- data/app/assets/stylesheets/sunrise/application.css +0 -1
- data/app/assets/stylesheets/sunrise/customize.css +7 -4
- data/app/assets/stylesheets/sunrise/main.css +883 -606
- data/app/controllers/sunrise/manager_controller.rb +42 -3
- data/app/views/layouts/sunrise/application.html.erb +7 -6
- data/app/views/sunrise/manager/buttons/_export.html.erb +9 -2
- data/app/views/sunrise/manager/buttons/_import.html.erb +25 -0
- data/app/views/sunrise/manager/buttons/_sort.html.erb +3 -3
- data/app/views/sunrise/manager/tree/index.html.erb +1 -1
- data/config/routes.rb +1 -0
- data/lib/sunrise/abstract_model.rb +3 -3
- data/lib/sunrise/config/model.rb +4 -0
- data/lib/sunrise/engine.rb +6 -0
- data/lib/sunrise/models/ability.rb +7 -7
- data/lib/sunrise/version.rb +1 -1
- data/sunrise-cms.gemspec +1 -3
- metadata +6 -31
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: '098ce642eeaa4b3b99e038cac5afe914c4fec9c8e5a89a74454f2fa3bc0e8505'
|
4
|
+
data.tar.gz: accfeff359f7db91dee2ad3b186f7b1b93130d6c8e0f716c4e689d32963d9760
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d2560918f0f7f7103a48b27b4afc7f753effa7757054f2d1cb8a3f6e3964c987a7183a0f78a43c4950358f9131c0c895160e1b11f0278417ac2cbce622f8711d
|
7
|
+
data.tar.gz: '082d6d8027a20ace581d6a1008fe13981ff25198997dd5689383ba09b4ae319ec08db84ee7ccab75d9400a072812da9328dc94c428617af5e38e053a2d98e8ca'
|
data/.gitignore
CHANGED
data/CHANGELOG.rdoc
CHANGED
@@ -1,9 +1,14 @@
|
|
1
|
+
== 1.1.1
|
2
|
+
* Update code to be compatible with rails 5.x
|
3
|
+
* Import for records functional
|
4
|
+
* Remove select2 dependecy
|
5
|
+
|
1
6
|
== 1.0.5
|
2
7
|
* Update jQuery UI
|
3
8
|
|
4
9
|
== 1.0.3
|
5
10
|
* Fix parents relations
|
6
|
-
|
11
|
+
|
7
12
|
== 1.0.2
|
8
13
|
* Use select2
|
9
14
|
* Remove chosen
|
@@ -63,10 +68,10 @@
|
|
63
68
|
* Replace paperclip with carrierwave
|
64
69
|
* New model filter logic
|
65
70
|
|
66
|
-
* Scaffold
|
71
|
+
* Scaffold
|
67
72
|
* Generate spec tests for controllers
|
68
73
|
* Apply new model filter logic
|
69
|
-
|
74
|
+
|
70
75
|
== 0.1.5
|
71
76
|
* Core
|
72
77
|
* Export users to csv
|
data/Gemfile
CHANGED
@@ -20,18 +20,22 @@ gem 'galetahub-enum_field', '~> 0.4.0'
|
|
20
20
|
gem 'rails-settings-cached', '~> 0.4.0'
|
21
21
|
gem 'rails-uploader', '~> 0.3.4'
|
22
22
|
|
23
|
+
gem 'sprockets', '>= 3.0.0', '< 4.0.0'
|
24
|
+
|
23
25
|
# Gems used only for assets and not required
|
24
26
|
# in production environments by default.
|
25
27
|
group :assets do
|
26
28
|
gem 'coffee-rails'
|
27
29
|
gem 'sass-rails'
|
30
|
+
gem 'sass'
|
28
31
|
|
29
32
|
gem 'libv8', '~> 3.11.8.4', platforms: :ruby
|
30
|
-
gem 'therubyracer', platforms: :ruby
|
31
33
|
gem 'uglifier', '>= 1.0.3'
|
34
|
+
# gem 'therubyracer', platforms: :ruby
|
32
35
|
end
|
33
36
|
|
34
37
|
group :development, :test do
|
38
|
+
gem 'byebug'
|
35
39
|
gem 'fuubar'
|
36
40
|
gem 'generator_spec', '~> 0.9.4'
|
37
41
|
gem 'launchy'
|
@@ -43,10 +47,3 @@ group :active_record do
|
|
43
47
|
gem 'awesome_nested_set'
|
44
48
|
gem 'pg', '~> 0.15'
|
45
49
|
end
|
46
|
-
|
47
|
-
# group :mongoid do
|
48
|
-
# gem 'bson_ext'
|
49
|
-
# gem 'carrierwave-mongoid', require: 'carrierwave/mongoid'
|
50
|
-
# gem 'mongoid', '~> 4.0.2'
|
51
|
-
# gem 'mongoid_nested_set', '>= 0.2.1'
|
52
|
-
# end
|
data/README.md
CHANGED
data/Rakefile
CHANGED
@@ -0,0 +1,4 @@
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
2
|
+
<svg id="i-export" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32" fill="none" stroke="#000000" stroke-linecap="round" stroke-linejoin="round" stroke-width="2">
|
3
|
+
<path d="M28 22 L28 30 4 30 4 22 M16 4 L16 24 M8 12 L16 4 24 12" />
|
4
|
+
</svg>
|
@@ -7,130 +7,203 @@ $.fn.extend({
|
|
7
7
|
)
|
8
8
|
})
|
9
9
|
|
10
|
+
$.fn.extend({
|
11
|
+
import_dialog: (options) ->
|
12
|
+
$(this).each((input_field) ->
|
13
|
+
new ImportDialog(this, options) unless ($ this).hasClass "dialog-init"
|
14
|
+
)
|
15
|
+
})
|
16
|
+
|
10
17
|
class Dialog
|
11
|
-
constructor: (@form_field, options = {}) ->
|
18
|
+
constructor: (@form_field, options = {}) ->
|
12
19
|
defaults =
|
13
20
|
shadow_field: "#dark-shadow"
|
14
21
|
dialog_class: "sunrise-dialog"
|
15
|
-
|
22
|
+
|
16
23
|
@options = $.extend defaults, options
|
17
|
-
|
24
|
+
|
18
25
|
this.setup()
|
19
26
|
this.register_observers()
|
20
|
-
|
27
|
+
|
21
28
|
setup: ->
|
22
29
|
dom_id = this.generate_random_id()
|
23
30
|
@element = $ @form_field
|
24
|
-
|
31
|
+
|
25
32
|
@shadow = $ @options.shadow_field
|
26
33
|
@container = $ '<div/>', { id: dom_id, class: @options.dialog_class }
|
27
|
-
@container.hide()
|
34
|
+
@container.hide()
|
28
35
|
@shadow.after @container
|
29
|
-
|
36
|
+
|
30
37
|
@element.addClass "dialog-init"
|
31
|
-
|
38
|
+
|
32
39
|
register_observers: ->
|
33
40
|
@shadow.bind 'click', (evt) => this.hide()
|
34
|
-
@element.bind 'click', (evt) =>
|
41
|
+
@element.bind 'click', (evt) =>
|
35
42
|
this.show()
|
36
43
|
false
|
37
|
-
|
44
|
+
|
38
45
|
show: ->
|
39
46
|
wnd = $(window)
|
40
47
|
body = $('body')
|
41
|
-
|
48
|
+
|
42
49
|
height = if body.innerHeight() > wnd.innerHeight() then body.innerHeight() else wnd.innerHeight()
|
43
50
|
@shadow.css 'height', height + 'px'
|
44
51
|
@container.css 'left', ($(window).innerWidth() - @container.innerWidth()) / 2 + 'px'
|
45
|
-
|
52
|
+
|
46
53
|
@shadow.show()
|
47
54
|
@container.show()
|
48
|
-
|
55
|
+
|
49
56
|
hide: ->
|
50
57
|
@shadow.hide()
|
51
58
|
@container.hide()
|
52
|
-
|
59
|
+
|
53
60
|
generate_random_id: ->
|
54
61
|
string = "dlg_" + this.generate_random_char() + this.generate_random_char() + this.generate_random_char()
|
55
62
|
while $("#" + string).length > 0
|
56
63
|
string += this.generate_random_char()
|
57
64
|
string
|
58
|
-
|
65
|
+
|
59
66
|
generate_random_char: ->
|
60
67
|
chars = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXTZ"
|
61
68
|
rand = Math.floor(Math.random() * chars.length)
|
62
69
|
newchar = chars.substring rand, rand+1
|
63
|
-
|
64
|
-
|
70
|
+
|
71
|
+
# SORT
|
65
72
|
class SortDialog extends Dialog
|
66
|
-
|
73
|
+
|
67
74
|
setup: ->
|
68
75
|
super
|
69
|
-
|
76
|
+
|
70
77
|
@container.addClass 'sort-wrapper'
|
71
|
-
|
78
|
+
|
72
79
|
title = $('<div/>', { class: 'sort-title' })
|
73
80
|
title.text(@element.attr 'title')
|
74
|
-
|
81
|
+
|
75
82
|
buttons_holder = $ '<div/>', { class: 'sort-buts-holder' }
|
76
83
|
@save_button = $ '<input/>', { type: 'submit', value: @element.data('save_title'), class: 'button', disabled: 'disabled'}
|
77
84
|
@cancel_button = $ '<input/>', { type: 'submit', value: @element.data('cancel_title'), class: 'button gray'}
|
78
|
-
|
85
|
+
|
79
86
|
buttons_holder.append(@save_button).append(@cancel_button)
|
80
87
|
title_holder = $ '<div/>', { class: 'sort-title-holder' }
|
81
88
|
title_holder.append(title).append(buttons_holder)
|
82
|
-
|
89
|
+
|
83
90
|
items_container = $ '<div/>', { class: 'sort-items-holder', id: 'sort_items' }
|
84
|
-
|
91
|
+
|
85
92
|
@container.append(title_holder).append(items_container)
|
86
|
-
|
93
|
+
|
87
94
|
register_observers: ->
|
88
95
|
super
|
89
|
-
|
96
|
+
|
90
97
|
@cancel_button.bind 'click', (evt) => this.hide()
|
91
98
|
@save_button.bind 'click', (evt) => this.save(evt)
|
92
|
-
|
99
|
+
|
93
100
|
show: ->
|
94
101
|
super
|
95
|
-
this.load_data()
|
96
|
-
|
102
|
+
this.load_data()
|
103
|
+
|
97
104
|
save: ->
|
98
105
|
items = {}
|
99
106
|
klass = this
|
100
|
-
|
107
|
+
|
101
108
|
$('.sort-item').each (index) ->
|
102
109
|
items['ids[' + $(this).data('record-id') + ']'] = index + 1
|
103
|
-
|
110
|
+
|
104
111
|
$.rails.ajax
|
105
112
|
url: @element.data 'url'
|
106
113
|
type: 'POST'
|
107
114
|
data: items
|
108
115
|
success: ->
|
109
116
|
klass.hide()
|
110
|
-
|
117
|
+
|
111
118
|
load_data: ->
|
112
119
|
klass = this
|
113
|
-
|
120
|
+
|
114
121
|
$.ajax
|
115
122
|
url: @element.attr 'href'
|
116
123
|
success: (data, status, xhr) ->
|
117
124
|
$('#sort_items').empty()
|
118
125
|
$("#sort-template" ).tmpl(data).appendTo('#sort_items')
|
119
126
|
# klass.refresh_counters()
|
120
|
-
|
127
|
+
|
121
128
|
$("#sort_items").sortable
|
122
129
|
cursor: 'crosshair'
|
123
130
|
opacity: 0.6
|
124
|
-
update: (event, ui) ->
|
131
|
+
update: (event, ui) ->
|
125
132
|
klass.update_sort_item(event, ui)
|
126
|
-
|
133
|
+
|
127
134
|
refresh_counters: ->
|
128
135
|
$('.sort-item .numb').each (index) ->
|
129
136
|
$(this).text index + 1
|
130
|
-
|
137
|
+
|
131
138
|
update_sort_item: (event, ui) ->
|
132
139
|
@save_button.attr 'disabled', false
|
133
140
|
this.refresh_counters()
|
134
|
-
|
135
|
-
|
136
|
-
|
141
|
+
|
142
|
+
# IMPORT
|
143
|
+
class ImportDialog extends Dialog
|
144
|
+
setup: ->
|
145
|
+
super
|
146
|
+
|
147
|
+
@container.addClass 'import-wrapper'
|
148
|
+
|
149
|
+
title = $('<div/>', { class: 'import-title' })
|
150
|
+
title.text(@element.data('title'))
|
151
|
+
|
152
|
+
@upload_input = $('<input />', { type: 'file', class: 'import-fileupload' })
|
153
|
+
@records_list = $('<ul/>')
|
154
|
+
|
155
|
+
@upload_input.fileupload
|
156
|
+
url: @element.data('url')
|
157
|
+
dataType: 'json'
|
158
|
+
autoUpload: true
|
159
|
+
uploadTemplateId: false
|
160
|
+
downloadTemplateId: false
|
161
|
+
done: (e, data) =>
|
162
|
+
$.each data.result.files, (findex, file) =>
|
163
|
+
$.each file.records, (rindex, record) =>
|
164
|
+
line = $('<li>')
|
165
|
+
|
166
|
+
if record?.html?
|
167
|
+
line.append(record.html)
|
168
|
+
else
|
169
|
+
if record.errors?.length > 0
|
170
|
+
rrr = $.extend({}, record)
|
171
|
+
delete(rrr.row)
|
172
|
+
delete(rrr.errors)
|
173
|
+
line.addClass('import-invalid-error')
|
174
|
+
line.append($("<b>ROW: #{record.row}</b>"))
|
175
|
+
line.append($('<br/>')).append(JSON.stringify(rrr)).append($('<br/>'))
|
176
|
+
line.append(record.errors.join('<br/>'))
|
177
|
+
else
|
178
|
+
line.append($("<b>ROW: #{record.row}</b>"))
|
179
|
+
line.append($('<br/>'))
|
180
|
+
line.append JSON.stringify(record)
|
181
|
+
|
182
|
+
@records_list.append(line)
|
183
|
+
|
184
|
+
@container.addClass('disabled')
|
185
|
+
$("#records").load "#{location.pathname} #records", =>
|
186
|
+
@container.removeClass('disabled')
|
187
|
+
|
188
|
+
buttons_holder = $ '<div/>', { class: 'import-buts-holder' }
|
189
|
+
@close_button = $ '<input/>', { type: 'reset', value: 'Close', class: 'button gray'}
|
190
|
+
|
191
|
+
buttons_holder.append(@save_button).append(@close_button)
|
192
|
+
title_holder = $ '<div/>', { class: 'import-title-holder' }
|
193
|
+
title_holder.append(title).append(@upload_input).append(buttons_holder)
|
194
|
+
|
195
|
+
items_container = $ '<div/>', { class: 'import-items-holder', id: 'import_items' }
|
196
|
+
items_container.append(@records_list)
|
197
|
+
|
198
|
+
@container.append(title_holder).append(items_container)
|
199
|
+
|
200
|
+
register_observers: ->
|
201
|
+
super
|
202
|
+
|
203
|
+
@close_button.bind 'click', (evt) =>
|
204
|
+
# this.hide()
|
205
|
+
# location?.reload?()
|
206
|
+
# @records_list.empty()
|
207
|
+
this.hide()
|
208
|
+
@records_list.empty()
|
209
|
+
|
@@ -9,67 +9,67 @@ class Editable
|
|
9
9
|
constructor: (@fields, options = {}) ->
|
10
10
|
this.setup()
|
11
11
|
this.register_observers()
|
12
|
-
|
12
|
+
|
13
13
|
setup: ->
|
14
14
|
@elements = $ @fields
|
15
15
|
@delete_button = @elements.filter('[data-editable=destroy]').first()
|
16
16
|
@edit_button = @elements.filter('[data-editable=edit]').first()
|
17
|
-
|
18
|
-
register_observers: ->
|
17
|
+
|
18
|
+
register_observers: ->
|
19
19
|
@elements.bind 'click', (evt) =>
|
20
20
|
element = $(evt.target)
|
21
|
-
|
21
|
+
|
22
22
|
unless element.hasClass('disabled')
|
23
23
|
switch element.data('editable')
|
24
24
|
when 'destroy' then this.destroy(element)
|
25
25
|
when 'edit' then this.edit(element)
|
26
26
|
false
|
27
|
-
|
27
|
+
|
28
28
|
$('.check-block input').bind 'change', (evt) =>
|
29
29
|
this.check_buttons()
|
30
|
-
|
30
|
+
|
31
31
|
$('.but-holder .check input').bind 'change', (evt) =>
|
32
32
|
$('.check-block input').prop("checked", $(evt.target).prop("checked"))
|
33
33
|
this.check_buttons()
|
34
|
-
|
34
|
+
|
35
35
|
check_buttons: ->
|
36
|
-
count = $('.check-block input:checked').
|
37
|
-
|
36
|
+
count = $('.check-block input:checked').length
|
37
|
+
|
38
38
|
this.toggle_button count > 0, @delete_button
|
39
39
|
this.toggle_button count == 1, @edit_button
|
40
|
-
|
40
|
+
|
41
41
|
toggle_button: (condition, button) ->
|
42
42
|
if condition then button.removeClass('disabled') else button.addClass('disabled')
|
43
|
-
|
43
|
+
|
44
44
|
destroy: (element) ->
|
45
45
|
if this.allowAction(@delete_button)
|
46
46
|
this.handleMethod(element, 'delete')
|
47
|
-
|
47
|
+
|
48
48
|
edit: (element) ->
|
49
49
|
item = $('.check-block input:checked').first()
|
50
50
|
location = element.attr('href').replace('0', item.val())
|
51
51
|
window.location = location
|
52
|
-
|
52
|
+
|
53
53
|
allowAction: (element) ->
|
54
|
-
message = element.data('confirm-message')
|
54
|
+
message = element.data('confirm-message') || element.data('confirm')
|
55
55
|
answer = false
|
56
|
-
|
57
|
-
|
58
|
-
|
56
|
+
callback = undefined
|
57
|
+
|
58
|
+
return true unless message
|
59
59
|
|
60
|
-
if $.rails.fire(element, 'confirm')
|
60
|
+
if $.rails.fire(element, 'confirm')
|
61
61
|
answer = $.rails.confirm(message)
|
62
62
|
callback = $.rails.fire(element, 'confirm:complete', [answer])
|
63
|
-
|
63
|
+
|
64
64
|
answer && callback
|
65
|
-
|
65
|
+
|
66
66
|
handleMethod: (link, method) ->
|
67
67
|
href = link.attr('href')
|
68
68
|
csrf_token = $('meta[name=csrf-token]').attr('content')
|
69
69
|
csrf_param = $('meta[name=csrf-param]').attr('content')
|
70
70
|
form = $('<form method="post" action="' + href + '"></form>')
|
71
71
|
metadata_input = '<input name="_method" value="' + method + '" type="hidden" />'
|
72
|
-
|
72
|
+
|
73
73
|
$('.check-block input:checked').each (index, element) ->
|
74
74
|
metadata_input += '<input name="ids[]" value="' + $(element).val() + '" type="hidden" />'
|
75
75
|
|