udongo 5.4.0 → 5.5.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 75a5407f853e677bc244654a801843f1b9663805
4
- data.tar.gz: e3a9c0edbb2798d44ad7bd5fe934ee2c2826d5be
3
+ metadata.gz: ff6a2c5f11be6933246edd9840889f3e54565c1b
4
+ data.tar.gz: daa2e269f183b22722eb853480fdedbda50cf0e5
5
5
  SHA512:
6
- metadata.gz: 4bc1535a00eded6212d6c39e0d0293ad7c28f99ac6809ec248f4bdf725d97a0d526711a65e2a4d80f5c065b3fcf026cb832e8c02faa4bc4e1c8f79edbf20b1e6
7
- data.tar.gz: 3266aceac326318a4f86fd648f6b51e9c4f1f445b7e889fae6cb4e0d9c660a40b0202f08e61d89f8cc0b2400bba0fa0eca11d0a47b5d8c951038e308321f0d46
6
+ metadata.gz: 3e54b777799e616d3db6b1759655f1a2fac5d8d56954e41eeadf8606eeeb93be9a93003575720f29b010aee588727132ef7912e5442c7ce542728f54a65a62ce
7
+ data.tar.gz: 3562e610247ca7d202f4e331915d85fd1aac48c23d61dd810aec3190cbe4e23ff6b2366d6d15922b5ede0a1f080f71a2a1d69bbf59d07e38418420a1d85839c8
@@ -17,8 +17,10 @@
17
17
  //= require jquery-ui/sortable
18
18
  //= require backend/tether.min
19
19
  //= require backend/bootstrap
20
+ //= require backend/jquery.throttle-debounce.min.js
20
21
  //= require ckeditor/init
21
22
  //= require backend/general
23
+ //= require backend/dirty-inputs
22
24
  //= require backend/search
23
25
  //= require backend/bootstrap-datepicker.min
24
26
  //= require backend/datepickers
@@ -0,0 +1,33 @@
1
+ var dirty_inputs = dirty_inputs || {
2
+ message: null,
3
+ init: function() {
4
+ $('[data-dirty]').parents('form').find(':input').on('change, keydown', this.input_change_listener);
5
+ },
6
+
7
+ input_change_listener: function(e) {
8
+ // I have to set the message this way, because the trigger for the click
9
+ // warning probably won't have the context of the form that this method has.
10
+ var input = $(this);
11
+ dirty_inputs.message = input.parents('form').find('[data-dirty]').text();
12
+ input.data('dirty', true);
13
+ $('a').each(dirty_inputs.iterate_anchors_and_bind_click_warning);
14
+ },
15
+
16
+ anchor_click_warning_listener: function(e) {
17
+ if(!window.confirm(dirty_inputs.message)) {
18
+ e.stopPropagation();
19
+ e.preventDefault();
20
+ }
21
+ },
22
+
23
+ iterate_anchors_and_bind_click_warning: function(){
24
+ var anchor = $(this);
25
+ var events = $._data(anchor[0], 'events');
26
+
27
+ if(typeof events == 'undefined') {
28
+ anchor.on('click', dirty_inputs.anchor_click_warning_listener);
29
+ }
30
+ }
31
+ };
32
+
33
+ $(function(){ dirty_inputs.init(); });
@@ -0,0 +1,38 @@
1
+ var seo = {
2
+ init: function() {
3
+ this.sluggable_input().on('keydown', this.keydown_listener);
4
+ this.sluggable_input().on('keyup', $.debounce(250, this.keyup_listener));
5
+ },
6
+
7
+ data: function(key) {
8
+ return $('[data-seo]').data(key);
9
+ },
10
+
11
+ keydown_listener: function(e) {
12
+ if(e.keyCode == 13) e.preventDefault();
13
+ },
14
+
15
+ keyup_listener: function(e) {
16
+ if(seo.slug_input().attr('disabled')) return;
17
+ var input = $(this);
18
+
19
+ $.ajax({
20
+ url: seo.data('path'),
21
+ data: { value: input.val() },
22
+ type: 'GET'
23
+ }).done(function(data){
24
+ seo.slug_input().val(data.result);
25
+ if(e.keyCode == 13) input.parents('form').submit();
26
+ });
27
+ },
28
+
29
+ slug_input: function() {
30
+ return $('input[id*="seo_slug"]');
31
+ },
32
+
33
+ sluggable_input: function() {
34
+ return $($('[data-seo]').data('sluggable-input'));
35
+ }
36
+ };
37
+
38
+ $(function(){ seo.init(); });
@@ -4,6 +4,10 @@
4
4
  // fonts
