alchemy_cms 3.5.0 → 3.6.0

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 (118) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +82 -26
  3. data/.travis.yml +1 -1
  4. data/CHANGELOG.md +23 -1
  5. data/README.md +14 -5
  6. data/Rakefile +0 -1
  7. data/alchemy_cms.gemspec +2 -5
  8. data/app/assets/images/alchemy/alchemy-logo.png +0 -0
  9. data/app/assets/javascripts/alchemy/admin.js +1 -1
  10. data/app/assets/javascripts/alchemy/alchemy.base.js.coffee +4 -8
  11. data/app/assets/javascripts/alchemy/alchemy.buttons.js.coffee +2 -2
  12. data/app/assets/javascripts/alchemy/alchemy.datepicker.js.coffee +18 -27
  13. data/app/assets/javascripts/alchemy/alchemy.dialog.js.coffee +1 -1
  14. data/app/assets/javascripts/alchemy/alchemy.element_editors.js.coffee +3 -8
  15. data/app/assets/javascripts/alchemy/alchemy.elements_window.js.coffee +1 -1
  16. data/app/assets/javascripts/alchemy/alchemy.gui.js.coffee +0 -1
  17. data/app/assets/javascripts/alchemy/alchemy.page_sorter.js +22 -46
  18. data/app/assets/javascripts/alchemy/alchemy.preview_window.js.coffee +1 -1
  19. data/app/assets/javascripts/alchemy/alchemy.sitemap.js.coffee +2 -2
  20. data/app/assets/javascripts/alchemy/alchemy.spinner.js +32 -0
  21. data/app/assets/javascripts/alchemy/alchemy.tinymce.js.coffee +1 -1
  22. data/app/assets/javascripts/alchemy/templates/index.js +1 -0
  23. data/app/assets/javascripts/alchemy/templates/spinner.hbs +7 -0
  24. data/app/assets/stylesheets/alchemy/_extends.scss +1 -0
  25. data/app/assets/stylesheets/alchemy/admin.scss +1 -0
  26. data/app/assets/stylesheets/alchemy/base.scss +1 -7
  27. data/app/assets/stylesheets/alchemy/buttons.scss +1 -5
  28. data/app/assets/stylesheets/alchemy/dialogs.scss +0 -4
  29. data/app/assets/stylesheets/alchemy/elements.scss +2 -6
  30. data/app/assets/stylesheets/alchemy/frame.scss +0 -5
  31. data/app/assets/stylesheets/alchemy/image_library.scss +0 -13
  32. data/app/assets/stylesheets/alchemy/sitemap.scss +5 -34
  33. data/app/assets/stylesheets/alchemy/spinner.scss +52 -0
  34. data/app/controllers/alchemy/admin/attachments_controller.rb +12 -11
  35. data/app/controllers/alchemy/admin/base_controller.rb +3 -7
  36. data/app/controllers/alchemy/admin/essence_pictures_controller.rb +2 -1
  37. data/app/controllers/alchemy/admin/languages_controller.rb +3 -8
  38. data/app/controllers/alchemy/admin/pictures_controller.rb +11 -7
  39. data/app/controllers/alchemy/admin/resources_controller.rb +1 -1
  40. data/app/controllers/alchemy/attachments_controller.rb +2 -0
  41. data/app/controllers/alchemy/base_controller.rb +4 -5
  42. data/app/controllers/concerns/alchemy/admin/uploader_responses.rb +1 -1
  43. data/app/helpers/alchemy/admin/base_helper.rb +17 -8
  44. data/app/helpers/alchemy/admin/tags_helper.rb +31 -18
  45. data/app/helpers/alchemy/base_helper.rb +1 -1
  46. data/app/helpers/alchemy/pages_helper.rb +4 -7
  47. data/app/models/alchemy/attachment.rb +4 -0
  48. data/app/models/alchemy/cell.rb +1 -1
  49. data/app/models/alchemy/element.rb +6 -12
  50. data/app/models/alchemy/element/definitions.rb +2 -2
  51. data/app/models/alchemy/element/element_contents.rb +1 -1
  52. data/app/models/alchemy/essence_picture_view.rb +14 -2
  53. data/app/models/alchemy/language.rb +4 -4
  54. data/app/models/alchemy/page.rb +25 -28
  55. data/app/models/alchemy/page/page_elements.rb +1 -1
  56. data/app/models/alchemy/page/page_natures.rb +1 -1
  57. data/app/models/alchemy/picture.rb +5 -1
  58. data/app/models/alchemy/site.rb +27 -12
  59. data/app/views/alchemy/admin/attachments/_tag_list.html.erb +14 -13
  60. data/app/views/alchemy/admin/dashboard/info.html.erb +1 -1
  61. data/app/views/alchemy/admin/layoutpages/edit.html.erb +1 -1
  62. data/app/views/alchemy/admin/pages/_create_language_form.html.erb +1 -1
  63. data/app/views/alchemy/admin/pages/_form.html.erb +1 -1
  64. data/app/views/alchemy/admin/pages/_new_page_form.html.erb +1 -1
  65. data/app/views/alchemy/admin/pages/_page.html.erb +1 -1
  66. data/app/views/alchemy/admin/pages/_sitemap.html.erb +2 -2
  67. data/app/views/alchemy/admin/pages/configure_external.html.erb +1 -1
  68. data/app/views/alchemy/admin/pages/index.html.erb +5 -7
  69. data/app/views/alchemy/admin/pages/sort.html.erb +19 -0
  70. data/app/views/alchemy/admin/pages/update.js.erb +1 -1
  71. data/app/views/alchemy/admin/pictures/_archive.html.erb +19 -19
  72. data/app/views/alchemy/admin/pictures/_tag_list.html.erb +3 -4
  73. data/app/views/alchemy/admin/resources/_tag_list.html.erb +3 -4
  74. data/app/views/alchemy/admin/resources/edit.html.erb +1 -1
  75. data/app/views/alchemy/admin/resources/new.html.erb +1 -1
  76. data/app/views/alchemy/pages/_meta_data.html.erb +1 -1
  77. data/app/views/alchemy/pages/show.rss.builder +0 -2
  78. data/app/views/alchemy/welcome.html.erb +1 -1
  79. data/app/views/layouts/alchemy/admin.html.erb +1 -1
  80. data/config/locales/alchemy.de.yml +4 -4
  81. data/config/locales/alchemy.en.yml +4 -4
  82. data/config/locales/alchemy.es.yml +3 -3
  83. data/config/locales/alchemy.fr.yml +4 -4
  84. data/config/locales/alchemy.it.yml +3 -3
  85. data/config/locales/alchemy.nl.yml +4 -4
  86. data/config/locales/alchemy.ru.yml +3 -3
  87. data/lib/alchemy/auth_accessors.rb +6 -6
  88. data/lib/alchemy/cache_digests/template_tracker.rb +5 -5
  89. data/lib/alchemy/controller_actions.rb +1 -6
  90. data/lib/alchemy/engine.rb +0 -53
  91. data/lib/alchemy/errors.rb +12 -3
  92. data/lib/alchemy/i18n.rb +1 -1
  93. data/lib/alchemy/logger.rb +1 -1
  94. data/lib/alchemy/page_layout.rb +5 -5
  95. data/lib/alchemy/seeder.rb +16 -49
  96. data/lib/alchemy/tasks/helpers.rb +1 -1
  97. data/lib/alchemy/test_support/config_stubbing.rb +28 -0
  98. data/lib/alchemy/test_support/essence_shared_examples.rb +6 -6
  99. data/lib/alchemy/test_support/factories/language_factory.rb +1 -1
  100. data/lib/alchemy/test_support/factories/page_factory.rb +7 -0
  101. data/lib/alchemy/test_support/factories/site_factory.rb +6 -0
  102. data/lib/alchemy/test_support/shared_contexts.rb +14 -0
  103. data/lib/alchemy/test_support/shared_uploader_examples.rb +10 -0
  104. data/lib/alchemy/touching.rb +1 -1
  105. data/lib/alchemy/version.rb +1 -1
  106. data/lib/alchemy_cms.rb +56 -1
  107. data/lib/{alchemy/kaminari → kaminari}/scoped_pagination_url_helper.rb +0 -0
  108. data/lib/rails/generators/alchemy/base.rb +1 -1
  109. data/lib/rails/generators/alchemy/elements/elements_generator.rb +2 -1
  110. data/lib/rails/generators/alchemy/page_layouts/page_layouts_generator.rb +2 -1
  111. data/lib/rails/generators/alchemy/site_layouts/site_layouts_generator.rb +2 -1
  112. data/lib/tasks/alchemy/tidy.rake +91 -89
  113. data/lib/tasks/alchemy/upgrade.rake +15 -15
  114. metadata +29 -14
  115. data/app/assets/javascripts/alchemy/alchemy.spinner.js.coffee +0 -49
  116. data/app/views/alchemy/admin/pages/sort.js.erb +0 -4
  117. data/vendor/assets/javascripts/handlebars.js +0 -4608
  118. data/vendor/assets/javascripts/spin.min.js +0 -1
