Skip to content

Commit 42e9c53

Browse files
committed
refactor: standardize event naming and improve type safety across components
This commit introduces several improvements: - Renamed `valueChange` event to `somethingChanged` for consistency - Updated event emitter types to be more specific - Simplified type handling in various components - Improved type safety in JsonTreeNode initialization - Removed redundant type checks and simplified logic in some methods
1 parent 9eb391a commit 42e9c53

File tree

10 files changed

+59
-63
lines changed

10 files changed

+59
-63
lines changed

projects/ngx-json-table/src/lib/components/tbody/key/key.component.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@
4242
<span
4343
class="delete-child"
4444
*ngIf="settings.options.delete"
45-
(click)="item.delete(); valueChange.emit('delete')"
45+
(click)="item.delete(); somethingChanged.emit('delete')"
4646
[innerHTML]="icons.deleteChild | sanitizeHtml"></span>
4747
</span>
4848
<span *ngIf="item.edit" class="float-right">

projects/ngx-json-table/src/lib/components/tbody/key/key.component.ts

Lines changed: 8 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -8,12 +8,10 @@ import { Icons, Settings } from '../../../lib/settings';
88
styleUrls: ['./key.component.scss'],
99
})
1010
export class KeyComponent {
11-
@Input() value: unknown;
12-
@Output() valueChange = new EventEmitter<unknown>();
13-
1411
@Input() item: JsonTreeNode;
1512
@Input() settings: Settings;
1613
@Input() icons: Icons;
14+
@Output() somethingChanged = new EventEmitter<'clean' | 'edit' | 'add' | 'delete'>();
1715

1816
constructor() {}
1917

@@ -23,17 +21,20 @@ export class KeyComponent {
2321
this.item.edit && this.item.toggleEdit();
2422
if (this.item.isNew) {
2523
this.item.delete();
26-
this.valueChange.emit('clean');
24+
this.somethingChanged.emit('clean');
2725
}
2826
}
2927

3028
@HostListener('keyup.enter')
3129
onEnterKeyListener() {
32-
if (this.item.checkNotUniqueKey()) return;
30+
if (this.item.checkNotUniqueKey()) return false;
31+
3332
this.item.toggleEdit();
3433
this.item.updateState();
3534
this.item.isNew = false;
36-
this.valueChange.emit('edit');
35+
this.somethingChanged.emit('edit');
36+
37+
return true;
3738
}
3839

3940
addChild(isObject = false, isArray = false) {
@@ -54,15 +55,11 @@ export class KeyComponent {
5455
}
5556
}
5657
this.item.children.splice(0, 0, node);
57-
this.valueChange.emit('add');
58+
this.somethingChanged.emit('add');
5859
}
5960

6061
toggleDropdownMenu(dropdown: HTMLSpanElement) {
6162
const value = dropdown.style.display;
6263
dropdown.style.display = value === 'none' || value === '' ? 'block' : 'none';
6364
}
64-
65-
public onValueChange(value: unknown): void {
66-
this.valueChange.emit(value);
67-
}
6865
}

projects/ngx-json-table/src/lib/components/tbody/tbody.component.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
[item]="item"
77
[settings]="settings"
88
[icons]="icons"
9-
(valueChange)="somethingChanged($event)"></tr>
9+
(somethingChanged)="somethingChanged($event)"></tr>
1010
</ng-container>
1111
<tr *ngIf="!table || table.length === 0">
1212
<td colspan="2">No data Found</td>

projects/ngx-json-table/src/lib/components/tbody/tbody.component.ts

Lines changed: 20 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ export class TbodyComponent implements OnChanges {
6464
}
6565
}
6666

