five-two-nw-olivander 0.1.2.30 → 0.1.2.31

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: c44e3b7096fe950aaac7828a92343e5f05cabac07d3776d35369fd434fd83a97
4
- data.tar.gz: 6a46d72cfc1f35b37fdc61ee0027f278785af0fcb79e5ee38f1f67cf72da4756
3
+ metadata.gz: 9b9f0ff95753e126cb4de1106d1cad6f079b4bdd53fd7fe1329b1cd00556ef2c
4
+ data.tar.gz: c0ef254479699aced86f0ae096ad4b013becf8c96aff80ec510906107aaf6d46
5
5
  SHA512:
6
- metadata.gz: fa838b60681399f4000cf08e2c0fcc8d23cbacd9ea8c72087a309fc78bcb1223f3062ce5be88c849591d477aaef2c49a18c35b0e5bc166ef972aa4d6902e04d8
7
- data.tar.gz: ad347d7be7b1a862b125152ea10484e5b9c5cd36287064d3c8bc49fe60043349aaff32eca85f77ceee1c8d5e1eb7c769fb12af5e54457908b87bb0ddbd95f65d
6
+ metadata.gz: 7f9297fdacf15c8a833c226deb411c6394e4c8ec125c6515d4127b5dea867048d15e2478ea6f911ca2b6855c887a444886180d4ac9356b94eb7855b301b17823
7
+ data.tar.gz: a8fdfaf8efbd4eaeb2dfef11060f10b3bbf90bd8f1249d734aa64c1a44238e8f9aec7af4093d8ec161a3b041ebdfbab1a6405a29ec0e94c83035ca8412011bab
@@ -25,4 +25,10 @@
25
25
 
26
26
  .table td, .table th {
27
27
  padding: 0.25rem !important;
28
- }
28
+ }
29
+ .table-fixed_header thead tr {
30
+ position: sticky;
31
+ top: 0;
32
+ z-index: 1;
33
+ background-color: white;
34
+ }
@@ -6,7 +6,7 @@
6
6
  %h3.card-title= @title
7
7
  .card-body
8
8
  = content
9
- .card-footer
9
+ -# .card-footer
10
10
  - if @src.present?
11
11
  .overlay.dark
12
12
  %i.fas.fa-sync-alt.fa-spin.fa-lg
@@ -3,7 +3,7 @@
3
3
  module Olivander
4
4
  module Components
5
5
  class PortletComponent < ViewComponent::Base
6
- def initialize(title, background: nil, header_background: 'bg-info', turbo_frame: nil, src: nil, loading: nil)
6
+ def initialize(title, background: nil, header_background: 'bg-secondary', turbo_frame: nil, src: nil, loading: nil)
7
7
  super
8
8
  @title = title
9
9
  @background = background
@@ -0,0 +1,18 @@
1
+ - if @item_iteration.first?
2
+ %table.table.table-striped.table-hover.table-fixed_header/
3
+ - if @headers
4
+ %thead
5
+ %tr
6
+ - @builder.field_blocks.each do |field_block|
7
+ %th{ class: field_block.alignment }
8
+ - if field_block.key.present?
9
+ = I18n.t(['activerecord.attributes', @item.class.name.underscore, field_block.key].join('.'))
10
+ %tbody/
11
+ %tr
12
+ - @builder.field_blocks.each do |field_block|
13
+ %td{ class: field_block.alignment }
14
+ = capture do
15
+ - instance_exec(@item, &field_block.block)
16
+ - if @item_iteration.last?
17
+ </tbody>
18
+ </table>
@@ -0,0 +1,25 @@
1
+ - if @turbo_frame.present?
2
+ <turbo-frame id="#{@turbo_frame}">
3
+
4
+ .card{ class: @background }
5
+ .card-header{ class: @header_background }
6
+ %h3.card-title= @title
7
+ .card-tools
8
+ - if header_tools?
9
+ = header_tools
10
+ -# %button.btn.btn-tool{ type: :button, 'data-card-widget': :collapse }
11
+ -# %i.fas.fa-minus
12
+ -# %button.btn.btn-tool{ type: :button, 'data-card-widget': :maximize }
13
+ -# %i.fas.fa-expand
14
+ .card-body
15
+ - if @collection&.size&.positive?
16
+ %div{style: @max_height.present? ? "max-height: #{@max_height}; overflow-y: auto; overflow-x: hidden" : ""}
17
+ = render Olivander::Components::TablePortletComponent::TableComponent.with_collection(@collection, builder: @builder, headers: @headers)
18
+ - else
19
+ No #{@title.downcase} to display.
20
+ - if footer_buttons?
21
+ .card-footer.text-right
22
+ = footer_buttons
23
+
24
+ - if @turbo_frame.present?
25
+ </turbo-frame>
@@ -0,0 +1,59 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Olivander
4
+ module Components
5
+ class TablePortletComponent < ViewComponent::Base
6
+ renders_one :header_tools
7
+ renders_one :footer_buttons
8
+
9
+ def initialize(collection, headers: true, builder:, title: '', background: nil, header_background: 'bg-secondary', turbo_frame: nil, max_height: nil)
10
+ super
11
+ @collection = collection
12
+ @builder = builder
13
+ @title = title
14
+ @background = background
15
+ @header_background = header_background
16
+ @turbo_frame = turbo_frame
17
+ @max_height = max_height
18
+ @headers = headers
19
+ end
20
+
21
+ class TableComponent < ViewComponent::Base
22
+ with_collection_parameter :item
23
+ delegate :can?, :cannot?, to: :helpers
24
+
25
+ def initialize(item:, item_iteration:, builder:, headers:)
26
+ super
27
+ @item = item
28
+ @item_iteration = item_iteration
29
+ @builder = builder
30
+ @headers = headers
31
+ end
32
+ end
33
+
34
+ class Builder
35
+ attr_accessor :field_blocks, :header_tools, :footer_buttons
36
+
37
+ def initialize(collection, &block)
38
+ self.field_blocks = []
39
+ block.call(self) if block_given?
40
+ end
41
+
42
+ def field(key, alignment = 'text-left', &block)
43
+ unless block_given?
44
+ block = Proc.new{ |x| x.send(key).to_s.html_safe }
45
+ end
46
+ field_blocks << OpenStruct.new(key: key, alignment: alignment, block: block)
47
+ end
48
+
49
+ def with_header_tools(&block)
50
+ self.header_tools = block
51
+ end
52
+
53
+ def with_footer_buttons(&block)
54
+ self.footer_buttons = block
55
+ end
56
+ end
57
+ end
58
+ end
59
+ end
@@ -44,19 +44,21 @@ module Olivander
44
44
  end
45
45
  else
46
46
  only = self.columns.collect{ |x| x.name.to_sym } - SKIPPED_ATTRIBUTES if only.size.zero?
47
- self.columns.each do |att|
48
- sym = att.name.to_sym
49
- type = att.type
50
- next unless only.include?(sym)
51
-
52
- reflections.map{ |x| x[1] }
53
- .filter{ |x| x.foreign_key == att.name }
54
- .each do |r|
55
- sym = r.name
56
- type = :association
47
+ only.each do |inc|
48
+ self.columns.each do |att|
49
+ sym = att.name.to_sym
50
+ type = att.type
51
+ next unless inc == sym
52
+
53
+ reflections.map{ |x| x[1] }
54
+ .filter{ |x| x.foreign_key == att.name }
55
+ .each do |r|
56
+ sym = r.name
57
+ type = :association
58
+ end
59
+
60
+ resource_field sym, type
57
61
  end
58
-
59
- resource_field sym, type
60
62
  end
61
63
  end
62
64
  end
@@ -146,5 +146,23 @@ module Olivander
146
146
  "fas fa-question-circle"
147
147
  end
148
148
  end
149
+
150
+ def collection_component_builder_for(klass, collection, *args, &block)
151
+ builder = klass::Builder.new(self, &block)
152
+ options = args.extract_options!
153
+ options[:builder] = builder
154
+ render klass.new(collection, *(args + [options])) do |component|
155
+ if builder.header_tools.present?
156
+ component.with_header_tools do
157
+ builder.header_tools.call
158
+ end
159
+ end
160
+ if builder.footer_buttons.present?
161
+ component.with_footer_buttons do
162
+ builder.footer_buttons.call
163
+ end
164
+ end
165
+ end
166
+ end
149
167
  end
150
168
  end
@@ -1,3 +1,3 @@
1
1
  module Olivander
2
- VERSION = '0.1.2.30'.freeze
2
+ VERSION = '0.1.2.31'.freeze
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: five-two-nw-olivander
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.2.30
4
+ version: 0.1.2.31
5
5
  platform: ruby
6
6
  authors:
7
7
  - Eric Dennis
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2023-08-08 00:00:00.000000000 Z
11
+ date: 2023-08-10 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: chartkick
@@ -192,6 +192,9 @@ files:
192
192
  - app/components/olivander/components/resource_show_component.rb
193
193
  - app/components/olivander/components/small_box_component.html.haml
194
194
  - app/components/olivander/components/small_box_component.rb
195
+ - app/components/olivander/components/table_portlet_component.html.haml
196
+ - app/components/olivander/components/table_portlet_component.rb
197
+ - app/components/olivander/components/table_portlet_component/table_component.html.haml
195
198
  - app/controllers/concerns/olivander/resources/auto_form_attributes.rb
196
199
  - app/controllers/concerns/olivander/resources/model_registrar.rb
197
200
  - app/controllers/concerns/olivander/resources/model_registry.rb