super 0.17.0 → 0.20.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +4 -4
- data/app/assets/javascripts/super/application.js +1260 -117
- data/app/assets/stylesheets/super/application.css +90711 -90034
- data/app/controllers/super/application_controller.rb +34 -4
- data/app/controllers/super/substructure_controller.rb +125 -29
- data/app/helpers/super/form_builder_helper.rb +4 -4
- data/app/views/layouts/super/application.html.erb +1 -1
- data/app/views/super/application/_batch_button.html.erb +12 -0
- data/app/views/super/application/_batch_checkbox.csv.erb +1 -0
- data/app/views/super/application/_batch_checkbox.html.erb +9 -0
- data/app/views/super/application/_batch_form.html.erb +3 -0
- data/app/views/super/application/_collection_header.html.erb +7 -6
- data/app/views/super/application/_csv_button.html.erb +25 -0
- data/app/views/super/application/_display_actions.html.erb +2 -2
- data/app/views/super/application/_form.html.erb +1 -1
- data/app/views/super/application/_layout.html.erb +13 -14
- data/app/views/super/application/_link.html.erb +8 -0
- data/app/views/super/application/_member_header.html.erb +7 -7
- data/app/views/super/application/_pagination.html.erb +2 -4
- data/app/views/super/application/_site_footer.html.erb +1 -1
- data/app/views/super/application/_site_header.html.erb +4 -4
- data/app/views/super/application/_view_chain.html.erb +5 -0
- data/app/views/super/application/index.csv.erb +14 -0
- data/config/locales/en.yml +15 -1
- data/frontend/super-frontend/dist/application.css +90711 -90034
- data/frontend/super-frontend/dist/application.js +6512 -5379
- data/frontend/super-frontend/dist/package.json +13 -0
- data/lib/generators/super/webpacker/USAGE +1 -7
- data/lib/generators/super/webpacker/templates/pack_super_application.js.tt +2 -0
- data/lib/generators/super/webpacker/webpacker_generator.rb +10 -6
- data/lib/super/action_inquirer.rb +3 -0
- data/lib/super/cheat.rb +1 -0
- data/lib/super/display/schema_types.rb +6 -0
- data/lib/super/display.rb +2 -1
- data/lib/super/engine.rb +5 -0
- data/lib/super/error.rb +11 -0
- data/lib/super/form/schema_types.rb +8 -36
- data/lib/super/form_builder/action_text_methods.rb +16 -0
- data/lib/super/form_builder/base_methods.rb +73 -0
- data/lib/super/form_builder/flatpickr_methods.rb +75 -0
- data/lib/super/form_builder/option_methods.rb +73 -0
- data/lib/super/form_builder.rb +143 -0
- data/lib/super/layout.rb +9 -33
- data/lib/super/link.rb +49 -70
- data/lib/super/link_builder.rb +24 -47
- data/lib/super/packaged_asset.rb +49 -0
- data/lib/super/pagination.rb +2 -1
- data/lib/super/reorderable_hash.rb +88 -0
- data/lib/super/reset.rb +20 -1
- data/lib/super/useful/i19.rb +35 -0
- data/lib/super/version.rb +1 -1
- data/lib/super/view_chain.rb +25 -0
- data/lib/super.rb +9 -1
- metadata +55 -10
- data/lib/generators/super/webpacker/templates/pack_super_application.js.erb.tt +0 -2
- data/lib/super/form/builder.rb +0 -289
data/lib/super/link.rb
CHANGED
@@ -9,75 +9,43 @@ module Super
|
|
9
9
|
end
|
10
10
|
|
11
11
|
def self.find(link)
|
12
|
-
if link.kind_of?(self)
|
13
|
-
return link
|
14
|
-
end
|
15
|
-
|
16
12
|
if registry.key?(link)
|
17
|
-
|
13
|
+
found = registry[link]
|
14
|
+
|
15
|
+
if found.is_a?(LinkBuilder)
|
16
|
+
return found.dup
|
17
|
+
else
|
18
|
+
return found
|
19
|
+
end
|
18
20
|
end
|
19
21
|
|
20
22
|
raise Error::LinkNotRegistered, "Unknown link `#{link}`"
|
21
23
|
end
|
22
24
|
|
23
25
|
def self.registry
|
24
|
-
@registry ||= {
|
25
|
-
new
|
26
|
-
"
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
}
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
-> (record:, params:) {
|
48
|
-
{
|
49
|
-
controller: params[:controller],
|
50
|
-
action: :show,
|
51
|
-
id: record,
|
52
|
-
only_path: true
|
53
|
-
}
|
54
|
-
}
|
55
|
-
),
|
56
|
-
edit: LinkBuilder.new(
|
57
|
-
"Edit",
|
58
|
-
-> (record:, params:) {
|
59
|
-
{
|
60
|
-
controller: params[:controller],
|
61
|
-
action: :edit,
|
62
|
-
id: record,
|
63
|
-
only_path: true
|
64
|
-
}
|
65
|
-
}
|
66
|
-
),
|
67
|
-
destroy: LinkBuilder.new(
|
68
|
-
"Delete",
|
69
|
-
-> (record:, params:) {
|
70
|
-
{
|
71
|
-
controller: params[:controller],
|
72
|
-
action: :destroy,
|
73
|
-
id: record,
|
74
|
-
only_path: true
|
75
|
-
}
|
76
|
-
},
|
77
|
-
method: :delete,
|
78
|
-
data: { confirm: "Really delete?" }
|
79
|
-
),
|
80
|
-
}
|
26
|
+
@registry ||= {}.tap do |reg|
|
27
|
+
reg[:new] = LinkBuilder.new
|
28
|
+
.text { |params:| Super::Useful::I19.i18n_with_fallback("super", params[:controller].split("/"), "actions.new") }
|
29
|
+
.href { |params:| { controller: params[:controller], action: :new, only_path: true } }
|
30
|
+
.freeze
|
31
|
+
reg[:index] = LinkBuilder.new
|
32
|
+
.text { |params:| Super::Useful::I19.i18n_with_fallback("super", params[:controller].split("/"), "actions.index") }
|
33
|
+
.href { |params:| { controller: params[:controller], action: :index, only_path: true } }
|
34
|
+
.freeze
|
35
|
+
reg[:show] = LinkBuilder.new
|
36
|
+
.text { |params:, **| Super::Useful::I19.i18n_with_fallback("super", params[:controller].split("/"), "actions.show") }
|
37
|
+
.href { |params:, record:| { controller: params[:controller], action: :show, id: record, only_path: true } }
|
38
|
+
.freeze
|
39
|
+
reg[:edit] = LinkBuilder.new
|
40
|
+
.text { |params:, **| Super::Useful::I19.i18n_with_fallback("super", params[:controller].split("/"), "actions.edit") }
|
41
|
+
.href { |params:, record:| { controller: params[:controller], action: :edit, id: record, only_path: true } }
|
42
|
+
.freeze
|
43
|
+
reg[:destroy] = LinkBuilder.new
|
44
|
+
.text { |params:, **| Super::Useful::I19.i18n_with_fallback("super", params[:controller].split("/"), "actions.destroy") }
|
45
|
+
.href { |params:, record:| { controller: params[:controller], action: :destroy, id: record, only_path: true } }
|
46
|
+
.options { |**| { method: :delete, data: { confirm: "Really delete?" } } }
|
47
|
+
.freeze
|
48
|
+
end
|
81
49
|
end
|
82
50
|
|
83
51
|
def self.polymorphic_parts(*parts_tail)
|
@@ -85,15 +53,31 @@ module Super
|
|
85
53
|
parts_head.map { |part| part.is_a?(String) ? part.to_sym : part } + parts_tail
|
86
54
|
end
|
87
55
|
|
56
|
+
# The first argument should be the text of the link. If it's an array,
|
57
|
+
# it'll send it directly into `I18n.t`
|
88
58
|
def initialize(text, href, **options)
|
89
59
|
@text = text
|
90
60
|
@href = href
|
91
61
|
@options = options
|
92
62
|
end
|
93
63
|
|
94
|
-
attr_reader :text
|
95
64
|
attr_reader :options
|
96
65
|
|
66
|
+
def text
|
67
|
+
if @text.is_a?(Array)
|
68
|
+
*head, tail = @text
|
69
|
+
if !tail.is_a?(Hash)
|
70
|
+
head.push(tail)
|
71
|
+
tail = {}
|
72
|
+
end
|
73
|
+
|
74
|
+
@text = I18n.t(*head, **tail)
|
75
|
+
return @text
|
76
|
+
end
|
77
|
+
|
78
|
+
@text
|
79
|
+
end
|
80
|
+
|
97
81
|
def href
|
98
82
|
if @href.is_a?(String)
|
99
83
|
return @href
|
@@ -107,13 +91,8 @@ module Super
|
|
107
91
|
@href = Super::Compatability.polymorphic_path_container.polymorphic_path(@href)
|
108
92
|
end
|
109
93
|
|
110
|
-
def
|
111
|
-
|
112
|
-
ActionController::Base.helpers.link_to(
|
113
|
-
text,
|
114
|
-
href,
|
115
|
-
default_options.deep_merge(options)
|
116
|
-
)
|
94
|
+
def to_partial_path
|
95
|
+
"link"
|
117
96
|
end
|
118
97
|
|
119
98
|
def ==(other)
|
data/lib/super/link_builder.rb
CHANGED
@@ -2,57 +2,34 @@
|
|
2
2
|
|
3
3
|
module Super
|
4
4
|
class LinkBuilder
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
end
|
18
|
-
end
|
19
|
-
|
20
|
-
attr_reader :requirements
|
21
|
-
|
22
|
-
def to_s(default_options: nil, **kwargs)
|
23
|
-
resolve(**kwargs).to_s(default_options: default_options)
|
5
|
+
%i[text href options].each do |method_name|
|
6
|
+
class_eval(<<~RUBY, __FILE__, __LINE__ + 1)
|
7
|
+
def #{method_name}(&block)
|
8
|
+
@#{method_name} = block
|
9
|
+
self
|
10
|
+
end
|
11
|
+
|
12
|
+
def process_#{method_name}(&block)
|
13
|
+
@process_#{method_name} = block
|
14
|
+
self
|
15
|
+
end
|
16
|
+
RUBY
|
24
17
|
end
|
25
18
|
|
26
19
|
def resolve(**kwargs)
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
20
|
+
raise Super::Error::IncompleteBuilder, "LinkBuilder requires that #text is set" if @text.nil?
|
21
|
+
raise Super::Error::IncompleteBuilder, "LinkBuilder requires that #href is set" if @href.nil?
|
22
|
+
|
23
|
+
@options ||= -> (**) { {} }
|
24
|
+
@process_text ||= -> (t) { t }
|
25
|
+
@process_href ||= -> (h) { h }
|
26
|
+
@process_options ||= -> (o) { o }
|
27
|
+
|
28
|
+
Super::Link.new(
|
29
|
+
@process_text.call(@text.call(**kwargs)),
|
30
|
+
@process_href.call(@href.call(**kwargs)),
|
31
|
+
**@process_options.call(@options.call(**kwargs))
|
31
32
|
)
|
32
33
|
end
|
33
|
-
|
34
|
-
private
|
35
|
-
|
36
|
-
def known_requirements
|
37
|
-
%i[params record].freeze
|
38
|
-
end
|
39
|
-
|
40
|
-
def gather_requirements(value_or_proc)
|
41
|
-
return [] if !value_or_proc.is_a?(Proc)
|
42
|
-
|
43
|
-
requirements =
|
44
|
-
value_or_proc
|
45
|
-
.parameters
|
46
|
-
.select { |(kind, name)| kind = :keyreq }
|
47
|
-
.map(&:last)
|
48
|
-
end
|
49
|
-
|
50
|
-
def into_value(value_or_proc, kwargs)
|
51
|
-
if value_or_proc.kind_of?(Proc)
|
52
|
-
value_or_proc.call(**kwargs)
|
53
|
-
else
|
54
|
-
value_or_proc
|
55
|
-
end
|
56
|
-
end
|
57
34
|
end
|
58
35
|
end
|
@@ -0,0 +1,49 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Super
|
4
|
+
class PackagedAsset
|
5
|
+
VERSION_BEGINNING = /\A\d+\.\d+.\d+/.freeze
|
6
|
+
|
7
|
+
class << self
|
8
|
+
attr_accessor :warning_message
|
9
|
+
end
|
10
|
+
|
11
|
+
def self.comparable_super_version
|
12
|
+
::Super::VERSION[VERSION_BEGINNING]
|
13
|
+
end
|
14
|
+
|
15
|
+
def self.version_matches_gem?(package_json_path)
|
16
|
+
return true if ENV.key?("SUPER_IGNORE_PACKAGE_JSON_VERSION")
|
17
|
+
|
18
|
+
asset = new(package_json_path)
|
19
|
+
|
20
|
+
return true if !asset.comparable_version
|
21
|
+
|
22
|
+
asset.comparable_version == comparable_super_version
|
23
|
+
end
|
24
|
+
|
25
|
+
def initialize(package_json_path)
|
26
|
+
@package_json_path = package_json_path
|
27
|
+
end
|
28
|
+
|
29
|
+
def full_version
|
30
|
+
if instance_variable_defined?(:@full_version)
|
31
|
+
return @full_version
|
32
|
+
end
|
33
|
+
|
34
|
+
@full_version = JSON.parse(@package_json_path.read).dig("dependencies", "@superadministration/super")
|
35
|
+
rescue
|
36
|
+
@full_version = nil
|
37
|
+
end
|
38
|
+
|
39
|
+
def comparable_version
|
40
|
+
if instance_variable_defined?(:@asset_version)
|
41
|
+
return @asset_version
|
42
|
+
end
|
43
|
+
|
44
|
+
@asset_version = full_version[VERSION_BEGINNING]
|
45
|
+
rescue
|
46
|
+
@asset_version = nil
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
data/lib/super/pagination.rb
CHANGED
@@ -76,9 +76,10 @@ module Super
|
|
76
76
|
module ControllerMethods
|
77
77
|
def index
|
78
78
|
super
|
79
|
+
return if !@records
|
79
80
|
@pagination = initialize_pagination
|
80
81
|
@records = paginate_records
|
81
|
-
@view.
|
82
|
+
@view.main.insert(:pagination, @pagination, before: :main)
|
82
83
|
end
|
83
84
|
end
|
84
85
|
end
|
@@ -0,0 +1,88 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Super
|
4
|
+
class ReorderableHash
|
5
|
+
include TSort
|
6
|
+
include Enumerable
|
7
|
+
|
8
|
+
UNDEFINED = BasicObject.new
|
9
|
+
|
10
|
+
def initialize(data = {})
|
11
|
+
@data = data
|
12
|
+
@ordering = {}
|
13
|
+
keys = @data.keys
|
14
|
+
dependencies = []
|
15
|
+
keys.each do |key|
|
16
|
+
@ordering[key] = dependencies.dup
|
17
|
+
dependencies.push(key)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
def insert(key, value, before: UNDEFINED, after: UNDEFINED)
|
22
|
+
if @ordering.key?(key) || @data.key?(key)
|
23
|
+
raise Super::Error::ReorderableHash::DuplicateKey, "Duplicate key: #{key}"
|
24
|
+
end
|
25
|
+
@ordering[key] = []
|
26
|
+
@data[key] = value
|
27
|
+
|
28
|
+
order(key, before: before, after: after)
|
29
|
+
|
30
|
+
nil
|
31
|
+
end
|
32
|
+
|
33
|
+
def order(key, before: UNDEFINED, after: UNDEFINED)
|
34
|
+
if before != UNDEFINED
|
35
|
+
if !@ordering.key?(before)
|
36
|
+
raise KeyError, "Before key not found. Have: #{@data.keys} Requested: #{before}"
|
37
|
+
end
|
38
|
+
@ordering[before].push(key)
|
39
|
+
end
|
40
|
+
|
41
|
+
if after != UNDEFINED
|
42
|
+
if !@ordering.key?(after)
|
43
|
+
raise KeyError, "After key not found. Have: #{@data.keys} Requested: #{after}"
|
44
|
+
end
|
45
|
+
@ordering[key].push(after)
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
def tsort_each_node(&block)
|
50
|
+
@ordering.each_key(&block)
|
51
|
+
end
|
52
|
+
|
53
|
+
def tsort_each_child(node, &block)
|
54
|
+
dependencies = @ordering.fetch(node) { [] }
|
55
|
+
dependencies.each(&block)
|
56
|
+
end
|
57
|
+
|
58
|
+
def []=(key, where, value)
|
59
|
+
insert(key, value, **where)
|
60
|
+
end
|
61
|
+
|
62
|
+
def keys
|
63
|
+
tsort
|
64
|
+
end
|
65
|
+
|
66
|
+
def values
|
67
|
+
keys.each_with_object([]) do |key, array|
|
68
|
+
array.push(@data[key])
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
def to_h
|
73
|
+
keys.each_with_object({}) do |key, hash|
|
74
|
+
hash[key] = @data[key]
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
def each
|
79
|
+
if !block_given?
|
80
|
+
return enum_for(:each)
|
81
|
+
end
|
82
|
+
|
83
|
+
tsort_each do |key|
|
84
|
+
yield key, @data[key]
|
85
|
+
end
|
86
|
+
end
|
87
|
+
end
|
88
|
+
end
|
data/lib/super/reset.rb
CHANGED
@@ -4,6 +4,20 @@ module Super
|
|
4
4
|
module Reset
|
5
5
|
extend ActiveSupport::Concern
|
6
6
|
|
7
|
+
KEEP = {
|
8
|
+
# Defined by Rails
|
9
|
+
_layout: true,
|
10
|
+
_generate_paths_by_default: true,
|
11
|
+
|
12
|
+
# Defined in Super::SubstructureController
|
13
|
+
navigation: true,
|
14
|
+
page_title: true,
|
15
|
+
|
16
|
+
# Defined in Super::ApplicationController
|
17
|
+
current_action: true,
|
18
|
+
with_current_action: true,
|
19
|
+
}
|
20
|
+
|
7
21
|
included do
|
8
22
|
undef_method :index
|
9
23
|
undef_method :show
|
@@ -14,7 +28,12 @@ module Super
|
|
14
28
|
undef_method :destroy
|
15
29
|
|
16
30
|
Super::SubstructureController.private_instance_methods(false).each do |imethod|
|
17
|
-
next if imethod
|
31
|
+
next if KEEP.key?(imethod)
|
32
|
+
undef_method imethod
|
33
|
+
end
|
34
|
+
|
35
|
+
Super::ApplicationController.private_instance_methods(false).each do |imethod|
|
36
|
+
next if KEEP.key?(imethod)
|
18
37
|
undef_method imethod
|
19
38
|
end
|
20
39
|
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Super
|
4
|
+
module Useful
|
5
|
+
module I19
|
6
|
+
module_function
|
7
|
+
|
8
|
+
def build_chain(prefix, optional, suffix)
|
9
|
+
prefix = Array(prefix)
|
10
|
+
optional = Array(optional)
|
11
|
+
suffix = Array(suffix)
|
12
|
+
|
13
|
+
result = []
|
14
|
+
|
15
|
+
(optional.size + 1).times do
|
16
|
+
lookup = [prefix, optional, suffix].flatten.join(".").to_sym
|
17
|
+
result.push(lookup)
|
18
|
+
optional.pop
|
19
|
+
end
|
20
|
+
|
21
|
+
result
|
22
|
+
end
|
23
|
+
|
24
|
+
def chain_to_i18n(chain)
|
25
|
+
head, *tail = chain
|
26
|
+
|
27
|
+
[head, { default: tail }]
|
28
|
+
end
|
29
|
+
|
30
|
+
def i18n_with_fallback(prefix, optional, suffix)
|
31
|
+
chain_to_i18n(build_chain(prefix, optional, suffix))
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
data/lib/super/version.rb
CHANGED
@@ -0,0 +1,25 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Super
|
4
|
+
class ViewChain
|
5
|
+
def initialize(chain)
|
6
|
+
@data = ReorderableHash.new(chain)
|
7
|
+
end
|
8
|
+
|
9
|
+
def chain
|
10
|
+
@chain ||= @data.values
|
11
|
+
end
|
12
|
+
|
13
|
+
def insert(*args, **kwargs)
|
14
|
+
if instance_variable_defined?(:@chain)
|
15
|
+
raise Error::ViewChain::ChainAlreadyStarted
|
16
|
+
end
|
17
|
+
|
18
|
+
@data.insert(*args, **kwargs)
|
19
|
+
end
|
20
|
+
|
21
|
+
def to_partial_path
|
22
|
+
"view_chain"
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
data/lib/super.rb
CHANGED
@@ -7,6 +7,7 @@ require "rails/engine"
|
|
7
7
|
require "super/schema/common"
|
8
8
|
require "super/useful/builder"
|
9
9
|
require "super/useful/enum"
|
10
|
+
require "super/useful/i19"
|
10
11
|
|
11
12
|
require "super/action_inquirer"
|
12
13
|
require "super/assets"
|
@@ -24,26 +25,33 @@ require "super/filter/guesser"
|
|
24
25
|
require "super/filter/operator"
|
25
26
|
require "super/filter/schema_types"
|
26
27
|
require "super/form"
|
27
|
-
require "super/form/builder"
|
28
28
|
require "super/form/field_transcript"
|
29
29
|
require "super/form/guesser"
|
30
30
|
require "super/form/inline_errors"
|
31
31
|
require "super/form/schema_types"
|
32
32
|
require "super/form/strong_params"
|
33
|
+
require "super/form_builder"
|
34
|
+
require "super/form_builder/action_text_methods"
|
35
|
+
require "super/form_builder/base_methods"
|
36
|
+
require "super/form_builder/flatpickr_methods"
|
37
|
+
require "super/form_builder/option_methods"
|
33
38
|
require "super/layout"
|
34
39
|
require "super/link"
|
35
40
|
require "super/link_builder"
|
36
41
|
require "super/navigation"
|
42
|
+
require "super/packaged_asset"
|
37
43
|
require "super/pagination"
|
38
44
|
require "super/panel"
|
39
45
|
require "super/partial"
|
40
46
|
require "super/plugin"
|
41
47
|
require "super/query/form_object"
|
48
|
+
require "super/reorderable_hash"
|
42
49
|
require "super/reset"
|
43
50
|
require "super/schema"
|
44
51
|
require "super/schema/guesser"
|
45
52
|
require "super/sort"
|
46
53
|
require "super/version"
|
54
|
+
require "super/view_chain"
|
47
55
|
require "super/view_helper"
|
48
56
|
|
49
57
|
require "super/engine"
|