Skip to content

Commit 0544e0f

Browse files
committed
properly implement ctrl and shift
1 parent e18e967 commit 0544e0f

File tree

1 file changed

+43
-6
lines changed

1 file changed

+43
-6
lines changed

libs/topology/components/src/lib/topology-tree/topology-tree.component.ts

+43-6
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,11 @@ export class TopologyTreeComponent {
5252
subscriptionContextMenu = input<SbbMenuItem<SubscriptionWithMetaData>[]>();
5353
subscriptionRuleContextMenu = input<SbbMenuItem<SubscriptionRule>[]>();
5454

55-
selectionMode = signal<'single' | 'multiple'>('single');
55+
ctrlSelected = signal<boolean>(false);
56+
shiftSelected = signal<boolean>(false);
57+
selectionMode = computed<'single' | 'multiple'>(() => {
58+
return this.ctrlSelected() || this.shiftSelected() ? 'multiple' : 'single';
59+
});
5660

5761
connectionsFilter = input<string[]>();
5862

@@ -150,6 +154,15 @@ export class TopologyTreeComponent {
150154
return node;
151155
});
152156
});
157+
flatNodes = computed<TreeNode[]>(() => {
158+
const flatten = (nodes: TreeNode[]): TreeNode[] => {
159+
return nodes.flatMap((node) => {
160+
return [node, ...(node.children ? flatten(node.children) : [])];
161+
});
162+
};
163+
164+
return flatten(this.nodes());
165+
});
153166
contextMenu = computed(() => {
154167
const selection = this.selection();
155168
const nodeType = selection?.[0]?.type;
@@ -231,20 +244,38 @@ export class TopologyTreeComponent {
231244
if (!(event instanceof Array) && event) {
232245
event = [event];
233246
}
247+
248+
if (this.shiftSelected()) {
249+
const flatNodes = this.flatNodes();
250+
const newestSelected = event[event.length - 1];
251+
const oneBefore = event[event.length - 2];
252+
const nodeType = newestSelected.type;
253+
254+
const newestSelectedIndex = flatNodes.findIndex((node) => node.key === newestSelected.key);
255+
const oneBeforeIndex = flatNodes.findIndex((node) => node.key === oneBefore.key);
256+
257+
const inbetweenNodes = flatNodes.slice(
258+
Math.min(oneBeforeIndex, newestSelectedIndex),
259+
Math.max(oneBeforeIndex, newestSelectedIndex) + 1
260+
).filter((node) => node.type === nodeType);
261+
262+
event = [
263+
...event.filter((node) => !inbetweenNodes.includes(node)),
264+
...inbetweenNodes,
265+
];
266+
}
267+
234268
this.selection.set(event as TreeNode[]);
235269
this.onMultipleSelectionChange(event ?? []);
236270
return;
237271
}
238272

239273
if (event instanceof Array) {
240-
console.log(event);
241274
event = event[event.length - 1];
242275
}
243276

244-
console.log('single selection', event);
245277
this.selection.set([event]);
246278

247-
248279
switch (event.type) {
249280
case 'namespace':
250281
this.onNamespaceSelected(event.data);
@@ -363,13 +394,19 @@ export class TopologyTreeComponent {
363394

364395
onKeyDown(event: KeyboardEvent) {
365396
if (event.key === 'Shift') {
366-
this.selectionMode.set('multiple');
397+
this.shiftSelected.set(true);
398+
}
399+
if (event.key === 'Control') {
400+
this.ctrlSelected.set(true);
367401
}
368402
}
369403

370404
onKeyUp(event: KeyboardEvent) {
371405
if (event.key === 'Shift') {
372-
this.selectionMode.set('single');
406+
this.shiftSelected.set(false);
407+
}
408+
if (event.key === 'Control') {
409+
this.ctrlSelected.set(false);
373410
}
374411
}
375412

0 commit comments

Comments
 (0)