activeadmin-tom_select 4.1.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.
Files changed (196) hide show
  1. checksums.yaml +7 -0
  2. data/.actrc +20 -0
  3. data/.claude/commands/fix-tests.md +203 -0
  4. data/.github/workflows/ci.yml +174 -0
  5. data/.github/workflows/npm-publish.yml +50 -0
  6. data/.gitignore +35 -0
  7. data/.npmignore +58 -0
  8. data/.rspec +1 -0
  9. data/.rubocop.yml +75 -0
  10. data/.yardopts +2 -0
  11. data/AGENTS.md +39 -0
  12. data/Appraisals +9 -0
  13. data/CHANGELOG.md +64 -0
  14. data/CLAUDE.md +157 -0
  15. data/Gemfile +12 -0
  16. data/Gemfile.lock +368 -0
  17. data/LICENSE.txt +25 -0
  18. data/README.md +483 -0
  19. data/Rakefile +4 -0
  20. data/activeadmin-tom_select.gemspec +43 -0
  21. data/bin/rspec +17 -0
  22. data/config/database.yml +16 -0
  23. data/docs/activeadmin-4-detailed-reference.md +932 -0
  24. data/docs/activeadmin-4-gem-migration-guide.md +313 -0
  25. data/docs/combustion.md +213 -0
  26. data/docs/fail.png +0 -0
  27. data/docs/guide-update-your-app.md +283 -0
  28. data/docs/normal.png +0 -0
  29. data/docs/propshaft-readme.md +320 -0
  30. data/docs/propshaft-upgrade.md +484 -0
  31. data/docs/setup-activeadmin-app.md +552 -0
  32. data/docs/setup-activeadmin-gem.md +535 -0
  33. data/docs/tailwind/blog-page.md +341 -0
  34. data/docs/tailwind/upgrade-guide-enhanced.md +438 -0
  35. data/docs/tailwind/upgrade-guide.md +416 -0
  36. data/docs/tailwind-4/active_admin.rake +38 -0
  37. data/docs/tailwind-4/active_admin.tailwind.css +415 -0
  38. data/docs/tailwind-4/tailwind-active_admin.config.js +18 -0
  39. data/docs/test-app-change.md +154 -0
  40. data/docs/test-environment-fixes.md +58 -0
  41. data/docs/update-tom-select.md +184 -0
  42. data/docs/upload-system.md +225 -0
  43. data/gemfiles/rails_7.x_active_admin_4.x.gemfile +10 -0
  44. data/gemfiles/rails_7.x_active_admin_4.x.gemfile.lock +377 -0
  45. data/gemfiles/rails_8.x_active_admin_4.x.gemfile +10 -0
  46. data/gemfiles/rails_8.x_active_admin_4.x.gemfile.lock +372 -0
  47. data/lefthook.yml +17 -0
  48. data/lib/activeadmin/inputs/filters/searchable_select_input.rb +19 -0
  49. data/lib/activeadmin/inputs/searchable_select_input.rb +16 -0
  50. data/lib/activeadmin/tom_select/engine.rb +17 -0
  51. data/lib/activeadmin/tom_select/option_collection.rb +128 -0
  52. data/lib/activeadmin/tom_select/resource_dsl_extension.rb +56 -0
  53. data/lib/activeadmin/tom_select/resource_extension.rb +10 -0
  54. data/lib/activeadmin/tom_select/select_input_extension.rb +168 -0
  55. data/lib/activeadmin/tom_select/version.rb +5 -0
  56. data/lib/activeadmin/tom_select.rb +20 -0
  57. data/lib/activeadmin-tom_select.rb +5 -0
  58. data/lib/generators/active_admin/tom_select/install/install_generator.rb +180 -0
  59. data/npm-package/package-lock.json +51 -0
  60. data/npm-package/package.json +43 -0
  61. data/npm-package/src/index.js +153 -0
  62. data/npm-package/src/tom-select-tailwind.css +392 -0
  63. data/sonar-project.properties +25 -0
  64. data/spec/features/ajax_params_spec.rb +31 -0
  65. data/spec/features/asset_pipeline_diagnostic_spec.rb +155 -0
  66. data/spec/features/end_to_end_spec.rb +273 -0
  67. data/spec/features/filter_input_spec.rb +144 -0
  68. data/spec/features/form_input_spec.rb +122 -0
  69. data/spec/features/inline_ajax_setting_spec.rb +26 -0
  70. data/spec/features/input_errors_spec.rb +76 -0
  71. data/spec/features/input_html_options_spec.rb +30 -0
  72. data/spec/features/options_dsl_spec.rb +230 -0
  73. data/spec/features/production_build_spec.rb +108 -0
  74. data/spec/internal/.node-version +1 -0
  75. data/spec/internal/Gemfile +43 -0
  76. data/spec/internal/Gemfile.lock +333 -0
  77. data/spec/internal/Procfile.dev +3 -0
  78. data/spec/internal/README.md +24 -0
  79. data/spec/internal/Rakefile +6 -0
  80. data/spec/internal/app/admin/categories.rb +26 -0
  81. data/spec/internal/app/admin/dashboard.rb +29 -0
  82. data/spec/internal/app/admin/option_types.rb +19 -0
  83. data/spec/internal/app/admin/option_values.rb +30 -0
  84. data/spec/internal/app/admin/posts.rb +27 -0
  85. data/spec/internal/app/admin/products.rb +22 -0
  86. data/spec/internal/app/admin/rgb_colors.rb +25 -0
  87. data/spec/internal/app/admin/tag_names.rb +21 -0
  88. data/spec/internal/app/admin/test_ajax_params_category.rb +10 -0
  89. data/spec/internal/app/admin/test_ajax_params_post.rb +20 -0
  90. data/spec/internal/app/admin/test_form_post_class.rb +7 -0
  91. data/spec/internal/app/admin/test_form_post_custom.rb +11 -0
  92. data/spec/internal/app/admin/test_form_post_resource.rb +11 -0
  93. data/spec/internal/app/admin/test_form_post_resource_custom.rb +12 -0
  94. data/spec/internal/app/admin/test_inline_ajax_post.rb +9 -0
  95. data/spec/internal/app/admin/test_input_html_post.rb +11 -0
  96. data/spec/internal/app/admin/test_posts_display_text.rb +9 -0
  97. data/spec/internal/app/admin/test_posts_filter.rb +9 -0
  98. data/spec/internal/app/admin/test_posts_named.rb +9 -0
  99. data/spec/internal/app/admin/test_posts_pagination.rb +9 -0
  100. data/spec/internal/app/admin/test_posts_payload_lambda.rb +11 -0
  101. data/spec/internal/app/admin/test_posts_payload_proc.rb +9 -0
  102. data/spec/internal/app/admin/test_posts_scope_lambda.rb +8 -0
  103. data/spec/internal/app/admin/test_posts_scope_params.rb +8 -0
  104. data/spec/internal/app/admin/test_posts_scope_user.rb +8 -0
  105. data/spec/internal/app/admin/test_posts_text_attr.rb +5 -0
  106. data/spec/internal/app/admin/users.rb +23 -0
  107. data/spec/internal/app/admin/variants.rb +31 -0
  108. data/spec/internal/app/assets/config/manifest.js +2 -0
  109. data/spec/internal/app/assets/images/.keep +0 -0
  110. data/spec/internal/app/assets/stylesheets/active_admin.tailwind.css +16 -0
  111. data/spec/internal/app/assets/stylesheets/application.tailwind.css +15 -0
  112. data/spec/internal/app/controllers/application_controller.rb +9 -0
  113. data/spec/internal/app/controllers/concerns/.keep +0 -0
  114. data/spec/internal/app/helpers/application_helper.rb +2 -0
  115. data/spec/internal/app/javascript/active_admin.js +19 -0
  116. data/spec/internal/app/javascript/application.js +2 -0
  117. data/spec/internal/app/jobs/application_job.rb +7 -0
  118. data/spec/internal/app/mailers/application_mailer.rb +4 -0
  119. data/spec/internal/app/models/admin_user.rb +9 -0
  120. data/spec/internal/app/models/application_record.rb +3 -0
  121. data/spec/internal/app/models/article.rb +12 -0
  122. data/spec/internal/app/models/category.rb +12 -0
  123. data/spec/internal/app/models/color.rb +9 -0
  124. data/spec/internal/app/models/concerns/.keep +0 -0
  125. data/spec/internal/app/models/internal/tag_name.rb +14 -0
  126. data/spec/internal/app/models/internal_tag_name.rb +11 -0
  127. data/spec/internal/app/models/option_type.rb +12 -0
  128. data/spec/internal/app/models/option_value.rb +4 -0
  129. data/spec/internal/app/models/post.rb +15 -0
  130. data/spec/internal/app/models/product.rb +12 -0
  131. data/spec/internal/app/models/rgb_color.rb +16 -0
  132. data/spec/internal/app/models/tag.rb +12 -0
  133. data/spec/internal/app/models/tagging.rb +12 -0
  134. data/spec/internal/app/models/user.rb +12 -0
  135. data/spec/internal/app/models/variant.rb +12 -0
  136. data/spec/internal/app/views/layouts/application.html.erb +28 -0
  137. data/spec/internal/app/views/layouts/mailer.html.erb +13 -0
  138. data/spec/internal/app/views/layouts/mailer.text.erb +1 -0
  139. data/spec/internal/app/views/pwa/manifest.json.erb +22 -0
  140. data/spec/internal/app/views/pwa/service-worker.js +26 -0
  141. data/spec/internal/bin/bundle +117 -0
  142. data/spec/internal/bin/dev +11 -0
  143. data/spec/internal/bin/rackup +27 -0
  144. data/spec/internal/bin/rails +4 -0
  145. data/spec/internal/bin/rake +4 -0
  146. data/spec/internal/bin/setup +37 -0
  147. data/spec/internal/config/application.rb +50 -0
  148. data/spec/internal/config/boot.rb +3 -0
  149. data/spec/internal/config/credentials.yml.enc +1 -0
  150. data/spec/internal/config/database.yml +32 -0
  151. data/spec/internal/config/environment.rb +5 -0
  152. data/spec/internal/config/environments/development.rb +63 -0
  153. data/spec/internal/config/environments/production.rb +86 -0
  154. data/spec/internal/config/environments/test.rb +50 -0
  155. data/spec/internal/config/initializers/active_admin.rb +54 -0
  156. data/spec/internal/config/initializers/assets.rb +8 -0
  157. data/spec/internal/config/initializers/content_security_policy.rb +25 -0
  158. data/spec/internal/config/initializers/devise.rb +315 -0
  159. data/spec/internal/config/initializers/filter_parameter_logging.rb +8 -0
  160. data/spec/internal/config/initializers/inflections.rb +16 -0
  161. data/spec/internal/config/initializers/searchable_select.rb +6 -0
  162. data/spec/internal/config/locales/devise.en.yml +65 -0
  163. data/spec/internal/config/locales/en.yml +31 -0
  164. data/spec/internal/config/master.key +1 -0
  165. data/spec/internal/config/puma.rb +38 -0
  166. data/spec/internal/config/routes.rb +17 -0
  167. data/spec/internal/config.ru +6 -0
  168. data/spec/internal/db/schema.rb +174 -0
  169. data/spec/internal/db/seeds.rb +167 -0
  170. data/spec/internal/esbuild.config.js +34 -0
  171. data/spec/internal/lib/tasks/.keep +0 -0
  172. data/spec/internal/lib/tasks/active_admin.rake +55 -0
  173. data/spec/internal/log/.keep +0 -0
  174. data/spec/internal/package-lock.json +1954 -0
  175. data/spec/internal/package.json +21 -0
  176. data/spec/internal/public/400.html +114 -0
  177. data/spec/internal/public/404.html +114 -0
  178. data/spec/internal/public/406-unsupported-browser.html +114 -0
  179. data/spec/internal/public/422.html +114 -0
  180. data/spec/internal/public/500.html +114 -0
  181. data/spec/internal/public/icon.png +0 -0
  182. data/spec/internal/public/icon.svg +3 -0
  183. data/spec/internal/public/robots.txt +1 -0
  184. data/spec/internal/script/.keep +0 -0
  185. data/spec/internal/storage/.keep +0 -0
  186. data/spec/internal/tailwind.config.js +23 -0
  187. data/spec/internal/vendor/.keep +0 -0
  188. data/spec/internal/yarn.lock +824 -0
  189. data/spec/rails_helper.rb +62 -0
  190. data/spec/spec_helper.rb +138 -0
  191. data/spec/support/active_admin_helpers.rb +17 -0
  192. data/spec/support/capybara.rb +8 -0
  193. data/spec/support/models.rb +11 -0
  194. data/spec/support/pluck_polyfill.rb +12 -0
  195. data/spec/support/reset_settings.rb +5 -0
  196. metadata +497 -0
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 101301522f68deaa4722807193d35b2e8e1e91b9f30e3ca555a1d08ca86681ba
4
+ data.tar.gz: 8ab0654e5ea3c8fdd6f180126b84b7e7477252cee7be34f5d10b49e2ed8aad5a
5
+ SHA512:
6
+ metadata.gz: 4abe389636853e25410b3dfbdc56c38c536f5c97d92a141d374ca1e1e0e2426bf93fdd4c3764929b6a306ae9f8f87e02a7ae79b7c0cde83b11a748bf9bc06ff2
7
+ data.tar.gz: ef5c07fcfbb26a0921fd24070be3bec85d92f05d3752de56bfb64a2f3df7f7da76832bb4f16e9475350189b5b5ff9b4ea1a7c79e386c6f70b3b652300d22e2b7
data/.actrc ADDED
@@ -0,0 +1,20 @@
1
+ # Act configuration for local GitHub Actions testing
2
+ # This file configures act to work efficiently with caching
3
+
4
+ # Use medium-sized runner image for better compatibility
5
+ --platform ubuntu-latest=catthehacker/ubuntu:act-latest
6
+
7
+ # Enable reuse of containers for faster subsequent runs
8
+ --reuse
9
+
10
+ # Use local .env file if it exists (for secrets during local testing)
11
+ --env-file .env.local
12
+
13
+ # Pull docker images if newer version exists
14
+ --pull=false
15
+
16
+ # Bind working directory for better performance with local files
17
+ --bind
18
+
19
+ # Use host network for faster downloads and to avoid network issues
20
+ --network host
@@ -0,0 +1,203 @@
1
+ # Fix Tests - ActiveAdmin Searchable Select
2
+
3
+ ## Overview
4
+ This guide provides instructions for debugging and fixing failing tests in the ActiveAdmin Searchable Select gem, particularly issues related to Select2 initialization and DOM element selection.
5
+
6
+ ## Common Test Failures
7
+
8
+ ### 1. Select2 Container Not Found
9
+ **Error:** `Unable to find css ".select2-container"`
10
+
11
+ **Root Causes:**
12
+ - JavaScript dependencies (jQuery, Select2) not loaded in test environment
13
+ - ActiveAdmin 4 expects `importmap-rails` but test environment uses no-op shims
14
+
15
+ **Solution:**
16
+ Check `/spec/internal/config/initializers/active_admin.rb` and ensure JavaScript dependencies are properly loaded:
17
+
18
+ ```ruby
19
+ # Replace no-op javascript_importmap_tags with working implementation
20
+ config.register_javascript do
21
+ raw <<~HTML
22
+ <link href="https://cdn.jsdelivr.net/npm/select2@4.1.0-rc.0/dist/css/select2.min.css" rel="stylesheet" />
23
+ <script src="https://code.jquery.com/jquery-3.7.1.min.js"></script>
24
+ <script src="https://cdn.jsdelivr.net/npm/select2@4.1.0-rc.0/dist/js/select2.min.js"></script>
25
+ <script type="text/javascript">
26
+ #{File.read(Rails.root.join('../../app/assets/javascripts/active_admin/searchable_select/init.js'))}
27
+ </script>
28
+ HTML
29
+ end
30
+ ```
31
+
32
+ ### 2. Filter Form Selector Changes
33
+ **Error:** `Unable to find css ".filter_form"`
34
+
35
+ **Root Cause:** ActiveAdmin 4 changed the filter form class from `.filter_form` to `.filters-form` (with an 's')
36
+
37
+ **Solution:** Update selectors in tests:
38
+ ```ruby
39
+ # Old (incorrect)
40
+ within '.filter_form' do
41
+ find('.select2-container').click
42
+ end
43
+
44
+ # New (correct)
45
+ within '.filters-form' do
46
+ find('.select2-container').click
47
+ end
48
+ ```
49
+
50
+ ## Debugging Workflow
51
+
52
+ ### Step 1: Add HTML Debug Output
53
+ When a test fails due to missing elements, add debug output to see the actual page structure:
54
+
55
+ ```ruby
56
+ it 'your test' do
57
+ visit '/admin/posts'
58
+
59
+ # Debug: output page HTML
60
+ puts "\n=== DEBUG: Page HTML ==="
61
+ puts page.html
62
+ puts "=== END DEBUG ===\n"
63
+
64
+ # Debug: check for specific elements
65
+ puts "Select2 containers found: #{page.all('.select2-container').count}"
66
+ puts "Searchable select inputs: #{page.all('.searchable-select-input').count}"
67
+
68
+ # Your test code here
69
+ end
70
+ ```
71
+
72
+ ### Step 2: Check JavaScript Loading
73
+ Add JavaScript debugging to verify dependencies are loaded:
74
+
75
+ ```ruby
76
+ it 'checks JavaScript dependencies' do
77
+ visit '/admin/posts'
78
+
79
+ # Check if jQuery is loaded
80
+ jquery_loaded = page.evaluate_script('typeof jQuery !== "undefined"')
81
+ puts "jQuery loaded: #{jquery_loaded}"
82
+
83
+ # Check jQuery version
84
+ if jquery_loaded
85
+ jquery_version = page.evaluate_script('jQuery.fn.jquery')
86
+ puts "jQuery version: #{jquery_version}"
87
+ end
88
+
89
+ # Check if Select2 is loaded
90
+ select2_loaded = page.evaluate_script('typeof jQuery !== "undefined" && jQuery.fn.select2 !== undefined')
91
+ puts "Select2 loaded: #{select2_loaded}"
92
+ end
93
+ ```
94
+
95
+ ### Step 3: Capture Console Errors
96
+ For JavaScript-capable drivers, capture console errors:
97
+
98
+ ```ruby
99
+ # Add to test setup
100
+ page.driver.browser.manage.logs.get(:browser).each do |log|
101
+ puts "Console #{log.level}: #{log.message}"
102
+ end
103
+ ```
104
+
105
+ ### Step 4: Wait for Dynamic Elements
106
+ Ensure elements have time to initialize:
107
+
108
+ ```ruby
109
+ # Use Capybara's wait functionality
110
+ expect(page).to have_css('.select2-container', wait: 5)
111
+
112
+ # Or wait for specific conditions
113
+ Capybara.using_wait_time(5) do
114
+ find('.select2-container').click
115
+ end
116
+ ```
117
+
118
+ ## Project-Specific Considerations
119
+
120
+ ### 1. Test Environment Setup
121
+ The test suite uses Combustion to create a minimal Rails app in `spec/internal/`. Key files:
122
+ - `spec/internal/config/initializers/active_admin.rb` - ActiveAdmin configuration
123
+ - `spec/internal/app/admin/` - Test admin resources
124
+ - `spec/internal/app/models/` - Test models
125
+
126
+ ### 2. ActiveAdmin Version Compatibility
127
+ This gem supports multiple ActiveAdmin versions through Appraisal. Test against specific versions:
128
+ ```bash
129
+ # Install appraisals
130
+ appraisal install
131
+
132
+ # Run tests against specific version
133
+ appraisal activeadmin-4 rspec
134
+ ```
135
+
136
+ ### 3. JavaScript Asset Loading
137
+ The gem's JavaScript is in `app/assets/javascripts/active_admin/searchable_select/`. In tests, ensure these files are loaded either:
138
+ - Via CDN (for simplicity in tests)
139
+ - Via Rails asset pipeline (for integration testing)
140
+ - Inline in the test initializer (current approach)
141
+
142
+ ### 4. Inline AJAX Options Mode
143
+ For testing without real AJAX calls, enable inline mode:
144
+ ```ruby
145
+ ActiveAdmin::SearchableSelect.inline_ajax_options = true
146
+ ```
147
+ This renders all options statically in the HTML.
148
+
149
+ ## Running Tests
150
+
151
+ ```bash
152
+ # Run all tests
153
+ bundle exec rspec
154
+
155
+ # Run specific test file
156
+ bundle exec rspec spec/features/end_to_end_spec.rb
157
+
158
+ # Run specific test by line number
159
+ bundle exec rspec spec/features/production_build_spec.rb:56
160
+
161
+ # Run with documentation format for clarity
162
+ bundle exec rspec --format documentation
163
+
164
+ # Run tests matching a pattern
165
+ bundle exec rspec -e "searchable select"
166
+ ```
167
+
168
+ ## Common Fixes Checklist
169
+
170
+ 1. ✅ Verify jQuery is loaded (version 3.x recommended)
171
+ 2. ✅ Verify Select2 is loaded (version 4.1.0-rc.0)
172
+ 3. ✅ Check CSS selectors match current ActiveAdmin version
173
+ 4. ✅ Ensure test database has seed data if needed
174
+ 5. ✅ Check for JavaScript console errors
175
+ 6. ✅ Verify AJAX endpoints are defined (`searchable_select_options` in resource)
176
+ 7. ✅ Wait for dynamic elements to initialize
177
+ 8. ✅ Use correct Capybara driver for JavaScript tests (`:selenium_chrome_headless`)
178
+
179
+ ## Troubleshooting Tips
180
+
181
+ 1. **"Warning: method `all_options` already defined"** - Normal warning, can be ignored
182
+ 2. **Flaky tests** - Add explicit waits or use `have_css` with wait parameter
183
+ 3. **Different behavior in CI** - Check for timing issues, add debug output
184
+ 4. **Select2 not initializing** - Verify document ready events are firing correctly
185
+
186
+ ## Quick Debug Template
187
+
188
+ Add this to any failing test for comprehensive debugging:
189
+
190
+ ```ruby
191
+ # Debug template
192
+ puts "\n=== DEBUG START ==="
193
+ puts "Current URL: #{current_url}"
194
+ puts "Page title: #{page.title}"
195
+ puts "Select2 containers: #{page.all('.select2-container').count}"
196
+ puts "Searchable inputs: #{page.all('.searchable-select-input').count}"
197
+ puts "jQuery loaded: #{page.evaluate_script('typeof jQuery !== "undefined"')}"
198
+ puts "Select2 loaded: #{page.evaluate_script('typeof jQuery !== "undefined" && jQuery.fn.select2 !== undefined')}"
199
+ save_screenshot('debug_screenshot.png') if respond_to?(:save_screenshot)
200
+ puts "=== DEBUG END ===\n"
201
+ ```
202
+
203
+ This guide should help quickly diagnose and fix test failures related to the searchable select functionality.
@@ -0,0 +1,174 @@
1
+ name: CI
2
+
3
+ on:
4
+ push:
5
+ branches: [master, main]
6
+ pull_request:
7
+ branches: [master, main]
8
+
9
+ jobs:
10
+ test:
11
+ runs-on: ubuntu-latest
12
+ timeout-minutes: 15
13
+
14
+ strategy:
15
+ fail-fast: false
16
+ matrix:
17
+ ruby: ['3.3', '3.4']
18
+ gemfile:
19
+ - rails_7.x_active_admin_4.x
20
+ - rails_8.x_active_admin_4.x
21
+
22
+ env:
23
+ BUNDLE_GEMFILE: ${{ github.workspace }}/gemfiles/${{ matrix.gemfile }}.gemfile
24
+ RAILS_ENV: test
25
+ PLAYWRIGHT_BROWSERS_PATH: ${{ github.workspace }}/ms-playwright
26
+
27
+ steps:
28
+ - uses: actions/checkout@v5
29
+
30
+ - name: Set up Ruby
31
+ uses: ruby/setup-ruby@v1
32
+ with:
33
+ ruby-version: ${{ matrix.ruby }}
34
+ bundler-cache: true
35
+
36
+ # Cache APT packages for Playwright dependencies
37
+ - name: Cache APT packages
38
+ uses: awalsh128/cache-apt-pkgs-action@v1.5.3
39
+ with:
40
+ packages: libnss3 libnspr4 libatk1.0-0 libatk-bridge2.0-0 libcups2 libdrm2 libdbus-1-3 libatspi2.0-0 libx11-6 libxcomposite1 libxdamage1 libxext6 libxfixes3 libxrandr2 libgbm1 libxcb1 libxkbcommon0 libpango-1.0-0 libcairo2 libasound2
41
+ version: 1.0
42
+ execute_install_scripts: true
43
+
44
+ # Get Playwright version for cache key
45
+ - name: Get Playwright version
46
+ id: playwright-version
47
+ run: |
48
+ PLAYWRIGHT_VERSION=$(npm ls @playwright/test 2>/dev/null | grep @playwright/test | sed 's/.*@//' | head -1)
49
+ if [ -z "$PLAYWRIGHT_VERSION" ]; then
50
+ PLAYWRIGHT_VERSION=$(npx playwright --version | sed 's/Version //')
51
+ fi
52
+ echo "version=$PLAYWRIGHT_VERSION" >> $GITHUB_OUTPUT
53
+
54
+ # Cache Playwright browsers
55
+ - name: Cache Playwright browsers
56
+ id: playwright-cache
57
+ uses: actions/cache@v4
58
+ with:
59
+ path: ${{ github.workspace }}/ms-playwright
60
+ key: ${{ runner.os }}-playwright-${{ steps.playwright-version.outputs.version }}-${{ hashFiles('**/package-lock.json', '**/yarn.lock', '**/pnpm-lock.yaml') }}
61
+ restore-keys: |
62
+ ${{ runner.os }}-playwright-${{ steps.playwright-version.outputs.version }}-
63
+ ${{ runner.os }}-playwright-
64
+
65
+ - name: Install npm dependencies
66
+ run: |
67
+ cd npm-package
68
+ npm install
69
+
70
+ - name: Build and install npm package
71
+ run: |
72
+ # Build the npm package
73
+ cd npm-package
74
+ npm pack
75
+
76
+ # Extract it to a temporary location
77
+ mkdir -p /tmp/npm-package
78
+ tar -xzf *.tgz -C /tmp/npm-package
79
+
80
+ # Update spec/internal to use the extracted package
81
+ cd ../spec/internal
82
+ # Remove any existing symlink/folder
83
+ rm -rf package
84
+ rm -rf node_modules/@rocket-sensei/activeadmin-tom_select
85
+ npm install
86
+
87
+ # Install from the extracted package
88
+ npm install /tmp/npm-package/package
89
+
90
+ # Build assets (JS and CSS)
91
+ echo "Building JavaScript assets..."
92
+ npm run build:js
93
+
94
+ echo "Building CSS assets with Tailwind..."
95
+ bundle exec rake active_admin:build
96
+
97
+ # Verify assets were built
98
+ echo "Checking built assets..."
99
+ ls -la app/assets/builds/
100
+
101
+ - name: Install Playwright browsers
102
+ if: steps.playwright-cache.outputs.cache-hit != 'true'
103
+ run: |
104
+ cd npm-package
105
+ npx playwright install chromium
106
+
107
+ - name: Setup test database
108
+ run: |
109
+ # The database tasks may not be available, skip for now
110
+ echo "Database setup will be handled by test suite"
111
+
112
+ - name: Run tests with coverage
113
+ run: |
114
+ bundle exec rspec --format progress --format RspecJunitFormatter --out rspec-results.xml
115
+ continue-on-error: true
116
+
117
+ - name: Upload coverage to Codecov
118
+ if: matrix.ruby == '3.4' && matrix.gemfile == 'rails_7.x_active_admin_4.x'
119
+ uses: codecov/codecov-action@v5
120
+ with:
121
+ file: ./coverage/coverage.json
122
+ fail_ci_if_error: false
123
+ token: ${{ secrets.CODECOV_TOKEN }}
124
+
125
+ - name: SonarQube Scan
126
+ if: matrix.ruby == '3.4' && matrix.gemfile == 'rails_7.x_active_admin_4.x' && github.event_name != 'pull_request'
127
+ uses: sonarsource/sonarqube-scan-action@v3
128
+ env:
129
+ SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }}
130
+ SONAR_HOST_URL: ${{ secrets.SONAR_HOST_URL || 'https://sonarcloud.io' }}
131
+ with:
132
+ args: >
133
+ -Dsonar.projectKey=rs-pro_activeadmin-tom_select
134
+ -Dsonar.ruby.coverage.reportPaths=coverage/coverage.json
135
+ -Dsonar.ruby.rspec.reportPaths=rspec-results.xml
136
+ continue-on-error: true
137
+
138
+ lint:
139
+ runs-on: ubuntu-latest
140
+
141
+ steps:
142
+ - uses: actions/checkout@v5
143
+
144
+ - name: Set up Ruby
145
+ uses: ruby/setup-ruby@v1
146
+ with:
147
+ ruby-version: '3.4'
148
+ bundler-cache: true
149
+
150
+ - name: Run RuboCop
151
+ run: bundle exec rubocop --force-exclusion
152
+
153
+ build-npm:
154
+ runs-on: ubuntu-latest
155
+
156
+ steps:
157
+ - uses: actions/checkout@v5
158
+
159
+ - name: Setup Node.js
160
+ uses: actions/setup-node@v4
161
+ with:
162
+ node-version: '22'
163
+ cache: 'npm'
164
+ cache-dependency-path: npm-package/package-lock.json
165
+
166
+ - name: Install dependencies
167
+ run: |
168
+ cd npm-package
169
+ npm ci
170
+
171
+ - name: Check package
172
+ run: |
173
+ cd npm-package
174
+ npm pack --dry-run
@@ -0,0 +1,50 @@
1
+ name: Publish to NPM
2
+
3
+ on:
4
+ release:
5
+ types: [published]
6
+
7
+ jobs:
8
+ publish-npm:
9
+ runs-on: ubuntu-latest
10
+ permissions:
11
+ contents: read
12
+ id-token: write
13
+
14
+ steps:
15
+ - uses: actions/checkout@v5
16
+
17
+ - name: Setup Node.js
18
+ uses: actions/setup-node@v4
19
+ with:
20
+ node-version: '22'
21
+ registry-url: 'https://registry.npmjs.org'
22
+
23
+ - name: Verify package files
24
+ run: |
25
+ cd npm-package
26
+ echo "Package files to be published:"
27
+ npm pack --dry-run
28
+ echo ""
29
+ echo "Package name: $(npm pkg get name | tr -d '"')"
30
+ echo "Package version: $(npm pkg get version | tr -d '"')"
31
+
32
+ - name: Publish to NPM
33
+ run: |
34
+ cd npm-package
35
+ npm publish --access public
36
+ env:
37
+ NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
38
+
39
+ - name: Add publish summary
40
+ run: |
41
+ echo "### NPM Package Published! 🎉" >> $GITHUB_STEP_SUMMARY
42
+ echo "" >> $GITHUB_STEP_SUMMARY
43
+ echo "Package: \`@rocket-sensei/activeadmin-tom_select@$(cd npm-package && npm pkg get version | tr -d '"')\`" >> $GITHUB_STEP_SUMMARY
44
+ echo "" >> $GITHUB_STEP_SUMMARY
45
+ echo "Install with:" >> $GITHUB_STEP_SUMMARY
46
+ echo "\`\`\`bash" >> $GITHUB_STEP_SUMMARY
47
+ echo "npm install @rocket-sensei/activeadmin-tom_select" >> $GITHUB_STEP_SUMMARY
48
+ echo "\`\`\`" >> $GITHUB_STEP_SUMMARY
49
+ echo "" >> $GITHUB_STEP_SUMMARY
50
+ echo "View on NPM: https://www.npmjs.com/package/@rocket-sensei/activeadmin-tom_select" >> $GITHUB_STEP_SUMMARY
data/.gitignore ADDED
@@ -0,0 +1,35 @@
1
+ *.gem
2
+ .bundle
3
+ .ruby-version
4
+ .ruby-gemset
5
+ /pkg/*
6
+ /spec/internal/tmp
7
+ /spec/internal/db/*.sqlite
8
+ /spec/internal/db/*.sqlite-shm
9
+ /spec/internal/db/*.sqlite-wal
10
+ /spec/examples.txt
11
+ /node_modules
12
+ /npm-package/node_modules
13
+ /vendor/bundle
14
+ .cache
15
+ /.cache
16
+
17
+ # Generated/built files only
18
+ /spec/internal/node_modules/
19
+ /spec/internal/app/assets/builds/
20
+ /spec/internal/public/select2/
21
+ /spec/internal/public/assets/
22
+ /spec/internal/public/assets-test/
23
+ /spec/internal/storage/*
24
+ /spec/internal/log/*
25
+ /public/assets/
26
+ /public/assets-test/
27
+
28
+ # Debug and temporary files
29
+ /debug_*.rb
30
+ /spec/debug_*.rb
31
+ /*.tgz
32
+
33
+ # Code coverage reports
34
+ /coverage/
35
+ *.lcov
data/.npmignore ADDED
@@ -0,0 +1,58 @@
1
+ # Ruby/Rails files
2
+ *.gemspec
3
+ Gemfile
4
+ Gemfile.lock
5
+ Rakefile
6
+ Appraisals
7
+ .rubocop.yml
8
+ .rubocop.todo.yml
9
+ .ruby-version
10
+ .ruby-gemset
11
+ .rspec
12
+
13
+ # Ruby source code (not needed for npm package)
14
+ /lib/
15
+ /app/assets/stylesheets/
16
+
17
+ # Test files
18
+ /spec/
19
+ /test/
20
+ /gemfiles/
21
+
22
+ # Documentation
23
+ *.md
24
+ LICENSE
25
+ CHANGELOG*
26
+
27
+ # Development files
28
+ .gitignore
29
+ .actrc
30
+
31
+ # CI/CD
32
+ .github/
33
+ .travis.yml
34
+
35
+ # Build artifacts
36
+ /pkg/
37
+ /tmp/
38
+ /log/
39
+ *.gem
40
+
41
+ # Bundler
42
+ /.bundle/
43
+ /vendor/bundle/
44
+ /vendor/cache/
45
+
46
+ # Node modules (shouldn't be in package)
47
+ /node_modules/
48
+
49
+ # Editor files
50
+ .idea/
51
+ .vscode/
52
+ *.swp
53
+ *.swo
54
+ *~
55
+ .DS_Store
56
+
57
+ # Keep only the built JavaScript and CSS files
58
+ !src/
data/.rspec ADDED
@@ -0,0 +1 @@
1
+ --require spec_helper
data/.rubocop.yml ADDED
@@ -0,0 +1,75 @@
1
+ inherit_mode:
2
+ merge:
3
+ - Exclude
4
+
5
+ AllCops:
6
+ TargetRubyVersion: 3.0
7
+ NewCops: enable
8
+ SuggestExtensions: false
9
+ Exclude:
10
+ - 'bin/**/*'
11
+ - 'vendor/**/*'
12
+ - 'gemfiles/vendor/**/*'
13
+ - '**/vendor/**/*'
14
+ - 'spec/internal/bin/**/*'
15
+ - 'spec/internal/Gemfile'
16
+ - 'gemfiles/**/*.gemfile'
17
+ - 'gemfiles/**/*.gemfile.lock'
18
+
19
+ # The default of 80 characters is a little to narrow.
20
+ Layout/LineLength:
21
+ Max: 100
22
+
23
+ # Do not warn about missing magic comment
24
+ Style/FrozenStringLiteralComment:
25
+ Enabled: false
26
+
27
+ # Disable block length checks for spec files
28
+ Metrics/BlockLength:
29
+ Exclude:
30
+ - 'spec/**/*'
31
+ - 'spec/internal/db/schema.rb'
32
+ - '*.gemspec'
33
+
34
+ # Allow empty blocks in specs (for ActiveAdmin.setup {})
35
+ Lint/EmptyBlock:
36
+ Exclude:
37
+ - 'spec/**/*'
38
+
39
+ # Naming exception for gem main file
40
+ Naming/FileName:
41
+ Exclude:
42
+ - 'lib/activeadmin-tom_select.rb'
43
+
44
+ # Allow development dependencies in gemspec
45
+ Gemspec/DevelopmentDependencies:
46
+ Enabled: false
47
+
48
+ # Allow Ruby version mismatch (we support multiple versions)
49
+ Gemspec/RequiredRubyVersion:
50
+ Enabled: false
51
+
52
+ # Allow longer classes for generators
53
+ Metrics/ClassLength:
54
+ Exclude:
55
+ - 'lib/generators/**/*'
56
+
57
+ # Allow longer methods for generators
58
+ Metrics/MethodLength:
59
+ Exclude:
60
+ - 'lib/generators/**/*'
61
+
62
+ # Allow slightly longer modules for input extensions
63
+ Metrics/ModuleLength:
64
+ Max: 110
65
+
66
+ # Allow complex methods for generators
67
+ Metrics/AbcSize:
68
+ Exclude:
69
+ - 'lib/generators/**/*'
70
+
71
+ # Documentation not required for generators and test support files
72
+ Style/Documentation:
73
+ Exclude:
74
+ - 'lib/generators/**/*'
75
+ - 'spec/**/*'
data/.yardopts ADDED
@@ -0,0 +1,2 @@
1
+ --no-private
2
+ --markup markdown
data/AGENTS.md ADDED
@@ -0,0 +1,39 @@
1
+ # Repository Guidelines
2
+
3
+ ## Project Structure & Module Organization
4
+ - `lib/`: Ruby engine, extensions, and DSL under `ActiveAdmin::SearchableSelect`.
5
+ - `app/assets/`: Legacy Sprockets JS/CSS entry points for ActiveAdmin.
6
+ - `src/`: ESM sources for the npm package (`searchable_select.js/.scss`).
7
+ - `vendor/assets/javascripts/`: Importmap-friendly JS build.
8
+ - `spec/`: RSpec suite with Combustion Rails app under `spec/internal`; feature specs in `spec/features/**`.
9
+ - `docs/`: Setup and integration guides.
10
+
11
+ ## Build, Test, and Development Commands
12
+ - `bundle && bundle exec rspec`: Install gems and run the test suite.
13
+ - `appraisal install && appraisal rspec`: Run the Rails/ActiveAdmin matrix (see `Appraisals`).
14
+ - `bundle exec rubocop --force-exclusion`: Lint Ruby code per `.rubocop.yml`.
15
+ - `npm ci && npm run prepublishOnly`: Build npm artifacts from `app/assets` into `src/`.
16
+ - `npx playwright install chromium`: One-time browser install for JS feature specs.
17
+ - `rake build` / `rake release`: Build/release the gem via Bundler tasks.
18
+ - Example (headed browser): `HEADLESS=false bundle exec rspec`.
19
+
20
+ ## Coding Style & Naming Conventions
21
+ - Ruby: 2-space indent, TargetRuby 3.0, max line length 100; follow RuboCop rules.
22
+ - Names: Ruby files in `lib/activeadmin/searchable_select/` use snake_case; modules under `ActiveAdmin::SearchableSelect`.
23
+ - JS: ESM modules in `src/`; keep imports explicit. Avoid global jQuery except for ActiveAdmin integration.
24
+
25
+ ## Testing Guidelines
26
+ - Framework: RSpec. Feature/system specs use Capybara with Playwright; unit/integration via Combustion.
27
+ - Layout: Place UI/Select2 specs under `spec/features/**` and tag `type: :feature, js: true`.
28
+ - Run: `bundle exec rspec` locally; use `appraisal rspec` to validate matrices before PRs.
29
+ - Browser: Install once with `npx playwright install chromium`. Use `HEADLESS=false` to visualize.
30
+
31
+ ## Commit & Pull Request Guidelines
32
+ - Commits: Imperative, concise messages (e.g., "Fix Select2 init on esbuild"). Group related changes.
33
+ - PRs: Provide clear description, rationale, linked issues; add screenshots/GIFs for UI changes. Update `README.md`/`docs/` and `CHANGELOG.md` for behavior changes.
34
+ - Quality gate: Ensure `rspec` and `rubocop` pass; for npm-facing changes, run `npm run prepublishOnly` to verify `src/` packaging.
35
+
36
+ ## JS Integration Notes
37
+ - Bundlers (esbuild/webpack): `import 'jquery'` and `import 'select2'`, then call `select2($)` and ensure `window.$ = window.jQuery = $` before importing this package.
38
+ - Importmap: Use `vendor/assets/javascripts/activeadmin-searchable_select.js`.
39
+
data/Appraisals ADDED
@@ -0,0 +1,9 @@
1
+ appraise 'rails-7.x-active-admin-4.x' do
2
+ gem 'rails', '~> 7.1'
3
+ gem 'activeadmin', '4.0.0.beta16'
4
+ end
5
+
6
+ appraise 'rails-8.x-active-admin-4.x' do
7
+ gem 'rails', '~> 8.0'
8
+ gem 'activeadmin', '4.0.0.beta16'
9
+ end