rails_accordion 1.0.0 → 1.0.2

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1 @@
1
+ //= link_tree ../builds
@@ -1,23 +1,23 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  class AccordionComponent < ViewComponent::Base
4
-
5
4
  def initialize(**args)
6
- super
7
5
  @args = args.presence || {}
8
- set_data_params
9
6
  end
10
7
 
11
8
  def call
12
- content_tag(:div, content, **@args)
9
+ content_tag(:div, content, data: data_options, **@args)
13
10
  end
14
11
 
15
12
  private
16
13
 
17
- def set_data_params
18
- @args[:data] ||= {}
19
- @args[:data][:controller] = [@args[:data][:controller], "accordion"].compact.join(" ")
20
- @args[:data][:multiple_open] = @args.delete(:multiple_open) || RailsAccordion.configuration.multiple_open
21
- @args[:data][:default_state] = @args.delete(:default_state) || RailsAccordion.configuration.default_state
14
+ def data_options
15
+ data = @args.delete(:data) || {}
16
+ {
17
+ controller: [data.delete(:controller), "accordion"].compact.join(" "),
18
+ accordion_multiple_open_value: @args.delete(:multiple_open) || RailsAccordion.configuration.multiple_open,
19
+ accordion_default_state_value: @args.delete(:default_state) || RailsAccordion.configuration.default_state,
20
+ **data
21
+ }
22
22
  end
23
23
  end
@@ -5,13 +5,11 @@ class ItemComponent < ViewComponent::Base
5
5
  renders_one :header
6
6
 
7
7
  def initialize(**args)
8
- super
9
8
  @args = args.presence || {}
10
- set_classes
11
9
  end
12
10
 
13
11
  def call
14
- content_tag :div, **@args do
12
+ content_tag :div, class: [@args.delete(:class), "accordion_item"].compact.join(" "), data: { accordion_target: "item" }, **@args do
15
13
  header_component + body_component
16
14
  end
17
15
  end
@@ -19,7 +17,7 @@ class ItemComponent < ViewComponent::Base
19
17
  private
20
18
 
21
19
  def header_component
22
- content_tag :div, header, class: "accordion_toggle"
20
+ content_tag :div, header, class: "accordion_toggle", data: { action: "click->accordion#toggle" }
23
21
  end
24
22
 
25
23
  def body_component
@@ -32,10 +30,6 @@ class ItemComponent < ViewComponent::Base
32
30
  end
33
31
  end
34
32
 
35
- def set_classes
36
- @args[:class] = [@args[:class], "accordion_item"].compact.join(" ")
37
- end
38
-
39
33
  def content_styles
40
34
  "transition-duration: #{parse_duration}ms;"
41
35
  end
@@ -0,0 +1,15 @@
1
+ module RailsAccordion
2
+ module ApplicationHelper
3
+ def accordion(**args, &block)
4
+ render AccordionComponent.new(**args), &block
5
+ end
6
+
7
+ def accordion_item(**args, &block)
8
+ render ItemComponent.new(**args), &block
9
+ end
10
+
11
+ def rails_accordion_assets
12
+ render "rails_accordion/assets"
13
+ end
14
+ end
15
+ end
@@ -1,46 +1,39 @@
1
1
  import { Controller } from "@hotwired/stimulus";
2
2
 
