alchemy_cms 4.1.2 → 4.2.0.rc1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.github/ISSUE_TEMPLATE/Bug_report.md +0 -5
- data/.rubocop.yml +4 -1
- data/.travis.yml +3 -3
- data/CHANGELOG.md +29 -10
- data/Gemfile +5 -7
- data/README.md +114 -62
- data/Rakefile +2 -2
- data/alchemy_cms.gemspec +5 -5
- data/app/assets/images/alchemy/icon.svg +1 -1
- data/app/assets/javascripts/alchemy/admin.js +2 -0
- data/app/assets/javascripts/alchemy/alchemy.base.js.coffee +0 -24
- data/app/assets/javascripts/alchemy/alchemy.datepicker.js.coffee +11 -9
- data/app/assets/javascripts/alchemy/alchemy.dragndrop.js.coffee +7 -24
- data/app/assets/javascripts/alchemy/alchemy.element_editors.js.coffee +9 -8
- data/app/assets/javascripts/alchemy/alchemy.fixed_elements.js +38 -0
- data/app/assets/javascripts/alchemy/alchemy.sitemap.js.coffee +2 -4
- data/app/assets/javascripts/alchemy/alchemy.translations.js.coffee +1 -1
- data/app/assets/stylesheets/alchemy/_mixins.scss +2 -1
- data/app/assets/stylesheets/alchemy/_variables.scss +7 -2
- data/app/assets/stylesheets/alchemy/admin.scss +2 -1
- data/app/assets/stylesheets/alchemy/archive.scss +18 -4
- data/app/assets/stylesheets/alchemy/buttons.scss +1 -1
- data/app/assets/stylesheets/alchemy/dialogs.scss +1 -1
- data/app/assets/stylesheets/alchemy/elements.scss +154 -90
- data/app/assets/stylesheets/alchemy/filter_field.scss +30 -0
- data/app/assets/stylesheets/alchemy/flatpickr.scss +839 -0
- data/app/assets/stylesheets/alchemy/forms.scss +5 -1
- data/app/assets/stylesheets/alchemy/frame.scss +6 -14
- data/app/assets/stylesheets/alchemy/navigation.scss +109 -98
- data/app/assets/stylesheets/alchemy/search.scss +11 -29
- data/app/assets/stylesheets/alchemy/tables.scss +0 -23
- data/app/assets/stylesheets/alchemy/tags.scss +4 -27
- data/app/assets/stylesheets/alchemy/toolbar.scss +12 -2
- data/app/assets/stylesheets/tinymce/skins/alchemy/skin.min.css.scss +4 -33
- data/app/controllers/alchemy/admin/attachments_controller.rb +1 -12
- data/app/controllers/alchemy/admin/contents_controller.rb +2 -24
- data/app/controllers/alchemy/admin/elements_controller.rb +11 -49
- data/app/controllers/alchemy/admin/pages_controller.rb +1 -1
- data/app/controllers/alchemy/admin/pictures_controller.rb +1 -14
- data/app/controllers/alchemy/api/contents_controller.rb +1 -1
- data/app/controllers/alchemy/api/elements_controller.rb +1 -1
- data/app/controllers/alchemy/api/pages_controller.rb +1 -1
- data/app/controllers/concerns/alchemy/admin/archive_overlay.rb +20 -0
- data/app/helpers/alchemy/admin/base_helper.rb +8 -18
- data/app/helpers/alchemy/admin/elements_helper.rb +55 -85
- data/app/helpers/alchemy/admin/pictures_helper.rb +0 -23
- data/app/helpers/alchemy/elements_helper.rb +80 -120
- data/app/helpers/alchemy/pages_helper.rb +5 -24
- data/app/models/alchemy/content.rb +0 -1
- data/app/models/alchemy/content/factory.rb +33 -57
- data/app/models/alchemy/element.rb +46 -66
- data/app/models/alchemy/element/element_contents.rb +2 -2
- data/app/models/alchemy/page.rb +34 -4
- data/app/models/alchemy/page/page_elements.rb +30 -122
- data/app/serializers/alchemy/attachment_serializer.rb +0 -2
- data/app/serializers/alchemy/content_serializer.rb +0 -2
- data/app/serializers/alchemy/element_serializer.rb +0 -3
- data/app/serializers/alchemy/essence_boolean_serializer.rb +0 -2
- data/app/serializers/alchemy/essence_date_serializer.rb +0 -2
- data/app/serializers/alchemy/essence_file_serializer.rb +0 -2
- data/app/serializers/alchemy/essence_html_serializer.rb +0 -2
- data/app/serializers/alchemy/essence_link_serializer.rb +0 -2
- data/app/serializers/alchemy/essence_picture_serializer.rb +0 -2
- data/app/serializers/alchemy/essence_richtext_serializer.rb +0 -2
- data/app/serializers/alchemy/essence_select_serializer.rb +0 -2
- data/app/serializers/alchemy/essence_text_serializer.rb +0 -2
- data/app/serializers/alchemy/legacy_element_serializer.rb +0 -3
- data/app/serializers/alchemy/page_serializer.rb +2 -8
- data/app/serializers/alchemy/page_tree_serializer.rb +1 -1
- data/app/serializers/alchemy/picture_serializer.rb +0 -2
- data/app/views/alchemy/admin/clipboard/index.html.erb +2 -2
- data/app/views/alchemy/admin/clipboard/insert.js.erb +9 -12
- data/app/views/alchemy/admin/contents/create.js.erb +4 -30
- data/app/views/alchemy/admin/elements/_element.html.erb +27 -12
- data/app/views/alchemy/admin/elements/_element_toolbar.html.erb +1 -1
- data/app/views/alchemy/admin/elements/_new_element_form.html.erb +0 -10
- data/app/views/alchemy/admin/elements/create.js.erb +12 -12
- data/app/views/alchemy/admin/elements/fold.js.erb +1 -1
- data/app/views/alchemy/admin/elements/index.html.erb +20 -19
- data/app/views/alchemy/admin/elements/publish.js.erb +5 -0
- data/app/views/alchemy/admin/elements/trash.js.erb +4 -1
- data/app/views/alchemy/admin/essence_pictures/assign.js.erb +0 -7
- data/app/views/alchemy/admin/essence_pictures/destroy.js.erb +0 -22
- data/app/views/alchemy/admin/pages/_publication_fields.html.erb +2 -4
- data/app/views/alchemy/admin/pages/edit.html.erb +1 -1
- data/app/views/alchemy/admin/pages/index.html.erb +14 -10
- data/app/views/alchemy/admin/partials/_language_tree_select.html.erb +1 -1
- data/app/views/alchemy/admin/partials/_main_navigation_entry.html.erb +1 -1
- data/app/views/alchemy/admin/partials/_remote_search_form.html.erb +7 -5
- data/app/views/alchemy/admin/partials/_routes.html.erb +0 -1
- data/app/views/alchemy/admin/partials/_search_form.html.erb +6 -4
- data/app/views/alchemy/admin/pictures/_picture_to_assign.html.erb +6 -3
- data/app/views/alchemy/admin/pictures/index.html.erb +1 -1
- data/app/views/alchemy/admin/trash/index.html.erb +8 -7
- data/app/views/alchemy/elements/_editor_not_found.html.erb +1 -1
- data/app/views/alchemy/essences/_essence_picture_editor.html.erb +4 -19
- data/app/views/layouts/alchemy/admin.html.erb +1 -0
- data/bin/rspec +0 -5
- data/config/alchemy/config.yml +3 -0
- data/config/brakeman.ignore +1 -1
- data/config/locales/alchemy.en.yml +6 -12
- data/config/routes.rb +1 -5
- data/db/migrate/20180226123013_alchemy_four_point_zero.rb +0 -29
- data/db/migrate/20180519204655_add_fixed_to_alchemy_elements.rb +6 -0
- data/lib/alchemy/admin/locale.rb +1 -1
- data/lib/alchemy/cache_digests/template_tracker.rb +4 -27
- data/lib/alchemy/elements_finder.rb +111 -0
- data/lib/alchemy/errors.rb +0 -4
- data/lib/alchemy/modules.rb +49 -18
- data/lib/alchemy/tasks/tidy.rb +3 -40
- data/lib/alchemy/test_support/controller_requests.rb +1 -1
- data/lib/alchemy/test_support/essence_shared_examples.rb +1 -1
- data/lib/alchemy/test_support/factories/attachment_factory.rb +5 -3
- data/lib/alchemy/test_support/factories/content_factory.rb +4 -4
- data/lib/alchemy/test_support/factories/dummy_user_factory.rb +5 -5
- data/lib/alchemy/test_support/factories/element_factory.rb +12 -7
- data/lib/alchemy/test_support/factories/essence_text_factory.rb +1 -1
- data/lib/alchemy/test_support/factories/language_factory.rb +13 -13
- data/lib/alchemy/test_support/factories/page_factory.rb +18 -17
- data/lib/alchemy/test_support/factories/picture_factory.rb +6 -4
- data/lib/alchemy/test_support/factories/site_factory.rb +6 -6
- data/lib/alchemy/tinymce.rb +1 -1
- data/lib/alchemy/upgrader/four_point_two.rb +68 -0
- data/lib/alchemy/upgrader/tasks/cells_migration.rb +41 -0
- data/lib/alchemy/upgrader/tasks/cells_upgrader.rb +146 -0
- data/lib/alchemy/upgrader/tasks/picture_gallery_migration.rb +65 -0
- data/lib/alchemy/upgrader/tasks/picture_gallery_upgrader.rb +195 -0
- data/lib/alchemy/version.rb +1 -1
- data/lib/alchemy_cms.rb +1 -0
- data/lib/rails/generators/alchemy/elements/elements_generator.rb +1 -0
- data/lib/rails/generators/alchemy/elements/templates/editor.html.erb +0 -3
- data/lib/rails/generators/alchemy/elements/templates/editor.html.haml +0 -3
- data/lib/rails/generators/alchemy/elements/templates/editor.html.slim +0 -3
- data/lib/rails/generators/alchemy/elements/templates/view.html.erb +3 -14
- data/lib/rails/generators/alchemy/elements/templates/view.html.haml +3 -10
- data/lib/rails/generators/alchemy/elements/templates/view.html.slim +3 -10
- data/lib/tasks/alchemy/tidy.rake +1 -23
- data/lib/tasks/alchemy/upgrade.rake +44 -1
- data/vendor/assets/javascripts/flatpickr/flatpickr.min.js +2 -0
- data/vendor/assets/javascripts/tinymce/license.txt +0 -0
- data/vendor/assets/javascripts/tinymce/tinymce.min.js +2 -2
- metadata +25 -31
- data/app/assets/stylesheets/alchemy/jquery.datetimepicker.scss +0 -478
- data/app/models/alchemy/cell.rb +0 -95
- data/app/models/alchemy/page/page_cells.rb +0 -69
- data/app/serializers/alchemy/cell_serializer.rb +0 -19
- data/app/views/alchemy/admin/contents/new.html.erb +0 -11
- data/app/views/alchemy/admin/contents/order.js.erb +0 -3
- data/app/views/alchemy/admin/elements/_add_picture.html.erb +0 -14
- data/app/views/alchemy/admin/elements/_picture_gallery_editor.html.erb +0 -24
- data/bin/spring +0 -16
- data/lib/alchemy/test_support/factories/cell_factory.rb +0 -9
- data/vendor/assets/javascripts/date-formatter.js +0 -161
- data/vendor/assets/javascripts/jquery_plugins/jquery.datetimepicker.full.min.js +0 -2
data/Rakefile
CHANGED
@@ -50,12 +50,12 @@ BASH
|
|
50
50
|
end
|
51
51
|
|
52
52
|
namespace :changelog do
|
53
|
-
desc "Update
|
53
|
+
desc "Update changelog"
|
54
54
|
task :update do
|
55
55
|
original_file = './CHANGELOG.md'
|
56
56
|
new_file = original_file + '.new'
|
57
57
|
backup = original_file + '.old'
|
58
|
-
changes = `git rev-list v#{ENV['PREVIOUS_VERSION']}
|
58
|
+
changes = `git rev-list v#{ENV['PREVIOUS_VERSION']}...master | bundle exec github_fast_changelog AlchemyCMS/alchemy_cms`
|
59
59
|
File.open(new_file, 'w') do |fo|
|
60
60
|
fo.puts changes
|
61
61
|
File.foreach(original_file) do |li|
|
data/alchemy_cms.gemspec
CHANGED
@@ -10,15 +10,15 @@ Gem::Specification.new do |gem|
|
|
10
10
|
gem.authors = ['Thomas von Deyen', 'Robin Boening', 'Marc Schettke', 'Hendrik Mans', 'Carsten Fregin', 'Martin Meyerhoff']
|
11
11
|
gem.email = ['alchemy@magiclabs.de']
|
12
12
|
gem.homepage = 'https://alchemy-cms.com'
|
13
|
-
gem.summary = 'A powerful, userfriendly and flexible CMS for Rails
|
14
|
-
gem.description = 'Alchemy is a powerful, userfriendly and flexible Rails
|
13
|
+
gem.summary = 'A powerful, userfriendly and flexible CMS for Rails 5'
|
14
|
+
gem.description = 'Alchemy is a powerful, userfriendly and flexible Rails 5 CMS.'
|
15
15
|
gem.requirements << 'ImageMagick (libmagick), v6.6 or greater.'
|
16
|
-
gem.required_ruby_version = '>= 2.
|
16
|
+
gem.required_ruby_version = '>= 2.3.0'
|
17
17
|
gem.license = 'BSD New'
|
18
18
|
gem.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^spec/}) }
|
19
19
|
gem.require_paths = ['lib']
|
20
20
|
|
21
|
-
gem.add_runtime_dependency 'active_model_serializers', ['~> 0.
|
21
|
+
gem.add_runtime_dependency 'active_model_serializers', ['~> 0.10.0']
|
22
22
|
gem.add_runtime_dependency 'acts_as_list', ['~> 0.3']
|
23
23
|
gem.add_runtime_dependency 'awesome_nested_set', ['~> 3.1']
|
24
24
|
gem.add_runtime_dependency 'cancancan', ['~> 2.1']
|
@@ -33,7 +33,7 @@ Gem::Specification.new do |gem|
|
|
33
33
|
gem.add_runtime_dependency 'originator', ['~> 3.1']
|
34
34
|
gem.add_runtime_dependency 'non-stupid-digest-assets', ['~> 1.0.8']
|
35
35
|
gem.add_runtime_dependency 'rails', ['~> 5.0', '< 6.0']
|
36
|
-
gem.add_runtime_dependency 'ransack', ['
|
36
|
+
gem.add_runtime_dependency 'ransack', ['~> 2.0']
|
37
37
|
gem.add_runtime_dependency 'request_store', ['~> 1.2']
|
38
38
|
gem.add_runtime_dependency 'responders', ['~> 2.0']
|
39
39
|
gem.add_runtime_dependency 'select2-rails', ['>= 3.5.9.1', '< 4.0']
|
@@ -1 +1 @@
|
|
1
|
-
<svg xmlns="http://www.w3.org/2000/svg" viewBox="-
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="-2 -6 32 32" class="svg-inline--fa fa-lg fa-fw"><path fill="currentColor" d="M15.7 7.9L9.9 2.2 2.1 4.3 0 12.1l5.7 5.8 7.8-2.1 2.2-7.9zm-5.3 10.3l-1.2 4.4 3.2 3.2 4.4-1.2 1.2-4.4-3.2-3.2-4.4 1.2zM23.5 7.3L17.2 9l-1.7 6.2 4.5 4.6 6.2-1.7 1.7-6.2-4.4-4.6z"/></svg>
|
@@ -9,6 +9,7 @@
|
|
9
9
|
//= require jquery-ui/widgets/tabs
|
10
10
|
//= require tinymce/tinymce.min
|
11
11
|
//= require_tree ../../../../vendor/assets/javascripts/jquery_plugins/
|
12
|
+
//= require flatpickr/flatpickr.min
|
12
13
|
//= require clipboard.min
|
13
14
|
//= require keymaster
|
14
15
|
//= require requestAnimationFrame
|
@@ -27,6 +28,7 @@
|
|
27
28
|
//= require alchemy/alchemy.dragndrop
|
28
29
|
//= require alchemy/alchemy.element_editors
|
29
30
|
//= require alchemy/alchemy.elements_window
|
31
|
+
//= require alchemy/alchemy.fixed_elements
|
30
32
|
//= require alchemy/alchemy.growler
|
31
33
|
//= require alchemy/alchemy.gui
|
32
34
|
//= require alchemy/alchemy.hotkeys
|
@@ -76,30 +76,6 @@ $.extend Alchemy,
|
|
76
76
|
dropdownAutoWidth: true
|
77
77
|
return
|
78
78
|
|
79
|
-
# Selects cell tab for given name.
|
80
|
-
# Creates it if it's not present yet.
|
81
|
-
selectOrCreateCellTab: (cell_name, label) ->
|
82
|
-
$cells = $('#cells')
|
83
|
-
$tab = $("#cell_#{cell_name}")
|
84
|
-
if $tab.length == 0
|
85
|
-
$("<li><a href=\"#cell_#{cell_name}\">#{label}</a></li>")
|
86
|
-
.appendTo('#cells .ui-tabs-nav')
|
87
|
-
$tab = $("<div id=\"cell_#{cell_name}\" class=\"sortable_cell\"/>")
|
88
|
-
$cells.append($tab)
|
89
|
-
$cells.tabs().tabs('refresh')
|
90
|
-
$cells.tabs().tabs('option', 'active', $('#cells > div').index($tab))
|
91
|
-
return
|
92
|
-
|
93
|
-
# Inits the cell tabs
|
94
|
-
buildTabbedCells: (label) ->
|
95
|
-
$cells = $('<div id="cells"/>')
|
96
|
-
$('#cell_for_other_elements').wrap($cells)
|
97
|
-
$('#cells').prepend("<ul><li><a href=\"#cell_for_other_elements\">#{label}</a></li></ul>")
|
98
|
-
.tabs 'paging',
|
99
|
-
follow: true
|
100
|
-
followOnSelect: true
|
101
|
-
return
|
102
|
-
|
103
79
|
# Logs exception to js console, if present.
|
104
80
|
debug: (e) ->
|
105
81
|
if window["console"]
|
@@ -3,7 +3,6 @@ window.Alchemy = {} if typeof(window.Alchemy) is 'undefined'
|
|
3
3
|
$.extend Alchemy,
|
4
4
|
|
5
5
|
Datepicker: (scope) ->
|
6
|
-
$.datetimepicker.setLocale(Alchemy.locale);
|
7
6
|
$datepicker_inputs = $('input[data-datepicker-type]', scope)
|
8
7
|
|
9
8
|
# Initializes the datepickers on the text inputs and sets the proper type
|
@@ -15,13 +14,16 @@ $.extend Alchemy,
|
|
15
14
|
$datepicker_inputs.each ->
|
16
15
|
type = $(this).data('datepicker-type')
|
17
16
|
options =
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
17
|
+
# alchemy_i18n supports `zh_CN` etc., but flatpickr only has two-letter codes (`zh`)
|
18
|
+
locale: Alchemy.locale.slice(0, 2)
|
19
|
+
altInput: true
|
20
|
+
altFormat: Alchemy.t("formats.#{type}")
|
21
|
+
altInputClass: ""
|
22
|
+
enableTime: /time/.test(type)
|
23
|
+
noCalendar: type == "time"
|
24
|
+
time_24hr: Alchemy.t("formats.time_24hr")
|
25
|
+
onValueUpdate: (_selectedDates, _dateStr, instance) ->
|
26
|
+
Alchemy.setElementDirty $(instance.element).closest(".element-editor")
|
27
|
+
$(this).flatpickr(options)
|
26
28
|
|
27
29
|
return
|
@@ -5,7 +5,7 @@ window.Alchemy = {} if typeof (window.Alchemy) is "undefined"
|
|
5
5
|
|
6
6
|
$.extend Alchemy,
|
7
7
|
|
8
|
-
SortableElements: (page_id, form_token, selector = '#element_area .
|
8
|
+
SortableElements: (page_id, form_token, selector = '#element_area .sortable-elements') ->
|
9
9
|
Alchemy.initializedSortableElements = false
|
10
10
|
$sortable_area = $(selector)
|
11
11
|
|
@@ -25,7 +25,7 @@ $.extend Alchemy,
|
|
25
25
|
opacity: 0.5
|
26
26
|
cursor: "move"
|
27
27
|
containment: $('#element_area')
|
28
|
-
tolerance: "
|
28
|
+
tolerance: "pointer"
|
29
29
|
update: (event, ui) ->
|
30
30
|
# This callback is called twice for both elements, the source and the receiving
|
31
31
|
# but, we only want to call ajax callback once on the receiving element.
|
@@ -35,14 +35,11 @@ $.extend Alchemy,
|
|
35
35
|
Alchemy.initializedSortableElements = true
|
36
36
|
element_ids = $.map $this.children(), (child) ->
|
37
37
|
$(child).attr("data-element-id")
|
38
|
-
cell_id = $this.data("cell-id")
|
39
38
|
parent_element_id = ui.item.parent().closest("[data-element-id]").data('element-id')
|
40
39
|
params =
|
41
40
|
page_id: page_id
|
42
41
|
authenticity_token: encodeURIComponent(form_token)
|
43
42
|
element_ids: element_ids
|
44
|
-
if cell_id?
|
45
|
-
params['cell_id'] = cell_id
|
46
43
|
if parent_element_id?
|
47
44
|
params['parent_element_id'] = parent_element_id
|
48
45
|
$(event.target).css("cursor", "progress")
|
@@ -63,6 +60,10 @@ $.extend Alchemy,
|
|
63
60
|
$this.sortable('option', 'connectWith', $dropzone)
|
64
61
|
$this.sortable('refresh')
|
65
62
|
$dropzone.css('minHeight', 36)
|
63
|
+
ui.item.addClass('dragged')
|
64
|
+
if ui.item.hasClass('compact')
|
65
|
+
ui.placeholder.addClass('compact').css
|
66
|
+
height: ui.item.outerHeight()
|
66
67
|
Alchemy.Tinymce.remove(ids)
|
67
68
|
return
|
68
69
|
stop: (event, ui) ->
|
@@ -70,6 +71,7 @@ $.extend Alchemy,
|
|
70
71
|
name = ui.item.data('element-name')
|
71
72
|
$dropzone = $("[data-droppable-elements~='#{name}']")
|
72
73
|
$dropzone.css('minHeight', '')
|
74
|
+
ui.item.removeClass('dragged')
|
73
75
|
Alchemy.Tinymce.init(ids)
|
74
76
|
return
|
75
77
|
|
@@ -77,25 +79,6 @@ $.extend Alchemy,
|
|
77
79
|
$sortable_area.find('.nested-elements').sortable(sortable_options)
|
78
80
|
return
|
79
81
|
|
80
|
-
SortableContents: (selector, token) ->
|
81
|
-
$(selector).sortable
|
82
|
-
items: "div.draggable_picture"
|
83
|
-
handle: "div.picture_handle"
|
84
|
-
opacity: 0.5
|
85
|
-
cursor: "move"
|
86
|
-
tolerance: "pointer"
|
87
|
-
containment: "parent"
|
88
|
-
update: (event, ui) ->
|
89
|
-
ids = $.map $(this).children("div.draggable_picture"), (child) ->
|
90
|
-
child.id.replace /essence_picture_/, ""
|
91
|
-
$(event.originalTarget).css "cursor", "progress"
|
92
|
-
$.ajax
|
93
|
-
url: Alchemy.routes.order_admin_contents_path
|
94
|
-
type: "POST"
|
95
|
-
data: "authenticity_token=" + encodeURIComponent(token) + "&" + $.param(content_ids: ids)
|
96
|
-
complete: ->
|
97
|
-
$(event.originalTarget).css "cursor", "move"
|
98
|
-
|
99
82
|
DraggableTrashItems: ->
|
100
83
|
$("#trash_items div.draggable").each ->
|
101
84
|
$this = $(this)
|
@@ -55,12 +55,12 @@ Alchemy.ElementEditors =
|
|
55
55
|
# Selects element
|
56
56
|
# Scrolls to element
|
57
57
|
# Unfold if folded
|
58
|
-
# Also chooses the right
|
58
|
+
# Also chooses the right fixed elements tab, if necessary.
|
59
59
|
# Can be triggered through custom event 'FocusElementEditor.Alchemy'
|
60
60
|
# Used by the elements on click events in the preview frame.
|
61
61
|
focusElement: ($element) ->
|
62
62
|
element_id = $element.attr('id').replace(/\D/g, "")
|
63
|
-
@
|
63
|
+
@selectTabForElement($element)
|
64
64
|
# If we have folded parents we need to unfold each of them
|
65
65
|
# and then finally scroll to or unfold ourself
|
66
66
|
$folded_parents = $element.parents('.element-editor.folded')
|
@@ -72,12 +72,12 @@ Alchemy.ElementEditors =
|
|
72
72
|
@scrollToOrUnfold(element_id)
|
73
73
|
return
|
74
74
|
|
75
|
-
#
|
76
|
-
|
77
|
-
$
|
78
|
-
if $
|
79
|
-
$
|
80
|
-
$("#
|
75
|
+
# Selects tab for given element
|
76
|
+
selectTabForElement: ($element) ->
|
77
|
+
$tabs = $("#fixed-elements .sortable-elements")
|
78
|
+
if $tabs.size() > 0
|
79
|
+
$tab = $element.closest(".sortable-elements")
|
80
|
+
$("#fixed-elements").tabs("option", "active", $tabs.index($tab))
|
81
81
|
|
82
82
|
# Marks an element as selected in the element window and scrolls to it.
|
83
83
|
#
|
@@ -117,6 +117,7 @@ Alchemy.ElementEditors =
|
|
117
117
|
#
|
118
118
|
scrollToElement: (el) ->
|
119
119
|
$("#element_area").scrollTo el,
|
120
|
+
axis: 'y',
|
120
121
|
duration: 400
|
121
122
|
offset: -6
|
122
123
|
|
@@ -0,0 +1,38 @@
|
|
1
|
+
window.Alchemy = Alchemy || {};
|
2
|
+
|
3
|
+
Alchemy.FixedElements = {
|
4
|
+
WRAPPER: '<div id="fixed-elements"></div>',
|
5
|
+
TABS: '<ul><li><a href="#main-content-elements">{{label}}</a></li></ul>',
|
6
|
+
|
7
|
+
// Builds fixed elements tabs
|
8
|
+
buildTabs: function(label) {
|
9
|
+
var $wrapper = $(this.WRAPPER),
|
10
|
+
$tabs = $(this.TABS.replace(/{{label}}/, label));
|
11
|
+
|
12
|
+
$('#main-content-elements').wrap($wrapper);
|
13
|
+
$('#fixed-elements').prepend($tabs).tabs('paging', {
|
14
|
+
follow: true,
|
15
|
+
followOnSelect: true
|
16
|
+
});
|
17
|
+
},
|
18
|
+
|
19
|
+
// Creates a fixed element tab.
|
20
|
+
createTab: function(element_id, label) {
|
21
|
+
var $fixed_elements = $('#fixed-elements'),
|
22
|
+
$tab;
|
23
|
+
|
24
|
+
$('> ul', $fixed_elements).append('<li><a href="#fixed-element-' + element_id + '">' + label + '</a></li>');
|
25
|
+
$tab = $('<div id="fixed-element-' + element_id + '" class="sortable-elements" />');
|
26
|
+
$fixed_elements.append($tab);
|
27
|
+
$fixed_elements.tabs().tabs('refresh');
|
28
|
+
$fixed_elements.tabs('option', 'active', $('#fixed-elements > div').index($tab));
|
29
|
+
},
|
30
|
+
|
31
|
+
removeTab: function(element_id) {
|
32
|
+
var $fixed_elements = $('#fixed-elements');
|
33
|
+
|
34
|
+
$fixed_elements.find('a[href="#fixed-element-' + element_id + '"]').parent().remove();
|
35
|
+
$fixed_elements.find('div#fixed-element-' + element_id).remove();
|
36
|
+
$fixed_elements.tabs().tabs('refresh');
|
37
|
+
}
|
38
|
+
};
|
@@ -1,5 +1,3 @@
|
|
1
|
-
#= require date-formatter
|
2
|
-
|
3
1
|
window.Alchemy = {} if typeof(window.Alchemy) is 'undefined'
|
4
2
|
|
5
3
|
# The admin sitemap Alchemy module
|
@@ -8,7 +6,7 @@ Alchemy.Sitemap =
|
|
8
6
|
# Storing some objects.
|
9
7
|
init: (options) ->
|
10
8
|
@search_field = $(".search_input_field")
|
11
|
-
@filter_field_clear = $('.
|
9
|
+
@filter_field_clear = $('.search_field_clear')
|
12
10
|
@display = $('#page_filter_result')
|
13
11
|
@sitemap_wrapper = $('#sitemap-wrapper p.loading')
|
14
12
|
@template = Handlebars.compile($('#sitemap-template').html())
|
@@ -111,7 +109,7 @@ Alchemy.Sitemap =
|
|
111
109
|
now = new Date()
|
112
110
|
if $checkbox.is(':checked')
|
113
111
|
$publication_date_fields.removeClass('hidden')
|
114
|
-
$public_on_field.
|
112
|
+
$public_on_field[0]._flatpickr.setDate(now)
|
115
113
|
else
|
116
114
|
$publication_date_fields.addClass('hidden')
|
117
115
|
$public_on_field.val('')
|
@@ -182,11 +182,12 @@
|
|
182
182
|
cursor: zoom-in;
|
183
183
|
}
|
184
184
|
|
185
|
-
@mixin truncate($max-width, $display: inline-block) {
|
185
|
+
@mixin truncate($max-width, $display: inline-block, $wrap: normal) {
|
186
186
|
display: $display;
|
187
187
|
max-width: $max-width;
|
188
188
|
overflow: hidden;
|
189
189
|
text-overflow: ellipsis;
|
190
|
+
white-space: $wrap;
|
190
191
|
}
|
191
192
|
|
192
193
|
@mixin hint-hover-style {
|
@@ -76,6 +76,7 @@ $button-text-shadow: none !default;
|
|
76
76
|
$button-box-shadow: 0px 1px 1px -1px #333 !default;
|
77
77
|
$button-focus-box-shadow: 0px 1px 1px 0px $button-focus-border-color !default;
|
78
78
|
$button-padding: 0.55em 2em !default;
|
79
|
+
$small-button-padding: 0.4em 1.25em !default;
|
79
80
|
$button-margin: $form-field-margin !default;
|
80
81
|
|
81
82
|
$secondary-button-bg-color: transparent !default;
|
@@ -112,12 +113,13 @@ $sitemap-highlight-color: rgba(#fffba5, 0.5) !default;
|
|
112
113
|
|
113
114
|
$main-menu-width: 150px !default;
|
114
115
|
$collapsed-main-menu-width: 48px !default;
|
116
|
+
$collapsed-main-menu-entry-max-width: 300px !default;
|
115
117
|
$main-menu-bg-color: $dark-blue !default;
|
116
118
|
$main-menu-active-bg-color: $dark-orange !default;
|
117
119
|
$main-menu-active-text-color: $dark-blue !default;
|
118
120
|
$main-menu-text-color: $white !default;
|
119
121
|
$main-menu-icon-color: $white !default;
|
120
|
-
$main-menu-entry-max-width:
|
122
|
+
$main-menu-entry-max-width: 110px !default;
|
121
123
|
$toolbar-bg-color: $medium-gray !default;
|
122
124
|
$toolbar-height: 46px !default;
|
123
125
|
$element-toolbar-height: 37px !default;
|
@@ -135,7 +137,8 @@ $table-row-even-background-color: $white !default;
|
|
135
137
|
$table-row-odd-background-color: rgba($white, 0.5) !default;
|
136
138
|
$table-row-hover-color: rgba($light_yellow, 0.5) !default;
|
137
139
|
|
138
|
-
$elements-window-width:
|
140
|
+
$elements-window-width: 22.5vw !default;
|
141
|
+
$elements-window-min-width: 400px !default;
|
139
142
|
$element-header-bg-color: $medium-gray !default;
|
140
143
|
$top-menu-height: 75px !default;
|
141
144
|
|
@@ -157,3 +160,5 @@ $select-hover-bg-color: $dark-blue !default;
|
|
157
160
|
$select-hover-text-color: $white !default;
|
158
161
|
|
159
162
|
$thumbnail-background-color: opacify($default-border-color, 1) !default;
|
163
|
+
$medium-screen-break-point: 700px;
|
164
|
+
$large-screen-break-point: 1000px;
|
@@ -19,7 +19,9 @@
|
|
19
19
|
@import "alchemy/dashboard";
|
20
20
|
@import "alchemy/elements";
|
21
21
|
@import "alchemy/errors";
|
22
|
+
@import "alchemy/filter_field";
|
22
23
|
@import "alchemy/flash";
|
24
|
+
@import "alchemy/flatpickr";
|
23
25
|
@import "alchemy/fonts";
|
24
26
|
@import "alchemy/forms";
|
25
27
|
@import "alchemy/form_fields";
|
@@ -43,4 +45,3 @@
|
|
43
45
|
@import "alchemy/upload";
|
44
46
|
@import "alchemy/jquery-ui";
|
45
47
|
@import "jquery.Jcrop.min";
|
46
|
-
@import "jquery.datetimepicker";
|
@@ -1,3 +1,15 @@
|
|
1
|
+
.resources-header {
|
2
|
+
padding: 2*$default-padding;
|
3
|
+
}
|
4
|
+
|
5
|
+
.resources-table-wrapper {
|
6
|
+
padding-bottom: 60px;
|
7
|
+
|
8
|
+
&.with_tag_filter {
|
9
|
+
padding-right: 242px;
|
10
|
+
}
|
11
|
+
}
|
12
|
+
|
1
13
|
div#image_assign_filter_and_image_sizing {
|
2
14
|
width: 100%;
|
3
15
|
height: 40px;
|
@@ -27,7 +39,6 @@ div#image_assign_filter_and_image_sizing {
|
|
27
39
|
.picture_thumbnail {
|
28
40
|
margin: 2*$default-margin;
|
29
41
|
background-color: #fff;
|
30
|
-
display: inline-block;
|
31
42
|
position: relative;
|
32
43
|
box-shadow: 0 0 0 1px $default-border-color;
|
33
44
|
width: 160px;
|
@@ -77,10 +88,13 @@ div#image_assign_filter_and_image_sizing {
|
|
77
88
|
}
|
78
89
|
}
|
79
90
|
|
91
|
+
#pictures,
|
92
|
+
#overlay_picture_list {
|
93
|
+
display: flex;
|
94
|
+
flex-wrap: wrap;
|
95
|
+
}
|
96
|
+
|
80
97
|
#pictures {
|
81
|
-
margin-right: 232px;
|
82
|
-
padding-bottom: 60px;
|
83
|
-
overflow: hidden;
|
84
98
|
|
85
99
|
.thumbnail_background {
|
86
100
|
@include zoom-in;
|
@@ -3,26 +3,36 @@
|
|
3
3
|
right: 0;
|
4
4
|
top: $top-menu-height;
|
5
5
|
z-index: 20;
|
6
|
-
width: $
|
6
|
+
width: calc(100vw - #{$collapsed-main-menu-width});
|
7
7
|
height: calc(100vh - #{$top-menu-height});
|
8
8
|
border-left: $default-border;
|
9
9
|
background-color: $light-gray;
|
10
10
|
transition: $transition-duration ease-in-out;
|
11
|
-
transform: translate3d(
|
11
|
+
transform: translate3d(100%, 0, 0);
|
12
12
|
|
13
13
|
.elements-window-visible & {
|
14
14
|
transform: translate3d(0, 0, 0);
|
15
15
|
}
|
16
|
+
|
17
|
+
// Fix for Tinymce fullscreen window positioning issues (GH#1511)
|
18
|
+
.mce-fullscreen & {
|
19
|
+
width: calc(100vw - #{$collapsed-main-menu-width - $default-border-width});
|
20
|
+
}
|
21
|
+
|
22
|
+
@media screen and (min-width: $large-screen-break-point) {
|
23
|
+
width: $elements-window-width;
|
24
|
+
min-width: $elements-window-min-width;
|
25
|
+
}
|
16
26
|
}
|
17
27
|
|
18
28
|
#element_area {
|
19
29
|
height: calc(100vh - #{$top-menu-height + $toolbar-height});
|
20
30
|
overflow-x: hidden;
|
21
31
|
overflow-y: auto;
|
32
|
+
-webkit-overflow-scrolling: touch;
|
22
33
|
|
23
|
-
.
|
34
|
+
.sortable-elements {
|
24
35
|
min-height: 100px;
|
25
|
-
padding: 2*$default-padding $default-padding 2px;
|
26
36
|
}
|
27
37
|
|
28
38
|
textarea {
|
@@ -35,6 +45,11 @@
|
|
35
45
|
}
|
36
46
|
}
|
37
47
|
|
48
|
+
#main-content-elements,
|
49
|
+
.element-editor.is-fixed .nestable-elements {
|
50
|
+
padding: 2*$default-padding $default-padding 2px;
|
51
|
+
}
|
52
|
+
|
38
53
|
.element-title {
|
39
54
|
overflow: hidden;
|
40
55
|
white-space: nowrap;
|
@@ -99,40 +114,6 @@
|
|
99
114
|
}
|
100
115
|
}
|
101
116
|
|
102
|
-
.add_picture {
|
103
|
-
float: left;
|
104
|
-
margin: 1px;
|
105
|
-
width: 119px;
|
106
|
-
border: 1px solid #c0c0c0;
|
107
|
-
border-radius: $default-border-radius;
|
108
|
-
height: 123px;
|
109
|
-
|
110
|
-
a {
|
111
|
-
display: block;
|
112
|
-
height: 100%;
|
113
|
-
width: 100%;
|
114
|
-
position: relative;
|
115
|
-
text-decoration: none;
|
116
|
-
overflow: hidden;
|
117
|
-
text-align: center;
|
118
|
-
line-height: 104px;
|
119
|
-
border-radius: $default-border-radius;
|
120
|
-
background-color: $light-gray;
|
121
|
-
|
122
|
-
&:hover {
|
123
|
-
background-color: $medium-gray;
|
124
|
-
}
|
125
|
-
|
126
|
-
.icon {
|
127
|
-
font-size: 1.5em;
|
128
|
-
position: absolute;
|
129
|
-
top: 50%;
|
130
|
-
left: 50%;
|
131
|
-
transform: translate(-50%, -50%);
|
132
|
-
}
|
133
|
-
}
|
134
|
-
}
|
135
|
-
|
136
117
|
.element-editor {
|
137
118
|
border: 1px solid $default-border-color;
|
138
119
|
border-radius: $default-border-radius;
|
@@ -140,6 +121,11 @@
|
|
140
121
|
margin-bottom: 2*$default-margin;
|
141
122
|
transition: box-shadow $transition-duration;
|
142
123
|
|
124
|
+
&.is-fixed {
|
125
|
+
border-width: 0;
|
126
|
+
border-radius: 0;
|
127
|
+
}
|
128
|
+
|
143
129
|
&.not-draggable {
|
144
130
|
opacity: 0.5;
|
145
131
|
}
|
@@ -152,7 +138,7 @@
|
|
152
138
|
}
|
153
139
|
}
|
154
140
|
|
155
|
-
&.selected {
|
141
|
+
&.selected:not(.is-fixed) {
|
156
142
|
border-color: #c3c3c3;
|
157
143
|
box-shadow: 0 2px 8px rgba(#9b9b9b, 0.75);
|
158
144
|
}
|
@@ -166,9 +152,12 @@
|
|
166
152
|
|
167
153
|
&.dragged {
|
168
154
|
border-style: dotted;
|
169
|
-
|
155
|
+
overflow: hidden;
|
170
156
|
|
171
|
-
|
157
|
+
&:not(.compact) {
|
158
|
+
height: 36px !important;
|
159
|
+
transition: height 0.2s;
|
160
|
+
}
|
172
161
|
}
|
173
162
|
|
174
163
|
&.with-contents, &.without-contents.not-nestable {
|
@@ -273,7 +262,6 @@
|
|
273
262
|
.element-toolbar {
|
274
263
|
padding: $default-padding 0;
|
275
264
|
height: $element-toolbar-height;
|
276
|
-
// background-color: #f0f0f0;
|
277
265
|
|
278
266
|
.element_tools {
|
279
267
|
float: left;
|
@@ -297,23 +285,6 @@
|
|
297
285
|
flex-wrap: wrap;
|
298
286
|
}
|
299
287
|
|
300
|
-
.picture_gallery_images {
|
301
|
-
overflow: hidden;
|
302
|
-
margin: $default-margin 0;
|
303
|
-
border: 1px solid $default-border-color;
|
304
|
-
border-radius: $default-border-radius;
|
305
|
-
background-color: $medium-gray;
|
306
|
-
padding: 1px;
|
307
|
-
|
308
|
-
.essence_picture {
|
309
|
-
margin: 1px;
|
310
|
-
float: left;
|
311
|
-
height: 148px;
|
312
|
-
|
313
|
-
.picture_thumbnail { margin: 0 }
|
314
|
-
}
|
315
|
-
}
|
316
|
-
|
317
288
|
.picture_thumbnail .picture_image {
|
318
289
|
overflow: hidden;
|
319
290
|
|
@@ -322,7 +293,7 @@
|
|
322
293
|
}
|
323
294
|
}
|
324
295
|
|
325
|
-
#
|
296
|
+
#fixed-elements {
|
326
297
|
min-height: 100px;
|
327
298
|
}
|
328
299
|
|
@@ -432,6 +403,7 @@
|
|
432
403
|
}
|
433
404
|
|
434
405
|
.picture_thumbnail {
|
406
|
+
display: inline-block;
|
435
407
|
width: 160px;
|
436
408
|
margin: $default-margin 0;
|
437
409
|
padding-bottom: 28px;
|
@@ -462,25 +434,6 @@
|
|
462
434
|
}
|
463
435
|
}
|
464
436
|
|
465
|
-
.draggable_picture {
|
466
|
-
float: left;
|
467
|
-
|
468
|
-
.picture_handle {
|
469
|
-
cursor: move;
|
470
|
-
}
|
471
|
-
}
|
472
|
-
|
473
|
-
.picture_thumbnail .picture_handle {
|
474
|
-
position: absolute;
|
475
|
-
z-index: 1;
|
476
|
-
width: 100%;
|
477
|
-
height: 97px;
|
478
|
-
top: 0;
|
479
|
-
left: 0;
|
480
|
-
background-color: transparent;
|
481
|
-
@extend .disable-user-select;
|
482
|
-
}
|
483
|
-
|
484
437
|
.content_editor.essence_file {
|
485
438
|
|
486
439
|
.file {
|
@@ -598,8 +551,8 @@ select.long {
|
|
598
551
|
}
|
599
552
|
|
600
553
|
label {
|
601
|
-
display:
|
602
|
-
margin
|
554
|
+
display: block;
|
555
|
+
margin: $default-margin 0;
|
603
556
|
font-size: $small-font-size;
|
604
557
|
line-height: 15px;
|
605
558
|
text-indent: 1px;
|
@@ -619,7 +572,7 @@ select.long {
|
|
619
572
|
|
620
573
|
&.essence_select {
|
621
574
|
|
622
|
-
label { margin-bottom:
|
575
|
+
label { margin-bottom: 2*$default-margin }
|
623
576
|
|
624
577
|
.select2-container {
|
625
578
|
width: 100%;
|
@@ -731,31 +684,142 @@ textarea.has_tinymce {
|
|
731
684
|
top: -1px;
|
732
685
|
}
|
733
686
|
|
734
|
-
.nestable-elements {
|
687
|
+
.not-fixed .nestable-elements {
|
735
688
|
box-shadow: inset 0 4px 8px -2px darken($medium-gray, 15%);
|
736
689
|
background-color: $medium-gray;
|
737
690
|
|
738
691
|
.expanded.element-editor > & {
|
739
|
-
padding:
|
692
|
+
padding: 8px 4px 4px;
|
693
|
+
}
|
694
|
+
|
695
|
+
.add-nestable-element-button {
|
696
|
+
width: calc(50% - 8px);
|
697
|
+
margin: 4px;
|
698
|
+
text-align: center;
|
699
|
+
}
|
700
|
+
}
|
701
|
+
|
702
|
+
.is-fixed {
|
703
|
+
&.with-contents {
|
704
|
+
> .element-footer {
|
705
|
+
border-top: 0;
|
706
|
+
border-bottom: 1px solid $medium-gray;
|
707
|
+
}
|
708
|
+
}
|
709
|
+
|
710
|
+
> .nestable-elements .add-nestable-element-button {
|
711
|
+
width: 100%;
|
712
|
+
text-align: center;
|
740
713
|
}
|
741
714
|
}
|
742
715
|
|
743
|
-
.nested-elements {
|
716
|
+
.not-fixed .nested-elements {
|
717
|
+
display: flex;
|
718
|
+
flex-wrap: wrap;
|
719
|
+
|
720
|
+
.element-editor,
|
721
|
+
.droppable_element_placeholder {
|
722
|
+
width: calc(100% - 8px);
|
723
|
+
margin: 4px;
|
724
|
+
|
725
|
+
&.compact {
|
726
|
+
width: calc(50% - 8px);
|
727
|
+
}
|
728
|
+
}
|
729
|
+
|
730
|
+
.element-editor {
|
731
|
+
position: relative;
|
732
|
+
|
733
|
+
&.compact {
|
734
|
+
.element-toolbar {
|
735
|
+
visibility: hidden;
|
736
|
+
position: absolute;
|
737
|
+
height: 35px;
|
738
|
+
padding: 2px 0;
|
739
|
+
opacity: 0;
|
740
|
+
z-index: 1;
|
741
|
+
border-bottom: $default-border;
|
742
|
+
background-color: $light-gray;
|
743
|
+
transition: all $transition-duration;
|
744
|
+
}
|
745
|
+
|
746
|
+
.element-header:hover + .element-toolbar,
|
747
|
+
.element-toolbar:hover {
|
748
|
+
visibility: visible;
|
749
|
+
opacity: 1;
|
750
|
+
}
|
751
|
+
|
752
|
+
.element-footer {
|
753
|
+
margin-top: 0;
|
754
|
+
padding-top: 0;
|
755
|
+
border-top: 0;
|
756
|
+
|
757
|
+
.button {
|
758
|
+
padding: $small-button-padding;
|
759
|
+
}
|
760
|
+
}
|
761
|
+
|
762
|
+
.element-title {
|
763
|
+
max-width: 75%;
|
764
|
+
}
|
765
|
+
|
766
|
+
&:not(.folded) .ajax-folder {
|
767
|
+
pointer-events: none;
|
768
|
+
|
769
|
+
i:before {
|
770
|
+
content: fa-content($fa-var-ellipsis-v);
|
771
|
+
}
|
772
|
+
}
|
773
|
+
|
774
|
+
.element_tools {
|
775
|
+
display: flex;
|
776
|
+
width: 100%;
|
777
|
+
justify-content: space-between;
|
778
|
+
margin-left: 0;
|
779
|
+
}
|
780
|
+
|
781
|
+
.element-content {
|
782
|
+
padding: 4px 8px;
|
783
|
+
}
|
784
|
+
|
785
|
+
.button_with_label {
|
786
|
+
margin: 0 4px;
|
787
|
+
}
|
788
|
+
|
789
|
+
.content_editor,
|
790
|
+
.picture_thumbnail {
|
791
|
+
width: 100%;
|
792
|
+
}
|
793
|
+
|
794
|
+
.picture_thumbnail {
|
795
|
+
margin: 0;
|
796
|
+
}
|
797
|
+
|
798
|
+
.thumbnail_background {
|
799
|
+
height: 115px;
|
800
|
+
}
|
801
|
+
|
802
|
+
textarea,
|
803
|
+
input[type="url"],
|
804
|
+
input[type="text"],
|
805
|
+
input[type="email"],
|
806
|
+
input[type="password"] {
|
807
|
+
padding: 0.5em;
|
808
|
+
height: auto;
|
809
|
+
}
|
810
|
+
}
|
811
|
+
}
|
744
812
|
|
745
813
|
.element-header {
|
746
814
|
background-color: transparent;
|
747
815
|
}
|
748
816
|
|
749
817
|
.element-toolbar {
|
750
|
-
|
818
|
+
width: 100%;
|
751
819
|
border-top: 1px solid $medium-gray;
|
752
820
|
}
|
753
821
|
}
|
754
822
|
|
755
|
-
.add-nestable-element-button {
|
756
|
-
margin-top: 0;
|
757
|
-
}
|
758
|
-
|
759
823
|
.essence_date--label {
|
760
824
|
position: absolute;
|
761
825
|
right: 7px;
|