5
5
  @import 'font-awesome';
6
6
 
7
+ // Vendored
8
+ @import 'backend/tagit/base';
9
+ @import 'backend/tagit/autocomplete';
10
+
7
11
  // Components
8
12
  @import 'components/navbar';
9
13
  @import 'components/tabs';
@@ -0,0 +1,5 @@
1
+ module Backend::FormHelper
2
+ def trigger_dirty_inputs_warning(message: I18n.t('b.msg.dirty_inputs_warning'))
3
+ content_tag :span, message, class: 'hidden-xs-up', data: { dirty: false }
4
+ end
5
+ end
@@ -1,4 +1,8 @@
1
- <div class="card">
1
+ <% javascript 'backend/seo' %>
2
+
3
+ <% sluggable_field ||= 'title' %>
4
+
5
+ <%= content_tag :div, class: 'card', data: { seo: true, path: backend_seo_slugify_path, sluggable_input: "##{f.object_name}_#{sluggable_field}" } do %>
2
6
  <div class="card-header">
3
7
  <%= t 'b.msg.seo' %>
4
8
  </div>
@@ -10,4 +14,4 @@
10
14
  <%= f.input :seo_keywords, as: :string %>
11
15
  <%= f.input :seo_custom, as: :text %>
12
16
  </div>
13
- </div>
17
+ <% end %>
@@ -1,5 +1,3 @@
1
- <% stylesheet 'backend/tagit/tagit-autocomplete' %>
2
- <% stylesheet 'backend/tagit/tagit' %>
3
1
  <% javascript 'backend/tagit.min' %>
4
2
  <% javascript 'backend/plugins/tagbox' %>
5
3
  <% javascript 'backend/tags' %>
@@ -6,6 +6,7 @@
6
6
  <%= render 'backend/general_form_error', object: @translation %>
7
7
 
8
8
  <%= simple_form_for([:backend, @translation], url: edit_translation_backend_article_path, html: { class: 'no-focus' }) do |f| %>
9
+ <%= trigger_dirty_inputs_warning %>
9
10
 
10
11
  <div class="row">
11
12
  <div class="col-md-12">
@@ -1,6 +1,6 @@
1
1
  <% if @image.errors.any? %>
2
2
  <div class="alert alert-danger" role="alert">
3
- <strong><%= t 'b.msg.something_went_wrong' %>!</strong>
3
+ <strong><%= t 'b.msg.something_went_wrong' %></strong>
4
4
  <%= t 'b.msg.please_select_a_valid_image' %>
5
5
  </div>
6
6
  <% end %>
@@ -6,7 +6,7 @@
6
6
  <%= render 'backend/general_form_error', object: @translation %>
7
7
 
8
8
  <%= simple_form_for([:backend, @translation], url: edit_translation_backend_page_path, html: { class: 'no-focus' }) do |f| %>
9
-
9
+ <%= trigger_dirty_inputs_warning %>
10
10
  <div class="row">
11
11
  <div class="col-md-12">
12
12
  <!-- Content -->
data/changelog.md CHANGED
@@ -1,8 +1,24 @@
1
+ 5.5.0 - 2017-03-13
2
+ --
3
+ * When an SEO form has a slug, it's automatically calculated based on the title.
4
+ * Trigger a generic warning when trying to leave a page through an anchor when
5
+ the form contains unsaved changes.
6
+ * The dirty-inputs warning is now triggered on a form by calling the
7
+ ```trigger_dirty_inputs_warning``` helper method.
8
+ * The sluggable autofill now plays nice when immediately hitting enter after
9
+ typing your title.
10
+ * Trigger a generic warning when trying to leave a page through an anchor when
11
+ the form contains unsaved changes.
12
+ * The dirty-inputs warning is now triggered on a form by calling the
13
+ ```trigger_dirty_inputs_warning``` helper method.
14
+
15
+
1
16
  5.4.0 - 2017-03-08
2
17
  --
3
18
  * When enabled, you can add images to articles from the assets module.
4
19
  * Bugfix: the sortable scope for the ```Image``` wasn't properly set.
5
20
  * Images are now enabled by default for articles.
21
+ * Fixed a missing image reference triggered by Tagit.
6
22
 
7
23
 
8
24
  5.3.1 - 2017-03-07
@@ -97,6 +97,7 @@ en:
97
97
  image: Image
