turbo_boost-elements 0.0.1 → 0.0.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gemfile.lock +16 -16
- data/README.md +13 -10
- data/app/assets/builds/@turbo-boost/elements.js +10 -10
- data/app/assets/builds/@turbo-boost/elements.js.map +4 -4
- data/app/commands/turbo_boost/elements/application_command.rb +0 -30
- data/app/commands/turbo_boost/elements/toggle_command.rb +33 -3
- data/app/helpers/turbo_boost/elements/application_helper.rb +3 -10
- data/app/javascript/devtools/toggle.js +0 -1
- data/bin/standardize +1 -1
- data/lib/turbo_boost/elements/engine.rb +3 -2
- data/lib/turbo_boost/elements/tag_builders/base_tag_builder.rb +0 -15
- data/lib/turbo_boost/elements/tag_builders/toggle_tags_builder.rb +5 -7
- data/lib/turbo_boost/elements/version.rb +1 -1
- data/package.json +16 -4
- data/tags +1971 -3548
- data/turbo_boost-elements.gemspec +1 -1
- data/yarn.lock +158 -158
- metadata +4 -4
@@ -1,34 +1,4 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
class TurboBoost::Elements::ApplicationCommand < TurboBoost::Commands::Command
|
4
|
-
protected
|
5
|
-
|
6
|
-
def render_payload
|
7
|
-
return {} if element.renders.blank?
|
8
|
-
@render_payload ||= {partial: idomatic_partial_path(element.renders)}.tap do |payload|
|
9
|
-
if element.assigns.present?
|
10
|
-
payload[:assigns] = JSON.parse(element.assigns)
|
11
|
-
payload[:assigns].each { |key, value| payload[:assigns][key] = hydrate_value(value) }
|
12
|
-
end
|
13
|
-
if element.locals.present?
|
14
|
-
payload[:locals] = JSON.parse(element.locals)
|
15
|
-
payload[:locals].each { |key, value| payload[:locals][key] = hydrate_value(value) }
|
16
|
-
end
|
17
|
-
end.deep_symbolize_keys
|
18
|
-
end
|
19
|
-
|
20
|
-
private
|
21
|
-
|
22
|
-
def hydrate_value(value)
|
23
|
-
hydrated = begin
|
24
|
-
GlobalID::Locator.locate_signed(value)
|
25
|
-
rescue
|
26
|
-
value
|
27
|
-
end
|
28
|
-
hydrated.blank? ? nil : hydrated
|
29
|
-
end
|
30
|
-
|
31
|
-
def idomatic_partial_path(partial_path)
|
32
|
-
partial_path.to_s.gsub("/_", "/").split(".").first
|
33
|
-
end
|
34
4
|
end
|
@@ -4,21 +4,51 @@ class TurboBoost::Elements::ToggleCommand < TurboBoost::Elements::ApplicationCom
|
|
4
4
|
prevent_controller_action
|
5
5
|
|
6
6
|
def show
|
7
|
-
|
7
|
+
validate_element!
|
8
|
+
|
9
|
+
if element.remember?
|
8
10
|
state[element.aria.controls] = true
|
9
11
|
else
|
10
12
|
state.now[element.aria.controls] = true
|
11
13
|
end
|
12
14
|
|
13
|
-
morph
|
15
|
+
morph id: element.morphs, html: render(element.render_options)
|
14
16
|
end
|
15
17
|
|
16
18
|
def hide
|
19
|
+
validate_element!
|
17
20
|
state[element.aria.controls] = false
|
18
|
-
morph
|
21
|
+
morph id: element.morphs, html: render(element.render_options)
|
19
22
|
end
|
20
23
|
|
21
24
|
def toggle
|
25
|
+
validate_element!
|
22
26
|
element.aria.expanded? ? hide : show
|
23
27
|
end
|
28
|
+
|
29
|
+
private
|
30
|
+
|
31
|
+
def validate_element!
|
32
|
+
validate_element_attributes! && validate_element_aria_attributes!
|
33
|
+
end
|
34
|
+
|
35
|
+
def validate_element_attributes!
|
36
|
+
case element
|
37
|
+
in {renders: _, morphs: _} then return true
|
38
|
+
in {renders: _} then raise TurboBoost::Commands::InvalidElementError, "The trigger element is missing the `morphs` attribute!"
|
39
|
+
in {morphs: _} then raise TurboBoost::Commands::InvalidElementError, "The trigger element is missing the `renders` attribute!"
|
40
|
+
else raise TurboBoost::Commands::InvalidCommandError, "The trigger element is missing the `renders` and `moprhs` attributes!"
|
41
|
+
end
|
42
|
+
false
|
43
|
+
end
|
44
|
+
|
45
|
+
def validate_element_aria_attributes!
|
46
|
+
case element.aria
|
47
|
+
in {controls: _, expanded: _} then return true
|
48
|
+
in {controls: _} then raise TurboBoost::Commands::InvalidElementError, "The trigger element is missing the `aria-expanded` attribute!"
|
49
|
+
in {expanded: _} then raise TurboBoost::Commands::InvalidElementError, "The trigger element is missing the `aria-controls` attribute!"
|
50
|
+
else raise TurboBoost::Commands::InvalidElementError, "The trigger element is missing the `aria-controls` and `aria-expanded` attributes!"
|
51
|
+
end
|
52
|
+
false
|
53
|
+
end
|
24
54
|
end
|
@@ -3,17 +3,10 @@
|
|
3
3
|
require_relative "../../../../lib/turbo_boost/elements/tag_builders"
|
4
4
|
|
5
5
|
module TurboBoost::Elements::ApplicationHelper
|
6
|
+
# Returns an idiomatic path for the currently rendering template
|
7
|
+
# i.e. How you'd pass the path to a `render partial: ...` call
|
6
8
|
def current_partial_path
|
7
|
-
|
8
|
-
prefix = "app/views/"
|
9
|
-
start = 1
|
10
|
-
while path.nil? && start < 100
|
11
|
-
location = caller_locations(start, 1).first
|
12
|
-
path = location.path if location.path.include?(prefix)
|
13
|
-
start += 1
|
14
|
-
end
|
15
|
-
return "unknown" if path.nil?
|
16
|
-
path[(path.index(prefix) + prefix.length), path.rindex("/")]
|
9
|
+
@virtual_path.to_s.gsub("/_", "/")
|
17
10
|
end
|
18
11
|
|
19
12
|
def method_missing(name, ...)
|
@@ -274,7 +274,6 @@ export default class ToggleDevtool {
|
|
274
274
|
|
275
275
|
tooltip.drag = new PlainDraggable(tooltip)
|
276
276
|
tooltip.drag.onMove = () => {
|
277
|
-
console.log('nate', tooltip.line)
|
278
277
|
tooltip.line.position()
|
279
278
|
if (tooltip.lineToTarget) tooltip.lineToTarget.position()
|
280
279
|
if (tooltip.lineToRendering) tooltip.lineToRendering.position()
|
data/bin/standardize
CHANGED
@@ -12,8 +12,9 @@ module TurboBoost::Elements
|
|
12
12
|
class Engine < ::Rails::Engine
|
13
13
|
config.turbo_boost_elements = ActiveSupport::OrderedOptions.new
|
14
14
|
|
15
|
-
ActiveSupport.on_load(:
|
16
|
-
|
15
|
+
ActiveSupport.on_load(:action_controller_base) do
|
16
|
+
# `self` is ActionController::Base
|
17
|
+
helper TurboBoost::Elements::ApplicationHelper
|
17
18
|
end
|
18
19
|
end
|
19
20
|
end
|
@@ -15,19 +15,4 @@ class TurboBoost::Elements::TagBuilders::BaseTagBuilder
|
|
15
15
|
memo << location.path[(location.path.index(prefix) + prefix.length)..]
|
16
16
|
end
|
17
17
|
end
|
18
|
-
|
19
|
-
protected
|
20
|
-
|
21
|
-
def dehydrate_value(value)
|
22
|
-
return value.to_s unless value.respond_to?(:to_sgid_param)
|
23
|
-
value.try(:persisted?) ? value.to_sgid_param : nil
|
24
|
-
end
|
25
|
-
|
26
|
-
def dehydrate_hash(hash)
|
27
|
-
hash
|
28
|
-
.with_indifferent_access
|
29
|
-
.each_with_object({}.with_indifferent_access) do |(key, val), memo|
|
30
|
-
memo[key] = dehydrate_value(val)
|
31
|
-
end
|
32
|
-
end
|
33
18
|
end
|
@@ -7,8 +7,6 @@ class TurboBoost::Elements::TagBuilders::ToggleTagsBuilder < TurboBoost::Element
|
|
7
7
|
renders:, # REQUIRED, the partial path to render
|
8
8
|
morphs:, # REQUIRED, `dom_id` of the partial's outermost containing element
|
9
9
|
controls:, # REQUIRED, `dom_id` of the toggle target
|
10
|
-
assigns: {}, # `assigns` required to render the partial (i.e. instance variables)
|
11
|
-
locals: {}, # `local_assigns` required to render the parital
|
12
10
|
collapse_selector: nil, # CSS selector for other matching targets to collapse when the target is expanded
|
13
11
|
focus_selector: nil, # CSS selector for the element to focus when the target is expanded
|
14
12
|
method: :toggle, # method to inovke (:show, :hide, :toggle)
|
@@ -24,9 +22,9 @@ class TurboBoost::Elements::TagBuilders::ToggleTagsBuilder < TurboBoost::Element
|
|
24
22
|
kwargs[:data] ||= {}
|
25
23
|
kwargs[:data][:turbo_command] = "TurboBoost::Elements::ToggleCommand##{method}" unless disabled
|
26
24
|
|
27
|
-
#
|
25
|
+
# aria
|
28
26
|
kwargs[:aria] ||= {}
|
29
|
-
kwargs[:aria][:controls] = controls
|
27
|
+
kwargs[:aria][:controls] = controls # toggle target
|
30
28
|
kwargs[:aria][:expanded] = target_expanded?(controls)
|
31
29
|
kwargs[:aria][:atomic] ||= true
|
32
30
|
kwargs[:aria][:relevant] ||= "all"
|
@@ -34,8 +32,6 @@ class TurboBoost::Elements::TagBuilders::ToggleTagsBuilder < TurboBoost::Element
|
|
34
32
|
# rendering
|
35
33
|
kwargs[:renders] = renders
|
36
34
|
kwargs[:morphs] = morphs
|
37
|
-
kwargs[:assigns] = dehydrate_hash(assigns).compact.to_json if assigns.present?
|
38
|
-
kwargs[:locals] = dehydrate_hash(locals).compact.to_json if locals.present?
|
39
35
|
kwargs[:view_stack] = view_stack.to_json if Rails.env.development?
|
40
36
|
|
41
37
|
# misc
|
@@ -44,7 +40,9 @@ class TurboBoost::Elements::TagBuilders::ToggleTagsBuilder < TurboBoost::Element
|
|
44
40
|
kwargs[:remember] = !!remember
|
45
41
|
|
46
42
|
args = kwargs.select { |_, value| value.present? }
|
47
|
-
|
43
|
+
args = args.transform_keys(&:dasherize)
|
44
|
+
|
45
|
+
content_tag("turbo-boost-toggle-trigger", nil, args, &block)
|
48
46
|
end
|
49
47
|
|
50
48
|
def target_tag(
|
data/package.json
CHANGED
@@ -1,13 +1,25 @@
|
|
1
1
|
{
|
2
2
|
"name": "@turbo-boost/elements",
|
3
|
-
"version": "0.0.
|
3
|
+
"version": "0.0.1",
|
4
4
|
"description": "Pre-built easy to use reactive TurboBoost elements for Rails/Hotwire apps.",
|
5
|
-
"
|
5
|
+
"keywords": [
|
6
|
+
"hotwire",
|
7
|
+
"hotwired",
|
8
|
+
"rails",
|
9
|
+
"turbo",
|
10
|
+
"turbo-boost",
|
11
|
+
"web-components"
|
12
|
+
],
|
13
|
+
"type": "module",
|
14
|
+
"main": "app/assets/builds/@turbo-boost/elements.js",
|
15
|
+
"files": [
|
16
|
+
"app/assets/builds"
|
17
|
+
],
|
6
18
|
"repository": "https://github.com/hopsoft/turbo_boost-elements",
|
7
19
|
"author": "Nate Hopkins (hopsoft) <natehop@gmail.com>",
|
8
20
|
"license": "MIT",
|
9
21
|
"dependencies": {
|
10
|
-
"@turbo-boost/commands": ">= 0.0.
|
22
|
+
"@turbo-boost/commands": ">= 0.0.4"
|
11
23
|
},
|
12
24
|
"peerDependencies": {
|
13
25
|
"@hotwired/turbo-rails": ">= 7.2"
|
@@ -18,6 +30,6 @@
|
|
18
30
|
"prettier-standard": "^16.4.1"
|
19
31
|
},
|
20
32
|
"scripts": {
|
21
|
-
"build": "esbuild app/javascript/index.js --bundle --minify --sourcemap --format=esm --outfile=app/assets/builds/@turbo-boost/elements.js"
|
33
|
+
"build": "esbuild app/javascript/index.js --bundle --minify --sourcemap --format=esm --target=es2020,chrome58,firefox57,safari11 --analyze --outfile=app/assets/builds/@turbo-boost/elements.js"
|
22
34
|
}
|
23
35
|
}
|