Left: | ||
Right: |
OLD | NEW |
---|---|
(Empty) | |
1 /* globals module, require */ | |
Thomas Greiner
2018/04/25 17:29:14
I noticed that none of the new files in this revie
Thomas Greiner
2018/04/25 17:29:14
Detail: You don't use `module` in this module.
a.giammarchi
2018/04/26 10:44:52
To be honest, I feel like we should have module an
a.giammarchi
2018/04/26 10:44:52
Will do.
Thomas Greiner
2018/04/26 17:00:52
Wouldn't .eslintrc.json be a more suitable place t
a.giammarchi
2018/04/27 10:59:04
absolutely!
| |
2 | |
3 "use strict"; | |
4 | |
5 const IOElement = require("./io-element"); | |
6 | |
7 class IOToggle extends IOElement | |
8 { | |
9 // action, checked, and disabled should be reflected down the button | |
10 static get observedAttributes() | |
11 { | |
12 return ["action", "checked", "disabled"]; | |
13 } | |
14 | |
15 created() | |
16 { | |
17 this.addEventListener("click", this); | |
18 this.render(); | |
19 } | |
20 | |
21 get checked() | |
22 { | |
23 return this.hasAttribute("checked"); | |
24 } | |
25 | |
26 set checked(value) | |
27 { | |
28 booleanAttribute.call(this, "checked", value); | |
29 this.render(); | |
30 } | |
31 | |
32 get disabled() | |
33 { | |
34 return this.hasAttribute("disabled"); | |
35 } | |
36 | |
37 set disabled(value) | |
38 { | |
39 booleanAttribute.call(this, "disabled", value); | |
40 this.firstElementChild.disabled = this._disabled; | |
Thomas Greiner
2018/04/25 17:29:14
Why don't you call `this.render()` here?
a.giammarchi
2018/04/26 10:44:52
it's not needed, the disabled is the native DOM ac
Thomas Greiner
2018/04/26 17:00:52
I mean instead of setting `this.firstElementChild.
a.giammarchi
2018/04/27 10:59:04
I'll try that. The issue here is that disabled is
Thomas Greiner
2018/05/02 11:53:28
Thanks, looking good!
| |
41 } | |
42 | |
43 onclick(event) | |
44 { | |
45 if (!this.disabled) | |
46 { | |
47 this.checked = !this.checked; | |
48 if (this.ownerDocument.activeElement !== this.firstElementChild) | |
49 { | |
50 this.firstElementChild.focus(); | |
51 } | |
52 this.dispatchEvent(new CustomEvent("change", { | |
53 bubbles: true, | |
54 cancelable: true, | |
55 detail: this.checked | |
56 })); | |
57 } | |
58 } | |
59 | |
60 render() | |
61 { | |
62 this.html` | |
63 <button | |
64 role="checkbox" | |
65 data-action="${this.action}" | |
66 aria-checked="${this.checked}" | |
67 aria-disabled="${this.disabled}" | |
68 />`; | |
69 } | |
70 } | |
71 | |
72 IOToggle.define("io-toggle"); | |
73 | |
74 function asBoolean(value) | |
Thomas Greiner
2018/04/25 17:29:14
Suggestion: "asBoolean" is quite close to "isBoole
a.giammarchi
2018/04/26 10:44:51
will do
| |
75 { | |
76 return typeof value === "string" ? JSON.parse(value) : !!value; | |
Thomas Greiner
2018/04/25 17:29:14
It's a bit unexpected that this function accepts e
a.giammarchi
2018/04/26 10:44:52
only strings can be JSON, and in this case we are
Thomas Greiner
2018/04/26 17:00:52
I can follow your line or argument right until the
a.giammarchi
2018/04/27 10:59:04
will do.
| |
77 } | |
78 | |
79 function booleanAttribute(name, value) | |
Thomas Greiner
2018/04/25 17:29:14
Detail: This function looks useful also for other
a.giammarchi
2018/04/26 10:44:51
Usually the way I go is: as soon as more than a co
Thomas Greiner
2018/04/26 17:00:52
That's a fair point. And it should be fine as long
a.giammarchi
2018/04/27 10:59:05
makes sense.
| |
80 { | |
81 if (asBoolean(value)) | |
82 { | |
83 this.setAttribute(name, "true"); | |
84 } | |
85 else | |
86 { | |
87 this.removeAttribute(name); | |
88 } | |
89 } | |
OLD | NEW |