clapton 0.0.23 → 0.0.24
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/README.md +24 -0
- data/lib/clapton/javascripts/dist/c-for-test.js +21 -0
- data/lib/clapton/javascripts/dist/c.js +21 -0
- data/lib/clapton/javascripts/dist/client.js +3 -0
- data/lib/clapton/javascripts/dist/components-for-test.js +21 -0
- data/lib/clapton/javascripts/dist/components.js +21 -0
- data/lib/clapton/javascripts/src/channel/clapton-channel.js +1 -0
- data/lib/clapton/javascripts/src/client.ts +1 -0
- data/lib/clapton/javascripts/src/components/component.ts +26 -0
- data/lib/clapton/javascripts/src/dom/update-component.ts +1 -0
- data/lib/clapton/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: f15ceb3c247b4a620ea3508dc66511a2d7beb4f2e1bc32a24dd8e69bd0d70332
|
4
|
+
data.tar.gz: 329b1b8107968efdcce936a4f71deb904e5a609d846ca245d8c90cc7040ba144
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 24846c65443543d58f3e8f6f6018b5ace3af64166be9b9e2bde2bd0aa5056c7bd2f148ba43b7171a7e43756d0eb485bebaad9fca5ad57a913b038bead70baf8e
|
7
|
+
data.tar.gz: 60aaeaae14b6277cd5323f5cf1e36201e94f2887e4c1655838ce37a13a58282de3b05c729e2a8212b2e1705f7e4e538f0b2f2b78e57b872f089d9956acc58b57
|
data/README.md
CHANGED
@@ -177,6 +177,30 @@ class TaskListComponent < Clapton::Component
|
|
177
177
|
end
|
178
178
|
```
|
179
179
|
|
180
|
+
### Effect
|
181
|
+
|
182
|
+
The `effect` method is a method that is triggered when the state is changed.
|
183
|
+
|
184
|
+
```ruby
|
185
|
+
# app/components/task_list_component.rb
|
186
|
+
class TaskListComponent < Clapton::Component
|
187
|
+
effect [:tasks] do |state|
|
188
|
+
puts state[:tasks]
|
189
|
+
end
|
190
|
+
end
|
191
|
+
```
|
192
|
+
|
193
|
+
If dependencies are not specified, the effect will be triggered on the first render.
|
194
|
+
|
195
|
+
```ruby
|
196
|
+
# app/components/video_player_component.rb
|
197
|
+
class VideoPlayerComponent < Clapton::Component
|
198
|
+
effect [] do
|
199
|
+
puts "First render"
|
200
|
+
end
|
201
|
+
end
|
202
|
+
```
|
203
|
+
|
180
204
|
### Preset Components Classes
|
181
205
|
|
182
206
|
```ruby
|
@@ -405,7 +405,28 @@ var c = (function () {
|
|
405
405
|
}
|
406
406
|
return root.renderWrapper;
|
407
407
|
}
|
408
|
+
static effect(dependencies, callback) {
|
409
|
+
this._effects.push({ dependencies, callback });
|
410
|
+
}
|
411
|
+
get effects() {
|
412
|
+
return this.constructor._effects;
|
413
|
+
}
|
414
|
+
runEffects() {
|
415
|
+
this.effects.forEach((effect) => {
|
416
|
+
if (effect.dependencies.some((dependency) => this._state[dependency] !== undefined)) {
|
417
|
+
effect.callback(this._state);
|
418
|
+
}
|
419
|
+
});
|
420
|
+
}
|
421
|
+
runEffectOnFirstRender() {
|
422
|
+
this.effects.forEach((effect) => {
|
423
|
+
if (effect.dependencies.length === 0) {
|
424
|
+
effect.callback(this._state);
|
425
|
+
}
|
426
|
+
});
|
427
|
+
}
|
408
428
|
}
|
429
|
+
Component._effects = [];
|
409
430
|
|
410
431
|
class TextField {
|
411
432
|
constructor(state, attribute, attributes = {}) {
|
@@ -402,7 +402,28 @@ class Component {
|
|
402
402
|
}
|
403
403
|
return root.renderWrapper;
|
404
404
|
}
|
405
|
+
static effect(dependencies, callback) {
|
406
|
+
this._effects.push({ dependencies, callback });
|
407
|
+
}
|
408
|
+
get effects() {
|
409
|
+
return this.constructor._effects;
|
410
|
+
}
|
411
|
+
runEffects() {
|
412
|
+
this.effects.forEach((effect) => {
|
413
|
+
if (effect.dependencies.some((dependency) => this._state[dependency] !== undefined)) {
|
414
|
+
effect.callback(this._state);
|
415
|
+
}
|
416
|
+
});
|
417
|
+
}
|
418
|
+
runEffectOnFirstRender() {
|
419
|
+
this.effects.forEach((effect) => {
|
420
|
+
if (effect.dependencies.length === 0) {
|
421
|
+
effect.callback(this._state);
|
422
|
+
}
|
423
|
+
});
|
424
|
+
}
|
405
425
|
}
|
426
|
+
Component._effects = [];
|
406
427
|
|
407
428
|
class TextField {
|
408
429
|
constructor(state, attribute, attributes = {}) {
|
@@ -1292,6 +1292,7 @@ const updateComponent = async (component, state, property, target) => {
|
|
1292
1292
|
const ComponentClass = module[componentName];
|
1293
1293
|
const instance = new ComponentClass(state, component.dataset.id);
|
1294
1294
|
morphdom(component, instance.renderWrapper);
|
1295
|
+
instance.runEffects();
|
1295
1296
|
};
|
1296
1297
|
|
1297
1298
|
const initializeInputs = () => {
|
@@ -1333,6 +1334,7 @@ const claptonChannel = consumer.subscriptions.create("Clapton::ClaptonChannel",
|
|
1333
1334
|
|
1334
1335
|
initializeInputs();
|
1335
1336
|
initializeActions();
|
1337
|
+
instance.runEffects();
|
1336
1338
|
}
|
1337
1339
|
});
|
1338
1340
|
|
@@ -1440,6 +1442,7 @@ const createAndAppendComponent = async (component, element) => {
|
|
1440
1442
|
element.outerHTML = firstChild.outerHTML;
|
1441
1443
|
}
|
1442
1444
|
}
|
1445
|
+
instance.runEffects();
|
1443
1446
|
};
|
1444
1447
|
document.addEventListener("DOMContentLoaded", async () => {
|
1445
1448
|
await initializeComponents();
|
@@ -405,7 +405,28 @@ var Clapton = (function (exports) {
|
|
405
405
|
}
|
406
406
|
return root.renderWrapper;
|
407
407
|
}
|
408
|
+
static effect(dependencies, callback) {
|
409
|
+
this._effects.push({ dependencies, callback });
|
410
|
+
}
|
411
|
+
get effects() {
|
412
|
+
return this.constructor._effects;
|
413
|
+
}
|
414
|
+
runEffects() {
|
415
|
+
this.effects.forEach((effect) => {
|
416
|
+
if (effect.dependencies.some((dependency) => this._state[dependency] !== undefined)) {
|
417
|
+
effect.callback(this._state);
|
418
|
+
}
|
419
|
+
});
|
420
|
+
}
|
421
|
+
runEffectOnFirstRender() {
|
422
|
+
this.effects.forEach((effect) => {
|
423
|
+
if (effect.dependencies.length === 0) {
|
424
|
+
effect.callback(this._state);
|
425
|
+
}
|
426
|
+
});
|
427
|
+
}
|
408
428
|
}
|
429
|
+
Component._effects = [];
|
409
430
|
|
410
431
|
class TextField {
|
411
432
|
constructor(state, attribute, attributes = {}) {
|
@@ -402,7 +402,28 @@ class Component {
|
|
402
402
|
}
|
403
403
|
return root.renderWrapper;
|
404
404
|
}
|
405
|
+
static effect(dependencies, callback) {
|
406
|
+
this._effects.push({ dependencies, callback });
|
407
|
+
}
|
408
|
+
get effects() {
|
409
|
+
return this.constructor._effects;
|
410
|
+
}
|
411
|
+
runEffects() {
|
412
|
+
this.effects.forEach((effect) => {
|
413
|
+
if (effect.dependencies.some((dependency) => this._state[dependency] !== undefined)) {
|
414
|
+
effect.callback(this._state);
|
415
|
+
}
|
416
|
+
});
|
417
|
+
}
|
418
|
+
runEffectOnFirstRender() {
|
419
|
+
this.effects.forEach((effect) => {
|
420
|
+
if (effect.dependencies.length === 0) {
|
421
|
+
effect.callback(this._state);
|
422
|
+
}
|
423
|
+
});
|
424
|
+
}
|
405
425
|
}
|
426
|
+
Component._effects = [];
|
406
427
|
|
407
428
|
class TextField {
|
408
429
|
constructor(state, attribute, attributes = {}) {
|
@@ -5,6 +5,8 @@ export class Component {
|
|
5
5
|
_state: any;
|
6
6
|
_errors: any[];
|
7
7
|
|
8
|
+
static _effects: any[] = [];
|
9
|
+
|
8
10
|
constructor(state: any = {}, id: string = Math.random().toString(36).substring(2, 10), errors: any[] = []) {
|
9
11
|
this._state = state;
|
10
12
|
this.id = id;
|
@@ -24,4 +26,28 @@ export class Component {
|
|
24
26
|
}
|
25
27
|
return root.renderWrapper;
|
26
28
|
}
|
29
|
+
|
30
|
+
static effect(dependencies: any[], callback: () => void) {
|
31
|
+
this._effects.push({ dependencies, callback });
|
32
|
+
}
|
33
|
+
|
34
|
+
get effects(): any[] {
|
35
|
+
return (this.constructor as typeof Component)._effects;
|
36
|
+
}
|
37
|
+
|
38
|
+
runEffects() {
|
39
|
+
this.effects.forEach((effect) => {
|
40
|
+
if (effect.dependencies.some((dependency: any) => this._state[dependency] !== undefined)) {
|
41
|
+
effect.callback(this._state);
|
42
|
+
}
|
43
|
+
});
|
44
|
+
}
|
45
|
+
|
46
|
+
runEffectOnFirstRender() {
|
47
|
+
this.effects.forEach((effect) => {
|
48
|
+
if (effect.dependencies.length === 0) {
|
49
|
+
effect.callback(this._state);
|
50
|
+
}
|
51
|
+
});
|
52
|
+
}
|
27
53
|
}
|
@@ -7,4 +7,5 @@ export const updateComponent = async (component: HTMLElement, state: any, proper
|
|
7
7
|
const ComponentClass = module[componentName] as any;
|
8
8
|
const instance = new ComponentClass(state, component.dataset.id);
|
9
9
|
morphdom(component, instance.renderWrapper);
|
10
|
+
instance.runEffects();
|
10
11
|
};
|
data/lib/clapton/version.rb
CHANGED