98
98
  text: Text
99
99
  deleted: '%s was deleted.'
100
+ dirty_inputs_warning: "You are about to leave the page but your changes aren't saved yet.\nDo you still want to leave the page?"
100
101
  edited: '%s was edited.'
101
102
  flexible_content:
102
103
  add_column: Add column
@@ -100,6 +100,7 @@ nl:
100
100
  image: Afbeelding
101
101
  text: Tekst
102
102
  deleted: '%{actor} werd verwijderd.'
103
+ dirty_inputs_warning: "Je gaat de pagina verlaten maar je aanpassingen zijn nog niet bewaard.\nWil je nog steeds de pagina verlaten?"
103
104
  edited: '%{actor} werd gewijzigd.'
104
105
  flexible_content:
105
106
  add_column: Kolom toevoegen
data/config/routes.rb CHANGED
@@ -15,6 +15,8 @@ Rails.application.routes.draw do
15
15
 
16
16
  get '/' => 'dashboard#show'
17
17
  get 'search' => 'search#query'
18
+ get 'seo/slugify' => 'seo#slugify'
19
+
18
20
 
19
21
  resources :sessions, only: [:new, :create, :destroy]
20
22
  resources :admins
@@ -1,3 +1,3 @@
1
1
  module Udongo
2
- VERSION = '5.4.0'
2
+ VERSION = '5.5.0'
3
3
  end
data/readme.md CHANGED
@@ -50,6 +50,69 @@ Udongo.config.i18n.app.default_interface_locale = 'nl'
50
50
  Udongo.config.i18n.app.interface_locales = %w(nl en)
51
51
  ```
52
52
 
53
+ ## Forms
54
+ ### Adding SEO fields to your page.
55
+ You can add SEO fields to your form by rendering a partial:
56
+
57
+ ```erb
58
+ <%= simple_form_for([:backend, @your_model]) do |f| %>
59
+ ...
60
+ <%= render 'backend/seo_form', f: f %>
61
+ ...
62
+ <% end %>
63
+ ```
64
+ This partial has support to let you base its SEO slug on whatever is typed in
65
+ an input element of your choice. In Udongo, this field is called the
66
+ **sluggable field**.
67
+
68
+ By default, the partial looks for a field called **title**. You can override
69
+ this name by passing ```sluggable_field``` to the partial, like so:
70
+
71
+ ```erb
72
+ <%= simple_form_for([:backend, @your_model]) do |f| %>
73
+ ...
74
+ <%# This will look for #backend_your_model_name as its sluggable field. %>
75
+ <%= render 'backend/seo_form', f: f, sluggable_field: :name %>
76
+ ...
77
+ <% end %>
78
+ ```
79
+
80
+ ### Dirty inputs
81
+ Sometimes a user enters some data in a form and assumes that everything is
82
+ magically saved without submitting said form.
83
+
84
+ To warn a user that this is not default behaviour, you can trigger a warning
85
+ to show up whenever a user has changed input contents and clicks on any
86
+ ```<a>``` element on the page.
87
+
88
+ Simply call the following helper method within your form tags:
89
+
90
+ ```erb
91
+ <%= simple_form_for([:backend, @your_model]) do |f| %>
92
+ <%= trigger_dirty_inputs_warning %>
93
+ ...
94
+ <% end %>
95
+ ```
96
+
97
+ This renders the following HTML:
98
+
99
+ ```html
100
+ <form class="simple_form" id="edit_your_model_1" action="/backend/your_models/1/edit" accept-charset="UTF-8" method="post">
101
+ ...
102
+ <span data-dirty="false"></span>
103
+ ...
104
+ </form>
105
+ ```
106
+
107
+ You can also override the default message with your own:
108
+
109
+ ```erb
110
+ <%= simple_form_for([:backend, @your_model]) do |f| %>
111
+ <%= trigger_dirty_inputs_warning(message: 'Are you sure you want to leave the page?') %>
112
+ ...
113
+ <% end %>
114
+ ```
115
+
53
116
  ## Flexible content
54
117
  ### types
55
118
  ```ruby