@@ -90,7 +90,7 @@ class window.Alchemy.Dialog
90
90
 
91
91
  # Adds a spinner into Dialog body
92
92
  show_spinner: ->
93
- @spinner = Alchemy.Spinner.medium()
93
+ @spinner = new Alchemy.Spinner('medium')
94
94
  @spinner.spin(@dialog_body[0])
95
95
 
96
96
  # Removes the spinner from Dialog body
@@ -136,16 +136,11 @@ Alchemy.ElementEditors =
136
136
  # Folds or expands the element editor with the given id.
137
137
  #
138
138
  toggleFold: (id, callback) ->
139
- $el = $("#element_#{id}")
140
- spinner = Alchemy.Spinner.small()
141
- $toggler = $('> .element-header .ajax-folder', $el)
139
+ spinner = new Alchemy.Spinner('small')
140
+ spinner.spin("#element_#{id} > .element-header .ajax-folder")
142
141
  $("#element_#{id}_folder").hide()
143
- $toggler.prepend(spinner.spin().el)
144
142
  $.post Alchemy.routes.fold_admin_element_path(id), =>
145
- $("#element_#{id}_folder").show()
146
- spinner.stop()
147
- if callback?
148
- callback.call()
143
+ callback.call() if callback?
149
144
  return
150
145
 
