smithycms 0.6.0 → 0.6.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/app/assets/javascripts/smithy/application.js +7 -3
- data/app/assets/javascripts/smithy/asset_uploads.coffee +1 -1
- data/app/assets/javascripts/smithy/assets.js.coffee +44 -37
- data/app/assets/javascripts/smithy/editor.coffee +142 -0
- data/app/assets/stylesheets/smithy/application.scss +2 -2
- data/app/assets/stylesheets/smithy/assets.scss +8 -12
- data/app/assets/stylesheets/smithy/templates.scss +13 -0
- data/app/controllers/smithy/assets_controller.rb +14 -13
- data/app/controllers/smithy/pages_controller.rb +7 -1
- data/app/models/smithy/assets_datatable.rb +20 -9
- data/app/models/smithy/page.rb +11 -0
- data/app/models/smithy/page_content.rb +0 -2
- data/app/views/layouts/smithy/modal.html.erb +1 -0
- data/app/views/smithy/assets/_actions.html.erb +1 -2
- data/app/views/smithy/assets/index.html.erb +4 -4
- data/app/views/smithy/assets/selector_modal.html.erb +20 -0
- data/app/views/smithy/contents/_form_fields.html.erb +2 -2
- data/app/views/smithy/pages/_selector_modal_page.html.erb +0 -0
- data/app/views/smithy/pages/selector_modal.html.erb +33 -0
- data/config/initializers/refile.rb +10 -0
- data/config/routes.rb +2 -0
- data/lib/smithy/dependencies.rb +3 -2
- data/lib/smithy/formatter.rb +7 -2
- data/lib/smithy/version.rb +1 -1
- data/vendor/cache/CFPropertyList-2.3.2.gem +0 -0
- data/vendor/cache/actionmailer-4.1.10.gem +0 -0
- data/vendor/cache/actionpack-4.1.10.gem +0 -0
- data/vendor/cache/actionview-4.1.10.gem +0 -0
- data/vendor/cache/activemodel-4.1.10.gem +0 -0
- data/vendor/cache/activerecord-4.1.10.gem +0 -0
- data/vendor/cache/activesupport-4.1.10.gem +0 -0
- data/vendor/cache/addressable-2.3.8.gem +0 -0
- data/vendor/cache/arel-5.0.1.20140414130214.gem +0 -0
- data/vendor/cache/autoprefixer-rails-6.3.1.gem +0 -0
- data/vendor/cache/awesome_nested_set-3.0.3.gem +0 -0
- data/vendor/cache/aws-sdk-2.2.13.gem +0 -0
- data/vendor/cache/aws-sdk-core-2.2.13.gem +0 -0
- data/vendor/cache/aws-sdk-resources-2.2.13.gem +0 -0
- data/vendor/cache/bcrypt-3.1.10.gem +0 -0
- data/vendor/cache/bootstrap-sass-3.2.0.2.gem +0 -0
- data/vendor/cache/builder-3.2.2.gem +0 -0
- data/vendor/cache/byebug-4.0.5.gem +0 -0
- data/vendor/cache/capybara-2.4.4.gem +0 -0
- data/vendor/cache/celluloid-0.16.0.gem +0 -0
- data/vendor/cache/coderay-1.1.0.gem +0 -0
- data/vendor/cache/coffee-rails-4.1.1.gem +0 -0
- data/vendor/cache/coffee-script-2.4.1.gem +0 -0
- data/vendor/cache/coffee-script-source-1.10.0.gem +0 -0
- data/vendor/cache/columnize-0.9.0.gem +0 -0
- data/vendor/cache/concurrent-ruby-1.0.0.gem +0 -0
- data/vendor/cache/coveralls-0.7.12.gem +0 -0
- data/vendor/cache/crass-1.0.2.gem +0 -0
- data/vendor/cache/database_cleaner-1.4.1.gem +0 -0
- data/vendor/cache/diff-lcs-1.2.5.gem +0 -0
- data/vendor/cache/docile-1.1.5.gem +0 -0
- data/vendor/cache/domain_name-0.5.23.gem +0 -0
- data/vendor/cache/dotenv-2.0.1.gem +0 -0
- data/vendor/cache/dotenv-rails-2.0.1.gem +0 -0
- data/vendor/cache/em-websocket-0.5.1.gem +0 -0
- data/vendor/cache/erubis-2.7.0.gem +0 -0
- data/vendor/cache/eventmachine-1.0.7.gem +0 -0
- data/vendor/cache/excon-0.45.4.gem +0 -0
- data/vendor/cache/execjs-2.6.0.gem +0 -0
- data/vendor/cache/factory_girl-4.5.0.gem +0 -0
- data/vendor/cache/factory_girl_rails-4.5.0.gem +0 -0
- data/vendor/cache/fakeweb-1.3.0.gem +0 -0
- data/vendor/cache/ffaker-2.0.0.gem +0 -0
- data/vendor/cache/ffi-1.9.8.gem +0 -0
- data/vendor/cache/fission-0.5.0.gem +0 -0
- data/vendor/cache/fog-1.37.0.gem +0 -0
- data/vendor/cache/fog-aliyun-0.1.0.gem +0 -0
- data/vendor/cache/fog-atmos-0.1.0.gem +0 -0
- data/vendor/cache/fog-aws-0.8.1.gem +0 -0
- data/vendor/cache/fog-brightbox-0.10.1.gem +0 -0
- data/vendor/cache/fog-core-1.35.0.gem +0 -0
- data/vendor/cache/fog-dynect-0.0.2.gem +0 -0
- data/vendor/cache/fog-ecloud-0.3.0.gem +0 -0
- data/vendor/cache/fog-google-0.1.0.gem +0 -0
- data/vendor/cache/fog-json-1.0.2.gem +0 -0
- data/vendor/cache/fog-local-0.2.1.gem +0 -0
- data/vendor/cache/fog-powerdns-0.1.1.gem +0 -0
- data/vendor/cache/fog-profitbricks-0.0.5.gem +0 -0
- data/vendor/cache/fog-radosgw-0.0.5.gem +0 -0
- data/vendor/cache/fog-riakcs-0.1.0.gem +0 -0
- data/vendor/cache/fog-sakuracloud-1.7.5.gem +0 -0
- data/vendor/cache/fog-serverlove-0.1.2.gem +0 -0
- data/vendor/cache/fog-softlayer-1.0.3.gem +0 -0
- data/vendor/cache/fog-storm_on_demand-0.1.1.gem +0 -0
- data/vendor/cache/fog-terremark-0.1.0.gem +0 -0
- data/vendor/cache/fog-vmfusion-0.1.0.gem +0 -0
- data/vendor/cache/fog-voxel-0.1.0.gem +0 -0
- data/vendor/cache/fog-vsphere-0.5.0.gem +0 -0
- data/vendor/cache/fog-xenserver-0.2.3.gem +0 -0
- data/vendor/cache/fog-xml-0.1.2.gem +0 -0
- data/vendor/cache/font-awesome-sass-4.5.0.gem +0 -0
- data/vendor/cache/formatador-0.2.5.gem +0 -0
- data/vendor/cache/formtastic-2.3.1.gem +0 -0
- data/vendor/cache/formtastic-bootstrap-3.0.0.gem +0 -0
- data/vendor/cache/friendly_id-5.0.5.gem +0 -0
- data/vendor/cache/fuubar-2.0.0.gem +0 -0
- data/vendor/cache/guard-2.12.5.gem +0 -0
- data/vendor/cache/guard-compat-1.2.1.gem +0 -0
- data/vendor/cache/guard-livereload-2.4.0.gem +0 -0
- data/vendor/cache/guard-rspec-4.5.0.gem +0 -0
- data/vendor/cache/hitimes-1.2.2.gem +0 -0
- data/vendor/cache/http-cookie-1.0.2.gem +0 -0
- data/vendor/cache/http_parser.rb-0.6.0.gem +0 -0
- data/vendor/cache/httparty-0.13.7.gem +0 -0
- data/vendor/cache/i18n-0.7.0.gem +0 -0
- data/vendor/cache/inflecto-0.0.2.gem +0 -0
- data/vendor/cache/ipaddress-0.8.2.gem +0 -0
- data/vendor/cache/jmespath-1.1.3.gem +0 -0
- data/vendor/cache/jquery-rails-3.1.4.gem +0 -0
- data/vendor/cache/json-1.8.2.gem +0 -0
- data/vendor/cache/kaminari-0.16.3.gem +0 -0
- data/vendor/cache/kramdown-1.9.0.gem +0 -0
- data/vendor/cache/launchy-2.4.3.gem +0 -0
- data/vendor/cache/letter_opener-1.3.0.gem +0 -0
- data/vendor/cache/liquid-2.6.3.gem +0 -0
- data/vendor/cache/listen-2.10.0.gem +0 -0
- data/vendor/cache/lumberjack-1.0.9.gem +0 -0
- data/vendor/cache/mail-2.6.3.gem +0 -0
- data/vendor/cache/method_source-0.8.2.gem +0 -0
- data/vendor/cache/mime-types-2.4.3.gem +0 -0
- data/vendor/cache/mini_magick-4.3.6.gem +0 -0
- data/vendor/cache/mini_portile-0.6.2.gem +0 -0
- data/vendor/cache/minitest-5.5.1.gem +0 -0
- data/vendor/cache/multi_json-1.11.0.gem +0 -0
- data/vendor/cache/multi_xml-0.5.5.gem +0 -0
- data/vendor/cache/mysql2-0.3.18.gem +0 -0
- data/vendor/cache/nenv-0.2.0.gem +0 -0
- data/vendor/cache/netrc-0.10.3.gem +0 -0
- data/vendor/cache/nokogiri-1.6.6.2.gem +0 -0
- data/vendor/cache/nokogumbo-1.4.7.gem +0 -0
- data/vendor/cache/notiffany-0.0.6.gem +0 -0
- data/vendor/cache/pg-0.18.1.gem +0 -0
- data/vendor/cache/pry-0.10.1.gem +0 -0
- data/vendor/cache/rack-1.5.2.gem +0 -0
- data/vendor/cache/rack-cache-1.5.1.gem +0 -0
- data/vendor/cache/rack-livereload-0.3.15.gem +0 -0
- data/vendor/cache/rack-protection-1.5.3.gem +0 -0
- data/vendor/cache/rack-test-0.6.3.gem +0 -0
- data/vendor/cache/rails-4.1.10.gem +0 -0
- data/vendor/cache/rails-assets-datatables-1.10.10.gem +0 -0
- data/vendor/cache/rails-assets-datatables-responsive-2.0.1.gem +0 -0
- data/vendor/cache/rails-assets-datatables-select-1.1.0.gem +0 -0
- data/vendor/cache/rails-assets-jquery-2.2.0.gem +0 -0
- data/vendor/cache/railties-4.1.10.gem +0 -0
- data/vendor/cache/rake-10.4.2.gem +0 -0
- data/vendor/cache/rb-fsevent-0.9.4.gem +0 -0
- data/vendor/cache/rb-inotify-0.9.5.gem +0 -0
- data/vendor/cache/rbvmomi-1.8.2.gem +0 -0
- data/vendor/cache/refile-0.6.2.gem +0 -0
- data/vendor/cache/refile-mini_magick-0.2.0.gem +0 -0
- data/vendor/cache/refile-s3-0.2.0.gem +0 -0
- data/vendor/cache/remotipart-1.2.1.gem +0 -0
- data/vendor/cache/rest-client-1.8.0.gem +0 -0
- data/vendor/cache/rinku-1.7.3.gem +0 -0
- data/vendor/cache/rspec-3.2.0.gem +0 -0
- data/vendor/cache/rspec-core-3.2.2.gem +0 -0
- data/vendor/cache/rspec-expectations-3.2.0.gem +0 -0
- data/vendor/cache/rspec-mocks-3.2.1.gem +0 -0
- data/vendor/cache/rspec-rails-3.2.1.gem +0 -0
- data/vendor/cache/rspec-support-3.2.2.gem +0 -0
- data/vendor/cache/ruby-oembed-0.8.14.gem +0 -0
- data/vendor/cache/ruby-progressbar-1.7.5.gem +0 -0
- data/vendor/cache/sanitize-4.0.1.gem +0 -0
- data/vendor/cache/sass-3.4.21.gem +0 -0
- data/vendor/cache/sass-rails-5.0.4.gem +0 -0
- data/vendor/cache/shellany-0.0.1.gem +0 -0
- data/vendor/cache/shoulda-matchers-2.8.0.gem +0 -0
- data/vendor/cache/simplecov-0.9.2.gem +0 -0
- data/vendor/cache/simplecov-html-0.9.0.gem +0 -0
- data/vendor/cache/sinatra-1.4.7.gem +0 -0
- data/vendor/cache/slodown-0.1.3.gem +0 -0
- data/vendor/cache/slop-3.6.0.gem +0 -0
- data/vendor/cache/smithycms-auth-0.4.2.gem +0 -0
- data/vendor/cache/sprockets-3.5.2.gem +0 -0
- data/vendor/cache/sprockets-rails-2.3.3.gem +0 -0
- data/vendor/cache/sqlite3-1.3.10.gem +0 -0
- data/vendor/cache/term-ansicolor-1.3.0.gem +0 -0
- data/vendor/cache/terminal-notifier-guard-1.6.4.gem +0 -0
- data/vendor/cache/thor-0.19.1.gem +0 -0
- data/vendor/cache/thread_safe-0.3.5.gem +0 -0
- data/vendor/cache/tilt-2.0.2.gem +0 -0
- data/vendor/cache/timers-4.0.1.gem +0 -0
- data/vendor/cache/tins-1.3.5.gem +0 -0
- data/vendor/cache/trollop-2.1.2.gem +0 -0
- data/vendor/cache/tzinfo-1.2.2.gem +0 -0
- data/vendor/cache/unf-0.1.4.gem +0 -0
- data/vendor/cache/unf_ext-0.0.6.gem +0 -0
- data/vendor/cache/xml-simple-1.1.5.gem +0 -0
- data/vendor/cache/xpath-2.0.0.gem +0 -0
- metadata +197 -26
- data/app/assets/javascripts/smithy/editor.js +0 -27
- data/app/helpers/smithy/upload_helper.rb +0 -112
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 9ef3603f75dac8deb5a376d8b940d80929f143ed
|
4
|
+
data.tar.gz: daf866a5e6562242e7e68a856764e90010f7aa1b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
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
|
7
|
-
//= require
|
8
|
-
//= require
|
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)
|
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
|
-
$
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
"
|
16
|
-
"
|
17
|
-
|
18
|
-
|
19
|
-
}
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
$(
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
$(
|
31
|
-
|
32
|
-
$
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
$
|
37
|
-
|
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 '
|
24
|
-
@import '
|
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
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
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
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
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
|
data/app/models/smithy/page.rb
CHANGED
@@ -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
|
@@ -1,4 +1,3 @@
|
|
1
|
-
|
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
|
-
|
21
|
-
|
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
|
-
|
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 %>
|
File without changes
|
@@ -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: 'MllOfy2tapECrQWP3TdF6GO8TpmJbF7xxEJsFGoq',
|
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
|
data/lib/smithy/dependencies.rb
CHANGED
@@ -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'
|