katalyst-tables 2.2.1 → 2.2.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/app/assets/javascripts/controllers/tables/orderable/form_controller.js +11 -5
- data/app/assets/javascripts/controllers/tables/orderable/item_controller.js +5 -2
- data/app/assets/javascripts/controllers/tables/orderable/list_controller.js +2 -2
- data/app/components/concerns/katalyst/tables/has_table_content.rb +1 -1
- data/app/components/concerns/katalyst/tables/orderable.rb +49 -22
- data/app/components/concerns/katalyst/tables/turbo_replaceable.rb +24 -7
- data/app/components/katalyst/turbo/table_component.rb +4 -4
- data/lib/katalyst/tables/version.rb +1 -1
- metadata +1 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 6b8413e971a3164d1ab1fa688a20ce34e1f25768da7650565d9f600e1612a80e
|
4
|
+
data.tar.gz: d14455c86030073e293aafbaaf86a4da483be27912cca5a8d46cc43cc3a532b8
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 5825f4058bc40aa823dbdd0719d8738a5fa4e4738442438c7e0c86ae9942cb5fc163d19b7754eb27b1abd061699dccfd79b249c93ceef8ce3605c101a4262522
|
7
|
+
data.tar.gz: ed4ccfa22d6342eff7c6f0a84ac6c28472263c249846594d794492c40c2b2a8bd9265f26fe897cb5a331c489b2b2d5caf59da98619ad16763a8a4dd4e8124f05
|
@@ -1,20 +1,26 @@
|
|
1
1
|
import { Controller } from "@hotwired/stimulus";
|
2
2
|
|
3
3
|
export default class OrderableFormController extends Controller {
|
4
|
-
add(
|
4
|
+
add(item, index) {
|
5
|
+
const { id_name, id_value, index_name } = item.paramsValue;
|
5
6
|
this.element.insertAdjacentHTML(
|
6
7
|
"beforeend",
|
7
|
-
`<input type="hidden" name="${
|
8
|
+
`<input type="hidden" name="${id_name}" value="${id_value}" data-generated>
|
9
|
+
<input type="hidden" name="${index_name}" value="${index}" data-generated>`,
|
8
10
|
);
|
9
11
|
}
|
10
12
|
|
11
13
|
submit() {
|
14
|
+
if (this.inputs.length === 0) return;
|
15
|
+
|
12
16
|
this.element.requestSubmit();
|
13
17
|
}
|
14
18
|
|
15
19
|
clear() {
|
16
|
-
this.
|
17
|
-
|
18
|
-
|
20
|
+
this.inputs.forEach((input) => input.remove());
|
21
|
+
}
|
22
|
+
|
23
|
+
get inputs() {
|
24
|
+
return this.element.querySelectorAll("input[data-generated]");
|
19
25
|
}
|
20
26
|
}
|
@@ -2,7 +2,10 @@ import { Controller } from "@hotwired/stimulus";
|
|
2
2
|
|
3
3
|
export default class OrderableRowController extends Controller {
|
4
4
|
static values = {
|
5
|
-
|
6
|
-
value: Number,
|
5
|
+
params: Object,
|
7
6
|
};
|
7
|
+
|
8
|
+
get index() {
|
9
|
+
return this.paramsValue.index_value;
|
10
|
+
}
|
8
11
|
}
|
@@ -41,8 +41,8 @@ export default class OrderableListController extends Controller {
|
|
41
41
|
|
42
42
|
// insert any items that have changed position
|
43
43
|
this.tablesOrderableItemOutlets.forEach((item, index) => {
|
44
|
-
if (item.
|
45
|
-
this.tablesOrderableFormOutlet.add(item
|
44
|
+
if (item.index !== index) {
|
45
|
+
this.tablesOrderableFormOutlet.add(item, index);
|
46
46
|
}
|
47
47
|
});
|
48
48
|
|
@@ -26,7 +26,7 @@ module Katalyst
|
|
26
26
|
def row_partial(row, record = nil)
|
27
27
|
partial = @partial || model_name&.param_key&.to_s
|
28
28
|
as = @as || model_name&.param_key&.to_sym
|
29
|
-
render(partial: partial, variants: [:row], locals: { as => record, row: row })
|
29
|
+
render(partial: partial, variants: [:row], formats: [:html], locals: { as => record, row: row })
|
30
30
|
end
|
31
31
|
end
|
32
32
|
end
|
@@ -13,32 +13,30 @@ module Katalyst
|
|
13
13
|
|
14
14
|
using HasHtmlAttributes
|
15
15
|
|
16
|
-
#
|
17
|
-
#
|
18
|
-
|
16
|
+
# Support for inclusion in a table component class
|
17
|
+
# Adds an `orderable` slot and component configuration
|
18
|
+
included do
|
19
19
|
# Add `orderable` slot to table component
|
20
|
-
|
21
|
-
|
20
|
+
config_component :orderable, default: "Katalyst::Tables::Orderable::FormComponent"
|
21
|
+
renders_one(:orderable, lambda do |**attrs|
|
22
22
|
orderable_component.new(table: self, **attrs)
|
23
23
|
end)
|
24
24
|
end
|
25
25
|
|
26
|
-
# Support for inclusion in a table component class
|
27
|
-
included do
|
28
|
-
Orderable.make_orderable(self)
|
29
|
-
end
|
30
|
-
|
31
26
|
# Support for extending a table component instance
|
27
|
+
# Adds methods to the table component instance
|
32
28
|
def self.extended(table)
|
33
|
-
|
29
|
+
table.extend(TableMethods)
|
30
|
+
|
31
|
+
# ensure row components support orderable column calls
|
32
|
+
table.send(:add_orderable_columns)
|
34
33
|
end
|
35
34
|
|
36
35
|
def initialize(**attributes)
|
37
36
|
super
|
38
37
|
|
39
|
-
#
|
40
|
-
|
41
|
-
body_row_component.include(BodyRow)
|
38
|
+
# ensure row components support orderable column calls
|
39
|
+
add_orderable_columns
|
42
40
|
end
|
43
41
|
|
44
42
|
def tbody_attributes
|
@@ -57,6 +55,31 @@ module Katalyst
|
|
57
55
|
)
|
58
56
|
end
|
59
57
|
|
58
|
+
private
|
59
|
+
|
60
|
+
# Add `orderable` columns to row components
|
61
|
+
def add_orderable_columns
|
62
|
+
header_row_component.include(HeaderRow)
|
63
|
+
body_row_component.include(BodyRow)
|
64
|
+
end
|
65
|
+
|
66
|
+
# Methods required to emulate a slot when extending an existing table.
|
67
|
+
module TableMethods
|
68
|
+
def with_orderable(**attrs)
|
69
|
+
@orderable = FormComponent.new(table: self, **attrs)
|
70
|
+
|
71
|
+
self
|
72
|
+
end
|
73
|
+
|
74
|
+
def orderable?
|
75
|
+
@orderable.present?
|
76
|
+
end
|
77
|
+
|
78
|
+
def orderable
|
79
|
+
@orderable
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
60
83
|
module HeaderRow # :nodoc:
|
61
84
|
def ordinal(attribute = :ordinal, **)
|
62
85
|
cell(attribute, class: "ordinal", label: "")
|
@@ -64,13 +87,17 @@ module Katalyst
|
|
64
87
|
end
|
65
88
|
|
66
89
|
module BodyRow # :nodoc:
|
67
|
-
def ordinal(attribute = :ordinal,
|
68
|
-
|
69
|
-
|
90
|
+
def ordinal(attribute = :ordinal, primary_key: :id)
|
91
|
+
id = @record.public_send(primary_key)
|
92
|
+
params = {
|
93
|
+
id_name: @table.orderable.record_scope(id, primary_key),
|
94
|
+
id_value: id,
|
95
|
+
index_name: @table.orderable.record_scope(id, attribute),
|
96
|
+
index_value: @record.public_send(attribute),
|
97
|
+
}
|
70
98
|
cell(attribute, class: "ordinal", data: {
|
71
|
-
controller:
|
72
|
-
"#{ITEM_CONTROLLER}-
|
73
|
-
"#{ITEM_CONTROLLER}-value-value" => value,
|
99
|
+
controller: ITEM_CONTROLLER,
|
100
|
+
"#{ITEM_CONTROLLER}-params-value": params.to_json,
|
74
101
|
}) { t("katalyst.tables.orderable.value") }
|
75
102
|
end
|
76
103
|
|
@@ -98,8 +125,8 @@ module Katalyst
|
|
98
125
|
@scope = scope
|
99
126
|
end
|
100
127
|
|
101
|
-
def record_scope(
|
102
|
-
"#{scope}[#{
|
128
|
+
def record_scope(id, attribute)
|
129
|
+
"#{scope}[#{id}][#{attribute}]"
|
103
130
|
end
|
104
131
|
|
105
132
|
def call
|
@@ -13,10 +13,16 @@ module Katalyst
|
|
13
13
|
|
14
14
|
include ::Turbo::StreamsHelper
|
15
15
|
|
16
|
+
# Is turbo rendering enabled for this component?
|
16
17
|
def turbo?
|
17
18
|
@turbo
|
18
19
|
end
|
19
20
|
|
21
|
+
# Are we rendering a turbo stream response?
|
22
|
+
def turbo_stream_response?
|
23
|
+
response.media_type.eql?("text/vnd.turbo-stream.html")
|
24
|
+
end
|
25
|
+
|
20
26
|
def initialize(turbo: true, **options)
|
21
27
|
super(**options)
|
22
28
|
|
@@ -44,16 +50,27 @@ module Katalyst
|
|
44
50
|
super
|
45
51
|
|
46
52
|
redefinition_lock.synchronize do
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
53
|
+
# Capture the instance method added by the default compiler and
|
54
|
+
# wrap it in a turbo stream replacement. Take care to ensure that
|
55
|
+
# subclasses of this component don't break delegation, as each
|
56
|
+
# subclass of ViewComponent::Base defines its own version of this
|
57
|
+
# method.
|
58
|
+
vc_render_template = component_class.instance_method(:render_template_for)
|
59
|
+
component_class.define_method(:render_template_for) do |variant = nil|
|
60
|
+
# VC discards the output from this method and uses the buffer
|
61
|
+
# if both are set. Capture and wrap the output.
|
62
|
+
content = capture { vc_render_template.bind_call(self, variant) }
|
63
|
+
# In turbo mode, replace the inner-most element using a turbo
|
64
|
+
# stream. Note that we only want one turbo stream per component
|
65
|
+
# from this mechanism, as subclasses may want to concat their
|
66
|
+
# own additional streams.
|
67
|
+
if turbo? && turbo_stream_response? && !@streamed
|
68
|
+
@streamed = true
|
69
|
+
concat(turbo_stream.replace(id, content))
|
52
70
|
else
|
53
|
-
|
71
|
+
concat(content)
|
54
72
|
end
|
55
73
|
end
|
56
|
-
RUBY
|
57
74
|
end
|
58
75
|
end
|
59
76
|
end
|
@@ -7,6 +7,8 @@ module Katalyst
|
|
7
7
|
class TableComponent < ::Katalyst::TableComponent
|
8
8
|
include Tables::TurboReplaceable
|
9
9
|
|
10
|
+
attr_reader :id
|
11
|
+
|
10
12
|
def initialize(collection:, id:, header: true, **options)
|
11
13
|
header = if header.is_a?(Hash)
|
12
14
|
default_header_options.merge(header)
|
@@ -14,11 +16,9 @@ module Katalyst
|
|
14
16
|
default_header_options
|
15
17
|
end
|
16
18
|
|
17
|
-
|
18
|
-
end
|
19
|
+
@id = id
|
19
20
|
|
20
|
-
|
21
|
-
html_attributes[:id]
|
21
|
+
super(collection: collection, header: header, id: id, **options)
|
22
22
|
end
|
23
23
|
|
24
24
|
private
|