smithycms 0.6.0 → 0.6.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (197) hide show
  1. checksums.yaml +4 -4
  2. data/app/assets/javascripts/smithy/application.js +7 -3
  3. data/app/assets/javascripts/smithy/asset_uploads.coffee +1 -1
  4. data/app/assets/javascripts/smithy/assets.js.coffee +44 -37
  5. data/app/assets/javascripts/smithy/editor.coffee +142 -0
  6. data/app/assets/stylesheets/smithy/application.scss +2 -2
  7. data/app/assets/stylesheets/smithy/assets.scss +8 -12
  8. data/app/assets/stylesheets/smithy/templates.scss +13 -0
  9. data/app/controllers/smithy/assets_controller.rb +14 -13
  10. data/app/controllers/smithy/pages_controller.rb +7 -1
  11. data/app/models/smithy/assets_datatable.rb +20 -9
  12. data/app/models/smithy/page.rb +11 -0
  13. data/app/models/smithy/page_content.rb +0 -2
  14. data/app/views/layouts/smithy/modal.html.erb +1 -0
  15. data/app/views/smithy/assets/_actions.html.erb +1 -2
  16. data/app/views/smithy/assets/index.html.erb +4 -4
  17. data/app/views/smithy/assets/selector_modal.html.erb +20 -0
  18. data/app/views/smithy/contents/_form_fields.html.erb +2 -2
  19. data/app/views/smithy/pages/_selector_modal_page.html.erb +0 -0
  20. data/app/views/smithy/pages/selector_modal.html.erb +33 -0
  21. data/config/initializers/refile.rb +10 -0
  22. data/config/routes.rb +2 -0
  23. data/lib/smithy/dependencies.rb +3 -2
  24. data/lib/smithy/formatter.rb +7 -2
  25. data/lib/smithy/version.rb +1 -1
  26. data/vendor/cache/CFPropertyList-2.3.2.gem +0 -0
  27. data/vendor/cache/actionmailer-4.1.10.gem +0 -0
  28. data/vendor/cache/actionpack-4.1.10.gem +0 -0
  29. data/vendor/cache/actionview-4.1.10.gem +0 -0
  30. data/vendor/cache/activemodel-4.1.10.gem +0 -0
  31. data/vendor/cache/activerecord-4.1.10.gem +0 -0
  32. data/vendor/cache/activesupport-4.1.10.gem +0 -0
  33. data/vendor/cache/addressable-2.3.8.gem +0 -0
  34. data/vendor/cache/arel-5.0.1.20140414130214.gem +0 -0
  35. data/vendor/cache/autoprefixer-rails-6.3.1.gem +0 -0
  36. data/vendor/cache/awesome_nested_set-3.0.3.gem +0 -0
  37. data/vendor/cache/aws-sdk-2.2.13.gem +0 -0
  38. data/vendor/cache/aws-sdk-core-2.2.13.gem +0 -0
  39. data/vendor/cache/aws-sdk-resources-2.2.13.gem +0 -0
  40. data/vendor/cache/bcrypt-3.1.10.gem +0 -0
  41. data/vendor/cache/bootstrap-sass-3.2.0.2.gem +0 -0
  42. data/vendor/cache/builder-3.2.2.gem +0 -0
  43. data/vendor/cache/byebug-4.0.5.gem +0 -0
  44. data/vendor/cache/capybara-2.4.4.gem +0 -0
  45. data/vendor/cache/celluloid-0.16.0.gem +0 -0
  46. data/vendor/cache/coderay-1.1.0.gem +0 -0
  47. data/vendor/cache/coffee-rails-4.1.1.gem +0 -0
  48. data/vendor/cache/coffee-script-2.4.1.gem +0 -0
  49. data/vendor/cache/coffee-script-source-1.10.0.gem +0 -0
  50. data/vendor/cache/columnize-0.9.0.gem +0 -0
  51. data/vendor/cache/concurrent-ruby-1.0.0.gem +0 -0
  52. data/vendor/cache/coveralls-0.7.12.gem +0 -0
  53. data/vendor/cache/crass-1.0.2.gem +0 -0
  54. data/vendor/cache/database_cleaner-1.4.1.gem +0 -0
  55. data/vendor/cache/diff-lcs-1.2.5.gem +0 -0
  56. data/vendor/cache/docile-1.1.5.gem +0 -0
  57. data/vendor/cache/domain_name-0.5.23.gem +0 -0
  58. data/vendor/cache/dotenv-2.0.1.gem +0 -0
  59. data/vendor/cache/dotenv-rails-2.0.1.gem +0 -0
  60. data/vendor/cache/em-websocket-0.5.1.gem +0 -0
  61. data/vendor/cache/erubis-2.7.0.gem +0 -0
  62. data/vendor/cache/eventmachine-1.0.7.gem +0 -0
  63. data/vendor/cache/excon-0.45.4.gem +0 -0
  64. data/vendor/cache/execjs-2.6.0.gem +0 -0
  65. data/vendor/cache/factory_girl-4.5.0.gem +0 -0
  66. data/vendor/cache/factory_girl_rails-4.5.0.gem +0 -0
  67. data/vendor/cache/fakeweb-1.3.0.gem +0 -0
  68. data/vendor/cache/ffaker-2.0.0.gem +0 -0
  69. data/vendor/cache/ffi-1.9.8.gem +0 -0
  70. data/vendor/cache/fission-0.5.0.gem +0 -0
  71. data/vendor/cache/fog-1.37.0.gem +0 -0
  72. data/vendor/cache/fog-aliyun-0.1.0.gem +0 -0
  73. data/vendor/cache/fog-atmos-0.1.0.gem +0 -0
  74. data/vendor/cache/fog-aws-0.8.1.gem +0 -0
  75. data/vendor/cache/fog-brightbox-0.10.1.gem +0 -0
  76. data/vendor/cache/fog-core-1.35.0.gem +0 -0
  77. data/vendor/cache/fog-dynect-0.0.2.gem +0 -0
  78. data/vendor/cache/fog-ecloud-0.3.0.gem +0 -0
  79. data/vendor/cache/fog-google-0.1.0.gem +0 -0
  80. data/vendor/cache/fog-json-1.0.2.gem +0 -0
  81. data/vendor/cache/fog-local-0.2.1.gem +0 -0
  82. data/vendor/cache/fog-powerdns-0.1.1.gem +0 -0
  83. data/vendor/cache/fog-profitbricks-0.0.5.gem +0 -0
  84. data/vendor/cache/fog-radosgw-0.0.5.gem +0 -0
  85. data/vendor/cache/fog-riakcs-0.1.0.gem +0 -0
  86. data/vendor/cache/fog-sakuracloud-1.7.5.gem +0 -0
  87. data/vendor/cache/fog-serverlove-0.1.2.gem +0 -0
  88. data/vendor/cache/fog-softlayer-1.0.3.gem +0 -0
  89. data/vendor/cache/fog-storm_on_demand-0.1.1.gem +0 -0
  90. data/vendor/cache/fog-terremark-0.1.0.gem +0 -0
  91. data/vendor/cache/fog-vmfusion-0.1.0.gem +0 -0
  92. data/vendor/cache/fog-voxel-0.1.0.gem +0 -0
  93. data/vendor/cache/fog-vsphere-0.5.0.gem +0 -0
  94. data/vendor/cache/fog-xenserver-0.2.3.gem +0 -0
  95. data/vendor/cache/fog-xml-0.1.2.gem +0 -0
  96. data/vendor/cache/font-awesome-sass-4.5.0.gem +0 -0
  97. data/vendor/cache/formatador-0.2.5.gem +0 -0
  98. data/vendor/cache/formtastic-2.3.1.gem +0 -0
  99. data/vendor/cache/formtastic-bootstrap-3.0.0.gem +0 -0
  100. data/vendor/cache/friendly_id-5.0.5.gem +0 -0
  101. data/vendor/cache/fuubar-2.0.0.gem +0 -0
  102. data/vendor/cache/guard-2.12.5.gem +0 -0
  103. data/vendor/cache/guard-compat-1.2.1.gem +0 -0
  104. data/vendor/cache/guard-livereload-2.4.0.gem +0 -0
  105. data/vendor/cache/guard-rspec-4.5.0.gem +0 -0
  106. data/vendor/cache/hitimes-1.2.2.gem +0 -0
  107. data/vendor/cache/http-cookie-1.0.2.gem +0 -0
  108. data/vendor/cache/http_parser.rb-0.6.0.gem +0 -0
  109. data/vendor/cache/httparty-0.13.7.gem +0 -0
  110. data/vendor/cache/i18n-0.7.0.gem +0 -0
  111. data/vendor/cache/inflecto-0.0.2.gem +0 -0
  112. data/vendor/cache/ipaddress-0.8.2.gem +0 -0
  113. data/vendor/cache/jmespath-1.1.3.gem +0 -0
  114. data/vendor/cache/jquery-rails-3.1.4.gem +0 -0
  115. data/vendor/cache/json-1.8.2.gem +0 -0
  116. data/vendor/cache/kaminari-0.16.3.gem +0 -0
  117. data/vendor/cache/kramdown-1.9.0.gem +0 -0
  118. data/vendor/cache/launchy-2.4.3.gem +0 -0
  119. data/vendor/cache/letter_opener-1.3.0.gem +0 -0
  120. data/vendor/cache/liquid-2.6.3.gem +0 -0
  121. data/vendor/cache/listen-2.10.0.gem +0 -0
  122. data/vendor/cache/lumberjack-1.0.9.gem +0 -0
  123. data/vendor/cache/mail-2.6.3.gem +0 -0
  124. data/vendor/cache/method_source-0.8.2.gem +0 -0
  125. data/vendor/cache/mime-types-2.4.3.gem +0 -0
  126. data/vendor/cache/mini_magick-4.3.6.gem +0 -0
  127. data/vendor/cache/mini_portile-0.6.2.gem +0 -0
  128. data/vendor/cache/minitest-5.5.1.gem +0 -0
  129. data/vendor/cache/multi_json-1.11.0.gem +0 -0
  130. data/vendor/cache/multi_xml-0.5.5.gem +0 -0
  131. data/vendor/cache/mysql2-0.3.18.gem +0 -0
  132. data/vendor/cache/nenv-0.2.0.gem +0 -0
  133. data/vendor/cache/netrc-0.10.3.gem +0 -0
  134. data/vendor/cache/nokogiri-1.6.6.2.gem +0 -0
  135. data/vendor/cache/nokogumbo-1.4.7.gem +0 -0
  136. data/vendor/cache/notiffany-0.0.6.gem +0 -0
  137. data/vendor/cache/pg-0.18.1.gem +0 -0
  138. data/vendor/cache/pry-0.10.1.gem +0 -0
  139. data/vendor/cache/rack-1.5.2.gem +0 -0
  140. data/vendor/cache/rack-cache-1.5.1.gem +0 -0
  141. data/vendor/cache/rack-livereload-0.3.15.gem +0 -0
  142. data/vendor/cache/rack-protection-1.5.3.gem +0 -0
  143. data/vendor/cache/rack-test-0.6.3.gem +0 -0
  144. data/vendor/cache/rails-4.1.10.gem +0 -0
  145. data/vendor/cache/rails-assets-datatables-1.10.10.gem +0 -0
  146. data/vendor/cache/rails-assets-datatables-responsive-2.0.1.gem +0 -0
  147. data/vendor/cache/rails-assets-datatables-select-1.1.0.gem +0 -0
  148. data/vendor/cache/rails-assets-jquery-2.2.0.gem +0 -0
  149. data/vendor/cache/railties-4.1.10.gem +0 -0
  150. data/vendor/cache/rake-10.4.2.gem +0 -0
  151. data/vendor/cache/rb-fsevent-0.9.4.gem +0 -0
  152. data/vendor/cache/rb-inotify-0.9.5.gem +0 -0
  153. data/vendor/cache/rbvmomi-1.8.2.gem +0 -0
  154. data/vendor/cache/refile-0.6.2.gem +0 -0
  155. data/vendor/cache/refile-mini_magick-0.2.0.gem +0 -0
  156. data/vendor/cache/refile-s3-0.2.0.gem +0 -0
  157. data/vendor/cache/remotipart-1.2.1.gem +0 -0
  158. data/vendor/cache/rest-client-1.8.0.gem +0 -0
  159. data/vendor/cache/rinku-1.7.3.gem +0 -0
  160. data/vendor/cache/rspec-3.2.0.gem +0 -0
  161. data/vendor/cache/rspec-core-3.2.2.gem +0 -0
  162. data/vendor/cache/rspec-expectations-3.2.0.gem +0 -0
  163. data/vendor/cache/rspec-mocks-3.2.1.gem +0 -0
  164. data/vendor/cache/rspec-rails-3.2.1.gem +0 -0
  165. data/vendor/cache/rspec-support-3.2.2.gem +0 -0
  166. data/vendor/cache/ruby-oembed-0.8.14.gem +0 -0
  167. data/vendor/cache/ruby-progressbar-1.7.5.gem +0 -0
  168. data/vendor/cache/sanitize-4.0.1.gem +0 -0
  169. data/vendor/cache/sass-3.4.21.gem +0 -0
  170. data/vendor/cache/sass-rails-5.0.4.gem +0 -0
  171. data/vendor/cache/shellany-0.0.1.gem +0 -0
  172. data/vendor/cache/shoulda-matchers-2.8.0.gem +0 -0
  173. data/vendor/cache/simplecov-0.9.2.gem +0 -0
  174. data/vendor/cache/simplecov-html-0.9.0.gem +0 -0
  175. data/vendor/cache/sinatra-1.4.7.gem +0 -0
  176. data/vendor/cache/slodown-0.1.3.gem +0 -0
  177. data/vendor/cache/slop-3.6.0.gem +0 -0
  178. data/vendor/cache/smithycms-auth-0.4.2.gem +0 -0
  179. data/vendor/cache/sprockets-3.5.2.gem +0 -0
  180. data/vendor/cache/sprockets-rails-2.3.3.gem +0 -0
  181. data/vendor/cache/sqlite3-1.3.10.gem +0 -0
  182. data/vendor/cache/term-ansicolor-1.3.0.gem +0 -0
  183. data/vendor/cache/terminal-notifier-guard-1.6.4.gem +0 -0
  184. data/vendor/cache/thor-0.19.1.gem +0 -0
  185. data/vendor/cache/thread_safe-0.3.5.gem +0 -0
  186. data/vendor/cache/tilt-2.0.2.gem +0 -0
  187. data/vendor/cache/timers-4.0.1.gem +0 -0
  188. data/vendor/cache/tins-1.3.5.gem +0 -0
  189. data/vendor/cache/trollop-2.1.2.gem +0 -0
  190. data/vendor/cache/tzinfo-1.2.2.gem +0 -0
  191. data/vendor/cache/unf-0.1.4.gem +0 -0
  192. data/vendor/cache/unf_ext-0.0.6.gem +0 -0
  193. data/vendor/cache/xml-simple-1.1.5.gem +0 -0
  194. data/vendor/cache/xpath-2.0.0.gem +0 -0
  195. metadata +197 -26
  196. data/app/assets/javascripts/smithy/editor.js +0 -27
  197. data/app/helpers/smithy/upload_helper.rb +0 -112
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 5729808381e189d354b575a074129abbb0bd33b6
4
- data.tar.gz: 49a72ccb62fb0f11a31edf3f70cc2f1af81fd372
3
+ metadata.gz: 9ef3603f75dac8deb5a376d8b940d80929f143ed
4
+ data.tar.gz: daf866a5e6562242e7e68a856764e90010f7aa1b
5
5
  SHA512:
6
- metadata.gz: 390e6f97961063ad08c0e2d673c01896e4f296b9ffe4e37c5384033ebfde23f04fcee62f2c0b31bd787f4508900099a05c5a45d4db8236cb8c4589ff3ba55539
7
- data.tar.gz: 2dd09ff917ef0d96379610d38b29b7af7d78cd95cb5e1d983b4d80972d416e99f640c8e328df21eeebb96f2b14348eb1cac7765cab0f4e5243a33888678f3083
6
+ metadata.gz: cd32f70f38a4f1a51b03c56ae5d601314b6aee76131ae75271fdbcb1ad87171c4ce037fe69b68fb54838c2bab4b9f75975ebf15e219affab94551a726efc7a47
7
+ data.tar.gz: ed284bb439bf70777fd51216ea4cd1a2ed183140d6f2fdd29673ae446f040a5e19a7c1f19f23814da9b89df69b39d917a70b5500a704294f396b837a285b054f
@@ -3,15 +3,19 @@
3
3
  //= require jquery.remotipart
4
4
  //= require 'smithy/jquery-ui.min'
5
5
  //= require bootstrap-sprockets
6
- //= require dataTables/jquery.dataTables
7
- //= require dataTables/bootstrap/3/jquery.dataTables.bootstrap
8
- //= require dataTables/extras/dataTables.responsive
6
+ //= require datatables
7
+ //= require datatables-responsive
8
+ //= require datatables/dataTables.bootstrap
9
+ //= require datatables-select
9
10
  //= require ace-1.1.3/ace
