five-two-nw-olivander 0.1.2.29 → 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: c61a734e5a96ba24272b92909d114e801ff0296c5069ee1da4203b66458e295c
4
- data.tar.gz: acc01f788c4120e50a39dd257c92bcbc1ba63d5a9348339f0b6905eb6395270e
3
+ metadata.gz: 9b9f0ff95753e126cb4de1106d1cad6f079b4bdd53fd7fe1329b1cd00556ef2c
4
+ data.tar.gz: c0ef254479699aced86f0ae096ad4b013becf8c96aff80ec510906107aaf6d46
5
5
  SHA512:
6
- metadata.gz: 4e568cb13335373644accbe7546189f47ceae111d72b9dd77de4cc1d79cdae2f48c1cf619dee2823e763f0ce403a36f4e05b94bd617bee6d09cf4a89d44b16de
7
- data.tar.gz: 6e1ecbeed3877a5bc9a2da54f0f2bbe71410f78d3b5ca341b37f79fe7f0891376f20019619d5d3db0fe90a9542b1445e7963bfc96bda4ef84a6b1c8f86cb5517
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
@@ -0,0 +1,49 @@
1
+ require 'olivander/resources/model_registry'
2
+
3
+ module Olivander
4
+ module Resources
5
+ module ModelRegistrar
6
+ extend ActiveSupport::Concern
7
+
8
+ included do
9
+ def this_is_included_method
10
+ puts 'hi'
11
+ end
12
+ end
13
+
14
+ class_methods do
15
+ def register_model(model = self, context: :default, using: self, &block)
16
+ Rails.logger.debug "###################"
17
+ Rails.logger.debug "registering model #{model.name} in context #{context} using #{using&.name} at #{self.name}"
18
+ using.register_model(model, context: context, &block) && return unless using == self
19
+
20
+ ::Olivander::Resources::ModelRegistry.global_registry.register(model, &block)
21
+ Rails.logger.debug "###################\n"
22
+ end
23
+ end
24
+ end
25
+
26
+ class TestRegistrant
27
+ end
28
+
29
+ class TestRegistrar
30
+ include ModelRegistrar
31
+ end
32
+
33
+ class TestRegistrar2
34
+ include ModelRegistrar
35
+
36
+ # register_model do
37
+ # puts 'hello'
38
+ # field_layout :show do :all end
39
+ # end
40
+ # register_model Olivander::Resources::TestRegistrant, context: :foo do
41
+ # puts 'this is the other thing'
42
+ # field_layout do [[1, :id]] end
43
+ # end
44
+ # register_model context: :bar, using: TestRegistrar do
45
+ # puts 'and lastly...'
46
+ # end
47
+ end
48
+ end
49
+ end
@@ -0,0 +1,201 @@
1
+ module Olivander
2
+ module Resources
3
+ module ModelRegistry
4
+ mattr_accessor :global_registry
5
+
6
+ module Registry
7
+ extend ActiveSupport::Concern
8
+
9
+ class_methods do
10
+ attr_accessor :_registry_hash
11
+ attr_accessor :_registering
12
+
13
+ def register(model, &block)
14
+ self._registry_hash ||= {}
15
+ self._registering = ensure_registry_for(model)
16
+ instance_exec(&block)
17
+ _registering.make_datatable_classes
18
+ self._registering = nil
19
+ # Rails.logger.debug _registry_hash
20
+ end
21
+
22
+ def entry_for(model)
23
+ _registry_hash[model]
24
+ end
25
+
26
+ def ensure_registry_for(model)
27
+ _registry_hash[model] ||= RegisteredModel.new(model)
28
+ end
29
+
30
+ def field_layout(layouts = [:show, :form])
31
+ layouts = [*layouts] # ensure it's an array
32
+ field_layout = block_given? ? yield : :all
33
+ layouts.each do |layout|
34
+ Rails.logger.debug "setting layout for #{_registering}[#{layout}]"
35
+ _registering.add_layout(layout, field_layout)
36
+ end
37
+ end
38
+
39
+ def add_datatable(view = nil, &block)
40
+ _registering.add_datatable(view, DatatableDef.new(_registering, &block))
41
+ end
42
+
43
+ def render_fields(field_list, with_format: :string)
44
+ _registering.render_fields(field_list, with_format)
45
+ end
46
+ end
47
+ end
48
+
49
+ class DatatableDef
50
+ attr_accessor :model, :blocks, :datatable_class, :block
51
+
52
+ def initialize(model, &block)
53
+ Rails.logger.info "making new datatable"
54
+ Rails.logger.info block.source
55
+ self.model = model
56
+ self.blocks = {}
57
+
58
+ # instance_exec(&block) if block_given?
59
+ self.block = block
60
+ end
61
+
62
+ def datatable(sym)
63
+ blocks[:datatable] = Proc.new{ datatable do model.send(sym) end }
64
+ end
65
+
66
+ def collection(sym)
67
+ blocks[:collection] = Proc.new{ collection do model.send(sym) end }
68
+ end
69
+
70
+ def filters(sym)
71
+ blocks[:filters] = Proc.new{ model.send(sym) }
72
+ end
73
+
74
+ def charts(sym)
75
+ blocks[:charts] = Proc.new{ model.send(sym) }
76
+ end
77
+
78
+ def make_class(key)
79
+ # return datatable_class unless datatable_class.nil?
80
+ # ensure_blocks
81
+
82
+ name_key = key == :index ? '' : key
83
+ name = [model.name.demodulize, name_key, 'Datatable'].join
84
+ blocks = self.blocks
85
+ block = self.block
86
+ klass = Class.new(Olivander::Datatable) do
87
+ puts 'stuff'
88
+ # blocks.values.each do |block|
89
+ # puts 'this is a block'
90
+ # puts block.source
91
+ # instance_eval(block.source)
92
+ # binding.pry
93
+ # instance_exec(&block)
94
+ # end
95
+ # collection do
96
+ # Erp::Rate.all
97
+ # end
98
+ instance_exec(&block)
99
+ end
100
+ module_name = model.name.deconstantize
101
+ constantized_module = module_name.constantize
102
+ constantized_module.send(:remove_const, name) if constantized_module.const_defined?(name)
103
+ self.datatable_class = constantized_module.const_set(name, klass)
104
+ end
105
+
106
+ def ensure_blocks
107
+ blocks[:collection] ||= Proc.new{
108
+ model.all
109
+ }
110
+ end
111
+ end
112
+
113
+ class RegisteredModel
114
+ attr_accessor :fields, :layouts, :datatables, :name, :model
115
+
116
+ def initialize(model)
117
+ self.model = model
118
+ set_fields
119
+ self.layouts = {}
120
+ self.datatables = {}
121
+ self.name = model.name
122
+ end
123
+
124
+ def to_s
125
+ name
126
+ end
127
+
128
+ def inspect
129
+ name
130
+ end
131
+
132
+ def add_layout(key, layout)
133
+ layout = [[2, fields]] if layout == :all
134
+ layouts[key] = layout
135
+ end
136
+
137
+ def layout(key)
138
+ layouts[key] || add_layout(key, :all)
139
+ end
140
+
141
+ def add_datatable(key, datatable_def)
142
+ Rails.logger.info "adding datatable #{key}"
143
+ datatables[key || :index] = datatable_def
144
+ # binding.pry
145
+ end
146
+
147
+ def datatable(key)
148
+ datatables[key] || add_datatable(key, DatatableDef.new(self))
149
+ end
150
+
151
+ def make_datatable_classes
152
+ datatables.each do |key, dt_def|
153
+ dt_def.make_class(key)
154
+ end
155
+ end
156
+
157
+ def render_fields(field_list, with_format)
158
+ field_list.each do |field|
159
+ fields[field].render_as = with_format
160
+ end
161
+ end
162
+
163
+ private
164
+
165
+ def set_fields
166
+ self.fields = {}
167
+
168
+ if model.respond_to?(:columns)
169
+ model.columns.map{ |x| RegisteredField.new(x) }.each do |field|
170
+ fields[field.key] = field
171
+ end
172
+ end
173
+ end
174
+ end
175
+
176
+ class RegisteredField
177
+ attr_accessor :key, :ar_def, :dt_def, :render_as
178
+
179
+ def to_s
180
+ key
181
+ end
182
+
183
+ def inspect
184
+ key
185
+ end
186
+
187
+ def initialize(ar_def)
188
+ self.key = ar_def.name.to_sym
189
+ self.ar_def = ar_def
190
+ self.render_as = ar_def.type
191
+ self.dt_def = {}
192
+ end
193
+ end
194
+
195
+ class DefaultModelRegistry
196
+ include Registry
197
+ ::Olivander::Resources::ModelRegistry.global_registry = Olivander::Resources::ModelRegistry::DefaultModelRegistry
198
+ end
199
+ end
200
+ end
201
+ end
@@ -109,7 +109,9 @@ module Olivander
109
109
  end
