maac 1.0.1 → 2.0.0.pre.alpha

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: 46cb9df9785d419525d2d47133e5f2219229bfec
4
- data.tar.gz: 8a0d3d6c3c91cd3e108d509b31f409142dd7c240
3
+ metadata.gz: 7a55633ff282d4a350ae99e7be839675b285381d
4
+ data.tar.gz: d8eab4a2387e037cd27d3a9d0945c6ce2088b592
5
5
  SHA512:
6
- metadata.gz: 72c69ee734da00acacd3067d78f8f13dfa5bf560f9199da12b79b6037ca46b9f6fd1692096d844b40ca569bd65b6c00b85b24b64aed20015f7d151e7c6b9ac95
7
- data.tar.gz: a9f409b6c5e7d3811e75be282fa32b4e5426489ec9569b7d06b83a58b4298158d7a3f394cf2fe6eaf7590a0cafc974596020bbb852ef32663c98ee5f5604077d
6
+ metadata.gz: 7d0240b46213423cd440533f30272b73a298ba76f1f96f6e6e64e7d7fc015300ca65ce70b4c452ccbf494bbc6454696f2da6e0bc2f1bd2acb22bdd0bd51387ff
7
+ data.tar.gz: c45086746cb712a3721297a97b218e5a077f61873c7daf77e54b52de1ee596fbca71594c1c2357870688c803edf1c221e3a5705d854345624af4f13601f913d3
data/README.md CHANGED
@@ -5,9 +5,33 @@
5
5
  [![Gem](https://img.shields.io/gem/v/maac.svg)](https://rubygems.org/gems/maac)
6
6
 
7
7
  This gem allows you to replace standard confirm() call for data-confirm'ed page elements,
8
- with a bootstrap modal. I.e. instead of calling confirm("Are you sure?") this code will draw
9
- a bootstrap yes-no modal after clicking the link.
10
- For now, you can customize dialog texts using following attributes:
8
+ with a html modal (Bootstrap modal or a custom markup). I.e. instead of calling confirm("Are you sure?") this code will draw
9
+ a yes-no popup after clicking the link.
10
+
11
+ ```rhtml
12
+ <%= link_to 'A very dangerous action',
13
+ dangerous_action_path,
14
+ data: {
15
+ method: :delete,
16
+ confirm: 'Are you sure?'
17
+ } %>
18
+ ```
19
+
20
+ ```rhtml
21
+ <%= link_to 'A very dangerous action',
22
+ dangerous_action_path,
23
+ data: {
24
+ method: :delete,
25
+ 'confirm-title': 'Oh, no!',
26
+ confirm: 'Are you sure?'
27
+ } %>
28
+ ```
29
+
30
+ There are lots of gems for the similar purposes, but I found nothing appropriate for Rails 5.1
31
+ So I've made it for my own purposes. I'll be happy if you find it useful.
32
+
33
+ ## Run-time configuration
34
+ You can simply customize titles via link attributes:
11
35
 
12
36
  - **data-confirm-title** - *dialog title text: default value is "Confirm"*
13
37
 
@@ -22,11 +46,73 @@ For now, you can customize dialog texts using following attributes:
22
46
  dangerous_action_path,
23
47
  data: {
24
48
  method: :delete,
25
- confirm: 'Are you sure?'
49
+ confirm: 'Are you sure?',
50
+ 'confirm-title': 'Important!',
51
+ 'confirm-yes': 'Proceed',
52
+ 'confirm-no': 'Dismiss',
53
+ 'confirm-close': 'Never mind'
26
54
  } %>
27
55
  ```
28
- There are lots of gems for the same purpose, but I found nothing appropriate for Rails 5.
29
- So I've made it for my purposes. I'll be happy if you find it useful.
56
+
57
+ ## Initialization
58
+ If your gemfile includes a gem, which is named with something containing "bootstrap",
59
+ the bootstrap modal'll be used by default. Otherwise it will use the following template code:
60
+
61
+ ```html
62
+ <div class="maac-popup">
63
+ <div class="maac-popup_inner">
64
+ <div class="maac-popup_header">
65
+ <div class="maac-popup_header_title">%{title}</div>
66
+ <div class="maac-popup_header_buttons">
67
+ <a id="js-maac-close" href="javascript:void(0)" class="maac-popup_header_buttons_button maac-popup_header_buttons_button__close">%{close}</a>
68
+ </div>
69
+ </div>
70
+ <div class="maac-popup_body">%{text}</div>
71
+ <div class="maac-popup_footer">
72
+ <div class="maac-popup_footer_buttons">
73
+ <a id="js-maac-yes" href="javascript:void(0)" class="maac-popup_footer_buttons_button maac-popup_footer_buttons_button__yes">%{yes}</a>
74
+ <a id="js-maac-no" href="javascript:void(0)" class="maac-popup_footer_buttons_button maac-popup_footer_buttons_button__no">%{no}</a>
75
+ </div>
76
+ </div>
77
+ </div>
78
+ </div>
79
+ ```
80
+
81
+ You can add an initializer, i.e.:
82
+ */config/initializers/maac.rb*:
83
+ ```ruby
84
+ Maac.configure do |config|
85
+ # Strings to be substituted into template
86
+ # (using %{key}). You can define your own set of keys
87
+ config.strings = {
88
+ title: 'A default title value',
89
+ yes: 'A default Yes button text',
90
+ no: 'A default No button text',
91
+ close: 'A default Close button text'
92
+ }
93
+
94
+ # A modal' template code
95
+ config.template = '<div class="my-modal"><span id="js-yes">%{yes}</span><span id="js-no">%{no}</span></div>'
96
+
97
+ # A modal' selector – used to remove the modal code and
98
+ # for event bindings
99
+ config.selector = '.my-modal'
100
+
101
+ # Selector of a yes button
102
+ config.selector_y = '#js-yes'
103
+
104
+ # Selector of a no button
105
+ config.selector_n = '#js-no'
106
+
107
+ # Callback, which is called just after the modal code
108
+ # appended to a page
109
+ config.after_append = 'function () {}'
110
+
111
+ # Async handler, called before code removement.
112
+ # After your code completes the execution call cb()
113
+ config.before_remove = 'function (cb) { cb(); }'
114
+ end
115
+ ```
30
116
 
31
117
  ## Installation
32
118
 
@@ -85,21 +171,26 @@ Most important steps are described below. You can also look at defined rake task
85
171
 
86
172
  ### Setup
87
173
 
88
- You must perform a few simple steps to prepare the project for development:
174
+ Simply run:
89
175
 
90
176
  $ bundle install
91
- $ rake db:migrate
177
+ $ rake dummy:dep
92
178
  $ rake
93
179
 
180
+ And rake will compile the .coffee.erb code and run all tests for you.
181
+
94
182
  ### Testing
95
183
 
96
184
  The project uses automated testing. The RSpec is used.
97
185
  The /spec directory contents:
98
186
 
99
- - **/spec/dummy** - *a simple rails app used for gem testing*
100
- - **/spec/factories** - *factory_bot factory descriptions*
101
- - **/spec/features/maac_features_spec.rb** - *gem specifications*
102
- - **/spec/spec_helper.rb** - *a helper file*
187
+ - **/spec/features/client_spec.rb** - the main behaviour testing
188
+ - **/spec/features/config_spec.rb** - the gem' configuration testing
189
+ - **/spec/features/host_application_spec.rb** - dummy application, which uses the maac, testing
190
+
191
+ - **/spec/support/dummy** - dummy applications
192
+ - **/spec/support/dummy/vanilla** - a dummy app, which uses neither jQuery nor Bpptstrap
193
+ - **/spec/support/dummy/bs3** - a dummy app, which uses both jQuery and Bpptstrap
103
194
 
104
195
  To start automated testing just type:
105
196
 
@@ -0,0 +1,82 @@
1
+
2
+ /*!
3
+ * Modal As A Confirm (MAAC) 2.0.0.pre.alpha (2018-02-06 18:59:03 +0300)
4
+ * https://github.com/igorakaamigo/maac
5
+ * Released under the MIT license:
6
+ * https://github.com/igorakaamigo/maac/blob/master/MIT-LICENSE
7
+ */
8
+
9
+ (function() {
10
+ this.Maac = (function() {
11
+ function Maac() {}
12
+
13
+ Maac.version = '2.0.0.pre.alpha';
14
+
15
+ Maac.strings = <%= Maac.strings.to_json %>;
16
+
17
+ Maac.template = <%= Maac.template.to_json %>;
18
+
19
+ Maac.selector = <%= Maac.selector.to_json %>;
20
+
21
+ Maac.selector_y = <%= Maac.selector_y.to_json %>;
22
+
23
+ Maac.selector_n = <%= Maac.selector_n.to_json %>;
24
+
25
+ Maac.after_append = <%= Maac.after_append %>;
26
+
27
+ Maac.before_remove = <%= Maac.before_remove %>;
28
+
29
+ Maac.show = function() {
30
+ if (!document.querySelector(Maac.selector)) {
31
+ document.body.innerHTML += Maac.html();
32
+ return Maac.after_append();
33
+ }
34
+ };
35
+
36
+ Maac.hide = function(confirmed) {
37
+ return Maac.before_remove(function() {
38
+ document.querySelector(Maac.selector).remove();
39
+ if (confirmed) {
40
+ Maac._link.removeAttribute('data-confirm');
41
+ return Maac._link.click();
42
+ }
43
+ });
44
+ };
45
+
46
+ Maac.avalue = function(key) {
47
+ if (key === 'text') {
48
+ return Maac._link.getAttribute('data-confirm');
49
+ } else {
50
+ return Maac._link.getAttribute("data-confirm-" + key) || Maac.strings[key];
51
+ }
52
+ };
53
+
54
+ Maac.html = function() {
55
+ return Maac.template.replace(/%{(.*?)}/g, function(_, key) {
56
+ return Maac.avalue(key);
57
+ });
58
+ };
59
+
60
+ Maac.initialize = function() {
61
+ Rails.delegate(document, 'a[data-confirm]', 'confirm', function() {
62
+ Maac._link = this;
63
+ Maac.show();
64
+ return false;
65
+ });
66
+ Rails.delegate(document, Maac.selector_n, 'click', function(event) {
67
+ Rails.stopEverything(event);
68
+ return Maac.hide();
69
+ });
70
+ return Rails.delegate(document, Maac.selector_y, 'click', function(event) {
71
+ Rails.stopEverything(event);
72
+ return Maac.hide(true);
73
+ });
74
+ };
75
+
76
+ return Maac;
77
+
78
+ })();
79
+
80
+ Maac.initialize();
81
+
82
+ }).call(this);
@@ -1,4 +1,30 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'maac/engine'
4
+ require 'maac/config'
5
+
1
6
  module Maac
2
- class Engine < ::Rails::Engine
7
+ class << self
8
+ def configure
9
+ yield config
10
+ end
11
+
12
+ def respond_to_missing?(symbol)
13
+ config.respond_to?(symbol) || super
14
+ end
15
+
16
+ def method_missing(symbol, *args)
17
+ if config.respond_to?(symbol)
18
+ config.send(symbol, *args)
19
+ else
20
+ super
21
+ end
22
+ end
23
+
24
+ private
25
+
26
+ def config
27
+ @config ||= Config.new
28
+ end
3
29
  end
4
30
  end
@@ -0,0 +1,46 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'rubygems'
4
+
5
+ module Maac
6
+ class Config
7
+ OPTIONS = %i[
8
+ strings
9
+ template
10
+ selector
11
+ selector_y
12
+ selector_n
13
+ after_append
14
+ before_remove
15
+ ].freeze
16
+
17
+ OPTIONS.each do |option|
18
+ attr_accessor option
19
+ end
20
+
21
+ def initialize
22
+ @strings = {
23
+ title: 'Confirm',
24
+ yes: 'Yes',
25
+ no: 'No',
26
+ close: 'Close'
27
+ }
28
+
29
+ @selector = '.maac-popup'
30
+ @selector_y = '#js-maac-yes'
31
+
32
+ bsgems = Gem::Specification.reject { |s| s.name.match(/bootstrap/i).nil? }
33
+ if bsgems.count > 0
34
+ @template = File.new(File.expand_path('../../../tpl/bs3.html', __FILE__)).read
35
+ @selector_n = '#js-maac-no,#js-maac-close'
36
+ @after_append = 'function () { $(".maac-popup").modal({"backdrop": "static"}); }'
37
+ @before_remove = 'function (cb) { $(".maac-popup").modal("hide"); cb(); }'
38
+ else
39
+ @template = File.new(File.expand_path('../../../tpl/vanilla.html', __FILE__)).read
40
+ @selector_n = '#js-maac-no,#js-maac-close'
41
+ @after_append = 'function () { /* After append */; }'
42
+ @before_remove = 'function (cb) { /* Before remove */; cb(); }'
43
+ end
44
+ end
45
+ end
46
+ end
@@ -0,0 +1,6 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Maac
4
+ class Engine < ::Rails::Engine
5
+ end
6
+ end
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Maac
4
+ VERSION = '2.0.0.pre.alpha'
5
+ end
@@ -0,0 +1,19 @@
1
+ <div class="modal maac-popup" tabindex="-1" role="dialog">
2
+ <div class="modal-dialog" role="document">
3
+ <div class="modal-content">
4
+ <div class="modal-header">
5
+ <h5 class="modal-title">%{title}</h5>
6
+ <button id="js-maac-close" type="button" class="close" aria-label="%{close}">
7
+ <span aria-hidden="true">&times;</span>
8
+ </button>
9
+ </div>
10
+ <div class="modal-body">
11
+ <p>%{text}</p>
12
+ </div>
13
+ <div class="modal-footer">
14
+ <button id="js-maac-yes" type="button" class="btn btn-primary">%{yes}</button>
15
+ <button id="js-maac-no" type="button" class="btn btn-secondary">%{no}</button>
16
+ </div>
17
+ </div>
18
+ </div>
19
+ </div>
@@ -0,0 +1,17 @@
1
+ <div class="maac-popup">
2
+ <div class="maac-popup_inner">
3
+ <div class="maac-popup_header">
4
+ <div class="maac-popup_header_title">%{title}</div>
5
+ <div class="maac-popup_header_buttons">
6
+ <a id="js-maac-close" href="javascript:void(0)" class="maac-popup_header_buttons_button maac-popup_header_buttons_button__close">%{close}</a>
7
+ </div>
8
+ </div>
9
+ <div class="maac-popup_body">%{text}</div>
10
+ <div class="maac-popup_footer">
11
+ <div class="maac-popup_footer_buttons">
12
+ <a id="js-maac-yes" href="javascript:void(0)" class="maac-popup_footer_buttons_button maac-popup_footer_buttons_button__yes">%{yes}</a>
13
+ <a id="js-maac-no" href="javascript:void(0)" class="maac-popup_footer_buttons_button maac-popup_footer_buttons_button__no">%{no}</a>
14
+ </div>
15
+ </div>
16
+ </div>
17
+ </div>
metadata CHANGED
@@ -1,115 +1,17 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: maac
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.1
4
+ version: 2.0.0.pre.alpha
5
5
  platform: ruby
6
6
  authors:
7
7
  - Igor M Osipov
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-02-02 00:00:00.000000000 Z
12
- dependencies:
13
- - !ruby/object:Gem::Dependency
14
- name: rails
15
- requirement: !ruby/object:Gem::Requirement
16
- requirements:
17
- - - "~>"
18
- - !ruby/object:Gem::Version
19
- version: 5.1.4
20
- type: :runtime
21
- prerelease: false
22
- version_requirements: !ruby/object:Gem::Requirement
23
- requirements:
24
- - - "~>"
25
- - !ruby/object:Gem::Version
26
- version: 5.1.4
27
- - !ruby/object:Gem::Dependency
28
- name: sqlite3
29
- requirement: !ruby/object:Gem::Requirement
30
- requirements:
31
- - - ">="
32
- - !ruby/object:Gem::Version
33
- version: '0'
34
- type: :development
35
- prerelease: false
36
- version_requirements: !ruby/object:Gem::Requirement
37
- requirements:
38
- - - ">="
39
- - !ruby/object:Gem::Version
40
- version: '0'
41
- - !ruby/object:Gem::Dependency
42
- name: rspec-rails
43
- requirement: !ruby/object:Gem::Requirement
44
- requirements:
45
- - - ">="
46
- - !ruby/object:Gem::Version
47
- version: '0'
48
- type: :development
49
- prerelease: false
50
- version_requirements: !ruby/object:Gem::Requirement
51
- requirements:
52
- - - ">="
53
- - !ruby/object:Gem::Version
54
- version: '0'
55
- - !ruby/object:Gem::Dependency
56
- name: capybara
57
- requirement: !ruby/object:Gem::Requirement
58
- requirements:
59
- - - ">="
60
- - !ruby/object:Gem::Version
61
- version: '0'
62
- type: :development
63
- prerelease: false
64
- version_requirements: !ruby/object:Gem::Requirement
65
- requirements:
66
- - - ">="
67
- - !ruby/object:Gem::Version
68
- version: '0'
69
- - !ruby/object:Gem::Dependency
70
- name: factory_bot_rails
71
- requirement: !ruby/object:Gem::Requirement
72
- requirements:
73
- - - ">="
74
- - !ruby/object:Gem::Version
75
- version: '0'
76
- type: :development
77
- prerelease: false
78
- version_requirements: !ruby/object:Gem::Requirement
79
- requirements:
80
- - - ">="
81
- - !ruby/object:Gem::Version
82
- version: '0'
83
- - !ruby/object:Gem::Dependency
84
- name: coffee-script
85
- requirement: !ruby/object:Gem::Requirement
86
- requirements:
87
- - - ">="
88
- - !ruby/object:Gem::Version
89
- version: '0'
90
- type: :development
91
- prerelease: false
92
- version_requirements: !ruby/object:Gem::Requirement
93
- requirements:
94
- - - ">="
95
- - !ruby/object:Gem::Version
96
- version: '0'
97
- - !ruby/object:Gem::Dependency
98
- name: poltergeist
99
- requirement: !ruby/object:Gem::Requirement
100
- requirements:
101
- - - ">="
102
- - !ruby/object:Gem::Version
103
- version: '0'
104
- type: :development
105
- prerelease: false
106
- version_requirements: !ruby/object:Gem::Requirement
107
- requirements:
108
- - - ">="
109
- - !ruby/object:Gem::Version
110
- version: '0'
11
+ date: 2018-02-06 00:00:00.000000000 Z
12
+ dependencies: []
111
13
  description: This gem allows you to replace standard confirm() call for data-confirm'ed
112
- page elements, with a bootstrap modal.
14
+ page elements, with a nice styled modal.
113
15
  email:
114
16
  - osipov.igor.amigo@gmail.com
115
17
  executables: []
@@ -118,8 +20,13 @@ extra_rdoc_files: []
118
20
  files:
119
21
  - MIT-LICENSE
120
22
  - README.md
23
+ - app/assets/javascripts/maac.js.erb
121
24
  - lib/maac.rb
122
- - vendor/assets/javascripts/maac.js
25
+ - lib/maac/config.rb
26
+ - lib/maac/engine.rb
27
+ - lib/maac/version.rb
28
+ - tpl/bs3.html
29
+ - tpl/vanilla.html
123
30
  homepage: https://github.com/igorakaamigo/maac
124
31
  licenses:
125
32
  - MIT
@@ -135,13 +42,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
135
42
  version: '0'
136
43
  required_rubygems_version: !ruby/object:Gem::Requirement
137
44
  requirements:
138
- - - ">="
45
+ - - ">"
139
46
  - !ruby/object:Gem::Version
140
- version: '0'
47
+ version: 1.3.1
141
48
  requirements: []
142
49
  rubyforge_project:
143
50
  rubygems_version: 2.6.13
144
51
  signing_key:
145
52
  specification_version: 4
146
- summary: Bootstrap confirmation modal for data-confirm'ed links @ Rails 5 projects
53
+ summary: Configurable confirmation modal (Bootstrap or custom markup) for data-confirm'ed
54
+ links @ Rails 5 projects
147
55
  test_files: []
@@ -1,55 +0,0 @@
1
-
2
- /*!
3
- Modal As A Confirm (MAAC) v1.0.1 (2018-02-02T21:36:12+03:00)
4
- https://github.com/igorakaamigo/maac
5
- Released under the MIT license:
6
- https://github.com/igorakaamigo/maac/blob/master/MIT-LICENSE
7
- */
8
-
9
- (function() {
10
- var safeBsModal, showAModal;
11
-
12
- Rails.delegate(document, 'a[data-confirm]', 'confirm', function(event) {
13
- showAModal(this, 'Yes', 'No', 'Close', 'Confirm');
14
- return false;
15
- });
16
-
17
- safeBsModal = function(arg) {
18
- if (this.jQuery && this.jQuery.fn.modal) {
19
- return this.jQuery('.modal').modal(arg);
20
- }
21
- };
22
-
23
- showAModal = function(link, defaultYes, defaultNo, defaultClose, defaultTitle) {
24
- var close, dialogClose, dialogNo, dialogTitle, dialogYes, modal;
25
- modal = document.createElement('div');
26
- modal.className = 'modal';
27
- modal.setAttribute('tabindex', '-1');
28
- modal.setAttribute('role', 'dialog');
29
- dialogYes = link.getAttribute('data-confirm-yes') || defaultYes;
30
- dialogNo = link.getAttribute('data-confirm-no') || defaultNo;
31
- dialogClose = link.getAttribute('data-confirm-close') || defaultClose;
32
- dialogTitle = link.getAttribute('data-confirm-title') || defaultTitle;
33
- modal.innerHTML = '<div class="modal-dialog" role="document"> <div class="modal-content"> <div class="modal-header"> <h5 class="modal-title"></h5> <button type="button" class="close" aria-label=""> <span aria-hidden="true">&times;</span> </button> </div> <div class="modal-body"> <p></p> </div> <div class="modal-footer"> <button type="button" class="btn btn-secondary"></button> <button type="button" class="btn btn-primary"></button> </div> </div> </div>';
34
- modal.querySelector('.modal-body > p').innerText = link.getAttribute('data-confirm');
35
- modal.querySelector('.modal-footer > .btn-secondary').innerText = dialogYes;
36
- modal.querySelector('.modal-footer > .btn-primary').innerText = dialogNo;
37
- modal.querySelector('.modal-header > button').setAttribute('aria-label', dialogClose);
38
- modal.querySelector('.modal-header > h5').innerText = dialogTitle;
39
- close = function() {
40
- Rails.stopEverything(event);
41
- safeBsModal('hide');
42
- return modal.remove();
43
- };
44
- Rails.delegate(modal, '.close,.btn-primary', 'click', close);
45
- Rails.delegate(document, '.modal-backdrop', 'click', close);
46
- Rails.delegate(modal, '.btn-secondary', 'click', function(event) {
47
- close();
48
- link.removeAttribute('data-confirm');
49
- return Rails.fire(link, 'click');
50
- });
51
- document.body.appendChild(modal);
52
- return safeBsModal();
53
- };
54
-
55
- }).call(this);