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.
@@ -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,7 @@
1
+ # frozen_string_literal: true
2
+
3
+ module ActiveAdmin
4
+ module SlimSelect
5
+ VERSION = "1.0.0"
6
+ end
7
+ end
@@ -0,0 +1,3 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "activeadmin/slimselect/engine"
@@ -0,0 +1,6 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "activeadmin/slimselect"
4
+
5
+ require "formtastic/inputs/slimselect_input"
6
+ require "activeadmin/inputs/filters/slimselect_input"
@@ -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: []