Skip to content

Commit 6472c69

Browse files
authored
feat(astrapia): add layer UI
fix website page navigation bug & refactor fix multiple calls renew graph on layout change order of calls add dropdown & AggregationConditionBox skeleton fix styling remove bold from layer description add VMTag & Tag Condition fix filterlayer building replace Tooltip component with :title add Naming Condition, StylingCondition & cleanup naming changes & emit on change array remove unused fields in status & cleanup LayerManagement add StylingCondition skeleton structure & remove bold from description add full edgeStyling, nodeStyling add Node Styling fix layer editing fix filter layer mapping remove horizontal scrolling in form NETANOL-168
1 parent 24faf11 commit 6472c69

16 files changed

+1855
-119
lines changed

Astrapia/components/Graph.vue

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -221,6 +221,9 @@ export default {
221221
return !this.isEqual(this.previousData, newData);
222222
},
223223
isEqual(obj1, obj2) {
224+
if (obj1 === null || obj2 === null) {
225+
return obj1 === obj2;
226+
}
224227
if (typeof obj1 !== 'object' || typeof obj2 !== 'object')
225228
return obj1 === obj2;
226229

Astrapia/components/GraphFilterMenu.vue

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
<font-awesome-icon icon="fa-solid fa-chevron-left" class="collapse-expand-icon" v-bind:class="{ 'collapse-expand-layer-rotate': graphFilterMenuState.isExpanded }" />
55
</div>
66
<div class="graph-filter-menu-container" :class="{ 'expanded': graphFilterMenuState.isExpanded }">
7-
<LayerManagement v-bind:layout="graphFilterMenuState.selectedLayout.name" v-bind:layers="graphFilterMenuState.selectedLayout.layers" />
7+
<LayerManagement v-bind:layout="graphFilterMenuState.selectedLayout.name" v-bind:layers="graphFilterMenuState.selectedLayout.layers"/>
88
</div>
99
</div>
1010
</template>
@@ -20,8 +20,9 @@ const props = defineProps({
2020
});
2121
2222
const emit = defineEmits<{
23+
layersFetched: [],
2324
menuOpened: [boolean]
24-
}>()
25+
}>();
2526
2627
const graphFilterMenuState = ref({
2728
isExpanded: false,
@@ -34,6 +35,7 @@ const graphFilterMenuState = ref({
3435
async function getLayersOfLayout() {
3536
const layoutData = await layoutService.getLayoutByName(graphFilterMenuState.value.selectedLayout.name);
3637
graphFilterMenuState.value.selectedLayout.layers = layoutData.layers;
38+
emit('layersFetched');
3739
}
3840
3941
// on layout change fetch layers of the layout

Astrapia/components/IntervalMenu.vue

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,7 @@
44
<h3 class="title">{{ title }}</h3>
55
<span class="description-box">
66
<label class="description">{{description}}</label>
7-
<Tooltip :title="inputValue">
8-
<label class="value">{{inputValue}}</label>
9-
</Tooltip>
7+
<label class="value" :title="inputValue">{{inputValue}}</label>
108
<label class="unit">{{selectedUnit}}</label>
119
</span>
1210
<div class="input-container">
@@ -23,7 +21,7 @@
2321
</template>
2422

2523
<script setup lang="ts">
26-
import { defineProps, ref } from 'vue';
24+
import { ref } from 'vue';
2725
2826
const props = defineProps<{
2927
isOpen: Boolean;

Astrapia/components/IntervalToggle.vue

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,5 @@
11
<template>
2-
<Tooltip :title="isChecked ? 'Custom Interval' : 'Fixed Interval'">
3-
<input type="checkbox" class="theme-checkbox" :checked="isChecked" @change="emitValue">
4-
</Tooltip>
2+
<input type="checkbox" class="theme-checkbox" :checked="isChecked" @change="emitValue" :title="isChecked ? 'Custom Interval' : 'Fixed Interval'">
53
</template>
64

75
<script setup lang="ts">

Astrapia/components/LayerManagement.vue

Lines changed: 128 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -21,22 +21,52 @@
2121
</div>
2222
<div class="infos">
2323
<p>description: </p>
24-
<div>{{ removeBoldTagsFromDescription(layer.description) }}</div>
24+
<div>{{ layer.description }}</div>
2525
</div>
2626
</div>
2727
</div>
2828
</div>
2929
<div class="create-form" v-bind:class="{ 'create-layer-open': layerListState.createLayerOpen }">
3030
<input class="create-inputs" type="text" placeholder="Layer Name" v-model="createLayerData.name" />
31-
<input class="create-inputs" type="text" placeholder="Layer Type" v-model="createLayerData.type" />
32-
<div class="enable-new-layer">
33-
<p>Enable?</p>
31+
<select class="create-dropdown-inputs" required v-model="createLayerData.type">
32+
<option value="" disabled selected hidden>Select Layer Type</option>
33+
<option value="filter">Filter</option>
34+
<option value="aggregation">Grouping</option>
35+
<option value="tag-filter">Tag Filter</option>
36+
<option value="vmware-tagging">Tag VMware</option>
37+
<option value="naming">Naming</option>
38+
<option value="styling">Styling</option>
39+
</select>
40+
<div class="enable-new-layer" v-if="createLayerData.type !==''">
41+
<p>Enable on creation</p>
3442
<input type="checkbox" class="theme-checkbox" v-model="createLayerData.enabled" />
3543
</div>
36-
<FilterConditionBox :emit-filter-conditions="layerListState.emitFilterConditions" :edit-layer-filter-conditions="createLayerData.filterList.conditions" @update-filter-conditions="handleFilterConditionsEmit" />
37-
<div class="enable-new-layer">
38-
<p>Implicit Include?</p>
39-
<input type="checkbox" class="theme-checkbox" v-model="createLayerData.filterList.implicitInclude" />
44+
<div class="filter-condition" v-if="createLayerData.type === 'filter'">
45+
<FilterConditionBox :edit-layer-filter-conditions="createLayerData.filterList.conditions" @update-filter-conditions="handleFilterConditionsEmit" />
46+
<div class="enable-new-layer" >
47+
<p>Implicit Inclusion</p>
48+
<input type="checkbox" class="theme-checkbox" v-model="createLayerData.filterList.implicitInclude" />
49+
</div>
50+
</div>
51+
<div class="filter-condition" v-if="createLayerData.type === 'aggregation'">
52+
<AggregationConditionBox :edit-layer-aggregation-matchers="createLayerData.matchers" @update-aggregation-matchers="handleFilterConditionsEmit" />
53+
</div>
54+
<div class="filter-condition" v-if="createLayerData.type === 'tag-filter'">
55+
<TagConditionBox :edit-layer-tag-conditions="createLayerData.conditions" @update-tag-conditions="handleFilterConditionsEmit" />
56+
<div class="enable-new-layer" >
57+
<p>Implicit Inclusion</p>
58+
<input type="checkbox" class="theme-checkbox" v-model="createLayerData.implicitInclude" />
59+
</div>
60+
</div>
61+
<div class="filter-condition" v-if="createLayerData.type === 'naming'">
62+
<NamingConditionBox :edit-layer-naming-conditions="createLayerData.matchers" @update-naming-conditions="handleFilterConditionsEmit" />
63+
<div class="enable-new-layer" >
64+
<p>Overwrite with DNS</p>
65+
<input type="checkbox" class="theme-checkbox" v-model="createLayerData.overwriteWithDns" />
66+
</div>
67+
</div>
68+
<div class="filter-condition" v-if="createLayerData.type === 'styling'">
69+
<StyleConditionBox :edit-layer-edge-conditions="createLayerData.edgeStyler" :edit-layer-node-conditions="createLayerData.nodeStyler" @update-styling-conditions="handleFilterConditionsEmit" />
4070
</div>
4171
</div>
4272
<div class="create-layer" @click="toggleCreateLayerOpen">
@@ -48,8 +78,12 @@
4878
<script setup lang="ts">
4979
import {ref, watch, inject} from "vue";
5080
import {FontAwesomeIcon} from "@fortawesome/vue-fontawesome";
51-
import FilterConditionBox from "~/components/FilterConditionBox.vue";
5281
import layerService from "~/services/layerService";
82+
import FilterConditionBox from "~/components/conditions/FilterConditionBox.vue";
83+
import AggregationConditionBox from "~/components/conditions/AggregationConditionBox.vue";
84+
import TagConditionBox from "~/components/conditions/TagConditionBox.vue";
85+
import NamingConditionBox from "~/components/conditions/NamingConditionBox.vue";
86+
import StyleConditionBox from "~/components/conditions/StyleConditionBox.vue";
5387
5488
export interface FilterConditions {
5589
sourceAddress: string,
@@ -66,6 +100,7 @@ export interface Layer {
66100
name: string,
67101
type: string,
68102
enabled: boolean,
103+
overwriteWithDns: boolean,
69104
filterList: {
70105
conditions: FilterConditions[],
71106
implicitInclude: boolean
@@ -89,10 +124,16 @@ const createLayerData = ref({
89124
name: '',
90125
type: '',
91126
enabled: false,
127+
overwriteWithDns: true,
92128
filterList: {
93129
conditions: [] as Array<FilterConditions>,
94130
implicitInclude: true
95-
}
131+
},
132+
implicitInclude: true,
133+
conditions: [],
134+
matchers:[],
135+
edgeStyler:{},
136+
nodeStyler:{}
96137
})
97138
98139
const layerListState = ref({
@@ -103,7 +144,6 @@ const layerListState = ref({
103144
},
104145
layerOpen: -1,
105146
createLayerOpen: false,
106-
emitFilterConditions: false,
107147
isEditExistingLayer: -1,
108148
doneEmittingFilterConditions: false,
109149
});
@@ -115,10 +155,6 @@ const rerenderer = ref({
115155
116156
const getLayersOfLayout = inject<() => void>('getLayersOfLayout');
117157
118-
function removeBoldTagsFromDescription(description: string) {
119-
return description.replace(/<b>|<\/b>/g, '');
120-
}
121-
122158
async function getExistingLayer(index: number) {
123159
const layerToEdit = await layerService.getLayer(layerListState.value.selectedLayout.name, index);
124160
Object.assign(createLayerData.value, layerToEdit);
@@ -153,18 +189,35 @@ function setLayerEnabled(index: number, value: boolean) {
153189
name: '',
154190
type: '',
155191
enabled: false,
192+
overwriteWithDns: true,
156193
filterList: {
157194
conditions: [] as Array<FilterConditions>,
158-
implicitInclude: false
159-
}
195+
implicitInclude: true
196+
},
197+
implicitInclude: true,
198+
conditions: [],
199+
matchers:[],
200+
edgeStyler:{},
201+
nodeStyler:{}
160202
})
161-
getLayersOfLayout!();
162203
}, 250);
163204
}
164205
165206
// handle emitted filter conditions from FilterConditionBox
166-
function handleFilterConditionsEmit(newConditions: Array<FilterConditions>, doneEmitting: boolean) {
167-
createLayerData.value.filterList.conditions = newConditions;
207+
function handleFilterConditionsEmit(newConditions: any, doneEmitting: boolean) {
208+
if(createLayerData.value.type === 'filter'){
209+
createLayerData.value.filterList.conditions = newConditions;
210+
}else if(createLayerData.value.type === 'aggregation'){
211+
createLayerData.value.matchers = newConditions;
212+
}else if(createLayerData.value.type === 'tag-filter'){
213+
createLayerData.value.conditions = newConditions;
214+
}else if(createLayerData.value.type === 'naming'){
215+
createLayerData.value.matchers = newConditions;
216+
}else if(createLayerData.value.type === 'styling'){
217+
delete (createLayerData.value as { matchers?: any }).matchers;
218+
createLayerData.value.edgeStyler = newConditions.edgeStyler;
219+
createLayerData.value.nodeStyler = newConditions.nodeStyler;
220+
}
168221
layerListState.value.doneEmittingFilterConditions = doneEmitting;
169222
}
170223
@@ -181,10 +234,22 @@ function toggleCreateLayerOpen() {
181234
}
182235
else {
183236
layerListState.value.createLayerOpen = true;
184-
if (layerListState.value.isEditExistingLayer > -1) {
185-
layerListState.value.emitFilterConditions = true;
186-
}
187237
}
238+
Object.assign(createLayerData.value, {
239+
name: '',
240+
type: '',
241+
enabled: false,
242+
overwriteWithDns: true,
243+
filterList: {
244+
conditions: [] as Array<FilterConditions>,
245+
implicitInclude: true
246+
},
247+
implicitInclude: true,
248+
conditions: [],
249+
matchers:[],
250+
edgeStyler:{},
251+
nodeStyler:{}
252+
})
188253
}
189254
190255
function toggleEditExistingLayer(index: number) {
@@ -196,15 +261,20 @@ function toggleEditExistingLayer(index: number) {
196261
function editExistingLayerAndReset() {
197262
editExistingLayer(layerListState.value.isEditExistingLayer);
198263
layerListState.value.isEditExistingLayer = -1;
199-
layerListState.value.emitFilterConditions = false;
200264
Object.assign(createLayerData.value, {
201265
name: '',
202266
type: '',
203267
enabled: false,
268+
overwriteWithDns: true,
204269
filterList: {
205270
conditions: [] as Array<FilterConditions>,
206-
implicitInclude: false
207-
}
271+
implicitInclude: true
272+
},
273+
implicitInclude: true,
274+
conditions: [],
275+
matchers:[],
276+
edgeStyler:{},
277+
nodeStyler:{}
208278
});
209279
}
210280
@@ -215,10 +285,16 @@ function createNewLayerAndReset() {
215285
name: '',
216286
type: '',
217287
enabled: false,
288+
overwriteWithDns: true,
218289
filterList: {
219290
conditions: [] as Array<FilterConditions>,
220-
implicitInclude: false
221-
}
291+
implicitInclude: true
292+
},
293+
implicitInclude: true,
294+
conditions: [],
295+
matchers:[],
296+
edgeStyler:{},
297+
nodeStyler:{}
222298
});
223299
}
224300
@@ -341,6 +417,8 @@ watch(() => props.layers!, (newLayers, oldLayers) => {
341417
flex-direction: column;
342418
align-items: center;
343419
height: 94.5%;
420+
overflow-y: auto;
421+
overflow-x: hidden;
344422
}
345423
346424
.create-inputs {
@@ -356,6 +434,28 @@ watch(() => props.layers!, (newLayers, oldLayers) => {
356434
outline: none;
357435
}
358436
437+
.create-dropdown-inputs {
438+
width: 91%;
439+
border: 1px solid #424242;
440+
background: white;
441+
border-radius: 4px;
442+
font-size: 2vh;
443+
margin-bottom: 1.5vh;
444+
padding: 2%;
445+
outline: none;
446+
color: #424242;
447+
font-family: 'Open Sans', sans-serif;
448+
}
449+
450+
.create-dropdown-inputs:focus {
451+
outline: none;
452+
}
453+
454+
.filter-condition{
455+
margin-left: 10%;
456+
width: 100%;
457+
}
458+
359459
.enable-new-layer {
360460
display: flex;
361461
flex-direction: row;

Astrapia/components/SlideMenu.vue

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,8 @@
11
<template>
22
<div class="slide-menu" :class="{ 'slide-up': isOpen }">
33
<div class="slider-container">
4-
<Tooltip title="Change link distance">
5-
<input type="range" min="50" max="800" v-model="distance" @input="updateDistance" class="slider">
6-
</Tooltip>
7-
<Tooltip title="Change Simulation force">
8-
<input type="range" min="200" max="3000" v-model="force" @input="updateSim" class="slider">
9-
</Tooltip>
4+
<input type="range" min="50" max="800" v-model="distance" @input="updateDistance" class="slider" title="Change link distance">
5+
<input type="range" min="200" max="3000" v-model="force" @input="updateSim" class="slider" title="Change Simulation force">
106
</div>
117
</div>
128
</template>

0 commit comments

Comments
 (0)