udongo 5.4.0 → 5.5.0

Sign up to get free protection for your applications and to get access to all the features.
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: