turbo_reflex 0.0.29 → 0.0.31
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/Gemfile.lock +8 -8
- data/README.md +10 -8
- data/app/assets/builds/turbo_reflex.js +3 -3
- data/app/assets/builds/turbo_reflex.js.map +3 -3
- data/app/javascript/drivers/window.js +4 -2
- data/app/javascript/events.js +7 -13
- data/app/javascript/index.js +36 -11
- data/app/javascript/lifecycle.js +4 -1
- data/app/javascript/state/index.js +3 -1
- data/app/javascript/state/observable.js +2 -2
- data/app/javascript/turbo.js +1 -1
- data/lib/turbo_reflex/base.rb +4 -1
- data/lib/turbo_reflex/engine.rb +2 -0
- data/lib/turbo_reflex/version.rb +1 -1
- data/lib/turbo_reflex.rb +1 -0
- data/package.json +2 -2
- data/tags +1046 -931
- data/turbo_reflex.gemspec +2 -2
- data/yarn.lock +161 -161
- metadata +5 -5
@@ -7,7 +7,9 @@ import renderer from '../renderer'
|
|
7
7
|
|
8
8
|
function aborted (event) {
|
9
9
|
const xhr = event.target
|
10
|
-
dispatch(lifecycle.events.abort, document, {
|
10
|
+
dispatch(lifecycle.events.abort, document, {
|
11
|
+
detail: { ...event.detail, xhr }
|
12
|
+
})
|
11
13
|
}
|
12
14
|
|
13
15
|
function errored (event) {
|
@@ -22,7 +24,7 @@ function errored (event) {
|
|
22
24
|
dispatch(
|
23
25
|
lifecycle.events.clientError,
|
24
26
|
document,
|
25
|
-
{
|
27
|
+
{ detail: { ...event.detail, error, xhr } },
|
26
28
|
true
|
27
29
|
)
|
28
30
|
}
|
data/app/javascript/events.js
CHANGED
@@ -14,17 +14,11 @@ export const stateEvents = {
|
|
14
14
|
|
15
15
|
export const allEvents = { ...lifecycleEvents, ...stateEvents }
|
16
16
|
|
17
|
-
export function dispatch (name, target
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
})
|
25
|
-
target.dispatchEvent(event)
|
26
|
-
} catch (error) {
|
27
|
-
if (raise) throw error
|
28
|
-
dispatch(lifecycleEvents.clientError, target, { error, ...detail }, true)
|
29
|
-
}
|
17
|
+
export function dispatch (name, target, options = {}) {
|
18
|
+
options = options || {}
|
19
|
+
options.detail = options.detail || {}
|
20
|
+
target = target || document
|
21
|
+
const evt = new CustomEvent(name, { ...options, bubbles: true })
|
22
|
+
target.dispatchEvent(evt)
|
23
|
+
return evt
|
30
24
|
}
|
data/app/javascript/index.js
CHANGED
@@ -13,6 +13,16 @@ import state from './state'
|
|
13
13
|
import urls from './urls'
|
14
14
|
import uuids from './uuids'
|
15
15
|
|
16
|
+
function buildReflexPayload (id, element) {
|
17
|
+
return {
|
18
|
+
id, // reflex id
|
19
|
+
name: element.dataset.turboReflex, // reflex name
|
20
|
+
elementId: element.id.length > 0 ? element.id : null,
|
21
|
+
elementAttributes: elements.buildAttributePayload(element),
|
22
|
+
startedAt: new Date().getTime()
|
23
|
+
}
|
24
|
+
}
|
25
|
+
|
16
26
|
function invokeReflex (event) {
|
17
27
|
let element
|
18
28
|
let payload = {}
|
@@ -22,22 +32,38 @@ function invokeReflex (event) {
|
|
22
32
|
if (!element) return
|
23
33
|
if (!delegates.isRegisteredForElement(event.type, element)) return
|
24
34
|
|
25
|
-
const
|
35
|
+
const reflexId = `reflex-${uuids.v4()}`
|
36
|
+
let driver = drivers.find(element)
|
37
|
+
let payload = {
|
38
|
+
...buildReflexPayload(reflexId, element),
|
39
|
+
driver: driver.name,
|
40
|
+
frameId: driver.frame ? driver.frame.id : null,
|
41
|
+
src: driver.src
|
42
|
+
}
|
43
|
+
|
44
|
+
const startEvent = dispatch(lifecycle.events.start, element, {
|
45
|
+
cancelable: true,
|
46
|
+
detail: payload
|
47
|
+
})
|
48
|
+
|
49
|
+
if (startEvent.defaultPrevented)
|
50
|
+
return dispatch(lifecycle.events.abort, element, {
|
51
|
+
detail: {
|
52
|
+
message: `An event handler for '${lifecycle.events.start}' prevented default behavior and blocked reflex invocation!`,
|
53
|
+
source: startEvent
|
54
|
+
}
|
55
|
+
})
|
26
56
|
|
27
|
-
//
|
57
|
+
// the element and thus the driver may have changed based on the start event handler(s)
|
58
|
+
driver = drivers.find(element)
|
28
59
|
payload = {
|
29
|
-
|
30
|
-
name: element.dataset.turboReflex,
|
60
|
+
...buildReflexPayload(reflexId, element),
|
31
61
|
driver: driver.name,
|
32
|
-
src: driver.src,
|
33
62
|
frameId: driver.frame ? driver.frame.id : null,
|
34
|
-
|
35
|
-
elementAttributes: elements.buildAttributePayload(element),
|
36
|
-
startedAt: new Date().getTime()
|
63
|
+
src: driver.src
|
37
64
|
}
|
38
65
|
|
39
66
|
activity.add(payload)
|
40
|
-
dispatch(lifecycle.events.start, element, payload)
|
41
67
|
|
42
68
|
if (['frame', 'window'].includes(driver.name)) event.preventDefault()
|
43
69
|
|
@@ -56,8 +82,7 @@ function invokeReflex (event) {
|
|
56
82
|
}
|
57
83
|
} catch (error) {
|
58
84
|
dispatch(lifecycle.events.clientError, element, {
|
59
|
-
error
|
60
|
-
...payload
|
85
|
+
detail: { ...payload, error }
|
61
86
|
})
|
62
87
|
}
|
63
88
|
}
|
data/app/javascript/lifecycle.js
CHANGED
@@ -4,7 +4,10 @@ import { dispatch, lifecycleEvents as events } from './events'
|
|
4
4
|
function finish (event) {
|
5
5
|
event.detail.endedAt = new Date().getTime()
|
6
6
|
event.detail.milliseconds = event.detail.endedAt - event.detail.startedAt
|
7
|
-
setTimeout(
|
7
|
+
setTimeout(
|
8
|
+
() => dispatch(events.finish, event.target, { detail: event.detail }),
|
9
|
+
25
|
10
|
+
)
|
8
11
|
}
|
9
12
|
|
10
13
|
addEventListener(events.serverError, finish)
|
@@ -13,7 +13,9 @@ function loadState () {
|
|
13
13
|
loadedState = { ...currentState }
|
14
14
|
delete meta.element.dataset.clientStateChange
|
15
15
|
setTimeout(() =>
|
16
|
-
dispatch(events.stateLoad, meta.element, {
|
16
|
+
dispatch(events.stateLoad, meta.element, {
|
17
|
+
detail: { state: currentState }
|
18
|
+
})
|
17
19
|
)
|
18
20
|
}
|
19
21
|
|
@@ -9,13 +9,13 @@ function observable (object, parent = null) {
|
|
9
9
|
const proxy = new Proxy(object, {
|
10
10
|
deleteProperty (target, key) {
|
11
11
|
delete target[key]
|
12
|
-
dispatch(events.stateChange, meta.element, { state: head })
|
12
|
+
dispatch(events.stateChange, meta.element, { detail: { state: head } })
|
13
13
|
return true
|
14
14
|
},
|
15
15
|
|
16
16
|
set (target, key, value, receiver) {
|
17
17
|
target[key] = observable(value, this)
|
18
|
-
dispatch(events.stateChange, meta.element, { state: head })
|
18
|
+
dispatch(events.stateChange, meta.element, { detail: { state: head } })
|
19
19
|
return true
|
20
20
|
}
|
21
21
|
})
|
data/app/javascript/turbo.js
CHANGED
data/lib/turbo_reflex/base.rb
CHANGED
@@ -17,11 +17,14 @@ require_relative "attribute_set"
|
|
17
17
|
# * render ...................... Renders Rails templates, partials, etc. (doesn't halt controller request handling)
|
18
18
|
# * render_response ............. Renders a full controller response
|
19
19
|
# * renderer .................... An ActionController::Renderer
|
20
|
-
# * prevent_controller_action ... Prevents the rails controller/action from running (i.e. the reflex handles the response entirely)
|
21
20
|
# * turbo_stream ................ A Turbo Stream TagBuilder
|
22
21
|
# * turbo_streams ............... A list of Turbo Streams to append to the response (also aliased as streams)
|
23
22
|
# * state ....................... An object that stores ephemeral `state`
|
24
23
|
#
|
24
|
+
# They also have access to the following class methods:
|
25
|
+
#
|
26
|
+
# * prevent_controller_action ... Prevents the rails controller/action from running (i.e. the reflex handles the response entirely)
|
27
|
+
#
|
25
28
|
class TurboReflex::Base
|
26
29
|
class << self
|
27
30
|
def preventers
|
data/lib/turbo_reflex/engine.rb
CHANGED
@@ -1,9 +1,11 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
require "turbo-rails"
|
4
|
+
require "turbo_ready"
|
4
5
|
require_relative "version"
|
5
6
|
require_relative "base"
|
6
7
|
require_relative "controller_pack"
|
8
|
+
require_relative "../../app/controllers/concerns/turbo_reflex/controller"
|
7
9
|
|
8
10
|
module TurboReflex
|
9
11
|
def self.config
|
data/lib/turbo_reflex/version.rb
CHANGED
data/lib/turbo_reflex.rb
CHANGED
data/package.json
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
{
|
2
2
|
"name": "turbo_reflex",
|
3
|
-
"version": "0.0.
|
3
|
+
"version": "0.0.30",
|
4
4
|
"description": "Reflexes for Turbo Frames that help you build robust reactive applications",
|
5
5
|
"main": "app/javascript/index.js",
|
6
6
|
"repository": "https://github.com/hopsoft/turbo_reflex",
|
7
7
|
"author": "Nate Hopkins (hopsoft) <natehop@gmail.com>",
|
8
8
|
"license": "MIT",
|
9
9
|
"dependencies": {
|
10
|
-
"turbo_ready": ">= 0.1.
|
10
|
+
"turbo_ready": ">= 0.1.4"
|
11
11
|
},
|
12
12
|
"peerDependencies": {
|
13
13
|
"@hotwired/turbo-rails": ">= 7.2.0"
|