151
146
  # Updates the title quote if one of the several conditions are met
@@ -34,7 +34,7 @@ Alchemy.ElementsWindow =
34
34
  false
35
35
  height = @resize()
36
36
  window.requestAnimationFrame =>
37
- spinner = Alchemy.Spinner.medium()
37
+ spinner = new Alchemy.Spinner('medium')
38
38
  spinner.spin @element_area[0]
39
39
  $('#main_content').append(@element_window)
40
40
  @reload()
@@ -12,7 +12,6 @@ Alchemy.GUI =
12
12
  Alchemy.watchForDialogs(scope)
13
13
  Alchemy.Hotkeys(scope)
14
14
  Alchemy.ListFilter(scope)
15
- Alchemy.Spinner.watch(scope)
16
15
  Alchemy.Autocomplete.tags(scope)
17
16
  $('[data-alchemy-char-counter]', scope).each ->
18
17
  new Alchemy.CharCounter(this)
@@ -1,48 +1,24 @@
1
- if (typeof(Alchemy) === 'undefined') {
2
- var Alchemy = {};
3
- }
1
+ Alchemy.PageSorter = function() {
2
+ var $sortables = $('ul#sitemap').find('ul.level_1_children');
4
3
 
5
- (function($) {
4
+ $sortables.nestedSortable({
5
+ disableNesting: 'no-nest',
6
+ forcePlaceholderSize: true,
7
+ handle: '.handle',
8
+ items: 'li',
9
+ listType: 'ul',
10
+ opacity: 0.5,
11
+ placeholder: 'placeholder',
12
+ tabSize: 16,
13
+ tolerance: 'pointer',
14
+ toleranceElement: '> div'
15
+ });
6
16
 
7
- var PageSorter = {};
8
- $.extend(Alchemy, PageSorter);
9
-
10
- Alchemy.PageSorter = {
11
-
12
- init: function() {
13
- var $sortables = $('ul#sitemap').find('ul.level_1_children');
14
- $sortables.nestedSortable({
15
- disableNesting: 'no-nest',
16
- forcePlaceholderSize: true,
17
- handle: '.handle',
18
- items: 'li',
19
- listType: 'ul',
20
- opacity: 0.5,
21
- placeholder: 'placeholder',
22
- tabSize: 16,
23
- tolerance: 'pointer',
24
- toleranceElement: '> div'
25
- });
26
- $('#save_page_order').click(function(e) {
27
- var params = {
28
- set: JSON.stringify($sortables.nestedSortable('toHierarchy'))
29
- };
30
- $.post(Alchemy.routes.order_admin_pages_path, params);
31
- return false;
32
- });
33
- $('#sort_panel .button').click(Alchemy.pleaseWaitOverlay);
34
- Alchemy.PageSorter.disableButton();
35
- },
36
-
37
- disableButton: function() {
38
- var $buttonLink = $('#page_sorting_button a');
39
- $buttonLink.removeAttr('onclick');
40
- $('#page_sorting_button').addClass('active');
41
- $buttonLink.css({
42
- cursor: 'default'
43
- });
44
- }
45
-
46
- }
47
-
48
- })(jQuery);
17
+ $('#save_page_order').click(function(e) {
18
+ e.preventDefault();
19
+ Alchemy.Buttons.disable(this);
20
+ $.post(Alchemy.routes.order_admin_pages_path, {
21
+ set: JSON.stringify($sortables.nestedSortable('toHierarchy'))
22
+ });
23
+ });
24
+ };
@@ -38,7 +38,7 @@ Alchemy.PreviewWindow =
38
38
 