110
110
 
111
111
  def build_routes(mapper)
112
+ Rails.logger.info "building routes..."
112
113
  build_resource_routes(mapper)
114
+ Rails.logger.info "...routes built"
113
115
  end
114
116
 
115
117
  def set_controller_and_helper(a)
@@ -121,6 +123,7 @@ module Olivander
121
123
 
122
124
  def build_resource_routes(mapper)
123
125
  resources.keys.each do |k|
126
+ before_routes = Rails.application.routes.named_routes.helper_names
124
127
  r = resources[k]
125
128
  mapper.resources r.model, only: [] do
126
129
  mapper.collection do
@@ -157,6 +160,10 @@ module Olivander
157
160
  end
158
161
  end
159
162
  end
163
+ after_routes = Rails.application.routes.named_routes.helper_names
164
+ net_routes = after_routes - before_routes
165
+ # Rails.logger.info "added these route helpers:\n#{net_routes}"
166
+ # binding.pry if k == :projects
160
167
  end
161
168
  end
162
169
  end
@@ -41,6 +41,17 @@ module Olivander
41
41
  column_attributes.each do |key|
42
42
  label = field_label_for(klazz, key)
43
43
  sym = key.gsub('_id', '')
44
+
45
+ # modifiers = STRIP OFF ANY PUNCTUATION MARKS
46
+ # modifiers.each do |modifier|
47
+ # case !:
48
+ # visible = false
49
+ # case $:
50
+ # type = currency
51
+ # end
52
+ # end
53
+
54
+
44
55
  visible = show.include?(key) || !(default_hidden.include?(key) || hide.include?(key))
45
56
  if link_path.present? && sym == :id
46
57
  link_col sym, link_path, 'id', visible: visible
@@ -91,7 +91,7 @@ module Olivander
91
91
  end
92
92
 
93
93
  def sidebar_context_name
94
- [@context.name, sidebar_context_suffix&.upcase].reject(&:blank?).join(' ')
94
+ [@context.name, sidebar_context_suffix&.upcase].reject{ |x| x.blank? or x == 'PRODUCTION' }.join(' ')
95
95
  end
96
96
 
97
97
  def sidebar_context_suffix
@@ -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.29'.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.29
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-01 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,7 +192,12 @@ 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
199
+ - app/controllers/concerns/olivander/resources/model_registrar.rb
200
+ - app/controllers/concerns/olivander/resources/model_registry.rb
196
201
  - app/controllers/concerns/olivander/resources/route_builder.rb
197
202
  - app/controllers/olivander/application_controller.rb
198
203
  - app/datatables/olivander/datatable.rb