67-
sortJsonTree(root: JsonTreeNode, sortDirection: SortType = 'asc') {
67+
sortJsonTree(root: JsonTreeNode, sortDirection: SortType) {
6868
root.children.sort((a, b) => a.key.localeCompare(b.key));
6969
sortDirection === 'desc' && root.children.reverse();
7070
for (const node of root.children) {
@@ -81,29 +81,30 @@ export class TbodyComponent implements OnChanges {
8181

8282
jsonTreeToObject(root: JsonTreeNode): JsonValue {
8383
let result: JsonValue;
84-
if (root.isComplex) {
85-
result = root.isArray ? [] : {};
86-
for (const node of root.children) {
87-
result[node.key] = this.jsonTreeToObject(node);
88-
}
89-
} else {
90-
if (typeof root.value === 'string') {
91-
result = root.value;
92-
} else {
93-
const value = `${root.value}`;
94-
if (`${parseFloat(value)}` === value) {
95-
result = parseFloat(value);
96-
} else if (['true', 'false'].includes(value.toLowerCase())) {
97-
result = value === 'true';
98-
} else {
99-
result = value;
84+
85+
switch (root.type) {
86+
case 'object':
87+
result = root.isArray ? [] : {};
88+
for (const node of root.children) {
89+
result[node.key] = this.jsonTreeToObject(node);
10090
}
101-
}
91+
break;
92+
case 'number':
93+
case 'bigint':
94+
result = parseFloat(`${root.value}`);
95+
break;
96+
case 'boolean':
97+
result = `${root.value}` === 'true';
98+
break;
99+
default:
100+
result = root.value;
101+
break;
102102
}
103+
103104
return result;
104105
}
105106

106-
toggleSortDirection(sortDirection) {
107+
toggleSortDirection(sortDirection: SortType) {
107108
this.sortJsonTree(this.jsonTree, sortDirection);
108109
this.somethingChanged('sort');
109110
}

projects/ngx-json-table/src/lib/components/tbody/trow/trow.component.html

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,10 @@
44
[item]="item"
55
[settings]="settings"
66
[icons]="icons"
7-
(valueChange)="valueChange.emit($event)"></td>
7+
(somethingChanged)="somethingChanged.emit($event)"></td>
88
<td
99
ngx-json-table-value
1010
[style]="{ width: settings.value.width }"
1111
[item]="item"
1212
[settings]="settings"
13-
(valueChange)="valueChange.emit($event)"></td>
13+
(somethingChanged)="somethingChanged.emit($event)"></td>

projects/ngx-json-table/src/lib/components/tbody/trow/trow.component.ts

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
import { Component, EventEmitter, HostListener, Input, Output } from '@angular/core';
22
import { JsonTreeNode } from '../../../lib/json-tree-node';
3-
import { JsonTreeEvent } from '../../../lib/types';
43
import { Icons, Settings } from '../../../lib/settings';
54

65
@Component({
@@ -12,7 +11,7 @@ export class TrowComponent {
1211
@Input() item: JsonTreeNode;
1312
@Input() settings: Settings;
1413
@Input() icons: Icons;
15-
@Output() valueChange = new EventEmitter<JsonTreeEvent>();
14+
@Output() somethingChanged = new EventEmitter<'clean' | 'edit' | 'add' | 'delete'>();
1615

1716
constructor() {}
1817

projects/ngx-json-table/src/lib/components/tbody/value/value.component.ts

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
import { Component, EventEmitter, HostListener, Input, Output } from '@angular/core';
22
import { JsonTreeNode } from '../../../lib/json-tree-node';
3-
import { JsonTreeEvent } from '../../../lib/types';
43
import { Settings } from '../../../lib/settings';
54

65
@Component({
@@ -11,7 +10,7 @@ import { Settings } from '../../../lib/settings';
1110
export class ValueComponent {
1211
@Input() item: JsonTreeNode;
1312
@Input() settings: Settings;
14-
@Output() valueChange = new EventEmitter<JsonTreeEvent>();
13+
@Output() somethingChanged = new EventEmitter<'clean' | 'edit' | 'add' | 'delete'>();
1514

1615
constructor() {}
1716

@@ -21,7 +20,7 @@ export class ValueComponent {
2120
this.item.edit && this.item.toggleEdit();
2221
if (this.item.isNew) {
2322
this.item.delete();
24-
this.valueChange.emit('clean');
23+
this.somethingChanged.emit('clean');
2524
}
2625
}
2726

@@ -30,6 +29,6 @@ export class ValueComponent {
3029
if (this.item.checkNotUniqueKey()) return;
3130
this.item.toggleEdit();
3231
this.item.updateState();
33-
this.valueChange.emit('edit');
32+
this.somethingChanged.emit('edit');
3433
}
3534
}

projects/ngx-json-table/src/lib/components/thead/thead.component.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import { Component, EventEmitter, Input, Output } from '@angular/core';
22
import { Icons, Settings, SortType } from '../../lib/settings';
33
import { JsonTreeNode } from '../../lib/json-tree-node';
4-
import { JsonTreeEvent, JsonValue } from '../../lib/types';
4+
import { JsonValue } from '../../lib/types';
55

66
@Component({
77
selector: '[ngx-json-table-thead]',
@@ -12,7 +12,7 @@ export class TheadComponent {
1212
@Input() root: JsonTreeNode;
1313
@Input() settings: Settings;
1414
@Input() icons: Icons;
15-
@Output() valueChange = new EventEmitter<JsonTreeEvent>();
15+
@Output() somethingChanged = new EventEmitter<'clean' | 'edit' | 'add' | 'delete'>();
1616
@Output() fileLoaded = new EventEmitter<JsonValue>();
1717
@Output() sortDirectionChange = new EventEmitter<SortType>();
1818

@@ -34,7 +34,7 @@ export class TheadComponent {
3434
node.edit = true;
3535
node.isNew = true;
3636
this.root.children.splice(0, 0, node);
37-
this.valueChange.emit('add');
37+
this.somethingChanged.emit('add');
3838
}
3939

4040
loadFile(event: InputEvent) {

projects/ngx-json-table/src/lib/lib/json-tree-node.ts

Lines changed: 19 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ export class JsonTreeNode {
1919
level: number;
2020
type: JsonValueType;
2121
isArray: boolean;
22-
parent: JsonTreeNode | null;
22+
parent?: JsonTreeNode | null;
2323
children: JsonTreeNode[];
2424
showChildren: boolean;
2525
edit = false;
@@ -31,21 +31,21 @@ export class JsonTreeNode {
3131
key: string,
3232
value: JsonValue,
3333
type: JsonValueType,
34-
level?: number,
35-
isArray?: boolean,
36-
parent?: JsonTreeNode | null,
37-
children?: JsonTreeNode[],
38-
showChildren?: boolean
34+
level: number,
35+
isArray: boolean,
36+
parent: JsonTreeNode | null,
37+
children: JsonTreeNode[] = [],
38+
showChildren: boolean = false
3939
) {
40-
this.id = `${Math.random().toString(36).substr(2, 9)}`;
40+
this.id = `${Math.random().toString(36).substring(2, 9)}`;
4141
this.key = this.prevKey = key;
4242
this.value = this.prevValue = value;
4343
this.type = type;
44-
this.level = level ?? 0;
45-
this.isArray = isArray ?? false;
46-
this.parent = parent ?? null;
47-
this.children = children ?? [];
48-
this.showChildren = showChildren ?? false;
44+
this.level = level;
45+
this.isArray = isArray;
46+
this.parent = parent;
47+
this.children = children;
48+
this.showChildren = showChildren;
4949
}
5050

5151
toggleShowChildren(allLevels = false) {
@@ -62,13 +62,13 @@ export class JsonTreeNode {
6262
}
6363

6464
checkNotUniqueKey(): boolean {
65-
return (
66-
(this.key === '' ||
67-
(this.parent &&
68-
this.parent.children.filter(c => c.id !== this.id && c.key === this.key).length > 0)) &&
69-
(this.error = true) &&
70-
setTimeout(() => (this.error = false), 2000) !== null
71-
);
65+
if (!this.key || this.parent?.children.some(c => c.id !== this.id && c.key === this.key)) {
66+
this.error = true;
67+
setTimeout(() => (this.error = false), 2000);
68+
return true;
69+
}
70+
71+
return false;
7272
}
7373

7474
toggleEdit() {

projects/ngx-json-table/src/lib/ngx-json-table.component.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
#thead
44
[settings]="defaultSettings"
55
[icons]="defaultSettings.icons"
6-
(valueChange)="tbody.somethingChanged($event)"
6+
(somethingChanged)="tbody.somethingChanged($event)"
77
(fileLoaded)="data = $event"
88
(sortDirectionChange)="tbody.toggleSortDirection($event)"></thead>
99
<tbody

0 commit comments

Comments
 (0)