smithycms 0.6.0 → 0.6.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.
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'