activeadmin_slimselect 1.0.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 +7 -0
- data/LICENSE.txt +21 -0
- data/README.md +164 -0
- data/Rakefile +8 -0
- data/app/assets/javascripts/active_admin/activeadmin_slimselect.js +1 -0
- data/app/assets/javascripts/activeadmin/slimselect/slimselect.js +2 -0
- data/app/assets/javascripts/activeadmin/slimselect_has_many.js +9 -0
- data/app/assets/javascripts/activeadmin/slimselect_input.js +101 -0
- data/app/assets/stylesheets/active_admin/activeadmin_slimselect.css +571 -0
- data/app/assets/stylesheets/activeadmin/_slimselect_input.scss +70 -0
- data/app/assets/stylesheets/activeadmin/slimselect/slimselect.css +1 -0
- data/app/javascript/activeadmin_slimselect/index.mjs +2 -0
- data/app/javascript/activeadmin_slimselect/slimselect_has_many.mjs +12 -0
- data/app/javascript/activeadmin_slimselect/slimselect_input.mjs +101 -0
- data/lib/activeadmin/inputs/filters/slimselect_input.rb +14 -0
- data/lib/activeadmin/slimselect/engine.rb +21 -0
- data/lib/activeadmin/slimselect/version.rb +7 -0
- data/lib/activeadmin/slimselect.rb +3 -0
- data/lib/activeadmin_slimselect.rb +6 -0
- data/lib/formtastic/inputs/slimselect_input.rb +14 -0
- metadata +63 -0
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
import SlimSelect from 'slim-select'
|
|
2
|
+
|
|
3
|
+
// --- functions ------------------------------------------------------------
|
|
4
|
+
function initSlimSelectInputs() {
|
|
5
|
+
document.querySelectorAll('[data-slimselect-input]').forEach(function (el) {
|
|
6
|
+
// Skip if already initialized
|
|
7
|
+
if (el.slim) return
|
|
8
|
+
|
|
9
|
+
var remote = el.getAttribute('data-opt-remote') || ''
|
|
10
|
+
var fieldText = el.getAttribute('data-opt-text') || 'text'
|
|
11
|
+
var fieldValue = el.getAttribute('data-opt-value') || 'value'
|
|
12
|
+
|
|
13
|
+
// Build settings object
|
|
14
|
+
var settings = {
|
|
15
|
+
closeOnSelect: true,
|
|
16
|
+
allowDeselect: true,
|
|
17
|
+
placeholderText: el.getAttribute('placeholder') || 'Select...'
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
// Parse data-opts JSON if present (overrides individual data-opt-* attributes)
|
|
21
|
+
var optsJson = el.getAttribute('data-opts')
|
|
22
|
+
if (optsJson) {
|
|
23
|
+
try {
|
|
24
|
+
var customOpts = JSON.parse(optsJson)
|
|
25
|
+
Object.assign(settings, customOpts)
|
|
26
|
+
} catch (e) {
|
|
27
|
+
console.error('SlimSelect: Invalid JSON in data-opts', e)
|
|
28
|
+
}
|
|
29
|
+
} else {
|
|
30
|
+
// Parse individual data-opt-* attributes
|
|
31
|
+
Array.from(el.attributes).forEach(function (attr) {
|
|
32
|
+
if (attr.name.startsWith('data-opt-') && attr.name !== 'data-opt-remote' && attr.name !== 'data-opt-text' && attr.name !== 'data-opt-value') {
|
|
33
|
+
var name = attr.name.substring(9) // Remove 'data-opt-' prefix
|
|
34
|
+
// Convert kebab-case to camelCase
|
|
35
|
+
name = name.replace(/-([a-z])/g, function (g) { return g[1].toUpperCase() })
|
|
36
|
+
// Convert string booleans
|
|
37
|
+
var value = attr.value
|
|
38
|
+
if (value === 'true') value = true
|
|
39
|
+
else if (value === 'false') value = false
|
|
40
|
+
settings[name] = value
|
|
41
|
+
}
|
|
42
|
+
})
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
// Build config object
|
|
46
|
+
var config = {
|
|
47
|
+
select: el,
|
|
48
|
+
settings: settings
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
// Add remote search if configured
|
|
52
|
+
if (remote) {
|
|
53
|
+
config.events = {
|
|
54
|
+
search: function (search, currentData) {
|
|
55
|
+
return new Promise(function (resolve, reject) {
|
|
56
|
+
if (search.length === 0) {
|
|
57
|
+
return resolve(currentData)
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
var url = remote + '?q[' + fieldText + '_contains]=' + encodeURIComponent(search)
|
|
61
|
+
|
|
62
|
+
fetch(url)
|
|
63
|
+
.then(function (response) {
|
|
64
|
+
return response.json()
|
|
65
|
+
})
|
|
66
|
+
.then(function (data) {
|
|
67
|
+
var options = data.slice(0, 10).map(function (item) {
|
|
68
|
+
return {
|
|
69
|
+
text: item[fieldText],
|
|
70
|
+
value: String(item[fieldValue])
|
|
71
|
+
}
|
|
72
|
+
})
|
|
73
|
+
resolve(options)
|
|
74
|
+
})
|
|
75
|
+
.catch(function (error) {
|
|
76
|
+
console.error('SlimSelect fetch error:', error)
|
|
77
|
+
reject(error)
|
|
78
|
+
})
|
|
79
|
+
})
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
// Initialize SlimSelect
|
|
85
|
+
new SlimSelect(config)
|
|
86
|
+
})
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
export { initSlimSelectInputs }
|
|
90
|
+
|
|
91
|
+
// --- events ---------------------------------------------------------------
|
|
92
|
+
document.addEventListener('DOMContentLoaded', initSlimSelectInputs)
|
|
93
|
+
|
|
94
|
+
// ActiveAdmin has_many support
|
|
95
|
+
document.addEventListener('has_many_add:after', initSlimSelectInputs)
|
|
96
|
+
|
|
97
|
+
// Turbolinks support
|
|
98
|
+
document.addEventListener('turbolinks:load', initSlimSelectInputs)
|
|
99
|
+
|
|
100
|
+
// Turbo support
|
|
101
|
+
document.addEventListener('turbo:load', initSlimSelectInputs)
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module ActiveAdmin
|
|
4
|
+
module Inputs
|
|
5
|
+
module Filters
|
|
6
|
+
# SlimSelect filter input for ActiveAdmin
|
|
7
|
+
class SlimselectInput < ::ActiveAdmin::Inputs::Filters::SelectInput
|
|
8
|
+
def input_html_options
|
|
9
|
+
super.merge("data-slimselect-input": "1")
|
|
10
|
+
end
|
|
11
|
+
end
|
|
12
|
+
end
|
|
13
|
+
end
|
|
14
|
+
end
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require "active_admin"
|
|
4
|
+
|
|
5
|
+
module ActiveAdmin
|
|
6
|
+
module SlimSelect
|
|
7
|
+
# Rails engine for activeadmin_slimselect
|
|
8
|
+
class Engine < ::Rails::Engine
|
|
9
|
+
engine_name "activeadmin_slimselect"
|
|
10
|
+
|
|
11
|
+
# Register assets with ActiveAdmin for Propshaft (no Sprockets directive processing).
|
|
12
|
+
# With Sprockets, users include assets via //= require and @import directives.
|
|
13
|
+
initializer "activeadmin_slimselect.assets" do
|
|
14
|
+
unless defined?(Sprockets)
|
|
15
|
+
ActiveAdmin.application.register_javascript "active_admin/activeadmin_slimselect.js"
|
|
16
|
+
ActiveAdmin.application.register_stylesheet "active_admin/activeadmin_slimselect.css"
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
end
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Formtastic
|
|
4
|
+
module Inputs
|
|
5
|
+
# SlimSelect input for Formtastic forms
|
|
6
|
+
class SlimselectInput < Formtastic::Inputs::SelectInput
|
|
7
|
+
include Formtastic::Inputs::Base
|
|
8
|
+
|
|
9
|
+
def input_html_options
|
|
10
|
+
super.merge("data-slimselect-input": "1")
|
|
11
|
+
end
|
|
12
|
+
end
|
|
13
|
+
end
|
|
14
|
+
end
|
metadata
ADDED
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
|
2
|
+
name: activeadmin_slimselect
|
|
3
|
+
version: !ruby/object:Gem::Version
|
|
4
|
+
version: 1.0.0
|
|
5
|
+
platform: ruby
|
|
6
|
+
authors:
|
|
7
|
+
- Piers Chambers
|
|
8
|
+
bindir: bin
|
|
9
|
+
cert_chain: []
|
|
10
|
+
date: 1980-01-02 00:00:00.000000000 Z
|
|
11
|
+
dependencies: []
|
|
12
|
+
description: An Active Admin plugin to use SlimSelect.js (no jQuery required)
|
|
13
|
+
email:
|
|
14
|
+
- piers@varyonic.com
|
|
15
|
+
executables: []
|
|
16
|
+
extensions: []
|
|
17
|
+
extra_rdoc_files: []
|
|
18
|
+
files:
|
|
19
|
+
- LICENSE.txt
|
|
20
|
+
- README.md
|
|
21
|
+
- Rakefile
|
|
22
|
+
- app/assets/javascripts/active_admin/activeadmin_slimselect.js
|
|
23
|
+
- app/assets/javascripts/activeadmin/slimselect/slimselect.js
|
|
24
|
+
- app/assets/javascripts/activeadmin/slimselect_has_many.js
|
|
25
|
+
- app/assets/javascripts/activeadmin/slimselect_input.js
|
|
26
|
+
- app/assets/stylesheets/active_admin/activeadmin_slimselect.css
|
|
27
|
+
- app/assets/stylesheets/activeadmin/_slimselect_input.scss
|
|
28
|
+
- app/assets/stylesheets/activeadmin/slimselect/slimselect.css
|
|
29
|
+
- app/javascript/activeadmin_slimselect/index.mjs
|
|
30
|
+
- app/javascript/activeadmin_slimselect/slimselect_has_many.mjs
|
|
31
|
+
- app/javascript/activeadmin_slimselect/slimselect_input.mjs
|
|
32
|
+
- lib/activeadmin/inputs/filters/slimselect_input.rb
|
|
33
|
+
- lib/activeadmin/slimselect.rb
|
|
34
|
+
- lib/activeadmin/slimselect/engine.rb
|
|
35
|
+
- lib/activeadmin/slimselect/version.rb
|
|
36
|
+
- lib/activeadmin_slimselect.rb
|
|
37
|
+
- lib/formtastic/inputs/slimselect_input.rb
|
|
38
|
+
homepage: https://github.com/varyonic/activeadmin_slimselect
|
|
39
|
+
licenses:
|
|
40
|
+
- MIT
|
|
41
|
+
metadata:
|
|
42
|
+
homepage_uri: https://github.com/varyonic/activeadmin_slimselect
|
|
43
|
+
source_code_uri: https://github.com/varyonic/activeadmin_slimselect
|
|
44
|
+
changelog_uri: https://github.com/varyonic/activeadmin_slimselect/blob/main/CHANGELOG.md
|
|
45
|
+
rubygems_mfa_required: 'true'
|
|
46
|
+
rdoc_options: []
|
|
47
|
+
require_paths:
|
|
48
|
+
- lib
|
|
49
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
|
50
|
+
requirements:
|
|
51
|
+
- - ">="
|
|
52
|
+
- !ruby/object:Gem::Version
|
|
53
|
+
version: 3.2.0
|
|
54
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
55
|
+
requirements:
|
|
56
|
+
- - ">="
|
|
57
|
+
- !ruby/object:Gem::Version
|
|
58
|
+
version: '0'
|
|
59
|
+
requirements: []
|
|
60
|
+
rubygems_version: 3.6.7
|
|
61
|
+
specification_version: 4
|
|
62
|
+
summary: SlimSelect for ActiveAdmin
|
|
63
|
+
test_files: []
|