3
3
  export default class extends Controller {
4
- connect() {
5
- this.initAccordion();
4
+ static targets = [ "item" ]
6
5
 
7
- this.initDefaultState()
6
+ static values = {
7
+ multipleOpen: Boolean,
8
+ defaultState: String
8
9
  }
9
10
 
10
- initDefaultState() {
11
- const items = this.element.querySelectorAll('.accordion_item');
12
-
13
- switch($(this.element).data('default-state')) {
11
+ connect() {
12
+ // inits default state for accordion
13
+ switch(this.defaultStateValue) {
14
14
  case 'all_closed':
15
- this.hideAll(items);
15
+ this.hideAll(this.itemTargets);
16
16
  break;
17
17
  case 'all_opened':
18
- this.showAll(items);
18
+ this.showAll(this.itemTargets);
19
19
  break;
20
20
  case 'first_opened':
21
- this.hideAll(items)
22
- this.open(items[0].querySelector('.accordion_content'))
21
+ this.hideAll(this.itemTargets)
22
+ this.open(this.itemTargets[0].querySelector('.accordion_content'))
23
23
  }
24
24
  }
25
25
 
26
- initAccordion() {
27
- const items = this.element.querySelectorAll('.accordion_item');
28
-
29
- items.forEach((item) => {
30
- const toggle = item.querySelector('.accordion_toggle');
31
- const content = item.querySelector('.accordion_content')
32
-
33
- toggle.addEventListener('click', (e) => {
34
- if (content.classList.contains('accordion_active')) {
35
- this.hide(content);
36
- } else {
37
- if ($(this.element).data('multiple-open') != true) {
38
- this.hideAll(items);
39
- }
40
- this.open(content);
41
- }
42
- });
43
- });
26
+ toggle(e) {
27
+ const content = e.currentTarget.parentNode.querySelector('.accordion_content')
28
+
29
+ if (content.classList.contains('accordion_active')) {
30
+ this.hide(content);
31
+ } else {
32
+ if (!this.multipleOpenValue) {
33
+ this.hideAll(this.itemTargets);
34
+ }
35
+ this.open(content);
36
+ }
44
37
  }
45
38
 
46
39
  hideAll(items) {
@@ -58,6 +51,12 @@ export default class extends Controller {
58
51
 
59
52
  open(item) {
60
53
  item.classList.add("accordion_active")
61
- item.style.height = item.scrollHeight + 'px'
54
+ item.style.height = item.scrollHeight + 'px';
55
+
56
+ item.querySelectorAll('.accordion_content').forEach(function(child) {
57
+ new ResizeObserver(function() {
58
+ item.style.height = item.scrollHeight + 'px';
59
+ }).observe(child);
60
+ });
62
61
  }
63
62
  }
@@ -0,0 +1,2 @@
1
+ <%= stylesheet_link_tag "/rails_accordion_assets/rails_accordion.css", "data-turbo-track": "reload", defer: true %>
2
+ <%= javascript_include_tag "/rails_accordion_assets/rails_accordion.js", "data-turbo-track": "reload" %>
data/bin/rails CHANGED
@@ -3,7 +3,6 @@
3
3
  # installed from the root of your application.
4
4
 
5
5
  ENGINE_ROOT = File.expand_path('..', __dir__)
6
- # ENGINE_PATH = File.expand_path('../lib/rails_table/engine', __dir__)
7
6
 
8
7
  # Set up gems listed in the Gemfile.
9
8
  ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../Gemfile', __dir__)
@@ -0,0 +1,17 @@
1
+ module RailsAccordion
2
+ class Engine < ::Rails::Engine
3
+ isolate_namespace RailsAccordion
4
+
5
+ initializer "rails_accordion.helpers" do
6
+ ActiveSupport.on_load :action_controller do
7
+ helper RailsAccordion::ApplicationHelper
8
+ end
9
+ end
10
+
11
+ config.app_middleware.use(
12
+ Rack::Static,
13
+ urls: ["/rails_accordion_assets"],
14
+ root: RailsAccordion::Engine.root.join("public")
15
+ )
16
+ end
17
+ end
@@ -7,32 +7,8 @@ loader.ignore("#{__dir__}/generators")
7
7
  loader.setup
8
8
 
9
9
  module RailsAccordion
10
-
11
- class Error < StandardError; end
12
-
13
- class Engine < ::Rails::Engine
14
- isolate_namespace RailsAccordion
15
-
16
- initializer "rails_accordion.importmap" do |app|
17
- if defined?(Importmap)
18
- app.config.assets.precompile << "rails_accordion.js"
19
- app.config.assets.precompile << "rails_accordion.css"
20
- end
21
- end
22
- end
23
-
24
- class Railtie < Rails::Railtie
25
- ActiveSupport.on_load :action_view do
26
- include RailsAccordion
27
- end
28
- end
29
-
30
- def accordion(**args, &block)
31
- render AccordionComponent.new(**args), &block
32
- end
33
-
34
- def accordion_item(**args, &block)
35
- render ItemComponent.new(**args), &block
10
+ def self.root
11
+ RailsAccordion::Engine.routes.find_script_name({})
36
12
  end
37
13
  end
38
14
 
@@ -1,4 +1,7 @@
1
- # desc "Explaining what the task does"
2
- # task :rails_table do
3
- # # Task goes here
4
- # end
1
+ namespace :rails_accordion do
2
+ desc "Build for release"
3
+ task :build do
4
+ `yarn build`
5
+ `cp -r ./app/assets/builds/* ./public/rails_accordion_assets`
6
+ end
7
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rails_accordion
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0
4
+ version: 1.0.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ahmadshoh Nasrullozoda
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2023-06-07 00:00:00.000000000 Z
11
+ date: 2023-07-03 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: stimulus-rails
@@ -70,11 +70,14 @@ files:
70
70
  - app/assets/builds/rails_accordion.css
71
71
  - app/assets/builds/rails_accordion.js
72
72
  - app/assets/builds/rails_accordion.js.map
73
+ - app/assets/config/rails_accordion_manifest.js
73
74
  - app/assets/stylesheets/rails_accordion.css
74
75
  - app/components/accordion_component.rb
75
76
  - app/components/item_component.rb
77
+ - app/helpers/rails_accordion/application_helper.rb
76
78
  - app/javascript/controllers/accordion_controller.js
77
79
  - app/javascript/rails_accordion.js
80
+ - app/views/rails_accordion/_assets.html.erb
78
81
  - bin/console
79
82
  - bin/rails
80
83
  - bin/setup
@@ -82,12 +85,10 @@ files:
82
85
  - lib/generators/rails_accordion/templates/rails_accordion.tt
83
86
  - lib/rails_accordion.rb
84
87
  - lib/rails_accordion/configuration.rb
88
+ - lib/rails_accordion/engine.rb
85
89
  - lib/rails_accordion/version.rb
86
90
  - lib/tasks/rails_accordion_tasks.rake
87
91
  - rails_accordion.gemspec
88
- - vendor/assets/javascripts/rails_accordion.js
89
- - vendor/assets/javascripts/rails_accordion.js.map
90
- - vendor/assets/stylesheets/rails_accordion.css
91
92
  homepage: https://github.com/Tajbrains/rails_accordion
92
93
  licenses:
93
94
  - MIT