Skip to content

Commit c357d23

Browse files
committed
Wire up json rendering.
1 parent 45cfa57 commit c357d23

File tree

13 files changed

+186
-40
lines changed

13 files changed

+186
-40
lines changed

src/pg/json/json.ts

Lines changed: 36 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -2,35 +2,50 @@ import { Component, Prop, Part } from '@pictogrammers/element';
22

33
import PgJsonArray from '../jsonArray/jsonArray';
44
import PgJsonObject from '../jsonObject/jsonObject';
5-
import PgJsonString from '../jsonString/jsonString';
65

76
import template from './json.html';
87
import style from './json.css';
98

109
function unwrapObject(obj: any) {
11-
return {
12-
type: PgJsonObject,
13-
items: Object.keys(obj).map((key) => {
10+
return Object.keys(obj).map((key) => {
11+
if (Array.isArray(obj[key])) {
1412
return {
1513
key,
16-
value: obj[key],
17-
type: PgJsonString,
18-
}
19-
})
20-
};
14+
value: unwrapArray(obj[key]),
15+
};
16+
}
17+
if (typeof obj[key] === 'object') {
18+
return {
19+
key,
20+
value: unwrapObject(obj[key]),
21+
};
22+
}
23+
return {
24+
key,
25+
value: obj[key],
26+
};
27+
});
2128
}
2229

2330
function unwrapArray(items: any) {
24-
return {
25-
type: PgJsonArray,
26-
items: items.map((item) => {
27-
if (Array.isArray(item)) {
28-
return unwrapArray(item);
29-
} else {
30-
return unwrapObject(item);
31-
}
32-
})
33-
};
31+
return items.map((item, i) => {
32+
if (Array.isArray(item)) {
33+
return {
34+
key: i.toString(),
35+
value: unwrapArray(item),
36+
};
37+
}
38+
if (typeof item === 'object') {
39+
return {
40+
key: i.toString(),
41+
value: unwrapObject(item),
42+
};
43+
}
44+
return {
45+
key: i.toString(),
46+
value: item,
47+
}
48+
});
3449
}
3550

3651
@Component({
@@ -49,11 +64,11 @@ export default class PgJson extends HTMLElement {
4964
if (changes.value && this.value !== null) {
5065
if (typeof this.value === 'object') {
5166
const $object = document.createElement('pg-json-object') as PgJsonObject;
52-
$object.items = unwrapObject(this.value).items;
67+
$object.value = unwrapObject(this.value);
5368
this.$container.appendChild($object);
5469
} else if (Array.isArray(this.value)) {
5570
const $array = document.createElement('pg-json-array') as PgJsonArray;
56-
$array.items = unwrapArray(this.value).items;
71+
$array.value = unwrapArray(this.value);
5772
this.$container.appendChild($array);
5873
}
5974
}

src/pg/jsonArray/jsonArray.ts

Lines changed: 32 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,46 @@
1-
import { Component, Prop, Part } from '@pictogrammers/element';
1+
import { Component, Prop, Part, forEach } from '@pictogrammers/element';
22

3-
import template from './json.html';
4-
import style from './json.css';
3+
import PgJsonObject from '../jsonArray/jsonArray';
4+
import PgJsonString from '../jsonString/jsonString';
5+
import PgJsonBoolean from '../jsonBoolean/jsonBoolean';
6+
import PgJsonNumber from '../jsonNumber/jsonNumber';
57

6-
const noIcon = 'M0 0h24v24H0V0zm2 2v20h20V2H2z';
8+
import template from './jsonArray.html';
9+
import style from './jsonArray.css';
710

811
@Component({
912
selector: 'pg-json-array',
1013
style,
1114
template,
1215
})
1316
export default class PgJsonArray extends HTMLElement {
14-
@Prop() items: any[] = [];
17+
@Prop() key: string = '';
18+
@Prop() value: any[] = [];
19+
@Prop() expanded: boolean = false;
1520

1621
@Part() $items: HTMLElement;
1722

18-
render(changes) {
19-
23+
connectedCallback() {
24+
forEach({
25+
container: this.$items,
26+
items: this.value,
27+
type: (item) => {
28+
if (Array.isArray(item.value)) {
29+
return PgJsonArray;
30+
}
31+
if (typeof item.value === 'object') {
32+
return PgJsonObject;
33+
}
34+
if (typeof item.value === 'string') {
35+
return PgJsonString;
36+
}
37+
if (typeof item.value === 'boolean') {
38+
return PgJsonBoolean;
39+
}
40+
if (typeof item.value === 'number') {
41+
return PgJsonNumber;
42+
}
43+
},
44+
});
2045
}
2146
}

src/pg/jsonBoolean/README.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
# `PgJsonBoolean`
2+
3+
The `PgJsonBoolean` is used in `pg-json`.

src/pg/jsonBoolean/jsonBoolean.css

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
:host {
2+
display: inline-flex;
3+
}
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
<div part="key"></div>
2+
<div part="seperator">:</div>
3+
<div part="container">
4+
<div part="value"></div>
5+
</div>

src/pg/jsonBoolean/jsonBoolean.ts

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
import { Component, Prop, Part } from '@pictogrammers/element';
2+
3+
import template from './jsonBoolean.html';
4+
import style from './jsonBoolean.css';
5+
6+
@Component({
7+
selector: 'pg-json-boolean',
8+
style,
9+
template,
10+
})
11+
export default class PgJsonBoolean extends HTMLElement {
12+
@Prop() key: string = '';
13+
@Prop() value: boolean = false;
14+
15+
@Part() $key: HTMLDivElement;
16+
@Part() $value: HTMLDivElement;
17+
18+
render(changes) {
19+
if (changes.key) {
20+
this.$key.textContent = this.key;
21+
}
22+
if (changes.value) {
23+
this.$value.textContent = this.value ? 'true' : 'false';
24+
}
25+
}
26+
}

src/pg/jsonNumber/README.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
# `<pg-json>`
2+
3+
The `PgJsonArray` is used in `pg-json`.

src/pg/jsonNumber/jsonNumber.css

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
:host {
2+
display: inline-flex;
3+
}

src/pg/jsonNumber/jsonNumber.html

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
<div part="key"></div>
2+
<div part="seperator">:</div>
3+
<div part="container">
4+
<part>&quot;</part>
5+
<div part="value"></div>
6+
<part>&quot;</part>
7+
</div>

src/pg/jsonNumber/jsonNumber.ts

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
import { Component, Prop, Part } from '@pictogrammers/element';
2+
3+
import template from './jsonNumber.html';
4+
import style from './jsonNumber.css';
5+
6+
@Component({
7+
selector: 'pg-json-number',
8+
style,
9+
template,
10+
})
11+
export default class PgJsonNumber extends HTMLElement {
12+
@Prop() key: string = '';
13+
@Prop() value: number = 0;
14+
15+
@Part() $key: HTMLDivElement;
16+
@Part() $value: HTMLDivElement;
17+
18+
render(changes) {
19+
if (changes.key) {
20+
this.$key.textContent = this.key;
21+
}
22+
if (changes.value) {
23+
this.$value.textContent = `${this.value}`;
24+
}
25+
}
26+
}

0 commit comments

Comments
 (0)