39
39
  _showSpinner: ->
40
40
  @reload = $('#reload_preview_button')
41
- @spinner = Alchemy.Spinner.small()
41
+ @spinner = new Alchemy.Spinner('small')
42
42
  @reload.html @spinner.spin().el
43
43
 
44
44
  _hideSpinner: ->
@@ -29,13 +29,13 @@ Alchemy.Sitemap =
29
29
  self = Alchemy.Sitemap
30
30
 
31
31
  if foldingId
32
- spinner = Alchemy.Spinner.small()
32
+ spinner = new Alchemy.Spinner('small')
33
33
  spinTarget = $('#fold_button_' + foldingId)
34
34
  renderTarget = $('#page_' + foldingId)
35
35
  renderTemplate = @list_template
36
36
  pageId = foldingId
37
37
  else
38
- spinner = @options.spinner || Alchemy.Spinner.medium()
38
+ spinner = @options.spinner || new Alchemy.Spinner('medium')
39
39
  spinTarget = @sitemap_wrapper
40
40
  renderTarget = @sitemap_wrapper
41
41
  renderTemplate = @template
@@ -0,0 +1,32 @@
1
+ Alchemy.Spinner = function Spinner(size, styles) {
2
+ var html = HandlebarsTemplates.spinner(),
3
+ $spinner = $(html),
4
+ $svg = $spinner.find('svg'),
5
+ className;
6
+
7
+ switch (size) {
8
+ case 'small': className = 'spinner--small';
9
+ break;
10
+ case 'large': className = 'spinner--large';
11
+ break;
12
+ default: className = 'spinner--medium';
13
+ }
14
+
15
+ $spinner.addClass(className);
16
+
17
+ if (styles) {
18
+ $svg.find('path').css(styles);
19
+ }
20
+
21
+ this.el = $spinner;
22
+
23
+ this.spin = function spin(parent) {
24
+ if (parent === undefined) parent = 'body';
25
+ $(parent).append($spinner);
26
+ return this;
27
+ };
28
+
29
+ this.stop = function stop() {
30
+ $spinner.remove();
31
+ };
32
+ };
@@ -55,7 +55,7 @@ $.extend Alchemy.Tinymce,
55
55
  return
56
56
  config = @getConfig(id, textarea[0].classList[1])
57
57
  if config
58
- spinner = Alchemy.Spinner.small()
58
+ spinner = new Alchemy.Spinner('small')
59
59
  textarea.closest('.tinymce_container').prepend spinner.spin().el
