select7 0.0.1 → 0.0.3

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
  SHA256:
3
- metadata.gz: de12f1b5502b7b8ff49100e092b72a00b6f143b9e51fd0ea77d07a6ee4a7a2f9
4
- data.tar.gz: 5723178cf260813f9b26be5bacf25e5a64d48b6bab738e227a2660f497b9a5b9
3
+ metadata.gz: c61f82d9300b39b9171a01887ab66ee425005fa1abc716efcf7a25825ae77489
4
+ data.tar.gz: 51b731efc4be876b0b435b5e9fa84f28446463c52b74c383b2f2b5695de92a1a
5
5
  SHA512:
6
- metadata.gz: 0061de765dd721b9bb54aecef14e0897633ac450fa1cad1ce8b4bd15a36af8318d5dfb8929277c242e594c6560dcee3b5edc1b4dc5a2363c911feea970276443
7
- data.tar.gz: 91793c8a4fce00d561d92ce35cc1b436e84595994348bf968cb576c96bac7c11c38670e95d7db173854e6e0787442fe243e962b56117d8de98d5cf0c2e04e6ea
6
+ metadata.gz: e170dc1b76b781c24f9cf503d7a2a6681bae0f1c9131766adea9ec38691b6c96bff83047d7e3e2b0b0dc9b29be788c13f53f9f11465ac5074a5f2cba15b7b438
7
+ data.tar.gz: e8ed47be84cc70f06b8e1d741b57ccf8c2010ce2271c65dae0db5b89be1de0acaf611a82e7720183631c3a177be47b1db25208ffc6c1a11d58ff2cac0930b9e8
data/README.md CHANGED
@@ -72,3 +72,24 @@ class DevelopersController < ApplicationController
72
72
  # ...
73
73
  end