10
11
  //= require ace-1.1.3/mode-css.js
11
12
  //= require ace-1.1.3/mode-html.js
12
13
  //= require ace-1.1.3/mode-javascript.js
13
14
  //= require ace-1.1.3/mode-liquid.js
14
15
  //= require ace-1.1.3/mode-markdown.js
16
+ //= require ace-1.1.3/ext-language_tools
17
+ //= require ace-1.1.3/snippets/snippets
18
+ //= require ace-1.1.3/snippets/markdown
15
19
  //= require zeroclipboard-2.2.0/ZeroClipboard.min.js
16
20
  //= require refile
17
21
  //= require_tree .
@@ -25,7 +25,7 @@ upload_files = (e) ->
25
25
  total_uploaded += e.originalEvent.detail.file.size
26
26
  progress = parseInt(total_uploaded/total_size * 100, 10)
27
27
  $progress_bar.css('width', "#{progress}%").attr('aria-valuenow', progress)
28
- setTimeout((-> $progress_bar.parent().remove()), 2000) if progress >= 100
28
+ setTimeout((-> $progress_bar.parent().remove()), 2000) !$upload_form.find("input.uploading").length
29
29
  $(document).on "upload:failed", $upload_form, (e) ->
30
30
  $(this).addClass("upload-failed").append("<p>Something went wrong, please check your connection and try again</p>")
31
31
 
@@ -1,40 +1,47 @@
1
- $select_all_checkbox = $('#assets_table_select_all')
2
- $delete_selected_button = $('#delete_selected_assets')
3
-
4
- $('#assets').DataTable {
5
- "responsive": true,
6
- "serverSide": true,
7
- "processing": true,
8
- "ajax": $('#assets').attr('data-source'),
9
- "order": [[2, 'asc']],
10
- "columnDefs": [
11
- { "targets": [0,1,5], "searchable": false, "orderable": false },
12
- { "targets": [1], "className": "preview" }
13
- ],
14
- "language": {
15
- "emptyTable": "No assets have been added yet. Upload files above to create new assets.",
16
- "processing": "<span>Processing...</span>"
17
- },
18
- "dom": 'l<"toolbar">frtip'
19
- }
20
-
21
- window.$assets_table = $('#assets').dataTable()
22
- window.assets_table_api = $assets_table.api()
23
-
24
- $('#assets_wrapper').find('.toolbar').append($delete_selected_button.remove())
25
-
26
- $(document).on 'click', '#assets_table_select_all', (e) ->
27
- $checkbox = $(e.target)
28
- $assets_table.find('input.delete').prop('checked', $checkbox.prop('checked'))
29
-
30
- $(document).on 'click', '#assets_wrapper input[type="checkbox"]', (e) ->
31
- if $('#assets_wrapper input[type="checkbox"]:checked').length > 0
32
- $delete_selected_button.show()
33
- else
34
- $delete_selected_button.hide()
35
-
36
- $assets_table.on 'draw.dt', ->
37
- $(document).trigger('updateCopyLinks')
1
+ $ ->
2
+ load_assets_table()
3
+
4
+ window.load_assets_table = ->
5
+ return if $('#assets').length == 0
6
+ $select_all_checkbox = $('#assets_table_select_all')
7
+ $delete_selected_button = $('#delete_selected_assets')
8
+
9
+ $('#assets').DataTable {
10
+ select: true
11
+ "responsive": true,
12
+ "serverSide": true,
13
+ "processing": true,
14
+ "ajax": $('#assets').attr('data-source'),
15
+ "order": [[2, 'asc']],
16
+ "language": {
17
+ "emptyTable": "No assets have been added yet. Upload files above to create new assets.",
18
+ "processing": "<span><i class='fa fa-spinner fa-spin fa-large'></i></span>"
19
+ },
20
+ "dom": 'l<"toolbar">frtip'
21
+ }
22
+
23
+ window.$assets_table = $('#assets').dataTable()
24
+ window.assets_table_api = $assets_table.api()
25
+
26
+ $('#assets_wrapper').find('.toolbar').append($delete_selected_button.remove())
27
+
28
+ assets_table_api.on "select", (e, dt, type, indexes) ->
29
+ $(assets_table_api.rows(indexes).nodes()).find('input[type="checkbox"]').prop('checked', true) if type == "row"
30
+ $delete_selected_button.show() if assets_table_api.rows({ selected: true }).any()
31
+ assets_table_api.on "deselect", (e, dt, type, indexes) ->
32
+ $(assets_table_api.rows(indexes).nodes()).find('input[type="checkbox"]').prop('checked', false) if type == "row"
33
+ $delete_selected_button.hide() unless assets_table_api.rows({ selected: true }).any()
34
+
35
+ $(document).on 'click', '#assets_table_select_all', (e) ->
36
+ $checkbox = $(e.target)
37
+ if $checkbox.prop('checked')
38
+ assets_table_api.rows().select()
39
+ else
40
+ assets_table_api.rows().deselect()
41
+
42
+ $assets_table.on 'draw.dt', ->
43
+ $(document).trigger('updateCopyLinks')
44
+
38
45
 
39
46
  window.assets_table_add_rows = (rows) ->
40
47
  assets_table_api.rows.add(rows).draw()