@@ -0,0 +1,9 @@
1
+ /*
2
+ * jQuery throttle / debounce - v1.1 - 3/7/2010
3
+ * http://benalman.com/projects/jquery-throttle-debounce-plugin/
4
+ *
5
+ * Copyright (c) 2010 "Cowboy" Ben Alman
6
+ * Dual licensed under the MIT and GPL licenses.
7
+ * http://benalman.com/about/license/
8
+ */
9
+ (function(b,c){var $=b.jQuery||b.Cowboy||(b.Cowboy={}),a;$.throttle=a=function(e,f,j,i){var h,d=0;if(typeof f!=="boolean"){i=j;j=f;f=c}function g(){var o=this,m=+new Date()-d,n=arguments;function l(){d=+new Date();j.apply(o,n)}function k(){h=c}if(i&&!h){l()}h&&clearTimeout(h);if(i===c&&m>e){l()}else{if(f!==true){h=setTimeout(i?k:l,i===c?e-m:e)}}}if($.guid){g.guid=j.guid=j.guid||$.guid++}return g};$.debounce=function(d,e,f){return f===c?a(d,e,false):a(d,f,e!==false)}})(this);
@@ -33,7 +33,7 @@
33
33
  }
34
34
  .ui-widget-content {
35
35
  border: 1px solid #dddddd;
36
- background: #f2f5f7 url("/assets/ui-bg_highlight-hard_100_f2f5f7_1x100.png") 50% top repeat-x;
36
+ background: #f2f5f7 asset-url('ui-bg_highlight-soft_75_cccccc_1x100.png') 50% top repeat-x;
37
37
  color: #362b36;
38
38
  }
39
39
  .ui-corner-all, .ui-corner-all { -moz-border-radius: 4px; -webkit-border-radius: 4px; -khtml-border-radius: 4px; border-radius: 4px; }
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: udongo
3
3
  version: !ruby/object:Gem::Version
4
- version: 5.4.0
4
+ version: 5.5.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Davy Hellemans
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2017-03-08 00:00:00.000000000 Z
12
+ date: 2017-03-13 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rails
@@ -426,12 +426,14 @@ files:
426
426
  - app/assets/javascripts/backend/application.js
427
427
  - app/assets/javascripts/backend/bootstrap.js
428
428
  - app/assets/javascripts/backend/datepickers.js
429
+ - app/assets/javascripts/backend/dirty-inputs.js
429
430
  - app/assets/javascripts/backend/flexible_content.js
430
431
  - app/assets/javascripts/backend/general.js
431
432
  - app/assets/javascripts/backend/pages.js
432
433
  - app/assets/javascripts/backend/plugins/autocomplete.js
433
434
  - app/assets/javascripts/backend/plugins/tagbox.js
434
435
  - app/assets/javascripts/backend/search.js
436
+ - app/assets/javascripts/backend/seo.js
435
437
  - app/assets/javascripts/backend/sortable.js
436
438
  - app/assets/javascripts/backend/tags.js
437
439
  - app/assets/javascripts/backend/tree.js
@@ -499,6 +501,7 @@ files:
499
501
  - app/forms/backend/translation_form.rb
500
502
  - app/forms/backend/translation_with_seo_form.rb
501
503
  - app/helpers/backend/dropdown_helper.rb
504
+ - app/helpers/backend/form_helper.rb
502
505
  - app/helpers/backend/pagination_helper.rb
503
506
  - app/helpers/icon_helper.rb
504
507
  - app/helpers/link_helper.rb
@@ -851,6 +854,7 @@ files:
851
854
  - vendor/assets/images/jstree/default/40px.png
852
855
  - vendor/assets/images/jstree/default/throbber.gif
853
856
  - vendor/assets/javascripts/backend/bootstrap-datepicker.min.js
857
+ - vendor/assets/javascripts/backend/jquery.throttle-debounce.min.js
854
858
  - vendor/assets/javascripts/backend/jstree/jstree.min.js
855
859
  - vendor/assets/javascripts/backend/jstree/libs/require.js
856
860
  - vendor/assets/javascripts/backend/select2.min.js
@@ -862,8 +866,8 @@ files:
862
866
  - vendor/assets/stylesheets/backend/jstree/default/style.min.scss
863
867
  - vendor/assets/stylesheets/backend/jstree/default/style.scss
864
868
  - vendor/assets/stylesheets/backend/select2.min.scss
865
- - vendor/assets/stylesheets/backend/tagit/tagit-autocomplete.css
866
- - vendor/assets/stylesheets/backend/tagit/tagit.css
869
+ - vendor/assets/stylesheets/backend/tagit/_autocomplete.scss
870
+ - vendor/assets/stylesheets/backend/tagit/_base.scss
867
871
  - vendor/assets/stylesheets/jquery-ui.theme.min.css
868
872
  homepage: http://udongo.be
869
873
  licenses: