From 49b30221299f6d398a4e20c975a74fa733f31342 Mon Sep 17 00:00:00 2001 From: Alexander ZIVNY-HARTIG Date: Mon, 8 Apr 2024 14:34:21 +0200 Subject: [PATCH 1/7] fix(fennec): query conditions revert to default NETANOL-236 --- .../conditions/StyleConditionBox.vue | 27 ++++++------ .../Integration/QueryConditionTests.cs | 6 +-- .../Fennec/Controllers/LayoutController.cs | 13 +++++- Packrat/Fennec/Database/Domain/Layout.cs | 15 +++---- Packrat/Fennec/Database/MapperProfile.cs | 42 ++++++++++++------- Packrat/Fennec/Startup.cs | 16 ++++--- 6 files changed, 72 insertions(+), 47 deletions(-) diff --git a/Astrapia/components/conditions/StyleConditionBox.vue b/Astrapia/components/conditions/StyleConditionBox.vue index 5a6d5f3..dad18be 100644 --- a/Astrapia/components/conditions/StyleConditionBox.vue +++ b/Astrapia/components/conditions/StyleConditionBox.vue @@ -74,16 +74,15 @@
- - - - - - - - - - +
+ +
+
+ +
+
+ +
@@ -219,10 +218,10 @@ const filterConditionBoxState = ref({ startHex: "#000000", endHex: "#FFFFFF" }, - // Icmp:{ - // startHex: "#000000", - // endHex: "#FFFFFF" - // } + Icmp:{ + startHex: "#000000", + endHex: "#FFFFFF" + } } }, nodeStyler: { diff --git a/Packrat/Fennec.Tests/Integration/QueryConditionTests.cs b/Packrat/Fennec.Tests/Integration/QueryConditionTests.cs index 7c4bc7f..4c69ccf 100644 --- a/Packrat/Fennec.Tests/Integration/QueryConditionTests.cs +++ b/Packrat/Fennec.Tests/Integration/QueryConditionTests.cs @@ -54,8 +54,8 @@ public async Task FiltersByPort() await SeedDatabase(); var conditions = new QueryConditions { - FlowProtocolsWhitelist = new[] { FlowProtocol.Ipfix, FlowProtocol.Netflow5 }, - DataProtocolsWhitelist = new[] { DataProtocol.Tcp } + FlowProtocolsWhitelist = new List { FlowProtocol.Ipfix, FlowProtocol.Netflow5 }, + DataProtocolsWhitelist = new List { DataProtocol.Tcp } }; var service = new TraceRepository(Database, null!, null!); @@ -77,7 +77,7 @@ public async Task FiltersByDuplicateAndPort() var conditions = new QueryConditions { AllowDuplicates = false, - PortsWhitelist = new[] { 10, 50 } + PortsWhitelist = new List { 10, 50 } }; var service = new TraceRepository(Database, null!, null!); diff --git a/Packrat/Fennec/Controllers/LayoutController.cs b/Packrat/Fennec/Controllers/LayoutController.cs index 536d7cc..574ebbd 100644 --- a/Packrat/Fennec/Controllers/LayoutController.cs +++ b/Packrat/Fennec/Controllers/LayoutController.cs @@ -50,6 +50,9 @@ public async Task List() [SwaggerResponse(StatusCodes.Status400BadRequest, "A layout with the name already exists")] public async Task Create(string name) { + if (!ModelState.IsValid) + return BadRequest(); + try { var layout = await _layoutRepository.CreateLayout(name); @@ -68,7 +71,7 @@ public async Task Create(string name) /// /// [HttpGet("{name}")] - [SwaggerResponse(StatusCodes.Status200OK, "Layout successfully returned", typeof(Layout))] + [SwaggerResponse(StatusCodes.Status200OK, "Layout successfully returned", typeof(FullLayoutDto))] [SwaggerResponse(StatusCodes.Status404NotFound, "The layout with the name does not exist")] public async Task Get(string name) { @@ -137,14 +140,20 @@ public async Task Delete(string name) [HttpPut("{name}/queryConditions")] [SwaggerResponse(StatusCodes.Status200OK, "Query conditions successfully updated", typeof(FullLayoutDto))] [SwaggerResponse(StatusCodes.Status404NotFound, "The layout with the name does not exist")] - public async Task ReplaceQueryConditions(string name, QueryConditionsDto queryConditions) + public async Task ReplaceQueryConditions(string name, [FromBody] QueryConditionsDto queryConditions) { + if (!ModelState.IsValid) + return BadRequest(); + var layout = await _layoutRepository.GetLayout(name); if (layout == null) return NotFound($"The layout with the name `{name}` does not exist."); var newQueryConditions = _mapper.Map(queryConditions); await _layoutRepository.ReplaceQueryConditions(name, newQueryConditions); + + // TODO: update it using the previous call instead of re-fetching + layout = await _layoutRepository.GetLayout(name); return Ok(_mapper.Map(layout)); } } diff --git a/Packrat/Fennec/Database/Domain/Layout.cs b/Packrat/Fennec/Database/Domain/Layout.cs index bc606c1..5d9cb04 100644 --- a/Packrat/Fennec/Database/Domain/Layout.cs +++ b/Packrat/Fennec/Database/Domain/Layout.cs @@ -27,28 +27,28 @@ public class QueryConditions /// /// This is intended to help differentiate between SFlow and other flow protocols. [BsonElement("flowProtocolsWhitelist")] - public FlowProtocol[]? FlowProtocolsWhitelist { get; set; } + public List? FlowProtocolsWhitelist { get; set; } /// /// A list of allowed only those data carrying protocols that should be included in the result. If null this /// condition is ignored. /// [BsonElement("dataProtocolsWhitelist")] - public DataProtocol[]? DataProtocolsWhitelist { get; set; } + public List? DataProtocolsWhitelist { get; set; } /// /// If specified a list of allowed source and destination ports that should be included in the result. If either /// source or destination port matches any of the ports in the list the trace is included in the result. /// [BsonElement("portsWhitelist")] - public int[]? PortsWhitelist { get; set; } + public List? PortsWhitelist { get; set; } } public record QueryConditionsDto( bool? AllowDuplicates, - FlowProtocol[]? FlowProtocolsWhitelist, - DataProtocol[]? DataProtocolsWhitelist, - int[]? PortsWhitelist); + List? FlowProtocolsWhitelist, + List? DataProtocolsWhitelist, + List? PortsWhitelist); /// /// Represents a list of steps that should be taken before sending data to the frontend. @@ -59,6 +59,7 @@ public Layout(string name) { Name = name; Layers = new List(); + QueryConditions = new QueryConditions(); } #pragma warning disable CS8618 // Non-nullable field must contain a non-null value when exiting constructor. Consider declaring as nullable. @@ -78,7 +79,7 @@ protected Layout() { } /// /// The conditions that should be applied when querying the database. /// - [BsonElement("queryConditions")] + [BsonElement("queryConditions")] public QueryConditions QueryConditions { get; set; } = new(); /// diff --git a/Packrat/Fennec/Database/MapperProfile.cs b/Packrat/Fennec/Database/MapperProfile.cs index bcaaac5..77a3320 100644 --- a/Packrat/Fennec/Database/MapperProfile.cs +++ b/Packrat/Fennec/Database/MapperProfile.cs @@ -12,16 +12,16 @@ public MapperProfile() // TODO: rethink all this dto madness CreateMap() .ConvertUsing(ip => ip.ToString()); - + CreateMap() .ConvertUsing(str => IPAddress.Parse(str)); - + CreateMap() .ConvertUsing(str => IPAddress.Parse(str).GetAddressBytes()); - + CreateMap() .ConvertUsing(bytes => new IPAddress(bytes).ToString()); - + CreateMap() .ConstructUsing((dto, _) => { @@ -63,36 +63,48 @@ public MapperProfile() CreateMap(); CreateMap(); - + CreateMap() .ConstructUsing((dto, ctx) => { if (!LayerType.LookupTable.TryGetValue(dto.Type, out var layerType)) throw new ArgumentException("No layer type found in the lookup table."); - - return (ILayer) ctx.Mapper.Map(dto, dto.GetType(), layerType.LayerType); + + return (ILayer)ctx.Mapper.Map(dto, dto.GetType(), layerType.LayerType); }); - + CreateMap() .ConstructUsing((layer, ctx) => { if (!LayerType.LookupTable.TryGetValue(layer.Type, out var layerType)) throw new ArgumentException("No layer type found in the lookup table."); - - return (ILayerDto) ctx.Mapper.Map(layer, layer.GetType(), layerType.DtoType); + + return (ILayerDto)ctx.Mapper.Map(layer, layer.GetType(), layerType.DtoType); }); CreateMap() - .ForCtorParam("LayerCount", opt => + .ForCtorParam("LayerCount", opt => opt.MapFrom(src => src.Layers.Count)); + CreateMap() + .ForAllMembers(opts => opts.AllowNull()); - CreateMap(); CreateMap() - .ForAllMembers(opts => opts.AllowNull()); + .ConstructUsing((q, _) => + new QueryConditionsDto(q.AllowDuplicates, q.FlowProtocolsWhitelist, q.DataProtocolsWhitelist, + q.PortsWhitelist)) + .ForAllMembers(o => o.AllowNull()); CreateMap() - .ForAllMembers(opts => opts.AllowNull()); + .ConstructUsing(q => + new QueryConditions + { + AllowDuplicates = q.AllowDuplicates, + FlowProtocolsWhitelist = q.FlowProtocolsWhitelist, + DataProtocolsWhitelist = q.DataProtocolsWhitelist, + PortsWhitelist = q.PortsWhitelist + }) + .ForAllMembers(o => o.AllowNull()); CreateMap(); CreateMap(); @@ -101,7 +113,7 @@ public MapperProfile() CreateMap(); CreateMap(); - + CreateMap(); CreateMap(); CreateMap(); diff --git a/Packrat/Fennec/Startup.cs b/Packrat/Fennec/Startup.cs index 1a518a2..c24c11d 100644 --- a/Packrat/Fennec/Startup.cs +++ b/Packrat/Fennec/Startup.cs @@ -1,6 +1,7 @@ using System.Data; using System.Net.Http.Headers; using System.Text; +using System.Text.Json.Serialization; using Fennec.Database; using Fennec.Database.Domain; using Fennec.Metrics; @@ -49,10 +50,7 @@ public void ConfigureServices(IServiceCollection services, IWebHostEnvironment e { BsonSerializer.RegisterSerializer(typeof(ILayer), new MongoLayerSerializer()); BsonSerializer.RegisterSerializer(typeof(Dictionary), new ProtocolColorsDictionarySerializer()); - JsonConvert.DefaultSettings = () => new JsonSerializerSettings - { - Converters = { new StringEnumConverter() } - }; + services.AddAutoMapper(typeof(MapperProfile)); @@ -174,8 +172,14 @@ public void ConfigureServices(IServiceCollection services, IWebHostEnvironment e Log.Error("Failed to read multiplexer configuration... To run no multiplexers define an empty list"); // Web services - services.AddControllers(c => { c.ModelBinderProviders.Insert(0, new LayerModelBinderProvider()); }) - .AddNewtonsoftJson(options => { options.SerializerSettings.Converters.Add(new StringEnumConverter()); }); + services + .AddControllers(c => { c.ModelBinderProviders.Insert(0, new LayerModelBinderProvider()); }) + .AddNewtonsoftJson(options => + { + options.SerializerSettings.NullValueHandling = NullValueHandling.Include; + options.SerializerSettings.Converters.Add(new StringEnumConverter()); + }); + services.AddAutoMapper(typeof(Program).Assembly); if (StartupOptions.AllowCors) From 030cffc8a8fa5813f70304f8a57167b93eefa751 Mon Sep 17 00:00:00 2001 From: Tristan LOSADA BENINI Date: Tue, 12 Mar 2024 08:13:19 +0100 Subject: [PATCH 2/7] fix(astrapia): fix node color on update NETANOL-230 --- Astrapia/components/Graph.vue | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/Astrapia/components/Graph.vue b/Astrapia/components/Graph.vue index 15120c1..7abead0 100644 --- a/Astrapia/components/Graph.vue +++ b/Astrapia/components/Graph.vue @@ -167,12 +167,14 @@ export default { this.node = this.node .data(nodes, d => d.id) - .join(enter => enter.append("circle") - .attr("r", 8) - .attr("fill", d => d.hexColor ?? "#537B87") - .call(this.drag(this.simulation)) - .call(node => node.append("title") - .text(d => `IP: ${d.name} ${d.tags ? `\nTags: ${d.tags}` : ''}`)) + .join( + enter => enter.append("circle") + .attr("r", 8) + .attr("fill", d => d.hexColor ?? "#537B87") + .call(this.drag(this.simulation)) + .call(node => node.append("title") + .text(d => `IP: ${d.name} ${d.tags ? `\nTags: ${d.tags}` : ''}`)), + update => update.attr("fill", d => d.hexColor ?? "#537B87") ); this.label = this.label @@ -255,7 +257,7 @@ export default { if (selectedNode) { this.node.transition() .duration(150) - .attr("fill", "#537B87") + .attr("fill", d => d.hexColor ?? "#537B87") .attr("r", 8) .attr("opacity", 1); this.link.transition() From 381e5f1cc1d7074fe5e53573897ba2f198495fb2 Mon Sep 17 00:00:00 2001 From: Tristan LOSADA BENINI Date: Wed, 13 Mar 2024 18:59:26 +0100 Subject: [PATCH 3/7] feat(astrapia): add queryConditions frame NETANOL-230 --- Astrapia/components/QueryConditionButton.vue | 57 ++++ Astrapia/components/QueryConditionForm.vue | 255 ++++++++++++++++++ .../conditions/StyleConditionBox.vue | 16 +- Astrapia/pages/topology.vue | 10 + Astrapia/plugins/fontawesome.js | 6 +- Astrapia/services/layoutService.ts | 4 + 6 files changed, 338 insertions(+), 10 deletions(-) create mode 100644 Astrapia/components/QueryConditionButton.vue create mode 100644 Astrapia/components/QueryConditionForm.vue diff --git a/Astrapia/components/QueryConditionButton.vue b/Astrapia/components/QueryConditionButton.vue new file mode 100644 index 0000000..0b1ffd3 --- /dev/null +++ b/Astrapia/components/QueryConditionButton.vue @@ -0,0 +1,57 @@ + + + + + diff --git a/Astrapia/components/QueryConditionForm.vue b/Astrapia/components/QueryConditionForm.vue new file mode 100644 index 0000000..22cb18a --- /dev/null +++ b/Astrapia/components/QueryConditionForm.vue @@ -0,0 +1,255 @@ + + + + + diff --git a/Astrapia/components/conditions/StyleConditionBox.vue b/Astrapia/components/conditions/StyleConditionBox.vue index dad18be..e20b970 100644 --- a/Astrapia/components/conditions/StyleConditionBox.vue +++ b/Astrapia/components/conditions/StyleConditionBox.vue @@ -207,20 +207,20 @@ const filterConditionBoxState = ref({ useProtocolColors: true, protocolColors: { Unknown:{ - startHex: "#000000", - endHex: "#FFFFFF" + startHex: "#FFFFFF", + endHex: "#000000" }, Tcp:{ - startHex: "#000000", - endHex: "#FFFFFF" + startHex: "#FFFFFF", + endHex: "#000000" }, Udp:{ - startHex: "#000000", - endHex: "#FFFFFF" + startHex: "#FFFFFF", + endHex: "#000000" }, Icmp:{ - startHex: "#000000", - endHex: "#FFFFFF" + startHex: "#FFFFFF", + endHex: "#000000" } } }, diff --git a/Astrapia/pages/topology.vue b/Astrapia/pages/topology.vue index 49f45d3..fd38707 100644 --- a/Astrapia/pages/topology.vue +++ b/Astrapia/pages/topology.vue @@ -7,6 +7,7 @@ @change="handleTimeframeSelection" :from-value="timeframeSelectorFrom" :to-value="timeframeSelectorTo"/> + @@ -18,6 +19,7 @@ import Graph from "~/components/Graph.vue"; import Dropdown from "~/components/Dropdown.vue"; import GraphFilterMenu from "~/components/GraphFilterMenu.vue"; import TopologyTimeframeSelector from "~/components/TopologyTimeframeSelector.vue"; +import QueryConditionButton from "~/components/QueryConditionButton.vue"; const layout = ref(''); const timeframeSelectorFrom = ref(new Date(new Date().getTime() - 2 * 60 * 1000).toISOString().slice(0,16)) @@ -119,4 +121,12 @@ onBeforeUnmount(() => { z-index: 15; margin: 0.75vh 13vw 0 0; } + +.query-conditions{ + position: absolute; + top: 0; + right: 0; + z-index: 15; + margin: 0.75vh 39vw 0 0; +} diff --git a/Astrapia/plugins/fontawesome.js b/Astrapia/plugins/fontawesome.js index 92a1233..cc2e792 100644 --- a/Astrapia/plugins/fontawesome.js +++ b/Astrapia/plugins/fontawesome.js @@ -21,7 +21,8 @@ import { faMinus, faFloppyDisk, faArrowLeft, - faRightFromBracket + faRightFromBracket, + faFilter } from '@fortawesome/free-solid-svg-icons' library.add( @@ -45,7 +46,8 @@ library.add( faMinus, faFloppyDisk, faArrowLeft, - faRightFromBracket + faRightFromBracket, + faFilter ) config.autoAddCss = false diff --git a/Astrapia/services/layoutService.ts b/Astrapia/services/layoutService.ts index 64c597d..2128b32 100644 --- a/Astrapia/services/layoutService.ts +++ b/Astrapia/services/layoutService.ts @@ -30,6 +30,10 @@ class LayoutService { public updateLayout(name: string, newName: string) { return ApiService.put(`/api/layout/${name}/${newName}`); } + + public setQueryConditions(name: string, queryConditions: any){ + return ApiService.put(`/api/layout/${name}/queryConditions`, queryConditions) + } } export default new LayoutService(); From bd2f4e3e410d16b8770869a34dd457ea101a51c2 Mon Sep 17 00:00:00 2001 From: Tristan LOSADA BENINI Date: Wed, 13 Mar 2024 23:25:34 +0100 Subject: [PATCH 4/7] feat(astrapia): add styling frame NETANOL-230 --- Astrapia/components/QueryConditionButton.vue | 7 +- Astrapia/components/QueryConditionForm.vue | 107 +++++++++++++++---- Astrapia/pages/topology.vue | 2 +- 3 files changed, 93 insertions(+), 23 deletions(-) diff --git a/Astrapia/components/QueryConditionButton.vue b/Astrapia/components/QueryConditionButton.vue index 0b1ffd3..8c3c765 100644 --- a/Astrapia/components/QueryConditionButton.vue +++ b/Astrapia/components/QueryConditionButton.vue @@ -6,7 +6,7 @@ - + @@ -15,7 +15,12 @@ import {FontAwesomeIcon} from "@fortawesome/vue-fontawesome"; import { ref } from 'vue'; import QueryConditionForm from "~/components/QueryConditionForm.vue"; +const props = defineProps<{ + layout: string +}>(); + const isVisible = ref(false); +const layout = props.layout; const toggleForm = () => { isVisible.value = !isVisible.value; diff --git a/Astrapia/components/QueryConditionForm.vue b/Astrapia/components/QueryConditionForm.vue index 22cb18a..4fb8bbb 100644 --- a/Astrapia/components/QueryConditionForm.vue +++ b/Astrapia/components/QueryConditionForm.vue @@ -1,43 +1,45 @@ diff --git a/Astrapia/pages/topology.vue b/Astrapia/pages/topology.vue index fd38707..9d35b3c 100644 --- a/Astrapia/pages/topology.vue +++ b/Astrapia/pages/topology.vue @@ -7,7 +7,7 @@ @change="handleTimeframeSelection" :from-value="timeframeSelectorFrom" :to-value="timeframeSelectorTo"/> - + From 665391eee97953b49c7700adf798a73a801fd25d Mon Sep 17 00:00:00 2001 From: Tristan LOSADA BENINI Date: Thu, 14 Mar 2024 12:39:46 +0100 Subject: [PATCH 5/7] feat(astrapia): add QueryConditions logic NETANOL-230 --- Astrapia/components/GraphFilterMenu.vue | 4 +- Astrapia/components/QueryConditionButton.vue | 6 +- Astrapia/components/QueryConditionForm.vue | 74 ++++++++++++-------- Astrapia/pages/topology.vue | 9 ++- Astrapia/services/layoutService.ts | 8 ++- 5 files changed, 65 insertions(+), 36 deletions(-) diff --git a/Astrapia/components/GraphFilterMenu.vue b/Astrapia/components/GraphFilterMenu.vue index 9bb8540..3fe0a2c 100644 --- a/Astrapia/components/GraphFilterMenu.vue +++ b/Astrapia/components/GraphFilterMenu.vue @@ -21,7 +21,8 @@ const props = defineProps({ const emit = defineEmits<{ layersFetched: [], - menuOpened: [boolean] + menuOpened: [boolean], + queryConditions: [any] }>(); const graphFilterMenuState = ref({ @@ -35,6 +36,7 @@ const graphFilterMenuState = ref({ async function getLayersOfLayout() { const layoutData = await layoutService.getLayoutByName(graphFilterMenuState.value.selectedLayout.name); graphFilterMenuState.value.selectedLayout.layers = layoutData.layers; + emit('queryConditions', layoutData.queryConditions); emit('layersFetched'); } diff --git a/Astrapia/components/QueryConditionButton.vue b/Astrapia/components/QueryConditionButton.vue index 8c3c765..954e050 100644 --- a/Astrapia/components/QueryConditionButton.vue +++ b/Astrapia/components/QueryConditionButton.vue @@ -6,7 +6,7 @@ - + @@ -16,11 +16,13 @@ import { ref } from 'vue'; import QueryConditionForm from "~/components/QueryConditionForm.vue"; const props = defineProps<{ - layout: string + layout: any, + queryConditions: any }>(); const isVisible = ref(false); const layout = props.layout; +const queryConditions = props.queryConditions; const toggleForm = () => { isVisible.value = !isVisible.value; diff --git a/Astrapia/components/QueryConditionForm.vue b/Astrapia/components/QueryConditionForm.vue index 4fb8bbb..f66f988 100644 --- a/Astrapia/components/QueryConditionForm.vue +++ b/Astrapia/components/QueryConditionForm.vue @@ -34,7 +34,7 @@
Port Whitelist:
- +
@@ -60,7 +60,8 @@ const emit = defineEmits<{ }>() const props = defineProps<{ - layout: string + layout: any, + queryConditions: any }>(); const allowDuplicates = ref(true); @@ -79,7 +80,6 @@ const saveForm = () => { dataProtocolsWhitelist: dataProtocolsWhitelist.value, portsWhitelist: portsWhitelist.value }; - console.log(jsonData); LayoutService.setQueryConditions('test',jsonData); cancelForm(); }; @@ -92,8 +92,8 @@ const cancelForm = () => { emit('isVisible'); }; -const addProtocol = (type) => { - const selectedProtocol = type === 'flow' ? selectedFlowProtocols : selectedDataProtocols; +const addProtocol = (type: string) => { + const selectedProtocol: string = type === 'flow' ? selectedFlowProtocols : selectedDataProtocols; if (selectedProtocol && !flowProtocolsWhitelist.value.includes(selectedProtocol) && !dataProtocolsWhitelist.value.includes(selectedProtocol)) { if (type === 'flow') { flowProtocolsWhitelist.value.push(selectedProtocol); @@ -108,7 +108,7 @@ const addProtocol = (type) => { } }; -const removeProtocol = (type, index) => { +const removeProtocol = (type: string, index: number) => { if (type === 'flow') { flowProtocolsWhitelist.value.splice(index, 1); } else { @@ -117,8 +117,8 @@ const removeProtocol = (type, index) => { }; const addPort = () => { - const port = parseInt(selectedPort); - if (!isNaN(port) && !portsWhitelist.value.includes(port)) { + const port: number = parseInt(selectedPort); + if (!isNaN(port) && port <= 65535 && !portsWhitelist.value.includes(port)) { portsWhitelist.value.push(port); selectedPort = ''; } @@ -136,6 +136,10 @@ const handleOverlayClick = (event) => { }; onMounted(() => { + allowDuplicates.value = props.queryConditions.allowDuplicates; + flowProtocolsWhitelist.value = props.queryConditions.flowProtocolsWhitelist; + dataProtocolsWhitelist.value = props.queryConditions.dataProtocolsWhitelist; + portsWhitelist.value = props.queryConditions.portsWhitelist; document.addEventListener('keydown', (event) => { if (event.key === 'Escape') { cancelForm(); @@ -146,13 +150,16 @@ onMounted(() => { diff --git a/Astrapia/pages/topology.vue b/Astrapia/pages/topology.vue index 9d35b3c..588caaf 100644 --- a/Astrapia/pages/topology.vue +++ b/Astrapia/pages/topology.vue @@ -2,12 +2,12 @@
- + - +
@@ -25,6 +25,7 @@ const layout = ref(''); const timeframeSelectorFrom = ref(new Date(new Date().getTime() - 2 * 60 * 1000).toISOString().slice(0,16)) const timeframeSelectorTo = ref(new Date().toISOString().slice(0,16)) const data = ref(); +const queryConditions = ref(null); const intervalAmount = ref(0); let fetchInterval: NodeJS.Timeout | null = null; @@ -36,6 +37,10 @@ const handleTimeframeSelection = (from: string, to: string) => { fetchAndUpdateGraph(); } +const handleQueryConditions = (conditions: any) => { + queryConditions.value = conditions; +}; + const handleIntervalAmount = (amount: number) => { intervalAmount.value = amount; if (fetchInterval) { diff --git a/Astrapia/services/layoutService.ts b/Astrapia/services/layoutService.ts index 2128b32..69c7ee7 100644 --- a/Astrapia/services/layoutService.ts +++ b/Astrapia/services/layoutService.ts @@ -7,7 +7,13 @@ export interface Layouts { export interface Layout { name: string, - layers: [] + layers: [], + queryConditions: { + allowDuplicates: boolean, + dataProtocolsWhitelist: [], + flowProtocolsWhitelist: [], + portsWhitelist: [] + } } class LayoutService { From 5588b9b08689aa84999bb0a8c59a22303170f37e Mon Sep 17 00:00:00 2001 From: Tristan LOSADA BENINI Date: Thu, 14 Mar 2024 13:25:24 +0100 Subject: [PATCH 6/7] fix(astrapia): fix styling and QoL NETANOL-230 --- Astrapia/components/QueryConditionButton.vue | 1 + Astrapia/components/QueryConditionForm.vue | 10 ++++++---- Astrapia/pages/topology.vue | 6 +++--- 3 files changed, 10 insertions(+), 7 deletions(-) diff --git a/Astrapia/components/QueryConditionButton.vue b/Astrapia/components/QueryConditionButton.vue index 954e050..04a05e7 100644 --- a/Astrapia/components/QueryConditionButton.vue +++ b/Astrapia/components/QueryConditionButton.vue @@ -36,6 +36,7 @@ const toggleForm = () => { margin-right: 4px; background: none; border: solid 1px #797878; + border-radius: 3px; cursor: pointer; outline: none; width: 1.5vw; diff --git a/Astrapia/components/QueryConditionForm.vue b/Astrapia/components/QueryConditionForm.vue index f66f988..f013e3e 100644 --- a/Astrapia/components/QueryConditionForm.vue +++ b/Astrapia/components/QueryConditionForm.vue @@ -136,10 +136,12 @@ const handleOverlayClick = (event) => { }; onMounted(() => { - allowDuplicates.value = props.queryConditions.allowDuplicates; - flowProtocolsWhitelist.value = props.queryConditions.flowProtocolsWhitelist; - dataProtocolsWhitelist.value = props.queryConditions.dataProtocolsWhitelist; - portsWhitelist.value = props.queryConditions.portsWhitelist; + if(props.queryConditions) { + allowDuplicates.value = props.queryConditions.allowDuplicates; + flowProtocolsWhitelist.value = props.queryConditions.flowProtocolsWhitelist; + dataProtocolsWhitelist.value = props.queryConditions.dataProtocolsWhitelist; + portsWhitelist.value = props.queryConditions.portsWhitelist; + } document.addEventListener('keydown', (event) => { if (event.key === 'Escape') { cancelForm(); diff --git a/Astrapia/pages/topology.vue b/Astrapia/pages/topology.vue index 588caaf..5f958db 100644 --- a/Astrapia/pages/topology.vue +++ b/Astrapia/pages/topology.vue @@ -2,12 +2,12 @@
- - + - +
From 0ac400ad77953c1e6f655e8b3fb0447f6eb6dfb6 Mon Sep 17 00:00:00 2001 From: Alexander ZIVNY-HARTIG Date: Mon, 8 Apr 2024 14:33:09 +0200 Subject: [PATCH 7/7] refac(astrapia): remove v-if for timeframe NETANOL-230 --- Astrapia/components/QueryConditionForm.vue | 1 + Astrapia/pages/topology.vue | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/Astrapia/components/QueryConditionForm.vue b/Astrapia/components/QueryConditionForm.vue index f013e3e..1541bc4 100644 --- a/Astrapia/components/QueryConditionForm.vue +++ b/Astrapia/components/QueryConditionForm.vue @@ -26,6 +26,7 @@ +
diff --git a/Astrapia/pages/topology.vue b/Astrapia/pages/topology.vue index 5f958db..5f19d5e 100644 --- a/Astrapia/pages/topology.vue +++ b/Astrapia/pages/topology.vue @@ -3,11 +3,11 @@ - - +