five-two-nw-olivander 0.2.0.2 → 0.2.0.3
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.
- checksums.yaml +4 -4
- data/app/assets/javascripts/adminlte/datatable.fix.js +42 -0
- data/app/assets/javascripts/adminlte/select2_defaults.coffee +13 -1
- data/app/assets/javascripts/adminlte.js +1 -0
- data/app/components/olivander/components/resource_form_component.html.haml +13 -4
- data/app/components/olivander/components/resource_show_component.html.haml +9 -4
- data/app/controllers/concerns/olivander/resources/auto_form_attributes.rb +9 -4
- data/app/controllers/concerns/olivander/resources/crud_controller.rb +2 -1
- data/app/controllers/concerns/olivander/resources/route_builder.rb +5 -4
- data/app/helpers/olivander/application_helper.rb +9 -1
- data/app/views/effective/resource/_actions_dropleft.html.haml +16 -10
- data/app/views/layouts/olivander/adminlte/_navbar.html.haml +10 -9
- data/lib/olivander/application_context.rb +25 -3
- data/lib/olivander/version.rb +1 -1
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 2e9d0ccea420078110d4af7de4d7eec3c0ac04e8a8a2533302d5792a1d599c58
|
4
|
+
data.tar.gz: '09b69957d70478ef092e8eff4a979ee867ac74c903fe1572793016d8ab26f531'
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 07ce6181e19ada53a8d78cf650c8b4cef82ccb4d38b33a09cca9b340d71567d2a4889f613c5986afb85fb6cc32b0b6010999f9af05fe40ab1ff7ff3a45f291e5
|
7
|
+
data.tar.gz: 67fbcc49d403734676c0f8d46052585ed70e127878bd6f4490f7d94f104d02aa8bcd7827da5d39957182a4a7b9dcc3947b41e69425189844a34e1812684efe15
|
@@ -0,0 +1,42 @@
|
|
1
|
+
(function() {
|
2
|
+
var destroySelect2s, logEvent;
|
3
|
+
|
4
|
+
$.extend(true, $.fn.dataTable.Buttons.defaults, {
|
5
|
+
dom: {
|
6
|
+
button: {
|
7
|
+
className: 'btn btn-outline-primary btn-sm'
|
8
|
+
}
|
9
|
+
}
|
10
|
+
});
|
11
|
+
|
12
|
+
$.extend(true, $.fn.dataTable.ext.classes, {
|
13
|
+
sProcessing: "dataTables_processing card overlay-wrapper"
|
14
|
+
});
|
15
|
+
|
16
|
+
destroySelect2s = function() {
|
17
|
+
$('.effective-datatables-filters').find('select').select2('destroy');
|
18
|
+
return $('.dataTables_wrapper').each(function(_, o) {
|
19
|
+
try {
|
20
|
+
return $(o).find('.dataTables_length select.select2-hidden-accessible').addClass('no-select2').removeAttr('name').select2('destroy');
|
21
|
+
} catch (error) {}
|
22
|
+
});
|
23
|
+
};
|
24
|
+
|
25
|
+
logEvent = function(e) {
|
26
|
+
return console.log(e);
|
27
|
+
};
|
28
|
+
|
29
|
+
$(document).ready(function(e) {
|
30
|
+
return destroySelect2s();
|
31
|
+
});
|
32
|
+
|
33
|
+
// $(document).ready(function(e) {
|
34
|
+
// return $('.effective-datatables-filters input').click(function() {
|
35
|
+
// var $form, $table;
|
36
|
+
// $form = $(event.currentTarget).closest('.effective-datatables-filters');
|
37
|
+
// $table = $('#' + $form.attr('aria-controls'));
|
38
|
+
// return $table.DataTable().draw();
|
39
|
+
// });
|
40
|
+
// });
|
41
|
+
|
42
|
+
}).call(this);
|
@@ -12,7 +12,11 @@ $.fn.select2.defaults.set('dropdownParent', $('#modal-root'))
|
|
12
12
|
# TODO: Recheck with the select2 GH issue and remove once this is fixed on their side
|
13
13
|
#
|
14
14
|
$(document).on 'select2:open', (evt) =>
|
15
|
-
|
15
|
+
try
|
16
|
+
evt.target.parent.querySelector('.select2-search__field').focus()
|
17
|
+
catch ex
|
18
|
+
evt.target.parentElement.querySelector('.select2-search__field').focus()
|
19
|
+
|
16
20
|
|
17
21
|
initSelect2s = () -> $('select').not('.no-select2').each (k,v) =>
|
18
22
|
$(v).select2({ dropdownParent: $(v).parent() })
|
@@ -21,3 +25,11 @@ initSelect2s = () -> $('select').not('.no-select2').each (k,v) =>
|
|
21
25
|
$(document).on 'show.bs.modal', (e) =>
|
22
26
|
$('select').not('.no-select2').each (k,v) =>
|
23
27
|
$(v).select2({ dropdownParent: $(v).parent() })
|
28
|
+
|
29
|
+
$(document).ready =>
|
30
|
+
$('.effective-datatables-filters').find('select').select2('destroy');
|
31
|
+
$('.dataTables_wrapper').each (_, o) =>
|
32
|
+
try
|
33
|
+
return $(o).find('.dataTables_length select.select2-hidden-accessible').addClass('no-select2').removeAttr('name').select2('destroy');
|
34
|
+
catch error
|
35
|
+
# don't care
|
@@ -5,10 +5,19 @@
|
|
5
5
|
- section.fields.each do |field|
|
6
6
|
%div{ class: section.column_class }
|
7
7
|
- case field.type
|
8
|
-
- when :association
|
9
|
-
-
|
10
|
-
-
|
11
|
-
|
8
|
+
- when :association, :belongs_to_association, :has_many_association, :has_many_through_association, :has_and_belongs_to_many_reflection, :has_one_through_association
|
9
|
+
- reflection = @f.object.class.reflect_on_association(field.sym)
|
10
|
+
- controllers = "#{field.type}-#{@resource.class.name.underscore.gsub('/', '_')}-#{field.sym} input-control-association"
|
11
|
+
- begin
|
12
|
+
- collection_path = polymorphic_path(@resource.class.reflect_on_association(field.sym).klass, format: :json)
|
13
|
+
- rescue
|
14
|
+
- collection_path = ''
|
15
|
+
- collection = @f.object.send(field.sym)
|
16
|
+
- case field.type
|
17
|
+
- when :has_one_through_association
|
18
|
+
= @f.input field.sym, selected: collection, collection: [collection].flatten, disabled: !field.editable, input_html: { data: { collection_path: collection_path, controller: controllers } }
|
19
|
+
-else
|
20
|
+
= @f.association field.sym, collection: [collection].flatten, disabled: !field.editable, input_html: { data: { collection_path: collection_path, controller: controllers } }
|
12
21
|
- when :boolean
|
13
22
|
= @f.input field.sym, disabled: !field.editable, as: field.type.to_sym, input_html: { data: { controller: "input-control-#{field.type}" } }, wrapper: :checkbox
|
14
23
|
- else
|
@@ -23,14 +23,20 @@
|
|
23
23
|
- when :boolean
|
24
24
|
- icon_class = val ? 'fa-check text-success' : 'fa-times text-danger'
|
25
25
|
%i.fa{ class: icon_class }
|
26
|
-
- when :association
|
26
|
+
- when :association, :belongs_to_association, :has_many_association, :has_many_through_association, :has_and_belongs_to_many_reflection, :has_one_through_association
|
27
27
|
- if val.present?
|
28
28
|
- if val.is_a?(ActiveRecord::Associations::CollectionProxy)
|
29
29
|
%ul
|
30
30
|
- val.each do |val1|
|
31
|
-
|
31
|
+
- begin
|
32
|
+
%li= link_to val1
|
33
|
+
- rescue
|
34
|
+
%li= val1
|
32
35
|
- else
|
33
|
-
|
36
|
+
- begin
|
37
|
+
= link_to val if val.present?
|
38
|
+
- rescue
|
39
|
+
= val if val.present?
|
34
40
|
- when :file
|
35
41
|
- if val.present?
|
36
42
|
- if val.content_type.include?('image')
|
@@ -38,7 +44,6 @@
|
|
38
44
|
- else
|
39
45
|
= link_to val, val.expiring_url
|
40
46
|
- else
|
41
|
-
= f.type
|
42
47
|
= val
|
43
48
|
- (section.columns-slice.size).times do
|
44
49
|
%th
|
@@ -33,16 +33,16 @@ module Olivander
|
|
33
33
|
self.resource_field_group_collection
|
34
34
|
end
|
35
35
|
|
36
|
-
def self.auto_resource_fields(columns: 2, only: [], editable: true)
|
36
|
+
def self.auto_resource_fields(columns: 2, only: [], except: [], editable: true)
|
37
37
|
return unless ActiveRecord::Base.connection.table_exists?(table_name)
|
38
38
|
|
39
39
|
if current_resource_field_group.nil?
|
40
40
|
resource_field_group do
|
41
|
-
auto_resource_fields(columns: columns, only: only, editable: editable)
|
41
|
+
auto_resource_fields(columns: columns, only: only, except: except, editable: editable)
|
42
42
|
end
|
43
43
|
elsif current_resource_field_group.forced_section.nil?
|
44
44
|
resource_field_section(columns) do
|
45
|
-
auto_resource_fields(columns: columns, only: only, editable: editable)
|
45
|
+
auto_resource_fields(columns: columns, only: only, except: except, editable: editable)
|
46
46
|
end
|
47
47
|
else
|
48
48
|
if only.size.zero?
|
@@ -53,6 +53,7 @@ module Olivander
|
|
53
53
|
only << attachment_definitions.select{ |x| x[0] } if respond_to?(:attachment_definitions)
|
54
54
|
only = only.flatten - SKIPPED_ATTRIBUTES
|
55
55
|
end
|
56
|
+
only = only - except
|
56
57
|
only.each do |inc|
|
57
58
|
self.columns.each do |att|
|
58
59
|
sym = att.name.to_sym
|
@@ -65,7 +66,11 @@ module Olivander
|
|
65
66
|
reflections.map{ |x| x[1] }
|
66
67
|
.filter{ |x| x.foreign_key == inc || x.name == inc }
|
67
68
|
.each do |r|
|
68
|
-
|
69
|
+
begin
|
70
|
+
resource_field(r.name, r.association_class.name.demodulize.underscore.to_sym, editable: editable)
|
71
|
+
rescue NotImplementedError
|
72
|
+
resource_field(r.name, :association, editable: editable)
|
73
|
+
end
|
69
74
|
end
|
70
75
|
|
71
76
|
next unless respond_to?(:attachment_definitions)
|
@@ -8,7 +8,7 @@ module Olivander
|
|
8
8
|
layout 'olivander/adminlte/main'
|
9
9
|
|
10
10
|
def index
|
11
|
-
if params[:
|
11
|
+
if request.format == :json && params[:_type].present? && params[:_type] == 'query'
|
12
12
|
index_search
|
13
13
|
else
|
14
14
|
super
|
@@ -27,6 +27,7 @@ module Olivander
|
|
27
27
|
orders = fields.join(', ')
|
28
28
|
self.resources = self.resources.where(clauses).order(orders) if clauses.length.positive?
|
29
29
|
end
|
30
|
+
self.resources = self.resources.limit(25)
|
30
31
|
end
|
31
32
|
|
32
33
|
def permitted_params
|
@@ -3,12 +3,12 @@ module Olivander
|
|
3
3
|
class ResourceAction
|
4
4
|
attr_accessor :sym, :action, :verb, :confirm, :turbo_frame, :collection,
|
5
5
|
:controller, :crud_action, :show_in_form, :show_in_datatable,
|
6
|
-
:no_route, :path_helper, :confirm_with
|
6
|
+
:no_route, :path_helper, :confirm_with, :primary
|
7
7
|
|
8
8
|
def initialize(sym, action: nil, controller: nil, verb: :get, confirm: false,
|
9
9
|
turbo_frame: nil, collection: false, crud_action: false,
|
10
10
|
show_in_form: true, show_in_datatable: true, no_route: false,
|
11
|
-
path_helper: nil, confirm_with: nil)
|
11
|
+
path_helper: nil, confirm_with: nil, primary: nil)
|
12
12
|
self.sym = sym
|
13
13
|
self.action = action || sym
|
14
14
|
self.controller = controller
|
@@ -22,6 +22,7 @@ module Olivander
|
|
22
22
|
self.no_route = no_route
|
23
23
|
self.path_helper = path_helper
|
24
24
|
self.confirm_with = confirm_with
|
25
|
+
self.primary = primary || crud_action
|
25
26
|
end
|
26
27
|
|
27
28
|
def args_hash(options = nil)
|
@@ -131,7 +132,7 @@ module Olivander
|
|
131
132
|
|
132
133
|
def action(sym, verb: :get, confirm: false, turbo_frame: nil, collection: false, show_in_datatable: true,
|
133
134
|
show_in_form: true, no_route: false, controller: nil, action: nil, path_helper: nil,
|
134
|
-
confirm_with: nil
|
135
|
+
confirm_with: nil, primary: nil
|
135
136
|
)
|
136
137
|
raise 'Must be invoked in a resource block' unless current_resource.present?
|
137
138
|
|
@@ -139,7 +140,7 @@ module Olivander
|
|
139
140
|
current_resource.actions << ResourceAction.new(
|
140
141
|
sym, action: action, controller: controller, verb: verb, confirm: confirm, turbo_frame: turbo_frame, collection: collection,
|
141
142
|
show_in_datatable: show_in_datatable, show_in_form: show_in_form, no_route: no_route, path_helper: path_helper,
|
142
|
-
confirm_with: confirm_with
|
143
|
+
confirm_with: confirm_with, primary: primary
|
143
144
|
)
|
144
145
|
end
|
145
146
|
|
@@ -73,6 +73,14 @@ module Olivander
|
|
73
73
|
render partial: 'resource_form_actions', locals: { actions: authorized_resource_actions(resource, for_action: for_action).select(&:show_in_form) }
|
74
74
|
end
|
75
75
|
|
76
|
+
def resource_form_action_tooltip(resource, action)
|
77
|
+
key = resource.class.name.underscore
|
78
|
+
return I18n.t("activerecord.actions.#{key}.#{action}-tooltip") if I18n.exists?("activerecord.actions.#{key}.#{action}-tooltip")
|
79
|
+
return I18n.t("activerecord.actions.#{action}-tooltip") if I18n.exists?("activerecord.actions.#{action}-tooltip")
|
80
|
+
|
81
|
+
action.to_s.titleize
|
82
|
+
end
|
83
|
+
|
76
84
|
def resource_form_action_label(resource, action)
|
77
85
|
key = resource.class.name.underscore
|
78
86
|
return I18n.t("activerecord.actions.#{key}.#{action}") if I18n.exists?("activerecord.actions.#{key}.#{action}")
|
@@ -95,7 +103,7 @@ module Olivander
|
|
95
103
|
end
|
96
104
|
|
97
105
|
def current_user
|
98
|
-
Olivander::CurrentContext.user
|
106
|
+
Olivander::CurrentContext.user
|
99
107
|
end
|
100
108
|
|
101
109
|
def current_ability
|
@@ -4,21 +4,27 @@
|
|
4
4
|
-# - data = a.turbo_frame.present? ? { turbo: true, turbo_frame: a.turbo_frame } : {}
|
5
5
|
-# = dropdown_link_to resource_form_action_label(resource, a.sym), path, data: data
|
6
6
|
- actions = authorized_resource_actions(resource, for_action: action_name).select{ |x| x.show_in_datatable }
|
7
|
-
-
|
8
|
-
-
|
7
|
+
- primary_actions = actions.select{ |a| a.primary }
|
8
|
+
- non_primary_actions = actions.select{ |a| !a.primary }
|
9
9
|
.btn-group
|
10
|
-
- if
|
10
|
+
- if non_primary_actions.size.positive?
|
11
11
|
.btn-group
|
12
12
|
%button.btn.btn-sm.dropdown-toggle{ type: :button, data: { toggle: 'dropdown' }}
|
13
13
|
%ul.dropdown-menu
|
14
|
-
-
|
14
|
+
- non_primary_actions.each do |a|
|
15
15
|
- path = a.path_helper.is_a?(Proc) ? a.path_helper.call(resource) : send(a.path_helper, resource.id)
|
16
|
-
-
|
16
|
+
- hash = {}
|
17
|
+
- data = a.turbo_frame.present? ? { turbo: true, turbo_frame: a.turbo_frame, turbo_method: a.verb } : {}
|
18
|
+
- hash[:data] = data
|
19
|
+
- hash[:method] = a.verb unless a.turbo_frame.present?
|
17
20
|
%li
|
18
|
-
= dropdown_link_to resource_form_action_label(resource, a.sym), path,
|
19
|
-
-
|
21
|
+
= dropdown_link_to resource_form_action_label(resource, a.sym), path, hash
|
22
|
+
- primary_actions.each do |a|
|
20
23
|
- path = a.path_helper.is_a?(Proc) ? a.path_helper.call(resource) : send(a.path_helper, resource.id)
|
21
24
|
- icon_class = (a.verb == :delete ? '' : '')
|
22
|
-
= link_to path, a.args_hash(title:
|
23
|
-
|
24
|
-
|
25
|
+
= link_to path, a.args_hash(title: resource_form_action_tooltip(resource, a.sym), class: "btn btn-sm #{icon_class}") do
|
26
|
+
- action_label = resource_form_action_label(resource, a.sym)
|
27
|
+
- icon_font_size = action_label.blank? ? '18px' : '10px'
|
28
|
+
%i{ class: resource_form_action_icon(resource, a.sym), style: "display: block; font-size: #{icon_font_size}" }
|
29
|
+
- unless action_label.blank?
|
30
|
+
%span{ style: 'font-size: 12px' }= action_label
|
@@ -101,20 +101,21 @@
|
|
101
101
|
-# %a.dropdown-item.dropdown-footer{:href => "#"} See All Notifications
|
102
102
|
%li.nav-item.dropdown.user-menu
|
103
103
|
%a.nav-link.dropdown-toggle{"data-toggle" => "dropdown", :href => "#"}
|
104
|
-
%img.user-image.img-circle.elevation-2{:alt => "User Image", :src => image_path(user_image_path(
|
104
|
+
%img.user-image.img-circle.elevation-2{:alt => "User Image", :src => image_path(user_image_path(Olivander::CurrentContext.user))}/
|
105
105
|
|
106
|
-
%span.d-none.d-md-inline=
|
106
|
+
%span.d-none.d-md-inline= Olivander::CurrentContext.user.display_name
|
107
107
|
%ul.dropdown-menu.dropdown-menu-lg.dropdown-menu-right
|
108
108
|
/ User image
|
109
109
|
%li.user-header.bg-primary
|
110
|
-
%img.img-circle.elevation-2{:alt => "User Image", src: image_path(user_image_path(
|
111
|
-
%p=
|
110
|
+
%img.img-circle.elevation-2{:alt => "User Image", src: image_path(user_image_path(Olivander::CurrentContext.user))}/
|
111
|
+
%p= Olivander::CurrentContext.user.display_name
|
112
112
|
/ Menu Footer
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
113
|
+
- unless Olivander::CurrentContext.user.is_a?(OpenStruct)
|
114
|
+
%li.user-footer
|
115
|
+
= link_to polymorphic_path(Olivander::CurrentContext.user), class: 'btn btn-default btn-flat' do
|
116
|
+
Profile
|
117
|
+
= link_to Olivander::CurrentContext.application_context.sign_out_path, method: :delete, class: 'btn btn-default btn-flat float-right' do
|
118
|
+
Sign out
|
118
119
|
%li.nav-item
|
119
120
|
%a.nav-link{title: 'Full Screen Mode', "data-widget" => "fullscreen", :href => "#", :role => "button"}
|
120
121
|
%i.fas.fa-expand-arrows-alt
|
@@ -11,7 +11,7 @@ module Olivander
|
|
11
11
|
begin
|
12
12
|
self.route_builder = RouteBuilder.new
|
13
13
|
rescue NameError
|
14
|
-
self.route_builder = OpenStruct.new(resources:
|
14
|
+
self.route_builder = OpenStruct.new(resources: {})
|
15
15
|
end
|
16
16
|
end
|
17
17
|
|
@@ -55,8 +55,30 @@ module Olivander
|
|
55
55
|
attribute :application_context
|
56
56
|
attribute :user, :ability
|
57
57
|
|
58
|
-
def
|
59
|
-
|
58
|
+
def build(&block)
|
59
|
+
self.application_context ||= ::Olivander::ApplicationContext.new
|
60
|
+
self.user ||= build_dummy_user
|
61
|
+
self.ability ||= build_dummy_ability
|
62
|
+
yield(self, application_context, user, ability) if block_given?
|
63
|
+
self
|
64
|
+
end
|
65
|
+
|
66
|
+
private
|
67
|
+
|
68
|
+
def build_dummy_user
|
69
|
+
OpenStruct.new({ display_name: 'No User Set' })
|
70
|
+
end
|
71
|
+
|
72
|
+
def build_dummy_ability
|
73
|
+
Class.new do
|
74
|
+
def can?(_action, _resource)
|
75
|
+
true
|
76
|
+
end
|
77
|
+
|
78
|
+
def authorize!(_action, _resource)
|
79
|
+
true
|
80
|
+
end
|
81
|
+
end.new
|
60
82
|
end
|
61
83
|
end
|
62
84
|
end
|
data/lib/olivander/version.rb
CHANGED
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.2.0.
|
4
|
+
version: 0.2.0.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Eric Dennis
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2024-02-
|
11
|
+
date: 2024-02-19 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: chartkick
|
@@ -175,6 +175,7 @@ files:
|
|
175
175
|
- app/assets/images/default-150x150.png
|
176
176
|
- app/assets/images/icons.png
|
177
177
|
- app/assets/javascripts/adminlte.js
|
178
|
+
- app/assets/javascripts/adminlte/datatable.fix.js
|
178
179
|
- app/assets/javascripts/adminlte/dist/css/adminlte.min.css
|
179
180
|
- app/assets/javascripts/adminlte/dist/js/adminlte.js
|
180
181
|
- app/assets/javascripts/adminlte/plugins/bootstrap/js/bootstrap.bundle.min.js
|