caboose-cms 0.9.175 → 0.9.176

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.
Files changed (36) hide show
  1. checksums.yaml +4 -4
  2. data/app/controllers/caboose/block_types_controller.rb +97 -4
  3. data/app/controllers/caboose/sites_controller.rb +19 -0
  4. data/app/controllers/caboose/theme_files_controller.rb +110 -0
  5. data/app/controllers/caboose/themes_controller.rb +27 -1
  6. data/app/models/caboose/block.rb +6 -2
  7. data/app/models/caboose/block_type.rb +9 -3
  8. data/app/models/caboose/block_type_site_membership.rb +1 -1
  9. data/app/models/caboose/core_plugin.rb +2 -1
  10. data/app/models/caboose/schema.rb +18 -3
  11. data/app/models/caboose/site.rb +10 -1
  12. data/app/models/caboose/theme.rb +2 -1
  13. data/app/models/caboose/theme_file.rb +1 -1
  14. data/app/models/caboose/user.rb +2 -1
  15. data/app/views/caboose/block_types/admin_edit.html.erb +11 -4
  16. data/app/views/caboose/block_types/admin_edit_btsm_css.html.erb +147 -0
  17. data/app/views/caboose/block_types/admin_edit_btsm_html.html.erb +119 -0
  18. data/app/views/caboose/block_types/admin_edit_render_function.html.erb +119 -0
  19. data/app/views/caboose/block_types/admin_edit_sass.html.erb +118 -0
  20. data/app/views/caboose/block_types/admin_error_log.html.erb +9 -0
  21. data/app/views/caboose/block_types/admin_index.html.erb +3 -1
  22. data/app/views/caboose/blocks/_render_function.html.erb +5 -1
  23. data/app/views/caboose/events/admin_edit.html.erb +1 -1
  24. data/app/views/caboose/pages/admin_edit_css.html.erb +117 -13
  25. data/app/views/caboose/pages/admin_edit_js.html.erb +114 -14
  26. data/app/views/caboose/sites/_admin_header.html.erb +6 -1
  27. data/app/views/caboose/sites/admin_edit_block_types.html.erb +35 -8
  28. data/app/views/caboose/sites/admin_edit_contact.html.erb +41 -0
  29. data/app/views/caboose/sites/admin_edit_css.html.erb +106 -20
  30. data/app/views/caboose/sites/admin_edit_js.html.erb +107 -20
  31. data/app/views/caboose/theme_files/admin_edit.html.erb +118 -0
  32. data/app/views/caboose/theme_files/admin_index.html.erb +44 -0
  33. data/app/views/caboose/themes/admin_edit.html.erb +6 -2
  34. data/app/views/caboose/themes/admin_sass.html.erb +240 -0
  35. data/lib/caboose/version.rb +1 -1
  36. metadata +12 -2
