Skip to content

Commit e637fe1

Browse files
committed
Progress.
1 parent 6548b49 commit e637fe1

File tree

5 files changed

+77
-6
lines changed

5 files changed

+77
-6
lines changed

src/pg/tree/__examples__/basic/basic.ts

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,14 @@ function createItem(label, expanded = false) {
2929
enabled: false
3030
}],
3131
items: [{
32-
label: 'Sub Item'
32+
label: 'Sub Item 1'
33+
}, {
34+
label: 'Sub Item 2',
35+
items: [{
36+
label: 'Sub Item ?',
37+
}]
38+
}, {
39+
label: 'Sub Item 3'
3340
}]
3441
};
3542
}

src/pg/tree/tree.css

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,4 +8,5 @@
88
background: var(--pg-tree-background, transparent);
99
padding: 0.25rem;
1010
gap: 0.25rem;
11+
--x: 0;
1112
}

src/pg/tree/tree.ts

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,17 @@ export default class PgTree extends HTMLElement {
2222
return PgTreeItem;
2323
}
2424
});
25+
this.addEventListener('toggle', (e: any) => {
26+
const { indexes } = e.detail;
27+
let item = this.#getItem(indexes);
28+
item.expanded = !item.expanded;
29+
})
30+
}
31+
32+
#getItem(indexes: number[]) {
33+
return indexes.reduce((item: any, index) => {
34+
return item.items[index];
35+
}, this);
2536
}
2637

2738
render(changes) {

src/pg/treeItem/treeItem.css

Lines changed: 37 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
:host {
22
display: contents;
3+
--y: calc(var(--x) + 1);
34
}
45

56
.hide {
@@ -54,6 +55,7 @@
5455

5556
[part=item] {
5657
user-select: none;
58+
padding-left: calc((var(--x) * 0.5rem) + 0.25rem)
5759
}
5860

5961
[part=item]:hover {
@@ -73,30 +75,61 @@
7375
background: var(--pg-tree-item-background-selected, #453C4F);
7476
}
7577

78+
[part=item]:not(.items) {
79+
padding-left: calc((var(--x) * 0.5rem) + 1.25rem)
80+
}
81+
7682
[part=actions] {
7783
display: flex;
7884
gap: 0.25rem;
7985
--pg-icon-color: var(--pg-tree-item-color, #453C4F);
8086
}
8187

8288
[part=items] {
83-
display: flex;
89+
display: none;
8490
flex-direction: column;
85-
padding-left: 1rem;
91+
--x: calc(var(--y) + 1);
92+
}
93+
[part=items].expanded {
94+
display: flex;
8695
}
8796

8897
[part=toggle] {
98+
display: none;
8999
margin-left: -0.125rem;
90100
margin-right: -0.375rem;
91-
padding: 0;
101+
margin-top: -0.125rem;
102+
margin-bottom: -0.125rem;
103+
padding: 0 0 0 1rem;
92104
width: 1rem;
93105
border: 0;
94106
background-repeat: no-repeat;
95107
background-position: center;
96108
background-color: transparent;
109+
}
110+
111+
[part=toggle]:hover {
112+
box-shadow: 0 0 1px rgba(255, 255, 255, 0.5) inset;
113+
background-color: rgba(255, 255, 255, 0.2);
114+
border-radius: 0.125rem;
115+
}
116+
117+
[part=item].items:not(.expanded) [part=toggle] {
118+
display: flex;
119+
background-image: url("data:image/svg+xml; utf8, <svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'><path d='M 17,13L 17,11L 11,5L 9,7L 14,12L 9,17L 11,19' fill='rgb(69 60 79)' /></svg>");
120+
}
121+
122+
[part=item].items.expanded [part=toggle] {
123+
display: flex;
97124
background-image: url("data:image/svg+xml; utf8, <svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'><path d='M 11,17L 13,17L 19,11L 17,9L 12,14L 7,9L 5,11' fill='rgb(69 60 79)' /></svg>");
98125
}
99126

100-
[part=item]:hover [part=toggle] {
127+
[part=item].items:not(.expanded):hover [part=toggle] {
128+
display: flex;
129+
background-image: url("data:image/svg+xml; utf8, <svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'><path d='M 17,13L 17,11L 11,5L 9,7L 14,12L 9,17L 11,19' fill='white' /></svg>");
130+
}
131+
132+
[part=item].items.expanded:hover [part=toggle] {
133+
display: flex;
101134
background-image: url("data:image/svg+xml; utf8, <svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'><path d='M 11,17L 13,17L 19,11L 17,9L 12,14L 7,9L 5,11' fill='white' /></svg>");
102135
}

src/pg/treeItem/treeItem.ts

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ export default class PgTreeItem extends HTMLElement {
2222
@Prop() actions: any[] = [];
2323
@Prop() items: any[] = [];
2424

25+
@Part() $toggle: HTMLButtonElement;
2526
@Part() $item: HTMLDivElement;
2627
@Part() $input: HTMLInputElement;
2728
@Part() $iconButton: HTMLButtonElement;
@@ -32,6 +33,7 @@ export default class PgTreeItem extends HTMLElement {
3233
@Part() $items: HTMLDivElement;
3334

3435
connectedCallback() {
36+
this.$toggle.addEventListener('click', this.#handleToggleClick.bind(this));
3537
this.$item.addEventListener('action', this.#handleAction.bind(this));
3638
this.$labelButton.addEventListener('dblclick', this.#handleDoubleClick.bind(this));
3739
this.$labelButton.addEventListener('click', this.#handleClick.bind(this));
@@ -40,6 +42,7 @@ export default class PgTreeItem extends HTMLElement {
4042
this.$item.addEventListener('contextmenu', this.#handleContextMenu.bind(this));
4143
this.$input.addEventListener('blur', this.#handleBlur.bind(this));
4244
this.$input.addEventListener('keydown', this.#handleInputKeyDown.bind(this));
45+
this.$items.addEventListener('toggle', this.#handleToggle.bind(this));
4346
this.$items.addEventListener('select', this.#handleSelect.bind(this));
4447
this.$items.addEventListener('rename', this.#handleRename.bind(this));
4548
this.$items.addEventListener('up', this.#handleUp.bind(this));
@@ -81,15 +84,27 @@ export default class PgTreeItem extends HTMLElement {
8184
this.$item.classList.toggle('selected', this.selected);
8285
}
8386
if (changes.items) {
84-
this.$items.classList.toggle('hide', this.items.length === 0);
87+
this.$item.classList.toggle('items', this.items.length !== 0);
8588
}
8689
if (changes.expanded) {
8790
if (this.expanded) {
8891
this.#initItems();
8992
}
93+
this.$item.classList.toggle('expanded', this.expanded);
94+
this.$items.classList.toggle('expanded', this.expanded);
9095
}
9196
}
9297

98+
#handleToggleClick() {
99+
this.dispatchEvent(new CustomEvent('toggle', {
100+
bubbles: true,
101+
composed: true,
102+
detail: {
103+
indexes: [this.index]
104+
}
105+
}));
106+
}
107+
93108
#handleIconDoubleClick() {
94109
this.dispatchEvent(new CustomEvent('select', {
95110
bubbles: true,
@@ -135,6 +150,10 @@ export default class PgTreeItem extends HTMLElement {
135150
}));
136151
}
137152

153+
#handleToggle(e: any) {
154+
e.detail.indexes.unshift(this.index);
155+
}
156+
138157
#handleRename(e: any) {
139158
e.detail.indexes.unshift(this.index);
140159
}

0 commit comments

Comments
 (0)