74
74
  ```
75
+
76
+ ### Listening select7 changed events
77
+ In case you want to do something with selected options from select7 whenever they're changed, you could listen event `select7-changed@window` from your js file.
78
+ For example:
79
+ ```ruby
80
+ <div data-controller="filter" data-action="select7-changed@window->filter#update">
81
+ <%= select7_tag(:tags => [:id, :name], options: Tag.all) %>
82
+ </div>
83
+
84
+ # filter_controller.js
85
+ import { Controller } from "@hotwired/stimulus"
86
+ export default class extends Controller {
87
+ update(e) {
88
+ console.log(e.detail)
89
+ // field: "tags"
90
+ // action: "add"
91
+ // changedValue: "3"
92
+ // selectedValues: ["1", "3"]
93
+ }
94
+ }
95
+ ```
@@ -194,8 +194,8 @@ export const Select7Controller = (base, debounce) =>
194
194
  scope: this.scopeValue,
195
195
  field: this.fieldValue,
196
196
  action: action,
197
- change_value: value,
198
- values: this.selectedItems.map(item => item[0])
197
+ changedValue: value,
198
+ selectedValues: this.selectedItems.map(item => item[0])
199
199
  }
200
200
  })
201
201
  window.dispatchEvent(changedEvent)
@@ -0,0 +1 @@
1
+ const r=(c,u)=>class extends c{static targets=["selected","input","suggestion","template"];static values={scope:String,field:String,valueAttr:String,textAttr:String,suggest:Object,inputName:String,multiple:Boolean,nested:Boolean,items:Array,selectedItems:Array};static formats={json:"application/json",html:"text/html",turbo_stream:"text/vnd.turbo-stream.html"};connect(){this.count=0,this.timeoutId=null,this.element.addEventListener("turbo:submit-end",this.clearForm.bind(this)),this.hasInputTarget&&this.inputTarget.setAttribute("autocomplete","off"),this.debounceSuggest=u(this.suggest.bind(this),500,{leading:!0}),this.selectedItems=this.hasSelectedItemsValue?this.selectedItemsValue.map((t,s,i)=>[t,s]):[],document.addEventListener("click",this.outsideClick.bind(this))}disconnect(){document.removeEventListener("click",this.outsideClick.bind(this))}suggest(){this.suggestValue.url?this.remoteSuggest():this.hasItemsValue&&this.localSuggest()}localSuggest(){const t=this.inputTarget.value.toLowerCase();if(t!=""){this.suggestionTarget.innerHTML="";const s=this.itemsValue.filter(([i,e,n])=>n.includes(t));s.length>0&&(s.forEach(([i,e,n])=>this.insertSuggestItem(i,e)),this.showSuggestion())}else this.hideSuggestion()}remoteSuggest(){const t=this.inputTarget.value.replaceAll(/[^\w]/g,"");if(t.length<=0)return;const s=document.querySelector("[name='csrf-token']")?.content,i=this.suggestValue.format||"html",e=this.suggestValue["content-type"]||this.constructor.formats[i],n=new URL(this.suggestValue.url);n.searchParams.append(this.textAttrValue,t),fetch(n,{method:this.suggestValue.method||"get",mode:"cors",cache:"no-cache",credentials:"same-origin",headers:{Accept:e,"Content-Type":e,"X-CSRF-Token":s}}).then(a=>a.text()).then(a=>{if(a)if(this.suggestionTarget.innerHTML="",this.suggestValue.format=="json"){const l=JSON.parse(a);l.length>0&&(l.forEach(o=>{this.insertSuggestItem(o[this.valueAttrValue],o[this.textAttrValue])}),this.showSuggestion())}else this.suggestionTarget.innerHTML=a,this.showSuggestion();else this.hideSuggestion()})}insertSuggestItem(t,s){const i=this.selectedItems.find(n=>n[0]==t)?`\u2713 ${s}`:s,e=document.createElement("div");e.setAttribute("value",t),e.setAttribute("data-action","click->select7#selectTag"),e.setAttribute("class","select7-option-item"),e.innerText=i,this.suggestionTarget.appendChild(e)}selectTag(t){const s=t.target,i=s.getAttribute("value"),e=this.inputNameValue.replace("[?]",`[${this.count++}]`);if(!this.selectedItems.find(n=>n[0]==i)){this.selectedItems.push([i,e]);const n=document.createElement("input");n.setAttribute("type","hidden"),n.setAttribute("value",i),n.setAttribute("name",e);const a=this.templateTarget.cloneNode(!0);a.appendChild(n),a.insertAdjacentHTML("afterbegin",s.innerHTML),a.classList.remove("select7-hidden"),this.selectedTarget.appendChild(a),this.emitChangedEvent("add",e,i)}this.hideSuggestion(),this.inputTarget.value="",this.multipleValue||this.inputTarget.classList.add("select7-invisible"),this.inputTarget.focus()}removeTag(t){const s=t.target.parentElement,i=s.getAttribute("data-remove-id"),e=s.getAttribute("data-remove-value");if(this.selectedItems=this.selectedItems.filter((a,l)=>l==i&&e==a),s.hasAttribute("data-remove-id")){const a=document.createElement("input");a.setAttribute("type","hidden"),a.setAttribute("name",i),a.setAttribute("value",e),this.selectedTarget.appendChild(a),s.querySelectorAll("input").forEach(l=>this.selectedTarget.appendChild(l))}const n=s.querySelector("input");this.emitChangedEvent("remove",i,e),this.selectedTarget.removeChild(s),this.inputTarget.classList.remove("select7-invisible")}showSuggestion(){this.suggestionTarget.classList.remove("select7-hidden"),this.suggestionTarget.scrollTo(0,0)}hideSuggestion(){this.suggestionTarget.classList.add("select7-hidden")}clearForm(){this.selectedTarget.innerHTML=""}emitChangedEvent(t,s,i){const e=new CustomEvent("select7-changed",{detail:{scope:this.scopeValue,field:this.fieldValue,action:t,changedValue:i,selectedValues:this.selectedItems.map(n=>n[0])}});window.dispatchEvent(e)}handleKeyUp(t){t.code=="Escape"&&this.hideSuggestion()}outsideClick(t){t.composedPath().includes(this.element)||this.hideSuggestion()}};export{r as Select7Controller};
@@ -194,8 +194,8 @@ const Select7Controller = (base, debounce) =>
194
194
  scope: this.scopeValue,
195
195
  field: this.fieldValue,
196
196
  action: action,
197
- change_value: value,
198
- values: this.selectedItems.map(item => item[0])
197
+ changedValue: value,
198
+ selectedValues: this.selectedItems.map(item => item[0])
199
199
  }
200
200
  })
201
201
  window.dispatchEvent(changedEvent)
@@ -0,0 +1 @@
1
+ const Select7Controller=(o,u)=>class extends o{static targets=["selected","input","suggestion","template"];static values={scope:String,field:String,valueAttr:String,textAttr:String,suggest:Object,inputName:String,multiple:Boolean,nested:Boolean,items:Array,selectedItems:Array};static formats={json:"application/json",html:"text/html",turbo_stream:"text/vnd.turbo-stream.html"};connect(){this.count=0,this.timeoutId=null,this.element.addEventListener("turbo:submit-end",this.clearForm.bind(this)),this.hasInputTarget&&this.inputTarget.setAttribute("autocomplete","off"),this.debounceSuggest=u(this.suggest.bind(this),500,{leading:!0}),this.selectedItems=this.hasSelectedItemsValue?this.selectedItemsValue.map((t,s,i)=>[t,s]):[],document.addEventListener("click",this.outsideClick.bind(this))}disconnect(){document.removeEventListener("click",this.outsideClick.bind(this))}suggest(){this.suggestValue.url?this.remoteSuggest():this.hasItemsValue&&this.localSuggest()}localSuggest(){const t=this.inputTarget.value.toLowerCase();if(t!=""){this.suggestionTarget.innerHTML="";const s=this.itemsValue.filter(([i,e,n])=>n.includes(t));s.length>0&&(s.forEach(([i,e,n])=>this.insertSuggestItem(i,e)),this.showSuggestion())}else this.hideSuggestion()}remoteSuggest(){const t=this.inputTarget.value.replaceAll(/[^\w]/g,"");if(t.length<=0)return;const s=document.querySelector("[name='csrf-token']")?.content,i=this.suggestValue.format||"html",e=this.suggestValue["content-type"]||this.constructor.formats[i],n=new URL(this.suggestValue.url);n.searchParams.append(this.textAttrValue,t),fetch(n,{method:this.suggestValue.method||"get",mode:"cors",cache:"no-cache",credentials:"same-origin",headers:{Accept:e,"Content-Type":e,"X-CSRF-Token":s}}).then(a=>a.text()).then(a=>{if(a)if(this.suggestionTarget.innerHTML="",this.suggestValue.format=="json"){const l=JSON.parse(a);l.length>0&&(l.forEach(c=>{this.insertSuggestItem(c[this.valueAttrValue],c[this.textAttrValue])}),this.showSuggestion())}else this.suggestionTarget.innerHTML=a,this.showSuggestion();else this.hideSuggestion()})}insertSuggestItem(t,s){const i=this.selectedItems.find(n=>n[0]==t)?`\u2713 ${s}`:s,e=document.createElement("div");e.setAttribute("value",t),e.setAttribute("data-action","click->select7#selectTag"),e.setAttribute("class","select7-option-item"),e.innerText=i,this.suggestionTarget.appendChild(e)}selectTag(t){const s=t.target,i=s.getAttribute("value"),e=this.inputNameValue.replace("[?]",`[${this.count++}]`);if(!this.selectedItems.find(n=>n[0]==i)){this.selectedItems.push([i,e]);const n=document.createElement("input");n.setAttribute("type","hidden"),n.setAttribute("value",i),n.setAttribute("name",e);const a=this.templateTarget.cloneNode(!0);a.appendChild(n),a.insertAdjacentHTML("afterbegin",s.innerHTML),a.classList.remove("select7-hidden"),this.selectedTarget.appendChild(a),this.emitChangedEvent("add",e,i)}this.hideSuggestion(),this.inputTarget.value="",this.multipleValue||this.inputTarget.classList.add("select7-invisible"),this.inputTarget.focus()}removeTag(t){const s=t.target.parentElement,i=s.getAttribute("data-remove-id"),e=s.getAttribute("data-remove-value");if(this.selectedItems=this.selectedItems.filter((a,l)=>l==i&&e==a),s.hasAttribute("data-remove-id")){const a=document.createElement("input");a.setAttribute("type","hidden"),a.setAttribute("name",i),a.setAttribute("value",e),this.selectedTarget.appendChild(a),s.querySelectorAll("input").forEach(l=>this.selectedTarget.appendChild(l))}const n=s.querySelector("input");this.emitChangedEvent("remove",i,e),this.selectedTarget.removeChild(s),this.inputTarget.classList.remove("select7-invisible")}showSuggestion(){this.suggestionTarget.classList.remove("select7-hidden"),this.suggestionTarget.scrollTo(0,0)}hideSuggestion(){this.suggestionTarget.classList.add("select7-hidden")}clearForm(){this.selectedTarget.innerHTML=""}emitChangedEvent(t,s,i){const e=new CustomEvent("select7-changed",{detail:{scope:this.scopeValue,field:this.fieldValue,action:t,changedValue:i,selectedValues:this.selectedItems.map(n=>n[0])}});window.dispatchEvent(e)}handleKeyUp(t){t.code=="Escape"&&this.hideSuggestion()}outsideClick(t){t.composedPath().includes(this.element)||this.hideSuggestion()}};
@@ -0,0 +1 @@
1
+ .select7-selected-container,.select7-selection{justify-content:flex-start;height:fit-content;display:flex}.select7-selection,.select7-suggestion{--tw-border-opacity:1;--tw-shadow:0 1px 3px 0 rgb(0 0 0 / 0.1),0 1px 2px -1px rgb(0 0 0 / 0.1);--tw-shadow-colored:0 1px 3px 0 var(--tw-shadow-color),0 1px 2px -1px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.select7-container{position:relative;margin-top:1.25rem;margin-bottom:1.25rem;font-size:1rem;width:90%}.select7-selected-container{flex-wrap:wrap}.select7-selection{margin-top:.5rem;flex-wrap:wrap;border:solid rgb(229 231 235 / var(--tw-border-opacity));border-width:1px;padding:.5rem .75rem;outline:transparent solid 2px;outline-offset:2px}.select7-selected{display:flex;justify-content:flex-start}.select7-input{border-style:none;outline:transparent solid 2px;outline-offset:2px;font-size:1rem}.select7-suggestion{position:absolute;left:0;z-index:50;height:6rem;width:100%;overflow-y:auto;overflow-x:hidden;margin-top:-2px;border:solid rgb(229 231 235 / var(--tw-border-opacity));border-width:0 1px 2px;--tw-bg-opacity:1;background-color:rgb(255 255 255 / var(--tw-bg-opacity));filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.select7-option-item{width:100%;padding:.25rem .5rem}.select7-option-item:hover{background-color:rgb(229 231 235);cursor:pointer}.select7-selected-item{margin-right:.25rem;display:flex;align-items:center;justify-content:space-between;border-radius:.2rem;padding:.25rem;background-color:#d9e1e1}.select7-item-close{padding:.25rem;margin-left:.25rem;text-align:center;line-height:1rem}.select7-item-close:hover{background-color:#f2f2f4;cursor:pointer}.select7-hidden{display:none!important}.select7-invisible{visibility:hidden}.select7-visible{visibility:visible}
@@ -20,35 +20,14 @@ module Select7::FormHelper
20
20
  [item.send(value_attr), item.send(text_attr)]
21
21
  }
22
22
 
23
- options_for_select = attributes[:options_for_select] || options.map { |item| [item.send(value_attr), item.send(text_attr)] }
24
-
25
23
  select7_tag(
26
24
  **attributes,
27
- options_for_select: options_for_select,
25
+ options: options,
28
26
  selecteds: selecteds,
29
27
  suggest: suggest,
30
28
  scope: @object_name,
31
29
  input_name: input_name,
32
30
  )
33
31
  end
34
-
35
- # TODO: REMOVE IF NO USECASE
36
- # def select7_fields_for(record_name, field = "id", option_items: [], selected_items: [], suggest: {}, **attributes)
37
- # nested_attributes = nested_attributes_association?(record_name)
38
- # association = nested_attributes ? "#{record_name}_attributes" : record_name
39
- # scope = "#{@object_name}[#{association}]"
40
- # input_name = "#{scope}[?][#{field}]"
41
-
42
- # select7_tag(
43
- # field,
44
- # option_items,
45
- # selected_items: selected_items,
46
- # suggest: suggest,
47
- # scope: scope,
48
- # input_name: input_name,
49
- # nested_attributes: nested_attributes,
50
- # **attributes
51
- # )
52
- # end
53
32
  end
54
33
  end
@@ -1,11 +1,13 @@
1
1
  module Select7::TagHelper
2
- def select7_tag(options_for_select: [], selecteds: [], suggest: {}, **attributes)
2
+ def select7_tag(options: [], selecteds: [], suggest: {}, **attributes)
3
3
  field, (value_attr, text_attr) = attributes.first
4
- options_for_select.map! {|(value, text)| [value, text, text.downcase] }
4
+ options_for_select = options.map { |item|
5
+ [item.send(value_attr), item.send(text_attr), item.send(text_attr).downcase]
6
+ }
5
7
  attributes.reverse_merge!(css: {}, multiple: true, nested_attributes: nil)
6
- attributes[:input_name] ||= "#{field}" + (attributes[:multiple] ? "[]" : "")
8
+ attributes[:input_name] ||= "#{field.to_s.singularize}_#{value_attr}"
7
9
 
8
- @template.render partial: "select7/field",
10
+ (@template || self).render partial: "select7/field",
9
11
  locals: {
10
12
  field: field,
11
13
  value_attr: value_attr,
@@ -1,7 +1,8 @@
1
+ <% _scope = local_assigns.has_key?(:scope) ? scope : '' %>
1
2
  <div class="<%= css[:field_container] || 'select7-container' %>"
2
3
  data-controller="select7"
3
4
  data-action="keyup@document->select7#handleKeyUp"
4
- data-select7-scope-value="<%= scope %>"
5
+ data-select7-scope-value="<%= _scope %>"
5
6
  data-select7-field-value="<%= field %>"
6
7
  data-select7-value-attr-value="<%= value_attr %>"
7
8
  data-select7-text-attr-value="<%= text_attr %>"
@@ -23,14 +24,14 @@
23
24
  <% selected_items.each do |id, text, _| %>
24
25
  <div class="<%= css[:selected_item] || 'select7-selected-item' %>"
25
26
  <% if nested_attributes %>
26
- data-remove-id=<%= "#{scope}[#{id}][_destroy]" %>
27
+ data-remove-id=<%= "#{_scope}[#{id}][_destroy]" %>
27
28
  data-remove-value="true"
28
29
  <% end %>
29
30
  >
30
31
 
31
32
  <% if nested_attributes %>
32
- <input type="hidden" name=<%= "#{scope}[#{item.id}][id]" %> value="<%= id %>">
33
- <input type="hidden" name=<%= "#{scope}[#{item.id}][#{field}]" %> value="<%= id %>">
33
+ <input type="hidden" name=<%= "#{_scope}[#{item.id}][id]" %> value="<%= id %>">
34
+ <input type="hidden" name=<%= "#{_scope}[#{item.id}][#{field}]" %> value="<%= id %>">
34
35
  <% else %>
35
36
  <input type="hidden" name="<%= input_name %>" value="<%= id %>">
36
37
  <% end %>
@@ -5,7 +5,7 @@ say "Import Select7 Js"
5
5
 
6
6
  if IMPORTMAP_PATH.exist?
7
7
  append_to_file IMPORTMAP_PATH, %(\npin "lodash.debounce", to: "https://cdn.jsdelivr.net/npm/lodash.debounce@4.0.8/+esm", preload: true\n)
8
- append_to_file IMPORTMAP_PATH, %(pin "select7", to: "select7.esm.js", preload: true\n)
8
+ append_to_file IMPORTMAP_PATH, %(pin "select7", to: "select7.esm.min.js", preload: true\n)
9
9
 
10
10
  copy_file "#{__dir__}/app/javascript/controllers/select7_esm_controller.js", "app/javascript/controllers/select7_controller.js"
11
11
 
@@ -14,7 +14,8 @@ elsif Rails.root.join("package.json").exist?
14
14
  run "yarn add lodash.debounce"
15
15
 
16
16
  insert_into_file APPLICATION_LAYOUT_PATH.to_s, <<~ERB.indent(4), before: /\s*<\/head/
17
- \n<%= javascript_include_tag "select7", "data-turbo-track": "reload", rel: :preload, async: true %>
17
+ \n<%= preload_link_tag "select7.min.js", as: "script" %>
18
+ <%= javascript_include_tag "select7.min.js", "data-turbo-track": "reload" %>
18
19
  ERB
19
20
 
20
21
  append_to_file Rails.root.join("app/javascript/controllers/index.js"), <<~ERB
@@ -22,9 +23,6 @@ elsif Rails.root.join("package.json").exist?
22
23
  application.register("select7", Select7Controller)
23
24
  ERB
24
25
 
25
- append_to_file Rails.root.join("app/javascript/application.js"), <<~ERB
26
- ERB
27
-
28
26
  copy_file "#{__dir__}/app/javascript/controllers/select7_controller.js", "app/javascript/controllers/select7_controller.js"
29
27
  else
30
28
  say %(Couldn't Import Select7 Js), :red
@@ -37,11 +35,9 @@ end
37
35
  # ==============
38
36
 
39
37
  say "Import Select7 Css"
40
- if (Rails.root.join("app/assets/stylesheets/application.css")).exist?
41
- append_to_file "app/assets/stylesheets/application.css", %(\n@import "select7.css"\n)
42
- elsif APPLICATION_LAYOUT_PATH.exist?
38
+ if APPLICATION_LAYOUT_PATH.exist?
43
39
  insert_into_file APPLICATION_LAYOUT_PATH.to_s, <<~ERB.indent(4), before: /^\s*<%= stylesheet_link_tag/
44
- <%= stylesheet_link_tag "select7", "select7", "data-turbo-track": "reload" %>
40
+ <%= stylesheet_link_tag "select7.min", "data-turbo-track": "reload" %>
45
41
  ERB
46
42
  else
47
43
  say %(Couldn't Import Select7 Css), :red
@@ -2,21 +2,16 @@ module Select7
2
2
  class Engine < ::Rails::Engine
3
3
  isolate_namespace Select7
4
4
 
5
- config.eager_load_namespaces << Select7
6
5
  config.autoload_once_paths = %W(
7
6
  #{root}/app/helpers
8
7
  )
9
8
 
10
9
  initializer "select7.assets" do |app|
11
10
  if app.config.respond_to?(:assets)
12
- Rails.application.config.assets.precompile += %w( select7.js select7.esm.js select7.css )
11
+ Rails.application.config.assets.precompile += %w( select7.min.js select7.esm.min.js select7.min.css )
13
12
  end
14
13
  end
15
14
 
16
- # initializer "select7.importmap", after: "importmap" do |app|
17
- # app.config.importmap.paths << Engine.root.join("config/importmap.rb")
18
- # end
19
-
20
15
  initializer "select7.helpers", before: :load_config_initializers do
21
16
  ActiveSupport.on_load(:action_controller_base) do
22
17
  helper Select7::Engine.helpers
@@ -1,3 +1,3 @@
1
1
  module Select7
2
- VERSION = "0.0.1"
2
+ VERSION = "0.0.3"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: select7
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.0.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Lam Phan
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2024-03-04 00:00:00.000000000 Z
11
+ date: 2024-03-23 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
@@ -119,8 +119,11 @@ files:
119
119
  - README.md
120
120
  - Rakefile
121
121
  - app/assets/javascripts/select7.esm.js
122
+ - app/assets/javascripts/select7.esm.min.js
122
123
  - app/assets/javascripts/select7.js
124
+ - app/assets/javascripts/select7.min.js
123
125
  - app/assets/stylesheets/select7.css
126
+ - app/assets/stylesheets/select7.min.css
124
127
  - app/helpers/select7/form_helper.rb
125
128
  - app/helpers/select7/tag_helper.rb
126
129
  - app/views/select7/_field.html.erb