@@ -0,0 +1,118 @@
1
+ <h1>Edit Custom SCSS</h1>
2
+
3
+ <div class="editor-wrapper">
4
+
5
+ <div class="holder">
6
+ <div class="clearfix buttons">
7
+ <a href="/admin/block-types/<%= @block_type.id %>" class="caboose-btn">Back</a>
8
+ <a href="#" onclick="save();return false;" class="caboose-btn green">Save</a>
9
+ <span id="modified">Modified</span>
10
+ <div id="message"></div>
11
+ <p id="tips">
12
+ <span>Command+S = Save</span>
13
+ </p>
14
+ </div>
15
+ <div id="editor"><%= @block_type.custom_sass %></div>
16
+ </div>
17
+
18
+ </div>
19
+
20
+ <% content_for :caboose_css do %>
21
+ <style>
22
+ p#tips {
23
+ display: inline-block;
24
+ float: right;
25
+ font-size: 13px;
26
+ color: gray;
27
+ margin: 0;
28
+ padding-top: 15px;
29
+ padding-right: 2px;
30
+ }
31
+ p#tips span {
32
+ display: inline-block;
33
+ margin-left: 12px;
34
+ }
35
+ span#modified {
36
+ font-size: 13px;
37
+ color: gray;
38
+ margin: 0 10px;
39
+ opacity: 0;
40
+ transition: opacity 100ms ease;
41
+ }
42
+ .buttons {
43
+ margin-bottom: 10px;
44
+ }
45
+ .buttons .caboose-btn {
46
+ margin-right: 5px;
47
+ }
48
+ .editor-wrapper {
49
+
50
+ padding-right: 30px;
51
+ }
52
+
53
+ .holder {
54
+
55
+ }
56
+ #editor {
57
+ height: 800px;
58
+ width: 100%;
59
+ opacity: 0;
60
+ }
61
+ #editor.ace_editor {
62
+ opacity: 1;
63
+ }
64
+ #message {
65
+ display: inline-block;
66
+ }
67
+ #message p.note {
68
+ padding: 1px 15px 2px 15px;
69
+ font-size: 15px;
70
+ line-height: 30px;
71
+ border-radius: 5px;
72
+ }
73
+ #message p.note.loading {
74
+ padding-left: 40px;
75
+ }
76
+ </style>
77
+ <% end %>
78
+
79
+ <% content_for :caboose_js do %>
80
+ <%= javascript_include_tag 'https://cdnjs.cloudflare.com/ajax/libs/ace/1.4.1/ace.js' %>
81
+ <script>
82
+ var editor = ace.edit("editor");
83
+ editor.setTheme("ace/theme/monokai");
84
+ editor.session.setMode("ace/mode/scss");
85
+ editor.session.setOptions({
86
+ tabSize: 2
87
+ });
88
+
89
+ editor.on("change", function() {
90
+ $("span#modified").css('opacity',1);
91
+ });
92
+
93
+ editor.commands.addCommand({
94
+ name: 'save',
95
+ bindKey: {win: "Ctrl-S", "mac": "Cmd-S"},
96
+ exec: function(editor) { save(); }
97
+ });
98
+
99
+ function save() {
100
+ $('#message').html("<p class='note loading'>Saving code...</p>").fadeIn();
101
+ $.ajax({
102
+ url: '/admin/block-types/<%= @block_type.id %>/sass',
103
+ type: 'put',
104
+ data: {
105
+ code: editor.getValue()
106
+ },
107
+ success: function(resp) {
108
+ if (resp.error) $('#message').html("<p class='note error'>" + resp.error + "</p>").fadeIn();
109
+ if (resp.success && resp.message) {
110
+ $("span#modified").css('opacity',0);
111
+ $('#message').html("<p class='note success'>" + resp.message + "</p>").fadeIn().delay(2000).fadeOut();
112
+ }
113
+ }
114
+ });
115
+ }
116
+
117
+ </script>
118
+ <% end %>
@@ -0,0 +1,9 @@
1
+ <h1>Error Log</h1>
2
+
3
+ <a href="/admin/block-types/<%= @block_type.id %>/render-function" class="caboose-btn">Back</a>
4
+
5
+ <% if !@block_type.latest_error.blank? %>
6
+ <div class="error" style="font-size:13px;line-height:18px;font-family:monospace;margin-top:10px;">
7
+ <%== @block_type.latest_error.gsub("\n","<br />") %>
8
+ </div>
9
+ <% end %>
@@ -8,7 +8,7 @@
8
8
  <!--
9
9
  <p><a href='/admin/block-types/store'>Block Type Store</a></p>
10
10
  -->
11
- <p><a href='/admin/block-types/parse'>Block Type Parser</a></p>
11
+ <!-- <p><a href='/admin/block-types/parse'>Block Type Parser</a></p> -->
12
12
 
13
13
  <div id='block_types'></div>
14
14
  <% (0..100).each do |i| %><p>&nbsp;</p><% end %>
@@ -22,6 +22,8 @@ $(document).ready(function() {
22
22
  var table = new IndexTable({
23
23
  form_authenticity_token: '<%= form_authenticity_token %>',
24
24
  container: 'block_types',
25
+ after_add: 'redirect',
26
+ allow_bulk_import: false,
25
27
  base_url: '/admin/block-types',
26
28
  fields: [
27
29
  { name: 'name' , sort: 'name' , show: true , bulk_edit: false, nice_name: 'Name' , type: 'text' , value: function(bt) { return bt.name; }, width: 400 },
@@ -1 +1,5 @@
1
- <%= raw ERB.new(block.block_type.render_function).result(self.instance_eval { binding }) %>
1
+ <%
2
+ btsm = Caboose::BlockTypeSiteMembership.where(:site_id => site.id, :block_type_id => block.block_type.id).where('custom_html IS NOT NULL and custom_html != ?', '').first
3
+ rf = btsm ? btsm.custom_html : block.block_type.render_function
4
+ %>
5
+ <%= raw ERB.new(rf).result(self.instance_eval { binding }) %>
@@ -89,7 +89,7 @@ $(document).ready(function() {
89
89
  { name: 'url' , nice_name: 'URL' , type: 'text' , value: <%= raw Caboose.json(e.url ) %>, width: 600 },
90
90
  { name: 'url_label' , nice_name: 'URL Label' , type: 'text' , value: <%= raw Caboose.json(e.url_label ) %>, width: 600 },
91
91
  { name: 'published' , nice_name: 'Published' , type: 'checkbox' , value: <%= raw Caboose.json(e.published ) %>, width: 600 },
92
- { name: 'image' , nice_name: 'Image' , type: 'image' , value: <%= raw Caboose.json(e.image.url(:thumb)) %>, width: 400, update_url: '/admin/calendars/<%= c.id %>/events/<%= e.id %>/image' },
92
+ { name: 'image' , nice_name: 'Image' , type: 'image' , value: <%= raw Caboose.json(e.image.url(:thumb)) %>, width: 150, update_url: '/admin/calendars/<%= c.id %>/events/<%= e.id %>/image' },
93
93
  { name: 'begin_date' , nice_name: 'Begin date' , type: 'date' , value: <%= raw Caboose.json(e.begin_date.strftime('%m/%d/%Y') ) %>, width: 250 , align: 'right' },
94
94
  { name: 'begin_time' , nice_name: 'Begin time' , type: 'time' , value: <%= raw Caboose.json(e.begin_date.strftime('%I:%M %P') ) %>, width: 250 , fixed_placeholder: false },
95
95
  { name: 'end_date' , nice_name: 'End date' , type: 'date' , value: <%= raw Caboose.json(e.end_date.strftime('%m/%d/%Y') ) %>, width: 250 , align: 'right' },
@@ -1,24 +1,129 @@
1
1
 
2
2
  <%= render :partial => 'caboose/pages/admin_header' %>
3
3
 
4
- <h2>Custom CSS URLs</h2>
5
- <p>One URL per line</p>
6
- <p><div id='page_<%= @page.id %>_custom_css_files'></div></p>
7
- <h2>Custom CSS</h2>
8
- <p><div id='page_<%= @page.id %>_custom_css'></div></p>
4
+ <div class="editor-wrapper">
9
5
 
10
- <%= render :partial => 'caboose/pages/admin_footer' %>
6
+ <div class="holder">
7
+ <div class="clearfix buttons">
8
+ <a href="#" onclick="save();return false;" class="caboose-btn green">Save</a>
9
+ <span id="modified">Modified</span>
10
+ <div id="message"></div>
11
+ <p id="tips">
12
+ <span>Command+S = Save</span>
13
+ </p>
14
+ </div>
15
+ <div id="editor"><%= @page.custom_css %></div>
16
+ </div>
17
+
18
+ </div>
11
19
 
12
20
  <% content_for :caboose_css do %>
13
21
  <style>
14
- textarea {
15
- font-family: monospace;
16
- font-size: 13px;
17
- line-height: 20px;
18
- padding: 5px 15px !important;
22
+ p#tips {
23
+ display: inline-block;
24
+ float: right;
25
+ font-size: 13px;
26
+ color: gray;
27
+ margin: 0;
28
+ padding-top: 15px;
29
+ padding-right: 2px;
30
+ }
31
+ p#tips span {
32
+ display: inline-block;
33
+ margin-left: 12px;
34
+ }
35
+ span#modified {
36
+ font-size: 13px;
37
+ color: gray;
38
+ margin: 0 10px;
39
+ opacity: 0;
40
+ transition: opacity 100ms ease;
41
+ }
42
+ .buttons {
43
+ margin-bottom: 10px;
44
+ }
45
+ .buttons .caboose-btn {
46
+ margin-right: 5px;
47
+ }
48
+ .editor-wrapper {
49
+
50
+ padding-right: 30px;
51
+ }
52
+
53
+ .holder {
54
+
55
+ }
56
+ #editor {
57
+ height: 800px;
58
+ width: 100%;
59
+ opacity: 0;
60
+ }
61
+ #editor.ace_editor {
62
+ opacity: 1;
63
+ }
64
+ #message {
65
+ display: inline-block;
66
+ }
67
+ #message p.note {
68
+ padding: 1px 15px 2px 15px;
69
+ font-size: 15px;
70
+ line-height: 30px;
71
+ border-radius: 5px;
72
+ }
73
+ #message p.note.loading {
74
+ padding-left: 40px;
19
75
  }
20
76
  </style>
21
77
  <% end %>
78
+
79
+ <% content_for :caboose_js do %>
80
+ <%= javascript_include_tag 'https://cdnjs.cloudflare.com/ajax/libs/ace/1.4.1/ace.js' %>
81
+ <script>
82
+ var editor = ace.edit("editor");
83
+ editor.setTheme("ace/theme/monokai");
84
+ editor.session.setMode("ace/mode/css");
85
+ editor.session.setOptions({
86
+ tabSize: 2
87
+ });
88
+
89
+ editor.on("change", function() {
90
+ $("span#modified").css('opacity',1);
91
+ });
92
+
93
+ editor.commands.addCommand({
94
+ name: 'save',
95
+ bindKey: {win: "Ctrl-S", "mac": "Cmd-S"},
96
+ exec: function(editor) { save(); }
97
+ });
98
+
99
+ function save() {
100
+ $('#message').html("<p class='note loading'>Saving code...</p>").fadeIn();
101
+ $.ajax({
102
+ url: '/admin/pages/<%= @page.id %>',
103
+ type: 'put',
104
+ data: {
105
+ custom_css: editor.getValue()
106
+ },
107
+ success: function(resp) {
108
+ if (resp.error) $('#message').html("<p class='note error'>" + resp.error + "</p>").fadeIn();
109
+ if (resp.success) {
110
+ $("span#modified").css('opacity',0);
111
+ $('#message').html("<p class='note success'>CSS saved!</p>").fadeIn().delay(2000).fadeOut();
112
+ }
113
+ }
114
+ });
115
+ }
116
+
117
+ </script>
118
+ <% end %>
119
+
120
+
121
+ <h2>Custom CSS URLs</h2>
122
+ <p>One URL per line</p>
123
+ <p><div id='page_<%= @page.id %>_custom_css_files'></div></p>
124
+
125
+ <%= render :partial => 'caboose/pages/admin_footer' %>
126
+
22
127
  <% content_for :caboose_js do %>
23
128
  <script type='text/javascript'>
24
129
 
@@ -34,8 +139,7 @@ $(document).ready(function() {
34
139
  update_url: '/admin/pages/<%= @page.id %>',
35
140
  authenticity_token: '<%= form_authenticity_token %>',
36
141
  attributes: [
37
- { name: 'custom_css_files' , nice_name: 'Custom CSS URLs' , type: 'textarea', value: <%= raw Caboose.json(@page.custom_css_files ) %>, width: 800, height: 200, fixed_placeholder: false },
38
- { name: 'custom_css' , nice_name: 'Custom CSS' , type: 'textarea', value: <%= raw Caboose.json(@page.custom_css ) %>, width: 800, height: 400, fixed_placeholder: false }
142
+ { name: 'custom_css_files' , nice_name: 'Custom CSS URLs' , type: 'textarea', value: <%= raw Caboose.json(@page.custom_css_files ) %>, width: 800, height: 200, fixed_placeholder: false }
39
143
  ]
40
144
  });
41
145
  });
@@ -1,25 +1,126 @@
1
1
 
2
2
  <%= render :partial => 'caboose/pages/admin_header' %>
3
3
 
4
- <h2>Custom Javascript URLs</h2>
5
- <p>One URL per line</p>
6
- <p><div id='page_<%= @page.id %>_custom_js_files'></div></p>
7
- <h2>Custom Javascript</h2>
8
- <p><div id='page_<%= @page.id %>_custom_js'></div></p>
4
+ <div class="editor-wrapper">
9
5
 
10
- <%= render :partial => 'caboose/pages/admin_footer' %>
6
+ <div class="holder">
7
+ <div class="clearfix buttons">
8
+ <a href="#" onclick="save();return false;" class="caboose-btn green">Save</a>
9
+ <span id="modified">Modified</span>
10
+ <div id="message"></div>
11
+ <p id="tips">
12
+ <span>Command+S = Save</span>
13
+ </p>
14
+ </div>
15
+ <div id="editor"><%= @page.custom_js %></div>
16
+ </div>
17
+
18
+ </div>
11
19
 
12
20
  <% content_for :caboose_css do %>
13
21
  <style>
14
- textarea {
15
- font-family: monospace;
16
- font-size: 13px;
17
- line-height: 20px;
18
- padding: 5px 15px !important;
22
+ p#tips {
23
+ display: inline-block;
24
+ float: right;
25
+ font-size: 13px;
26
+ color: gray;
27
+ margin: 0;
28
+ padding-top: 15px;
29
+ padding-right: 2px;
30
+ }
31
+ p#tips span {
32
+ display: inline-block;
33
+ margin-left: 12px;
34
+ }
35
+ span#modified {
36
+ font-size: 13px;
37
+ color: gray;
38
+ margin: 0 10px;
39
+ opacity: 0;
40
+ transition: opacity 100ms ease;
41
+ }
42
+ .buttons {
43
+ margin-bottom: 10px;
44
+ }
45
+ .buttons .caboose-btn {
46
+ margin-right: 5px;
47
+ }
48
+ .editor-wrapper {
49
+
50
+ padding-right: 30px;
51
+ }
52
+
53
+ #editor {
54
+ height: 800px;
55
+ width: 100%;
56
+ opacity: 0;
57
+ }
58
+ #editor.ace_editor {
59
+ opacity: 1;
60
+ }
61
+ #message {
62
+ display: inline-block;
63
+ }
64
+ #message p.note {
65
+ padding: 1px 15px 2px 15px;
66
+ font-size: 15px;
67
+ line-height: 30px;
68
+ border-radius: 5px;
69
+ }
70
+ #message p.note.loading {
71
+ padding-left: 40px;
19
72
  }
20
73
  </style>
21
74
  <% end %>
22
75
 
76
+ <% content_for :caboose_js do %>
77
+ <%= javascript_include_tag 'https://cdnjs.cloudflare.com/ajax/libs/ace/1.4.1/ace.js' %>
78
+ <script>
79
+ var editor = ace.edit("editor");
80
+ editor.setTheme("ace/theme/monokai");
81
+ editor.session.setMode("ace/mode/javascript");
82
+ editor.session.setOptions({
83
+ tabSize: 2
84
+ });
85
+
86
+ editor.on("change", function() {
87
+ $("span#modified").css('opacity',1);
88
+ });
89
+
90
+ editor.commands.addCommand({
91
+ name: 'save',
92
+ bindKey: {win: "Ctrl-S", "mac": "Cmd-S"},
93
+ exec: function(editor) { save(); }
94
+ });
95
+
96
+ function save() {
97
+ $('#message').html("<p class='note loading'>Saving code...</p>").fadeIn();
98
+ $.ajax({
99
+ url: '/admin/pages/<%= @page.id %>',
100
+ type: 'put',
101
+ data: {
102
+ custom_js: editor.getValue()
103
+ },
104
+ success: function(resp) {
105
+ if (resp.error) $('#message').html("<p class='note error'>" + resp.error + "</p>").fadeIn();
106
+ if (resp.success) {
107
+ $("span#modified").css('opacity',0);
108
+ $('#message').html("<p class='note success'>JS saved!</p>").fadeIn().delay(2000).fadeOut();
109
+ }
110
+ }
111
+ });
112
+ }
113
+
114
+ </script>
115
+ <% end %>
116
+
117
+
118
+ <h2>Custom JS URLs</h2>
119
+ <p>One URL per line</p>
120
+ <p><div id='page_<%= @page.id %>_custom_js_files'></div></p>
121
+
122
+ <%= render :partial => 'caboose/pages/admin_footer' %>
123
+
23
124
  <% content_for :caboose_js do %>
24
125
  <script type='text/javascript'>
25
126
 
@@ -35,11 +136,10 @@ $(document).ready(function() {
35
136
  update_url: '/admin/pages/<%= @page.id %>',
36
137
  authenticity_token: '<%= form_authenticity_token %>',
37
138
  attributes: [
38
- { name: 'custom_js_files', nice_name: 'Custom Javascript URLs' , type: 'textarea', value: <%= raw Caboose.json(@page.custom_js_files ) %>, width: 800, height: 200, fixed_placeholder: false },
39
- { name: 'custom_js' , nice_name: 'Custom Javascript' , type: 'textarea', value: <%= raw Caboose.json(@page.custom_js ) %>, width: 800, height: 400, fixed_placeholder: false }
139
+ { name: 'custom_js_files' , nice_name: 'Custom JS URLs' , type: 'textarea', value: <%= raw Caboose.json(@page.custom_js_files ) %>, width: 800, height: 200, fixed_placeholder: false }
40
140
  ]
41
141
  });
42
142
  });
43
143
 
44
144
  </script>
45
- <% end %>
145
+ <% end %>