@@ -0,0 +1,142 @@
1
+ window.ace_edit = (id, template_type, name) ->
2
+ name = 'template_content' if !name
3
+ textarea_id = name + '-' + id
4
+ editor_id = name + '_editor-' + id
5
+ $('#'+editor_id).show()
6
+ editor = ace.edit(editor_id)
7
+ $textarea = $('#'+textarea_id)
8
+ $textarea.hide()
9
+ create_ace_toolbar(editor, $textarea.attr('data-assets-url'), $textarea.attr('data-pages-url'))
10
+ session = editor.getSession()
11
+ session.setMode("ace/mode/" + template_type)
12
+ session.setValue($textarea.val())
13
+ session.setTabSize(2)
14
+ session.setUseSoftTabs(true)
15
+ session.setUseWrapMode(true)
16
+ session.on 'change', ->
17
+ $textarea.val(editor.getSession().getValue())
18
+ editor.commands.addCommand({
19
+ name: 'save',
20
+ bindKey: {win: 'Ctrl-S', mac: 'Command-S'},
21
+ exec: (editor) ->
22
+ $("#"+editor.container.id).closest('form').submit()
23
+ ,
24
+ readOnly: false
25
+ })
26
+ editor.setOptions({
27
+ enableBasicAutocompletion: true,
28
+ enableSnippets: true
29
+ })
30
+ return editor
31
+
32
+ create_ace_toolbar = (editor, assets_modal_url, pages_modal_url) ->
33
+ $toolbar = $("<ul class='nav ace-editor-toolbar'></ul>").insertBefore($(editor.container))
34
+ heading_dropdown = $("
35
+ <li class='dropdown'>
36
+ <a class='dropdown-toggle' data-toggle='dropdown' href='javascript:void(0)' role='button' aria-haspopup='true' aria-expanded='false'><i class='fa fa-header'></i><span class='caret'></span></a>
37
+ <ul class='dropdown-menu'>
38
+ </ul>
39
+ </li>
40
+ ")
41
+ heading_actions = [
42
+ $("<a href='javascript:void(0);' data-command='h1' class='h1'>Heading</a>"),
43
+ $("<a href='javascript:void(0);' data-command='h2' class='h2'>Heading</a>"),
44
+ $("<a href='javascript:void(0);' data-command='h3' class='h3'>Heading</a>"),
45
+ $("<a href='javascript:void(0);' data-command='h4' class='h4'>Heading</a>")
46
+ ]
47
+ actions = [
48
+ $("<a href='javascript:void(0);' data-command='bold'><i class='fa fa-bold'></i></a>"),
49
+ $("<a href='javascript:void(0);' data-command='bold'><i class='fa fa-italic'></i></a>"),
50
+ heading_dropdown,
51
+ $("<a href='javascript:void(0);'><i class='fa fa-link'></i></a>").click(-> open_link_selector(pages_modal_url, editor))
52
+ $("<a href='javascript:void(0);'>Image</a>").click(-> open_asset_selector(assets_modal_url, editor))
53
+ ]
54
+ for $action in actions
55
+ $toolbar.append($action)
56
+ for $action in heading_actions
57
+ $toolbar.find('ul').append($action)
58
+ $toolbar.find('a').each ->
59
+ if $(this).attr('data-command')
60
+ $(this).click(-> edit_selection(editor, $(this).attr('data-command')))
61
+ $toolbar.find('> a, ul > a').wrap("<li></li>")
62
+
63
+ open_asset_selector = (url, editor) ->
64
+ open_modal url, 'asset_selector_modal', editor, ->
65
+ $modal = $(this)
66
+
67
+ $select_button = $modal.find('.btn.select')
68
+ $select_button.on 'click', ->
69
+ selected_assets = window.assets_table_api.rows({ selected: true })
70
+ return if selected_assets.count() == 0
71
+ insert_assets(selected_assets.data(), $modal, editor)
72
+
73
+ load_assets_table($select_button)
74
+ assets_table_api.on "select", (e, dt, type, indexes) ->
75
+ $select_button.prop('disabled', !assets_table_api.rows({ selected: true}).any()) if type == 'row'
76
+ assets_table_api.on "deselect", (e, dt, type, indexes) ->
77
+ $select_button.prop('disabled', !assets_table_api.rows({ selected: true}).any()) if type == 'row'
78
+
79
+ open_modal = (url, name, editor, callback) ->
80
+ if $('#' + name).length > 0
81
+ $('#'+ name).modal('toggle')
82
+ else
83
+ $.get url, (data) ->
84
+ $('<div id="' + name + '" class="modal fade">' + data + '</div>').appendTo('body').modal().one 'shown.bs.modal', callback
85
+
86
+ open_link_selector = (url, editor) ->
87
+ open_modal url, 'page_selector_modal', editor, ->
88
+ $modal = $(this)
89
+ $form = $modal.find('form')
90
+ $label_field = $form.find('input[name="label"]')
91
+
92
+ $modal.on 'shown.bs.modal', ->
93
+ $label_field.val(editor.getSelectedText()) if !editor.selection.isEmpty()
94
+ .trigger('shown.bs.modal')
95
+
96
+ $url_fields = $form.find('select[name="page"], input[name="url"]')
97
+ $form.find('select[name="type"]').on 'change', (e) ->
98
+ $url_fields.closest('.form-group').addClass('hidden')
99
+ $url_fields.filter('[name="' + e.target.value + '"]').closest('.form-group').removeClass('hidden')
100
+ .change()
101
+
102
+ $form.find('select[name="page"]').on 'change', (e) ->
103
+ $label_field.val($(this).find('option:selected').text().replace(/^[- ]+/, '')) if !$label_field.val().length
104
+
105
+ $modal.find('.btn.select').click ->
106
+ $form.submit()
107
+
108
+ $form.on 'submit', (e) ->
109
+ form = e.target
110
+ url = (if (form.type.value == "page") then form.page.value else form.url.value)
111
+ label = form.label.value
112
+ link_string = '['+label+']('+url+')'
113
+ link_string = link_string + '{:target="_blank"}' if form.open_in_new_tab.checked
114
+ editor.insert(link_string)
115
+ $modal.modal('toggle')
116
+ $form.trigger('reset')
117
+ editor.focus()
118
+ return false
119
+
120
+ insert_assets = (asset_rows, $selector_modal, editor) ->
121
+ editor.insert(("!["+name+"]("+path+" '"+name+"')" for [path, preview, name, size, type] in asset_rows).join('\n') + "\n")
122
+ $selector_modal.modal('toggle')
123
+ editor.focus()
124
+
125
+ edit_selection = (editor, command) ->
126
+ snippetManager = ace.require("ace/snippets").snippetManager
127
+ session = editor.session
128
+ current_row = editor.selection.getRange().start.row
129
+ switch command
130
+ when 'bold'
131
+ snippetManager.insertSnippet(editor, "**${0:$SELECTION}**")
132
+ when 'italic'
133
+ snippetManager.insertSnippet(editor, "*${0:$SELECTION}*")
134
+ when 'h1'
135
+ session.insert({ row: current_row, column: 0 }, '# ')
136
+ when 'h2'
137
+ session.insert({ row: current_row, column: 0 }, '## ')
138
+ when 'h3'
139
+ session.insert({ row: current_row, column: 0 }, '### ')
140
+ when 'h4'
141
+ session.insert({ row: current_row, column: 0 }, '#### ')
142
+ editor.focus()
@@ -20,8 +20,8 @@
20
20
  */
21
21
 
22
22
  @import 'bootstrap_and_overrides';
23
- @import 'dataTables/bootstrap/3/jquery.dataTables.bootstrap';
24
- @import 'dataTables/extras/dataTables.responsive';
23
+ @import 'datatables/dataTables.bootstrap';
24
+ @import 'datatables-responsive';
25
25
  @import 'layout';
26
26
  @import 'forms';
27
27
  @import 'guides';
@@ -1,9 +1,5 @@
1
-
2
-
3
- // .table-striped > tbody > tr:nth-child(odd) > td,
4
- // .table-striped > tbody > tr:nth-child(odd) > th { background:darken($table-bg-accent, 5%); }
5
-
6
1
  table#assets {
2
+ tr.selected td { background:darken($table-bg-accent, 5%); }
7
3
  td { vertical-align:middle; }
8
4
  .preview a {
9
5
  height:30px; width:30px; display:block; position:relative;
@@ -11,14 +7,14 @@ table#assets {
11
7
  }
12
8
  }
13
9
 
14
- #assets_wrapper {
15
- position:relative;
16
- #assets_processing {
17
- width:100%; height:100%; top:0; left:0; text-align:center; margin:0; padding:0;
18
- &:before { display:inline-block; vertical-align:middle; content:""; height:100%; }
19
- span { display:inline-block; vertical-align:middle; }
20
- }
10
+ .dataTables_info {
11
+ .select-info { margin-left:5px; font-style:italic; color:$gray-light; }
12
+ }
13
+ #upload_assets {
14
+ .progress { margin:5px 0; }
15
+ }
21
16
 
17
+ #assets_wrapper {
22
18
  #assets_length,
23
19
  .toolbar { float:left; margin-right:10px; }
24
20
  th.column_delete {
@@ -15,3 +15,16 @@ textarea[name="content[content]"],
15
15
  min-height:10em;
16
16
  }
17
17
  }
18
+
19
+ .ace_editor .ace_content { padding:10px; }
20
+ .ace-editor-toolbar {
21
+ background:#f9f9f9; border:1px solid darken(#f9f9f9,10%); border-radius:$border-radius-base $border-radius-base 0 0; line-height:40px; width:97%; margin:0; padding:0;
22
+ li {
23
+ list-style-type:none; margin:0; display:inline-block;
24
+ a {
25
+ color:inherit; padding:0 10px; display:block; margin:0 !important;
26
+ &:hover { background:darken(#f9f9f9,10%); text-decoration:none; }
27
+ }
28
+ }
29
+ .dropdown li { display:list-item; }
30
+ }
@@ -10,7 +10,14 @@ module Smithy
10
10
  @asset_source = AssetSource.first
11
11
  respond_with @assets, :layout => 'smithy/wide' do |format|
12
12
  format.html
13
- format.json { render json: ::Smithy::AssetsDatatable.new(view_context) }
13
+ format.json { render json: ::Smithy::AssetsDatatable.new(view_context, params[:type]) }
14
+ end
15
+ end
16
+
17
+ def show
18
+ @asset = Asset.find(params[:id])
19
+ respond_with @asset do |format|
20
+ format.html { redirect_to @asset.url }
14
21
  end
15
22
  end
16
23
 
@@ -19,18 +26,6 @@ module Smithy
19
26
  respond_with @asset
20
27
  end
21
28
 
22
- # def create
23
- # @asset = Asset.new(filtered_params)
24
- # @asset.save
25
- # respond_with @asset do |format|
26
- # format.html {
27
- # flash.notice = "Your asset was created" if @asset.persisted?
28
- # redirect_to assets_path
29
- # }
30
- # format.js { render json: ::Smithy::AssetsDatatable.new(view_context).new_row(@asset), callback: 'assets_table_add_row' }
31
- # end
32
- # end
33
-
34
29
  def edit
35
30
  @asset = Asset.find(params[:id])
36
31
  respond_with @asset
@@ -50,6 +45,12 @@ module Smithy
50
45
  respond_with @asset
51
46
  end
52
47
 
48
+ def selector_modal
49
+ respond_to do |format|
50
+ format.html { render :layout => 'smithy/modal' }
51
+ end
52
+ end
53
+
53
54
  def batch_destroy
54
55
  @assets = Asset.where(id: params[:ids])
55
56
  @assets.destroy_all
@@ -7,7 +7,7 @@ module Smithy
7
7
  before_filter :load_page_from_path, :only => [ :show ]
8
8
  before_filter :initialize_page, :only => [ :new, :create ]
9
9
  before_filter :load_page, :only => [ :edit, :update, :destroy ]
10
- before_filter :load_parent, :except => [ :index, :show, :order ]
10
+ before_filter :load_parent, :except => [ :index, :show, :order, :selector_modal ]
11
11
  before_filter :load_root, :only => [ :index ]
12
12
  respond_to :html, :json
13
13
 
@@ -65,6 +65,12 @@ module Smithy
65
65
  redirect_to pages_path
66
66
  end
67
67
 
68
+ def selector_modal
69
+ respond_to do |format|
70
+ format.html { render :layout => 'smithy/modal' }
71
+ end
72
+ end
73
+
68
74
  private
69
75
  def initialize_page
70
76
  @page = Page.new(filtered_params)
@@ -3,8 +3,9 @@ module Smithy
3
3
  include AssetsHelper
4
4
  delegate :params, :link_to, :image_tag, :number_to_human_size, :attachment_url, :attachment_image_tag, :file_type_icon, :check_box_tag, :render, to: :@view
5
5
 
6
- def initialize(view)
6
+ def initialize(view, view_type)
7
7
  @view = view
8
+ @view_type = view_type
8
9
  end
9
10
 
10
11
  def as_json(options = {})
@@ -31,14 +32,24 @@ module Smithy
31
32
  end
32
33
 
33
34
  def render_asset(asset)
34
- [
35
- check_box_tag('ids[]', asset.id, false, class: "delete"),
36
- asset_preview_link(asset),
37
- asset.name,
38
- number_to_human_size(asset.file_size),
39
- asset.file_content_type,
40
- "#{render(partial: '/smithy/assets/actions', formats: :html, locals: { asset: asset })}"
41
- ]
35
+ if @view_type == 'selector_view'
36
+ [
37
+ "/smithy/assets/#{asset.id}",
38
+ asset_preview_link(asset),
39
+ asset.name,
40
+ number_to_human_size(asset.file_size),
41
+ asset.file_content_type
42
+ ]
43
+ else
44
+ [
45
+ check_box_tag('ids[]', asset.id, false, class: "delete"),
46
+ asset_preview_link(asset),
47
+ asset.name,
48
+ number_to_human_size(asset.file_size),
49
+ asset.file_content_type,
50
+ render(partial: '/smithy/assets/actions', formats: :html, locals: { asset: asset })
51
+ ]
52
+ end
42
53
  end
43
54
 
44
55
  def assets
@@ -23,6 +23,17 @@ module Smithy
23
23
  attr_accessor :publish
24
24
  attr_reader :liquid_context
25
25
 
26
+ def self.page_selector_options
27
+ items = Array(self.roots)
28
+ result = []
29
+ items.each do |root|
30
+ result += Page.associate_parents(root.self_and_descendants).map do |i|
31
+ ["#{'-' * i.level} #{i.title}", i.url]
32
+ end.compact
33
+ end
34
+ result
35
+ end
36
+
26
37
  def container?(container_name)
27
38
  containers.where(:name => container_name).count > 0
28
39
  end
@@ -16,8 +16,6 @@ module Smithy
16
16
  scope :for_container, ->(container) { where(:container => container) }
17
17
  scope :publishable, -> { where(:publishable => true) }
18
18
 
19
- delegate :name, to: :content_block, prefix: :content_block
20
-
21
19
  def attributes=(attributes = {})
22
20
  self.content_block_type = attributes[:content_block_type]
23
21
  super
@@ -9,6 +9,7 @@
9
9
  </div>
10
10
  <div class="modal-footer">
11
11
  <button class="btn btn-default" data-dismiss="modal" aria-hidden="true">Close</button>
12
+ <%= yield :footer %>
12
13
  </div>
13
14
  </div>
14
15
  </div>
@@ -1,4 +1,3 @@
1
- <%- full_url = attachment_url(asset, :file) -%>
2
- <%= link_to "Copy URL", full_url, class: "btn btn-primary btn-xs copy-to-clipboard", data: { 'clipboard-text' => full_url } %>
1
+ <%= link_to "Copy URL", asset.url, class: "btn btn-primary btn-xs copy-to-clipboard", data: { 'clipboard-text' => asset.url } %>
3
2
  <%= link_to "Edit", [:edit, asset], class: "btn btn-primary btn-xs" %>
4
3
  <%= link_to "Delete", asset, class: "btn btn-danger btn-xs", method: :delete, data: { confirm: "Are you sure?" } %>
@@ -1,6 +1,6 @@
1
1
  <% content_for :title, "Assets" %>
2
2
 
3
- <div class="well">
3
+ <div class="well" id="upload_assets">
4
4
  <%= semantic_form_for @asset_source, remote: true, multipart: true do |f| %>
5
5
  <%= f.inputs do %>
6
6
  <a id="choose-files" data-presigned-upload-field-url="<%= presigned_upload_field_asset_source_path(@asset_source) %>" class="btn btn-default" href="javascript:void(0);"><%= icon('cloud-upload') %> Upload files</a>
@@ -17,12 +17,12 @@
17
17
  <%= content_tag :table, id: "assets", class: "table table-striped responsive no-wrap display", data: { source: "#{ assets_url(format: "json") }" } do %>
18
18
  <thead>
19
19
  <tr>
20
- <th style="width:20px;" class="column_delete"><%= check_box_tag "assets_table_select_all" %></th>
21
- <th style="width:30px;">&nbsp;</th>
20
+ <%= content_tag :th, check_box_tag("assets_table_select_all"), class: 'column_delete', style: 'width:20px;', data: { orderable: false, searchable: false } %>
21
+ <%= content_tag :th, "", style: 'width:30px;', data: { orderable: false, searchable: false, class_name: 'preview' } %>
22
22
  <th>Name</th>
23
23
  <th>Size</th>
24
24
  <th>Type</th>
25
- <th>Actions</th>
25
+ <%= content_tag :th, "Actions", data: { orderable: false, searchable: false } %>
26
26
  </tr>
27
27
  </thead>
28
28
  <% end %>
@@ -0,0 +1,20 @@
1
+ <%= content_for :title do %>
2
+ Insert Image(s)
3
+ <% end %>
4
+ <div>
5
+ <%= content_tag :table, id: "assets", class: "table table-striped no-wrap display", data: { source: "#{ assets_url(format: "json", type: :selector_view) }" } do %>
6
+ <thead>
7
+ <tr>
8
+ <%= content_tag :th, "", data: { orderable: false, searchable: false, visible: false } %>
9
+ <%= content_tag :th, "", style: 'width:30px;', data: { orderable: false, searchable: false, class_name: 'preview' } %>
10
+ <th>Name</th>
11
+ <th>Size</th>
12
+ <th>Type</th>
13
+ </tr>
14
+ </thead>
15
+ <% end %>
16
+ </div>
17
+ <%= content_for :footer do %>
18
+ <button class='btn btn-primary select' disabled="disabled">Select</button>
19
+ <% end %>
20
+
@@ -1,12 +1,12 @@
1
1
  <%= f.inputs do %>
2
- <%= f.input :content, :as => :text, :input_html => { :class => "col-md-12", :id => "template_content-#{f.object.id || 'new'}" }, :hint => "Use markdown syntax for formatting. You can also use HTML directly. <a href=\"#{guide_path('markdown')}\" data-toggle=\"remote-load\" data-target=\"#content-guide\">See our markdown syntax reference</a>".html_safe %>
2
+ <%= f.input :content, :as => :text, :input_html => { :class => "col-md-12", :id => "template_content-#{f.object.id || 'new'}", data: { assets_url: selector_modal_assets_path, pages_url: selector_modal_pages_path } }, :hint => "Use markdown syntax for formatting. You can also use HTML directly. <a href=\"#{guide_path('markdown')}\" data-toggle=\"remote-load\" data-target=\"#content-guide\">See our markdown syntax reference</a>".html_safe %>
3
3
  <div id="template_content_editor-<%= f.object.id || 'new' %>" class="template_content_editor"></div>
4
4
  <div id="content-guide"></div>
5
5
  <% end %>
6
6
 
7
7
  <% content_for :javascript do %>
8
8
  <%= javascript_tag do %>
9
- var editor = ace_edit('<%= f.object.id || 'new' %>', 'markdown');
9
+ var editor = ace_edit('<%= f.object.id || 'new' %>', 'markdown', '');
10
10
  editor.renderer.setShowGutter(false);
11
11
  <% end %>
12
12
  <% end %>
@@ -0,0 +1,33 @@
1
+ <%= content_for :title do %>
2
+ Insert Link
3
+ <% end %>
4
+ <form class="formtastic">
5
+ <div class="form-group">
6
+ <%= label_tag :label, nil, class: "control-label" %>
7
+ <%= text_field_tag :label, nil, class: "form-control" %>
8
+ </div>
9
+ <fieldset>
10
+ <div class="form-group">
11
+ <%= label_tag :type, "Link To", class: "control-label" %>
12
+ <%= select_tag :type, options_for_select([["Page", "page"], ["External URL", "url"]]), class: "form-control" %>
13
+ </div>
14
+ <div class="form-group hidden">
15
+ <%= label_tag :page, nil, class: "control-label" %>
16
+ <%= select_tag :page, options_for_select(Smithy::Page.page_selector_options), class: "form-control" %>
17
+ </div>
18
+ <div class="form-group hidden">
19
+ <%= label_tag :url, nil, class: "control-label" %>
20
+ <%= text_field_tag :url, nil, class: "form-control" %>
21
+ </div>
22
+ <div class="form-group">
23
+ <%= label_tag :open_in_new_tab, nil, class: "control-label" do %>
24
+ <%= check_box_tag :open_in_new_tab %>
25
+ Open link in new tab
26
+ <% end %>
27
+ </div>
28
+ </fieldset>
29
+ </form>
30
+ <%= content_for :footer do %>
31
+ <button class='btn btn-primary select'>Select</button>
32
+ <% end %>
33
+
@@ -7,6 +7,16 @@ Rails.application.routes.prepend do
7
7
  mount Refile.app, at: Refile.mount_point, as: :refile_app
8
8
  end
9
9
 
10
+ # aws = {
11
+ # access_key_id: 'AKIAJTMAZVFVSBOL6AKQ',
12
+ # secret_access_key: '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',
13
+ # region: 'us-west-2',
14
+ # bucket: 'testsmithy',
15
+ # }
16
+
17
+ # Refile.cache = Refile::S3.new(prefix: "cache", **aws)
18
+ # Refile.store = Refile::S3.new(prefix: "store", **aws)
19
+
10
20
  if ENV['AWS_ACCESS_KEY_ID'].present? && ENV['AWS_SECRET_ACCESS_KEY'].present? && ENV['AWS_S3_BUCKET'].present?
11
21
  aws = {
12
22
  access_key_id: ENV['AWS_ACCESS_KEY_ID'],
data/config/routes.rb CHANGED
@@ -8,6 +8,7 @@ Smithy::Engine.routes.draw do
8
8
  resources :assets do
9
9
  collection do
10
10
  post :batch_destroy
11
+ get :selector_modal
11
12
  end
12
13
  end
13
14
  resources :asset_sources do
@@ -20,6 +21,7 @@ Smithy::Engine.routes.draw do
20
21
  resources :pages do
21
22
  collection do
22
23
  get :order
24
+ get :selector_modal
23
25
  end
24
26
  resources :contents, :controller => "page_contents", :except => [ :index ] do
25
27
  member do
@@ -9,10 +9,11 @@ require 'formtastic-bootstrap'
9
9
  require 'friendly_id'
10
10
  require 'httparty'
11
11
  require 'kaminari'
12
- require 'jquery-fileupload-rails'
13
- require 'jquery-datatables-rails'
14
12
  require 'jquery/rails'
15
13
  require 'liquid'
14
+ require 'rails-assets-datatables'
15
+ require 'rails-assets-datatables-select'
16
+ require 'rails-assets-datatables-responsive'
16
17
  require 'refile/rails'
17
18
  require 'refile/mini_magick'
18
19
  require 'remotipart'