60
60
  tinymce.init(config)
61
61
  else
@@ -0,0 +1 @@
1
+ //= require alchemy/templates/spinner
@@ -0,0 +1,7 @@
1
+ <div class="spinner">
2
+ <svg width="100%" viewBox="0 0 28 28">
3
+ <path class="hex1" d="M5.938,18.07l-5.878-5.9l2.154-8.058l8.024-2.161l5.87,5.9l-2.144,8.058L5.938,18.07z"/>
4
+ <path class="hex2" d="M19.686,20.785l-4.731-4.754l1.725-6.487l6.468-1.742l4.733,4.754l-1.734,6.487L19.686,20.785z"/>
5
+ <path class="hex3" d="M11.708,26.294l-3.47-3.485l1.276-4.758l4.74-1.276l3.468,3.485l-1.265,4.758L11.708,26.294z"/>
6
+ </svg>
7
+ </div>
@@ -12,6 +12,7 @@
12
12
  }
13
13
 
14
14
  %thumbnail-background {
15
+ position: relative;
15
16
  display: table-cell;
16
17
  background-color: $dark-gray;
17
18
  text-align: center;
@@ -29,6 +29,7 @@
29
29
  @import "alchemy/search";
30
30
  @import "alchemy/selects";
31
31
  @import "alchemy/sitemap";
32
+ @import "alchemy/spinner";
32
33
  @import "alchemy/tables";
33
34
  @import "alchemy/lists";
34
35
  @import "alchemy/upload";
@@ -3,8 +3,7 @@ html {
3
3
 
4
4
  &.turbolinks-progress-bar::before,
5
5
  .turbolinks-progress-bar {
6
- background-color: $blue !important;
7
- height: 3px !important;
6
+ background-color: #fff !important;
8
7
  z-index: 400001;
9
8
  }
10
9
  }
@@ -125,11 +124,6 @@ hr {
125
124
 
126
125
  .center {
127
126
  text-align: center;
128
-
129
- .spinner {
130
- display: inline-block;
131
- vertical-align: middle;
132
- }
133
127
  }
134
128
 
135
129
  kbd {
@@ -1,5 +1,6 @@
1
1
  button, input[type="submit"], a.button, input.button {
2
2
  @include button-defaults;
3
+ position: relative;
3
4
 
4
5
  &.small {
5
6
  padding: $default-padding 3*$default-padding;
@@ -51,11 +52,6 @@ button, input[type="submit"], a.button, input.button {
51
52
  overflow: hidden;
52
53
  text-align: center;
53
54
 
54
- .spinner {
55
- left: 50% !important; // the spin.js lib calculates false!
56
- top: 50% !important;
57
- }
58
-
59
55
  .icon {
60
56
  display: inline-block;
61
57
  vertical-align: middle;
@@ -97,10 +97,6 @@
97
97
  max-height: 600px;
98
98
  }
99
99
 
100
- .spinner {
101
- left: 50% !important;
102
- }
103
-
104
100
  form {
105
101
  padding: 0;
106
102
  position: absolute;
@@ -87,6 +87,8 @@
87
87
 
88
88
  .ajax-folder {
89
89
  position: absolute;
90
+ width: 16px;
91
+ height: 16px;
90
92
  right: 8px;
91
93
  top: 8px;
92
94
 
@@ -255,11 +257,6 @@
255
257
  @extend .disable-user-select;
256
258
  cursor: pointer;
257
259
 
258
- .spinner {
259
- top: 9px;
260
- right: 9px;
261
- }
262
-
263
260
  > .hint-with-icon {
264
261
  position: absolute;
265
262
  right: 32px;
@@ -582,7 +579,6 @@ div.tinymce_container {
582
579
 
583
580
  .spinner {
584
581
  top: 70px;
585
- left: 50%;
586
582
  }
587
583
  }
588
584
 
@@ -8,11 +8,6 @@ div#overlay {
8
8
  z-index: 400000;
9
9
  background-color: rgba(229, 229, 229, 0.4);
10
10
  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr = #40E5E5E5, endColorstr = #40E5E5E5);
11
-
12
- .spinner {
13
- top: 50%;
14
- left: 50%;
15
- }
16
11
  }
17
12
 
18
13
  div#overlay_text_box {
@@ -38,10 +38,6 @@ $image-overlay-transition-easing: ease-in;
38
38
  right: $picture-overlay-handle-width;
39
39
  }
40
40
 
41
- .spinner {
42
- margin-left: 0;
43
- }
44
-
45
41
  .picture-overlay-handle {
46
42
  right: 0;
47
43
 
@@ -162,15 +158,6 @@ $image-overlay-transition-easing: ease-in;
162
158
  margin-left: -4px;
163
159
  }
164
160
 
165
- .spinner {
166
- position: absolute !important;
167
- left: 50% !important;
168
- top: 50% !important;
169
- @include transform(translateY(-50%));
170
- margin-left: -$image-overlay-form-width/2 + $picture-overlay-handle-width;
171
- @include transition(margin-left $image-overlay-transition-duration $image-overlay-transition-easing);
172
- }
173
-
174
161
  img {
175
162
  display: inline-block;
176
163
  height: auto;
@@ -1,8 +1,8 @@
1
1
  #sort_panel {
2
- background: $medium-gray;
3
- padding: 45px 0 8px 0;
2
+ background: $light-gray;
3
+ padding: 47px 0 8px 0;
4
4
  position: fixed;
5
- top: 27px;
5
+ top: 29px;
6
6
  left: 0;
7
7
  z-index: 1;
8
8
  width: 100%;
@@ -13,19 +13,14 @@
13
13
  }
14
14
 
15
15
  .buttons {
16
- margin-left: 163px;
16
+ margin: 0 12px 0 163px;
17
+ text-align: right;
17
18
  }
18
19
  }
19
20
 
20
21
  #sitemap-wrapper {
21
22
  position: relative;
22
23
  min-height: 100%;
23
-
24
- .loading .spinner {
25
- position: absolute !important;
26
- top: 50% !important;
27
- left: 50% !important;
28
- }
29
24
  }
30
25
 
31
26
  .sitemap_pagename_link {
@@ -357,27 +352,3 @@ a.folder_link {
357
352
  .elements_from_page_selector {
358
353
  width: 100%;
359
354
  }
360
-
361
- .elements_for_page {
362
- position: absolute;
363
- right: 32px;
364
- top: -7px;
365
- z-index: 15;
366
- background-color: white;
367
- width: 280px;
368
- height: 33px;
369
- padding: $default-padding;
370
- border: $default-border;
371
- box-shadow: #9ea09f 0px 0px 4px;
372
- @extend %rounded-border;
373
-
374
- .spinner {
375
- top: 17px !important;
376
- left: 50% !important;
377
- margin-left: $default-margin;
378
- }
379
-
380
- .alchemy_selectbox {
381
- width: 252px;
382
- }
383
- }
@@ -0,0 +1,52 @@
1
+ .spinner {
2
+ position: absolute;
3
+ top: 50%;
4
+ left: 50%;
5
+ transform: translate(-50%, -50%);
6
+ text-align: center;
7
+ line-height: 1;
8
+
9
+ path {
10
+ fill: $dark-gray;
11
+ opacity: 1;
12
+ animation: spinner 1s infinite ease-in-out both;
13
+ }
14
+
15
+ &.spinner--tiny {
16
+ width: 8px;
17
+ height: 8px;
18
+ }
19
+
20
+ &.spinner--small {
21
+ width: 16px;
22
+ height: 16px;
23
+ }
24
+
25
+ &.spinner--medium {
26
+ width: 32px;
27
+ height: 32px;
28
+ }
29
+
30
+ &.spinner--large {
31
+ width: 48px;
32
+ height: 48px;
33
+ }
34
+
35
+ .hex2 {
36
+ animation-delay: 0.15s;
37
+ }
38
+
39
+ .hex3 {
40
+ animation-delay: 0.3s;
41
+ }
42
+ }
43
+
44
+ @keyframes spinner {
45
+ 0%, 100% {
46
+ opacity: 1;
47
+ }
48
+
49
+ 25%, 75% {
50
+ opacity: 0.1;
51
+ }
52
+ }