{"version":3,"file":"main.js","mappings":"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wCAFV,IAAC1F,SAAkBC,UAA0BpD,QAAA,CAdtD8I,MACA7I,KACA0C,EACAa,GACAD,GACAmF,GACA/E,GACAD,GACAkF,GACAtF,GACAM,GACA+E,GACAtF,KAAyB,EClBvB,MAAO0F,sDAAkB,mCAAlBA,IAAkB,wCAFlB,IAAC5F,SAAkBC,UAA0BpD,QAAA,CAD9Cc,KAAyB6B,EAAc1C,OAAY,ECoBzD,MAAO+I,sDAAS,mCAATA,GAASC,UAAA,CAhBR5I,KAAY,wCAUb,CACT6I,MACArhF,MACAs7E,SAAkBC,UACnBpD,QAAA,CAZC8I,MACAnG,EACAkG,GACA3F,GACA6F,GACAhJ,GACA0D,QAAa,ECtBbv7E,eAAYihF,EACdC,SAGFC,QACGC,gBAAgBN,IAChBO,MAAO7wC,GAAQrB,QAAQ/vC,MAAMoxC,sBCZhC,IAAA5gD,GAAA,CACA,YACA,eACA,YACA,eACA,kBACA,eACA,kBACA,eACA,kBACA,eACA,kBACA,eACA,kBACA,eACA,kBACA,eACA,kBACA,eACA,YACA,eACA,YACA,eACA,YACA,eACA,YACA,eACA,YACA,eACA,kBACA,eACA,YACA,eACA,YACA,eACA,YACA,eACA,YACA,eACA,YACA,eACA,YACA,eACA,WACA,cACA,YACA,eACA,YACA,eACA,kBACA,eACA,kBACA,eACA,YACA,eACA,YACA,eACA,eACA,kBACA,eACA,kBACA,eACA,kBACA,eACA,kBACA,eACA,kBACA,cACA,iBACA,eACA,kBACA,eACA,kBACA,YACA,eACA,YACA,eACA,kBACA,eACA,kBACA,eACA,kBACA,eACA,YACA,eACA,WACA,cACA,WACA,cACA,YACA,eACA,aACA,gBACA,YACA,eACA,YACA,eACA,kBACA,eACA,kBACA,eACA,YACA,eACA,YACA,eACA,YACA,eACA,YACA,eACA,kBACA,qBACA,kBACA,qBACA,YACA,eACA,YACA,eACA,YACA,eACA,YACA,eACA,YACA,eACA,eACA,kBACA,YACA,eACA,YACA,eACA,YACA,eACA,kBACA,eACA,YACA,eACA,WACA,cACA,WACA,cACA,YACA,eACA,YACA,eACA,YACA,eACA,YACA,eACA,YACA,eACA,kBACA,eACA,YACA,eACA,YACA,eACA,YACA,eACA,WACA,cACA,YACA,eACA,YACA,eACA,YACA,eACA,YACA,eACA,YACA,eACA,YACA,eACA,YACA,eACA,YACA,eACA,kBACA,eACA,WACA,cACA,YACA,eACA,UACA,aACA,YACA,eACA,YACA,eACA,kBACA,eACA,YACA,eACA,eACA,kBACA,cACA,iBACA,YACA,eACA,YACA,eACA,kBACA,eACA,YACA,eACA,YACA,eACA,YACA,eACA,YACA,eACA,WACA,cACA,YACA,eACA,YACA,eACA,YACA,eACA,WACA,iBACA,oBACA,cACA,YACA,eACA,YACA,eACA,YACA,eACA,YACA,eACA,YACA,eACA,aACA,gBACA,YACA,eACA,YACA,eACA,YACA,eACA,eACA,kBACA,aACA,gBACA,YACA,eACA,aACA,gBACA,aACA,gBACA,mBACA,gBACA,eACA,kBACA,YACA,eACA,YACA,eACA,WACA,iBACA,oBACA,cACA,UACA,aACA,iBACA,oBACA,WACA,cACA,eACA,kBACA,eACA,kBACA,eACA,kBACA,eACA,mBAIA,SAAA0xF,EAAA3iF,IACA,IAAA3K,EAAAutF,EAAA5iF,IACA,OAAA6iF,EAAAxtF,EACA,CACA,SAAAutF,EAAA5iF,IACA,IAAA6iF,EAAAjgB,EAAA3xE,GAAA+O,IAAA,CACA,IAAAmzC,EAAA,IAAAqtC,MAAA,uBAAAxgF,GAAA,KACA,MAAAmzC,EAAAz/C,KAAA,mBACAy/C,CACA,CACA,OAAAliD,GAAA+O,GACA,CACA2iF,EAAAnjF,KAAA,WACA,OAAAvH,OAAAuH,KAAAvO,GACA,EACA0xF,EAAAxhE,QAAAyhE,EACAE,GAAAC,QAAAJ,EACAA,EAAAttF,GAAA","names":["Breakpoints","XS","S","M","L","XL","titleConfig","urlChunk","title","InterfaceStateService","constructor","breakPointObserver","router","this","_breakpointIndex$","BehaviorSubject","_mainTitle$","_routedUrlHistory$","_dashboardFilter$","buildDashBoardFilter","_routingFilter$","buildRoutingFilter","mainTitleHandler$","subscribe","breakpointHandler$","lastRoutedUrlHandler$","breakpointIndex$","asObservable","mainTitle$","routedUrlHistory$","lastRoutedUrl","history","value","length","addUrlToHistory","url","push","next","mapBreakpointToIndex","breakpoints","resetStore","resetDashBoardFilter","resetRoutingFilter","setDashboardFilter","filterForm","dashboardFilter$","dashboardFilter","siteId","brandName","source","deviceType","status","UntypedFormGroup","UntypedFormControl","brand_name","device_type_id","setRoutingFilter","routingFilter$","keyword","site","destination","tileView","filter","events","pipe","event","NavigationEnd","map","ele","includes","tap","observe","state","index","i0","i1","i2","factory","ɵfac","providedIn","DataStoreService","interfaceState","_brands$","undefined","_codecs$","_countries$","_devices$","_allDevices$","_deviceMonitoring$","_deviceTypes$","_gateways$","_gatewayRssi$","_interfaces$","_organizations$","_routings$","_routing$","_site$","_sites$","_sources$","_users$","_deviceDownlinks$","_sortBrands","a","b","name","localeCompare","sortDeviceTypes","_sortSources","code","_dataTags$","deviceTypes$","types","tags","Set","forEach","type","functions","tag","add","toLowerCase","Array","from","sort","brands","getValue","brands$","setBrands","addBrand","brand","currentValue","updateBrand","brandUpdate","updated","deleteBrand","brandId","id","codecs","codecs$","setCodecs","devices","countries","countries$","setCountries","dataTags$","devices$","getDeviceByID","find","device","device_id","setDevices","addDevice","deleteDevice","deviceId","allDevices","setAllDevices","deviceMonitoring$","setDeviceMonitoring","stats","setDeviceTypes","deviceTypes","getDeviceTypeByID","addDeviceType","updateDeviceType","newType","typesValue","findIndex","model","splice","deleteDeviceType","deviceTypeId","newValue","groupedDeviceTypes$","mapper","reduce","acc","curr","brandsMap","models","results","Object","values","item","changeDeviceTypeActiveState","indexToUpdate","enabled","gateways$","setGateways","gateways","gatewayRssi","setGatewayRssi","gatewayId","rssiData","interfaces$","setInterfaces","interfaces","addInterface","interf","updateInterface","interfaceUpdate","organizations$","setOrganizations","organizations","routings","routings$","setRoutings","addRouting","routing","routes","routing$","setRouting","resetRouting","updateRoute","routeUpdate","route","deleteRoute","changeRouteActiveState","is_active","sites","sites$","setSites","sortSites","findSite","addSite","newSites","updateSite","siteUpdate","country","isoCode","sources$","sources","setSources","users","users$","setUsers","addUser","user","updateUser","u","email","deleteUser","deviceDownlinks$","setDeviceDownlinks","downlink","deviceClasses","regions","dataRates","region","usDataRates","option","AuthService","afAuth","data","login","signInWithPopup","GoogleAuthProvider","then","navigateByUrl","logout","signOut","isTechnicalAdmin","_claims","technical_admin","isAdmin","admin","isMaintainer","maintainer","isMaintainerOnSite","parseRouteIdParam","chunks","split","routeCollectionId","interfaceDocId","isMaintainerOnRoute","routeId","hasWriteRightsForProject","path","proj","indexOf","userHasMultipleSiteAccess","sitesAccessible","claims","operator","accessibleSites","isLoggedIn$","isAuthorized$","idTokenResult","switchMap","tokenRes","throwError","of","mapClaims","catchError","bool","getToken$","authState","getIdToken","res","accessFlags","keys","key","startsWith","userEmail$","i3","AuthInterceptor","auth","intercept","req","token","handle","clone","setHeaders","Authorization","HttpErrorInterceptor","snackBar","request","error","statusText","message","errorMessage","toUpperCase","open","duration","httpInterceptorProviders","provide","HTTP_INTERCEPTORS","useClass","multi","environment","apiKey","authDomain","databaseURL","projectId","storageBucket","messagingSenderId","appId","defaultMapCenter","lat","lng","layerTilesUrl","attribution","CustomHttpParamEncoder","encodeKey","encodeURIComponent","encodeValue","decodeKey","decodeURIComponent","decodeValue","DevicesService","http","configsUrl","commandsUrl","deviceTypesBaseUrl","getBrands","get","result","items","createBrand","formData","FormData","append","post","put","delete","getCodecList","decodeTestPayload","payload","blueprint","port","getCountries","response","getDevices","params","HttpParams","encoder","getDeviceById","getDeviceHierarchyTree","createDevice","deviceInfo","createDevices","updateDevice","updateDevicePicture","devicePicture","image_file","updateDeviceAlarm","alarm","setDeviceCalibration","calibrations","moveDevices","deviceIds","hierarchyPrefix","sendDownlink","downlinkInfo","sendMultiDownlink","device_ids","getDeviceDownlinks","getDeviceMessages","minTimestamp","maxTimestamp","Date","now","messageLimit","pageAction","referenceTimestamp","tag_id","toString","getDeviceMessagesCount","getLastMessageOfDevice","getMonitoringStats","getDeviceTypes","full","createDeviceType","typeId","encodedId","updateDeviceTypeCodec","decoderBlueprint","patch","getGateways","importGateway","gatewayImportInfo","getGatewayRssi","getRoutingInterfaces","createInterface","getOrganizations","getRoutings","getRouteById","getPatternData","pattern","pluck","createRouting","routeInfo","updateRouting","deleteRouting","updateLockRouting","is_locked","getSites","getSite","createSite","updateSiteAlert","notificationConfig","getSources","getUsers","createUser","userInfo","encodedMail","updateUserAlarm","mesDeadLetterQueueGetApproximateNumberOfMessages","mesDeadLetterQueuePollMessages","mesDeadLetterQueueRedrive","responseType","mesDeadLetterQueueGetLastRedriveTask","DataLoaderService","loadBrands","loadCodecs","loadCountries","loadDevices","every","v","loadDevicesFromLocalData","getDevicesByFilters","project_id","deviceDto","checkStatus","condition","statistics","low_battery","last_uplink_error","last_uplink","dev","alarmInfo","loadDeviceMonitoringStats","loadDeviceMonitoringStatsFromLocal","devicesList","devicesNumber","devicesWithLowBattery","devicesWithLastUplinkError","devicesWithLowBatteryLastUplinkError","devicesWithNoMessageYet","i","devicesWithNoWarning","devices_with_no_warning","devices_with_last_uplink_error","devices_with_low_battery","devices_with_low_battery_last_uplink_error","devices_with_no_message_yet","loadDeviceTypes","deviceTypeInfo","decodingInfo","loadGateways","gw","loadGatewayRssi","rssi","loadInterfaces","created","loadOrganizations","loadRoutings","loadRouting","createExportRoute","dest","updateExportRoute","routeID","lockedText","loadSites","s","update","alertConfig","loadSources","loadUsers","updateUserAlert","alert","loadDeviceDownlinks","downlinks","timestamp","i4","GatewaysService","getList","query","fromEntries","entries","toISOString","mapOptions","layers","tileLayer","maxZoom","DisplayPositionMapComponent","mapContainerId","markerLayer","markerClusterGroup","bounds","mapDevicesToBounds","updateMap","mapDevicesToMarkerLayer","ngAfterViewInit","document","getElementById","addTo","fitBounds","removeLayer","cluster","showCoverageOnHover","metadata","marker","latLng","icon","iconSize","iconAnchor","iconUrl","shadowUrl","bindTooltip","mkr","addLayer","coords","latLngBounds","ngOnDestroy","remove","selectors","inputs","decls","vars","consts","template","rf","ctx","LoaderComponent","diameter","color","mode","LoaderDirective","viewRef","tplRef","cdRef","clear","ngOnChanges","appLoaderOn","appLoader","_createLoaderTemplate","sub","unsubscribe","Observable","appLoaderWith","first","_createViewTemplate","createEmbeddedView","context","$implicit","markForCheck","component","resolveComponentFactory","createComponent","features","device_r1","DeviceListComponent_td_6_mat_icon_1_Template","DeviceListComponent_td_6_mat_icon_2_Template","DeviceListComponent_td_6_mat_icon_3_Template","DeviceListComponent_td_6_mat_icon_4_Template","DeviceListComponent_td_6_mat_icon_5_Template","device_r2","ctx_r2","screensizeIndex$","siteLongName","device_r4","_c0","device_r5","DeviceListComponent_td_12_span_2_Template","DeviceListComponent_td_12_span_3_Template","device_r6","DeviceListComponent_td_15_ng_template_3_ng_template_1_mat_icon_0_Template","DeviceListComponent_td_15_ng_template_3_ng_template_1_mat_icon_1_Template","DeviceListComponent_td_15_ng_template_3_ng_template_1_mat_icon_2_Template","DeviceListComponent_td_15_ng_template_3_mat_icon_0_Template","DeviceListComponent_td_15_ng_template_3_ng_template_1_Template","noPercentTpl_r7","DeviceListComponent_td_15_ng_container_2_Template","DeviceListComponent_td_15_ng_template_3_Template","batteryPowered","batteryTemplate_r8","device_r10","_r9","onShowRoutings","device_r12","_r11","onShowDetails","DeviceListComponent","dataSource","MatTableDataSource","initializeSort","datas","displayedColumns","iso_code","site_long_name","sortingDataAccessor","property","getTime","viewQuery","MatSort","DeviceListComponent_th_2_Template","DeviceListComponent_td_3_Template","DeviceListComponent_th_5_Template","DeviceListComponent_td_6_Template","DeviceListComponent_th_8_Template","DeviceListComponent_td_9_Template","DeviceListComponent_th_11_Template","DeviceListComponent_td_12_Template","DeviceListComponent_th_14_Template","DeviceListComponent_td_15_Template","DeviceListComponent_th_17_Template","DeviceListComponent_td_18_Template","DeviceListComponent_th_20_Template","DeviceListComponent_td_21_Template","DeviceListComponent_tr_22_Template","DeviceListComponent_tr_23_Template","trigger","style","height","minHeight","transition","animate","DeviceStatusChartComponent","formatGraphData","colors","datasets","backgroundColor","Chart","loInst","canvas","destroy","chart","options","responsive","aspectRatio","tooltips","animation","showTooltips","GatewayStatusChartComponent","active","inactive","isEqualAndEven","formatDisplayedCount","equalAndEven","DashboardComponent_div_0_div_1_1_ng_template_0_Template","DashboardComponent_div_0_div_1_1_Template","formTpl_r1","DashboardComponent_div_0_mat_expansion_panel_3_4_ng_template_0_Template","DashboardComponent_div_0_mat_expansion_panel_3_4_Template","stats_r2","monitoringStats$","gwstats_r4","gatewayStats$","site_r6","brand_r7","model_r8","label","source_r9","DashboardComponent_div_0_ng_template_35_form_0_mat_option_7_Template","DashboardComponent_div_0_ng_template_35_form_0_mat_option_15_Template","DashboardComponent_div_0_ng_template_35_form_0_mat_option_23_Template","DashboardComponent_div_0_ng_template_35_form_0_mat_option_31_Template","DashboardComponent_div_0_ng_template_35_form_0_div_49_Template","_r5","mapTmpl_r10","openMap","models$","DashboardComponent_div_0_ng_template_35_form_0_Template","displayedDevices_r11","DashboardComponent_div_0_ng_template_37_mat_dialog_content_0_Template","displayedDevices$","DashboardComponent_div_0_div_1_Template","DashboardComponent_div_0_mat_expansion_panel_3_Template","DashboardComponent_div_0_div_9_Template","DashboardComponent_div_0_div_11_Template","DashboardComponent_div_0_app_device_status_chart_14_Template","DashboardComponent_div_0_app_loader_17_Template","DashboardComponent_div_0_div_24_Template","DashboardComponent_div_0_div_26_Template","DashboardComponent_div_0_app_gateway_status_chart_29_Template","DashboardComponent_div_0_ng_template_35_Template","DashboardComponent_div_0_ng_template_37_Template","isLoadingGateways$","DashboardComponent","dataLoader","gatewaysService","dialog","_loadData","ngOnInit","valueChanges","untilDestroyed","loadGatewaysStats","timer","templateRef","setValue","merge","combineLatest","limit","lastCheckinAfter","responseAll","responseActive","total","i5","DashboardComponent_div_0_Template","__decorate","UntilDestroy","routingCreationSteps","routingDestinationTypes","tmp_1_0","ctx_r0","site_r3","siteAlreadySelected","i_r4","InterfaceCreationComponent_ng_container_11_mat_option_6_Template","_r2","removeSite","controls","destination_r5","InterfaceCreationComponent","dialogRef","form","buildForm","saving","prefillForm","FormGroup","FormControl","Validators","required","siteIds","FormArray","disabled","topic","ix","removeAt","interfaceInfo","dataFormat","interfaceConfig","submit","_this","_asyncToGenerator","close","MAT_DIALOG_DATA","InterfaceCreationComponent_h2_0_Template","InterfaceCreationComponent_h2_1_Template","InterfaceCreationComponent_ng_container_11_Template","InterfaceCreationComponent_mat_option_22_Template","invalid","site_r1","routingDestinationType_r2","InterfaceFilterComponent_form_1_mat_option_13_Template","InterfaceFilterComponent_form_1_mat_option_21_Template","InterfaceFilterComponent","interfacesFiltered","EventEmitter","loadData","buildFilterForm","handleInputs","startWith","emitFilteredInterfaces","searchFilter","siteFilter","destinationFilter","emit","search","outputs","InterfaceFilterComponent_form_1_Template","InterfaceManagementComponent_div_0_section_1_div_1_1_ng_template_0_Template","InterfaceManagementComponent_div_0_section_1_div_1_1_Template","InterfaceManagementComponent_div_0_section_1_mat_expansion_panel_3_4_ng_template_0_Template","InterfaceManagementComponent_div_0_section_1_mat_expansion_panel_3_4_Template","InterfaceManagementComponent_div_0_section_1_div_1_Template","InterfaceManagementComponent_div_0_section_1_mat_expansion_panel_3_Template","ctx_r1","getSiteName","siteId_r5","interf_r4","_r3","editInterface","InterfaceManagementComponent_div_0_section_2_div_12_div_4_Template","getDestinationName","InterfaceManagementComponent_div_0_section_2_div_12_Template","filteredInterfaces$","_r6","$event","_r7","updateFilteredInterfaces","InterfaceManagementComponent_div_0_section_1_Template","InterfaceManagementComponent_div_0_section_2_Template","InterfaceManagementComponent_div_0_button_3_Template","InterfaceManagementComponent_div_0_ng_template_4_Template","InterfaceManagementComponent","destinationId","routingDestinationType","InterfaceManagementComponent_div_0_Template","AuthGuard","canActivate","techAdminGuard","inject","Router","createUrlTree","RouterOutletComponent","LoginComponent","LoginResolver","resolve","isLogged","navigate","AlertingService","_selectedSite$","siteValue","_userOpen$","_devicesOpen$","_deviceFilter$","buildDeviceFilter","setSelectedSite","selectedSite$","selectedSite","setUserOpen","userOpen","setDevicesOpen","devicesOpen","setDeviceFilter","deviceFilter$","deviceFilter","resetDeviceFilter","user_r4","toggleUserAlert","userAlertForSite","userHasUpdateRight","toggleBatteryAlert","toggleConnectionAlert","updateConnectionAlertDelay","battery","enable","connection","delay","AlertingComponent_div_0_ng_container_2_Template","_r1","toggleSiteAlert","setUserPanelOpenState","AlertingComponent_div_0_div_25_Template","AlertingComponent_div_0_p_26_Template","setDevicePanelOpenState","AlertingComponent_div_0_ng_container_33_Template","AlertingComponent_div_0_div_47_Template","AlertingComponent_div_0_p_48_Template","siteFormCtrlTmpl_r7","alertEnabled","siteSelection","alerting","userEmailSearch","deviceFilterTmpl_r8","AlertingComponent_ng_template_1_ng_container_3_Template","site_r9","AlertingComponent_ng_template_3_mat_option_4_Template","brand_r10","model_r11","source_r12","AlertingComponent_ng_template_5_form_0_mat_option_7_Template","AlertingComponent_ng_template_5_form_0_mat_option_15_Template","AlertingComponent_ng_template_5_form_0_mat_option_23_Template","deviceFilterForm","AlertingComponent_ng_template_5_form_0_Template","AlertingComponent","resetFilters","getDevicesForSelectedSite","getUsersForSite","searchValue","roles","role","patchValue","showSiteSelectionPrompt","target","parseInt","alertInfo","alerts","siteAlertConf","cron","timezone","AlertingComponent_div_0_Template","AlertingComponent_ng_template_1_Template","AlertingComponent_ng_template_3_Template","AlertingComponent_ng_template_5_Template","selectionPromptTmpl_r13","messageToConfirm","html","ConfirmationDialogComponent","isHtml","ConfirmationDialogComponent_ng_container_1_Template","ConfirmationDialogComponent_ng_template_2_Template","ConfirmationDialogComponent_ng_template_4_Template","htmlTpl_r3","rawTpl_r2","imgPreviewUrl","ImageUploadComponent","imgSelected","img","previewImg","selectionChanged","files","match","file","reader","FileReader","readAsDataURL","onload","ImageUploadComponent_mat_icon_3_Template","ImageUploadComponent_img_4_Template","BrandCreationComponent_mat_form_field_6_mat_error_4_Template","tmp_2_0","brandForm","hasError","deleteBrandTmpl_r4","BrandCreationComponent","imagePreviewUrl","logoUrl","buildBrandForm","imageFile","bd","FormBuilder","nonNullable","group","description","afterClosed","confirm","formValues","getRawValue","BrandCreationComponent_h2_0_Template","BrandCreationComponent_h2_1_Template","BrandCreationComponent_mat_form_field_6_Template","BrandCreationComponent_button_12_Template","BrandCreationComponent_ng_template_18_Template","brand_r2","ModelCreationComponent","modelForm","buildModelForm","dt","sourceId","connectivity","connectivityFromSource","installation","dimensions","weight","batteryLife","configurable","frequency","security","atex","encoderFunctionName","decoderFunctionName","manageConnectivityChanges","isFirefly","matchedSource","info","image","ModelCreationComponent_h2_0_Template","ModelCreationComponent_h2_1_Template","ModelCreationComponent_mat_error_11_Template","ModelCreationComponent_mat_error_12_Template","ModelCreationComponent_mat_option_25_Template","ModelCreationComponent_div_35_Template","tmp_5_0","tmp_6_0","tag_r1","last_r2","ctx_r3","toggleDisable","ModelItemComponent_ng_container_11_button_1_mat_icon_1_Template","ModelItemComponent_ng_container_11_button_1_mat_icon_2_Template","emitDelete","ModelItemComponent_ng_container_11_button_1_Template","ModelItemComponent_ng_container_11_button_2_Template","ModelItemComponent_ng_container_12_button_1_mat_icon_1_Template","ModelItemComponent_ng_container_12_button_1_mat_icon_2_Template","ModelItemComponent_ng_container_12_button_1_Template","ModelItemComponent","selectable","editable","deleted","selected","emitSelection","stopPropagation","ModelItemComponent_ng_container_5_Template","ModelItemComponent_span_6_Template","ModelItemComponent_ng_container_11_Template","ModelItemComponent_ng_container_12_Template","slice","createdByApi","manufacturer_r1","source_r2","tag_r3","ModelFilterComponent_form_0_mat_option_14_Template","ModelFilterComponent_form_0_mat_option_21_Template","ModelFilterComponent_form_0_mat_option_28_Template","ModelFilterComponent_form_0_mat_slide_toggle_29_Template","ModelFilterComponent_form_0_mat_slide_toggle_30_Template","manufacturers","showViewOption","ModelFilterComponent","modelsFiltered","tileViewActive","emitFilteredModels","val","brandFilter","sourceFilter","dataTagFilter","keywordFilter","disabledFilter","manufacturer","dataTags","showDisabled","ModelFilterComponent_form_0_Template","NoResultComponent","BrandItemComponent","clickable","CatalogueComponent_div_1_1_ng_template_0_Template","CatalogueComponent_div_1_1_Template","CatalogueComponent_mat_expansion_panel_3_4_ng_template_0_Template","CatalogueComponent_mat_expansion_panel_3_4_Template","brand_r3","editBrand","updateBrandTmpl","brands_r7","toggle","_r8","deleteModel","model_r9","viewDetails","CatalogueComponent_ng_container_15_div_2_app_model_item_1_Template","models_r10","_r13","model_r12","editModel","_r14","CatalogueComponent_ng_container_15_div_3_div_12_ng_container_9_button_1_Template","CatalogueComponent_ng_container_15_div_3_div_12_ng_container_9_button_2_Template","CatalogueComponent_ng_container_15_div_3_div_12_ng_container_9_Template","CatalogueComponent_ng_container_15_div_3_div_12_Template","filteredModels$","CatalogueComponent_ng_container_15_app_no_result_1_Template","CatalogueComponent_ng_container_15_div_2_Template","CatalogueComponent_ng_container_15_div_3_Template","_r15","_r16","onFilterChanged","setViewSelection","CatalogueComponent","deviceHttp","creationParams","step","HOME_CATALOGUE_TEXT","modelLoader","modelId","answer","relativeTo","dT","i6","i7","i8","CatalogueComponent_div_1_Template","CatalogueComponent_mat_expansion_panel_3_Template","CatalogueComponent_app_brand_item_9_Template","CatalogueComponent_button_11_Template","CatalogueComponent_div_13_Template","CatalogueComponent_div_14_Template","CatalogueComponent_ng_container_15_Template","CatalogueComponent_button_16_Template","CatalogueComponent_ng_template_17_Template","getNewDecoderBlueprint","config","newDecodingConfig","json_sample","variables","fireflyVars","parserElements","calculations","supportedValueTypes","measurementType","unit","order","writeBusinessFieldUnit","writeBusinessField","fromSource","mandatoryFields","keyName","valid","optional","allowedTypes","measurementTypes","basic","sign","detail","temperature","energy","power","concentration","pressure","volume","flow","distance","time","turbidity","other","ParserCreationService","_protectedConfigs","hexBlueprint","_hexBlueprint","resetBlueprints","_jsonBlueprint","jsonBlueprint","deleteUnused","filterMessageFields","setBlueprint","bp","setBlueprintType","setJsonBlueprintConfig","setHexBlueprintConfig","decoderConfig","singleParserIds","cal","updateSingleParserList","ids","d","singleParserList","flat","variable","mapJsonToMessageFields","json","fields","recursive","obj","newPath","field","outputName","replace","duplicateOutput","isArray","reconstructMapping","mappingResult","mappingStart","JSON","parse","mappedFields","deletedFields","resField","bluePrint","parserTypeSelected","_r4","ParserTypeSelectionComponent","ParserTypeSelectionComponent_div_4_Template","ParserTypeSelectionComponent_div_5_Template","ParserTypeSelectionComponent_div_6_Template","ParserTypeSelectionComponent_div_7_Template","formulaValidator","control","invalidFormula","variablesValidator","variablesNames$","formValue","unknownVariables","traverse","input","join","variableAlreadyExistValidator","alreadyExist","resultPreview","BlueprintTestComponent","parserCreation","testBlueprint","decodedPayload","statusCode","BlueprintTestComponent_mat_error_9_Template","BlueprintTestComponent_mat_error_14_Template","BlueprintTestComponent_div_17_Template","addParserElement","parserElementForm_r4","getError","SingleParserEditorComponent_ng_container_83_mat_error_8_Template","SingleParserEditorComponent_ng_container_83_mat_checkbox_25_Template","SingleParserEditorComponent_ng_container_83_mat_checkbox_26_Template","SingleParserEditorComponent_ng_container_83_mat_form_field_27_Template","SingleParserEditorComponent_ng_container_83_mat_error_32_Template","SingleParserEditorComponent_ng_container_83_mat_error_33_Template","i_r5","onRemoveParserElement","SingleParserEditorComponent_ng_container_83_div_40_Template","parserElementBitRanges","min","max","showLittle","showSigned","showComplement","addCalculation","calculationForm_r8","SingleParserEditorComponent_ng_container_91_mat_label_3_Template","SingleParserEditorComponent_ng_container_91_mat_label_4_Template","SingleParserEditorComponent_ng_container_91_mat_error_6_Template","SingleParserEditorComponent_ng_container_91_mat_error_7_Template","SingleParserEditorComponent_ng_container_91_mat_error_8_Template","SingleParserEditorComponent_ng_container_91_mat_label_10_Template","SingleParserEditorComponent_ng_container_91_mat_label_11_Template","SingleParserEditorComponent_ng_container_91_mat_error_13_Template","SingleParserEditorComponent_ng_container_91_mat_error_14_Template","i_r9","onRemoveCalculation","SingleParserEditorComponent_ng_container_91_div_21_Template","configId","type_r15","unit_r16","i_r13","_r12","decreaseVariableOrderAtIndex","augmentVariableOrderAtIndex","varValue_r14","updateVariableType","SingleParserEditorComponent_mat_expansion_panel_92_tr_29_mat_option_17_Template","updateVariableUnit","SingleParserEditorComponent_mat_expansion_panel_92_tr_29_mat_option_23_Template","updateVariableBusinessField","checked","updateVariableBusinessFieldUnit","measurementTypeNames","getSelectedUnit","getMeasurementTypeUnits","_r10","jsonExampleTmpl_r11","openJsonPreview","SingleParserEditorComponent_mat_expansion_panel_92_p_28_Template","SingleParserEditorComponent_mat_expansion_panel_92_tr_29_Template","sortedVariableValues","jsonExample","SingleParserEditorComponent","fb","configModified","array","variables$","distinctUntilChanged","prev","autoFillForm","handleFormValueChanges","calculation","updateValueAndValidity","emitConfig","updateVariableProperty","variableName","newUnit","unitSign","swapVariableOrder","indexA","indexB","sortedVars","orderA","orderB","pE","parserElementForm","bits","littleEndian","signed","signComplement","updateParserElementBitRanges","calculationForm","formula","newVariableNames","newVarNames","updateVariables","ranges","ctrl","arr","varNames","currentVariables","existingNames","filteredVariables","newVariables","varName","has","updatedVariables","businessFields","mapVariableToBusinessField","mapVariableToUnitBusinessField","buildJsonExample","Math","random","getExampleValue","SingleParserEditorComponent_button_81_Template","SingleParserEditorComponent_ng_container_83_Template","SingleParserEditorComponent_mat_panel_title_86_Template","SingleParserEditorComponent_mat_panel_title_87_Template","SingleParserEditorComponent_p_88_Template","SingleParserEditorComponent_button_89_Template","SingleParserEditorComponent_ng_container_91_Template","SingleParserEditorComponent_mat_expansion_panel_92_Template","SingleParserEditorComponent_app_blueprint_test_93_Template","SingleParserEditorComponent_ng_template_94_Template","SingleParserDialogComponent","modifiedConfig","configValid","getTitle","sp_r2","openSingleEditorDialog","MultiParserEditorComponent","getSwitchCalculations","MultiParserEditorComponent_div_11_Template","clearInput","JsonInputComponent","fieldsParsed","isValidJson","messageJson","isValidJSON","jsonSample","parsedJson","JsonInputComponent_button_2_Template","JsonInputComponent_div_4_Template","JsonInputComponent_div_5_Template","JsonInputComponent_div_6_Template","CustomErrorStateMatcher","isErrorState","isSubmitted","submitted","dirty","touched","AutofocusDirective","el","ngAfterContentInit","setTimeout","nativeElement","focus","appAutoFocus","setSelect","matcher","opt_r3","MessageFieldMappingComponent_mat_select_8_mat_option_3_Template","selectOptions","MessageFieldMappingComponent","valueChanged","select","selectValues","emitField","verifyMapping","toggleDeleted","disable","newState","MessageFieldMappingComponent_div_3_Template","MessageFieldMappingComponent_div_4_Template","MessageFieldMappingComponent_input_7_Template","MessageFieldMappingComponent_mat_select_8_Template","MessageFieldMappingComponent_mat_error_9_Template","MessageFieldMappingComponent_mat_error_10_Template","MessageFieldMappingComponent_mat_icon_13_Template","MessageFieldMappingComponent_mat_icon_14_Template","MessageFieldMappingComponent_mat_icon_16_Template","MessageFieldMappingComponent_mat_icon_17_Template","FieldHintComponent_div_1_5_ng_template_0_Template","FieldHintComponent_div_1_p_3_Template","FieldHintComponent_div_1_p_4_Template","FieldHintComponent_div_1_5_Template","icon_r3","FieldHintComponent_div_2_3_ng_template_0_Template","FieldHintComponent_div_2_3_Template","_c1","FieldHintComponent_ng_template_3_mat_icon_0_Template","FieldHintComponent_ng_template_3_mat_icon_1_Template","FieldHintComponent","toggleDescription","FieldHintComponent_div_1_Template","FieldHintComponent_div_2_Template","FieldHintComponent_ng_template_3_Template","field_r1","i_r3","fieldChanged","mappingValidator","field_r5","JsonParserEditorComponent","parserForm","dataFields","updateMappingValidation","parsingResult","mandatory","dataFieldsControl","JsonParserEditorComponent_app_field_hint_15_Template","JsonParserEditorComponent_app_message_field_mapping_17_Template","tmp_0_0","onSave","resetParserType","switchParserType","getSingleParser","ParserTabComponent","parserType","hexBP","jsonBP","getUnknownVariablesInBlueprint","take","parser","getUnknownVariablesInParser","concat","variableNames","getUnknownVariablesInCalculation","mathNode","calculationVariables","node","SymbolNode","calculationVariable","ParserTabComponent_button_5_Template","ParserTabComponent_button_6_Template","ParserTabComponent_app_parser_type_selection_7_Template","ParserTabComponent_div_8_Template","ParserTabComponent_app_single_parser_editor_9_Template","ParserTabComponent_div_10_Template","ParserTabComponent_div_11_Template","ParserTabComponent_div_12_Template","ParserTabComponent_ng_template_13_Template","onEdit","ModelDetailComponent_div_0_button_9_mat_icon_1_Template","ModelDetailComponent_div_0_button_9_mat_icon_2_Template","ModelDetailComponent_div_0_button_8_Template","ModelDetailComponent_div_0_button_9_Template","ModelDetailComponent_div_0_button_10_Template","ModelDetailComponent_div_1_mat_tab_88_Template","noInfoMsg","highlights","configuration","ModelDetailComponent","snapshot","paramMap","updatedModel","ModelDetailComponent_div_0_Template","ModelDetailComponent_div_1_Template","DeviceIdValidator","createValidator","deviceManagement","checkIfDeviceExists","deviceAlreadyExists","DeviceCreation","generalForm","nestedFormGroups","general","technicalForm","technical","positionForm","position","metadataForm","descriptionFormControl","onSetPosition","onMetadataChange","metaData","GENERAL_INFORMATION_TEXT","POSITION_TEXT","TECHNICAL_INFORMATION_TEXT","METADATA_TEXT","fireflyCreationSteps","defaultCreationSteps","iotcoreCreationSteps","DeviceHierarchyStoreService","_deviceHierarchyTree$","searchControl","_searchControlChanges","debounceTime","_searchOptions","_searchMapper","filteredHierarchyTree$","deviceHierarchyTree$","nodes","_createMapperAndExtractNodeNamesForQuickSearch","_filterNodesBySearch","shareReplay","searchOptions$","toLocaleLowerCase","setDeviceHierarchyTree","hierarchyTree","loadDeviceHierarchy","tree","recursiveTreeSort","branch","children","getSortedFolders","getSortedDevices","child","isDevice","node1","node2","updateNode","hierarchy","getPathForNode","getNodesForPath","nodeIds","getSelectedNodeForPath","recursiveParser","currentNode","parentNodes","finalOptions","pathNodes","dupPath","stringify","rootNode","some","routeImpacted_r1","DeviceMoveConfirmationDialogComponent_ng_container_0_ng_container_10_li_4_Template","routesImpacted_r3","DeviceMoveConfirmationDialogComponent_ng_container_0_ng_container_10_Template","destinationNode","DeviceMoveConfirmationDialogComponent","dataService","deviceHierarchy","routesImpacted$","getRoutesImpacted$","sourcePath","originNode","destinationPath","isRoutingImpacted","routingPattern","oldPath","routingPatternUntilDevice","removeVariablesFromPattern","regex","RegExp","DeviceMoveConfirmationDialogComponent_ng_container_0_Template","DeviceMoveConfirmationDialogComponent_ng_template_2_Template","loader_r4","DeviceManagementService","_path$","_view$","_selectedNode$","isData","_dragData","setSelectedNode","selectedNode$","selectedNode","resetSelectedNode","addFolder","folder","setPath","path$","resetPath","setView","view","view$","resetView","activeProject","buildActiveProject","buildHierarchyPrefix","userHasWriteRights","project","activeProjectLocation","projectTag","toggleDragItem","resetDragData","hasDragData","startDraggingItem","dataTransfer","effectAllowed","_dragItem","dropDraggedItemOnNode","preventDefault","targetName","allowDroppingDraggedItem","dropEffect","preventDroppingDraggedItem","chunk","prefix","isFireflyConfiguredInSelectedSite","selectedSiteId","fireflyOrganization","console","DeviceCreationService","_activeStep$","_selectedDeviceType$","setSelectedDeviceType","selectedDeviceType","selectedDeviceType$","deviceTypeSelected","activeStep$","setActiveStep","nextStep","totalSteps","addDeviceTypeInfo","queryParams","getRouteForDeviceDataSource","sourceCode","createFireflyDevices","csv","attributeTags","projectIds","updateStoreWithMultipleDevices","err","device_type","calibrateDevice","activeStep","stepValid","FormStepperComponent","queryParamsHandling","ngContentSelectors","FormStepperComponent_button_3_Template","FormStepperComponent_ng_container_15_Template","FormStepperComponent_ng_template_16_Template","elseTemplate_r5","SelectPositionComponent","location","latitude","longitude","center","initialized","setLatLng","setPosition","zoom","on","e","latlng","i_r2","onKeyChange","item_r5","onValueChange","onRemoveMetaDataInput","nestedForms","MetadataFormComponent","metadataChange","metaDataKeys","UntypedFormArray","addEditableMetadataFields","metadataKeys","metaDataFormGroup","editableMetadata","comment","EUI","applicationEUI","activationType","deviceProfileId","networkAdress","ref","routeRefs","processingStrategyId","connectivityPlanId","networkAddress","deviceClass","updated_by","updated_at","created_by","created_at","onAddMetaDataInput","newKey","contains","updateCreationForm","mapMetaDataToFormGroup","formGroup","addControl","MetadataFormComponent_div_2_Template","DeviceTypeBannerComponent","DefaultDeviceCreationComponent_div_2_1_ng_template_0_Template","DefaultDeviceCreationComponent_div_2_1_Template","general_r2","DefaultDeviceCreationComponent_div_3_1_ng_template_0_Template","DefaultDeviceCreationComponent_div_3_1_Template","position_r3","DefaultDeviceCreationComponent_div_4_1_ng_template_0_Template","DefaultDeviceCreationComponent_div_4_1_Template","metadata_r4","flag_r6","ctx_r6","onFlagChange","DefaultDeviceCreationComponent_ng_template_5_ng_container_22_mat_checkbox_6_Template","userAccessFlags","DefaultDeviceCreationComponent_ng_template_5_mat_error_20_Template","DefaultDeviceCreationComponent_ng_template_5_mat_error_21_Template","DefaultDeviceCreationComponent_ng_template_5_ng_container_22_Template","tmp_11_0","site$","onSetLatitude","onSetLongitude","DefaultDeviceCreationComponent","deviceCreation","authService","super","activeStepConfig$","deviceControlGroups","stepQueryParamsHandler$","pathQueryParamHandler$","activeStepIndex","stepValidator","submitForm","flag","minLength","toFixed","DefaultDeviceCreationComponent_div_2_Template","DefaultDeviceCreationComponent_div_3_Template","DefaultDeviceCreationComponent_div_4_Template","DefaultDeviceCreationComponent_ng_template_5_Template","DefaultDeviceCreationComponent_ng_template_7_Template","DefaultDeviceCreationComponent_ng_template_9_Template","DeviceCreationComponent","types$","DeviceCreationComponent_section_6_Template","FireflyDeviceCreationComponent_div_2_1_ng_template_0_Template","FireflyDeviceCreationComponent_div_2_1_Template","FireflyDeviceCreationComponent_div_3_1_ng_template_0_Template","FireflyDeviceCreationComponent_div_3_1_Template","technical_r3","FireflyDeviceCreationComponent_div_4_1_ng_template_0_Template","FireflyDeviceCreationComponent_div_4_1_Template","position_r4","FireflyDeviceCreationComponent_div_5_1_ng_template_0_Template","FireflyDeviceCreationComponent_div_5_1_Template","metadata_r5","unit_r6","FireflyDeviceCreationComponent_ng_template_6_mat_form_field_23_mat_option_4_Template","rangeUnits","range_r8","FireflyDeviceCreationComponent_ng_template_6_mat_form_field_24_mat_option_4_Template","getRangesForUnit","flag_r10","FireflyDeviceCreationComponent_ng_template_6_ng_container_25_mat_checkbox_6_Template","FireflyDeviceCreationComponent_ng_template_6_mat_error_20_Template","FireflyDeviceCreationComponent_ng_template_6_mat_form_field_23_Template","FireflyDeviceCreationComponent_ng_template_6_mat_form_field_24_Template","FireflyDeviceCreationComponent_ng_template_6_ng_container_25_Template","devEui_r11","tmp_14_0","r_r12","rate_r13","FireflyDeviceCreationComponent_ng_template_8_mat_option_15_Template","FireflyDeviceCreationComponent_ng_template_8_mat_option_20_Template","applicationKey_r14","tmp_7_0","FireflyDeviceCreationComponent","dataRateHandler$","dataRate","units","range","applicationKey","validators","isClassC","FireflyDeviceCreationComponent_div_2_Template","FireflyDeviceCreationComponent_div_3_Template","FireflyDeviceCreationComponent_div_4_Template","FireflyDeviceCreationComponent_div_5_Template","FireflyDeviceCreationComponent_ng_template_6_Template","FireflyDeviceCreationComponent_ng_template_8_Template","FireflyDeviceCreationComponent_ng_template_10_Template","FireflyDeviceCreationComponent_ng_template_12_Template","PublicKeyFormat","IotcoreLogLevel","RSA_PEM","RSA_X509_PEM","ES256_PEM","ES256_X509_PEM","NONE","ERROR","INFO","DEBUG","fireflyDeviceCSVInfo","iotCoreDeviceCSVInfo","IotCoreDeviceCreationComponent_div_2_1_ng_template_0_Template","IotCoreDeviceCreationComponent_div_2_1_Template","IotCoreDeviceCreationComponent_div_3_1_ng_template_0_Template","IotCoreDeviceCreationComponent_div_3_1_Template","IotCoreDeviceCreationComponent_div_4_1_ng_template_0_Template","IotCoreDeviceCreationComponent_div_4_1_Template","IotCoreDeviceCreationComponent_div_5_1_ng_template_0_Template","IotCoreDeviceCreationComponent_div_5_1_Template","flag_r9","IotCoreDeviceCreationComponent_ng_template_6_ng_container_48_mat_checkbox_6_Template","IotCoreDeviceCreationComponent_ng_template_6_mat_error_20_Template","IotCoreDeviceCreationComponent_ng_template_6_mat_error_21_Template","updateConfigInfo","IotCoreDeviceCreationComponent_ng_template_6_ng_container_48_Template","deviceConfig","registry","tmp_15_0","cert_r12","fileInput_r11","click","IotCoreDeviceCreationComponent_ng_template_8_app_loader_6_Template","IotCoreDeviceCreationComponent_ng_template_8_p_7_Template","IotCoreDeviceCreationComponent_ng_template_8_div_8_Template","fileInputChange","loading","fileUploadForm","certificate$","IotCoreDeviceCreationComponent","fileInputEvent","fileReader","setErrors","certFormat","readAsText","logLevel","blocked","credentials","format","deviceRegion","IotCoreDeviceCreationComponent_div_2_Template","IotCoreDeviceCreationComponent_div_3_Template","IotCoreDeviceCreationComponent_div_4_Template","IotCoreDeviceCreationComponent_div_5_Template","IotCoreDeviceCreationComponent_ng_template_6_Template","IotCoreDeviceCreationComponent_ng_template_8_Template","IotCoreDeviceCreationComponent_ng_template_10_Template","IotCoreDeviceCreationComponent_ng_template_12_Template","onModelSelected","model_r3","ModelChoiceComponent","getResolver","snackbar","openFilterDialog","minWidth","ModelChoiceComponent_app_model_item_7_Template","PathGuard","pathValid","DeviceTypeSelectedGuard","typeSelected","DevicePictureUpdateComponent","pictureForm","deviceImage","imageUrl","onCancel","onSubmit","deviceImageFile","SendDownlinkDialogComponent_div_3_mat_error_5_Template","SendDownlinkDialogComponent_div_3_mat_error_6_Template","SendDownlinkDialogComponent_div_3_mat_error_11_Template","downlinkForm","SendDownlinkDialogComponent_div_4_mat_error_5_Template","SendDownlinkDialogComponent_div_4_mat_error_6_Template","downlinkIotCoreControl","evenLengthValidator","evenLength","SendDownlinkDialogComponent","dataLoaderService","payloadHex","targetPorts","isJson","isHexaDecimalPayload","isJsonPayload","onSend","successMsg","mergeMap","downlinkSentResponse","reset","isSendButtonDisabled","SendDownlinkDialogComponent_div_3_Template","SendDownlinkDialogComponent_div_4_Template","flag_r3","deviceHasFlag","DeviceUpdateComponent_ng_container_12_mat_checkbox_8_Template","cert_r7","fileInput_r6","DeviceUpdateComponent_div_13_app_loader_3_Template","DeviceUpdateComponent_div_13_p_4_Template","DeviceUpdateComponent_div_13_div_5_Template","DeviceUpdateComponent","editForm","currentDevice","Subject","updateInfo","attribute_tags","isIotCore","DeviceUpdateComponent_ng_container_12_Template","DeviceUpdateComponent_div_13_Template","tmp_4_0","field_r2","fn_r5","controlName_r6","DeviceCalibrationFunctionComponent_div_8_ng_container_11_ng_container_1_Template","form_r3","DeviceCalibrationFunctionComponent_div_8_mat_option_5_Template","setArgsOnForm","DeviceCalibrationFunctionComponent_div_8_mat_option_10_Template","DeviceCalibrationFunctionComponent_div_8_ng_container_11_Template","i_r7","deleteCalibration","DeviceCalibrationFunctionComponent","deviceUpdated","calibrationForms","uniqueKeys","function_id","args","calibration_functions","fn","createCalibrationForm","func","argsForm","markAsUntouched","choice","Symbol","iterator","setControl","DeviceCalibrationFunctionComponent_div_8_Template","DeviceCalibrationFunctionComponent_mat_error_14_Template","formArray","column_r2","ctx_r4","isTimestamp","row_r4","DataPreviewComponent_div_0_ng_container_4_th_1_Template","DataPreviewComponent_div_0_ng_container_4_td_2_Template","row_r7","selectedRow","rowSelect","DataPreviewComponent_div_0_ng_container_4_Template","DataPreviewComponent_div_0_tr_5_Template","DataPreviewComponent_div_0_tr_6_Template","columnsToDisplay","DataPreviewComponent","tableData","_received_timestamp","DataPreviewComponent_div_0_Template","DataPreviewComponent_ng_template_1_Template","noData_r8","count","CounterChipComponent","CounterChipComponent_p_3_Template","function_r1","group_r2","DetailStepperComponent_ng_container_24_p_4_Template","key_r4","DetailStepperComponent_ng_container_27_p_4_Template","DetailStepperComponent_ng_container_27_p_5_Template","replaceUnderScore","isTimeStamp","device_region","timestampToDate","downlink_r5","downlink_r6","downlink_r7","downlink_r9","onSendDownlink","DetailStepperComponent_mat_tab_30_table_5_th_2_Template","DetailStepperComponent_mat_tab_30_table_5_td_3_Template","DetailStepperComponent_mat_tab_30_table_5_th_5_Template","DetailStepperComponent_mat_tab_30_table_5_td_6_Template","DetailStepperComponent_mat_tab_30_table_5_th_8_Template","DetailStepperComponent_mat_tab_30_table_5_td_9_Template","DetailStepperComponent_mat_tab_30_table_5_th_11_Template","DetailStepperComponent_mat_tab_30_table_5_td_12_Template","DetailStepperComponent_mat_tab_30_table_5_tr_13_Template","DetailStepperComponent_mat_tab_30_table_5_tr_14_Template","downlinks$","downlinkHistoryColumns","DetailStepperComponent_mat_tab_30_h4_2_Template","DetailStepperComponent_mat_tab_30_table_5_Template","DetailStepperComponent","dataStoreService","getSortedObjectKeys","isIOTcoreDevice","deviceSource","source_id","canSendDownlink","DetailStepperComponent_p_23_Template","DetailStepperComponent_ng_container_24_Template","DetailStepperComponent_ng_container_27_Template","DetailStepperComponent_p_28_Template","DetailStepperComponent_p_29_Template","DetailStepperComponent_mat_tab_30_Template","messageKeys","onFunction","deleteDeviceTmpl_r7","onDelete","updateMessages","pageSize","deviceMessagesCount","messagesLoading","DeviceDetailComponent_ng_container_0_div_29_mat_paginator_1_Template","messages","i_r12","closeWarning","warning_r13","deviceImageUrl","DeviceDetailComponent_ng_container_0_app_counter_chip_5_Template","DeviceDetailComponent_ng_container_0_button_7_Template","DeviceDetailComponent_ng_container_0_div_9_Template","DeviceDetailComponent_ng_container_0_button_10_Template","DeviceDetailComponent_ng_container_0_button_11_Template","DeviceDetailComponent_ng_container_0_button_12_Template","onClose","onEditPicture","device_logo_url","enlargedImageTpl_r8","onEnlargePicture","DeviceDetailComponent_ng_container_0_div_29_Template","DeviceDetailComponent_ng_container_0_div_30_Template","DeviceDetailComponent_ng_container_0_div_32_Template","DeviceDetailComponent_ng_container_0_ng_template_33_Template","DeviceDetailComponent_ng_container_0_ng_template_35_Template","actionsHidden","deviceList","openWarnings","DeviceDetailComponent","pageIndex","document_marking","setMessagesAndKeys$","extractBusinessFields$","msg","extractMessageKey$","messageFields","exposedData","reducer","width","deleteMsg","componentInstance","backdropClick","DeviceDetailComponent_ng_container_0_Template","node_r1","treeControl","isExpanded","node_r3","nodeSelected","endDrag","allowDrop","preventDrop","HierarchyTreeComponent_mat_tree_0_mat_nested_tree_node_2_mat_icon_9_Template","HierarchyTreeComponent_mat_tree_0_mat_nested_tree_node_2_mat_icon_10_Template","nodeIsSelected","HierarchyTreeComponent_mat_tree_0_mat_tree_node_1_Template","HierarchyTreeComponent_mat_tree_0_mat_nested_tree_node_2_Template","isFolder","HierarchyTreeComponent","snack","NestedTreeControl","MatTreeNestedDataSource","subscriptions","Subscription","scrollToActiveNode","openNodes","_","expand","activeNodeElement","scrollIntoView","HierarchyTreeComponent_mat_tree_0_Template","option_r3","resetSearch","DeviceManagementComponent_ng_container_0_mat_option_16_Template","auto_r4","options$","DeviceManagementComponent","hierarchyStore","loaded$","hierarchyLoaded","updateSelectedNode","skip","skipWhile","DeviceManagementComponent_ng_container_0_Template","item_r1","item_r2","item_r3","DeviceProvidingModelSelectComponent","_sourceFilter","_ngControl","groupedTypes$","groups","valueAccessor","_changeFn","writeValue","registerOnChange","registerOnTouched","setDisabledState","method","controlName","compareSourceFn","one","two","compareBrandFn","compareModelFn","DeviceProvidingModelSelectComponent_mat_option_5_Template","DeviceProvidingModelSelectComponent_mat_option_11_Template","DeviceProvidingModelSelectComponent_mat_option_16_Template","uploadFile","downloadTemplate","uploadDevices","deviceTypeControl","httpPayload","deviceCount","createdDevices","failureCount","downloadErrorResults","errorResult","DeviceProvidingComponent_ng_container_2_p_5_Template","DeviceProvidingComponent_ng_container_2_p_6_Template","DeviceProvidingComponent_ng_container_2_button_9_Template","DeviceProvidingComponent","deviceCreationService","creationRequestLoader","_csvTemplates","firefly","createFirstLinesOfCsvModels","iotcore","defaultRegion","defaultDatarate","blob","Blob","URL","createObjectURL","link","createElement","href","download","revokeObjectURL","fileInput","accept","onchange","onloadend","lines","delimiter","detectDelimiter","idx","separator","cur","line","DeviceProvidingComponent_ng_container_0_Template","DeviceProvidingComponent_ng_container_1_Template","DeviceProvidingComponent_ng_container_2_Template","objectToUse","fl","sl","NewFolderDialogComponent","nameForm","onNoClick","name_r2","FolderListElementComponent","DeviceListElementComponent","service","isDraggable","startDrag","dragboxChange","toggleCheckbox","dragBoxEl","ActionButtonsComponent","addDevices","toggleOpen","_c2","_c3","openMultiDownlink","openManager","folder_r6","folderSelected","device_r8","deviceSelected","HierarchyNodeListComponent_ng_container_0_button_5_Template","HierarchyNodeListComponent_ng_container_0_button_6_Template","HierarchyNodeListComponent_ng_container_0_button_7_Template","HierarchyNodeListComponent_ng_container_0_app_folder_list_element_9_Template","HierarchyNodeListComponent_ng_container_0_app_device_list_element_11_Template","HierarchyNodeListComponent_ng_container_0_app_action_buttons_13_Template","folders$","actionButtonsEnabled","HierarchyNodeListComponent","foldersInSelectedNode$","devicesInSelectedNode$","allDevices$","deviceEls","toArray","deviceNodes","newFolder","autoFocus","i9","HierarchyNodeListComponent_ng_container_0_Template","MultiDownlinkComponent_8_ng_template_0_Template","masterToggle","selection","hasValue","isEntirePageSelected","isSelected","site_label","device_r9","device_type_label","source_label","device_r11","device_r13","creation_date_iso","creation_date","device_r14","last_downlink_iso","last_downlink","site_r15","source_r16","model_r17","_r18","resetForm","resetTooltip","MultiDownlinkComponent_ng_template_48_form_0_mat_option_5_Template","MultiDownlinkComponent_ng_template_48_form_0_mat_option_13_Template","MultiDownlinkComponent_ng_template_48_form_0_mat_option_21_Template","MultiDownlinkComponent_ng_template_48_form_0_button_23_Template","MultiDownlinkComponent_ng_template_48_form_0_Template","MultiDownlinkComponent","SelectionModel","handleFilterChanges","project_ids","getPageData","_pageData","_orderData","filteredData","row","resetSelection","isValidSelection","checkAllFirefly","checkAllSameModel","sendButtonTooltip","size","success","_loadDevices","filterDeviceTable","paginator","firstPage","formatTableDataElement","site_id","deviceTableData","MatPaginator","MultiDownlinkComponent_button_5_Template","MultiDownlinkComponent_button_6_Template","MultiDownlinkComponent_8_Template","MultiDownlinkComponent_th_16_Template","MultiDownlinkComponent_td_17_Template","MultiDownlinkComponent_th_19_Template","MultiDownlinkComponent_td_20_Template","MultiDownlinkComponent_th_22_Template","MultiDownlinkComponent_td_23_Template","MultiDownlinkComponent_th_25_Template","MultiDownlinkComponent_td_26_Template","MultiDownlinkComponent_th_28_Template","MultiDownlinkComponent_td_29_Template","MultiDownlinkComponent_th_31_Template","MultiDownlinkComponent_td_32_Template","MultiDownlinkComponent_th_34_Template","MultiDownlinkComponent_td_35_Template","MultiDownlinkComponent_th_37_Template","MultiDownlinkComponent_td_38_Template","MultiDownlinkComponent_tr_39_Template","MultiDownlinkComponent_tr_40_Template","MultiDownlinkComponent_ng_template_48_Template","formTpl_r19","GatewayImportComponent","gatewayForm","gateway_id","GatewayImportComponent_mat_option_15_Template","GatewayDataVisualComponent","store","labels","fill","borderColor","GatewayFilterComponent_form_0_mat_option_7_Template","GatewayFilterComponent","gatewaysFiltered","emitFilteredGateways","gateway","gatewaySites","gs","GatewayFilterComponent_form_0_Template","GatewayMapComponent","mapGatewaysToBounds","mapGatewaysToMarkerLayer","GatewayListComponent_div_1_1_ng_template_0_Template","GatewayListComponent_div_1_1_Template","GatewayListComponent_mat_expansion_panel_3_4_ng_template_0_Template","GatewayListComponent_mat_expansion_panel_3_4_Template","GatewayListComponent_section_7_div_18_div_4_Template","GatewayListComponent_section_7_div_18_div_5_Template","gateway_r3","mapTmpl_r5","onShowDataVisual","gatewayIsActive","last_checkin","serial","gprsActive","loraUpdatedAt","networkActive","GatewayListComponent_section_7_div_18_Template","filteredGateways$","updateFilteredGateways","selectedGateway","GatewayListComponent_ng_template_11_mat_dialog_content_0_Template","GatewayListComponent","emptyList","lastCheckin","allowedTimeout","GatewayListComponent_div_1_Template","GatewayListComponent_mat_expansion_panel_3_Template","GatewayListComponent_app_loader_5_Template","GatewayListComponent_div_6_Template","GatewayListComponent_section_7_Template","GatewayListComponent_button_8_Template","GatewayListComponent_ng_template_9_Template","GatewayListComponent_ng_template_11_Template","isActive","_c8","_c9","_c10","MainComponent","supportUrl","title$","version","Package","onLogin","onLogout","navbar_r2","MainComponent_mat_icon_3_Template","MainComponent_mat_icon_4_Template","MainComponent_mat_list_item_40_Template","MainComponent_mat_list_item_41_Template","MainComponent_mat_list_item_52_Template","opened","_c4","_c5","_c6","_c7","RedriveMessagesSettingsComponent","maximumMessageCount","pollingDurationSeconds","dialogResult","message_r1","messageId","message_r2","sentTimestamp","message_r3","body","message_r4","approximateReceiveCount","RedriveMessagesTableComponent","refresh","RedriveMessagesTableComponent_th_3_Template","RedriveMessagesTableComponent_td_4_Template","RedriveMessagesTableComponent_th_6_Template","RedriveMessagesTableComponent_td_7_Template","RedriveMessagesTableComponent_th_9_Template","RedriveMessagesTableComponent_td_10_Template","RedriveMessagesTableComponent_th_12_Template","RedriveMessagesTableComponent_td_13_Template","RedriveMessagesTableComponent_tr_14_Template","RedriveMessagesTableComponent_tr_15_Template","DataLayoutComponent","contentQueries","dirIndex","DataLayoutItemComponent","openPollSettings","pollMessages","cancelPolling","pollingProgressPercent","redriveTask","failureReason","RedriveMessagesComponent_div_0_button_17_Template","RedriveMessagesComponent_div_0_button_18_Template","RedriveMessagesComponent_div_0_button_19_Template","RedriveMessagesComponent_div_0_div_29_Template","redriveMessages","RedriveMessagesComponent_div_0_div_45_Template","polling","approximateNumberOfMessages","startedTimestamp","approximateNumberOfMessagesToMove","approximateNumberOfMessagesMoved","RedriveMessagesComponent","interval","pollingCancelled","refreshData","setInterval","clearInterval","getApproximateNumberOfMessages","getLastRedriveTask","firstValueFrom","_this2","_this3","_this4","table","pollingEndDate","setSeconds","getSeconds","pollMessage","hasOwnProperty","prop","_this5","o","_this6","RedriveMessagesComponent_div_0_Template","MQTTTopicHelpDialogComponent","RoutingCreationService","_routeData$","routeData$","updateRouteData","PatternBuilderComponent_mat_tree_1_mat_tree_node_1_mat_icon_2_Template","PatternBuilderComponent_mat_tree_1_mat_tree_node_1_ng_template_3_Template","noFolder_r3","node_r4","PatternBuilderComponent_mat_tree_1_mat_nested_tree_node_2_mat_icon_4_Template","PatternBuilderComponent_mat_tree_1_mat_nested_tree_node_2_mat_icon_5_Template","PatternBuilderComponent_mat_tree_1_mat_nested_tree_node_2_ul_12_Template","PatternBuilderComponent_mat_tree_1_mat_tree_node_1_Template","PatternBuilderComponent_mat_tree_1_mat_nested_tree_node_2_Template","hasChildren","PatternBuilderComponent","patternChanged","updateDatasource","PatternBuilderComponent_mat_tree_1_Template","PatternBuilderHelpComponent","openMqttHelp","element_r2","dataClicked","DataSelectListComponent","dataSelected","DataSelectListComponent_button_8_Template","columnTitles","control_r1","colTitles","SheetDataBuilderComponent","dataAssigned","dataOrderForm","setFormValueWhenDataSelected","emitFormValueChanges","columns","dataControl","dataArray","addColumn","dataStream","column","tableName","SheetDataBuilderComponent_div_7_Template","destinationType_r1","destination_r2","DestinationFormComponent_div_14_p_3_Template","destinationsChoices","tab","flag_r5","DestinationFormComponent_ng_container_16_ng_container_14_mat_checkbox_4_Template","DestinationFormComponent_ng_container_16_mat_error_9_Template","DestinationFormComponent_ng_container_16_ng_container_14_Template","newSheetForm","sheet_id","gsServiceAccount","flag_r7","DestinationFormComponent_ng_container_17_ng_container_11_mat_checkbox_4_Template","DestinationFormComponent_ng_container_17_ng_container_11_Template","newBigqueryForm","datasetPrefix","setNewSheetFields","dataSelected$","setNewBigqueryFields","getColumns","sheet_r11","DestinationFormComponent_ng_container_27_app_sheet_data_builder_1_Template","gsUpdateAllowed","DestinationFormComponent","destinationForm","destinationType","output","shareAccount","interfaceControlGroups","destinationTypesChoices","maxLength","sheet_name","tab_name","dataset","resetFormsOnDestTypeChange","sheetUrlValidator$","destination_type","destination_id","_interface","tabName","destType","destinations","int","newSheetFormValues","newSheetSelected","otherValues","getSheetIDfromUrl","control_groups","newBigQueryFormValues","formattedDataset","formValidator","newInterfaceValid","newBigQuerySelected","idIndex","sheets","bigqueryInterfaces","inter","sheetInterface","DestinationFormComponent_mat_option_8_Template","DestinationFormComponent_mat_option_13_Template","DestinationFormComponent_div_14_Template","DestinationFormComponent_mat_form_field_15_Template","DestinationFormComponent_ng_container_16_Template","DestinationFormComponent_ng_container_17_Template","DestinationFormComponent_app_sheet_data_builder_25_Template","DestinationFormComponent_app_sheet_data_builder_26_Template","DestinationFormComponent_ng_container_27_Template","RoutingCreationComponent_div_6_div_3_1_ng_template_0_Template","RoutingCreationComponent_div_6_div_3_1_Template","stepOne_r3","RoutingCreationComponent_div_6_div_4_1_ng_template_0_Template","RoutingCreationComponent_div_6_div_4_1_Template","stepTwo_r4","RoutingCreationComponent_div_6_div_5_1_ng_template_0_Template","RoutingCreationComponent_div_6_div_5_1_Template","stepThree_r5","RoutingCreationComponent_div_6_div_3_Template","RoutingCreationComponent_div_6_div_4_Template","RoutingCreationComponent_div_6_div_5_Template","activeStepConfig","stepOneForm","stepTwoForm","stepThreeForm","exportedData$","routeToEdit","RoutingCreationComponent","routingCreation","devHttp","errorMatcher","interfacesByProject$","loader$","isEditMode","loadCondition","obss","handleQueryParamChanges$","handlePatternChanges$","RoutingCreationComponent_div_6_Template","RoutingCreationComponent_ng_template_7_Template","RoutingCreationComponent_ng_template_9_Template","RoutingCreationComponent_ng_template_11_Template","isUpdateActionDisabled$","routeActive","updateLockRoute","waitForUpdate$","tooltipUnlock$","isUnlockDisabled$","editRoute","routing_r7","locked_by","RoutingDetailsComponent_div_0_ng_container_1_span_6_Template","RoutingDetailsComponent_div_0_ng_container_1_mat_slide_toggle_7_Template","RoutingDetailsComponent_div_0_ng_container_1_button_8_Template","RoutingDetailsComponent_div_0_ng_container_1_button_9_Template","RoutingDetailsComponent_div_0_ng_container_1_button_10_Template","RoutingDetailsComponent_div_0_ng_container_1_button_11_Template","closeDetails","RoutingDetailsComponent_div_0_ng_container_1_div_17_Template","RoutingDetailsComponent_div_0_ng_container_1_div_24_Template","RoutingDetailsComponent_div_0_ng_container_1_div_25_Template","RoutingDetailsComponent_div_0_ng_container_1_p_30_Template","RoutingDetailsComponent_div_0_ng_container_1_p_31_Template","RoutingDetailsComponent_div_0_ng_container_1_p_32_Template","devices_number","data_number","destinationLabel","googleSheetUrl","displayedData","RoutingDetailsComponent_div_0_ng_container_1_Template","RoutingDetailsComponent","waitForUpdate","isUpdateActionDisabled","userEmail","destination_name","spreadsheet_id","pairwise","oldValue","confirmationMessage","RoutingDetailsComponent_div_0_Template","RoutingListElementComponent","openDetails","RoutingListElementComponent_app_counter_chip_18_Template","Destinations","MES","GOOGLE_SHEET","BIGQUERY","IOT_CORE","PUBSUB","dest_r2","RoutingFilterComponent_form_0_mat_option_14_Template","RoutingFilterComponent_form_0_mat_option_21_Template","RoutingFilterComponent","routingsFiltered","routingForm","emitFilteredRoutings","RoutingFilterComponent_form_0_Template","RoutingListComponent_div_1_1_ng_template_0_Template","RoutingListComponent_div_1_1_Template","RoutingListComponent_mat_expansion_panel_3_4_ng_template_0_Template","RoutingListComponent_mat_expansion_panel_3_4_Template","routing_r2","RoutingListComponent_ng_container_5_div_2_div_1_Template","routings_r3","routing_r5","ctx_r5","RoutingListComponent_ng_container_5_div_3_div_16_Template","filteredRoutings$","RoutingListComponent_ng_container_5_app_no_result_1_Template","RoutingListComponent_ng_container_5_div_2_Template","RoutingListComponent_ng_container_5_div_3_Template","RoutingListComponent_ng_container_5_button_4_Template","updateFilteredRoutings","RoutingListComponent","routingLoader","RoutingListComponent_div_1_Template","RoutingListComponent_mat_expansion_panel_3_Template","RoutingListComponent_ng_container_5_Template","RoutingListComponent_ng_template_6_Template","allOrNoneValidator","filledCount","allOrNone","markAsTouched","country_r2","organization_r3","SiteCreationComponent","countryId","organizationId","infraSite","organization","alertUnixCron","updateLocation","SiteCreationComponent_h2_0_Template","SiteCreationComponent_h2_1_Template","SiteCreationComponent_mat_option_14_Template","SiteCreationComponent_mat_option_25_Template","SiteCreationComponent_mat_error_37_Template","SiteCreationComponent_mat_error_42_Template","tmp_9_0","errors","tmp_10_0","country_r1","organization_r2","SiteFilterComponent_form_1_mat_option_13_Template","SiteFilterComponent_form_1_mat_option_21_Template","SiteFilterComponent","sitesFiltered","emitFilteredSites","countryFilter","organizationFilter","SiteFilterComponent_form_1_Template","SiteComponent_div_0_section_1_div_1_1_ng_template_0_Template","SiteComponent_div_0_section_1_div_1_1_Template","SiteComponent_div_0_section_1_mat_expansion_panel_3_4_ng_template_0_Template","SiteComponent_div_0_section_1_mat_expansion_panel_3_4_Template","SiteComponent_div_0_section_1_div_1_Template","SiteComponent_div_0_section_1_mat_expansion_panel_3_Template","site_r4","editSite","SiteComponent_div_0_section_2_div_12_Template","filteredSites$","updateFilteredSites","SiteComponent_div_0_section_1_Template","SiteComponent_div_0_section_2_Template","SiteComponent_div_0_button_3_Template","SiteComponent_div_0_ng_template_4_Template","SiteComponent","siteTag","SiteComponent_div_0_Template","level_r5","level","UserCreationComponent_ng_container_1_div_1_ng_container_17_mat_option_7_Template","UserCreationComponent_ng_container_1_div_1_ng_container_17_mat_option_13_Template","i_r6","removeAccessFromFields","UserCreationComponent_ng_container_1_div_1_ng_container_17_button_17_Template","site_r7","unchosenSites$","accessLevels","addAccessFormFields","UserCreationComponent_ng_container_1_div_1_input_6_Template","UserCreationComponent_ng_container_1_div_1_mat_error_7_Template","UserCreationComponent_ng_container_1_div_1_input_8_Template","toggleHelp","UserCreationComponent_ng_container_1_div_1_mat_checkbox_14_Template","UserCreationComponent_ng_container_1_div_1_mat_checkbox_15_Template","UserCreationComponent_ng_container_1_div_1_mat_checkbox_16_Template","UserCreationComponent_ng_container_1_div_1_ng_container_17_Template","UserCreationComponent_ng_container_1_div_1_button_18_Template","cancel","UserCreationComponent_ng_container_1_div_1_button_22_Template","editMode","accessForm","deleteUserTmpl_r11","UserCreationComponent_ng_container_1_div_1_Template","UserCreationComponent_ng_container_1_div_2_Template","UserCreationComponent_ng_container_1_button_3_Template","displayHelp","UserCreationComponent","HOME_USERS_TEXT","newFields","accessFormFieldIndex","selectedSites","access","formatInput","siteExists","userAccessForm","administrator","technicalAdministrator","validAccess","UserCreationComponent_ng_container_1_Template","UserCreationComponent_ng_template_2_Template","level_r1","site_r2","UserFilterComponent_form_1_mat_option_13_Template","UserFilterComponent_form_1_mat_option_20_Template","permissionLevels","UserFilterComponent","usersFiltered","emitFilteredUsers","siteKeyword","permissionLevel","permissionForSiteFilter","emailFilter","permissionLevelFilter","UserFilterComponent_form_1_Template","UserManagementComponent_section_1_div_1_1_ng_template_0_Template","UserManagementComponent_section_1_div_1_1_Template","UserManagementComponent_section_1_mat_expansion_panel_3_4_ng_template_0_Template","UserManagementComponent_section_1_mat_expansion_panel_3_4_Template","UserManagementComponent_section_1_div_1_Template","UserManagementComponent_section_1_mat_expansion_panel_3_Template","screenSizeIndex$","editUser","getHighestPermission","getUserSiteLabel","UserManagementComponent_section_2_div_12_Template","filteredUsers$","updateFilteredUsers","UserManagementComponent","hasMultipleSiteAccess","userSiteIds","userSite","UserManagementComponent_section_1_Template","UserManagementComponent_section_2_Template","UserManagementComponent_button_3_Template","UserManagementComponent_ng_template_4_Template","UnauthorizedComponent","EditRoutingGuard","OperatorGuard","resolver","redirectTo","pathMatch","queryParamMap","AppRoutingModule","imports","RouterModule","forRoot","useHash","initialNavigation","AppComponent","MaterialModule","matIconRegistry","domSanitizer","addSvgIcon","bypassSecurityTrustResourceUrl","MAT_SNACK_BAR_DEFAULT_OPTIONS","useValue","CommonModule","BrowserAnimationsModule","MatToolbarModule","MatButtonModule","MatIconModule","MatSidenavModule","MatFormFieldModule","MatTableModule","MatDialogModule","MatCheckboxModule","MatInputModule","MatSelectModule","MatStepperModule","MatTooltipModule","MatExpansionModule","MatDividerModule","LayoutModule","MatListModule","MatRadioModule","MatTreeModule","MatTabsModule","MatSnackBarModule","MatProgressSpinnerModule","MatSlideToggleModule","MatAutocompleteModule","MatPaginatorModule","MatCardModule","MatSortModule","MatProgressBarModule","FormFieldComponent","SharedModule","FormsModule","CdkTableModule","ReactiveFormsModule","AngularFireAuthModule","AngularFireModule","initializeApp","LoginModule","provideHttpClient","withInterceptorsFromDi","InterfaceManagementModule","AlertingModule","CatalogueModule","DashboardModule","LeafletModule","DeviceManagementModule","GatewayModule","RedriveMessagesModule","FileTypes","FileExtensions","CSV_TYPE","PEM_TYPE","CSV_EXTENSION","PEM_EXTENSION","DownloadService","convertToCSV","downloadFile","fileName","fileType","fileExtension","dwldLink","navigator","userAgent","setAttribute","visibility","appendChild","removeChild","exportAsCSV","routeTpl_r4","route_r3","mat_r6","route_r8","path_r9","onCopyToClipBoard","tooltip","getDeviceName","subroute_r10","offset_r12","i_r11","DataListComponent_ng_template_6_div_9_ng_container_1_Template","DataListComponent_ng_template_6_span_2_Template","DataListComponent_ng_template_6_span_3_Template","DataListComponent_ng_template_6_span_8_Template","DataListComponent_ng_template_6_div_9_Template","hasSibling_r13","DataListComponent","_displayedData","crumbs","crumb","recur","groupedRoutes","loader","text","toolTip","show","hide","selBox","left","top","opacity","execCommand","withDeviceDetails","devicePath","addDeviceTypeAndBrand","Error","DataListComponent_button_3_Template","DataListComponent_ng_container_5_Template","DataListComponent_ng_template_6_Template","isDeviceSelected","removeDeviceFromSelection","addDeviceToSelection","DeviceDataSelectionComponent_div_12_mat_icon_7_Template","DeviceDataSelectionComponent_div_12_mat_icon_8_Template","device_name","hierarchy_prefix","DeviceDataSelectionComponent","deviceDataSelected","allSelected","selectedDevices","routedDevices","filteredDevices","selectedData","filterResult","dataArrays","DeviceDataSelectionComponent_div_12_Template","RoutingModule","SiteModule","UserManagementModule","MainModule","BrowserModule","UnauthorizedModule","AppModule","bootstrap","AngularFireAuth","production","enableProdMode","__NgCli_bootstrap_1","bootstrapModule","catch","webpackContext","webpackContextResolve","__webpack_require__","module","exports"],"ignoreList":[],"sourceRoot":"webpack:///","sources":["./src/app/services/state/interface/interface-store.service.ts","./src/app/services/state/data/data-store.service.ts","./src/app/services/state/auth/auth.service.ts","./src/app/services/http/interceptors/auth.interceptor.ts","./src/app/services/http/interceptors/http-error.interceptor.ts","./src/app/services/http/interceptors/index.ts","./src/environments/environment.dev.ts","./src/app/services/http/custom-http-param-encoder.ts","./src/app/services/http/devices.service.ts","./src/app/services/state/data/data-loader.service.ts","./src/app/services/http/gateways.service.ts","./src/app/components/display-position-map/display-position-map.component.ts","./src/app/components/display-position-map/display-position-map.component.html","./src/app/components/loader/loader.component.ts","./src/app/components/loader/loader.component.html","./src/app/services/util/loader.directive.ts","./src/app/pages/main/dashboard/device-list/device-list.component.html","./src/app/pages/main/dashboard/device-list/device-list.component.ts","./src/app/pages/main/dashboard/device-status-chart/device-status-chart.component.ts","./src/app/pages/main/dashboard/device-status-chart/device-status-chart.component.html","./src/app/pages/main/dashboard/gateway-status-chart/gateway-status-chart.component.ts","./src/app/pages/main/dashboard/gateway-status-chart/gateway-status-chart.component.html","./src/app/pages/main/dashboard/dashboard.component.html","./src/app/pages/main/dashboard/dashboard.component.ts","./src/app/pages/main/routing-list/routing-creation/routing-creation.config.ts","./src/app/pages/main/interface-management/interface-creation/interface-creation.component.html","./src/app/pages/main/interface-management/interface-creation/interface-creation.component.ts","./src/app/pages/main/interface-management/interface-filter/interface-filter.component.html","./src/app/pages/main/interface-management/interface-filter/interface-filter.component.ts","./src/app/pages/main/interface-management/interface-management.component.html","./src/app/pages/main/interface-management/interface-management.component.ts","./src/app/services/state/auth/auth.guard.ts","./src/app/services/state/auth/tech-admin.guard.ts","./src/app/components/router-outlet/router-outlet.component.ts","./src/app/components/router-outlet/router-outlet.component.html","./src/app/pages/login/login.component.ts","./src/app/pages/login/login.component.html","./src/app/pages/login/login.resolver.ts","./src/app/pages/main/alerting/alerting.service.ts","./src/app/pages/main/alerting/alerting.component.html","./src/app/pages/main/alerting/alerting.component.ts","./src/app/components/confirmation-dialog/confirmation-dialog.component.html","./src/app/components/confirmation-dialog/confirmation-dialog.component.ts","./src/app/components/image-upload/image-upload.component.html","./src/app/components/image-upload/image-upload.component.ts","./src/app/pages/main/catalogue/brand-creation/brand-creation.component.html","./src/app/pages/main/catalogue/brand-creation/brand-creation.component.ts","./src/app/pages/main/catalogue/model-creation/model-creation.component.html","./src/app/pages/main/catalogue/model-creation/model-creation.component.ts","./src/app/pages/main/catalogue/model-item/model-item.component.html","./src/app/pages/main/catalogue/model-item/model-item.component.ts","./src/app/pages/main/catalogue/model-filter/model-filter.component.html","./src/app/pages/main/catalogue/model-filter/model-filter.component.ts","./src/app/components/no-result/no-result.component.ts","./src/app/components/no-result/no-result.component.html","./src/app/pages/main/catalogue/brand-item/brand-item.component.ts","./src/app/pages/main/catalogue/brand-item/brand-item.component.html","./src/app/pages/main/catalogue/catalogue.component.html","./src/app/pages/main/catalogue/catalogue.component.ts","./src/app/pages/main/catalogue/model-detail/parser-tab/parser-creation-helper.ts","./src/app/pages/main/catalogue/model-detail/parser-tab/parser-creation.service.ts","./src/app/pages/main/catalogue/model-detail/parser-tab/parser-type-selection/parser-type-selection.component.html","./src/app/pages/main/catalogue/model-detail/parser-tab/parser-type-selection/parser-type-selection.component.ts","./src/app/pages/main/catalogue/model-detail/parser-tab/single-parser-editor/formula-validator.directive.ts","./src/app/pages/main/catalogue/model-detail/parser-tab/single-parser-editor/variables-validator.directive.ts","./src/app/pages/main/catalogue/model-detail/parser-tab/blueprint-test/blueprint-test.component.html","./src/app/pages/main/catalogue/model-detail/parser-tab/blueprint-test/blueprint-test.component.ts","./src/app/pages/main/catalogue/model-detail/parser-tab/single-parser-editor/single-parser-editor.component.html","./src/app/pages/main/catalogue/model-detail/parser-tab/single-parser-editor/single-parser-editor.component.ts","./src/app/pages/main/catalogue/model-detail/parser-tab/multi-parser-editor/single-parser-dialog/single-parser-dialog.component.ts","./src/app/pages/main/catalogue/model-detail/parser-tab/multi-parser-editor/single-parser-dialog/single-parser-dialog.component.html","./src/app/pages/main/catalogue/model-detail/parser-tab/multi-parser-editor/multi-parser-editor.component.html","./src/app/pages/main/catalogue/model-detail/parser-tab/multi-parser-editor/multi-parser-editor.component.ts","./src/app/pages/main/catalogue/model-detail/parser-tab/json-parser-editor/json-input/json-input.component.html","./src/app/pages/main/catalogue/model-detail/parser-tab/json-parser-editor/json-input/json-input.component.ts","./src/app/services/util/formErrorStateMatcher.ts","./src/app/services/util/auto-focus.directive.ts","./src/app/pages/main/catalogue/model-detail/parser-tab/json-parser-editor/message-field-mapping/message-field-mapping.component.html","./src/app/pages/main/catalogue/model-detail/parser-tab/json-parser-editor/message-field-mapping/message-field-mapping.component.ts","./src/app/pages/main/catalogue/model-detail/parser-tab/json-parser-editor/field-hint/field-hint.component.html","./src/app/pages/main/catalogue/model-detail/parser-tab/json-parser-editor/field-hint/field-hint.component.ts","./src/app/pages/main/catalogue/model-detail/parser-tab/json-parser-editor/json-parser-editor.component.html","./src/app/pages/main/catalogue/model-detail/parser-tab/json-parser-editor/json-parser-editor.component.ts","./src/app/pages/main/catalogue/model-detail/parser-tab/parser-tab.component.html","./src/app/pages/main/catalogue/model-detail/parser-tab/parser-tab.component.ts","./src/app/pages/main/catalogue/model-detail/model-detail.component.html","./src/app/pages/main/catalogue/model-detail/model-detail.component.ts","./src/app/pages/main/device-management/device-exists.validator.ts","./src/app/pages/main/device-management/device-creation/abstract-device-creation.ts","./src/app/pages/main/device-management/device-creation/device-creation.config.ts","./src/app/services/state/data/device-hierarchy/device-hierarchy-store.service.ts","./src/app/pages/main/device-management/device-move-confirmation-dialog/device-move-confirmation-dialog.component.html","./src/app/pages/main/device-management/device-move-confirmation-dialog/device-move-confirmation-dialog.component.ts","./src/app/pages/main/device-management/device-management.service.ts","./src/app/pages/main/device-management/device-creation/device-creation.service.ts","./src/app/components/form-stepper/form-stepper.component.html","./src/app/components/form-stepper/form-stepper.component.ts","./src/app/components/select-position/select-position.component.ts","./src/app/components/select-position/select-position.component.html","./src/app/pages/main/device-management/device-creation/shared/metadata-form/metadata-form.component.html","./src/app/pages/main/device-management/device-creation/shared/metadata-form/metadata-form.component.ts","./src/app/pages/main/device-management/device-creation/shared/device-type-banner/device-type-banner.component.ts","./src/app/pages/main/device-management/device-creation/shared/device-type-banner/device-type-banner.component.html","./src/app/pages/main/device-management/device-creation/default-device-creation/default-device-creation.component.html","./src/app/pages/main/device-management/device-creation/default-device-creation/default-device-creation.component.ts","./src/app/pages/main/device-management/device-creation/device-creation.component.html","./src/app/pages/main/device-management/device-creation/device-creation.component.ts","./src/app/pages/main/device-management/device-creation/firefly-device-creation/firefly-device-creation.component.html","./src/app/pages/main/device-management/device-creation/firefly-device-creation/firefly-device-creation.component.ts","./src/models/device.models.ts","./src/app/pages/main/device-management/device-creation/iot-core-creation/iotcore-device-creation.component.html","./src/app/pages/main/device-management/device-creation/iot-core-creation/iotcore-device-creation.component.ts","./src/app/pages/main/device-management/device-creation/model-choice/model-choice.component.html","./src/app/pages/main/device-management/device-creation/model-choice/model-choice.component.ts","./src/app/pages/main/device-management/device-creation/path.guard.ts","./src/app/pages/main/device-management/device-creation/type-selected.guard.ts","./src/app/pages/main/device-management/device-picture-update/device-picture-update.component.ts","./src/app/pages/main/device-management/device-picture-update/device-picture-update.component.html","./src/app/pages/main/device-management/send-downlink-dialog/send-downlink-dialog.component.html","./src/app/pages/main/device-management/send-downlink-dialog/send-downlink-dialog.component.ts","./src/app/pages/main/device-management/device-update/device-update.component.html","./src/app/pages/main/device-management/device-update/device-update.component.ts","./src/app/pages/main/device-management/device-detail/device-calibration-function/device-calibration-function.component.html","./src/app/pages/main/device-management/device-detail/device-calibration-function/device-calibration-function.component.ts","./src/app/pages/main/device-management/device-detail/data-preview/data-preview.component.html","./src/app/pages/main/device-management/device-detail/data-preview/data-preview.component.ts","./src/app/components/counter-chip/counter-chip.component.html","./src/app/components/counter-chip/counter-chip.component.ts","./src/app/pages/main/device-management/device-detail/detail-stepper/detail-stepper.component.html","./src/app/pages/main/device-management/device-detail/detail-stepper/detail-stepper.component.ts","./src/app/pages/main/device-management/device-detail/device-detail.component.html","./src/app/pages/main/device-management/device-detail/device-detail.component.ts","./src/app/pages/main/device-management/hierarchy-tree/hierarchy-tree.component.html","./src/app/pages/main/device-management/hierarchy-tree/hierarchy-tree.component.ts","./src/app/pages/main/device-management/device-management.component.html","./src/app/pages/main/device-management/device-management.component.ts","./src/app/pages/main/device-management/device-providing/device-providing-model-select/device-providing-model-select.component.html","./src/app/pages/main/device-management/device-providing/device-providing-model-select/device-providing-model-select.component.ts","./src/app/pages/main/device-management/device-providing/device-providing.component.html","./src/app/pages/main/device-management/device-providing/device-providing.component.ts","./src/app/pages/main/device-management/hierarchy-node-list/new-folder-dialog/new-folder-dialog.component.ts","./src/app/pages/main/device-management/hierarchy-node-list/new-folder-dialog/new-folder-dialog.component.html","./src/app/pages/main/device-management/hierarchy-node-list/folder-list-element/folder-list-element.component.ts","./src/app/pages/main/device-management/hierarchy-node-list/folder-list-element/folder-list-element.component.html","./src/app/pages/main/device-management/hierarchy-node-list/device-list-element/device-list-element.component.ts","./src/app/pages/main/device-management/hierarchy-node-list/device-list-element/device-list-element.component.html","./src/app/pages/main/device-management/hierarchy-node-list/action-buttons/action-buttons.component.ts","./src/app/pages/main/device-management/hierarchy-node-list/action-buttons/action-buttons.component.html","./src/app/pages/main/device-management/hierarchy-node-list/hierarchy-node-list.component.html","./src/app/pages/main/device-management/hierarchy-node-list/hierarchy-node-list.component.ts","./src/app/pages/main/device-management/multi-downlink/multi-downlink.component.html","./src/app/pages/main/device-management/multi-downlink/multi-downlink.component.ts","./src/app/pages/main/gateway-list/gateway-import/gateway-import.component.html","./src/app/pages/main/gateway-list/gateway-import/gateway-import.component.ts","./src/app/pages/main/gateway-list/gateway-data-visual/gateway-data-visual.component.ts","./src/app/pages/main/gateway-list/gateway-data-visual/gateway-data-visual.component.html","./src/app/pages/main/gateway-list/gateway-filter/gateway-filter.component.html","./src/app/pages/main/gateway-list/gateway-filter/gateway-filter.component.ts","./src/app/pages/main/gateway-list/gateway-map/gateway-map.component.ts","./src/app/pages/main/gateway-list/gateway-map/gateway-map.component.html","./src/app/pages/main/gateway-list/gateway-list.component.html","./src/app/pages/main/gateway-list/gateway-list.component.ts","./src/app/pages/main/main.component.html","./src/app/pages/main/main.component.ts","./src/app/pages/main/redrive-messages/redrive-messages-settings/redrive-messages-settings.component.ts","./src/app/pages/main/redrive-messages/redrive-messages-settings/redrive-messages-settings.component.html","./src/app/pages/main/redrive-messages/redrive-messages-table/redrive-messages-table.component.html","./src/app/pages/main/redrive-messages/redrive-messages-table/redrive-messages-table.component.ts","./src/app/components/data-layout/data-layout.component.ts","./src/app/components/data-layout/data-layout.component.html","./src/app/components/data-layout/data-layout-item/data-layout-item.component.ts","./src/app/components/data-layout/data-layout-item/data-layout-item.component.html","./src/app/pages/main/redrive-messages/redrive-messages.component.html","./src/app/pages/main/redrive-messages/redrive-messages.component.ts","./src/app/services/util/utils.ts","./src/app/pages/main/routing-list/routing-creation/mqtt-topic-help-dialog/mqtt-topic-help-dialog.component.ts","./src/app/pages/main/routing-list/routing-creation/mqtt-topic-help-dialog/mqtt-topic-help-dialog.component.html","./src/app/pages/main/routing-list/routing-creation/routing-creation.service.ts","./src/app/pages/main/routing-list/routing-creation/pattern-builder/pattern-builder.component.html","./src/app/pages/main/routing-list/routing-creation/pattern-builder/pattern-builder.component.ts","./src/app/pages/main/routing-list/routing-creation/pattern-builder-help/pattern-builder-help.component.ts","./src/app/pages/main/routing-list/routing-creation/pattern-builder-help/pattern-builder-help.component.html","./src/app/pages/main/routing-list/routing-creation/destination-form/data-select-list/data-select-list.component.html","./src/app/pages/main/routing-list/routing-creation/destination-form/data-select-list/data-select-list.component.ts","./src/app/pages/main/routing-list/routing-creation/destination-form/sheet-data-builder/columns.config.ts","./src/app/pages/main/routing-list/routing-creation/destination-form/sheet-data-builder/sheet-data-builder.component.html","./src/app/pages/main/routing-list/routing-creation/destination-form/sheet-data-builder/sheet-data-builder.component.ts","./src/app/pages/main/routing-list/routing-creation/destination-form/destination-form.component.html","./src/app/pages/main/routing-list/routing-creation/destination-form/destination-form.component.ts","./src/app/pages/main/routing-list/routing-creation/routing-creation.component.html","./src/app/pages/main/routing-list/routing-creation/routing-creation.component.ts","./src/app/pages/main/routing-list/routing-details/routing-details.component.html","./src/app/pages/main/routing-list/routing-details/routing-details.component.ts","./src/app/pages/main/routing-list/routing-list-element/routing-list-element.component.html","./src/app/pages/main/routing-list/routing-list-element/routing-list-element.component.ts","./src/models/data-routing.models.ts","./src/app/pages/main/routing-list/routing-filter/routing-filter.component.html","./src/app/pages/main/routing-list/routing-filter/routing-filter.component.ts","./src/app/pages/main/routing-list/routing-list.component.html","./src/app/pages/main/routing-list/routing-list.component.ts","./src/app/pages/main/site/site-creation/all-or-none-validator.directive.ts","./src/app/pages/main/site/site-creation/site-creation.component.html","./src/app/pages/main/site/site-creation/site-creation.component.ts","./src/app/pages/main/site/site-filter/site-filter.component.html","./src/app/pages/main/site/site-filter/site-filter.component.ts","./src/app/pages/main/site/site.component.html","./src/app/pages/main/site/site.component.ts","./src/app/pages/main/user-management/user-creation/user-creation.component.html","./src/app/pages/main/user-management/user-creation/user-creation.component.ts","./src/app/pages/main/user-management/user-filter/user-filter.component.html","./src/app/pages/main/user-management/user-filter/user-filter.component.ts","./src/app/pages/main/user-management/user-management.component.html","./src/app/pages/main/user-management/user-management.component.ts","./src/app/pages/unauthorized/unauthorized.component.ts","./src/app/pages/unauthorized/unauthorized.component.html","./src/app/services/state/auth/edit-routing.guard.ts","./src/app/services/state/auth/oparator.guard.ts","./src/app/services/state/auth/write-rights.guard.ts","./src/app/app-routing.module.ts","./src/app/app.component.ts","./src/app/app.component.html","./src/app/services/material/material.module.ts","./src/app/components/form-field/form-field.component.ts","./src/app/components/form-field/form-field.component.html","./src/app/services/shared.module.ts","./src/app/pages/login/login.module.ts","./src/app/pages/main/interface-management/interface-management.module.ts","./src/app/pages/main/alerting/alerting.module.ts","./src/app/pages/main/catalogue/catalogue.module.ts","./src/app/pages/main/dashboard/dashboard.module.ts","./src/app/pages/main/device-management/device-management.module.ts","./src/app/pages/main/gateway-list/gateway.module.ts","./src/app/pages/main/redrive-messages/redrive-messages.module.ts","./src/models/download.models.ts","./src/app/services/util/download.service.ts","./src/app/pages/main/routing-list/routing-details/data-list/data-list.component.html","./src/app/pages/main/routing-list/routing-details/data-list/data-list.component.ts","./src/app/pages/main/routing-list/routing-details/device-data-selection/device-data-selection.component.html","./src/app/pages/main/routing-list/routing-details/device-data-selection/device-data-selection.component.ts","./src/app/pages/main/routing-list/routing.module.ts","./src/app/pages/main/site/site.module.ts","./src/app/pages/main/user-management/user-management.module.ts","./src/app/pages/main/main.module.ts","./src/app/pages/unauthorized/unauthorized.module.ts","./src/app/app.module.ts","./src/main.ts","./node_modules/moment/locale/ sync ^\\.\\/.*$"],"sourcesContent":["import { BreakpointObserver } from '@angular/cdk/layout';\nimport { Injectable } from '@angular/core';\nimport { UntypedFormControl, UntypedFormGroup } from '@angular/forms';\nimport { NavigationEnd, Router } from '@angular/router';\nimport { BehaviorSubject, Observable } from 'rxjs';\nimport { filter, map, tap } from 'rxjs/operators';\n\nenum Breakpoints {\n XS = '(max-width: 600px)',\n S = '(min-width: 601px) and (max-width: 1023.99px)',\n M = '(min-width: 1024px) and (max-width: 1439.99px)',\n L = '(min-width: 1440px) and (max-width: 1919.99px)',\n XL = '(min-width: 1920px)',\n}\n\nconst titleConfig = [\n { urlChunk: '/device/', title: 'Device Management' },\n { urlChunk: 'catalog', title: 'Model Catalogue' },\n { urlChunk: 'routing', title: 'Data Routing' },\n { urlChunk: 'users/new', title: 'User Creation' },\n { urlChunk: 'users/edit', title: 'Edit User' },\n { urlChunk: 'users', title: 'User Management' },\n { urlChunk: 'site/new', title: 'Site Creation' },\n { urlChunk: 'site/edit', title: 'Edit Site' },\n { urlChunk: 'site', title: 'Site Management' },\n { urlChunk: 'interfaces', title: 'Interface Management' },\n { urlChunk: 'gateways', title: 'Gateways' },\n { urlChunk: 'alerts', title: 'Alerts' },\n { urlChunk: '', title: 'Home' },\n];\n\n@Injectable({\n providedIn: 'root',\n})\nexport class InterfaceStateService {\n private readonly _breakpointIndex$ = new BehaviorSubject(0);\n private readonly _mainTitle$ = new BehaviorSubject('');\n private readonly _routedUrlHistory$ = new BehaviorSubject([]);\n private readonly _dashboardFilter$ = new BehaviorSubject(\n this.buildDashBoardFilter(),\n );\n private readonly _routingFilter$ = new BehaviorSubject(\n this.buildRoutingFilter(),\n );\n\n constructor(\n private breakPointObserver: BreakpointObserver,\n private router: Router,\n ) {\n this.mainTitleHandler$.subscribe();\n this.breakpointHandler$.subscribe();\n this.lastRoutedUrlHandler$.subscribe();\n }\n\n public get breakpointIndex$(): Observable {\n return this._breakpointIndex$.asObservable();\n }\n\n public get mainTitle$(): Observable {\n return this._mainTitle$.asObservable();\n }\n\n public get routedUrlHistory$(): Observable {\n return this._routedUrlHistory$.asObservable();\n }\n\n public get lastRoutedUrl(): string {\n const history = this._routedUrlHistory$.value;\n return history[history.length - 2];\n }\n\n private addUrlToHistory(url: string): void {\n const history = this._routedUrlHistory$.value;\n history.push(url);\n this._routedUrlHistory$.next(history);\n }\n\n private mapBreakpointToIndex(breakpoints: Record) {\n if (breakpoints[Breakpoints.S]) {\n return 1;\n }\n if (breakpoints[Breakpoints.M]) {\n return 2;\n }\n if (breakpoints[Breakpoints.L]) {\n return 3;\n }\n if (breakpoints[Breakpoints.XL]) {\n return 4;\n }\n return 0;\n }\n\n public resetStore() {\n this.resetDashBoardFilter();\n this.resetRoutingFilter();\n }\n\n public setDashboardFilter(filterForm: UntypedFormGroup) {\n this._dashboardFilter$.next(filterForm);\n }\n\n public get dashboardFilter$(): Observable {\n return this._dashboardFilter$.asObservable();\n }\n\n public get dashboardFilter(): UntypedFormGroup {\n return this._dashboardFilter$.value;\n }\n\n public resetDashBoardFilter(): void {\n this._dashboardFilter$.next(this.buildDashBoardFilter());\n }\n\n public buildDashBoardFilter(\n siteId = '',\n brandName = '',\n source = '',\n deviceType = '',\n status = '',\n ): UntypedFormGroup {\n return new UntypedFormGroup({\n siteId: new UntypedFormControl(siteId),\n brand_name: new UntypedFormControl(brandName),\n source: new UntypedFormControl(source),\n device_type_id: new UntypedFormControl(deviceType),\n status: new UntypedFormControl(status),\n });\n }\n\n public setRoutingFilter(filterForm: UntypedFormGroup): void {\n this._routingFilter$.next(filterForm);\n }\n\n public get routingFilter$(): Observable {\n return this._routingFilter$.asObservable();\n }\n\n public resetRoutingFilter(): void {\n this._routingFilter$.next(this.buildRoutingFilter());\n }\n\n public buildRoutingFilter(\n keyword = '',\n site = null,\n destination = null,\n tileView = true,\n ): UntypedFormGroup {\n return new UntypedFormGroup({\n filter: new UntypedFormGroup({\n keyword: new UntypedFormControl(keyword),\n site: new UntypedFormControl(site),\n destination: new UntypedFormControl(destination),\n }),\n tileView: new UntypedFormControl(tileView),\n });\n }\n\n private get mainTitleHandler$(): Observable {\n return this.router.events.pipe(\n filter((event) => event instanceof NavigationEnd),\n\n map((event) => event as NavigationEnd),\n map((event) => event.url),\n map(\n (url) =>\n titleConfig.filter((ele) => url.includes(ele.urlChunk))[0].title,\n ),\n tap((title) => this._mainTitle$.next(title)),\n );\n }\n\n private get breakpointHandler$(): Observable {\n return this.breakPointObserver\n .observe([\n Breakpoints.XS,\n Breakpoints.S,\n Breakpoints.M,\n Breakpoints.L,\n Breakpoints.XL,\n ])\n .pipe(\n map((state) => this.mapBreakpointToIndex(state.breakpoints)),\n tap((index) => this._breakpointIndex$.next(index)),\n );\n }\n\n private get lastRoutedUrlHandler$(): Observable {\n return this.router.events.pipe(\n filter((event) => event instanceof NavigationEnd),\n map((event) => (event as NavigationEnd).url),\n tap((url) => this.addUrlToHistory(url)),\n );\n }\n}\n","import { Injectable } from '@angular/core';\nimport { BehaviorSubject, Observable } from 'rxjs';\nimport { map } from 'rxjs/operators';\nimport { Country } from 'src/models/countries.models';\nimport { Interface, RouteDto } from 'src/models/data-routing.models';\nimport { Brand, DeviceTypeDTO, Source } from 'src/models/device-type.models';\nimport {\n DeviceDto,\n DeviceMonitoringStats,\n Downlink,\n} from 'src/models/device.models';\nimport { Gateway, RssiHistoryData } from 'src/models/gateway.models';\nimport { Organization } from 'src/models/organization.models';\nimport { Site } from 'src/models/site.models';\nimport { User } from 'src/models/user.models';\nimport { InterfaceStateService } from './../interface/interface-store.service';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class DataStoreService {\n private readonly _brands$ = new BehaviorSubject(\n undefined,\n );\n\n private readonly _codecs$ = new BehaviorSubject(\n undefined,\n );\n\n private readonly _countries$ = new BehaviorSubject(\n undefined,\n );\n\n private readonly _devices$ = new BehaviorSubject(\n undefined,\n );\n\n private readonly _allDevices$ = new BehaviorSubject(\n undefined,\n );\n\n private readonly _deviceMonitoring$ = new BehaviorSubject(\n {} as DeviceMonitoringStats,\n );\n\n private readonly _deviceTypes$ = new BehaviorSubject<\n undefined | DeviceTypeDTO[]\n >(undefined);\n\n private readonly _gateways$ = new BehaviorSubject(\n undefined,\n );\n\n private readonly _gatewayRssi$ = new BehaviorSubject<{\n [key: string]: RssiHistoryData[];\n }>({});\n\n private readonly _interfaces$ = new BehaviorSubject(\n undefined,\n );\n\n private readonly _organizations$ = new BehaviorSubject<\n undefined | Organization[]\n >(undefined);\n\n private readonly _routings$ = new BehaviorSubject(\n undefined,\n );\n private readonly _routing$ = new BehaviorSubject(\n undefined,\n );\n\n private readonly _site$ = new BehaviorSubject(undefined);\n\n private readonly _sites$ = new BehaviorSubject(undefined);\n\n private readonly _sources$ = new BehaviorSubject(\n undefined,\n );\n\n private readonly _users$ = new BehaviorSubject(undefined);\n\n private readonly _dataTags$: Observable;\n\n private readonly _deviceDownlinks$ = new BehaviorSubject<\n undefined | Downlink[]\n >(undefined);\n\n constructor(private interfaceState: InterfaceStateService) {\n this._dataTags$ = this.deviceTypes$.pipe(\n map((types) => {\n const tags = new Set();\n types?.forEach((type) => {\n type.functions.forEach((tag) => tags.add(tag.toLowerCase()));\n });\n return Array.from(tags).sort((a, b) => a.localeCompare(b));\n }),\n );\n }\n\n public resetStore(): void {\n this._brands$.next(undefined);\n this._codecs$.next(undefined);\n this._countries$.next(undefined);\n this._devices$.next(undefined);\n this._allDevices$.next(undefined);\n this._deviceMonitoring$.next({} as DeviceMonitoringStats);\n this._deviceTypes$.next(undefined);\n this._gateways$.next(undefined);\n this._gatewayRssi$.next({});\n this._interfaces$.next(undefined);\n this._organizations$.next(undefined);\n this._routings$.next(undefined);\n this._routing$.next(undefined);\n this._sites$.next(undefined);\n this._sources$.next(undefined);\n this._users$.next(undefined);\n this._deviceDownlinks$.next(undefined);\n }\n\n //---------------------------------------------------------------------------\n // Brands\n //---------------------------------------------------------------------------\n\n public get brands(): Brand[] | undefined {\n return this._brands$.getValue();\n }\n\n public get brands$(): Observable {\n return this._brands$.asObservable();\n }\n\n public setBrands(brands: Brand[]): void {\n this._brands$.next(brands.sort(this._sortBrands));\n }\n\n public addBrand(brand: Brand): void {\n const currentValue = this._brands$.getValue() as Brand[];\n this._brands$.next([...currentValue, brand].sort(this._sortBrands));\n }\n\n public updateBrand(brandUpdate: Brand): void {\n const currentValue = this._brands$.getValue() as Brand[];\n const updated = currentValue.map((brand) =>\n brand.name === brandUpdate.name ? brandUpdate : brand,\n );\n this._brands$.next(updated);\n }\n\n public deleteBrand(brandId: string) {\n const brands = this._brands$.value?.filter((brand) => brand.id !== brandId);\n this._brands$.next(brands);\n }\n\n private _sortBrands = (a: Brand, b: Brand) => a.name.localeCompare(b.name);\n\n //---------------------------------------------------------------------------\n // Codecs\n //---------------------------------------------------------------------------\n\n public get codecs(): string[] | undefined {\n return this._codecs$.getValue();\n }\n\n public get codecs$(): Observable {\n return this._codecs$.asObservable();\n }\n\n public setCodecs(devices: string[]): void {\n this._codecs$.next(devices);\n }\n\n //---------------------------------------------------------------------------\n // Countries\n //---------------------------------------------------------------------------\n\n public get countries(): Country[] | undefined {\n return this._countries$.value;\n }\n\n public get countries$(): Observable {\n return this._countries$.asObservable();\n }\n\n public setCountries(countries: Country[]) {\n this._countries$.next(countries);\n }\n\n //---------------------------------------------------------------------------\n // DataTags\n //---------------------------------------------------------------------------\n\n public get dataTags$(): Observable {\n return this._dataTags$;\n }\n\n //---------------------------------------------------------------------------\n // Devices\n //---------------------------------------------------------------------------\n\n public get devices(): DeviceDto[] | undefined {\n return this._devices$.getValue();\n }\n\n public get devices$(): Observable {\n return this._devices$.asObservable();\n }\n\n public getDeviceByID(id: string): DeviceDto {\n return this._devices$.value?.find(\n (device) => device.device_id === id,\n ) as DeviceDto;\n }\n\n public setDevices(devices: DeviceDto[]): void {\n this._devices$.next(devices);\n }\n\n public addDevice(device: DeviceDto): void {\n const currentValue = this._devices$.getValue() as DeviceDto[];\n this._devices$.next([...currentValue, device]);\n }\n\n public deleteDevice(deviceId: string): void {\n const currentValue = this._devices$.getValue();\n this._devices$.next(\n currentValue\n ? currentValue.filter((device) => device.device_id !== deviceId)\n : currentValue,\n );\n }\n\n //---------------------------------------------------------------------------\n // All Devices\n //---------------------------------------------------------------------------\n\n public get allDevices(): DeviceDto[] | undefined {\n return this._allDevices$.getValue();\n }\n\n public setAllDevices(devices: DeviceDto[]): void {\n this._allDevices$.next(devices);\n }\n\n //---------------------------------------------------------------------------\n // DeviceMonitoringStats\n //---------------------------------------------------------------------------\n\n public get deviceMonitoring$(): Observable {\n return this._deviceMonitoring$.asObservable();\n }\n\n public setDeviceMonitoring(stats: DeviceMonitoringStats): void {\n this._deviceMonitoring$.next(stats);\n }\n\n //---------------------------------------------------------------------------\n // DeviceTypes\n //---------------------------------------------------------------------------\n\n public get deviceTypes$(): Observable {\n return this._deviceTypes$.asObservable();\n }\n\n public setDeviceTypes(deviceTypes: DeviceTypeDTO[]): void {\n this._deviceTypes$.next(deviceTypes.sort(this.sortDeviceTypes));\n }\n\n public getDeviceTypeByID(id: string): DeviceTypeDTO | undefined {\n return this._deviceTypes$.value?.find(\n (deviceType) => deviceType.code === id,\n );\n }\n\n public addDeviceType(deviceType: DeviceTypeDTO): void {\n const currentValue = this._deviceTypes$.getValue() as DeviceTypeDTO[];\n this._deviceTypes$.next(\n [...currentValue, deviceType].sort(this.sortDeviceTypes),\n );\n }\n\n public updateDeviceType(newType: DeviceTypeDTO): void {\n const typesValue = this._deviceTypes$.getValue();\n if (typesValue) {\n const index = typesValue.findIndex(\n (model) => model.code === newType.code,\n );\n typesValue.splice(index, 1, newType);\n }\n\n this._deviceTypes$.next(typesValue);\n }\n\n public deleteDeviceType(deviceTypeId: string): void {\n const newValue = this._deviceTypes$.value?.filter(\n (type) => type.code !== deviceTypeId,\n );\n this._deviceTypes$.next(newValue);\n }\n\n /**\n * Return all device types grouped by source, then manufacturer\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n public get groupedDeviceTypes$(): Observable {\n return this.deviceTypes$.pipe(\n map((types) => {\n const mapper = types?.reduce((acc, curr) => {\n if (!acc[curr.source.code])\n acc[curr.source.code] = {\n source: curr.source,\n brandsMap: {},\n };\n\n const source = acc[curr.source.code];\n\n if (!source.brandsMap[curr.brand.name])\n source.brandsMap[curr.brand.name] = {\n brand: curr.brand,\n models: [],\n };\n\n source.brandsMap[curr.brand.name].models.push(curr);\n\n return acc;\n }, {});\n\n const results: unknown[] = [];\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n for (const value of Object.values(mapper!)) {\n results.push({\n source: value.source,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n brands: Object.values(value.brandsMap).map((item) => ({\n brand: item.brand,\n models: item.models,\n })),\n });\n }\n\n return results;\n }),\n );\n }\n\n public changeDeviceTypeActiveState(id: string, state: boolean) {\n const types = this._deviceTypes$.value;\n if (types) {\n const indexToUpdate = types.findIndex((type) => type.code === id);\n types[indexToUpdate].enabled = state;\n }\n\n this._deviceTypes$.next(types);\n }\n\n private sortDeviceTypes = (a: DeviceTypeDTO, b: DeviceTypeDTO) =>\n a.name.localeCompare(b.name);\n\n //---------------------------------------------------------------------------\n // Gateways\n //---------------------------------------------------------------------------\n\n public get gateways$(): Observable {\n return this._gateways$.asObservable();\n }\n\n public setGateways(gateways: Gateway[]): void {\n this._gateways$.next(gateways);\n }\n\n //---------------------------------------------------------------------------\n // GatewayRssi\n //---------------------------------------------------------------------------\n\n public get gatewayRssi(): {\n [key: string]: RssiHistoryData[];\n } {\n return this._gatewayRssi$.value;\n }\n\n public setGatewayRssi(gatewayId: string, rssiData: RssiHistoryData[]) {\n const value = this._gatewayRssi$.value;\n value[gatewayId] = rssiData;\n this._gatewayRssi$.next(value);\n }\n\n //---------------------------------------------------------------------------\n // Interfaces\n //---------------------------------------------------------------------------\n\n public get interfaces$(): Observable {\n return this._interfaces$.asObservable();\n }\n\n public setInterfaces(interfaces: Interface[]): void {\n this._interfaces$.next(interfaces);\n }\n\n public addInterface(interf: Interface): void {\n const interfaces = [...(this._interfaces$.value as Interface[]), interf];\n this._interfaces$.next(interfaces);\n }\n\n public updateInterface(interfaceUpdate: Interface): void {\n let interfaces = this._interfaces$.value;\n if (interfaces) {\n interfaces = interfaces.map((interf) =>\n interf.id === interfaceUpdate.id ? interfaceUpdate : interf,\n );\n }\n this._interfaces$.next(interfaces);\n }\n\n //---------------------------------------------------------------------------\n // Organizations\n //---------------------------------------------------------------------------\n\n public get organizations$(): Observable {\n return this._organizations$.asObservable();\n }\n\n public setOrganizations(organizations: Organization[]) {\n this._organizations$.next(organizations);\n }\n\n //---------------------------------------------------------------------------\n // Routings\n //---------------------------------------------------------------------------\n\n public get routings(): RouteDto[] | undefined {\n return this._routings$.value;\n }\n\n public get routings$(): Observable {\n return this._routings$.asObservable();\n }\n\n public setRoutings(routings: RouteDto[]): void {\n this._routings$.next(routings);\n }\n\n public addRouting(routing: RouteDto): void {\n const routes = [...(this._routings$.value as RouteDto[]), routing];\n this._routings$.next(routes);\n }\n\n public get routing(): RouteDto | undefined {\n return this._routing$.value;\n }\n\n public get routing$(): Observable {\n return this._routing$.asObservable();\n }\n\n public setRouting(routing: RouteDto): void {\n this._routing$.next(routing);\n }\n\n public resetRouting(): void {\n this._routing$.next(undefined);\n }\n\n public updateRoute(id: string, routeUpdate: RouteDto): void {\n let routes = this._routings$.value;\n if (routes) {\n routes = routes.map((route) => (route.id === id ? routeUpdate : route));\n }\n this._routings$.next(routes);\n this._routing$.next(routeUpdate);\n }\n\n public deleteRoute(id: string): void {\n const routes = this._routings$.value?.filter((route) => route.id !== id);\n this._routings$.next(routes);\n }\n\n public changeRouteActiveState(id: string, state: boolean): void {\n const routes = this._routings$.value;\n if (routes) {\n const indexToUpdate = routes.findIndex((route) => route.id === id);\n routes[indexToUpdate].is_active = state;\n }\n\n this._routings$.next(routes);\n }\n\n //---------------------------------------------------------------------------\n // Sites\n //---------------------------------------------------------------------------\n\n public get sites(): Site[] | undefined {\n return this._sites$.value;\n }\n\n public get sites$(): Observable {\n return this._sites$.asObservable();\n }\n\n public setSites(sites: Site[]): Site[] {\n sites.sort((a, b) => this.sortSites(a, b));\n this._sites$.next(sites);\n return sites;\n }\n\n public findSite(siteId: string): Observable {\n const sites = this._sites$.getValue();\n if (sites) {\n const index = sites.findIndex((site) => site.code === siteId);\n this._site$.next(sites[index]);\n } else {\n this._site$.next(undefined);\n }\n\n return this._site$;\n }\n\n public addSite(site: Site) {\n const newSites = [...this._sites$.getValue()!, site];\n newSites.sort((a, b) => this.sortSites(a, b));\n this._sites$.next(newSites);\n }\n\n public updateSite(siteUpdate: Site) {\n if (this._sites$.value) {\n const newSites = this._sites$.value.map((site) =>\n site.code === siteUpdate.code ? siteUpdate : site,\n );\n newSites.sort((a, b) => this.sortSites(a, b));\n this._sites$.next(newSites);\n }\n }\n\n private sortSites(a: Site, b: Site): number {\n return a.country.isoCode.localeCompare(b.country.isoCode) !== 0\n ? a.country.isoCode.localeCompare(b.country.isoCode)\n : a.code.localeCompare(b.code);\n }\n\n //---------------------------------------------------------------------------\n // Sources\n //---------------------------------------------------------------------------\n\n public get sources$(): Observable {\n return this._sources$.asObservable();\n }\n\n public get sources(): Source[] | undefined {\n return this._sources$.value;\n }\n\n public setSources(sources: Source[]): void {\n this._sources$.next(sources.sort(this._sortSources));\n }\n\n private _sortSources = (a: Source, b: Source) => a.code.localeCompare(b.code);\n\n //---------------------------------------------------------------------------\n // Users\n //---------------------------------------------------------------------------\n\n public get users(): User[] {\n return this._users$.value ? this._users$.value : [];\n }\n\n public get users$(): Observable {\n return this._users$.asObservable();\n }\n\n public setUsers(users: User[]): void {\n this._users$.next(users);\n }\n\n public addUser(user: User): void {\n const users = [...(this._users$.value as User[]), user];\n this._users$.next(users);\n }\n\n public updateUser(user: User): void {\n const users = this._users$.value;\n\n if (users) {\n const index = users.findIndex((u) => u.email === user.email);\n users.splice(index, 1, user);\n }\n\n this._users$.next(users);\n }\n\n public deleteUser(email: string) {\n const users = this._users$.value?.filter((user) => user.email !== email);\n this._users$.next(users);\n }\n\n //---------------------------------------------------------------------------\n // Downlinks\n //---------------------------------------------------------------------------\n\n public get deviceDownlinks$(): Observable {\n return this._deviceDownlinks$.asObservable();\n }\n\n public setDeviceDownlinks(downlink: Downlink[]): void {\n this._deviceDownlinks$.next(downlink);\n }\n\n //---------------------------------------------------------------------------\n // Others\n //---------------------------------------------------------------------------\n\n public get deviceClasses() {\n return deviceClasses;\n }\n\n public get regions() {\n return regions;\n }\n\n public dataRates(region?: string) {\n return region && (region === 'US915' || region === 'AU915')\n ? usDataRates\n : dataRates;\n }\n}\n\nconst deviceClasses = [\n 'ADRF/SensorsA.1_EU',\n 'ADRF/FielTestDeviceA.1_EU',\n 'ADRF/FielTestDeviceC.1_EU',\n 'LORA/GenericC.1_ETSI_Rx2-SF12',\n 'SMTC/LoRaMoteA.1_EU',\n 'LORA/GenericA.1.0.2b_ETSI_Rx2-SF12',\n 'LORA/GenericA.1.0.2a_ETSI_Rx2-SF12',\n 'SMTC/LoRaMoteC.1_EU',\n 'LORA/GenericC.1.0.2a_ETSI_Rx2-SF12',\n 'LORA/GenericB.1.0.2b_ETSI_Rx2-SF12',\n 'LORA/GenericA.1_ETSI_Rx2-SF9',\n 'LORA/GenericC.1_ETSI_Rx2-SF9',\n 'LORA/GenericB.1.0.2a_ETSI_Rx2-SF12',\n 'LORA/GenericA.1_ETSI_Rx2-SF12',\n 'LORA/GenericC.1.0.2b_ETSI_Rx2-SF12',\n];\n\nconst regions = [\n { option: 'EU 868', value: 'EU868' },\n { option: 'US 915', value: 'US915' },\n { option: 'AU 915', value: 'AU915' },\n { option: 'IN 865', value: 'IN865' },\n { option: 'AS 923', value: 'AS923' },\n { option: 'CN 470', value: 'CN470' },\n];\n\nconst dataRates = [\n { option: 'SF 12 / BW 125 kHz', value: 0 },\n { option: 'SF 11 / BW 125 kHz', value: 1 },\n { option: 'SF 10 / BW 125 kHz', value: 2 },\n { option: 'SF 9 / BW 125 kHz', value: 3 },\n { option: 'SF 8 / BW 125 kHz', value: 4 },\n { option: 'SF 7 / BW 125 kHz', value: 5 },\n];\n\nconst usDataRates = [\n { option: 'SF 12 / BW 500 kHz', value: 8 },\n { option: 'SF 11 / BW 500 kHz', value: 9 },\n { option: 'SF 10 / BW 500 kHz', value: 10 },\n { option: 'SF 9 / BW 500 kHz', value: 11 },\n { option: 'SF 8 / BW 500 kHz', value: 12 },\n { option: 'SF 7 / BW 500 kHz', value: 13 },\n];\n","import { Injectable } from '@angular/core';\nimport { AngularFireAuth } from '@angular/fire/compat/auth';\nimport { GoogleAuthProvider } from '@angular/fire/auth';\nimport { Router } from '@angular/router';\nimport 'firebase/compat/auth';\nimport { Observable, from, of, throwError } from 'rxjs';\nimport { catchError, filter, map, switchMap, tap } from 'rxjs/operators';\nimport { DataStoreService } from 'src/app/services/state/data/data-store.service';\nimport { UserClaims } from 'src/models/device-hierarchy.models';\n\nconst PROJECT_TAG_PREFIX = 'site_';\n@Injectable({\n providedIn: 'root',\n})\nexport class AuthService {\n private _claims: UserClaims | undefined;\n\n constructor(\n private afAuth: AngularFireAuth,\n private router: Router,\n private data: DataStoreService,\n ) {}\n\n public login() {\n this.afAuth\n .signInWithPopup(new GoogleAuthProvider())\n .then(() => this.router.navigateByUrl('/home'));\n }\n public logout() {\n this.afAuth.signOut();\n this.data.resetStore();\n }\n\n public isTechnicalAdmin() {\n return this._claims ? this._claims.technical_admin : false;\n }\n\n public isAdmin() {\n return this._claims ? this.isTechnicalAdmin() || this._claims.admin : false;\n }\n\n public isMaintainer() {\n return this._claims\n ? this.isAdmin() || this._claims.maintainer.length\n : false;\n }\n\n public isMaintainerOnSite(site: string): boolean {\n return this._claims\n ? this.isAdmin() || this._claims.maintainer.includes(site)\n : false;\n }\n\n private parseRouteIdParam(id: string) {\n const chunks = id.split('#');\n return {\n routeCollectionId: chunks[0],\n interfaceDocId: chunks[1],\n siteId: chunks[2],\n };\n }\n\n public isMaintainerOnRoute(routeId: string): boolean {\n const { siteId } = this.parseRouteIdParam(routeId);\n return this.isMaintainerOnSite(siteId);\n }\n\n public hasWriteRightsForProject(path: string): boolean {\n return (\n this.isAdmin() ||\n !!this._claims!.maintainer.find((proj) => path.indexOf(proj) > -1)\n );\n }\n\n public get userHasMultipleSiteAccess(): boolean {\n const sitesAccessible = [\n ...(this.claims ? this.claims.maintainer! : []),\n ...(this.claims ? this.claims.operator! : []),\n ];\n const siteCount = this.claims?.admin ? 2 : sitesAccessible.length;\n return siteCount > 1;\n }\n\n public get accessibleSites(): string[] {\n return [\n ...(this.claims ? this.claims.maintainer! : []),\n ...(this.claims ? this.claims.operator! : []),\n ];\n }\n\n public isLoggedIn$(): Observable {\n return this.afAuth.user.pipe(\n filter((user) => user !== null),\n map((user) => !!user),\n );\n }\n\n public isAuthorized$(): Observable {\n return this.afAuth.idTokenResult.pipe(\n switchMap((tokenRes) =>\n // using throw and catchError to skip to the end of the Observable chain and return an Observable of false in case the user is not logged in\n tokenRes === null ? throwError(false) : of(tokenRes),\n ),\n // tslint:disable-next-line: no-non-null-assertion\n map((tokenRes) => this.mapClaims(tokenRes!.claims)),\n tap((claims) => (this._claims = claims)),\n map(\n (claims) =>\n claims.admin ||\n claims.maintainer.length > 0 ||\n claims.operator.length > 0,\n ),\n catchError((bool) => of(bool)),\n );\n }\n\n public getToken$(): Observable {\n return this.afAuth.authState.pipe(\n filter((user) => !!user),\n // tslint:disable-next-line: no-non-null-assertion\n switchMap((user) => from(user!.getIdToken())),\n );\n }\n\n private mapClaims(claims: Record): UserClaims {\n const res = {\n admin: !!claims.admin,\n technical_admin: !!claims.technical_admin,\n operator: [] as string[],\n maintainer: [] as string[],\n accessFlags: claims.accessFlags as string[],\n };\n\n const keys = Object.keys(claims);\n keys\n .filter((key) => key.startsWith(PROJECT_TAG_PREFIX))\n .forEach((key) => {\n if (claims[key] === 0) {\n res.operator.push(key);\n } else if (claims[key] === 1) {\n res.maintainer.push(key);\n }\n });\n\n return res;\n }\n\n public get claims(): UserClaims | undefined {\n return this._claims;\n }\n\n public get userEmail$(): Observable {\n return this.afAuth.authState.pipe(map((user) => user?.email ?? undefined));\n }\n}\n","import {\n HttpEvent,\n HttpHandler,\n HttpInterceptor,\n HttpRequest,\n} from '@angular/common/http';\nimport { Injectable } from '@angular/core';\nimport { Observable } from 'rxjs';\nimport { switchMap } from 'rxjs/operators';\nimport { AuthService } from 'src/app/services/state/auth/auth.service';\n\n@Injectable()\nexport class AuthInterceptor implements HttpInterceptor {\n constructor(private auth: AuthService) {}\n\n intercept(\n req: HttpRequest,\n next: HttpHandler,\n ): Observable> {\n return this.auth.getToken$().pipe(\n switchMap((token) =>\n next.handle(\n req.clone({\n setHeaders: { Authorization: `Bearer ${token}` },\n }),\n ),\n ),\n );\n }\n}\n","import {\n HttpErrorResponse,\n HttpEvent,\n HttpHandler,\n HttpInterceptor,\n HttpRequest,\n} from '@angular/common/http';\nimport { Injectable } from '@angular/core';\nimport { MatSnackBar } from '@angular/material/snack-bar';\nimport { Observable, throwError } from 'rxjs';\nimport { catchError } from 'rxjs/operators';\n\n@Injectable()\nexport class HttpErrorInterceptor implements HttpInterceptor {\n constructor(private snackBar: MatSnackBar) {}\n\n intercept(\n request: HttpRequest,\n next: HttpHandler,\n ): Observable> {\n return next.handle(request).pipe(\n catchError((error: HttpErrorResponse) => {\n const statusText =\n error.error.message ?? error.error.error ?? error.statusText;\n const errorMessage =\n statusText.toUpperCase() !== 'OK'\n ? `Error: ${statusText}`\n : 'An error occurred. Please contact the support team';\n if (!request.url.includes('csv')) {\n this.snackBar.open(\n errorMessage,\n\n 'Close',\n {\n duration: 20000,\n },\n );\n }\n\n return throwError(error);\n }),\n );\n }\n}\n","import { HTTP_INTERCEPTORS } from '@angular/common/http';\n\nimport { AuthInterceptor } from './auth.interceptor';\nimport { HttpErrorInterceptor } from './http-error.interceptor';\n\n/** Http interceptor providers in outside-in order */\nexport const httpInterceptorProviders = [\n { provide: HTTP_INTERCEPTORS, useClass: AuthInterceptor, multi: true },\n {\n provide: HTTP_INTERCEPTORS,\n useClass: HttpErrorInterceptor,\n multi: true,\n },\n];\n","// TODO Unused : remove or use ?\n\nexport const environment = {\n production: false,\n apiUrlConfigs: 'https://iothub-dev.solvay.com/api/v1/configuration/',\n apiUrlCommands: 'https://iothub-dev.solvay.com/api/v1/command/',\n firebaseConfig: {\n apiKey: 'AIzaSyD3GQKz2d51M1IBMwopMq263JomSFyUUiU',\n authDomain: 'prj-iothub-dev.firebaseapp.com',\n databaseURL: 'https://prj-iothub-dev.firebaseio.com',\n projectId: 'prj-iothub-dev',\n storageBucket: 'prj-iothub-dev.appspot.com',\n messagingSenderId: '927751531075',\n appId: '1:927751531075:web:6a0cc3a7497c4ca0a5c2f6',\n },\n googleSheetBaseUrl: 'https://docs.google.com/spreadsheets/d/',\n grafanaUrl: 'https://35.205.95.115/',\n supportGoogleSheetUrl:\n 'https://docs.google.com/spreadsheets/d/11pN9PYlnGZssPa3mJf9vFpoRcuWNfT8JQURaZ-JsBv8/edit#gid=0',\n gsExporterServiceAccount: 'prj-iothub-dev@appspot.gserviceaccount.com',\n openStreetMap: {\n defaultMapCenter: {\n lat: 50.901072,\n lng: 4.400331,\n },\n layerTilesUrl: 'https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png',\n attribution:\n '© OpenStreetMap',\n },\n serviceAccountGoogleSheet: 'prj-iothub-dev@appspot.gserviceaccount.com',\n stage: 'dev',\n};\n","import { HttpParameterCodec } from '@angular/common/http';\n\nexport class CustomHttpParamEncoder implements HttpParameterCodec {\n encodeKey(key: string): string {\n return encodeURIComponent(key);\n }\n encodeValue(value: string): string {\n return encodeURIComponent(value);\n }\n decodeKey(key: string): string {\n return decodeURIComponent(key);\n }\n decodeValue(value: string): string {\n return decodeURIComponent(value);\n }\n}\n","import { HttpClient, HttpParams } from '@angular/common/http';\nimport { Injectable } from '@angular/core';\nimport { Observable } from 'rxjs';\nimport { map, pluck } from 'rxjs/operators';\nimport { environment } from 'src/environments/environment';\nimport {\n GeneralRouteInfo,\n Interface,\n PubSubMessage,\n RouteDto,\n} from 'src/models/data-routing.models';\nimport { HierarchyNode } from 'src/models/device-hierarchy.models';\nimport {\n Brand,\n DecoderBlueprint,\n DeviceTypeDTO,\n DeviceTypeInfo,\n HexDecoderBlueprint,\n Source,\n} from 'src/models/device-type.models';\nimport {\n BrandInfo,\n DefaultDeviceInfo,\n DeviceAlarm,\n DeviceDto,\n DeviceMonitoringStats,\n DevicePictureInfo,\n DeviceUpdateInfo,\n Downlink,\n FireflyDeviceInfo,\n IotCoreDeviceInfo,\n SiteNotificationConfig,\n} from 'src/models/device.models';\nimport { Gateway, GatewayImportInfo } from 'src/models/gateway.models';\nimport { CreateSiteDTO, Site } from 'src/models/site.models';\nimport { User, UserAlertInfo } from 'src/models/user.models';\nimport { MesMessageDto, RedriveTaskDto } from '../../../models/mes-messages';\nimport { Paginated } from '../../../models/pagination.models';\nimport { Country } from './../../../models/countries.models';\nimport { RssiHistoryData } from './../../../models/gateway.models';\nimport { Organization } from './../../../models/organization.models';\nimport { UserInfo } from './../../../models/user.models';\nimport { CustomHttpParamEncoder } from './custom-http-param-encoder';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class DevicesService {\n public configsUrl: string = environment.apiUrlConfigs;\n public commandsUrl: string = environment.apiUrlCommands;\n\n constructor(private http: HttpClient) {}\n\n //---------------------------------------------------------------------------\n // Brands\n //---------------------------------------------------------------------------\n\n public getBrands(): Observable {\n return this.http\n .get>(this.configsUrl + 'brands')\n .pipe(map((result) => result.items));\n }\n\n public createBrand(brand: BrandInfo): Observable {\n const formData = new FormData();\n Object.keys(brand).forEach((key) => formData.append(key, brand[key]));\n\n return this.http.post(`${this.configsUrl}brands`, formData);\n }\n\n public updateBrand(brandId: string, brand: BrandInfo): Observable {\n const formData = new FormData();\n Object.keys(brand).forEach((key) => formData.append(key, brand[key]));\n\n return this.http.put(\n `${this.configsUrl}brands/${brandId}`,\n formData,\n );\n }\n\n public deleteBrand(brandId: string): Observable {\n return this.http.delete(`${this.configsUrl}brands/${brandId}`);\n }\n\n //---------------------------------------------------------------------------\n // Codecs\n //---------------------------------------------------------------------------\n\n public getCodecList(): Observable {\n return this.http.get(`${this.configsUrl}codecs`);\n }\n\n public decodeTestPayload(\n payload: string,\n blueprint: HexDecoderBlueprint,\n port?: number,\n ) {\n return this.http.post<{ statusCode: number }>(\n `${this.configsUrl}codecs/test`,\n {\n payload,\n blueprint,\n port,\n },\n );\n }\n\n //---------------------------------------------------------------------------\n // Countries\n //---------------------------------------------------------------------------\n\n public getCountries(): Observable {\n return this.http\n .get(this.configsUrl + 'countries')\n .pipe(\n map((response) =>\n response.sort((a, b) => a.name.localeCompare(b.name)),\n ),\n );\n }\n\n //---------------------------------------------------------------------------\n // Devices\n //---------------------------------------------------------------------------\n\n public getDevices(\n filter: { [key: string]: string | null } = {},\n ): Observable {\n let params = new HttpParams({ encoder: new CustomHttpParamEncoder() });\n\n Object.keys(filter)\n .filter((key) => filter[key])\n .forEach((key) => (params = params.append(key, filter[key] as string)));\n\n return this.http.get(this.configsUrl + 'devices', {\n params,\n });\n }\n\n public getDeviceById(id: string): Observable {\n return this.http.get(this.configsUrl + 'devices/' + id);\n }\n\n public getDeviceHierarchyTree() {\n return this.http.get(\n this.configsUrl + 'devices/hierarchy_tree',\n );\n }\n\n public createDevice(\n deviceInfo: FireflyDeviceInfo | DefaultDeviceInfo | IotCoreDeviceInfo,\n source: string,\n ): Observable {\n const params = new HttpParams({\n encoder: new CustomHttpParamEncoder(),\n }).append('source', source.toLowerCase());\n\n return this.http.post(this.configsUrl + 'devices', deviceInfo, {\n params,\n });\n }\n\n public createDevices(payload: unknown, source: string) {\n const params = new HttpParams({\n encoder: new CustomHttpParamEncoder(),\n }).append('source', source.toLowerCase());\n\n return this.http.post<{ created: DeviceDto[] }>(\n this.configsUrl + 'devices/csv',\n payload,\n {\n params,\n },\n );\n }\n\n public updateDevice(deviceInfo: DeviceUpdateInfo): Observable {\n return this.http.put(\n `${this.configsUrl}devices/${deviceInfo.device_id}`,\n deviceInfo,\n );\n }\n\n public deleteDevice(device: DeviceDto): Observable {\n return this.http.delete(\n this.configsUrl + `devices/${device.device_id}`,\n );\n }\n\n public updateDevicePicture(\n deviceId: string,\n devicePicture: DevicePictureInfo,\n ): Observable {\n const formData = new FormData();\n formData.append('image_file', devicePicture.image_file);\n return this.http.put(\n `${this.configsUrl}devices/${deviceId}/picture`,\n formData,\n );\n }\n\n public updateDeviceAlarm(id: string, alarm: DeviceAlarm): Observable {\n return this.http.put(`${this.configsUrl}devices/${id}/alarm`, alarm);\n }\n\n public setDeviceCalibration(\n deviceId: string,\n calibrations: unknown,\n ): Observable {\n return this.http.put(\n this.configsUrl + `devices/${deviceId}/calibration`,\n calibrations,\n );\n }\n\n public moveDevices(\n deviceIds: string[],\n hierarchyPrefix: string,\n projectId: string,\n ): Observable {\n return this.http.put(this.configsUrl + 'devices/hierarchy', {\n data: deviceIds.map((deviceId) => ({\n deviceId,\n hierarchyPrefix,\n projectId,\n })),\n });\n }\n\n //---------------------------------------------------------------------------\n // DeviceDownlinks\n //---------------------------------------------------------------------------\n\n public sendDownlink(\n deviceId: string,\n downlinkInfo: unknown,\n ): Observable {\n return this.http.post(\n `${this.commandsUrl}internal/devices/${deviceId}`,\n downlinkInfo,\n );\n }\n\n public sendMultiDownlink(\n deviceIds: string[],\n downlinkInfo: unknown,\n ): Observable {\n return this.http.post(`${this.commandsUrl}internal/devices`, {\n device_ids: deviceIds,\n ...(downlinkInfo as object),\n });\n }\n\n public getDeviceDownlinks(id: string): Observable {\n return this.http.get(\n `${this.configsUrl}devices/${id}/downlinks`,\n );\n }\n\n //---------------------------------------------------------------------------\n // DeviceMessages\n //---------------------------------------------------------------------------\n\n public getDeviceMessages(\n device: DeviceDto,\n minTimestamp = 0,\n maxTimestamp = Date.now(),\n messageLimit = 5,\n pageAction?: 'PREV' | 'NEXT',\n referenceTimestamp = 0,\n ): Observable {\n const url = `${this.configsUrl}telemetries/${device.tags[0].tag_id}/messages`;\n let params = new HttpParams({ encoder: new CustomHttpParamEncoder() });\n params = params\n .append('min_timestamp', minTimestamp.toString())\n .append('max_timestamp', maxTimestamp.toString())\n .append('limit', messageLimit.toString())\n .append('device_id', device.device_id);\n\n if (pageAction) {\n params = params\n .append('pageAction', pageAction)\n .append('referenceTimestamp', referenceTimestamp.toString());\n }\n\n return this.http.get(url, { params });\n }\n\n public getDeviceMessagesCount(\n device: DeviceDto,\n minTimestamp = 0,\n maxTimestamp = Date.now(),\n ): Observable {\n const url = `${this.configsUrl}telemetries/${device.tags[0].tag_id}/messages/count`;\n let params = new HttpParams({ encoder: new CustomHttpParamEncoder() });\n params = params\n .append('min_timestamp', minTimestamp.toString())\n .append('max_timestamp', maxTimestamp.toString())\n .append('device_id', device.device_id);\n\n return this.http.get(url, { params });\n }\n\n public getLastMessageOfDevice(device: DeviceDto): Observable {\n return this.http.get(\n `${this.configsUrl}telemetries/${device.tags[0].tag_id}/messages/${device.device_id}/last`,\n );\n }\n\n //---------------------------------------------------------------------------\n // DeviceMonitoringStats\n //---------------------------------------------------------------------------\n\n public getMonitoringStats(\n filter: { [key: string]: string | null } = {},\n ): Observable {\n let params = new HttpParams({ encoder: new CustomHttpParamEncoder() });\n\n Object.keys(filter)\n .filter((key) => filter[key])\n .forEach((key) => (params = params.append(key, filter[key] as string)));\n\n return this.http.get(\n this.configsUrl + 'monitoring/statistics',\n { params },\n );\n }\n\n //---------------------------------------------------------------------------\n // DeviceTypes\n //---------------------------------------------------------------------------\n\n private deviceTypesBaseUrl = `${this.configsUrl}device-types`;\n\n public getDeviceTypes(): Observable {\n return this.http\n .get>(this.deviceTypesBaseUrl)\n .pipe(map((response) => response.items));\n }\n\n public getDeviceTypeByID(\n id: string,\n full = false,\n ): Observable {\n let params = new HttpParams({ encoder: new CustomHttpParamEncoder() });\n params = params.append('full', full.toString());\n return this.http.get(\n `${this.deviceTypesBaseUrl}/${encodeURIComponent(id)}`,\n { params },\n );\n }\n\n public createDeviceType(\n deviceType: DeviceTypeInfo,\n ): Observable {\n const formData = new FormData();\n Object.keys(deviceType).forEach((key) =>\n formData.append(key, deviceType[key]),\n );\n\n return this.http.post(\n `${this.deviceTypesBaseUrl}`,\n formData,\n );\n }\n\n public updateDeviceType(\n typeId: string,\n deviceType: DeviceTypeInfo,\n ): Observable {\n const encodedId = encodeURIComponent(typeId);\n const formData = new FormData();\n Object.keys(deviceType).forEach((key) =>\n formData.append(key, deviceType[key]),\n );\n\n return this.http.put(\n `${this.deviceTypesBaseUrl}/${encodedId}`,\n formData,\n );\n }\n\n public updateDeviceTypeCodec(\n typeId: string,\n decoderBlueprint: DecoderBlueprint,\n ): Observable {\n const encodedId = encodeURIComponent(typeId);\n return this.http.patch(\n `${this.deviceTypesBaseUrl}/${encodedId}`,\n { decoderBlueprint },\n );\n }\n\n public changeDeviceTypeActiveState(\n deviceTypeId: string,\n enabled: boolean,\n ): Observable {\n const encodedId = encodeURIComponent(deviceTypeId);\n\n return this.http.patch(`${this.deviceTypesBaseUrl}/${encodedId}`, {\n enabled,\n });\n }\n\n public deleteDeviceType(deviceTypeId: string): Observable {\n const encodedId = encodeURIComponent(deviceTypeId);\n return this.http.delete(`${this.deviceTypesBaseUrl}/${encodedId}`);\n }\n\n //---------------------------------------------------------------------------\n // Gateways\n //---------------------------------------------------------------------------\n\n public getGateways(): Observable {\n return this.http\n .get>(`${this.configsUrl}gateways`)\n .pipe(map((response) => response.items));\n }\n\n public importGateway(\n gatewayImportInfo: GatewayImportInfo,\n ): Observable {\n return this.http.post(\n this.configsUrl + `gateways/import`,\n gatewayImportInfo,\n );\n }\n\n //---------------------------------------------------------------------------\n // GatewayRssi\n //---------------------------------------------------------------------------\n\n public getGatewayRssi(gatewayId: string): Observable {\n return this.http.get(\n `${this.configsUrl}gateways/${gatewayId}/rssi`,\n );\n }\n\n //---------------------------------------------------------------------------\n // Interfaces\n //---------------------------------------------------------------------------\n\n public getRoutingInterfaces(): Observable {\n return this.http\n .get>(this.configsUrl + 'interfaces')\n .pipe(map((result) => result.items));\n }\n\n public createInterface(interf: Interface): Observable {\n return this.http.post(`${this.configsUrl}interfaces`, interf);\n }\n\n public updateInterface(interf: Interface): Observable {\n return this.http.put(\n `${this.configsUrl}interfaces/${interf.id}`,\n interf,\n );\n }\n\n //---------------------------------------------------------------------------\n // Organizations\n //---------------------------------------------------------------------------\n\n public getOrganizations(): Observable {\n return this.http\n .get(this.configsUrl + 'organizations')\n .pipe(\n map((response) =>\n response.sort((a, b) => a.name.localeCompare(b.name)),\n ),\n );\n }\n\n //---------------------------------------------------------------------------\n // Routings\n //---------------------------------------------------------------------------\n\n public getRoutings(): Observable {\n return this.http.get(this.configsUrl + 'routes');\n }\n\n public getRouteById(id: string): Observable {\n const routeId = encodeURIComponent(id);\n return this.http.get(this.configsUrl + 'routes/' + routeId);\n }\n\n public getPatternData(pattern: string): Observable {\n let params = new HttpParams({ encoder: new CustomHttpParamEncoder() });\n params = params.append('pattern', pattern);\n return this.http\n .get(`${this.configsUrl}routes/data`, {\n params,\n })\n .pipe(pluck('data')) as Observable;\n }\n\n public createRouting(\n destination: string,\n routeInfo: { info: GeneralRouteInfo; output: string },\n ): Observable {\n let params = new HttpParams({ encoder: new CustomHttpParamEncoder() });\n params = params.append('destination', destination);\n\n return this.http.post(this.configsUrl + 'routes', routeInfo, {\n params,\n });\n }\n\n public updateRouting(\n routeId: string,\n destination: string,\n routeInfo: { info: GeneralRouteInfo; output: string },\n ) {\n const encodedId = encodeURIComponent(routeId);\n let params = new HttpParams({ encoder: new CustomHttpParamEncoder() });\n params = params.append('destination', destination);\n\n return this.http.put(`${this.configsUrl}routes/${encodedId}`, routeInfo, {\n params,\n });\n }\n\n public changeRouteActiveState(\n routeId: string,\n state: boolean,\n ): Observable {\n const encodedId = encodeURIComponent(routeId);\n let params = new HttpParams({ encoder: new CustomHttpParamEncoder() });\n params = params.append('active', state.toString());\n\n return this.http.put(\n `${this.configsUrl}routes/${encodedId}`,\n undefined,\n {\n params,\n },\n );\n }\n\n public deleteRouting(routeId: string): Observable {\n const encodedId = encodeURIComponent(routeId);\n return this.http.delete(this.configsUrl + 'routes/' + encodedId);\n }\n\n public updateLockRouting(\n routeId: string,\n is_locked: boolean,\n ): Observable {\n const encodedId = encodeURIComponent(routeId);\n return this.http.post(`${this.configsUrl}routes/${encodedId}/lock`, {\n is_locked,\n });\n }\n\n //---------------------------------------------------------------------------\n // Sites\n //---------------------------------------------------------------------------\n\n public getSites(): Observable {\n return this.http.get(this.configsUrl + 'sites');\n }\n\n public getSite(siteId: string): Observable {\n return this.http.get(this.configsUrl + 'sites/' + siteId);\n }\n\n public createSite(site: CreateSiteDTO): Observable {\n return this.http.post(this.configsUrl + 'sites', site);\n }\n\n public updateSite(code: string, site: CreateSiteDTO): Observable {\n return this.http.put(this.configsUrl + 'sites/' + code, site);\n }\n\n public updateSiteAlert(\n siteId: string,\n notificationConfig: SiteNotificationConfig,\n ): Observable {\n return this.http.put(\n this.configsUrl + `sites/${siteId}/alert`,\n notificationConfig,\n );\n }\n\n //---------------------------------------------------------------------------\n // Sources\n //---------------------------------------------------------------------------\n\n public getSources(): Observable {\n return this.http\n .get>(`${this.configsUrl}sources`)\n .pipe(map((result) => result.items));\n }\n\n //---------------------------------------------------------------------------\n // Users\n //---------------------------------------------------------------------------\n\n public getUsers(): Observable<{ items: User[]; total: number }> {\n return this.http.get<{ items: User[]; total: number }>(\n `${this.configsUrl}users`,\n );\n }\n\n public createUser(userInfo: UserInfo): Observable {\n return this.http.post(`${this.configsUrl}users`, userInfo);\n }\n\n public updateUser(userInfo: UserInfo): Observable {\n const encodedMail = encodeURIComponent(userInfo.email);\n return this.http.put(\n `${this.configsUrl}users/${encodedMail}`,\n userInfo,\n );\n }\n\n public updateUserAlarm(\n id: string,\n alarm: UserAlertInfo,\n siteId: string,\n ): Observable {\n let params = new HttpParams({ encoder: new CustomHttpParamEncoder() });\n params = params.append('siteId', siteId);\n return this.http.put(`${this.configsUrl}users/${id}/alerts`, alarm, {\n params,\n });\n }\n\n public deleteUser(email: string): Observable {\n const encodedMail = encodeURIComponent(email);\n return this.http.delete(`${this.configsUrl}users/${encodedMail}`);\n }\n\n //---------------------------------------------------------------------------\n // MES Dead letter queue\n //---------------------------------------------------------------------------\n\n public mesDeadLetterQueueGetApproximateNumberOfMessages(): Observable {\n return this.http.get(`${this.configsUrl}mes/dlq/count`);\n }\n\n public mesDeadLetterQueuePollMessages(): Observable<\n MesMessageDto[] | undefined\n > {\n return this.http.get(\n `${this.configsUrl}mes/dlq/messages`,\n );\n }\n\n public mesDeadLetterQueueRedrive(): Observable {\n return this.http.post(\n `${this.configsUrl}mes/dlq/redrive`,\n undefined,\n {\n responseType: 'text' as 'json',\n },\n );\n }\n\n public mesDeadLetterQueueGetLastRedriveTask(): Observable<\n RedriveTaskDto | undefined\n > {\n return this.http.get(\n `${this.configsUrl}mes/dlq/redrive`,\n );\n }\n}\n","import { Injectable } from '@angular/core';\nimport { Router } from '@angular/router';\nimport { Observable } from 'rxjs';\nimport { map, switchMap, tap } from 'rxjs/operators';\nimport {\n GeneralRouteInfo,\n Interface,\n RouteDto,\n} from 'src/models/data-routing.models';\nimport { CreateSiteDTO } from 'src/models/site.models';\nimport { Organization } from './../../../../models/organization.models';\n\nimport { DevicesService } from './../../http/devices.service';\nimport { DataStoreService } from './data-store.service';\n\nimport { MatSnackBar } from '@angular/material/snack-bar';\nimport { Country } from 'src/models/countries.models';\nimport {\n Brand,\n DecoderBlueprint,\n DeviceTypeDTO,\n DeviceTypeInfo,\n Source,\n} from 'src/models/device-type.models';\nimport {\n BrandInfo,\n DeviceAlarm,\n DeviceDto,\n DeviceFilter,\n DeviceMonitoringStats,\n DevicePictureInfo,\n DeviceUpdateInfo,\n Downlink,\n SiteNotificationConfig,\n} from 'src/models/device.models';\nimport { Gateway, RssiHistoryData } from 'src/models/gateway.models';\nimport { Site } from 'src/models/site.models';\nimport { User, UserAlertInfo, UserInfo } from 'src/models/user.models';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class DataLoaderService {\n constructor(\n private http: DevicesService,\n private data: DataStoreService,\n private router: Router,\n private snackBar: MatSnackBar,\n ) {}\n\n //---------------------------------------------------------------------------\n // Brands\n //---------------------------------------------------------------------------\n\n public loadBrands(): Observable {\n return this.http.getBrands().pipe(\n tap((brands) => {\n this.data.setBrands(brands);\n }),\n );\n }\n\n public createBrand(brand: BrandInfo): Observable {\n return this.http.createBrand(brand).pipe(\n tap((brand) => {\n this.data.addBrand(brand);\n }),\n tap(() => {\n this.snackBar.open('Brand was successfully created!', 'Close');\n }),\n );\n }\n\n public updateBrand(brandId: string, brand: BrandInfo): Observable {\n return this.http.updateBrand(brandId, brand).pipe(\n tap((brand) => {\n this.data.updateBrand(brand);\n }),\n tap(() => {\n this.snackBar.open('Brand was successfully updated!', 'Close');\n }),\n );\n }\n\n public deleteBrand(brandId: string): Observable {\n return this.http.deleteBrand(brandId).pipe(\n tap(() => this.data.deleteBrand(brandId)),\n tap(() => {\n this.snackBar.open('Brand was successfully deleted!', 'Close');\n }),\n );\n }\n\n //---------------------------------------------------------------------------\n // Codecs\n //---------------------------------------------------------------------------\n\n public loadCodecs(): Observable {\n return this.http.getCodecList().pipe(\n tap((codecs) => {\n this.data.setCodecs(codecs);\n }),\n );\n }\n\n //---------------------------------------------------------------------------\n // Countries\n //---------------------------------------------------------------------------\n\n public loadCountries(): Observable {\n return this.http\n .getCountries()\n .pipe(tap((countries) => this.data.setCountries(countries)));\n }\n\n //---------------------------------------------------------------------------\n // Devices\n //---------------------------------------------------------------------------\n\n public loadDevices(filter?: {\n [key: string]: string | null;\n }): Observable {\n return this.http.getDevices(filter).pipe(\n tap((devices) => {\n this.data.setDevices(devices);\n if (filter && Object.values(filter).every((v) => v === '')) {\n this.data.setAllDevices(devices);\n }\n }),\n );\n }\n\n public loadDevicesFromLocalData(filter: DeviceFilter): void {\n const devices = this.getDevicesByFilters(filter);\n if (devices) {\n this.data.setDevices(devices);\n }\n }\n\n private getDevicesByFilters(filter: DeviceFilter): DeviceDto[] | undefined {\n let devices = this.data.allDevices;\n if (devices) {\n if (filter.project_id) {\n devices = devices.filter(\n (deviceDto) =>\n deviceDto.tags\n .map((tag) => tag.tag_id)\n .indexOf(filter.project_id as string) > -1,\n );\n }\n\n if (filter.brand_name) {\n devices = devices.filter(\n (deviceDto) => deviceDto.deviceType.brand.name === filter.brand_name,\n );\n }\n\n if (filter.device_type_id) {\n devices = devices.filter(\n (deviceDto) => deviceDto.deviceType.code === filter.device_type_id,\n );\n }\n\n if (filter.source) {\n devices = devices.filter(\n (deviceDto) => deviceDto.deviceType.source.code === filter.source,\n );\n }\n if (filter.status) {\n devices = devices.filter((deviceDto) =>\n this.checkStatus(deviceDto, filter.status),\n );\n }\n }\n return devices;\n }\n\n private checkStatus(deviceDto: DeviceDto, status: string): boolean | null {\n let condition: boolean | null = false;\n\n switch (status) {\n case '':\n condition = true;\n break;\n case '1':\n condition =\n !deviceDto?.statistics?.low_battery &&\n !deviceDto?.statistics?.last_uplink_error &&\n !!deviceDto?.statistics?.last_uplink;\n break;\n case '2':\n condition =\n deviceDto?.statistics?.low_battery &&\n !deviceDto?.statistics?.last_uplink_error &&\n !!deviceDto?.statistics?.last_uplink;\n break;\n case '3':\n condition =\n deviceDto?.statistics?.last_uplink_error &&\n !deviceDto?.statistics?.low_battery &&\n !!deviceDto?.statistics?.last_uplink;\n break;\n case '4':\n condition =\n deviceDto?.statistics?.low_battery &&\n deviceDto?.statistics?.last_uplink_error &&\n !!deviceDto?.statistics?.last_uplink;\n break;\n case '5':\n condition = !deviceDto?.statistics?.last_uplink;\n }\n return condition;\n }\n\n public updateDevice(deviceInfo: DeviceUpdateInfo): Observable {\n return this.http.updateDevice(deviceInfo).pipe(\n switchMap(() => this.loadDevices()),\n map(\n (devices) =>\n devices.find(\n (dev) => dev.device_id === deviceInfo.device_id,\n ) as DeviceDto,\n ),\n );\n }\n\n public updateDevicePicture(\n deviceId: string,\n devicePicture: DevicePictureInfo,\n ): Observable {\n return this.http\n .updateDevicePicture(deviceId, devicePicture)\n .pipe(map((device) => device));\n }\n\n public updateDeviceAlarm(\n deviceId: string,\n alarmInfo: DeviceAlarm,\n ): Observable {\n return this.http.updateDeviceAlarm(deviceId, alarmInfo);\n }\n\n //---------------------------------------------------------------------------\n // DeviceMonitoringStats\n //---------------------------------------------------------------------------\n\n public loadDeviceMonitoringStats(filter: {\n [key: string]: string | null;\n }): Observable {\n return this.http\n .getMonitoringStats(filter)\n .pipe(tap((stats) => this.data.setDeviceMonitoring(stats)));\n }\n\n public loadDeviceMonitoringStatsFromLocal(filter: DeviceFilter): void {\n const devicesList = this.getDevicesByFilters(filter);\n if (devicesList) {\n const devicesNumber = devicesList.length;\n let devicesWithLowBattery = 0;\n let devicesWithLastUplinkError = 0;\n let devicesWithLowBatteryLastUplinkError = 0;\n let devicesWithNoMessageYet = 0;\n for (let i = 0; i < devicesNumber; ++i) {\n if (!devicesList[i].statistics.last_uplink) {\n devicesWithNoMessageYet++;\n continue;\n }\n if (\n devicesList[i].statistics.low_battery &&\n devicesList[i].statistics.last_uplink_error\n ) {\n devicesWithLowBatteryLastUplinkError++;\n }\n if (\n devicesList[i].statistics.low_battery &&\n !devicesList[i].statistics.last_uplink_error\n ) {\n devicesWithLowBattery++;\n }\n if (\n !devicesList[i].statistics.low_battery &&\n devicesList[i].statistics.last_uplink_error\n ) {\n devicesWithLastUplinkError++;\n }\n }\n const devicesWithNoWarning =\n devicesNumber -\n (devicesWithLowBattery +\n devicesWithLastUplinkError +\n devicesWithLowBatteryLastUplinkError +\n devicesWithNoMessageYet);\n\n this.data.setDeviceMonitoring({\n devices: devicesNumber,\n devices_with_no_warning: devicesWithNoWarning,\n devices_with_last_uplink_error: devicesWithLastUplinkError,\n devices_with_low_battery: devicesWithLowBattery,\n devices_with_low_battery_last_uplink_error:\n devicesWithLowBatteryLastUplinkError,\n devices_with_no_message_yet: devicesWithNoMessageYet,\n });\n }\n }\n\n //---------------------------------------------------------------------------\n // DeviceTypes\n //---------------------------------------------------------------------------\n\n public loadDeviceTypes(): Observable {\n return this.http.getDeviceTypes().pipe(\n tap((deviceTypes) => {\n this.data.setDeviceTypes(deviceTypes);\n }),\n );\n }\n\n public createDeviceType(\n deviceTypeInfo: DeviceTypeInfo,\n ): Observable {\n return this.http\n .createDeviceType(deviceTypeInfo)\n .pipe(tap((newType) => this.data.addDeviceType(newType)));\n }\n\n public updateDeviceType(\n id: string,\n deviceTypeInfo: DeviceTypeInfo,\n ): Observable {\n return this.http\n .updateDeviceType(id, deviceTypeInfo)\n .pipe(tap((newType) => this.data.updateDeviceType(newType)));\n }\n\n public updateDeviceTypeCodec(\n id: string,\n decodingInfo: DecoderBlueprint,\n ): Observable {\n return this.http\n .updateDeviceTypeCodec(id, decodingInfo)\n .pipe(tap((newType) => this.data.updateDeviceType(newType)));\n }\n\n public changeDeviceTypeActiveState(\n typeId: string,\n enabled: boolean,\n ): Observable {\n return this.http.changeDeviceTypeActiveState(typeId, enabled).pipe(\n tap(() => this.data.changeDeviceTypeActiveState(typeId, enabled)),\n map(() => enabled),\n );\n }\n\n //---------------------------------------------------------------------------\n // Gateways\n //---------------------------------------------------------------------------\n\n public loadGateways(): Observable {\n return this.http.getGateways().pipe(tap((gw) => this.data.setGateways(gw)));\n }\n\n //---------------------------------------------------------------------------\n // GatewayRssi\n //---------------------------------------------------------------------------\n\n public loadGatewayRssi(gatewayId: string): Observable {\n return this.http\n .getGatewayRssi(gatewayId)\n .pipe(tap((rssi) => this.data.setGatewayRssi(gatewayId, rssi)));\n }\n\n //---------------------------------------------------------------------------\n // Interfaces\n //---------------------------------------------------------------------------\n\n public loadInterfaces(): Observable {\n return this.http\n .getRoutingInterfaces()\n .pipe(tap((interfaces) => this.data.setInterfaces(interfaces)));\n }\n\n public createInterface(interf: Interface): Observable {\n return this.http\n .createInterface(interf)\n .pipe(tap((created) => this.data.addInterface(created)));\n }\n\n public updateInterface(interf: Interface): Observable {\n return this.http.updateInterface(interf).pipe(\n tap((updated) => {\n this.data.updateInterface(updated);\n }),\n );\n }\n\n //---------------------------------------------------------------------------\n // Organizations\n //---------------------------------------------------------------------------\n\n public loadOrganizations(): Observable {\n return this.http\n .getOrganizations()\n .pipe(tap((countries) => this.data.setOrganizations(countries)));\n }\n\n //---------------------------------------------------------------------------\n // Routings\n //---------------------------------------------------------------------------\n\n public loadRoutings(): Observable {\n return this.http.getRoutings().pipe(\n tap((routings) => {\n this.data.setRoutings(routings);\n }),\n );\n }\n\n public loadRouting(id: string): Observable {\n return this.http.getRouteById(id).pipe(\n tap((routing) => {\n this.data.setRouting(routing);\n }),\n );\n }\n\n public createExportRoute(\n dest: string,\n routeInfo: { info: GeneralRouteInfo; output: string },\n ): void {\n this.http\n .createRouting(dest, routeInfo)\n .pipe(\n tap(() =>\n this.snackBar.open('Route was successfully created!', 'Close'),\n ),\n switchMap(() => this.loadRoutings()),\n )\n .subscribe(() => {\n this.router.navigateByUrl(`/home/routing`);\n });\n }\n\n public updateExportRoute(\n routeID: string,\n dest: string,\n routeInfo: { info: GeneralRouteInfo; output: string },\n ): void {\n this.http\n .updateRouting(routeID, dest, routeInfo)\n .pipe(\n tap(() =>\n this.snackBar.open('Route was successfully updated!', 'Close'),\n ),\n switchMap(() => this.loadRoutings()),\n )\n .subscribe(() => {\n this.router.navigateByUrl(`/home/routing`);\n });\n }\n\n public changeRouteActiveState(\n routeId: string,\n state: boolean,\n ): Observable {\n return this.http.changeRouteActiveState(routeId, state).pipe(\n tap(() =>\n this.snackBar.open('Route state was successfully updated!', 'Close'),\n ),\n switchMap(() => this.http.getRouteById(routeId)),\n tap((route) => this.data.updateRoute(routeId, route)),\n );\n }\n\n public updateLockRouting(\n routeId: string,\n is_locked: boolean,\n ): Observable {\n const lockedText = is_locked ? 'locked' : 'unlocked';\n return this.http.updateLockRouting(routeId, is_locked).pipe(\n tap(() =>\n this.snackBar.open(`Route was successfully ${lockedText}!`, 'Close'),\n ),\n switchMap(() => this.http.getRouteById(routeId)),\n tap((route) => this.data.updateRoute(routeId, route)),\n );\n }\n\n //---------------------------------------------------------------------------\n // Sites\n //---------------------------------------------------------------------------\n\n public loadSites(): Observable {\n return this.http.getSites().pipe(map((sites) => this.data.setSites(sites)));\n }\n\n public createSite(site: CreateSiteDTO): Observable {\n return this.http.createSite(site).pipe(\n tap((s) => {\n this.data.addSite(s);\n }),\n );\n }\n\n public updateSite(code: string, site: CreateSiteDTO): Observable {\n return this.http.updateSite(code, site).pipe(\n tap((update) => {\n this.data.updateSite(update);\n }),\n );\n }\n\n public updateSiteAlert(\n site: string,\n alertConfig: SiteNotificationConfig,\n ): Observable {\n return this.http.updateSiteAlert(site, alertConfig).pipe(\n switchMap(() => this.loadSites()),\n tap(() => {\n this.snackBar.open('Site alert was successfully edited!', 'Close');\n }),\n );\n }\n\n //---------------------------------------------------------------------------\n // Sources\n //---------------------------------------------------------------------------\n\n public loadSources(): Observable {\n return this.http\n .getSources()\n .pipe(tap((sources) => this.data.setSources(sources)));\n }\n\n //---------------------------------------------------------------------------\n // Users\n //---------------------------------------------------------------------------\n\n public loadUsers(): Observable<{ items: User[]; total: number }> {\n return this.http.getUsers().pipe(\n tap((users) => {\n this.data.setUsers(users.items);\n }),\n );\n }\n\n public createUser(userInfo: UserInfo): Observable {\n return this.http.createUser(userInfo).pipe(\n tap((user) => this.data.addUser(user)),\n tap(() => {\n this.snackBar.open('User was successfully created!', 'Close');\n }),\n );\n }\n\n public updateUser(userInfo: UserInfo): Observable {\n return this.http.updateUser(userInfo).pipe(\n tap((user) => this.data.updateUser(user)),\n tap(() => {\n this.snackBar.open('User was successfully edited!', 'Close');\n }),\n );\n }\n\n public updateUserAlert(\n id: string,\n alert: UserAlertInfo,\n site: string,\n ): Observable {\n return this.http.updateUserAlarm(id, alert, site).pipe(\n tap((user) => this.data.updateUser(user)),\n tap(() => {\n this.snackBar.open('User was successfully edited!', 'Close');\n }),\n );\n }\n\n public deleteUser(email: string): Observable {\n return this.http.deleteUser(email).pipe(\n tap(() => this.data.deleteUser(email)),\n tap(() => {\n this.snackBar.open('User was successfully deleted!', 'Close');\n }),\n );\n }\n\n //---------------------------------------------------------------------------\n // Downlinks\n //---------------------------------------------------------------------------\n\n public loadDeviceDownlinks(deviceId: string): Observable {\n return this.http.getDeviceDownlinks(deviceId).pipe(\n map((downlinks) => downlinks.sort((a, b) => b.timestamp - a.timestamp)),\n tap((downlinks) => {\n this.data.setDeviceDownlinks(downlinks);\n }),\n );\n }\n}\n","import { HttpClient } from '@angular/common/http';\nimport { Injectable } from '@angular/core';\nimport { Observable } from 'rxjs';\nimport { environment } from '../../../environments/environment';\nimport { Gateway } from '../../../models/gateway.models';\nimport { Paginated } from '../../../models/pagination.models';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class GatewaysService {\n constructor(private readonly http: HttpClient) {}\n\n getList(query: GetGatewaysQuery): Observable> {\n const params = Object.fromEntries(\n Object.entries(query)\n // remove empty or undefined filters\n .filter(([, value]) => value !== undefined && value !== null)\n // transform the date into a string\n .map(([key, value]) =>\n key === 'lastCheckinAfter'\n ? [key, (value as Date).toISOString()]\n : [key, value as string | number],\n ),\n );\n return this.http.get>(\n `${environment.apiUrlConfigs}gateways`,\n { params },\n );\n }\n}\n\nexport type GetGatewaysQuery = {\n offset?: number;\n limit?: number;\n siteId?: string;\n lastCheckinAfter?: Date;\n};\n","import { AfterViewInit, Component, Input, OnDestroy } from '@angular/core';\nimport {\n icon,\n latLng,\n latLngBounds,\n map,\n marker,\n markerClusterGroup,\n tileLayer,\n} from 'leaflet';\nimport 'leaflet.markercluster';\nimport { environment } from 'src/environments/environment';\nimport { DeviceDto } from 'src/models/device.models';\n\nconst mapOptions = {\n layers: [\n tileLayer(environment.openStreetMap.layerTilesUrl, {\n maxZoom: 19,\n attribution: environment.openStreetMap.attribution,\n }),\n ],\n};\n\n@Component({\n selector: 'app-display-position-map',\n templateUrl: './display-position-map.component.html',\n styleUrls: ['./display-position-map.component.scss'],\n})\nexport class DisplayPositionMapComponent implements AfterViewInit, OnDestroy {\n @Input() set devices(dev: DeviceDto[]) {\n this.bounds = this.mapDevicesToBounds(dev);\n this.map\n ? this.updateMap(dev)\n : (this.markerLayer = this.mapDevicesToMarkerLayer(dev));\n }\n public mapContainerId = Date.now().toString();\n private map: L.Map;\n private markerLayer: L.LayerGroup = markerClusterGroup();\n private bounds: L.LatLngBounds;\n\n ngAfterViewInit() {\n if (document.getElementById(this.mapContainerId)) {\n this.map = map(this.mapContainerId, mapOptions);\n this.markerLayer.addTo(this.map);\n this.map.fitBounds(this.bounds);\n }\n }\n\n private updateMap(devices: DeviceDto[]): void {\n this.map.removeLayer(this.markerLayer);\n this.markerLayer = this.mapDevicesToMarkerLayer(devices).addTo(this.map);\n this.map.fitBounds(this.bounds);\n }\n\n private mapDevicesToMarkerLayer(devices: DeviceDto[]): L.LayerGroup {\n const cluster = markerClusterGroup({ showCoverageOnHover: false });\n devices\n .filter((device) => device.metadata.lat && device.metadata.lng)\n .map((device) =>\n marker(latLng(device.metadata.lat, device.metadata.lng), {\n icon: icon({\n iconSize: [25, 41],\n iconAnchor: [13, 41],\n iconUrl: 'assets/img/marker-icon.png',\n shadowUrl: 'assets/img/marker-shadow.png',\n }),\n }).bindTooltip(`${device.metadata.name}`),\n )\n .forEach((mkr) => cluster.addLayer(mkr));\n return cluster;\n }\n\n private mapDevicesToBounds(devices: DeviceDto[]): L.LatLngBounds {\n const coords = devices\n .filter((device) => device.metadata.lat && device.metadata.lng)\n .map((device) => latLng(device.metadata.lat, device.metadata.lng));\n return coords.length === 0\n ? latLngBounds([\n [\n environment.openStreetMap.defaultMapCenter.lat,\n environment.openStreetMap.defaultMapCenter.lng,\n ],\n ])\n : latLngBounds(coords);\n }\n\n ngOnDestroy() {\n if (this.map) {\n this.map.remove();\n }\n }\n}\n","
\n","import { Component, Input } from '@angular/core';\n\n@Component({\n selector: 'app-loader',\n templateUrl: './loader.component.html',\n styleUrls: ['./loader.component.scss'],\n})\nexport class LoaderComponent {\n @Input() diameter: number = 40;\n\n color = 'primary';\n mode = 'indeterminate';\n value = 50;\n}\n","\n\n","import {\n ChangeDetectorRef,\n ComponentFactoryResolver,\n Directive,\n Input,\n OnChanges,\n OnDestroy,\n TemplateRef,\n ViewContainerRef,\n} from '@angular/core';\nimport { Observable, Subscription } from 'rxjs';\nimport { filter, first } from 'rxjs/operators';\nimport { LoaderComponent } from '../../components/loader/loader.component';\n\n@Directive({\n selector: '[appLoader]',\n})\nexport class LoaderDirective implements OnChanges, OnDestroy {\n @Input() appLoaderOn: Observable | unknown;\n @Input() appLoader: Observable | unknown;\n\n @Input() appLoaderWith?: (v: unknown) => boolean;\n\n sub: Subscription;\n\n constructor(\n private viewRef: ViewContainerRef,\n private tplRef: TemplateRef<{ $implicit: unknown }>,\n private factory: ComponentFactoryResolver,\n private cdRef: ChangeDetectorRef,\n ) {\n this.viewRef.clear();\n }\n\n ngOnChanges() {\n const condition = this.appLoaderOn ?? this.appLoader;\n this._createLoaderTemplate();\n\n this.sub?.unsubscribe();\n\n if (condition instanceof Observable)\n this.sub = condition\n .pipe(\n filter((v) => (this.appLoaderWith ? this.appLoaderWith(v) : !!v)),\n first(),\n )\n .subscribe((v) => this._createViewTemplate(v));\n else if (condition) this._createViewTemplate(condition);\n else this._createLoaderTemplate();\n }\n\n private _createViewTemplate(v: unknown) {\n this.viewRef.clear();\n const ref = this.viewRef.createEmbeddedView(this.tplRef);\n ref.context.$implicit = v;\n this.cdRef.markForCheck();\n }\n\n private _createLoaderTemplate() {\n this.viewRef.clear();\n const component = this.factory.resolveComponentFactory(LoaderComponent);\n this.viewRef.createComponent(component);\n this.cdRef.markForCheck();\n }\n\n ngOnDestroy() {\n this.sub?.unsubscribe();\n }\n}\n","\n \n \n Name\n \n \n {{ device?.metadata?.name }}\n \n \n \n Status\n \n fiber_manual_record\n fiber_manual_record\n fiber_manual_record\n fiber_manual_record\n fiber_manual_record\n \n \n \n \n Site\n \n \n {{ siteLongName(device) }}\n \n \n \n \n Last Uplink\n \n \n \n {{ device?.statistics?.last_uplink | date: 'yyyy-MM-ddTHH:mm:ssZZZZZ' }}\n \n Unknown \n \n \n \n \n Battery\n \n \n \n power\n \n \n \n battery_saver\n \n\n \n \n battery_alert\n \n \n battery_full\n \n \n battery_unknown\n \n \n \n \n \n \n Routings\n \n \n \n \n \n \n \n \n Info\n \n \n \n \n \n \n \n\n \n \n\n","import {\n animate,\n state,\n style,\n transition,\n trigger,\n} from '@angular/animations';\nimport { AfterViewInit, Component, Input, ViewChild } from '@angular/core';\nimport { MatSort } from '@angular/material/sort';\nimport { MatTableDataSource } from '@angular/material/table';\nimport { Router } from '@angular/router';\nimport { InterfaceStateService } from 'src/app/services/state/interface/interface-store.service';\nimport { DeviceDto } from 'src/models/device.models';\n\n@Component({\n selector: 'app-device-list',\n templateUrl: './device-list.component.html',\n styleUrls: ['./device-list.component.scss'],\n animations: [\n trigger('detailExpand', [\n state('collapsed', style({ height: '0px', minHeight: '0' })),\n state('expanded', style({ height: '*' })),\n transition(\n 'expanded <=> collapsed',\n animate('225ms cubic-bezier(0.4, 0.0, 0.2, 1)'),\n ),\n ]),\n ],\n})\nexport class DeviceListComponent implements AfterViewInit {\n @Input() set devices(dev: DeviceDto[]) {\n this.dataSource = new MatTableDataSource(dev);\n this.initializeSort();\n }\n public datas: { deviceId: string }[] = [];\n public screensizeIndex$ = this.interfaceState.breakpointIndex$;\n public dataSource = new MatTableDataSource();\n public displayedColumns: string[] = [\n 'status',\n 'site',\n 'name',\n 'last_uplink',\n 'battery',\n 'routings',\n 'info',\n ];\n\n constructor(\n private router: Router,\n private interfaceState: InterfaceStateService,\n ) {}\n\n @ViewChild(MatSort) sort: MatSort;\n\n ngAfterViewInit() {\n this.initializeSort();\n }\n\n private siteLongName(item: DeviceDto) {\n return `${item.site?.metadata.iso_code} - ${item.site?.metadata.site_long_name}`;\n }\n\n public onShowDetails(device: DeviceDto): void {\n this.router.navigateByUrl(`/home/device/details/${device.device_id}`);\n }\n\n public onShowRoutings(device: DeviceDto): void {\n this.interfaceState.setRoutingFilter(\n this.interfaceState.buildRoutingFilter(device.device_id),\n );\n this.router.navigateByUrl(`/home/routing`);\n }\n\n public initializeSort() {\n this.dataSource.sortingDataAccessor = (item, property) => {\n switch (property) {\n case 'site':\n return this.siteLongName(item).toLowerCase();\n case 'last_uplink':\n return item.statistics?.last_uplink\n ? new Date(item.statistics.last_uplink).getTime()\n : undefined;\n case 'name':\n return item.metadata?.name.toLowerCase();\n default:\n return item[property];\n }\n };\n this.dataSource.sort = this.sort;\n }\n}\n","import { Component, Input } from '@angular/core';\nimport Chart from 'chart.js';\nimport { DeviceMonitoringStats } from 'src/models/device.models';\n\n@Component({\n selector: 'app-device-status-chart',\n templateUrl: './device-status-chart.component.html',\n styleUrls: ['./device-status-chart.component.scss'],\n})\nexport class DeviceStatusChartComponent {\n @Input() set statistics(stats: DeviceMonitoringStats) {\n if (stats) {\n this.formatGraphData(stats);\n }\n }\n public chart: Chart;\n public colors = [\n { name: 'Battery and Connection', value: '#f44336' },\n { name: 'No Warning', value: '#4caf50' },\n { name: 'Battery', value: '#ff9800' },\n { name: 'Connection', value: '#FDD835' },\n { name: 'Unknown', value: '#cfcfcf' },\n ];\n\n constructor() {}\n\n formatGraphData(stats: DeviceMonitoringStats) {\n const data = {\n datasets: [\n {\n data: [\n stats.devices_with_no_warning,\n stats.devices_with_last_uplink_error,\n stats.devices_with_low_battery,\n stats.devices_with_low_battery_last_uplink_error,\n stats.devices_with_no_message_yet,\n ],\n backgroundColor: [\n '#4caf50',\n '#ff9800',\n '#FDD835',\n '#f44336',\n '#cfcfcf',\n ],\n },\n ],\n };\n\n const options = {\n responsive: true,\n aspectRatio: 1.2,\n tooltips: { enabled: false },\n animation: false,\n showTooltips: false,\n };\n\n Object.keys(Chart.instances).forEach((key) => {\n const loInst = Chart.instances[key];\n if (loInst.canvas.id === 'chart') {\n loInst.destroy();\n }\n });\n\n this.chart = new Chart(document.getElementById('chart'), {\n type: 'doughnut',\n data: data,\n options: options,\n });\n }\n}\n","\n","import { Component, Input } from '@angular/core';\nimport Chart from 'chart.js';\nimport { GatewayStats } from 'src/models/gateway.models';\n\n@Component({\n selector: 'app-gateway-status-chart',\n templateUrl: './gateway-status-chart.component.html',\n styleUrls: ['./gateway-status-chart.component.scss'],\n})\nexport class GatewayStatusChartComponent {\n @Input() set statistics(stats: GatewayStats) {\n if (stats) this.formatGraphData(stats);\n }\n public chart: Chart;\n\n constructor() {}\n\n formatGraphData(stats: GatewayStats) {\n const data = {\n datasets: [\n {\n data: [stats.active | 0, stats.inactive | 0],\n backgroundColor: ['#4caf50', '#f44336'],\n },\n ],\n };\n\n const options = {\n responsive: true,\n aspectRatio: 1.2,\n tooltips: { enabled: false },\n animation: false,\n showTooltips: false,\n };\n\n Object.keys(Chart.instances).forEach((key) => {\n const loInst = Chart.instances[key];\n if (loInst.canvas.id === 'gwchart') {\n loInst.destroy();\n }\n });\n\n this.chart = new Chart(document.getElementById('gwchart'), {\n type: 'doughnut',\n data: data,\n options: options,\n });\n }\n\n isEqualAndEven(a: number, b: number) {\n return a === b && a % 2 === 0;\n }\n\n formatDisplayedCount(a: number, b: number) {\n const equalAndEven = this.isEqualAndEven(a, b);\n return [equalAndEven ? a - 1 : a | 1, equalAndEven ? b - 1 : b];\n }\n}\n","\n","
\n
= 2\">\n \n
\n\n \n \n Filter \n \n \n \n
\n
\n

Devices

\n
\n
\n fiber_manual_record\n

No Warning

\n

\n {{ stats.devices_with_no_warning }}\n

\n
\n
\n fiber_manual_record\n

Low Battery

\n

\n {{ stats.devices_with_low_battery }}\n

\n
\n
\n fiber_manual_record\n

Connection Error

\n

\n {{ stats.devices_with_last_uplink_error }}\n

\n
\n
\n fiber_manual_record\n

Battery and Connection

\n

\n {{ stats.devices_with_low_battery_last_uplink_error }}\n

\n
\n
\n fiber_manual_record\n

Unknown

\n

\n {{ stats.devices_with_no_message_yet }}\n

\n
\n
\n
\n
\n
\n \n
\n
\n\n
\n \n \n
\n

Gateways

\n
\n
\n fiber_manual_record\n

Active

\n

{{ gwstats.active }}

\n
\n
\n fiber_manual_record\n

Inactive

\n

\n {{ gwstats.inactive }}\n

\n
\n
\n
\n
\n
\n \n
\n
\n \n \n
\n \n
\n
\n\n \n
\n \n Site\n \n All\n \n {{ site.country.isoCode }} -\n {{ site.name }}\n \n \n \n \n Brand\n \n All\n \n {{ brand.name }}\n \n \n \n \n Model\n \n All\n {{ model?.metadata?.label }}\n \n \n \n Source Platform\n \n All\n {{ source.name }}\n \n \n \n Status\n \n All\n No Warning\n Low Battery\n Connection Error\n Battery and Connection\n Unknown\n \n \n
= 2\">
\n \n
\n
\n\n \n \n
\n \n
\n
\n
\n \n
\n
\n\n","import { Component, OnInit, TemplateRef } from '@angular/core';\nimport { UntypedFormGroup } from '@angular/forms';\nimport { MatDialog } from '@angular/material/dialog';\nimport { UntilDestroy, untilDestroyed } from '@ngneat/until-destroy';\nimport { BehaviorSubject, combineLatest, merge, of, timer } from 'rxjs';\nimport { catchError, switchMap, tap } from 'rxjs/operators';\nimport { DataLoaderService } from 'src/app/services/state/data/data-loader.service';\nimport { DataStoreService } from 'src/app/services/state/data/data-store.service';\nimport { InterfaceStateService } from 'src/app/services/state/interface/interface-store.service';\nimport { GatewayStats } from '../../../../models/gateway.models';\nimport { GatewaysService } from '../../../services/http/gateways.service';\n\nconst GATEWAY_POLLING_TIME = 600000; // 10min\n\n@UntilDestroy()\n@Component({\n selector: 'app-dashboard',\n templateUrl: './dashboard.component.html',\n styleUrls: ['./dashboard.component.scss'],\n})\nexport class DashboardComponent implements OnInit {\n public screensizeIndex$ = this.interfaceState.breakpointIndex$;\n public monitoringStats$ = this.data.deviceMonitoring$;\n public displayedDevices$ = this.data.devices$;\n public models$ = this.data.deviceTypes$;\n public brands$ = this.data.brands$;\n public sites$ = this.data.sites$;\n public sources$ = this.data.sources$;\n public filterForm: UntypedFormGroup;\n\n private gatewayStats$ = new BehaviorSubject(\n undefined,\n );\n private isLoadingGateways$ = new BehaviorSubject(true);\n\n constructor(\n private data: DataStoreService,\n private dataLoader: DataLoaderService,\n private interfaceState: InterfaceStateService,\n private gatewaysService: GatewaysService,\n public dialog: MatDialog,\n ) {\n this._loadData();\n }\n\n ngOnInit() {\n this.filterForm = this.interfaceState.dashboardFilter;\n\n this.filterForm.valueChanges\n .pipe(\n untilDestroyed(this),\n tap(() => this.interfaceState.setDashboardFilter(this.filterForm)),\n )\n .subscribe((filter) => {\n this.dataLoader.loadDevicesFromLocalData(filter);\n this.dataLoader.loadDeviceMonitoringStatsFromLocal(filter);\n this.loadGatewaysStats();\n });\n\n timer(0, GATEWAY_POLLING_TIME)\n .pipe(untilDestroyed(this))\n .subscribe(() => {\n this.loadGatewaysStats();\n });\n }\n\n public openMap(templateRef: TemplateRef) {\n this.dialog.open(templateRef);\n }\n\n private _loadData() {\n if (this.interfaceState.dashboardFilter) {\n this.interfaceState.dashboardFilter.get('status')?.setValue('');\n }\n\n merge(\n this.dataLoader.loadDevices(this.interfaceState.dashboardFilter.value),\n this.dataLoader.loadDeviceMonitoringStats(\n this.interfaceState.dashboardFilter.value,\n ),\n this.data.deviceTypes$.pipe(\n untilDestroyed(this),\n switchMap((state) =>\n state ? of(state) : this.dataLoader.loadDeviceTypes(),\n ),\n catchError(() => of([])),\n ),\n this.data.brands$.pipe(\n switchMap((state) =>\n state ? of(state) : this.dataLoader.loadBrands(),\n ),\n catchError(() => of([])),\n ),\n this.data.sites$.pipe(\n switchMap((state) => (state ? of(state) : this.dataLoader.loadSites())),\n catchError(() => of([])),\n ),\n this.data.sources$.pipe(\n switchMap((state) =>\n state ? of(state) : this.dataLoader.loadSources(),\n ),\n catchError(() => of([])),\n ),\n ).subscribe();\n }\n\n private loadGatewaysStats() {\n this.isLoadingGateways$.next(true);\n combineLatest([\n this.gatewaysService.getList({\n limit: 0,\n siteId: this.filterForm.value.siteId || undefined,\n }),\n this.gatewaysService.getList({\n limit: 0,\n // 4 hours before now\n lastCheckinAfter: new Date(Date.now() - 14400000),\n siteId: this.filterForm.value.siteId || undefined,\n }),\n ]).subscribe(([responseAll, responseActive]) => {\n this.gatewayStats$.next({\n active: responseActive.total,\n inactive: responseAll.total - responseActive.total,\n });\n this.isLoadingGateways$.next(false);\n });\n }\n}\n","import { WizardStep } from 'src/models/app-routing.models';\nimport { DestinationType } from 'src/models/data-routing.models';\n\nexport interface SupportedDestination {\n label: string;\n id: DestinationType;\n}\n\nexport const routingCreationSteps: Pick[] = [\n { title: 'General Information' },\n { title: 'Data Selection' },\n { title: 'Routing Destination' },\n];\n\nexport const routingDestinationTypes: SupportedDestination[] = [\n { label: 'Google Sheet', id: 'sheet' },\n { label: 'MES', id: 'mes' },\n { label: 'Bigquery', id: 'bigquery' },\n];\n","

Create a new interface

\n

\n Edit interface: {{ interf?.metadata?.name ?? '' }}\n

\n
\n
\n
\n
\n \n Name\n \n \n
\n \n \n
\n \n Site\n \n \n {{ site.country.isoCode }} -\n {{ site.name }}\n \n \n \n \n clear\n \n
\n
\n
\n
\n \n add\n Add a site\n \n
\n
\n \n Destination\n \n \n {{ destination.label }}\n \n \n \n
\n
\n \n Topic\n \n \n
\n
\n
\n
\n
\n \n \n Confirm\n \n
\n","import { Component, Inject, OnInit } from '@angular/core';\nimport { FormArray, FormControl, FormGroup, Validators } from '@angular/forms';\nimport { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog';\nimport { MatSnackBar } from '@angular/material/snack-bar';\nimport { catchError, of, tap } from 'rxjs';\nimport { routingDestinationTypes } from 'src/app/pages/main/routing-list/routing-creation/routing-creation.config';\nimport { DataLoaderService } from 'src/app/services/state/data/data-loader.service';\nimport { DataStoreService } from 'src/app/services/state/data/data-store.service';\nimport { Interface } from 'src/models/data-routing.models';\n\n@Component({\n selector: 'app-interface-creation',\n templateUrl: './interface-creation.component.html',\n styleUrls: ['./interface-creation.component.scss'],\n})\nexport class InterfaceCreationComponent implements OnInit {\n form = this.buildForm;\n saving = false;\n routingDestinationTypes = routingDestinationTypes;\n sites$ = this.data.sites$;\n\n constructor(\n @Inject(MAT_DIALOG_DATA) public interf: Interface | undefined,\n private data: DataStoreService,\n private dataLoader: DataLoaderService,\n private snackBar: MatSnackBar,\n private dialogRef: MatDialogRef,\n ) {}\n\n ngOnInit(): void {\n if (this.interf) {\n this.prefillForm(this.interf);\n } else {\n this.addSite('');\n }\n }\n\n private get buildForm(): FormGroup {\n return new FormGroup({\n name: new FormControl('', Validators.required),\n siteIds: new FormArray([]),\n destination: new FormControl(\n {\n value: 'mes',\n disabled: !!this.interf,\n },\n Validators.required,\n ),\n topic: new FormControl(\n { value: '', disabled: !!this.interf },\n Validators.required,\n ),\n });\n }\n\n private prefillForm(interf: Interface): void {\n this.form.setValue({\n name: interf.name ?? '',\n destination: interf.destination.toLowerCase(),\n siteIds: [],\n topic: interf.topic,\n });\n\n for (const id of interf.siteIds) {\n this.addSite(id);\n }\n }\n\n get sites(): FormArray {\n return this.form.controls['siteIds'] as FormArray;\n }\n\n public siteAlreadySelected(id: string, index: number): boolean {\n const sites: string[] = this.form.value.siteIds;\n const ix = sites.indexOf(id);\n return ix >= 0 && ix !== index;\n }\n\n public addSite(siteId: string | null = ''): void {\n this.sites.push(\n new FormControl({ value: siteId, disabled: false }, Validators.required),\n );\n }\n\n public removeSite(index: number): void {\n this.sites.removeAt(index);\n }\n\n public get interfaceInfo(): Interface {\n return {\n id: this.interf?.id || '',\n name: this.form.value.name,\n topic: this.form.value.topic ?? this.interf?.topic,\n destination: this.form.value.destination ?? this.interf?.destination,\n dataFormat: 'message',\n interfaceConfig: {},\n siteIds: this.form.value.siteIds ?? this.interf?.siteIds,\n };\n }\n\n public async submit() {\n this.saving = true;\n if (!this.interf?.id) {\n this.dataLoader\n .createInterface(this.interfaceInfo)\n .pipe(\n tap(() => {\n this.snackBar.open('Interface was successfully created!', 'Close');\n this.dialogRef.close();\n }),\n catchError((error) => {\n this.saving = false;\n return of(error);\n }),\n )\n .subscribe();\n } else {\n this.dataLoader\n .updateInterface(this.interfaceInfo)\n .pipe(\n tap(() => {\n this.snackBar.open('Interface was successfully updated!', 'Close');\n this.dialogRef.close();\n }),\n catchError((error) => {\n this.saving = false;\n return of(error);\n }),\n )\n .subscribe();\n }\n }\n}\n","
\n
\n \n Name\n \n search\n \n \n Site\n \n All\n \n {{ site.country.isoCode }} -\n {{ site.name }}\n \n \n \n \n Destination\n \n All\n \n {{ routingDestinationType.label }}\n \n \n \n
\n
\n","import { Component, EventEmitter, Input, OnInit, Output } from '@angular/core';\nimport { UntypedFormControl, UntypedFormGroup } from '@angular/forms';\nimport { combineLatest, merge, of } from 'rxjs';\nimport { first, startWith, switchMap, tap } from 'rxjs/operators';\n\nimport { routingDestinationTypes } from 'src/app/pages/main/routing-list/routing-creation/routing-creation.config';\nimport { DataLoaderService } from 'src/app/services/state/data/data-loader.service';\nimport { DataStoreService } from 'src/app/services/state/data/data-store.service';\nimport { Interface } from 'src/models/data-routing.models';\n\n@Component({\n selector: 'app-interface-filter',\n templateUrl: './interface-filter.component.html',\n})\nexport class InterfaceFilterComponent implements OnInit {\n @Input() interfaces: Interface[];\n @Output() interfacesFiltered = new EventEmitter();\n form: UntypedFormGroup;\n\n sites$ = this.data.sites$;\n routingDestinationTypes = routingDestinationTypes;\n\n constructor(\n private data: DataStoreService,\n private dataLoader: DataLoaderService,\n ) {\n this.loadData();\n }\n\n ngOnInit(): void {\n this.form = this.buildFilterForm();\n this.handleInputs.subscribe();\n }\n\n private loadData() {\n combineLatest([\n this.data.sites$.pipe(\n switchMap((sites) => (sites ? of(sites) : this.dataLoader.loadSites())),\n ),\n ])\n .pipe(first())\n .subscribe();\n }\n\n private get handleInputs() {\n return merge(\n this.form.valueChanges,\n this.data.interfaces$.pipe(\n tap((interfaces) => {\n this.interfaces = interfaces ?? [];\n }),\n ),\n ).pipe(\n startWith(this.form.value),\n tap(() => {\n this.emitFilteredInterfaces();\n }),\n );\n }\n\n private emitFilteredInterfaces() {\n let result = this.interfaces;\n result = this.searchFilter(result);\n result = this.siteFilter(result);\n result = this.destinationFilter(result);\n\n this.interfacesFiltered.emit(result);\n }\n\n private searchFilter(interfaces: Interface[]): Interface[] {\n const keyword = this.form.value.search?.toLowerCase();\n return !keyword\n ? interfaces\n : interfaces.filter((interf) =>\n interf.name?.toLowerCase().includes(keyword),\n );\n }\n\n private siteFilter(interfaces: Interface[]): Interface[] {\n const keyword = this.form.value.site;\n return !keyword\n ? interfaces\n : interfaces.filter((interf) =>\n interf.siteIds.find((siteId) => siteId === keyword),\n );\n }\n\n private destinationFilter(interfaces: Interface[]): Interface[] {\n const keyword = this.form.value.destination?.toLowerCase();\n return !keyword\n ? interfaces\n : interfaces.filter(\n (interf) => interf.destination?.toLowerCase() === keyword,\n );\n }\n\n private buildFilterForm(): UntypedFormGroup {\n return new UntypedFormGroup({\n search: new UntypedFormControl(''),\n site: new UntypedFormControl(''),\n destination: new UntypedFormControl(''),\n });\n }\n}\n","
\n
\n
= 2\">\n \n
\n \n \n Filter \n \n \n \n
\n
\n
\n
\n
Name
\n
Sites
\n
Destination
\n
Topic id
\n
\n
\n
\n \n
{{ interf.name }}
\n
\n
\n {{ getSiteName(siteId) }}\n
\n
\n
\n {{ getDestinationName(interf.destination) }}\n
\n
{{ interf.topic }}
\n
\n
\n \n \n add\n \n\n \n \n \n\n","import { Component, OnInit } from '@angular/core';\nimport { MatDialog } from '@angular/material/dialog';\nimport { combineLatest } from 'rxjs';\nimport { of } from 'rxjs/internal/observable/of';\nimport { first, switchMap } from 'rxjs/operators';\nimport { InterfaceCreationComponent } from 'src/app/pages/main/interface-management/interface-creation/interface-creation.component';\nimport { routingDestinationTypes } from 'src/app/pages/main/routing-list/routing-creation/routing-creation.config';\nimport { DataStoreService } from 'src/app/services/state/data/data-store.service';\nimport { InterfaceStateService } from 'src/app/services/state/interface/interface-store.service';\nimport { Interface } from 'src/models/data-routing.models';\nimport { Site } from 'src/models/site.models';\nimport { AuthService } from '../../../services/state/auth/auth.service';\nimport { DataLoaderService } from '../../../services/state/data/data-loader.service';\n\n@Component({\n selector: 'app-interface-management',\n templateUrl: './interface-management.component.html',\n})\nexport class InterfaceManagementComponent implements OnInit {\n screensizeIndex$ = this.interfaceState.breakpointIndex$;\n filteredInterfaces$ = this.data.interfaces$;\n interfaces$ = this.data.interfaces$;\n sites$ = this.data.sites$;\n sites: Site[] = [];\n\n constructor(\n private data: DataStoreService,\n private interfaceState: InterfaceStateService,\n private dataLoader: DataLoaderService,\n public auth: AuthService,\n private dialog: MatDialog,\n ) {}\n\n ngOnInit(): void {\n combineLatest([\n this.data.interfaces$.pipe(\n switchMap((interfaces) =>\n interfaces ? of(interfaces) : this.dataLoader.loadInterfaces(),\n ),\n ),\n this.data.sites$.pipe(\n switchMap((sites) => (sites ? of(sites) : this.dataLoader.loadSites())),\n ),\n ])\n .pipe(first())\n .subscribe((data) => {\n this.sites = data[1];\n });\n }\n\n public updateFilteredInterfaces(interfaces: Interface[]): void {\n this.filteredInterfaces$ = of(\n interfaces.sort((a, b) => a.name?.localeCompare(b.name)),\n );\n }\n\n public editInterface(interf: Interface): void {\n this.dialog.open(InterfaceCreationComponent, { data: interf });\n }\n\n public createInterface() {\n this.dialog.open(InterfaceCreationComponent, {});\n }\n\n public getSiteName(siteId: string): string {\n const site = this.sites.find((site) => site.id === siteId);\n return site ? `${site.country.isoCode} - ${site.name}` : siteId;\n }\n\n public getDestinationName(destinationId: string): string {\n const routingDestinationType = routingDestinationTypes.find(\n (routingDestinationType) => routingDestinationType.id === destinationId,\n );\n return routingDestinationType?.label ?? destinationId;\n }\n}\n","import { Injectable } from '@angular/core';\nimport { Router } from '@angular/router';\nimport { Observable } from 'rxjs';\nimport { tap } from 'rxjs/operators';\nimport { AuthService } from './auth.service';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class AuthGuard {\n constructor(\n private auth: AuthService,\n private router: Router,\n ) {}\n\n canActivate(): Observable {\n return this.auth.isAuthorized$().pipe(\n tap((bool) => {\n if (!bool) {\n this.router.navigateByUrl('/unauthorized');\n this.auth.logout();\n }\n }),\n );\n }\n}\n","import { inject } from '@angular/core';\nimport { CanActivateFn, Router } from '@angular/router';\nimport { AuthService } from 'src/app/services/state/auth/auth.service';\n\nexport const techAdminGuard: CanActivateFn = () => {\n return (\n inject(AuthService).isTechnicalAdmin() ||\n inject(Router).createUrlTree(['/home'])\n );\n};\n","import { Component } from '@angular/core';\n\n@Component({\n selector: 'app-router-outlet',\n templateUrl: './router-outlet.component.html',\n styles: [],\n})\nexport class RouterOutletComponent {}\n","\n","import { Component } from '@angular/core';\nimport { AuthService } from 'src/app/services/state/auth/auth.service';\n\n@Component({\n selector: 'app-login',\n templateUrl: './login.component.html',\n styleUrls: ['./login.component.scss'],\n})\nexport class LoginComponent {\n constructor(private auth: AuthService) {}\n\n public login() {\n this.auth.login();\n }\n}\n","
\n
\n
\n
\n \"Solvay\n

IOT PLATFORM

\n \n
\n
\n","import { Injectable } from '@angular/core';\nimport { Router } from '@angular/router';\nimport { Observable } from 'rxjs';\nimport { tap } from 'rxjs/operators';\nimport { AuthService } from 'src/app/services/state/auth/auth.service';\n\n@Injectable()\nexport class LoginResolver {\n constructor(\n private auth: AuthService,\n private router: Router,\n ) {}\n\n resolve(): Observable {\n return this.auth.isAuthorized$().pipe(\n tap((isLogged) => {\n if (isLogged) {\n this.router.navigate(['home']);\n }\n }),\n );\n }\n}\n","import { Injectable } from '@angular/core';\nimport { UntypedFormControl, UntypedFormGroup } from '@angular/forms';\nimport { BehaviorSubject, Observable } from 'rxjs';\nimport { AuthService } from 'src/app/services/state/auth/auth.service';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class AlertingService {\n private readonly _selectedSite$ = new BehaviorSubject(this.siteValue);\n private readonly _userOpen$ = new BehaviorSubject(true);\n private readonly _devicesOpen$ = new BehaviorSubject(false);\n private readonly _deviceFilter$ = new BehaviorSubject(\n this.buildDeviceFilter(),\n );\n\n constructor(private auth: AuthService) {}\n\n private get siteValue(): string {\n return this.auth.userHasMultipleSiteAccess\n ? ''\n : this.auth.accessibleSites[0];\n }\n\n public setSelectedSite(site: string): void {\n this._selectedSite$.next(site);\n }\n\n public get selectedSite$(): Observable {\n return this._selectedSite$.asObservable();\n }\n\n public get selectedSite(): string {\n return this._selectedSite$.value;\n }\n\n public setUserOpen(state: boolean): void {\n this._userOpen$.next(state);\n }\n\n public get userOpen(): boolean {\n return this._userOpen$.value;\n }\n\n public setDevicesOpen(state: boolean): void {\n this._devicesOpen$.next(state);\n }\n\n public get devicesOpen(): boolean {\n return this._devicesOpen$.value;\n }\n\n public setDeviceFilter(filterForm: UntypedFormGroup) {\n this._deviceFilter$.next(filterForm);\n }\n\n public get deviceFilter$(): Observable {\n return this._deviceFilter$.asObservable();\n }\n\n public get deviceFilter(): UntypedFormGroup {\n return this._deviceFilter$.value;\n }\n\n public resetDeviceFilter(): void {\n this._deviceFilter$.next(this.buildDeviceFilter());\n }\n\n public buildDeviceFilter(\n brandName = '',\n source = '',\n deviceType = '',\n ): UntypedFormGroup {\n return new UntypedFormGroup({\n brand_name: new UntypedFormControl(brandName),\n source: new UntypedFormControl(source),\n device_type_id: new UntypedFormControl(deviceType),\n });\n }\n}\n","
\n
\n \n Alerts for site {{ siteSelection.value.split('_')[1] }}\n
\n\n \n \n Users \n \n
\n
\n
\n \n Search e-mail\n \n search\n \n
\n
\n
\n
Email
\n
Alerts
\n
\n
\n
\n
\n
{{ user.email }}
\n
\n \n
\n
\n
\n

No results for your search!

\n
\n
\n \n\n \n \n Devices \n \n\n
\n
\n \n
\n
\n
Name
\n
ID
\n
Battery Alerts
\n
Connection Alerts
\n
Connection Alert Delay
\n
\n
\n
\n
\n
{{ device.metadata?.name }}
\n
{{ device.device_id }}
\n
\n \n
\n
\n \n
\n
\n \n \n \n

h

\n
\n
\n
\n

\n No results for your search!\n

\n
\n
\n \n
\n\n\n
\n

Please select a site to continue!

\n \n
\n
\n\n\n \n Site\n \n \n {{ site.country.isoCode }} -\n {{ site.name }}\n \n \n \n\n\n\n \n \n Brand\n \n All\n \n {{ brand.name }}\n \n \n \n \n Model\n \n All\n {{ model?.metadata?.label }}\n \n \n \n Source Platform\n \n All\n {{ source.name }}\n \n \n \n\n","import { Component, OnInit } from '@angular/core';\nimport { UntypedFormControl, UntypedFormGroup } from '@angular/forms';\nimport { combineLatest, of } from 'rxjs';\nimport {\n catchError,\n first,\n map,\n startWith,\n switchMap,\n tap,\n} from 'rxjs/operators';\nimport { AuthService } from 'src/app/services/state/auth/auth.service';\nimport { DataLoaderService } from 'src/app/services/state/data/data-loader.service';\nimport { DataStoreService } from 'src/app/services/state/data/data-store.service';\nimport { DeviceAlarm, DeviceDto } from 'src/models/device.models';\nimport { Site } from 'src/models/site.models';\nimport { User } from 'src/models/user.models';\nimport { AlertingService } from './alerting.service';\n\n@Component({\n selector: 'app-alerting',\n templateUrl: './alerting.component.html',\n styleUrls: ['./alerting.component.scss'],\n})\nexport class AlertingComponent implements OnInit {\n public sites$ = this.data.sites$;\n public models$ = this.data.deviceTypes$;\n public brands$ = this.data.brands$;\n public sources$ = this.data.sources$;\n public siteSelection = new UntypedFormControl(this.alerting.selectedSite);\n public userEmailSearch = new UntypedFormControl('');\n public deviceFilterForm: UntypedFormGroup;\n public devices: DeviceDto[];\n public users: User[];\n\n constructor(\n private readonly data: DataStoreService,\n private readonly dataLoader: DataLoaderService,\n public alerting: AlertingService,\n private readonly auth: AuthService,\n ) {\n this._loadData();\n }\n\n ngOnInit(): void {\n combineLatest([\n this.data.devices$,\n this.data.users$,\n this.siteSelection.valueChanges.pipe(\n startWith(this.siteSelection.value),\n tap(() => this.resetFilters()),\n ),\n ])\n .pipe(\n tap(([, , site]) => {\n this.alerting.setSelectedSite(site);\n this.devices = this.getDevicesForSelectedSite();\n this.users = this.getUsersForSite(site);\n }),\n )\n .subscribe();\n\n this.deviceFilterForm = this.alerting.deviceFilter;\n\n this.deviceFilterForm.valueChanges\n .pipe(\n tap(() => this.alerting.setDeviceFilter(this.deviceFilterForm)),\n switchMap((filter) => this.dataLoader.loadDevices(filter)),\n tap(() => (this.devices = this.getDevicesForSelectedSite())),\n )\n .subscribe();\n\n this.userEmailSearch.valueChanges\n .pipe(\n map((searchValue: string) =>\n this.getUsersForSite(this.siteSelection.value).filter((user) =>\n user.email.includes(searchValue),\n ),\n ),\n tap((users) => (this.users = users)),\n )\n .subscribe();\n }\n\n private _loadData() {\n combineLatest([\n this.dataLoader.loadDevices(),\n this.data.deviceTypes$.pipe(\n switchMap((state) =>\n state ? of(state) : this.dataLoader.loadDeviceTypes(),\n ),\n catchError(() => of([])),\n ),\n this.data.brands$.pipe(\n switchMap((state) =>\n state ? of(state) : this.dataLoader.loadBrands(),\n ),\n catchError(() => of([])),\n ),\n this.data.sites$.pipe(\n switchMap((state) => (state ? of(state) : this.dataLoader.loadSites())),\n catchError(() => of([])),\n ),\n this.data.sources$.pipe(\n switchMap((state) =>\n state ? of(state) : this.dataLoader.loadSources(),\n ),\n catchError(() => of([])),\n ),\n this.data.users$.pipe(\n switchMap((state) => (state ? of(state) : this.dataLoader.loadUsers())),\n catchError(() => of([])),\n ),\n ])\n .pipe(first())\n .subscribe();\n }\n\n private getDevicesForSelectedSite(): DeviceDto[] {\n return this.data.devices && this.site\n ? this.data.devices.filter(\n (device) =>\n !!device?.tags.filter((tag) => tag.tag_id === this.site.code)\n .length,\n )\n : [];\n }\n\n private getUsersForSite(siteId: string): User[] {\n return this.data.users.filter((user) =>\n user.roles.map((role) => role.siteId).includes(siteId),\n );\n }\n\n private resetFilters(): void {\n this.alerting.resetDeviceFilter();\n if (this.deviceFilterForm)\n this.deviceFilterForm.patchValue(this.alerting.deviceFilter.value);\n this.userEmailSearch.setValue('');\n }\n\n public get showSiteSelectionPrompt(): boolean {\n return !(\n !this.alerting.selectedSite && this.auth.userHasMultipleSiteAccess\n );\n }\n\n public toggleConnectionAlert(device: DeviceDto): void {\n const alarm = device.alarm;\n alarm.connection.enable = !alarm.connection.enable;\n this.updateDeviceAlarm(device.device_id, alarm);\n }\n\n public toggleBatteryAlert(device: DeviceDto): void {\n const alarm = device.alarm;\n alarm.battery.enable = !alarm.battery.enable;\n this.updateDeviceAlarm(device.device_id, alarm);\n }\n\n public updateConnectionAlertDelay(event: Event, device: DeviceDto): void {\n const alarm = device.alarm;\n const target = event.target as HTMLInputElement;\n alarm.connection.delay = parseInt(target.value);\n this.updateDeviceAlarm(device.device_id, alarm);\n }\n\n public updateDeviceAlarm(deviceId: string, alarmInfo: DeviceAlarm): void {\n this.dataLoader.updateDeviceAlarm(deviceId, alarmInfo).subscribe();\n }\n\n public toggleUserAlert(user: User): void {\n const siteId = this.siteSelection.value;\n const alertInfo = {\n enable: !this.userAlertForSite(user),\n };\n this.dataLoader.updateUserAlert(user.email, alertInfo, siteId).subscribe();\n }\n\n public get userHasUpdateRight() {\n const siteId = this.siteSelection.value;\n return this.auth.isAdmin || this.auth.isMaintainerOnSite(siteId);\n }\n\n public userAlertForSite(user: User) {\n const siteId = this.siteSelection.value;\n return user.alerts.find((alert) => alert.siteId === siteId)?.alert;\n }\n\n public setDevicePanelOpenState(state: boolean): void {\n this.alerting.setDevicesOpen(state);\n }\n\n public setUserPanelOpenState(state: boolean): void {\n this.alerting.setUserOpen(state);\n }\n\n public get site(): Site {\n const site = this.data.sites?.find(\n (site) => site.id === this.alerting.selectedSite,\n );\n return site as Site;\n }\n\n public toggleSiteAlert() {\n const site = this.site;\n const alert = this.site.alertEnabled;\n const siteAlertConf = {\n cron: '0 12 * * *',\n enable: !alert,\n timezone: 'Europe/Paris',\n };\n this.dataLoader.updateSiteAlert(site.code, siteAlertConf).subscribe();\n }\n}\n","
\n \n\n \n

{{ messageToConfirm }}

\n
\n\n \n

\n
\n
\n
\n \n \n
\n","import { Component, Inject } from '@angular/core';\nimport { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog';\n\n@Component({\n selector: 'app-confirmation-dialog',\n templateUrl: './confirmation-dialog.component.html',\n})\nexport class ConfirmationDialogComponent {\n isHtml = !(typeof this.messageToConfirm === 'string');\n\n constructor(\n public dialogRef: MatDialogRef,\n @Inject(MAT_DIALOG_DATA) public messageToConfirm: string | { html: string },\n ) {}\n}\n","
\n \n \n
\n","import { Component, EventEmitter, Input, OnInit, Output } from '@angular/core';\n\n@Component({\n selector: 'app-image-upload',\n templateUrl: './image-upload.component.html',\n styleUrls: ['./image-upload.component.scss'],\n})\nexport class ImageUploadComponent implements OnInit {\n @Input() img: File;\n @Input() imgPreviewUrl?: string;\n @Output() imgSelected = new EventEmitter();\n id = Date.now();\n\n ngOnInit(): void {\n if (this.img) {\n this.previewImg(this.img);\n }\n }\n\n selectionChanged(event: Event) {\n const target = event.target as HTMLInputElement;\n const files = target.files;\n if (files && files.length > 0 && files[0].type.match(/image\\/*/)) {\n this.previewImg(files[0]);\n this.imgSelected.emit(files[0]);\n } else {\n this.imgPreviewUrl = undefined;\n }\n }\n\n previewImg(file: File) {\n const reader = new FileReader();\n reader.readAsDataURL(file);\n reader.onload = () => (this.imgPreviewUrl = reader.result as string);\n }\n}\n","

Create a new brand

\n

Edit brand {{ brand.name }}

\n
\n
\n
\n \n
\n \n Name\n \n This field is required!\n \n \n Description\n \n \n
\n
\n
\n \n Delete\n \n
\n \n \n Confirm\n \n
\n\n\n

Confirm brand deletion

\n
\n

Are you sure you want to delete this?

\n
\n
\n \n \n Yes\n \n
\n
\n","import { Component, Inject, TemplateRef } from '@angular/core';\nimport { FormBuilder, FormControl, Validators } from '@angular/forms';\nimport {\n MAT_DIALOG_DATA,\n MatDialog,\n MatDialogRef,\n} from '@angular/material/dialog';\nimport { UntilDestroy } from '@ngneat/until-destroy';\nimport { DataLoaderService } from 'src/app/services/state/data/data-loader.service';\nimport { Brand } from 'src/models/device-type.models';\n\n@UntilDestroy()\n@Component({\n selector: 'app-brand-creation',\n templateUrl: './brand-creation.component.html',\n styleUrls: ['./brand-creation.component.scss'],\n})\nexport class BrandCreationComponent {\n // interface state\n imagePreviewUrl: string = this.brand?.logoUrl ?? '';\n\n // user input\n brandForm = this.buildBrandForm;\n imageFile = new FormControl(null);\n\n constructor(\n @Inject(MAT_DIALOG_DATA) public brand: Brand | undefined,\n private dataLoader: DataLoaderService,\n private dialog: MatDialog,\n private dialogRef: MatDialogRef,\n ) {}\n\n private get buildBrandForm() {\n const bd = this.brand;\n\n return new FormBuilder().nonNullable.group({\n name: [bd?.name ?? '', [Validators.required]],\n description: [bd?.description ?? ''],\n });\n }\n\n public delete(templateRef: TemplateRef) {\n this.dialog\n .open(templateRef)\n .afterClosed()\n .subscribe((res: boolean) => {\n if (res) {\n this.dataLoader.deleteBrand(this.brand!.id).subscribe(() => {\n this.dialogRef.close();\n });\n }\n });\n }\n\n public confirm() {\n if (this.brand) {\n this.dataLoader\n .updateBrand(this.brand.id, this.formValues)\n .subscribe(() => this.dialogRef.close());\n } else {\n this.dataLoader\n .createBrand(this.formValues)\n .subscribe(() => this.dialogRef.close());\n }\n }\n\n get formValues() {\n return {\n ...this.brandForm.getRawValue(),\n // TODO: image_file may be null, catch this case before sending a request\n image_file: this.imageFile.value as unknown as File,\n };\n }\n}\n","

Create a new device type

\n

\n Edit device type {{ deviceType.device_type_id }}\n

\n
\n
\n
\n \n
\n
\n \n Title\n \n \n cannot contain the following characters: < > ' \" ; & = % \\ /\n \n This field is required!\n \n \n Connectivity\n \n LoRaWAN\n MQTT\n \n \n \n Brand\n \n {{ brand.name }}\n \n \n \n Battery powered\n \n Yes\n No\n \n \n
\n \n
\n \n Description\n \n \n \n Installation\n \n \n \n Dimensions\n \n \n \n Weight\n \n \n \n Battery\n \n \n \n Battery life\n \n \n \n Configurable\n \n \n \n Frequency\n \n \n \n Security\n \n \n \n Atex\n \n Yes\n No\n \n \n
\n
\n
\n
\n \n \n Confirm\n \n
\n","import { Component, Inject, OnInit } from '@angular/core';\nimport { FormControl, FormGroup, Validators } from '@angular/forms';\nimport { MAT_DIALOG_DATA } from '@angular/material/dialog';\nimport { UntilDestroy } from '@ngneat/until-destroy';\nimport { of } from 'rxjs';\nimport { first, map, switchMap, tap } from 'rxjs/operators';\nimport { DataStoreService } from 'src/app/services/state/data/data-store.service';\nimport {\n DeviceTypeDTO,\n DeviceTypeInfo,\n SourceCode,\n} from 'src/models/device-type.models';\nimport { DataLoaderService } from '../../../../services/state/data/data-loader.service';\n\n@UntilDestroy()\n@Component({\n selector: 'app-model-creation-new',\n templateUrl: './model-creation.component.html',\n styleUrls: ['./model-creation.component.scss'],\n})\nexport class ModelCreationComponent implements OnInit {\n // interface state\n imagePreviewUrl: string = (this.deviceType?.logoUrl as string) || '';\n\n brands$ = this.data.brands$;\n sources$ = this.data.sources$;\n\n // user input\n modelForm = this.buildModelForm;\n imageFile = new FormControl(null);\n\n constructor(\n @Inject(MAT_DIALOG_DATA) public deviceType: DeviceTypeDTO | undefined,\n private data: DataStoreService,\n private dataLoader: DataLoaderService,\n ) {\n this._loadData();\n }\n\n private _loadData() {\n this.data.brands$\n .pipe(\n switchMap((state) =>\n state ? of(state) : this.dataLoader.loadBrands(),\n ),\n first(),\n )\n .subscribe();\n }\n private get buildModelForm() {\n const dt = this.deviceType;\n return new FormGroup({\n name: new FormControl((dt?.name as string) || '', [\n Validators.required,\n Validators.pattern(/^[^<>'\";&=%\\\\/]+$/),\n ]),\n sourceId: new FormControl(\n (dt?.source.id as string) || '',\n Validators.required,\n ),\n brandId: new FormControl(dt?.brand.id ?? '', Validators.required),\n connectivity: new FormControl(\n (dt?.connectivity as string) || this.connectivityFromSource,\n Validators.required,\n ),\n\n batteryPowered: new FormControl(\n !!dt?.batteryPowered,\n Validators.required,\n ),\n description: new FormControl((dt?.description as string) || ''),\n installation: new FormControl((dt?.installation as string) || ''),\n dimensions: new FormControl((dt?.dimensions as string) || ''),\n weight: new FormControl((dt?.weight as string) || ''),\n battery: new FormControl((dt?.battery as string) || ''),\n batteryLife: new FormControl((dt?.batteryLife as string) || ''),\n configurable: new FormControl((dt?.configurable as string) || ''),\n frequency: new FormControl((dt?.frequency as string) || ''),\n security: new FormControl((dt?.security as string) || ''),\n atex: new FormControl((dt?.atex as boolean) || false),\n // firmware: this.fb.array([this.fb.control('default')]),\n // ranges: this.fb.array([]),\n\n encoderFunctionName: new FormControl(dt?.encoderFunctionName),\n decoderFunctionName: new FormControl(dt?.decoderFunctionName),\n });\n }\n\n private get connectivityFromSource() {\n const dt = this.deviceType;\n return dt ? (dt.source.code === 'firefly' ? 'LoRaWAN' : 'MQTT') : null;\n }\n\n ngOnInit(): void {\n this.manageConnectivityChanges.subscribe();\n }\n\n // get firmwareForms(): FormArray {\n // return this.modelForm.controls['firmware'] as FormArray;\n // }\n\n // addFirmware() {\n // this.firmwareForms.push(this.fb.control(''));\n // }\n\n // removeFirmware(index: number) {\n // this.firmwareForms.removeAt(index);\n // }\n\n // get rangeTypeForms(): FormArray {\n // return this.modelForm.controls['ranges'] as FormArray;\n // }\n\n // addRangeType() {\n // const rangeTypeForm = this.fb.group({\n // type: [],\n // unit: [],\n // ranges: this.fb.array([\n // this.fb.group({\n // min: [],\n // max: [],\n // }),\n // ]),\n // });\n // this.rangeTypeForms.push(rangeTypeForm);\n // }\n\n // removeRangeType(index: number) {\n // this.rangeTypeForms.removeAt(index);\n // }\n\n // ranges(rangeTypeForm: FormGroup): FormArray {\n // return rangeTypeForm.controls.ranges as FormArray;\n // }\n\n // addRange(rangeTypeForm: FormGroup) {\n // const ranges = rangeTypeForm.controls.ranges as FormArray;\n // const rangeForm = this.fb.group({ min: [], max: [] });\n // ranges.push(rangeForm);\n // }\n\n // removeRange(rangeTypeForm: FormGroup, rangeIndex: number) {\n // const ranges = rangeTypeForm.controls.ranges as FormArray;\n // ranges.removeAt(rangeIndex);\n // }\n\n // public get measurementTypeNames(): string[] {\n // return Object.keys(measurementTypes);\n // }\n\n // public getMeasurementTypeUnits(type): any[] {\n // return measurementTypes[type] || [];\n // }\n\n private get manageConnectivityChanges() {\n return this.modelForm.controls.connectivity.valueChanges.pipe(\n map((connectivity) =>\n connectivity === 'LoRaWAN' ? 'firefly' : 'iot_core',\n ),\n switchMap((source: SourceCode) =>\n this.sources$.pipe(\n map((sources) => {\n const isFirefly = source === 'firefly';\n\n const matchedSource = sources?.find((s) => s.code === source);\n const sourceId = matchedSource ? matchedSource.id : null;\n\n return { sourceId, isFirefly };\n }),\n ),\n ),\n tap(({ sourceId, isFirefly }) => {\n this.modelForm.controls.sourceId.setValue(sourceId);\n\n this.modelForm.controls.encoderFunctionName.setValue(\n isFirefly ? 'generic_firefly_encoder' : null,\n );\n this.modelForm.controls.decoderFunctionName.setValue(\n isFirefly ? 'generic_decoder' : null,\n );\n }),\n );\n }\n\n get formValues() {\n return {\n info: this.modelForm.value as DeviceTypeInfo,\n image: this.imageFile.value,\n };\n }\n}\n","\n \n \n {{ model?.name }}\n \n \n \n {{ tag | titlecase }}{{ (!last && ' / ') || '' }} 2\">/ ...\n \n \n \n\n \n\n \n\n \n \n \n do_not_disturb_on\n do_not_disturb_off\n \n \n delete\n \n \n \n \n do_not_disturb_on\n do_not_disturb_off\n \n \n \n\n","import { Component, EventEmitter, Input, Output } from '@angular/core';\nimport { AuthService } from 'src/app/services/state/auth/auth.service';\nimport { DataLoaderService } from 'src/app/services/state/data/data-loader.service';\nimport { DeviceTypeDTO } from 'src/models/device-type.models';\n\n@Component({\n selector: 'app-model-item',\n templateUrl: './model-item.component.html',\n styleUrls: ['./model-item.component.scss'],\n})\nexport class ModelItemComponent {\n @Input() model: DeviceTypeDTO;\n @Input() selectable? = false;\n @Input() editable? = false;\n @Output() deleted = new EventEmitter();\n @Output() selected = new EventEmitter();\n\n constructor(\n public auth: AuthService,\n public dataLoader: DataLoaderService,\n ) {}\n\n emitSelection() {\n if (this.selectable) {\n this.selected.emit(this.model);\n }\n }\n\n emitDelete(event) {\n event.stopPropagation();\n this.deleted.emit(this.model.code);\n }\n\n toggleDisable(event) {\n event.stopPropagation();\n this.dataLoader\n .changeDeviceTypeActiveState(this.model.code, this.model.enabled)\n .subscribe();\n }\n}\n","
\n \n \n Search\n \n search\n \n \n Manufacturer\n \n All\n \n {{ manufacturer.name }}\n \n \n \n \n Source\n \n All\n \n {{ source.name }}\n \n \n \n \n Data Tag\n \n All\n \n {{ tag | titlecase }}\n \n \n \n show disabled models\n \n\n Tile View\n
\n","import { Component, EventEmitter, Input, OnInit, Output } from '@angular/core';\nimport { UntypedFormControl, UntypedFormGroup } from '@angular/forms';\nimport { merge } from 'rxjs';\nimport { filter, startWith, tap } from 'rxjs/operators';\n\nimport { AuthService } from 'src/app/services/state/auth/auth.service';\nimport { DataStoreService } from 'src/app/services/state/data/data-store.service';\nimport { Brand, DeviceTypeDTO, Source } from 'src/models/device-type.models';\n\n@Component({\n selector: 'app-model-filter',\n templateUrl: './model-filter.component.html',\n styleUrls: ['./model-filter.component.scss'],\n})\nexport class ModelFilterComponent implements OnInit {\n @Input() models: DeviceTypeDTO[];\n @Input() manufacturers: Brand[];\n @Input() sources: Source[];\n @Input() tags: string[];\n @Input() showViewOption = true;\n @Output() modelsFiltered = new EventEmitter();\n @Output() tileViewActive = new EventEmitter();\n form: UntypedFormGroup;\n\n constructor(\n private data: DataStoreService,\n public auth: AuthService,\n ) {}\n\n ngOnInit(): void {\n this.form = this.buildFilterForm();\n\n merge(\n this.filterForm.valueChanges,\n this.data.deviceTypes$.pipe(\n filter((models) => !!models?.length),\n tap((models) => (this.models = models ? models : [])),\n ),\n )\n .pipe(\n startWith(this.filterForm.value),\n tap(() => {\n this.emitFilteredModels();\n }),\n )\n .subscribe();\n\n this.form.controls.tileView.valueChanges\n .pipe(\n startWith(this.form.controls.tileView.value),\n tap((val) => this.tileViewActive.emit(val)),\n )\n .subscribe();\n }\n\n // TODO filters in getList\n private emitFilteredModels() {\n let result = this.models;\n result = this.brandFilter(result);\n result = this.sourceFilter(result);\n result = this.dataTagFilter(result);\n result = this.keywordFilter(result);\n result = this.disabledFilter(result);\n this.modelsFiltered.emit(result);\n }\n\n private brandFilter(models: DeviceTypeDTO[]): DeviceTypeDTO[] {\n const manufacturer = this.filterForm.value.manufacturer;\n return !manufacturer\n ? models\n : models.filter((model) => model.brand.name === manufacturer);\n }\n\n private sourceFilter(models: DeviceTypeDTO[]): DeviceTypeDTO[] {\n const source = this.filterForm.value.source;\n return !source\n ? models\n : models.filter((model) => model.source.name === source);\n }\n\n private dataTagFilter(models: DeviceTypeDTO[]): DeviceTypeDTO[] {\n const dataTags = this.filterForm.value.dataTags;\n return !dataTags\n ? models\n : models.filter((model) => model.functions.includes(dataTags));\n }\n\n private keywordFilter(models: DeviceTypeDTO[]): DeviceTypeDTO[] {\n const keyword = this.filterForm.value.keyword.toLowerCase();\n return !keyword\n ? models\n : models.filter(\n (model) =>\n model.code.toLowerCase().includes(keyword) ||\n model.brand.name.toLowerCase().includes(keyword) ||\n model.name?.toLowerCase().includes(keyword) ||\n model.source.name.toLowerCase().includes(keyword) ||\n model.functions?.filter((tag) =>\n tag.toLowerCase().includes(keyword),\n ).length,\n );\n }\n\n private disabledFilter(models: DeviceTypeDTO[]): DeviceTypeDTO[] {\n const show = this.filterForm.value.showDisabled;\n return show ? models : models?.filter((model) => model.enabled);\n }\n\n private buildFilterForm(): UntypedFormGroup {\n const form = new UntypedFormGroup({\n filter: new UntypedFormGroup({\n keyword: new UntypedFormControl(''),\n manufacturer: new UntypedFormControl(),\n source: new UntypedFormControl(),\n dataTags: new UntypedFormControl(),\n showDisabled: new UntypedFormControl(),\n }),\n tileView: new UntypedFormControl(true),\n });\n\n return form;\n }\n\n private get filterForm(): UntypedFormGroup {\n return this.form.get('filter') as UntypedFormGroup;\n }\n}\n","import { Component } from '@angular/core';\n\n@Component({\n selector: 'app-no-result',\n templateUrl: './no-result.component.html',\n styleUrls: ['./no-result.component.scss'],\n})\nexport class NoResultComponent {}\n","

\n There are no results for your search. Try to adapt the filters to get more\n results.\n

\n","import { Component, Input } from '@angular/core';\nimport { Brand } from 'src/models/device-type.models';\n\n@Component({\n selector: 'app-brand-item',\n templateUrl: './brand-item.component.html',\n styleUrls: ['./brand-item.component.scss'],\n})\nexport class BrandItemComponent {\n @Input() brand: Brand;\n @Input() clickable: boolean;\n\n constructor() {}\n}\n","\n

{{ brand.name }}

\n \"Brand\n
\n","
\n
= 4\" class=\"filter-banner\">\n \n
\n \n \n Filter \n \n \n \n
\n\n\n \n
\n \n \n add\n \n
\n \n\n \n
\n

Brands

\n
\n
\n \n \n
\n \n
\n\n
\n
\n
\n
Name
\n
Brand
\n
Source
\n
Actions
\n
\n
\n
\n \n
\n {{ model.metadata.label }}\n
\n
{{ model.brand.name }}
\n\n
{{ model.source.code }}
\n
\n
\n \n \n edit\n \n \n delete\n \n \n
\n
\n
\n
\n \n \n
\n
\n\n\n add\n\n\n\n \n\n","import { Component } from '@angular/core';\nimport { MatSnackBar } from '@angular/material/snack-bar';\nimport { MatDialog } from '@angular/material/dialog';\nimport { ActivatedRoute, Router } from '@angular/router';\nimport { combineLatest, of } from 'rxjs';\nimport { filter, first, switchMap, tap } from 'rxjs/operators';\nimport { ConfirmationDialogComponent } from 'src/app/components/confirmation-dialog/confirmation-dialog.component';\nimport { BrandCreationComponent } from 'src/app/pages/main/catalogue/brand-creation/brand-creation.component';\nimport { DevicesService } from 'src/app/services/http/devices.service';\nimport { AuthService } from 'src/app/services/state/auth/auth.service';\nimport { DataStoreService } from 'src/app/services/state/data/data-store.service';\nimport { InterfaceStateService } from 'src/app/services/state/interface/interface-store.service';\nimport {\n Brand,\n DeviceTypeDTO,\n DeviceTypeInfo,\n} from 'src/models/device-type.models';\nimport { DataLoaderService } from '../../../services/state/data/data-loader.service';\nimport { ModelCreationComponent } from './model-creation/model-creation.component';\n\n@Component({\n selector: 'app-catalogue',\n templateUrl: './catalogue.component.html',\n styleUrls: ['./catalogue.component.scss'],\n})\nexport class CatalogueComponent {\n screensizeIndex$ = this.interfaceState.breakpointIndex$;\n filteredModels$ = this.data.deviceTypes$;\n models$ = this.data.deviceTypes$;\n dataTags$ = this.data.dataTags$;\n sources$ = this.data.sources$;\n brands$ = this.data.brands$;\n tileView: boolean;\n selectedBrand: Brand;\n creationParams = { step: 1 };\n\n private readonly HOME_CATALOGUE_TEXT = 'home/catalogue';\n\n constructor(\n private dialog: MatDialog,\n private dataLoader: DataLoaderService,\n private data: DataStoreService,\n private interfaceState: InterfaceStateService,\n private deviceHttp: DevicesService,\n private router: Router,\n private route: ActivatedRoute,\n public auth: AuthService,\n private snackBar: MatSnackBar,\n ) {\n this._loadData();\n }\n\n modelLoader(models) {\n return models !== undefined;\n }\n\n private _loadData() {\n combineLatest([\n this.data.deviceTypes$.pipe(\n switchMap((state) =>\n state ? of(state) : this.dataLoader.loadDeviceTypes(),\n ),\n ),\n this.data.brands$.pipe(\n switchMap((state) =>\n state ? of(state) : this.dataLoader.loadBrands(),\n ),\n ),\n this.data.sources$.pipe(\n switchMap((state) =>\n state ? of(state) : this.dataLoader.loadSources(),\n ),\n ),\n ])\n .pipe(first())\n .subscribe();\n }\n\n onFilterChanged(models: DeviceTypeDTO[]): void {\n this.filteredModels$ = of(models);\n }\n\n deleteModel(modelId: string): void {\n const confirmationMessage = 'This action will delete the device model!';\n const dialogRef = this.dialog.open(ConfirmationDialogComponent, {\n data: confirmationMessage,\n });\n\n dialogRef\n .afterClosed()\n .pipe(\n filter((answer) => !!answer),\n switchMap(() => this.deviceHttp.deleteDeviceType(modelId)),\n tap(() => this.data.deleteDeviceType(modelId)),\n tap(() => this.snackBar.open('Brand updated', 'close')),\n )\n .subscribe();\n }\n\n viewDetails(modelId: string): void {\n this.router.navigate(['details', modelId], {\n relativeTo: this.route,\n });\n }\n\n editBrand(brand: Brand) {\n this.dialog.open(BrandCreationComponent, { data: brand });\n }\n\n createBrand() {\n this.dialog.open(BrandCreationComponent);\n }\n\n createDeviceType() {\n this.dialog\n .open(ModelCreationComponent, {})\n .afterClosed()\n .pipe(\n filter((res) => !!res),\n first(),\n switchMap((res) =>\n this.dataLoader.createDeviceType({\n ...res.info,\n image_file: res.image,\n } as DeviceTypeInfo),\n ),\n tap((dT) => {\n this.router.navigate(['details', dT.code], {\n relativeTo: this.route,\n });\n }),\n )\n .subscribe();\n }\n\n public setViewSelection(tileView: boolean): void {\n this.tileView = tileView;\n }\n}\n","import {\n DecoderType,\n HexDecoderBlueprint,\n JsonDecoderBlueprint,\n MandatoryMessageField,\n Variable,\n} from 'src/models/device-type.models';\n\nexport const getNewDecoderBlueprint = (type: DecoderType) => {\n if (type === 'multi' || type === 'single') {\n return {\n type: type,\n config: [\n { name: '_switch', value: newDecodingConfig() },\n { name: '_default', value: newDecodingConfig() },\n { name: '_single', value: newDecodingConfig() },\n ],\n } as HexDecoderBlueprint;\n } else {\n return {\n type: type,\n config: { json_sample: '', variables: [] },\n } as JsonDecoderBlueprint;\n }\n};\n\nexport const newDecodingConfig = () => {\n return {\n variables: fireflyVars,\n parserElements: [],\n calculations: [],\n };\n};\n\nexport const getExampleValue = (type: string): number | boolean | string => {\n switch (type) {\n case 'number':\n return Math.random();\n case 'string':\n return '';\n case 'boolean':\n return Math.random() < 0.5;\n default:\n return '';\n }\n};\n\nexport const supportedValueTypes = [\n 'string',\n 'boolean',\n 'bigint',\n 'number',\n 'object',\n];\n\nexport const fireflyVars: Variable[] = [\n {\n name: 'spreading_factor',\n type: 'number',\n measurementType: 'basic',\n unit: 'N/A',\n order: 1,\n writeBusinessFieldUnit: false,\n writeBusinessField: true,\n fromSource: true,\n },\n {\n name: 'rssi',\n type: 'number',\n measurementType: 'signal quality',\n unit: 'dBm',\n order: 2,\n writeBusinessFieldUnit: false,\n writeBusinessField: true,\n fromSource: true,\n },\n {\n name: 'lsnr',\n type: 'number',\n measurementType: 'signal quality',\n unit: 'dB',\n order: 3,\n writeBusinessFieldUnit: false,\n writeBusinessField: true,\n fromSource: true,\n },\n];\n\nexport const mandatoryFields: MandatoryMessageField[] = [\n {\n label: 'Device ID',\n keyName: 'device_id',\n description:\n 'The Device ID is a unique key that identifies the device on the origin platform. It is mandatory!',\n valid: false,\n optional: false,\n allowedTypes: ['string', 'number'],\n },\n {\n label: 'Timestamp',\n keyName: 'timestamp',\n description: 'Origin time of the device message. It is mandatory!',\n valid: false,\n optional: false,\n allowedTypes: ['string', 'number'],\n },\n {\n label: 'Low Battery',\n keyName: 'low_battery',\n description:\n 'Boolean value that reflects if the battery is critically low. It is optional but strongly recommended for device monitoring reasons!',\n valid: false,\n optional: true,\n allowedTypes: ['boolean'],\n },\n {\n label: 'Battery percentage',\n keyName: 'battery_percent',\n description:\n 'Numerical value that reflects the battery state of a device. It is optional but strongly recommended for device monitoring reasons!',\n valid: false,\n optional: true,\n allowedTypes: ['string', 'number'],\n },\n];\n\n// TO DO: Move to database\nexport const measurementTypes = {\n basic: [\n {\n sign: '%',\n detail: 'Percent (0-100)',\n type: 'number',\n },\n {\n sign: '%h',\n detail: 'Percent humidity',\n type: 'number',\n },\n {\n sign: 'N/A',\n detail: 'Number',\n type: 'number',\n },\n {\n sign: 'N/A',\n detail: 'Boolean',\n type: 'boolean',\n },\n {\n sign: 'N/A',\n detail: 'String',\n type: 'string',\n },\n ],\n 'signal quality': [\n {\n sign: 'dBm',\n detail: 'Decibel Milliwatts',\n type: 'number',\n },\n {\n sign: 'dB',\n detail: 'Decibel',\n type: 'number',\n },\n ],\n temperature: [\n {\n sign: '°C',\n detail: 'Deg. Celsius',\n type: 'number',\n },\n {\n sign: '°F',\n detail: 'Deg. Fahrenheit',\n type: 'number',\n },\n {\n sign: 'K',\n detail: 'Kelvin',\n type: 'number',\n },\n ],\n energy: [\n {\n sign: 'A',\n detail: 'Ampere',\n type: 'number',\n },\n {\n sign: 'mA',\n detail: 'Milliampere',\n type: 'number',\n },\n {\n sign: 'lx',\n detail: 'Lux',\n type: 'number',\n },\n {\n sign: 'lm',\n detail: 'Lumen',\n type: 'number',\n },\n {\n sign: 'dB',\n detail: 'Decibel',\n type: 'number',\n },\n {\n sign: 'mV',\n detail: 'Millivolt',\n type: 'number',\n },\n {\n sign: 'V',\n detail: 'Volt',\n type: 'number',\n },\n {\n sign: 'kV',\n detail: 'Kilovolt',\n type: 'number',\n },\n {\n sign: 'Wh',\n detail: 'Watt Hour',\n type: 'number',\n },\n {\n sign: 'kWh',\n detail: 'Kilowatt Hour',\n type: 'number',\n },\n ],\n power: [\n {\n sign: 'W',\n detail: 'Watt',\n type: 'number',\n },\n {\n sign: 'kW',\n detail: 'Kilowatt',\n type: 'number',\n },\n {\n sign: 'VA',\n detail: 'Voltampere',\n type: 'number',\n },\n {\n sign: 'kVA',\n detail: 'Kilo Voltampere',\n type: 'number',\n },\n {\n sign: 'Var',\n detail: 'Reactive Power',\n type: 'number',\n },\n {\n sign: 'kVar',\n detail: 'Reactive Power',\n type: 'number',\n },\n {\n sign: 'A/h',\n detail: 'Ampere Hour',\n type: 'number',\n },\n {\n sign: 'mA/h',\n detail: 'Milliampere Hour',\n type: 'number',\n },\n ],\n concentration: [\n {\n sign: 'ppm',\n detail: 'Parts-per-million',\n type: 'number',\n },\n {\n sign: 'g/l',\n detail: 'Grams per liter',\n type: 'number',\n },\n {\n sign: 'mg/l',\n detail: 'Milligrams per liter',\n type: 'number',\n },\n {\n sign: 'ug/l',\n detail: 'Micrograms per liter',\n type: 'number',\n },\n ],\n pressure: [\n {\n sign: 'Pa',\n detail: 'Pascal',\n type: 'number',\n },\n {\n sign: 'hPa',\n detail: 'Hecto Pascal',\n type: 'number',\n },\n {\n sign: 'kPa',\n detail: 'Kilo Pascal',\n type: 'number',\n },\n {\n sign: 'bar',\n detail: 'Bar',\n type: 'number',\n },\n ],\n volume: [\n {\n sign: 'l',\n detail: 'Liter',\n type: 'number',\n },\n {\n sign: 'm3',\n detail: 'Cubic Metre',\n type: 'number',\n },\n ],\n flow: [\n {\n sign: 'l/h',\n detail: 'Liter per Hour',\n type: 'number',\n },\n {\n sign: 'l/min',\n detail: 'Liter per Minute',\n type: 'number',\n },\n {\n sign: 'l/s',\n detail: 'Liter per Second',\n type: 'number',\n },\n {\n sign: 'm3/h',\n detail: 'Cubic Metre per Hour',\n type: 'number',\n },\n ],\n distance: [\n {\n sign: 'm',\n detail: 'Meter',\n type: 'number',\n },\n {\n sign: 'cm',\n detail: 'Centimeter',\n type: 'number',\n },\n {\n sign: 'mm',\n detail: 'Millimeter',\n type: 'number',\n },\n ],\n time: [\n {\n sign: 's',\n detail: 'Second',\n type: 'number',\n },\n {\n sign: 'min',\n detail: 'Minute',\n type: 'number',\n },\n {\n sign: 'h',\n detail: 'Hour',\n type: 'number',\n },\n {\n sign: 'd',\n detail: 'Day',\n type: 'number',\n },\n ],\n turbidity: [\n {\n sign: 'NTU',\n detail: 'Nephelometric Turbidity Unit',\n type: 'number',\n },\n {\n sign: 'FNU',\n detail: 'Formazin Nephelometric Units',\n type: 'number',\n },\n {\n sign: 'FTU',\n detail: 'Formazin Turbidity Units',\n type: 'number',\n },\n {\n sign: 'FAU',\n detail: 'Formazin Attenuation Units',\n type: 'number',\n },\n {\n sign: 'JTU',\n detail: 'Jackson Turbidity Unit',\n type: 'number',\n },\n ],\n other: [\n {\n sign: '1/m',\n detail: 'one per meter (Wave number)',\n type: 'number',\n },\n {\n sign: '1/cm',\n detail: 'one per Centimeter (Wave number)',\n type: 'number',\n },\n ],\n};\n","import { Injectable } from '@angular/core';\nimport { DevicesService } from 'src/app/services/http/devices.service';\nimport {\n DecoderBlueprint,\n DecoderType,\n DecodingConfiguration,\n HexDecoderBlueprint,\n HexDecoderConfig,\n InputMessageField,\n JsonDecoderBlueprint,\n ParsedJSON,\n Variable,\n} from 'src/models/device-type.models';\nimport {\n getNewDecoderBlueprint,\n newDecodingConfig,\n} from './parser-creation-helper';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class ParserCreationService {\n private _protectedConfigs = ['_default', '_switch', '_single'];\n private _hexBlueprint: HexDecoderBlueprint | undefined;\n private _jsonBlueprint: JsonDecoderBlueprint | undefined;\n\n constructor(private http: DevicesService) {}\n\n public get hexBlueprint(): HexDecoderBlueprint | undefined {\n return this._hexBlueprint;\n }\n\n public resetBlueprints() {\n this._hexBlueprint = undefined;\n this._jsonBlueprint = undefined;\n }\n\n public jsonBlueprint(deleteUnused = false): JsonDecoderBlueprint | undefined {\n if (this._jsonBlueprint && deleteUnused) {\n return this.filterMessageFields(this._jsonBlueprint);\n } else {\n return this._jsonBlueprint;\n }\n }\n\n public setBlueprint(bp?: DecoderBlueprint): void {\n if (bp?.type === 'multi' || bp?.type === 'single') {\n this._hexBlueprint = bp as HexDecoderBlueprint;\n } else if (bp?.type === 'json' || bp?.type === 'passthrough') {\n this._jsonBlueprint = bp as JsonDecoderBlueprint;\n } else {\n this._jsonBlueprint = undefined;\n this._hexBlueprint = undefined;\n }\n }\n\n public setBlueprintType(type: DecoderType): void {\n if (type === 'multi' || type === 'single') {\n if (this._hexBlueprint) {\n this._hexBlueprint.type = type;\n } else {\n this.setBlueprint(getNewDecoderBlueprint(type));\n }\n } else {\n this.setBlueprint(getNewDecoderBlueprint(type));\n }\n }\n\n public setJsonBlueprintConfig(config: JsonDecoderBlueprint['config']) {\n if (this._jsonBlueprint) {\n this._jsonBlueprint.config = config;\n }\n }\n\n public setHexBlueprintConfig(\n id: string,\n config: DecodingConfiguration,\n ): void {\n if (this._hexBlueprint) {\n this._hexBlueprint.config.find(\n (decoderConfig) => decoderConfig.name === id,\n )!.value = config;\n }\n if (id === '_switch') {\n const singleParserIds = config.calculations.map((cal) => cal.target);\n this.updateSingleParserList(singleParserIds);\n }\n }\n\n public updateSingleParserList(ids: string[]) {\n if (!this._hexBlueprint) return;\n\n ids.forEach((id) => {\n const decoderConfig = this._hexBlueprint!.config.find(\n (d) => d.name === id,\n );\n if (decoderConfig === undefined) {\n this._hexBlueprint!.config.push({\n name: id,\n value: newDecodingConfig(),\n });\n }\n });\n\n this._hexBlueprint!.config = this._hexBlueprint.config.filter(\n (decoderConfig) =>\n this._protectedConfigs.includes(decoderConfig.name) ||\n ids.includes(decoderConfig.name),\n );\n }\n\n public get singleParserList(): HexDecoderConfig[] {\n return this._hexBlueprint!.config;\n }\n\n public get singleParserIds(): string[] {\n return Object.keys(this.singleParserList).filter(\n (id) => !this._protectedConfigs.includes(id),\n );\n }\n\n public get variables(): Variable[] {\n return this._hexBlueprint?.type === 'single'\n ? this._hexBlueprint.config.find(\n (decoderConfig) => decoderConfig.name === '_single',\n )!.value.variables\n : this.singleParserList\n .map((decoderConfig) => decoderConfig.value.variables)\n .flat();\n }\n\n public decodeTestPayload(payload: string, port?: number) {\n return this.http.decodeTestPayload(payload, this._hexBlueprint!, port);\n }\n\n public get dataTags(): string[] {\n return Array.from(\n new Set(\n Object.values(this.variables).map(\n (variable) => variable.measurementType,\n ),\n ),\n );\n }\n\n public mapJsonToMessageFields(json: ParsedJSON): InputMessageField[] {\n const fields: InputMessageField[] = [];\n\n const recursive = (obj: unknown, path = '') => {\n if (obj) {\n const keys = Object.keys(obj);\n keys.forEach((key) => {\n const newPath = path.length ? `${path}/${key}` : key;\n const field = {\n name: newPath,\n type: typeof obj[key],\n outputName: newPath.replace(/[&\\\\#,+()$~%.'\":*?@<>{}éèàç]/g, ''),\n duplicateOutput: false,\n deleted: false,\n };\n\n if (\n obj[key] &&\n typeof obj[key] === 'object' &&\n !Array.isArray(obj[key])\n ) {\n recursive(obj[key], newPath);\n } else if (!Array.isArray(obj[key])) {\n fields.push(field);\n }\n });\n }\n };\n\n recursive(json);\n\n return fields;\n }\n\n public reconstructMapping(\n json?: string,\n mappingResult?: Pick[],\n ): InputMessageField[] {\n if (!!json && !!mappingResult) {\n const mappingStart = this.mapJsonToMessageFields(JSON.parse(json));\n const mappedFields = mappingResult?.map((field) => ({\n ...field,\n deleted: false,\n duplicateOutput: false,\n }));\n const deletedFields = mappingStart\n .filter(\n (field) =>\n !mappedFields?.find((resField) => resField.name === field.name),\n )\n .map((field) => ({ ...field, deleted: true }));\n\n return [...mappedFields!, ...deletedFields];\n } else {\n return [];\n }\n }\n\n private filterMessageFields(bluePrint: JsonDecoderBlueprint) {\n const res = { ...bluePrint };\n res.config.variables = res.config\n .variables!.filter((field: InputMessageField) => !field.deleted)\n .filter((field: InputMessageField) => !field.duplicateOutput)\n .map((field: InputMessageField) => {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { deleted, duplicateOutput, ...res } = field;\n return res;\n });\n return res;\n }\n}\n","
\n

Choose a parser type:

\n
\n \n
Multi Parser
\n

Parser for devices with multipe payload types

\n
\n \n
Single Parser
\n

Simple parser for devices with one payload type

\n
\n \n
JSON Mapping
\n

JSON parser with possibility to rename fields

\n \n \n
JSON Passthrough
\n

JSON parser that transferes the payload as received

\n \n \n\n","import { Component, EventEmitter, Input, Output } from '@angular/core';\nimport { Source } from 'src/models/device-type.models';\n\n@Component({\n selector: 'app-parser-type-selection',\n templateUrl: './parser-type-selection.component.html',\n styleUrls: ['./parser-type-selection.component.scss'],\n})\nexport class ParserTypeSelectionComponent {\n @Input() source: Source;\n @Output() selectionChanged = new EventEmitter();\n\n constructor() {}\n\n public parserTypeSelected(type: string) {\n this.selectionChanged.emit(type);\n }\n}\n","import { AbstractControl, ValidationErrors } from '@angular/forms';\nimport { parse } from 'mathjs';\n\nexport function formulaValidator(\n control: AbstractControl,\n): ValidationErrors | null {\n try {\n parse(control.value);\n return null;\n } catch {\n return { invalidFormula: { value: control.value } };\n }\n}\n","import {\n AbstractControl,\n AsyncValidatorFn,\n ValidationErrors,\n} from '@angular/forms';\nimport { MathNode, parse, SymbolNode } from 'mathjs';\nimport { catchError, first, map, Observable, of } from 'rxjs';\n\nexport function variablesValidator(\n variablesNames$: Observable,\n): AsyncValidatorFn {\n return (control: AbstractControl): Observable => {\n return variablesNames$.pipe(\n first(),\n map((variables) => {\n const formValue = control.value;\n if (!formValue) {\n return null;\n }\n const unknownVariables: string[] = [];\n\n parse(formValue).traverse((input: MathNode) => {\n if (input.type === 'SymbolNode') {\n const variable = (input as SymbolNode).name;\n if (!variables.includes(variable)) unknownVariables.push(variable);\n }\n });\n\n if (unknownVariables.length === 1)\n return { unknownVariables: unknownVariables };\n return unknownVariables.length > 0\n ? { unknownVariables: unknownVariables.join(', ') }\n : null;\n }),\n catchError(() => of(null)),\n );\n };\n}\n\nexport function variableAlreadyExistValidator(\n variablesNames$: Observable,\n): AsyncValidatorFn {\n return (control: AbstractControl): Observable => {\n return variablesNames$.pipe(\n first(),\n map((variables) => {\n const formValue = control.value;\n if (!formValue) {\n return null;\n }\n const alreadyExist = variables.includes(formValue);\n return alreadyExist ? { alreadyExist: formValue } : null;\n }),\n catchError(() => of(null)),\n );\n };\n}\n","\n \n Decoding configuration test \n \n
\n \n Payload\n \n \n Test payload must be a hexadecimal string!\n \n \n \n Port\n \n \n Port must be a number!\n \n \n \n Test\n \n
\n
\n
{{ resultPreview | json }}
\n
\n
\n","import { Component } from '@angular/core';\nimport { FormControl, FormGroup, Validators } from '@angular/forms';\nimport { ParserCreationService } from '../parser-creation.service';\n\n@Component({\n selector: 'app-blueprint-test',\n templateUrl: './blueprint-test.component.html',\n styleUrls: ['./blueprint-test.component.scss'],\n})\nexport class BlueprintTestComponent {\n form = new FormGroup({\n payload: new FormControl('', [\n Validators.required,\n Validators.pattern(/[0-9A-F]+$/),\n ]),\n port: new FormControl(10, [Validators.pattern(/[0-9]+$/)]),\n });\n decodedPayload: { statusCode: number };\n\n constructor(public parserCreation: ParserCreationService) {}\n\n testBlueprint() {\n this.parserCreation\n .decodeTestPayload(this.form.value.payload!, this.form.value.port!)\n .subscribe((res) => (this.decodedPayload = res));\n }\n\n get resultPreview() {\n if (this.decodedPayload.statusCode === 500) {\n return {\n statusCode: 500,\n message:\n 'The server responded with a status code 500 (internal server error). There seems to be something wrong with your decoding configuration.',\n };\n } else {\n return this.decodedPayload;\n }\n }\n}\n","
\n \n \n Quick Reference \n \n

Parser

\n

\n Every line in the parser will take as many bits as you specify from the\n application payload of a packet.\n

\n

\n
Example
\n

You have 3 lines in your parser:

\n

1. 1 bit

\n

2. 7 bits

\n

3. 8 bits

\n

\n

\n Provided with a payload of 0x8322 (0b1000001100100010), they will take the\n following bits from the payload:\n

\n

1. 0b1

\n

2. 0b0000011

\n

3. 0b00100010

\n

\n
Data types Boolean
\n

\n The boolean type will transform any amount of bits that is not 0 into true\n otherwise it will transform it to false.\n

\n

\n
Data types Integer
\n

The integer type will return integer numbers. It has 2 options:

\n
    \n
  • \n Little - Check this if the number's endianness is little. Only supports\n 16 and 32 bit integers.\n
  • \n
  • \n Signed - Check this if the number can be negative. If checked, a\n selection for the complement is available. 1's complement is the\n default.\n
  • \n
\n
Data types Float
\n

\n The float type returns floating point numbers. Only supports 32 bit\n values. Check Little if the number is represented as little endian.\n

\n

\n

Calculations

\n

\n

\n After initially parsing the binary payload into a more structured form,\n you can specify formulas that further transform your data into your\n desired output.\n

\n

\n
Formula
\n

Enter a mathematical formula here.

\n

Supported operators:

\n
    \n
  • Basic arithmetic: + - * /
  • \n
  • Basic comparison: == > <
  • \n
  • \n Complete syntax\n here\n
  • \n
\n

\n You can refer to all variables that were specified in lines before the\n current one.\n

\n

\n

Target variables

\n

\n Every line in both Parser and Calculations puts the output value into a\n single JSON object.\n

\n
\n \n \n Parser \n \n\n \n add\n \n\n \n \n
\n {{ parserElementBitRanges[i]?.min }} -\n {{ parserElementBitRanges[i]?.max }}\n \n Bits\n \n \n Bits can only contain numbers\n \n \n
\n \n Type\n \n Int\n Boolean\n String\n Float\n Hexadecimal\n \n \n
\n \n Little\n \n \n Signed\n \n \n \n Ones Complement\n Twos Complement\n \n \n
\n
\n \n Target variable\n \n \n Target variable can only contain numbers, lower case letters and\n underscores.\n \n \n {{\n 'Target variable name \"' +\n parserElementForm.get('target').getError('alreadyExist') +\n '\" already exists.'\n }}\n \n \n \n \n delete\n \n
\n
\n \n \n \n \n \n \n Calculations\n \n \n Single Parser Conditions\n \n \n

\n \"port\" can be used as a variable in the parser condition\n

\n \n add\n \n\n \n \n
\n \n Formula\n Condition\n \n \n Can only contain numbers, lower case letters, underscores and\n basic arithmetic symbols (* / + -).\n \n \n Not a valid formula\n \n\n \n {{\n 'Unknown variable(s): ' +\n calculationForm.get('formula').getError('unknownVariables')\n }}\n \n \n \n Target parser\n Target variable\n \n \n Target variable can only contain numbers, lower case letters and\n underscores.\n \n \n {{\n 'Target variable name \"' +\n calculationForm.get('target').getError('alreadyExist') +\n '\" already exists.'\n }}\n \n \n \n \n
\n \n
\n \n
\n \n \n Output definition \n \n\n
\n
\n

\n Assigning types and units to variables is necessary if you want to\n index measurement values in time series databases and visualize with\n dashboarding tools.\n

\n

\n The list below is filled with target variables from both the Parser\n and Calculations section.\n

\n

\n You can remove variables and their corresponding unit field from the\n outputted message by deselecting them in the \"Output Selection\"\n column.\n

\n
\n
\n \n preview\n \n
\n
\n

\n \n Order\n Target variable\n Type\n Unit\n Business Field Selection\n \n

\n Sorry, nothing to display here.\n

\n \n \n
\n \n expand_less\n \n \n expand_more\n \n
\n {{ varValue.order }}\n \n \n {{ varValue.name }}\n \n \n \n Type\n \n \n {{ type }}\n \n \n \n \n \n \n Unit\n \n \n {{ unit.sign }} - {{ unit.detail }}\n \n \n \n \n \n \n Value\n \n \n Unit\n \n \n \n \n \n\n\n\n
{{ jsonExample | json }}
\n
\n","import {\n Component,\n EventEmitter,\n Input,\n OnInit,\n Output,\n TemplateRef,\n} from '@angular/core';\nimport { NonNullableFormBuilder, Validators } from '@angular/forms';\nimport { MatDialog } from '@angular/material/dialog';\nimport { distinctUntilChanged, map, tap } from 'rxjs/operators';\nimport {\n Calculation,\n DecodingConfiguration,\n Field,\n ParserElement,\n Variable,\n} from 'src/models/device-type.models';\nimport { ParserCreationService } from './../parser-creation.service';\n\nimport { UntilDestroy, untilDestroyed } from '@ngneat/until-destroy';\nimport { BehaviorSubject, Observable } from 'rxjs';\nimport { getExampleValue, measurementTypes } from '../parser-creation-helper';\nimport { formulaValidator } from './formula-validator.directive';\nimport {\n variableAlreadyExistValidator,\n variablesValidator,\n} from './variables-validator.directive';\n@UntilDestroy()\n@Component({\n selector: 'app-single-parser-editor',\n templateUrl: './single-parser-editor.component.html',\n styleUrls: ['./single-parser-editor.component.scss'],\n})\nexport class SingleParserEditorComponent implements OnInit {\n @Input() config: DecodingConfiguration;\n @Input() configId: string;\n @Output() configModified = new EventEmitter();\n parserElementBitRanges: Array<{ max: number; min: number }> = [];\n form = this.fb.group({\n parserElements: this.fb.array([\n this.fb.group({} as Required),\n ]),\n calculations: this.fb.array([this.fb.group({} as Calculation)]),\n });\n\n variables$: BehaviorSubject = new BehaviorSubject(\n [] as Variable[],\n );\n\n variablesNames$: Observable;\n jsonExample;\n\n constructor(\n private fb: NonNullableFormBuilder,\n public dialog: MatDialog,\n public parserCreation: ParserCreationService,\n ) {\n this.form.controls.parserElements.clear();\n this.form.controls.calculations.clear();\n\n this.variablesNames$ = this.variables$.pipe(\n untilDestroyed(this),\n map((variables) => variables.map((variable) => variable.name)),\n distinctUntilChanged((prev, curr) => prev.join() === curr.join()),\n );\n }\n\n ngOnInit(): void {\n this.autoFillForm();\n this.handleFormValueChanges.subscribe();\n\n this.variablesNames$.subscribe(() => {\n for (const calculation of this.calculations.controls) {\n calculation.get('formula')?.updateValueAndValidity();\n }\n });\n }\n\n public emitConfig() {\n const variables = this.variables$.getValue(); // Access current value\n const config = { ...this.form.getRawValue(), variables: variables };\n this.configModified.emit(config);\n }\n\n private updateVariableProperty(\n variableName: string,\n property: T,\n value: Variable[T],\n ) {\n const variables = this.variables$.getValue();\n const variable = variables.find((v) => v.name === variableName)!;\n\n variable[property] = value;\n this.variables$.next([...variables]);\n this.emitConfig();\n }\n\n public updateVariableType(newType: string, variableName: string) {\n this.updateVariableProperty(variableName, 'measurementType', newType);\n }\n\n public updateVariableUnit(\n newUnit: { sign: string; type: string },\n variableName: string,\n ) {\n this.updateVariableProperty(variableName, 'unit', newUnit.sign);\n this.updateVariableProperty(variableName, 'type', newUnit.type);\n }\n\n public updateVariableBusinessField(selected: boolean, variableName: string) {\n this.updateVariableProperty(variableName, 'writeBusinessField', selected);\n }\n\n public updateVariableBusinessFieldUnit(\n selected: boolean,\n variableName: string,\n ) {\n this.updateVariableProperty(\n variableName,\n 'writeBusinessFieldUnit',\n selected,\n );\n }\n\n public getSelectedUnit(measurementType: string, unitSign: string) {\n return this.getMeasurementTypeUnits(measurementType).find(\n (unit) => unit.sign === unitSign,\n );\n }\n\n public get measurementTypeNames(): string[] {\n return Object.keys(measurementTypes);\n }\n\n public getMeasurementTypeUnits(\n type,\n ): Array<{ sign: string; detail: string; type: string }> {\n return measurementTypes[type] ?? [];\n }\n\n public get sortedVariableValues() {\n const variables = this.variables$.getValue();\n return Object.values(variables).sort((a, b) => a.order - b.order);\n }\n\n public swapVariableOrder(indexA: number, indexB: number) {\n const variables = this.variables$.getValue();\n const sortedVars = this.sortedVariableValues;\n\n if (\n indexA < 0 ||\n indexB < 0 ||\n indexA >= sortedVars.length ||\n indexB >= sortedVars.length\n ) {\n return; // Prevent out-of-bounds errors\n }\n const orderA = variables[indexA].order;\n const orderB = variables[indexB].order;\n variables[indexA].order = orderB;\n variables[indexB].order = orderA;\n\n this.variables$.next(variables.sort((a, b) => a.order - b.order));\n this.emitConfig();\n }\n\n public augmentVariableOrderAtIndex(index: number) {\n this.swapVariableOrder(index, index + 1);\n }\n\n public decreaseVariableOrderAtIndex(index: number) {\n this.swapVariableOrder(index, index - 1);\n }\n\n public get parserElements() {\n return this.form.controls.parserElements;\n }\n\n public addParserElement(pE?: ParserElement) {\n const parserElementForm = this.fb.group({\n bits: [\n pE?.bits ?? 8,\n [Validators.required, Validators.pattern('^[0-9]+$')],\n ],\n type: [pE?.type ?? 'int', Validators.required],\n target: [\n pE?.target ?? '',\n [Validators.required, Validators.pattern('^[0-9a-z_]+$')],\n [variableAlreadyExistValidator(this.variablesNames$)],\n ],\n littleEndian: [pE?.littleEndian ?? false],\n signed: [pE?.signed ?? false],\n signComplement: [pE?.signComplement ?? '1'],\n });\n this.parserElements.push(parserElementForm);\n }\n\n public onRemoveParserElement(index: number) {\n this.parserElements.removeAt(index);\n this.updateParserElementBitRanges();\n }\n\n public showLittle(value: { [key: string]: string }) {\n return value.type === 'float' || value.type === 'int';\n }\n\n public showSigned(value: { [key: string]: string }) {\n return value.type === 'int';\n }\n\n public showComplement(value: { [key: string]: string }) {\n return value.signed;\n }\n\n public get calculations() {\n return this.form.controls.calculations;\n }\n\n public addCalculation(cal?: Calculation) {\n const calculationForm = this.fb.group({\n formula: [\n cal?.formula ?? '',\n [Validators.required, formulaValidator],\n [variablesValidator(this.variablesNames$)],\n ],\n target: [\n cal?.target ?? '',\n [Validators.required, Validators.pattern('^[0-9a-z_]+$')],\n [variableAlreadyExistValidator(this.variablesNames$)],\n ],\n });\n\n this.calculations.push(calculationForm);\n }\n\n public onRemoveCalculation(index: number) {\n this.calculations.removeAt(index);\n }\n\n private get handleFormValueChanges() {\n return this.form.valueChanges.pipe(\n tap(() => {\n this.updateParserElementBitRanges();\n }),\n map(() => this.newVariableNames),\n tap((newVarNames) => {\n this.updateVariables(newVarNames);\n }),\n tap(() => this.emitConfig()),\n );\n }\n\n private updateParserElementBitRanges() {\n const ranges: Array<{ max: number; min: number }> = [];\n let min = 0;\n let max = -1;\n\n this.parserElements.controls.forEach((ctrl, i, arr) => {\n if (i !== 0) min = ranges[i - 1].min + arr[i - 1].getRawValue().bits;\n max = max + ctrl.getRawValue().bits;\n ranges.push({ max: max, min: min });\n });\n\n this.parserElementBitRanges = ranges;\n }\n\n private get newVariableNames(): string[] {\n return [\n ...this.parserElements.getRawValue().map((pE) => pE.target),\n ...this.calculations.getRawValue().map((cal) => cal.target),\n ].filter((name) => !!name);\n }\n private updateVariables(varNames: string[]): void {\n const currentVariables = this.variables$.getValue();\n const existingNames = new Set(currentVariables.map((v) => v.name));\n\n const filteredVariables = currentVariables.filter(\n (v) => varNames.includes(v.name) || v.fromSource,\n );\n\n const newVariables = varNames\n .filter((varName) => !existingNames.has(varName))\n .map((varName, index) => ({\n name: varName,\n type: '',\n measurementType: '',\n unit: '',\n order: filteredVariables.length + index + 1,\n writeBusinessFieldUnit: true,\n writeBusinessField: true,\n }));\n\n const updatedVariables = [...filteredVariables, ...newVariables].map(\n (v, index) => ({ ...v, order: index + 1 }),\n );\n\n this.variables$.next(updatedVariables);\n }\n\n private autoFillForm() {\n this.config.parserElements.length > 0\n ? this.config.parserElements.forEach((pE) => this.addParserElement(pE))\n : this.addParserElement();\n\n this.config.calculations.length > 0\n ? this.config.calculations.forEach((cal) => this.addCalculation(cal))\n : this.addCalculation();\n\n this.variables$.next(this.config.variables);\n }\n\n get businessFields(): Field[] {\n const businessFields: Field[] = [];\n this.sortedVariableValues.forEach((variable: Variable) => {\n if (variable.writeBusinessField)\n businessFields.push(this.mapVariableToBusinessField(variable));\n if (variable.writeBusinessFieldUnit)\n businessFields.push(this.mapVariableToUnitBusinessField(variable));\n });\n return businessFields;\n }\n\n get buildJsonExample() {\n const res = {};\n this.businessFields.forEach(\n (field) => (res[field.name] = getExampleValue(field.type)),\n );\n return res;\n }\n\n mapVariableToBusinessField(variable: Variable): Field {\n return {\n name: variable.name,\n type: variable.type as 'number' | 'string' | 'boolean',\n };\n }\n\n mapVariableToUnitBusinessField(variable: Variable): Field {\n return { name: variable.name + '_unit', type: 'string' };\n }\n\n openJsonPreview(templateRef: TemplateRef) {\n this.jsonExample = this.buildJsonExample;\n this.dialog\n .open(templateRef)\n .afterClosed()\n .subscribe(() => (this.jsonExample = undefined));\n }\n}\n","import { Component, Inject } from '@angular/core';\nimport { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog';\nimport { filter, first, tap } from 'rxjs/operators';\nimport { DecodingConfiguration } from 'src/models/device-type.models';\nimport { ParserCreationService } from '../../parser-creation.service';\n\n@Component({\n selector: 'app-single-parser-dialog',\n templateUrl: './single-parser-dialog.component.html',\n})\nexport class SingleParserDialogComponent {\n private modifiedConfig = this.data.config;\n configValid = true;\n\n constructor(\n public dialogRef: MatDialogRef,\n @Inject(MAT_DIALOG_DATA)\n public data: { id: string; config: DecodingConfiguration },\n public parserCreation: ParserCreationService,\n ) {\n dialogRef\n .afterClosed()\n .pipe(\n filter((v) => !!v),\n tap(() =>\n this.parserCreation.setHexBlueprintConfig(\n this.data.id,\n this.modifiedConfig,\n ),\n ),\n first(),\n )\n .subscribe();\n }\n getTitle(): string {\n switch (this.data.id) {\n case '_switch':\n return 'Edit the conditions for parser selection';\n case '_default':\n return 'Edit the default parser';\n default:\n return `Edit the single parser: ${this.data.id}`;\n }\n }\n\n public configModified(config: DecodingConfiguration): void {\n this.modifiedConfig = config;\n }\n}\n","

\n {{ getTitle() }}\n

\n
\n \n
\n
\n \n \n Confirm\n \n
\n","
\n
\n \n Edit switch parser\n \n \n Edit default parser\n \n
\n \n \n Single parser list \n \n
\n \n

{{ sp.target }}

\n

\n Condition:\n {{ sp.formula }}\n

\n
\n
\n \n \n\n","import { Component } from '@angular/core';\nimport { FormBuilder } from '@angular/forms';\nimport { MatDialog } from '@angular/material/dialog';\nimport { DevicesService } from 'src/app/services/http/devices.service';\nimport { Calculation, Variable } from 'src/models/device-type.models';\nimport { ParserCreationService } from './../parser-creation.service';\nimport { SingleParserDialogComponent } from './single-parser-dialog/single-parser-dialog.component';\n\n@Component({\n selector: 'app-multi-parser-editor',\n templateUrl: './multi-parser-editor.component.html',\n styleUrls: ['./multi-parser-editor.component.scss'],\n})\nexport class MultiParserEditorComponent {\n bluePrint = this.parserCreation.hexBlueprint;\n form = this.fb.group({\n parserElements: this.fb.array([]),\n calculations: this.fb.array([]),\n });\n variables: Variable[] = [];\n\n constructor(\n private fb: FormBuilder,\n public dialog: MatDialog,\n public deviceHttp: DevicesService,\n public parserCreation: ParserCreationService,\n ) {}\n\n openSingleEditorDialog(id: string) {\n this.dialog.open(SingleParserDialogComponent, {\n data: {\n id: id,\n config: this.bluePrint!.config.find(\n (decoderConfig) => decoderConfig.name === id,\n )?.value,\n },\n });\n }\n\n public getSwitchCalculations(): Calculation[] {\n return this.parserCreation.singleParserList.find(\n (decoderConfig) => decoderConfig.name === '_switch',\n )!.value.calculations;\n }\n}\n","
\n \n \n clear\n \n
\n\n
\n
\n

Looks like your input is not valid JSON!

\n error_outline\n
\n
\n

Please paste JSON to parse attributes!

\n input\n
\n
\n

Your JSON has been parsed

\n done\n
\n
\n","import { Component, EventEmitter, Input, OnInit, Output } from '@angular/core';\nimport { UntypedFormControl } from '@angular/forms';\nimport { filter, map, tap } from 'rxjs/operators';\n\nimport { JsonInputResult } from 'src/models/device-type.models';\nimport { supportedValueTypes } from '../../parser-creation-helper';\nimport { ParserCreationService } from '../../parser-creation.service';\n\n@Component({\n selector: 'app-json-input',\n templateUrl: './json-input.component.html',\n styleUrls: ['./json-input.component.scss'],\n})\nexport class JsonInputComponent implements OnInit {\n @Input() messageJson: string;\n @Output() fieldsParsed = new EventEmitter();\n input = new UntypedFormControl('');\n isValidJson = true;\n\n constructor(private parserCreation: ParserCreationService) {}\n\n ngOnInit(): void {\n this.input.setValue(this.messageJson || '');\n this.input.valueChanges\n .pipe(\n filter((input) => this.isValidJSON(input)),\n map((input) => ({\n jsonSample: input,\n fields: this.parserCreation\n .mapJsonToMessageFields(JSON.parse(input))\n .filter((field) => supportedValueTypes.includes(field.type)),\n })),\n tap((result) => this.fieldsParsed.emit(result)),\n )\n .subscribe();\n }\n\n isValidJSON(input: string): boolean {\n let parsedJson;\n try {\n parsedJson = JSON.parse(input);\n } catch {\n this.isValidJson = false;\n this.fieldsParsed.emit({ jsonSample: '', fields: [] });\n return false;\n }\n const recursive = (obj: null | object, path = '') => {\n if (obj) {\n const keys = Object.keys(obj);\n keys.forEach((key) => {\n const newPath = path.length ? `${path}/${key}` : key;\n if (typeof obj[key] === 'object' && !Array.isArray(obj[key])) {\n recursive(obj[key], newPath);\n }\n });\n }\n };\n this.isValidJson = true;\n recursive(parsedJson);\n return this.isValidJson;\n }\n\n clearInput() {\n this.input.setValue('');\n }\n}\n","import { FormGroupDirective, NgForm, UntypedFormControl } from '@angular/forms';\nimport { ErrorStateMatcher } from '@angular/material/core';\n\nexport class CustomErrorStateMatcher implements ErrorStateMatcher {\n isErrorState(\n control: UntypedFormControl | null,\n form: FormGroupDirective | NgForm | null,\n ): boolean {\n const isSubmitted = form && form.submitted;\n return !!(\n control &&\n control.invalid &&\n (control.dirty || control.touched || isSubmitted)\n );\n }\n}\n","import { AfterContentInit, Directive, ElementRef, Input } from '@angular/core';\n\n@Directive({\n // eslint-disable-next-line @angular-eslint/directive-selector\n selector: '[autoFocus]',\n})\nexport class AutofocusDirective implements AfterContentInit {\n @Input() public appAutoFocus: boolean;\n\n public constructor(private el: ElementRef) {}\n\n public ngAfterContentInit() {\n setTimeout(() => {\n this.el.nativeElement.focus();\n });\n }\n}\n","
\n

{{ field.name }}

\n
\n\n
\n
\n\n\n
\n clear\n\n\n \n \n \n \n {{ input.value }}\n \n \n {{ opt.keyName }}\n \n \n \n Allowed special characters: / - _\n \n \n This field is can't be left empty!\n \n \n
\n \n edit\n save\n \n \n
\n\n","import { Component, EventEmitter, Input, OnInit, Output } from '@angular/core';\nimport { UntypedFormControl, Validators } from '@angular/forms';\nimport { filter, tap } from 'rxjs/operators';\nimport { CustomErrorStateMatcher } from 'src/app/services/util/formErrorStateMatcher';\nimport {\n InputMessageField,\n MandatoryMessageField,\n} from 'src/models/device-type.models';\n\n@Component({\n selector: 'app-message-field-mapping',\n templateUrl: './message-field-mapping.component.html',\n styleUrls: ['./message-field-mapping.component.scss'],\n})\nexport class MessageFieldMappingComponent implements OnInit {\n @Input() field: InputMessageField;\n @Input() selectValues: MandatoryMessageField[];\n @Output() valueChanged = new EventEmitter();\n matcher = new CustomErrorStateMatcher();\n input: UntypedFormControl;\n select = true;\n\n constructor() {}\n\n get selectOptions(): MandatoryMessageField[] {\n return this.selectValues.filter(\n (field) => !field.valid && field.allowedTypes.includes(this.field.type),\n );\n }\n\n ngOnInit(): void {\n this.input = new UntypedFormControl(\n { value: this.field.outputName, disabled: this.field.deleted },\n [Validators.required, Validators.pattern(/^[a-zA-Z\\d-_/]+$/)],\n );\n\n this.input.valueChanges\n .pipe(\n filter(() => this.select && this.input.enabled),\n tap(() => this.emitField()),\n )\n .subscribe();\n }\n\n verifyMapping(): boolean {\n return this.input.valid && !!this.field.deleted;\n }\n\n emitField() {\n this.valueChanged.emit({\n ...this.field,\n outputName: this.input.value,\n deleted: this.verifyMapping(),\n });\n }\n\n toggleDeleted() {\n this.field.deleted = !this.field.deleted;\n this.emitField();\n this.input.valid && !this.input.disabled\n ? this.input.disable()\n : this.input.enable();\n }\n\n setSelect(newState: boolean) {\n this.select = newState;\n if (newState) {\n this.emitField();\n }\n }\n}\n","
\n \n

{{ field.label }}

\n

Mandatory

\n

Recommended

\n \n
\n \n

{{ field.description }}

\n \n \n\n\n\n done\n error_outline\n\n","import { Component, Input } from '@angular/core';\nimport { MandatoryMessageField } from 'src/models/device-type.models';\n\n@Component({\n selector: 'app-field-hint',\n templateUrl: './field-hint.component.html',\n styleUrls: ['./field-hint.component.scss'],\n})\nexport class FieldHintComponent {\n @Input() field: MandatoryMessageField;\n description = false;\n\n toggleDescription() {\n this.description = !this.description;\n }\n}\n","
\n
\n
\n

Source origin

\n

Paste Payload JSON to parse attributes

\n
\n
\n

Source destination / Mapping summary

\n

\n This build can be mapped to a origin field. Select it using the select\n button \"▼\"\n

\n
\n
\n \n
\n
\n \n
\n
\n\n
\n \n
\n
\n","import { Component, OnInit } from '@angular/core';\nimport { UntypedFormBuilder } from '@angular/forms';\nimport { MatDialog } from '@angular/material/dialog';\nimport {\n InputMessageField,\n JsonInputResult,\n} from 'src/models/device-type.models';\nimport { mandatoryFields } from '../parser-creation-helper';\nimport { ParserCreationService } from '../parser-creation.service';\n\n@Component({\n selector: 'app-json-parser-editor',\n templateUrl: './json-parser-editor.component.html',\n styleUrls: ['./json-parser-editor.component.scss'],\n})\nexport class JsonParserEditorComponent implements OnInit {\n mappingValidator = mandatoryFields;\n parserForm = this.fb.group({\n dataFields: [\n this.parserCreation.reconstructMapping(\n this.parserCreation.jsonBlueprint()?.config.jsonSample ?? undefined,\n this.parserCreation.jsonBlueprint()?.config.variables,\n ),\n ],\n });\n\n constructor(\n private fb: UntypedFormBuilder,\n public dialog: MatDialog,\n public parserCreation: ParserCreationService,\n ) {}\n\n ngOnInit(): void {\n if (this.parserCreation.jsonBlueprint()) {\n this.updateMappingValidation(\n this.parserCreation.jsonBlueprint()!.config.variables!,\n );\n }\n }\n\n public fieldsParsed(parsingResult: JsonInputResult): void {\n this.updateMappingValidation(parsingResult.fields);\n this.parserForm.controls.dataFields.setValue(parsingResult.fields);\n this.parserCreation.setJsonBlueprintConfig({\n variables: parsingResult.fields,\n jsonSample: parsingResult.jsonSample,\n });\n }\n\n public updateMappingValidation(mappedFields: InputMessageField[]) {\n let mandatory = this.mappingValidator;\n const outputs = mappedFields\n .filter((field) => !field.duplicateOutput && !field.deleted)\n .map((field) => field.outputName);\n\n mandatory = mandatory.map((field) => ({\n ...field,\n valid: outputs.includes(field.keyName),\n }));\n\n this.mappingValidator = mandatory;\n }\n\n public fieldChanged(field: InputMessageField, index: number): void {\n const dataFieldsControl = this.parserForm.controls.dataFields;\n dataFieldsControl.value[index] = field;\n this.updateMappingValidation(dataFieldsControl.value);\n this.parserCreation.setJsonBlueprintConfig({\n ...this.parserCreation.jsonBlueprint()?.config,\n variables: dataFieldsControl.value,\n });\n }\n}\n","
\n
\n

{{ parserType || 'Not defined' }}

\n
\n \n save\n \n \n autorenew\n \n
\n \n
\n

This device type is a built-in ressource, it can't be modified

\n
\n \n
\n \n
\n
\n \n
\n
\n
\n

\n JSON passthrough transfers an incoming JSON object without modifying it.\n It is very flexible but less stable as the JSON mapping. This parsing\n method should only be used if you are not aware of the format of the\n incoming message or if the format can change.\n

\n
\n
\n
\n\n\n
{{ jsonExample | json }}
\n
\n","import { Component, Input, OnInit } from '@angular/core';\nimport {\n Calculation,\n DecoderType,\n DecodingConfiguration,\n DeviceTypeDTO,\n} from 'src/models/device-type.models';\n\nimport { MatDialog } from '@angular/material/dialog';\nimport { MatSnackBar } from '@angular/material/snack-bar';\nimport { SymbolNode, parse } from 'mathjs';\nimport { filter, take, tap } from 'rxjs/operators';\nimport { ConfirmationDialogComponent } from 'src/app/components/confirmation-dialog/confirmation-dialog.component';\nimport { DataLoaderService } from 'src/app/services/state/data/data-loader.service';\nimport { ParserCreationService } from './parser-creation.service';\n\n@Component({\n selector: 'app-parser-tab',\n templateUrl: './parser-tab.component.html',\n styleUrls: ['./parser-tab.component.scss'],\n})\nexport class ParserTabComponent implements OnInit {\n @Input() model: DeviceTypeDTO;\n\n constructor(\n public dialog: MatDialog,\n public parserCreation: ParserCreationService,\n public dataLoader: DataLoaderService,\n private snackBar: MatSnackBar,\n ) {}\n\n ngOnInit(): void {\n if (this.model.decoderBlueprint) {\n this.parserCreation.setBlueprint(this.model.decoderBlueprint);\n }\n }\n\n get parserType() {\n const hexBP = this.parserCreation.hexBlueprint;\n const jsonBP = this.parserCreation.jsonBlueprint();\n if (!this.model.createdByApi) {\n return 'Built in';\n } else if (this.model.source.code === 'iot_core') {\n if (jsonBP && jsonBP.type === 'passthrough') {\n return 'JSON Passthrough';\n } else if (jsonBP && jsonBP.type === 'json') {\n return 'JSON Mapping';\n } else {\n return undefined;\n }\n } else if (this.model.source.code === 'firefly') {\n if (hexBP && hexBP.type === 'multi') {\n return 'Multi Parser';\n } else if (hexBP && hexBP.type === 'single') {\n return 'Single Parser';\n } else {\n return undefined;\n }\n }\n }\n\n switchParserType(type: DecoderType) {\n this.parserCreation.setBlueprintType(type);\n }\n\n resetParserType(): void {\n this.dialog\n .open(ConfirmationDialogComponent, {\n data: {\n html: `You are about to switch parser type. The current parser configuration will be lost. Do you want to continue?`,\n },\n })\n .afterClosed()\n .pipe(\n filter((v) => !!v),\n tap(() => {\n this.parserCreation.setBlueprint();\n }),\n )\n .subscribe();\n }\n\n onSave() {\n const decodingInfo =\n this.model.source.code === 'firefly'\n ? this.parserCreation.hexBlueprint\n : this.parserCreation.jsonBlueprint(true);\n\n if (this.model.source.code === 'firefly') {\n const unknownVariables = this.getUnknownVariablesInBlueprint();\n if (unknownVariables.length > 0) {\n this.snackBar.open(\n `Found unknown variables in calculations: ${unknownVariables.join(', ')}`,\n 'Close',\n );\n return;\n }\n }\n\n return this.dataLoader\n .updateDeviceTypeCodec(this.model.code, decodingInfo!)\n .pipe(\n take(1),\n tap((res) => (this.model = res)),\n tap(() => this.snackBar.open('Parser updated', 'Close')),\n )\n .subscribe();\n }\n\n private getUnknownVariablesInBlueprint(): string[] {\n return Object.values(this.parserCreation.hexBlueprint?.config ?? {})\n .map((parser) => this.getUnknownVariablesInParser(parser.value))\n .reduce((acc, curr) => acc.concat(curr), []); // for some reason we don't have access to .flat()\n }\n\n private getUnknownVariablesInParser(\n parser?: DecodingConfiguration,\n ): string[] {\n if (!parser) {\n return [];\n }\n const variableNames = parser.variables\n .map((variable) => variable.name)\n .concat('port');\n const unknownVariables: string[] = [];\n for (const calculation of parser.calculations) {\n unknownVariables.push(\n ...this.getUnknownVariablesInCalculation(calculation, variableNames),\n );\n }\n return unknownVariables;\n }\n\n private getUnknownVariablesInCalculation(\n calculation: Calculation,\n variableNames: string[],\n ): string[] {\n const mathNode = parse(calculation.formula);\n const calculationVariables: string[] = [];\n mathNode.traverse((node) => {\n if (node instanceof SymbolNode) {\n calculationVariables.push(node.name);\n }\n });\n return calculationVariables.filter(\n (calculationVariable) =>\n !variableNames.includes(calculationVariable) ||\n calculationVariable === calculation.target,\n );\n }\n\n public getSingleParser() {\n return this.parserCreation.hexBlueprint?.config.find(\n (decoderConfig) => decoderConfig.name === '_single',\n )?.value;\n }\n}\n","
\n \n
\n

{{ model?.name }}

\n
\n
\n
\n
\n \n edit\n \n \n do_not_disturb_on\n do_not_disturb_off\n \n \n delete\n \n \n close\n \n
\n
\n
\n
\n \n \n
\n
\n
\n menu_book\n
\n
\n

Description

\n

{{ model?.description || noInfoMsg }}

\n
\n
\n
\n
\n factory\n
\n
\n

Manufacturer Information

\n

{{ model?.brand.name || noInfoMsg }}

\n
\n
\n
\n
\n construction\n
\n
\n

Installation Notes

\n

{{ model?.installation || noInfoMsg }}

\n
\n
\n
\n
\n stars\n
\n
\n

Highlights

\n

{{ model?.highlights || noInfoMsg }}

\n
\n
\n
\n
\n build\n
\n
\n

Technical Specifications

\n
\n
\n
Configuration
\n

{{ model?.configuration || '-' }}

\n
\n
\n
Connectivity
\n

{{ model?.connectivity || '-' }}

\n
\n
\n
Frequency
\n

{{ model?.frequency || '-' }}

\n
\n
\n
Security
\n

{{ model?.security || '-' }}

\n
\n
\n
Dimensions
\n

{{ model?.dimensions || '-' }}

\n
\n
\n
Weight
\n

{{ model?.weight || '-' }}

\n
\n
\n
Battery
\n

{{ model?.battery || '-' }}

\n
\n
\n
Battery Life
\n

{{ model?.batteryLife || '-' }}

\n
\n
\n
\n
\n
\n
\n \n \n \n
\n
\n","import { Component } from '@angular/core';\nimport { MatDialog } from '@angular/material/dialog';\nimport { ActivatedRoute, Router } from '@angular/router';\nimport { filter, first, switchMap, tap } from 'rxjs/operators';\nimport { ConfirmationDialogComponent } from 'src/app/components/confirmation-dialog/confirmation-dialog.component';\nimport { DevicesService } from 'src/app/services/http/devices.service';\nimport { AuthService } from 'src/app/services/state/auth/auth.service';\nimport { DataLoaderService } from 'src/app/services/state/data/data-loader.service';\nimport { DataStoreService } from 'src/app/services/state/data/data-store.service';\nimport { DeviceTypeDTO, DeviceTypeInfo } from 'src/models/device-type.models';\nimport { ModelCreationComponent } from '../model-creation/model-creation.component';\nimport { ParserCreationService } from './parser-tab/parser-creation.service';\n\n@Component({\n selector: 'app-model-detail',\n templateUrl: './model-detail.component.html',\n styleUrls: ['./model-detail.component.scss'],\n})\nexport class ModelDetailComponent {\n model: DeviceTypeDTO;\n noInfoMsg = 'No information has been entered yet.';\n constructor(\n private route: ActivatedRoute,\n private deviceHttp: DevicesService,\n private data: DataStoreService,\n public auth: AuthService,\n public dialog: MatDialog,\n public router: Router,\n public dataLoader: DataLoaderService,\n public parserCreation: ParserCreationService,\n ) {\n this._loadData();\n }\n\n _loadData() {\n if (this.route.snapshot.paramMap.get('id')) {\n this.deviceHttp\n .getDeviceTypeByID(\n this.route.snapshot.paramMap.get('id') as string,\n true,\n )\n .pipe(\n first(),\n filter((v) => !!v),\n )\n .subscribe((deviceType) => {\n if (deviceType.decoderBlueprint) {\n this.parserCreation.setBlueprint(deviceType.decoderBlueprint);\n } else {\n this.parserCreation.resetBlueprints();\n }\n this.model = deviceType;\n });\n }\n }\n\n public onEdit() {\n this.dialog\n .open(ModelCreationComponent, { data: this.model })\n .afterClosed()\n .pipe(\n filter((res) => !!res),\n first(),\n switchMap((res) =>\n this.dataLoader.updateDeviceType(this.model.code, {\n ...res.info,\n image_file: res.image,\n } as DeviceTypeInfo),\n ),\n tap((updatedModel) => {\n this.model = updatedModel;\n }),\n )\n .subscribe();\n }\n\n delete() {\n this.dialog\n .open(ConfirmationDialogComponent, {\n data: {\n html: `You are about to delete this device type. Do you want to continue?`,\n },\n })\n .afterClosed()\n .pipe(\n filter((v) => !!v),\n switchMap(() => this.deviceHttp.deleteDeviceType(this.model.code)),\n tap(() => this.data.deleteDeviceType(this.model.code)),\n tap(() => this.router.navigateByUrl('/home/catalogue')),\n )\n .subscribe();\n }\n\n toggleDisable() {\n this.dataLoader\n .changeDeviceTypeActiveState(this.model.code, !this.model.enabled)\n .subscribe((enabled) => (this.model.enabled = enabled));\n }\n\n close() {\n this.router.navigate(['../..'], {\n relativeTo: this.route,\n });\n }\n}\n","import {\n AbstractControl,\n AsyncValidatorFn,\n ValidationErrors,\n} from '@angular/forms';\nimport { Observable } from 'rxjs';\nimport { map } from 'rxjs/operators';\nimport { DeviceManagementService } from './device-management.service';\n\nexport class DeviceIdValidator {\n static createValidator(\n deviceManagement: DeviceManagementService,\n ): AsyncValidatorFn {\n return (control: AbstractControl): Observable => {\n return deviceManagement\n .checkIfDeviceExists(control.value)\n .pipe(\n map((result: boolean) =>\n result ? { deviceAlreadyExists: true } : null,\n ),\n );\n };\n }\n}\n","import { UntypedFormControl, UntypedFormGroup } from '@angular/forms';\nimport { LatLng } from 'leaflet';\n\nexport abstract class DeviceCreation {\n public form: UntypedFormGroup;\n public nestedFormGroups = {\n general: 'general',\n technical: 'technical',\n position: 'position',\n metadata: 'metaData',\n };\n\n public get generalForm(): UntypedFormGroup {\n return this.form.get(this.nestedFormGroups.general) as UntypedFormGroup;\n }\n\n public get technicalForm(): UntypedFormGroup {\n return this.form.get(this.nestedFormGroups.technical) as UntypedFormGroup;\n }\n\n public get positionForm(): UntypedFormGroup {\n return this.form.get(this.nestedFormGroups.position) as UntypedFormGroup;\n }\n\n public get metadataForm(): UntypedFormGroup {\n return this.form.get(this.nestedFormGroups.metadata) as UntypedFormGroup;\n }\n\n public get descriptionFormControl(): UntypedFormControl {\n return this.form.get('description') as UntypedFormControl;\n }\n\n constructor() {}\n\n public onSetPosition(latLng: LatLng) {\n this.positionForm.controls.lat.setValue(latLng.lat);\n this.positionForm.controls.lng.setValue(latLng.lng);\n }\n\n public onMetadataChange(form: UntypedFormGroup): void {\n this.form.controls.metaData = form;\n this.form.updateValueAndValidity();\n }\n}\n","import { WizardStep } from 'src/models/app-routing.models';\n\nconst GENERAL_INFORMATION_TEXT = 'General information';\nconst POSITION_TEXT = 'Position';\nconst TECHNICAL_INFORMATION_TEXT = 'Technical information';\nconst METADATA_TEXT = 'Metadata';\n\nexport const fireflyCreationSteps: Pick[] = [\n { title: GENERAL_INFORMATION_TEXT },\n { title: TECHNICAL_INFORMATION_TEXT },\n { title: POSITION_TEXT },\n { title: METADATA_TEXT },\n];\n\nexport const defaultCreationSteps: Pick[] = [\n { title: GENERAL_INFORMATION_TEXT },\n { title: POSITION_TEXT },\n { title: METADATA_TEXT },\n];\n\nexport const iotcoreCreationSteps: Pick[] = [\n { title: GENERAL_INFORMATION_TEXT },\n { title: TECHNICAL_INFORMATION_TEXT },\n { title: POSITION_TEXT },\n { title: METADATA_TEXT },\n];\n","import { Injectable } from '@angular/core';\nimport { UntypedFormControl } from '@angular/forms';\nimport { BehaviorSubject, combineLatest, Observable } from 'rxjs';\nimport { debounceTime, map, shareReplay, startWith, tap } from 'rxjs/operators';\nimport { DevicesService } from 'src/app/services/http/devices.service';\nimport { HierarchyNode } from 'src/models/device-hierarchy.models';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class DeviceHierarchyStoreService {\n private readonly _deviceHierarchyTree$ = new BehaviorSubject(\n [] as HierarchyNode[],\n );\n\n // -------------- SEARCH FEATURE --------------\n\n public searchControl = new UntypedFormControl('');\n\n private _searchControlChanges = this.searchControl.valueChanges.pipe(\n startWith(''),\n debounceTime(250),\n );\n\n // Options to provide to the autocomplete\n private _searchOptions = new BehaviorSubject([]);\n // Mapper used to have great performances on the search\n private _searchMapper: HierarchyNodeSearchMapper = {};\n\n // Filtered nodes, resulting from the mapper and the search\n public filteredHierarchyTree$ = combineLatest([\n this.deviceHierarchyTree$.pipe(\n tap((nodes) =>\n this._createMapperAndExtractNodeNamesForQuickSearch(nodes),\n ),\n ),\n this._searchControlChanges,\n ]).pipe(\n map(([nodes, search]) => this._filterNodesBySearch(search, nodes)),\n shareReplay(1),\n );\n\n // Filtered autocomplete options according to what's already typed\n public searchOptions$ = combineLatest([\n this._searchOptions.asObservable(),\n this._searchControlChanges,\n ]).pipe(\n map(([options, search]) =>\n options.filter((option) =>\n option.toLocaleLowerCase().includes(search.toLocaleLowerCase()),\n ),\n ),\n );\n\n // ----------------------------\n\n constructor(private http: DevicesService) {}\n\n public get deviceHierarchyTree$(): Observable {\n return this._deviceHierarchyTree$.asObservable();\n }\n\n public setDeviceHierarchyTree(hierarchyTree: HierarchyNode[]): void {\n this._deviceHierarchyTree$.next(hierarchyTree);\n }\n\n public loadDeviceHierarchy(): Observable {\n return this.http.getDeviceHierarchyTree().pipe(\n map((tree) => this.recursiveTreeSort(tree)),\n tap((tree) => this.setDeviceHierarchyTree(tree)),\n );\n }\n\n public recursiveTreeSort(tree: HierarchyNode[]): HierarchyNode[] {\n const recursive = (branch: HierarchyNode) => {\n branch.children = [\n ...this.getSortedFolders(branch.children),\n ...this.getSortedDevices(branch.children),\n ];\n branch.children.map((child) => recursive(child));\n return branch;\n };\n return this.getSortedFolders(tree).map((branch) => recursive(branch));\n }\n\n public getSortedFolders(nodes: HierarchyNode[]): HierarchyNode[] {\n return nodes\n .filter((node) => !node.isDevice)\n .sort((node1, node2) => node1.name.localeCompare(node2.name));\n }\n\n public getSortedDevices(nodes: HierarchyNode[]): HierarchyNode[] {\n return nodes\n .filter((node) => node.isDevice)\n .sort((node1, node2) => node1.name.localeCompare(node2.name));\n }\n\n public updateNode(node: HierarchyNode): void {\n const hierarchy = this._deviceHierarchyTree$.value;\n\n const recursive = (branch: HierarchyNode) => {\n if (branch.id === node.id) {\n branch = { ...node };\n } else if (branch.children) {\n branch.children.forEach((child) => recursive(child));\n }\n };\n hierarchy.forEach((node) => recursive(node));\n this._deviceHierarchyTree$.next(hierarchy);\n }\n\n public getPathForNode(\n node: HierarchyNode,\n hierarchy = this._deviceHierarchyTree$.value,\n ): string {\n let path = '';\n const recursive = (branch: HierarchyNode, newPath = '/') => {\n if (branch === node) {\n path = newPath + node.id;\n } else if (branch.children) {\n newPath += branch.id + '/';\n branch.children.forEach((child) => recursive(child, newPath));\n }\n };\n\n hierarchy.forEach((branch) => {\n recursive(branch);\n });\n\n return path;\n }\n\n public getNodesForPath(\n path: string,\n hierarchy = this._deviceHierarchyTree$.value,\n ): HierarchyNode[] {\n const nodeIds = path.split('/').slice(2);\n const site = hierarchy.find((branch) => branch.id === path.split('/')[1]);\n const nodes: HierarchyNode[] = [];\n\n if (site) {\n nodes.push(site);\n nodeIds.forEach((id) => {\n const node = nodes[nodes.length - 1].children.find(\n (child) => child.id === id,\n );\n if (node) {\n nodes.push(node);\n }\n });\n }\n return nodes;\n }\n\n public getSelectedNodeForPath(\n path: string,\n hierarchy = this._deviceHierarchyTree$.value,\n ): HierarchyNode {\n const nodes = this.getNodesForPath(path, hierarchy);\n return nodes[nodes.length - 1];\n }\n\n /**\n * Search parameters creation.\n * Creates both the mapper and the autocomplete options.\n *\n * Autocomplete options are a list of node names.\n *\n * Mapper is an object of the following form :\n * ```\n * {\n * \"nodeName\": [\n * [rootNode, subRootNode, subsubRootNode, ...],\n * ...\n * ]\n * }\n * ```\n *\n * Thanks to this, the search is low-performance cost.\n *\n * For the use of the mapper, see the other function below\n *\n * @see {@link _filterNodesBySearch}\n *\n */\n private _createMapperAndExtractNodeNamesForQuickSearch(\n hierarchy: HierarchyNode[],\n ) {\n const mapper: HierarchyNodeSearchMapper = {};\n const options: string[] = [];\n\n const recursiveParser = (\n currentNode: HierarchyNode,\n parentNodes: HierarchyNode[],\n ) => {\n currentNode.name && options.push(currentNode.name);\n currentNode.isDevice && options.push(currentNode.id.toString());\n\n parentNodes.push({ ...currentNode, children: [...currentNode.children] });\n\n if (!mapper[currentNode.name]) mapper[currentNode.name] = [parentNodes];\n else mapper[currentNode.name].push(parentNodes);\n\n if (currentNode.isDevice && !mapper[currentNode.id]) {\n mapper[currentNode.id] = [parentNodes];\n } else if (currentNode.isDevice) {\n mapper[currentNode.id].push(parentNodes);\n }\n\n for (const child of currentNode.children)\n recursiveParser({ ...child }, [...parentNodes]);\n };\n\n for (const node of hierarchy) recursiveParser({ ...node }, []);\n\n const finalOptions = options\n .filter((v, i, a) => a.indexOf(v) === i)\n .sort((a, b) => a.localeCompare(b));\n\n this._searchOptions.next(finalOptions);\n this._searchMapper = mapper;\n }\n\n /**\n * Uses the mapper to find nodes that correspond to the query provided.\n *\n * Process :\n * - Find all keys in the mapper that contain the query\n * - For each path contained in the mapper's values returned\n * - Build a copy of the root node (first element of the path), with empty children\n * - For each subnode in the path\n * - Add this node to its parent node's children\n *\n * @param search Search string\n */\n private _filterNodesBySearch(search: string, nodes: HierarchyNode[]) {\n if (!search) return nodes;\n\n const results: HierarchyNode[] = [];\n\n for (const key in this._searchMapper) {\n if (!key.toLocaleLowerCase().includes(search.toLocaleLowerCase()))\n continue;\n const paths = this._searchMapper[key];\n\n const pathNodes = paths.map((path) => {\n const dupPath = JSON.parse(JSON.stringify(path));\n\n const rootNode: HierarchyNode = {\n ...dupPath[0],\n children: !dupPath[1] ? dupPath[0].children : [],\n };\n\n dupPath.slice(1).reduce((acc, node, i) => {\n acc.children = dupPath[i + 1] ? [node] : acc.children;\n return node;\n }, rootNode);\n\n return rootNode;\n });\n\n for (const node of pathNodes) {\n if (!results.some((res) => res.name === node.name)) results.push(node);\n }\n }\n\n return results;\n }\n}\n\ntype HierarchyNodeSearchMapper = { [key: string]: HierarchyNode[][] };\n","\n
\n

\n You are about to move\n {{ data.deviceIds.length }}\n {{ data.deviceIds.length > 1 ? 'devices' : 'device' }}\n to the site {{ data.destinationNode.name }}.\n

\n 0\">\n

\n This will impact the routing rules listed below and might interrupt the\n IoT data flow from\n {{ data.deviceIds.length === 1 ? 'this device' : 'these devices' }} to\n your business application.\n

\n
    \n
  • \n {{ routeImpacted.name }}open_in_new\n
  • \n
\n
\n
\n
\n \n \n
\n
\n\n","import { Component, Inject, OnInit } from '@angular/core';\nimport { MAT_DIALOG_DATA } from '@angular/material/dialog';\nimport match from 'mqtt-match';\nimport { Observable, filter, map, of } from 'rxjs';\nimport { RouteDto } from '../../../../../models/data-routing.models';\nimport { HierarchyNode } from '../../../../../models/device-hierarchy.models';\nimport { DataLoaderService } from '../../../../services/state/data/data-loader.service';\nimport { DataStoreService } from '../../../../services/state/data/data-store.service';\nimport { DeviceHierarchyStoreService } from '../../../../services/state/data/device-hierarchy/device-hierarchy-store.service';\n\n@Component({\n templateUrl: './device-move-confirmation-dialog.component.html',\n styleUrls: ['./device-move-confirmation-dialog.component.scss'],\n})\nexport class DeviceMoveConfirmationDialogComponent implements OnInit {\n public routesImpacted$: Observable;\n public encodeURIComponent = encodeURIComponent;\n\n constructor(\n @Inject(MAT_DIALOG_DATA) public data: DeviceMoveConfirmationData,\n private dataService: DataStoreService,\n private deviceHierarchy: DeviceHierarchyStoreService,\n private dataLoader: DataLoaderService,\n ) {}\n\n ngOnInit() {\n this.routesImpacted$ = this.getRoutesImpacted$();\n }\n\n private getRoutesImpacted$() {\n const sourcePath = this.deviceHierarchy.getPathForNode(\n this.data.originNode,\n );\n const destinationPath = this.deviceHierarchy.getPathForNode(\n this.data.destinationNode,\n );\n\n const routings$ = this.dataService.routings\n ? of(this.dataService.routings)\n : this.dataLoader.loadRoutings();\n\n return routings$.pipe(\n filter((routings) => !!routings),\n map((routings) =>\n routings!.filter((routing) =>\n this.isRoutingImpacted(\n routing.pattern,\n sourcePath,\n destinationPath,\n this.data.deviceIds,\n ),\n ),\n ),\n );\n }\n\n private isRoutingImpacted(\n routingPattern: string,\n oldPath: string,\n newPath: string,\n deviceIds: string[],\n ) {\n return deviceIds.some((deviceId) => {\n // transform /site_FR.TEST/deviceId/someVariable\n // into: /site_FR.TEST/deviceId\n // so routes targeting specific variables can also trigger the warning\n const routingPatternUntilDevice = this.removeVariablesFromPattern(\n routingPattern,\n deviceId,\n );\n return (\n match(routingPatternUntilDevice, `${oldPath}/${deviceId}`) &&\n !match(routingPatternUntilDevice, `${newPath}/${deviceId}`)\n );\n });\n }\n\n private removeVariablesFromPattern(routingPattern: string, deviceId: string) {\n const regex = new RegExp(`${deviceId}/.*$`);\n return routingPattern.replace(regex, deviceId);\n }\n}\n\nexport interface DeviceMoveConfirmationData {\n originNode: HierarchyNode;\n destinationNode: HierarchyNode;\n deviceIds: string[];\n}\n","import { Injectable } from '@angular/core';\nimport { MatDialog } from '@angular/material/dialog';\nimport { BehaviorSubject, Observable, of } from 'rxjs';\nimport { filter, map, tap } from 'rxjs/operators';\nimport { DevicesService } from 'src/app/services/http/devices.service';\nimport { AuthService } from 'src/app/services/state/auth/auth.service';\nimport { DataStoreService } from 'src/app/services/state/data/data-store.service';\nimport { DeviceHierarchyStoreService } from 'src/app/services/state/data/device-hierarchy/device-hierarchy-store.service';\nimport { HierarchyNode } from 'src/models/device-hierarchy.models';\nimport { DeviceDto } from 'src/models/device.models';\nimport { Site } from 'src/models/site.models';\nimport { ConfirmationDialogComponent } from '../../../components/confirmation-dialog/confirmation-dialog.component';\nimport { DeviceMoveConfirmationDialogComponent } from './device-move-confirmation-dialog/device-move-confirmation-dialog.component';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class DeviceManagementService {\n private readonly _path$ = new BehaviorSubject('');\n private readonly _view$ = new BehaviorSubject<'manager' | 'multi-downlink'>(\n 'manager',\n );\n private readonly _selectedNode$ = new BehaviorSubject({\n id: 'root',\n name: 'root',\n isDevice: false,\n isData: false,\n children: [],\n });\n\n // Data that will be transferred. Use a variable because the DOM event only accepts strings.\n private _dragData: DeviceDto[] = [];\n private _dragItem?: DeviceDto;\n\n constructor(\n private auth: AuthService,\n private data: DataStoreService,\n private deviceHttp: DevicesService,\n private deviceHierarchy: DeviceHierarchyStoreService,\n private dialog: MatDialog,\n ) {}\n\n public setSelectedNode(node: HierarchyNode): void {\n this._selectedNode$.next(node);\n }\n\n public get selectedNode$(): Observable {\n return this._selectedNode$.asObservable();\n }\n\n public get selectedNode(): HierarchyNode {\n return this._selectedNode$.value;\n }\n\n public resetSelectedNode(): void {\n this._selectedNode$.next({\n id: 'root',\n name: 'root',\n isDevice: false,\n isData: false,\n children: [],\n });\n }\n\n public addFolder(folder: HierarchyNode): void {\n const selectedNode = this.selectedNode;\n let children = selectedNode.children;\n children.push(folder);\n children = [\n ...this.deviceHierarchy.getSortedFolders(children),\n ...this.deviceHierarchy.getSortedDevices(children),\n ];\n this._selectedNode$.next(selectedNode);\n this.deviceHierarchy.updateNode(selectedNode);\n }\n\n public setPath(path: string): void {\n this._path$.next(path);\n }\n\n public get path$(): Observable {\n return this._path$.asObservable();\n }\n\n public get path(): string {\n return this._path$.value;\n }\n\n public resetPath(): void {\n this._path$.next('');\n }\n\n public setView(view: 'manager' | 'multi-downlink'): void {\n this._view$.next(view);\n }\n\n public get view(): 'manager' | 'multi-downlink' {\n return this._view$.value;\n }\n\n public get view$(): Observable<'manager' | 'multi-downlink'> {\n return this._view$.asObservable();\n }\n\n public resetView(): void {\n this._view$.next('manager');\n }\n\n public get activeProject(): string {\n return this.buildActiveProject();\n }\n\n public get hierarchyPrefix(): string {\n return this.buildHierarchyPrefix();\n }\n\n public userHasWriteRights(project?: string): boolean {\n return this.auth.hasWriteRightsForProject(project ?? this._path$.value);\n }\n\n public deleteDevice(device: DeviceDto) {\n const node = this._selectedNode$.value;\n node.children = node.children.filter(\n (node) => node.id !== device.device_id,\n );\n return this.deviceHttp.deleteDevice(device).pipe(\n tap(() => {\n this.data.deleteDevice(device.device_id);\n }),\n tap(() => this.setSelectedNode(node)),\n tap(() => this.deviceHierarchy.updateNode(node)),\n );\n }\n\n public checkIfDeviceExists(deviceId: string): Observable {\n return of(\n !!this.data.devices?.find((device) => device.device_id === deviceId),\n );\n }\n\n public activeProjectLocation(): Observable {\n const projectTag = this.activeProject;\n if (projectTag && projectTag !== '') {\n return this.deviceHttp.getSite(projectTag);\n } else {\n return of(undefined);\n }\n }\n\n public toggleDragItem(item: DeviceDto, add: boolean) {\n if (add) this._dragData.push(item);\n else this._dragData = this._dragData.filter((device) => device !== item);\n }\n\n public resetDragData() {\n this._dragData = [];\n }\n\n public hasDragData() {\n return !!this._dragData.length;\n }\n\n public startDraggingItem(event: DragEvent, item: DeviceDto) {\n event.dataTransfer!.effectAllowed = 'move';\n if (!this._dragData.includes(item)) this._dragItem = item;\n }\n\n public dropDraggedItemOnNode(event: DragEvent, node: HierarchyNode) {\n event.preventDefault();\n\n const targetName = node.name;\n\n const deviceIds = this._dragData.map((device) => device.device_id);\n if (this._dragItem) deviceIds.push(this._dragItem.device_id);\n\n if (node === this._selectedNode$.value)\n return void this.dialog.open(ConfirmationDialogComponent, {\n data: { html: `This device is already on the site \"${targetName}\" !` },\n });\n\n return this.dialog\n .open(DeviceMoveConfirmationDialogComponent, {\n data: {\n originNode: this._selectedNode$.value,\n destinationNode: node,\n deviceIds,\n },\n })\n .afterClosed()\n .pipe(\n tap(() => (this._dragItem = undefined)),\n filter((v) => !!v),\n map(() => deviceIds),\n );\n }\n\n public allowDroppingDraggedItem(event: DragEvent) {\n event.preventDefault();\n event.dataTransfer!.dropEffect = 'move';\n }\n\n public preventDroppingDraggedItem(event: DragEvent) {\n event.preventDefault();\n event.dataTransfer!.dropEffect = 'none';\n }\n\n public buildActiveProject(path = this._path$.value) {\n if (path) {\n return path\n .split('/')\n .filter((chunk) => chunk.includes('site_'))\n .toString();\n }\n return '';\n }\n\n public buildHierarchyPrefix(path = this._path$.value) {\n const prefix = path.split('/').slice(2).join('/');\n return prefix.length ? '/' + prefix + '/' : '/';\n }\n\n public isFireflyConfiguredInSelectedSite(): boolean {\n const selectedSiteId = this.path.split('/')[1];\n const selectedSite = this.data.sites?.find(\n (site) => site.code === selectedSiteId,\n );\n if (!selectedSite) {\n console.error('Site not found in loaded data, ignoring Firefly check');\n return true;\n }\n return !!selectedSite.fireflyOrganization;\n }\n}\n","import { Injectable } from '@angular/core';\nimport { MatSnackBar } from '@angular/material/snack-bar';\nimport { Router } from '@angular/router';\nimport { BehaviorSubject, Observable, throwError } from 'rxjs';\nimport { catchError, first, tap } from 'rxjs/operators';\nimport { DeviceManagementService } from 'src/app/pages/main/device-management/device-management.service';\nimport { DevicesService } from 'src/app/services/http/devices.service';\nimport { DataStoreService } from 'src/app/services/state/data/data-store.service';\nimport { DeviceHierarchyStoreService } from 'src/app/services/state/data/device-hierarchy/device-hierarchy-store.service';\nimport { WizardStep } from 'src/models/app-routing.models';\nimport { HierarchyNode } from 'src/models/device-hierarchy.models';\nimport { DeviceTypeDTO, SourceCode } from 'src/models/device-type.models';\nimport {\n DefaultDeviceInfo,\n DeviceDto,\n FireflyDeviceInfo,\n IotCoreDeviceInfo,\n} from 'src/models/device.models';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class DeviceCreationService {\n private readonly _activeStep$ = new BehaviorSubject(\n undefined,\n );\n private readonly _selectedDeviceType$ = new BehaviorSubject<\n DeviceTypeDTO | undefined\n >(undefined);\n\n constructor(\n private deviceHttp: DevicesService,\n private router: Router,\n private data: DataStoreService,\n private deviceHierarchy: DeviceHierarchyStoreService,\n private deviceManagement: DeviceManagementService,\n private snackBar: MatSnackBar,\n ) {}\n\n public setSelectedDeviceType(type: DeviceTypeDTO): void {\n this._selectedDeviceType$.next(type);\n }\n\n public get selectedDeviceType(): DeviceTypeDTO | undefined {\n return this._selectedDeviceType$.value;\n }\n\n public get selectedDeviceType$(): Observable {\n return this._selectedDeviceType$.asObservable();\n }\n\n public get deviceTypeSelected(): boolean {\n return !!this._selectedDeviceType$.value;\n }\n\n public get activeStep$(): Observable {\n return this._activeStep$.asObservable();\n }\n\n public setActiveStep(\n step: number,\n config: Pick[],\n ): void {\n const nextStep: WizardStep = {\n ...config[step - 1],\n totalSteps: config.length,\n step,\n };\n this._activeStep$.next(nextStep);\n }\n\n public createDevice(\n deviceInfo: FireflyDeviceInfo | DefaultDeviceInfo | IotCoreDeviceInfo,\n source: string,\n ): void {\n const path = this.deviceManagement.path;\n const selectedNode = this.deviceHierarchy.getSelectedNodeForPath(path);\n\n this.deviceHttp\n .createDevice(deviceInfo, source)\n .pipe(\n first(),\n tap((device) => this.data.addDevice(this.addDeviceTypeInfo(device))),\n tap((device) =>\n selectedNode.children.push({\n id: device.device_id,\n children: [],\n isDevice: true,\n isData: false,\n name: device.metadata.name,\n } as HierarchyNode),\n ),\n tap(() => this.deviceHierarchy.updateNode(selectedNode)),\n tap(() =>\n this.router.navigate(['/home/device/manager'], {\n queryParams: { path },\n }),\n ),\n )\n .subscribe();\n }\n\n public getRouteForDeviceDataSource(sourceCode: SourceCode): string {\n switch (sourceCode) {\n case 'firefly':\n return 'firefly';\n case 'iot_core':\n return 'iotcore';\n case 'pub_sub':\n case 'sigfox':\n this.snackBar.open(\n 'Creation of devices from this source type is not yet possible!',\n 'close',\n );\n return '';\n default:\n return 'generic';\n }\n }\n\n public createFireflyDevices(\n csv: string,\n hierarchyPrefix: string,\n deviceTypeId: string,\n ) {\n const payload = {\n csv,\n deviceTypeId,\n attributeTags: [],\n hierarchyPrefix:\n this.deviceManagement.buildHierarchyPrefix(hierarchyPrefix),\n projectIds: [this.deviceManagement.buildActiveProject(hierarchyPrefix)],\n };\n\n return this.deviceHttp.createDevices(payload, 'firefly').pipe(\n tap((res) => this.updateStoreWithMultipleDevices(res.created)),\n catchError((err) => {\n this.updateStoreWithMultipleDevices(err.error.created);\n return throwError(err);\n }),\n );\n }\n\n private updateStoreWithMultipleDevices(devices: DeviceDto[]) {\n const path = this.deviceManagement.path;\n const selectedNode = this.deviceHierarchy.getSelectedNodeForPath(path);\n\n devices\n .map((device) => this.addDeviceTypeInfo(device))\n .forEach((device) => {\n this.data.addDevice(device);\n selectedNode.children.push({\n id: device.device_id,\n children: [],\n isDevice: true,\n isData: false,\n name: device.metadata.name,\n } as HierarchyNode);\n this.deviceHierarchy.updateNode(selectedNode);\n this.deviceManagement.setSelectedNode(selectedNode);\n });\n }\n\n private addDeviceTypeInfo(device: DeviceDto) {\n const deviceType = this.data.getDeviceTypeByID(device.device_type_id!);\n return deviceType ? { ...device, device_type: deviceType } : device;\n }\n\n public moveDevices(deviceIds: string[], path: string) {\n return this.deviceHttp.moveDevices(\n deviceIds,\n this.deviceManagement.buildHierarchyPrefix(path),\n this.deviceManagement.buildActiveProject(path),\n );\n }\n\n public calibrateDevice(deviceId: string, calibrations: unknown) {\n return this.deviceHttp.setDeviceCalibration(deviceId, calibrations);\n }\n}\n","
\n
\n
\n 1\"\n (click)=\"navigate(activeStep.step - 1)\"\n >\n arrow_back\n \n
\n
\n

{{ activeStep.title }}

\n
\n\n
\n {{ activeStep.step }}\n {{ activeStep.totalSteps }}\n
\n
\n
\n \n
\n
\n \n \n Next\n \n \n \n \n Validate\n \n \n
\n
\n","import { Component, EventEmitter, Input, Output } from '@angular/core';\nimport { Router } from '@angular/router';\nimport { WizardStep } from 'src/models/app-routing.models';\n\n@Component({\n selector: 'app-form-stepper',\n templateUrl: './form-stepper.component.html',\n styleUrls: ['./form-stepper.component.scss'],\n})\nexport class FormStepperComponent {\n @Input() activeStep: WizardStep;\n @Input() stepValid: boolean;\n @Output() submitted = new EventEmitter();\n constructor(private router: Router) {}\n\n navigate(index: number): void {\n this.router.navigate([], {\n queryParams: { step: index },\n queryParamsHandling: 'merge',\n });\n }\n}\n","import {\n AfterViewInit,\n Component,\n EventEmitter,\n Input,\n OnDestroy,\n Output,\n} from '@angular/core';\nimport { icon, map, marker, tileLayer } from 'leaflet';\nimport { environment } from 'src/environments/environment';\n\nconst mapOptions = {\n layers: [\n tileLayer(environment.openStreetMap.layerTilesUrl, {\n maxZoom: 18,\n attribution: environment.openStreetMap.attribution,\n }),\n ],\n};\n\n@Component({\n selector: 'app-select-position',\n templateUrl: './select-position.component.html',\n styleUrls: ['./select-position.component.scss'],\n})\nexport class SelectPositionComponent implements AfterViewInit, OnDestroy {\n @Input() zoom?: number;\n @Input() set location(value: { latitude: number; longitude: number }) {\n if (\n typeof value.latitude === 'number' &&\n typeof value.longitude === 'number'\n ) {\n this.center = [value.latitude, value.longitude];\n if (this.map && !this.initialized) {\n this.map.setView(this.center);\n this.initialized = true;\n }\n if (this.marker) {\n this.marker.setLatLng(this.center);\n this.map.setView(this.center);\n }\n }\n }\n @Output() setPosition = new EventEmitter();\n private initialized = false;\n private map: L.Map;\n private marker: L.Marker;\n private center: L.LatLngExpression = [44.7931165, -0.6236336];\n\n constructor() {}\n\n ngAfterViewInit() {\n if (document.getElementById('mapSelect')) {\n this.map = map('mapSelect', mapOptions).setView(\n this.center,\n this.zoom ?? 5,\n );\n this.marker = marker(this.center, {\n icon: icon({\n iconSize: [25, 41],\n iconAnchor: [13, 41],\n iconUrl: 'assets/img/marker-icon.png',\n shadowUrl: 'assets/img/marker-shadow.png',\n }),\n }).addTo(this.map);\n\n this.map.on('click', (e) => {\n this.marker.setLatLng((e as L.LeafletMouseEvent).latlng);\n this.setPosition.emit((e as L.LeafletMouseEvent).latlng);\n });\n }\n }\n\n ngOnDestroy(): void {\n if (this.map) {\n this.map.remove();\n }\n }\n}\n","
\n","
\n
\n
\n
\n \n Key\n \n \n
\n
\n \n Value \n \n \n
\n \n delete_forever\n \n
\n
\n
\n
\n \n
\n","import { Component, EventEmitter, Input, Output } from '@angular/core';\nimport {\n UntypedFormArray,\n UntypedFormControl,\n UntypedFormGroup,\n Validators,\n} from '@angular/forms';\n\nimport { DeviceDto } from 'src/models/device.models';\n\ninterface MetaData {\n key: string;\n value: string;\n}\n\nconst nestedForms = { mdKeys: 'metaDataKeys', metadata: 'metaData' };\n\n@Component({\n selector: 'app-metadata-form',\n templateUrl: './metadata-form.component.html',\n styleUrls: ['./metadata-form.component.scss'],\n})\nexport class MetadataFormComponent {\n @Input() set device(value: DeviceDto) {\n if (value) {\n this.addEditableMetadataFields(value);\n }\n }\n @Output() metadataChange = new EventEmitter();\n public metaData: MetaData[] = [];\n public metadataForm = new UntypedFormGroup({\n metaDataKeys: new UntypedFormArray([]),\n metaData: new UntypedFormGroup({}),\n });\n\n get metadataKeys(): UntypedFormArray {\n return this.metadataForm.get(nestedForms.mdKeys) as UntypedFormArray;\n }\n\n get metaDataFormGroup(): UntypedFormGroup {\n return this.metadataForm.get(nestedForms.metadata) as UntypedFormGroup;\n }\n\n private addEditableMetadataFields(device: DeviceDto) {\n const editableMetadata = device.metadata.editableMetadata || {};\n const metadata = {\n lat: device.metadata.lat,\n lng: device.metadata.lng,\n name: device.metadata.name,\n comment: device.metadata.comment,\n EUI: device.metadata.EUI,\n applicationEUI: device.metadata.applicationEUI,\n activationType: device.metadata.activationType,\n deviceProfileId: device.metadata.deviceProfileId,\n networkAdress: device.metadata.networkAdress,\n ref: device.metadata.ref,\n routeRefs: device.metadata.routeRefs,\n processingStrategyId: device.metadata.processingStrategyId,\n connectivityPlanId: device.metadata.connectivityPlanId,\n networkAddress: device.metadata.networkAddress,\n deviceClass: device.metadata.deviceClass,\n updated_by: device.metadata.updated_by,\n updated_at: device.metadata.updated_at,\n created_by: device.metadata.created_by,\n created_at: device.metadata.created_at,\n editableMetadata: editableMetadata,\n };\n\n Object.keys(metadata).forEach((key) => {\n this.onAddMetaDataInput(key, metadata[key].toString());\n });\n }\n\n public onKeyChange(newKey: string, index: number) {\n if (!this.metadataForm.contains(newKey)) {\n this.metaData[index].key = newKey;\n this.updateCreationForm();\n this.metadataChange.emit(this.metaDataFormGroup);\n }\n }\n\n public onValueChange(newValue: string, index: number) {\n this.metaData[index].value = newValue;\n this.updateCreationForm();\n this.metadataChange.emit(this.metaDataFormGroup);\n }\n\n public onAddMetaDataInput(newKey: string = '', newValue: string = '') {\n const control = new UntypedFormControl(newKey, Validators.required);\n this.metaData.push({ key: newKey, value: newValue });\n this.metadataKeys.push(control);\n this.updateCreationForm();\n }\n\n public onRemoveMetaDataInput(index: number) {\n this.metaData.splice(index, 1);\n this.metadataKeys.removeAt(index);\n this.updateCreationForm();\n }\n\n private updateCreationForm() {\n this.metadataForm.controls.metaData = this.mapMetaDataToFormGroup();\n this.metadataForm.updateValueAndValidity();\n }\n\n private mapMetaDataToFormGroup() {\n const formGroup = new UntypedFormGroup({});\n this.metaData.forEach((data) =>\n formGroup.addControl(\n data.key,\n new UntypedFormControl(data.value, Validators.required),\n ),\n );\n return formGroup;\n }\n}\n","import { Component, Input } from '@angular/core';\nimport { DeviceTypeDTO } from 'src/models/device-type.models';\n\n@Component({\n selector: 'app-device-type-banner',\n templateUrl: './device-type-banner.component.html',\n styleUrls: ['./device-type-banner.component.scss'],\n})\nexport class DeviceTypeBannerComponent {\n @Input() deviceType: DeviceTypeDTO;\n constructor() {}\n}\n","
\n \n

{{ deviceType?.brand?.name }} {{ deviceType?.name }}

\n
\n","\n
\n \n
\n
\n \n
\n
\n \n
\n\n\n\n
\n \n
\n \n
\n \n

{{ deviceManagement.path$ | async }}

\n
\n \n Device Name\n \n \n \n Device ID\n \n \n ID has to start and end with a letter or number and can only contain\n following special Characters: - . _\n \n \n A device with this id already exists\n \n \n
\n \n

\n Control Groups\n \n help_outline\n \n

\n
\n \n {{ flag }}\n \n
\n \n \n
\n
\n\n\n
\n \n
\n \n
\n \n Latitude\n \n \n \n Longitude\n \n \n
\n \n
\n
\n
\n
\n\n\n
\n \n
\n \n Description\n \n \n \n \n
\n
\n","import { Component, OnInit } from '@angular/core';\nimport {\n UntypedFormControl,\n UntypedFormGroup,\n Validators,\n} from '@angular/forms';\nimport { ActivatedRoute, Router } from '@angular/router';\nimport { Observable } from 'rxjs';\nimport { filter, map, tap } from 'rxjs/operators';\nimport { AuthService } from './../../../../../services/state/auth/auth.service';\nimport { DeviceIdValidator } from './../../device-exists.validator';\n\nimport { LatLng } from 'leaflet';\nimport { DataStoreService } from 'src/app/services/state/data/data-store.service';\nimport { environment } from 'src/environments/environment';\nimport { DeviceTypeDTO } from 'src/models/device-type.models';\nimport { DefaultDeviceInfo } from 'src/models/device.models';\nimport { Site } from 'src/models/site.models';\nimport { DeviceManagementService } from '../../device-management.service';\nimport { DeviceCreation } from '../abstract-device-creation';\nimport { defaultCreationSteps } from '../device-creation.config';\nimport { DeviceCreationService } from '../device-creation.service';\n\n@Component({\n selector: 'app-default-device-creation',\n templateUrl: './default-device-creation.component.html',\n styleUrls: ['./default-device-creation.component.scss'],\n})\nexport class DefaultDeviceCreationComponent\n extends DeviceCreation\n implements OnInit\n{\n // interface\n activeStepConfig$ = this.deviceCreation.activeStep$;\n activeStepIndex: number;\n\n // interface data\n deviceClasses = this.data.deviceClasses;\n deviceType = this.deviceCreation.selectedDeviceType as DeviceTypeDTO;\n site$: Observable;\n userAccessFlags = this.authService.claims?.accessFlags || [];\n\n // data collection\n form = this.buildForm();\n deviceControlGroups = new Set();\n\n constructor(\n private route: ActivatedRoute,\n private router: Router,\n private data: DataStoreService,\n private deviceCreation: DeviceCreationService,\n public deviceManagement: DeviceManagementService,\n public authService: AuthService,\n ) {\n super();\n }\n\n ngOnInit(): void {\n this.stepQueryParamsHandler$.subscribe();\n this.pathQueryParamHandler$.subscribe();\n }\n\n private get stepQueryParamsHandler$(): Observable {\n return this.route.queryParams.pipe(\n map((params) => parseInt(params.step, 10)),\n tap((step) => (this.activeStepIndex = step)),\n tap((step) =>\n this.deviceCreation.setActiveStep(step, defaultCreationSteps),\n ),\n filter((step) => !this.stepValidator(step - 1)),\n tap(() =>\n this.router.navigate([], {\n queryParams: { step: 1 },\n queryParamsHandling: 'merge',\n }),\n ),\n );\n }\n\n private get pathQueryParamHandler$(): Observable {\n return this.route.queryParams.pipe(\n map((params) => params.path ?? ''),\n tap((path) => {\n this.deviceManagement.setPath(path);\n this.site$ = this.data.findSite(this.deviceManagement.activeProject);\n }),\n );\n }\n\n public stepValidator(step = this.activeStepIndex): boolean {\n const general = this.generalForm.valid;\n const position = this.positionForm.valid;\n const metadata = this.metadataForm.valid;\n\n switch (step) {\n case 1:\n return general;\n case 2:\n return position && general;\n default:\n return metadata && position && general;\n }\n }\n\n public submitForm(): void {\n const source = this.deviceType?.source.code;\n const deviceInfo: DefaultDeviceInfo = {\n ...this.generalForm.value,\n attributeTags: Array.from(this.deviceControlGroups),\n projectIds: [this.deviceManagement.activeProject],\n metadata: {\n ...this.positionForm.value,\n ...this.metadataForm.value,\n description: this.descriptionFormControl.value,\n },\n };\n this.deviceCreation.createDevice(deviceInfo, source);\n }\n\n public onFlagChange(checked: boolean, flag: string): void {\n checked\n ? this.deviceControlGroups.add(flag)\n : this.deviceControlGroups.delete(flag);\n }\n\n private buildForm(): UntypedFormGroup {\n const form = new UntypedFormGroup({\n general: new UntypedFormGroup({\n name: new UntypedFormControl(null, Validators.required),\n hierarchyPrefix: new UntypedFormControl(\n this.deviceManagement.hierarchyPrefix,\n Validators.required,\n ),\n deviceTypeId: new UntypedFormControl(\n this.deviceType?.code,\n Validators.required,\n ),\n deviceId: new UntypedFormControl(\n null,\n [\n Validators.required,\n Validators.minLength(2),\n Validators.pattern(/^[A-Za-z0-9][A-Za-z0-9._-]{0,68}[A-Za-z0-9]$/),\n ],\n [DeviceIdValidator.createValidator(this.deviceManagement)],\n ),\n }),\n position: new UntypedFormGroup({\n lat: new UntypedFormControl(\n environment.openStreetMap.defaultMapCenter.lat,\n Validators.required,\n ),\n lng: new UntypedFormControl(\n environment.openStreetMap.defaultMapCenter.lng,\n Validators.required,\n ),\n }),\n metaData: new UntypedFormGroup({}),\n description: new UntypedFormControl(''),\n });\n return form;\n }\n\n onSetLatitude(latitude: number) {\n const position = { lat: latitude };\n this.form.controls.position.setValue(position.lat);\n }\n\n onSetLongitude(longitude: number) {\n const position = { lng: longitude };\n this.form.controls.position.setValue(position.lng);\n }\n\n onSetPosition(coords: LatLng) {\n const position = { lat: coords.lat.toFixed(7), lng: coords.lng.toFixed(7) };\n this.form.controls.position.setValue(position);\n }\n}\n","
\n

Create a new device

\n \n clear\n \n
\n
\n \n
\n","import { Component } from '@angular/core';\nimport { combineLatest, of } from 'rxjs';\nimport { first, switchMap } from 'rxjs/operators';\nimport { DeviceManagementService } from 'src/app/pages/main/device-management/device-management.service';\nimport { DataLoaderService } from '../../../../services/state/data/data-loader.service';\nimport { DataStoreService } from '../../../../services/state/data/data-store.service';\n\n@Component({\n selector: 'app-device-creation',\n templateUrl: './device-creation.component.html',\n styleUrls: ['./device-creation.component.scss'],\n})\nexport class DeviceCreationComponent {\n types$ = this.data.deviceTypes$;\n\n constructor(\n public deviceManagement: DeviceManagementService,\n private dataLoader: DataLoaderService,\n private data: DataStoreService,\n ) {\n combineLatest([\n this.data.deviceTypes$.pipe(\n switchMap((state) =>\n state ? of(state) : this.dataLoader.loadDeviceTypes(),\n ),\n ),\n this.data.brands$.pipe(\n switchMap((state) =>\n state ? of(state) : this.dataLoader.loadBrands(),\n ),\n ),\n this.data.sources$.pipe(\n switchMap((state) =>\n state ? of(state) : this.dataLoader.loadSources(),\n ),\n ),\n this.data.devices$.pipe(\n switchMap((state) =>\n state ? of(state) : this.dataLoader.loadDevices(),\n ),\n ),\n this.data.sites$.pipe(\n switchMap((state) => (state ? of(state) : this.dataLoader.loadSites())),\n ),\n ])\n .pipe(first())\n .subscribe();\n }\n}\n","\n
\n \n
\n
\n \n
\n
\n \n
\n
\n \n
\n\n\n\n
\n \n
\n \n
\n \n

{{ deviceManagement.path$ | async }}

\n
\n \n Device Name\n \n \n \n Device EUI\n \n \n A device with this id already exists\n \n {{ devEui.value?.length || 0 }}/16\n \n \n Measure Unit\n \n \n {{ unit }}\n \n \n \n \n Measure Range\n \n \n {{ range.min }} - {{ range.max }}\n \n \n \n
\n \n

\n Control Groups\n \n help_outline\n \n

\n
\n \n {{ flag }}\n \n
\n \n \n
\n
\n\n\n
\n \n
\n \n \n Application Key\n \n {{ applicationKey.value?.length || 0 }}/32\n \n \n Region\n \n \n {{ r.option }}\n \n \n \n \n RX2 Data Rate\n \n \n {{ rate.option }}\n \n \n \n \n
\n
\n
\n\n\n
\n \n
\n \n
\n \n Latitude\n \n \n \n Longitude\n \n \n
\n \n
\n
\n
\n
\n\n\n
\n \n
\n \n Description\n \n \n \n \n
\n
\n","import { Component, OnInit } from '@angular/core';\nimport {\n UntypedFormControl,\n UntypedFormGroup,\n Validators,\n} from '@angular/forms';\nimport { ActivatedRoute, Router } from '@angular/router';\nimport { Observable } from 'rxjs';\nimport { filter, map, tap } from 'rxjs/operators';\n\nimport { LatLng } from 'leaflet';\nimport { AuthService } from 'src/app/services/state/auth/auth.service';\nimport { DataStoreService } from 'src/app/services/state/data/data-store.service';\nimport { environment } from 'src/environments/environment';\nimport { DeviceTypeDTO, DeviceTypeRange } from 'src/models/device-type.models';\nimport { FireflyDeviceInfo } from 'src/models/device.models';\nimport { Site } from 'src/models/site.models';\nimport { DeviceIdValidator } from '../../device-exists.validator';\nimport { DeviceManagementService } from '../../device-management.service';\nimport { DeviceCreation } from '../abstract-device-creation';\nimport { fireflyCreationSteps } from '../device-creation.config';\nimport { DeviceCreationService } from '../device-creation.service';\n\n@Component({\n selector: 'app-firefly-device-creation',\n templateUrl: './firefly-device-creation.component.html',\n styleUrls: ['./firefly-device-creation.component.scss'],\n})\nexport class FireflyDeviceCreationComponent\n extends DeviceCreation\n implements OnInit\n{\n // interface\n activeStepConfig$ = this.deviceCreation.activeStep$;\n activeStepIndex: number;\n\n // interface data\n deviceClasses = this.data.deviceClasses;\n regions = this.data.regions;\n deviceType = this.deviceCreation.selectedDeviceType as DeviceTypeDTO;\n site$: Observable;\n userAccessFlags = this.authService.claims?.accessFlags || [];\n\n // data collection\n dataRates = this.data.dataRates();\n form = this.buildForm();\n deviceControlGroups = new Set();\n\n constructor(\n private route: ActivatedRoute,\n private router: Router,\n private data: DataStoreService,\n private deviceCreation: DeviceCreationService,\n public deviceManagement: DeviceManagementService,\n public authService: AuthService,\n ) {\n super();\n }\n\n ngOnInit(): void {\n this.stepQueryParamsHandler$.subscribe();\n this.pathQueryParamHandler$.subscribe();\n this.dataRateHandler$.subscribe();\n }\n\n private get stepQueryParamsHandler$(): Observable {\n return this.route.queryParams.pipe(\n map((params) => parseInt(params.step, 10)),\n tap((step) => (this.activeStepIndex = step)),\n tap((step) =>\n this.deviceCreation.setActiveStep(step, fireflyCreationSteps),\n ),\n filter((step) => !this.stepValidator(step - 1)),\n tap(() =>\n this.router.navigate([], {\n queryParams: { step: 1 },\n queryParamsHandling: 'merge',\n }),\n ),\n );\n }\n\n private get pathQueryParamHandler$(): Observable {\n return this.route.queryParams.pipe(\n map((params) => params.path ?? ''),\n tap((path) => {\n this.deviceManagement.setPath(path);\n this.site$ = this.data.findSite(this.deviceManagement.activeProject);\n }),\n );\n }\n\n private get dataRateHandler$(): Observable {\n return this.technicalForm.controls.region.valueChanges.pipe(\n tap((region) => {\n this.dataRates = this.data.dataRates(region);\n this.technicalForm.controls.dataRate.setValue(this.dataRates[0].value);\n }),\n );\n }\n\n get rangeUnits(): string[] {\n const units: Set = new Set();\n this.deviceType.ranges?.forEach((range) => units.add(range.unit));\n return Array.from(units);\n }\n\n getRangesForUnit(unit: string): DeviceTypeRange[] {\n return this.deviceType.ranges?.filter((range) => range.unit === unit) || [];\n }\n\n public stepValidator(step = this.activeStepIndex): boolean {\n const general = this.generalForm.valid;\n const technical = this.technicalForm.valid;\n const position = this.positionForm.valid;\n const metadata = this.metadataForm.valid;\n\n switch (step) {\n case 1:\n return general;\n case 2:\n return technical && general;\n case 3:\n return position && technical && general;\n default:\n return metadata && position && technical && general;\n }\n }\n\n public onFlagChange(checked: boolean, flag: string): void {\n checked\n ? this.deviceControlGroups.add(flag)\n : this.deviceControlGroups.delete(flag);\n }\n\n public submitForm(): void {\n const source = this.deviceType?.source.code;\n this.generalForm.value.EUI = this.generalForm.value.EUI.toUpperCase();\n this.technicalForm.value.applicationKey =\n this.technicalForm.value.applicationKey.toUpperCase();\n const deviceInfo: FireflyDeviceInfo = {\n ...this.generalForm.value,\n ...this.generalForm.value,\n ...this.technicalForm.value,\n attributeTags: Array.from(this.deviceControlGroups),\n projectIds: [this.deviceManagement.activeProject],\n metadata: {\n ...this.positionForm.value,\n ...this.metadataForm.value,\n description: this.descriptionFormControl.value,\n },\n };\n this.deviceCreation.createDevice(deviceInfo, source);\n }\n\n private buildForm(): UntypedFormGroup {\n const form = new UntypedFormGroup({\n general: new UntypedFormGroup({\n name: new UntypedFormControl(null, Validators.required),\n hierarchyPrefix: new UntypedFormControl(\n this.deviceManagement.hierarchyPrefix,\n Validators.required,\n ),\n deviceTypeId: new UntypedFormControl(\n this.deviceType?.code,\n Validators.required,\n ),\n EUI: new UntypedFormControl(\n null,\n [\n Validators.required,\n Validators.minLength(16),\n Validators.pattern(/[0-9A-Fa-f]+$/),\n ],\n [DeviceIdValidator.createValidator(this.deviceManagement)],\n ),\n unit: new UntypedFormControl({\n value: this.deviceType.ranges ? this.rangeUnits[0] : null,\n disabled: !this.deviceType.ranges,\n validators: [Validators.required],\n }),\n range: new UntypedFormControl(\n {\n value: this.deviceType.ranges\n ? this.getRangesForUnit(this.rangeUnits[0])[0]\n : null,\n disabled: !this.deviceType.ranges,\n },\n [Validators.required],\n ),\n }),\n technical: new UntypedFormGroup({\n // deviceProfileId: new FormControl(null, Validators.required),\n // applicationEUI: new FormControl(null, [\n\n // Validators.minLength(16),\n // Validators.pattern(/[0-9A-Fa-f]+$/),\n // ]),\n applicationKey: new UntypedFormControl(null, [\n Validators.required,\n Validators.minLength(32),\n Validators.pattern(/[0-9A-Fa-f]+$/),\n ]),\n region: new UntypedFormControl(\n this.regions[0].value,\n Validators.required,\n ),\n dataRate: new UntypedFormControl(\n this.dataRates[0].value,\n Validators.required,\n ),\n activationType: new UntypedFormControl('OTAA', Validators.required),\n isClassC: new UntypedFormControl(false, Validators.required),\n }),\n position: new UntypedFormGroup({\n lat: new UntypedFormControl(\n environment.openStreetMap.defaultMapCenter.lat,\n Validators.required,\n ),\n lng: new UntypedFormControl(\n environment.openStreetMap.defaultMapCenter.lng,\n Validators.required,\n ),\n }),\n metaData: new UntypedFormGroup({}),\n description: new UntypedFormControl(''),\n });\n return form;\n }\n\n onSetLatitude(latitude: number) {\n const position = { lat: latitude };\n this.form.controls.position.setValue(position.lat);\n }\n\n onSetLongitude(longitude: number) {\n const position = { lng: longitude };\n this.form.controls.position.setValue(position.lng);\n }\n onSetPosition(coords: LatLng) {\n const position = { lat: coords.lat.toFixed(7), lng: coords.lng.toFixed(7) };\n this.form.controls.position.setValue(position);\n }\n}\n","import { DeviceTypeDTO, SourceCode } from './device-type.models';\n\nexport interface Device {\n device_id: string;\n device_type_id: string;\n source_id: SourceCode;\n metadata: {\n [key: string]: string;\n };\n tags: string[];\n attribute_tags: string[];\n telemetrie: unknown;\n}\n\nexport interface DeviceUpdateInfo {\n device_id: string;\n credentials?: IotcorePublicKeyCredential;\n name: string;\n description: string;\n lat: string;\n lng: string;\n\n attributeTags: string[];\n}\n\nexport interface DevicePictureInfo {\n image_file: File;\n}\n\nexport interface DeviceDto {\n device_id: string;\n deviceType: DeviceTypeDTO;\n device_type_id?: string;\n source_id: SourceCode;\n device_region?: string;\n calibration_functions: CalibrationFunction[];\n metadata: {\n lat: number;\n lng: number;\n name: string;\n [key: string]: string | number | boolean;\n userAccessFlags: boolean;\n };\n tags: DeviceTag[];\n site: SiteTag;\n attribute_tags: AttributeTag[];\n statistics: {\n low_battery: boolean | null;\n last_uplink: number | null;\n last_uplink_error: boolean | null;\n battery_powered: boolean | null;\n last_downlink?: number;\n };\n alarm: DeviceAlarm;\n}\n\nexport interface DeviceFilter {\n project_id: string;\n brand_name: string;\n device_type_id: string;\n source: string;\n status: string;\n}\n\nexport interface DeviceAlarm {\n battery: {\n enable: boolean;\n };\n connection: {\n enable: boolean;\n delay: number;\n };\n}\n\nexport interface DeviceTag {\n tag_id: string;\n hierarchy_prefix: string;\n post_decoding_function_name: string;\n pre_encoding_function_name: string;\n}\n\nexport interface SiteTag {\n tag_id: string;\n metadata: {\n country: string;\n time_zone?: string;\n infra_Site: string;\n organization: string;\n iso_code: string;\n site_long_name: string;\n userAccessFlags: boolean;\n firefly_organization?: string;\n location: {\n _latitude: number;\n _longitude: number;\n };\n };\n alert: SiteNotification;\n}\nexport interface SiteNotification {\n enable: boolean;\n unix_cron: string;\n}\n\nexport interface SiteNotificationConfig {\n enable: boolean;\n cron: string;\n timezone: string;\n}\n\nexport interface AttributeTag {\n tag_id: string;\n metadata: { [key: string]: string };\n}\n\nexport interface DeviceMonitoringStats {\n devices: number;\n devices_with_last_uplink_error: number;\n devices_with_low_battery: number;\n devices_with_low_battery_last_uplink_error: number;\n devices_with_no_warning: number;\n devices_with_no_message_yet: number;\n}\n\nexport interface BrandInfo {\n name: string;\n description: string;\n image_file: File;\n}\n\nexport interface FireflyDeviceInfo {\n name: string;\n EUI: string;\n region: DeviceRegion;\n deviceTypeId: string;\n applicationKey: string;\n hierarchyPrefix: string;\n projectIds: string[];\n attributeTags: string[];\n metadata: { [key: string]: unknown };\n}\n\nexport type DeviceRegion = 'EU868' | 'US915' | 'AU915' | 'IN865' | 'AS923';\n\nexport interface DefaultDeviceInfo {\n name: string;\n deviceId: string;\n deviceTypeId: string;\n hierarchyPrefix: string;\n projectIds: string[];\n attributeTags: string[];\n metadata: { [key: string]: unknown };\n}\n\nexport interface IotCoreDeviceInfo {\n name: string;\n id: string; // /^[a-z][A-Za-z0-9+.%-_~]*[A-Za-z0-9]$/g\n logLevel: IotcoreLogLevel;\n deviceTypeId: string;\n hierarchyPrefix: string;\n\n blocked: boolean;\n credentials: IotcorePublicKeyCredential;\n projectIds: string[];\n attributeTags: string[];\n metadata: { [key: string]: unknown };\n}\n\nexport interface IotcorePublicKeyCredential {\n format: PublicKeyFormat;\n key: string;\n}\n\nexport enum PublicKeyFormat {\n RSA_PEM = 'RSA_PEM',\n RSA_X509_PEM = 'RSA_X509_PEM',\n ES256_PEM = 'ES256_PEM',\n ES256_X509_PEM = 'ES256_X509_PEM',\n}\n\nexport enum IotcoreLogLevel {\n NONE = 'NONE',\n ERROR = 'ERROR',\n INFO = 'INFO',\n DEBUG = 'DEBUG',\n}\n\ntype ExtraCSVInfo = 'description' | 'lat' | 'lng';\n\nexport const fireflyDeviceCSVInfo: {\n [key in keyof FireflyDeviceInfo | ExtraCSVInfo]?: string;\n} = {\n name: 'Device name',\n EUI: 'Device EUI (16 chars & hexadecimal)',\n applicationKey: 'Application key (32 chars & hexadecimal)',\n region: \"'EU868' or 'US915' or 'AU915' or 'IN865' or 'AS923'\",\n description: 'Description',\n lat: 'Latitude',\n lng: 'Longitude',\n};\n\nexport const iotCoreDeviceCSVInfo: {\n [key in keyof IotCoreDeviceInfo | ExtraCSVInfo]?: string;\n} = {\n name: 'Device name',\n id: 'Device ID (Alphanumeric & - . _ + % ~ )',\n description: 'Description',\n lat: 'Latitude',\n lng: 'Longitude',\n};\n\nexport interface CalibrationFunction {\n function_id: string;\n args: number[];\n field: string;\n}\n\nexport interface Downlink {\n device_id: string;\n timestamp: number;\n payload: string;\n user: string;\n port: string;\n}\n","\n
\n \n
\n
\n \n
\n
\n \n
\n
\n \n
\n\n\n\n
\n \n
\n \n
\n \n

{{ deviceManagement.path$ | async }}

\n
\n \n Device Name\n \n \n \n Device ID\n \n \n ID has to start and end with a lowercase letter and can only contain\n following special Characters: - . _ + % ~\n \n \n A device with this id already exists\n \n \n \n Device Region\n \n Europe\n Asia\n United States\n \n \n \n \n \n You need to configure your device with these\n information:\n

\n Project ID: {{ deviceConfig.project }}\n

\n

\n Region ID: {{ deviceConfig.region }}\n

\n

\n Registry ID: {{ deviceConfig.registry }}\n

\n
\n
\n
\n \n

\n Control Groups\n \n help_outline\n \n

\n
\n \n {{ flag }}\n \n
\n \n \n
\n
\n\n\n
\n \n
\n
\n \n Upload Public Key File\n \n \n

\n Please upload a valid X.509 certificate!\n

\n
\n task\n

{{ cert.name }}

\n
\n
\n \n \n
\n
\n
\n\n\n
\n \n
\n \n
\n \n Latitude\n \n \n \n Longitude\n \n \n
\n \n
\n
\n
\n
\n\n\n
\n \n
\n \n Description\n \n \n \n \n
\n
\n","import { Component, OnInit } from '@angular/core';\nimport {\n UntypedFormControl,\n UntypedFormGroup,\n Validators,\n} from '@angular/forms';\nimport { ActivatedRoute, Router } from '@angular/router';\nimport { LatLng } from 'leaflet';\nimport { Observable } from 'rxjs';\nimport { filter, map, shareReplay, tap } from 'rxjs/operators';\nimport { AuthService } from 'src/app/services/state/auth/auth.service';\nimport { DataStoreService } from 'src/app/services/state/data/data-store.service';\nimport { environment } from 'src/environments/environment';\nimport { DeviceTypeDTO } from 'src/models/device-type.models';\nimport { IotcoreLogLevel, PublicKeyFormat } from 'src/models/device.models';\nimport { Site } from 'src/models/site.models';\nimport { DeviceIdValidator } from '../../device-exists.validator';\nimport { DeviceManagementService } from '../../device-management.service';\nimport { DeviceCreation } from '../abstract-device-creation';\nimport { iotcoreCreationSteps } from '../device-creation.config';\nimport { DeviceCreationService } from '../device-creation.service';\n\n@Component({\n selector: 'app-iotcore-device-creation',\n templateUrl: './iotcore-device-creation.component.html',\n styleUrls: ['./iotcore-device-creation.component.scss'],\n})\nexport class IotCoreDeviceCreationComponent\n extends DeviceCreation\n implements OnInit\n{\n // interface\n activeStepConfig$ = this.deviceCreation.activeStep$;\n activeStepIndex: number;\n loading = false;\n\n // interface data\n deviceClasses = this.data.deviceClasses;\n deviceType = this.deviceCreation.selectedDeviceType as DeviceTypeDTO;\n site$: Observable;\n userAccessFlags = this.authService.claims?.accessFlags || [];\n\n // data collection\n form = this.buildForm();\n fileUploadForm = new UntypedFormControl(null, Validators.required);\n certificate$ = this.fileUploadForm.valueChanges.pipe(shareReplay(1));\n deviceControlGroups = new Set();\n\n //iot core device config\n deviceConfig: { [key: string]: string } = {};\n\n constructor(\n private route: ActivatedRoute,\n private router: Router,\n private data: DataStoreService,\n private deviceCreation: DeviceCreationService,\n public deviceManagement: DeviceManagementService,\n public authService: AuthService,\n ) {\n super();\n this.deviceConfig.project = `prj-iothub-${environment.stage}`;\n this.deviceConfig.region = `europe-west1`;\n this.deviceConfig.registry = `iot-ew1-iothub-${environment.stage}-core`;\n }\n\n ngOnInit(): void {\n this.stepQueryParamsHandler$.subscribe();\n this.pathQueryParamHandler$.subscribe();\n }\n\n private get stepQueryParamsHandler$(): Observable {\n return this.route.queryParams.pipe(\n map((params) => parseInt(params.step, 10)),\n tap((step) => (this.activeStepIndex = step)),\n tap((step) =>\n this.deviceCreation.setActiveStep(step, iotcoreCreationSteps),\n ),\n filter((step) => !this.stepValidator(step - 1)),\n tap(() =>\n this.router.navigate([], {\n queryParams: { step: 1 },\n queryParamsHandling: 'merge',\n }),\n ),\n );\n }\n\n private get pathQueryParamHandler$(): Observable {\n return this.route.queryParams.pipe(\n map((params) => params.path ?? ''),\n tap((path) => {\n this.deviceManagement.setPath(path);\n this.site$ = this.data.findSite(this.deviceManagement.activeProject);\n }),\n );\n }\n\n private updateConfigInfo(value: string) {\n switch (value) {\n case 'EU':\n this.deviceConfig.region = `europe-west1`;\n this.deviceConfig.registry = `iot-ew1-iothub-${environment.stage}-core`;\n break;\n case 'US':\n this.deviceConfig.region = `us-central1`;\n this.deviceConfig.registry = `iot-us1-iothub-${environment.stage}-core`;\n break;\n case 'ASIA':\n this.deviceConfig.region = `asia-east1`;\n this.deviceConfig.registry = `iot-ae1-iothub-${environment.stage}-core`;\n break;\n default:\n break;\n }\n }\n\n fileInputChange(fileInputEvent: Event) {\n const target = fileInputEvent.target as HTMLInputElement;\n const file = target.files![0];\n const fileReader = new FileReader();\n this.fileUploadForm.setValue(file);\n\n if (\n file &&\n (file.type.includes('x-x509-ca-cert') || file.type.includes('pkix-cert'))\n ) {\n fileReader.onload = () => {\n const res = fileReader.result as string;\n if (\n res.includes('-----BEGIN CERTIFICATE-----') &&\n res.includes('-----END CERTIFICATE-----')\n ) {\n this.technicalForm.get('key')?.setValue(res);\n } else {\n this.fileUploadForm.setErrors({ certFormat: true });\n this.technicalForm.get('key')?.setValue(null);\n }\n };\n\n fileReader.readAsText(file);\n } else {\n this.fileUploadForm.setErrors({ certFormat: true });\n this.technicalForm.get('key')?.setValue(null);\n }\n }\n\n public stepValidator(step = this.activeStepIndex): boolean {\n const general = this.generalForm.valid;\n const technical = this.technicalForm.valid;\n const position = this.positionForm.valid;\n const metadata = this.metadataForm.valid;\n\n switch (step) {\n case 1:\n return general;\n case 2:\n return technical && general;\n case 3:\n return position && technical && general;\n default:\n return metadata && position && technical && general;\n }\n }\n\n public submitForm() {\n const source = this.deviceType?.source.code;\n const deviceInfo = {\n ...this.generalForm.value,\n logLevel: this.technicalForm.controls.logLevel.value,\n blocked: this.technicalForm.controls.blocked.value,\n credentials: {\n key: this.technicalForm.controls.key.value,\n format: this.technicalForm.controls.format.value,\n },\n attributeTags: Array.from(this.deviceControlGroups),\n projectIds: [this.deviceManagement.activeProject],\n metadata: {\n ...this.positionForm.value,\n ...this.metadataForm.value,\n description: this.descriptionFormControl.value,\n },\n };\n this.deviceCreation.createDevice(deviceInfo, source);\n }\n\n public onFlagChange(checked: boolean, flag: string): void {\n checked\n ? this.deviceControlGroups.add(flag)\n : this.deviceControlGroups.delete(flag);\n }\n\n private buildForm(): UntypedFormGroup {\n const form = new UntypedFormGroup({\n general: new UntypedFormGroup({\n name: new UntypedFormControl('', Validators.required),\n deviceRegion: new UntypedFormControl('EU', Validators.required),\n hierarchyPrefix: new UntypedFormControl(\n this.deviceManagement.hierarchyPrefix,\n Validators.required,\n ),\n deviceTypeId: new UntypedFormControl(\n this.deviceType?.code,\n Validators.required,\n ),\n id: new UntypedFormControl(\n '',\n [\n Validators.required,\n Validators.pattern(/^[a-z][A-Za-z0-9+.%-_~]*[A-Za-z0-9]$/),\n ],\n [DeviceIdValidator.createValidator(this.deviceManagement)],\n ),\n }),\n technical: new UntypedFormGroup({\n logLevel: new UntypedFormControl(\n IotcoreLogLevel.INFO,\n Validators.required,\n ),\n blocked: new UntypedFormControl(false),\n format: new UntypedFormControl(\n PublicKeyFormat.RSA_X509_PEM,\n Validators.required,\n ),\n key: new UntypedFormControl(null, Validators.required),\n }),\n position: new UntypedFormGroup({\n lat: new UntypedFormControl(\n environment.openStreetMap.defaultMapCenter.lat,\n Validators.required,\n ),\n lng: new UntypedFormControl(\n environment.openStreetMap.defaultMapCenter.lng,\n Validators.required,\n ),\n }),\n metaData: new UntypedFormGroup({}),\n description: new UntypedFormControl(''),\n });\n return form;\n }\n\n onSetLatitude(latitude: number) {\n const position = { lat: latitude };\n this.form.controls.position.setValue(position.lat);\n }\n\n onSetLongitude(longitude: number) {\n const position = { lng: longitude };\n this.form.controls.position.setValue(position.lng);\n }\n\n onSetPosition(coords: LatLng) {\n const position = { lat: coords.lat.toFixed(7), lng: coords.lng.toFixed(7) };\n this.form.controls.position.setValue(position);\n }\n}\n","
\n \n \n
\n
\n \n
\n","import { Component, OnInit, TemplateRef, inject } from '@angular/core';\nimport { ActivatedRoute, ResolveFn, Router } from '@angular/router';\nimport { Observable, of } from 'rxjs';\n\nimport { MatDialog } from '@angular/material/dialog';\nimport { MatSnackBar } from '@angular/material/snack-bar';\nimport { filter, map, tap } from 'rxjs/operators';\nimport { DeviceManagementService } from 'src/app/pages/main/device-management/device-management.service';\nimport { DataLoaderService } from 'src/app/services/state/data/data-loader.service';\nimport { DataStoreService } from 'src/app/services/state/data/data-store.service';\nimport { InterfaceStateService } from 'src/app/services/state/interface/interface-store.service';\nimport { DeviceTypeDTO } from 'src/models/device-type.models';\nimport { DeviceCreationService } from '../device-creation.service';\n\n@Component({\n selector: 'app-model-choice',\n templateUrl: './model-choice.component.html',\n styleUrls: ['./model-choice.component.scss'],\n})\nexport class ModelChoiceComponent implements OnInit {\n screensizeIndex$ = this.interfaceState.breakpointIndex$;\n filteredModels$ = this.data.deviceTypes$;\n models$ = this.data.deviceTypes$;\n dataTags$ = this.data.dataTags$;\n sources$ = this.data.sources$;\n brands$ = this.data.brands$;\n creationParams = { step: 1 };\n\n static getResolver(): Record> {\n return {\n sites: () =>\n inject(DataStoreService).sites ?? inject(DataLoaderService).loadSites(),\n };\n }\n\n constructor(\n private router: Router,\n private route: ActivatedRoute,\n private data: DataStoreService,\n private interfaceState: InterfaceStateService,\n private deviceCreation: DeviceCreationService,\n private deviceManagement: DeviceManagementService,\n private dialog: MatDialog,\n private snackbar: MatSnackBar,\n ) {}\n\n ngOnInit() {\n this.pathQueryParamHandler$.subscribe();\n }\n\n public onFilterChanged(models: DeviceTypeDTO[]): void {\n this.filteredModels$ = of(models);\n }\n\n public openFilterDialog(templateRef: TemplateRef) {\n this.dialog.open(templateRef, { minWidth: 600 });\n }\n\n public onModelSelected(model: DeviceTypeDTO) {\n if (\n model.source.code === 'firefly' &&\n !this.deviceManagement.isFireflyConfiguredInSelectedSite()\n ) {\n this.snackbar.open(\n 'Operation impossible: the current site misses a configured Firefly organization.',\n 'Close',\n );\n return;\n }\n const url = this.deviceCreation.getRouteForDeviceDataSource(\n model.source.code,\n );\n this.deviceCreation.setSelectedDeviceType(model);\n if (url) {\n this.router.navigate([url], {\n relativeTo: this.route,\n queryParamsHandling: 'merge',\n queryParams: { step: 1 },\n });\n }\n }\n\n private get pathQueryParamHandler$(): Observable {\n return this.route.queryParams.pipe(\n map((params) => params.path),\n filter((path) => path.split('/').length < 2),\n tap((path) =>\n this.router.navigate(['/home/device/manager'], {\n queryParams: { path },\n }),\n ),\n );\n }\n}\n","import { Injectable } from '@angular/core';\nimport { ActivatedRouteSnapshot, Router } from '@angular/router';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class PathGuard {\n constructor(private router: Router) {}\n\n canActivate(route: ActivatedRouteSnapshot): boolean {\n const path = route.queryParams.path;\n const pathValid = path.split('/').length >= 2;\n\n if (!pathValid) {\n this.router.navigate(['/home/device/manager'], {\n queryParams: { path: route.queryParams.path },\n });\n }\n return pathValid;\n }\n}\n","import { Injectable } from '@angular/core';\nimport { ActivatedRouteSnapshot, Router } from '@angular/router';\nimport { DeviceCreationService } from './device-creation.service';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class DeviceTypeSelectedGuard {\n constructor(\n private router: Router,\n private deviceCreation: DeviceCreationService,\n ) {}\n\n canActivate(route: ActivatedRouteSnapshot): boolean {\n const typeSelected = this.deviceCreation.deviceTypeSelected;\n if (!typeSelected) {\n this.router.navigate(['/home/device/new'], {\n queryParams: { path: route.queryParams.path },\n });\n }\n return typeSelected;\n }\n}\n","import { Component, Inject } from '@angular/core';\nimport {\n UntypedFormControl,\n UntypedFormGroup,\n Validators,\n} from '@angular/forms';\nimport { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog';\nimport { DataLoaderService } from 'src/app/services/state/data/data-loader.service';\nimport { DeviceDto } from 'src/models/device.models';\n\n@Component({\n selector: 'app-device-picture-update',\n templateUrl: './device-picture-update.component.html',\n styleUrls: ['./device-picture-update.component.scss'],\n})\nexport class DevicePictureUpdateComponent {\n pictureForm = new UntypedFormGroup({\n image_file: new UntypedFormControl(null, [Validators.required]),\n });\n\n deviceImage = this.data.imageUrl;\n deviceImageFile: File;\n\n id = `img-${Date.now()}`;\n\n constructor(\n public dialogRef: MatDialogRef,\n private dataLoader: DataLoaderService,\n @Inject(MAT_DIALOG_DATA)\n public data: { device: DeviceDto; imageUrl: string },\n ) {}\n\n onCancel() {\n this.dialogRef.close();\n }\n\n onSubmit() {\n this.dataLoader\n .updateDevicePicture(this.data.device.device_id, {\n image_file: this.deviceImageFile,\n })\n .subscribe((dev) => this.dialogRef.close(dev));\n }\n\n selectionChanged(event: Event) {\n const target = event.target as HTMLInputElement;\n const files = target.files!;\n if (files.length > 0 && files[0].type.match(/image\\/*/)) {\n const reader = new FileReader();\n reader.readAsDataURL(files[0]);\n reader.onload = () => (this.deviceImage = reader.result as string);\n this.deviceImageFile = files[0] as File;\n }\n }\n}\n","
\n

Update device picture

\n\n
\n \n \n
\n
\n
\n \n \n Update\n \n
\n","

Send Downlink

\n
\n
\n \n Payload (Hexadecimal)\n \n \n Payload has do be an Hexadecimal string\n \n \n Payload length has to be even\n \n \n \n Port\n \n \n Port has do be a number between 1 and 223\n \n \n
\n \n
\n
\n \n \n Send\n \n
\n","import { Component, Inject } from '@angular/core';\nimport {\n AbstractControl,\n FormControl,\n FormGroup,\n UntypedFormControl,\n ValidationErrors,\n Validators,\n} from '@angular/forms';\nimport { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog';\n\nimport { MatSnackBar } from '@angular/material/snack-bar';\nimport { map, mergeMap, Observable } from 'rxjs';\nimport { SourceCode } from '../../../../../models/device-type.models';\nimport { Downlink } from '../../../../../models/device.models';\nimport { DevicesService } from '../../../../services/http/devices.service';\nimport { DataLoaderService } from '../../../../services/state/data/data-loader.service';\n\nconst evenLengthValidator = (\n control: AbstractControl,\n): ValidationErrors | null => {\n const value = control.value;\n if (!value) return null;\n return value.length % 2 !== 0 ? { evenLength: true } : null;\n};\n\n@Component({\n selector: 'app-send-downlink-dialog',\n templateUrl: './send-downlink-dialog.component.html',\n styleUrls: ['./send-downlink-dialog.component.scss'],\n})\nexport class SendDownlinkDialogComponent {\n downlinkForm = new FormGroup({\n payloadHex: new FormControl('', [\n Validators.required,\n Validators.pattern(/[0-9A-Fa-f]+$/),\n evenLengthValidator,\n ]),\n targetPorts: new FormControl('', [\n Validators.required,\n Validators.pattern(\n /^([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-1][0-9]|22[0-3])$/,\n ),\n ]),\n });\n downlinkIotCoreControl = new UntypedFormControl('', [\n Validators.required,\n isJson,\n ]);\n\n isHexaDecimalPayload = true;\n isJsonPayload = false;\n\n constructor(\n public dialogRef: MatDialogRef,\n private deviceHttp: DevicesService,\n private dataLoaderService: DataLoaderService,\n private snackBar: MatSnackBar,\n @Inject(MAT_DIALOG_DATA)\n public data:\n | { deviceIds: string[] }\n | { deviceId: string; sourceId: SourceCode; downlink?: Downlink },\n ) {\n if ('sourceId' in this.data) {\n this.isHexaDecimalPayload = this.data.sourceId !== 'iot_core';\n this.isJsonPayload = this.data.sourceId === 'iot_core';\n }\n if ('downlink' in this.data) {\n const { payload, port } = this.data.downlink!;\n if (this.isHexaDecimalPayload) {\n this.downlinkForm.setValue({ payloadHex: payload, targetPorts: port });\n }\n if (this.isJsonPayload) {\n this.downlinkIotCoreControl.setValue(payload);\n }\n }\n }\n\n public onSend() {\n let successMsg = 'Downlink sent!';\n let request = new Observable();\n\n if ('deviceIds' in this.data) {\n successMsg = 'Downlink configuration successfully sent to devices';\n request = this.deviceHttp.sendMultiDownlink(\n this.data.deviceIds,\n this.downlinkForm.value,\n );\n }\n if ('deviceId' in this.data) {\n const { deviceId, sourceId } = this.data;\n request = this.deviceHttp\n .sendDownlink(\n deviceId,\n sourceId === 'iot_core'\n ? { json: this.downlinkIotCoreControl.value }\n : this.downlinkForm.value,\n )\n .pipe(\n mergeMap((downlinkSentResponse) =>\n this.dataLoaderService\n .loadDeviceDownlinks(deviceId)\n .pipe(map(() => downlinkSentResponse)),\n ),\n );\n }\n\n request.subscribe((downlinkSentResponse) => {\n if (downlinkSentResponse) {\n this.snackBar.open(successMsg, 'close');\n this.downlinkForm.reset();\n }\n this.dialogRef.close(downlinkSentResponse);\n });\n }\n\n isSendButtonDisabled() {\n if (this.isJsonPayload) return this.downlinkIotCoreControl.invalid;\n return this.downlinkForm.invalid;\n }\n}\n\nfunction isJson(control: AbstractControl) {\n try {\n JSON.parse(control.value);\n return null;\n } catch {\n return { json: true };\n }\n}\n","
\n

Update device information

\n
\n \n Device Name\n \n \n \n Description\n \n \n \n \n \n \n Control Groups\n \n help_outline\n \n \n \n
\n \n {{ flag }}\n \n
\n
\n \n
\n \n Update Public Key File\n \n \n

\n Please upload a valid X.509 certificate!\n

\n
\n task\n

{{ cert.name }}

\n
\n
\n
\n \n Latitude\n \n \n \n Longitude\n \n \n
\n \n \n \n \n
\n
\n \n \n Save\n \n
\n","import { Component, Inject } from '@angular/core';\nimport {\n UntypedFormControl,\n UntypedFormGroup,\n Validators,\n} from '@angular/forms';\nimport { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog';\nimport { LatLng } from 'leaflet';\nimport { Subject } from 'rxjs';\nimport { shareReplay } from 'rxjs/operators';\nimport { AuthService } from 'src/app/services/state/auth/auth.service';\nimport { DataLoaderService } from 'src/app/services/state/data/data-loader.service';\nimport {\n DeviceDto,\n DeviceUpdateInfo,\n PublicKeyFormat,\n} from 'src/models/device.models';\nimport { DeviceCreation } from '../device-creation/abstract-device-creation';\n\n@Component({\n selector: 'app-device-update',\n templateUrl: './device-update.component.html',\n styleUrls: ['./device-update.component.scss'],\n})\nexport class DeviceUpdateComponent extends DeviceCreation {\n userAccessFlags = this.authService.claims?.accessFlags || [];\n deviceControlGroups = new Set();\n editForm = new UntypedFormGroup({\n device_id: new UntypedFormControl(this.data.device.device_id),\n name: new UntypedFormControl(\n this.data.device.metadata.name,\n Validators.required,\n ),\n description: new UntypedFormControl(\n this.data.device.metadata.description || '',\n ),\n credentials: new UntypedFormGroup({\n key: new UntypedFormControl(null),\n format: new UntypedFormControl(\n PublicKeyFormat.RSA_X509_PEM,\n Validators.required,\n ),\n }),\n lat: new UntypedFormControl(\n this.data.device.metadata.lat,\n Validators.required,\n ),\n lng: new UntypedFormControl(\n this.data.device.metadata.lng,\n Validators.required,\n ),\n });\n loading = false;\n\n fileUploadForm = new UntypedFormControl(null, Validators.required);\n certificate$ = this.fileUploadForm.valueChanges.pipe(shareReplay(1));\n currentDevice = new Subject();\n constructor(\n public dialogRef: MatDialogRef,\n private dataLoader: DataLoaderService,\n public authService: AuthService,\n @Inject(MAT_DIALOG_DATA) public data: { device: DeviceDto },\n ) {\n super();\n }\n\n onSetLatitude(latitude: number) {\n this.editForm.controls.lat.setValue(latitude.toFixed(7));\n }\n\n onSetLongitude(longitude: number) {\n this.editForm.controls.lat.setValue(longitude.toFixed(7));\n }\n\n onSetPosition(coords: LatLng) {\n this.editForm.controls.lat.setValue(coords.lat.toFixed(7));\n this.editForm.controls.lng.setValue(coords.lng.toFixed(7));\n }\n\n public onFlagChange(checked: boolean, flag: string): void {\n checked\n ? this.deviceControlGroups.add(flag)\n : this.deviceControlGroups.delete(flag);\n }\n\n onCancel() {\n this.dialogRef.close();\n }\n\n onSubmit() {\n const updateInfo: DeviceUpdateInfo = {\n device_id: this.editForm.value.device_id as string,\n name: this.editForm.value.name as string,\n description: this.editForm.value.description as string,\n lat: this.editForm.value.lat as string,\n lng: this.editForm.value.lng as string,\n attributeTags: Array.from(this.deviceControlGroups) as string[],\n };\n if (\n this.editForm.value.credentials.key &&\n this.editForm.value.credentials.format\n ) {\n updateInfo.credentials = {\n key: this.editForm.value.credentials.key as string,\n format: this.editForm.value.credentials.format as PublicKeyFormat,\n };\n }\n this.dataLoader\n .updateDevice(updateInfo)\n .subscribe((dev) => this.dialogRef.close(dev));\n }\n\n deviceHasFlag(flag: string): boolean {\n return (this.data.device as DeviceDto).attribute_tags\n .map((tag) => tag.tag_id)\n .includes(flag);\n }\n\n fileInputChange(fileInputEvent: Event) {\n const target = fileInputEvent.target as HTMLInputElement;\n const file = target.files![0];\n const fileReader = new FileReader();\n this.fileUploadForm.setValue(file);\n\n if (\n file &&\n (file.type.includes('x-x509-ca-cert') || file.type.includes('pkix-cert'))\n ) {\n fileReader.onload = () => {\n const res = fileReader.result as string;\n if (\n res.includes('-----BEGIN CERTIFICATE-----') &&\n res.includes('-----END CERTIFICATE-----')\n ) {\n this.editForm.value.credentials.key = res;\n } else {\n this.fileUploadForm.setErrors({ certFormat: true });\n this.editForm.value.credentials.key = null;\n }\n };\n\n fileReader.readAsText(file);\n } else {\n this.fileUploadForm.setErrors({ certFormat: true });\n this.editForm.value.credentials.key = null;\n }\n }\n\n isIotCore(): boolean {\n return this.data.device.deviceType.source.code === 'iot_core';\n }\n}\n","

Device characterization

\n\n\n

\n Use this menu to set the characterization used by the device.
\n Start by choosing a device data, then select a characterization function,\n and fill in the variable values.\n

\n\n
\n \n \n Datafield\n \n \n {{ field }}\n \n \n \n\n \n characterization function\n \n \n {{ fn.formula }}\n \n \n \n\n \n \n \n Variable \"{{ controlName }}\"\n \n \n \n \n\n \n\n \n delete\n \n
\n \n
\n\n\n \n Add characterization\n \n \n Set characterizations\n \n \n Do not characterize the same data more than once\n \n\n","import { Component, EventEmitter, Inject, OnInit, Output } from '@angular/core';\nimport {\n AbstractControl,\n UntypedFormArray,\n UntypedFormBuilder,\n UntypedFormGroup,\n Validators,\n} from '@angular/forms';\nimport { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog';\nimport { DeviceCreationService } from '../../device-creation/device-creation.service';\nimport {\n CalibrationFunction,\n DeviceDto,\n} from './../../../../../../models/device.models';\n\n@Component({\n selector: 'app-device-calibration-function',\n templateUrl: './device-calibration-function.component.html',\n styleUrls: ['./device-calibration-function.component.scss'],\n})\nexport class DeviceCalibrationFunctionComponent implements OnInit {\n @Output() deviceUpdated = new EventEmitter();\n\n calibrationForms = this.fb.array([], [uniqueKeys]);\n functions = [\n {\n function_id: 'linear_function',\n formula: 'f(x) = ax + b',\n args: { a: [1, [Validators.required]], b: [0, [Validators.required]] },\n },\n ];\n\n constructor(\n @Inject(MAT_DIALOG_DATA)\n public data: { fields: string[]; device: DeviceDto },\n private deviceCreation: DeviceCreationService,\n private ref: MatDialogRef,\n private fb: UntypedFormBuilder,\n ) {}\n\n ngOnInit(): void {\n this.data?.device?.calibration_functions?.forEach((fn) =>\n this.calibrationForms.push(this.createCalibrationForm(fn)),\n );\n\n if (!this.data?.device?.calibration_functions.length)\n this.calibrationForms.push(this.createCalibrationForm());\n }\n\n createCalibrationForm(fn?: CalibrationFunction) {\n const func = this.functions.find(\n (func) => func.function_id === fn?.function_id,\n );\n const formGroup = this.fb.group({\n field: [fn ? fn.field : '', [Validators.required]],\n formula: [fn ? func : ''],\n function_id: ['', [Validators.required]],\n });\n\n if (func) {\n this.setArgsOnForm(formGroup, func);\n const argsForm = formGroup.get('args') as UntypedFormGroup;\n Object.keys(func.args).forEach((key, i) =>\n argsForm.get(key)?.setValue(fn?.args[i]),\n );\n }\n\n return formGroup;\n }\n\n deleteCalibration(index: number) {\n this.calibrationForms.removeAt(index);\n this.calibrationForms.markAsUntouched();\n this.calibrationForms.updateValueAndValidity();\n }\n\n setArgsOnForm(\n form: UntypedFormGroup,\n choice?: (typeof this.functions)[number],\n ) {\n if (!choice) return;\n\n const argsForm = this.fb.group(choice.args);\n\n form.patchValue({ function_id: choice.function_id });\n\n // Allows the controls to be looped over with ngFor\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (argsForm.controls as any)[Symbol.iterator] = function* () {\n const keys = Object.keys(argsForm.controls);\n for (const key of keys) yield key;\n };\n\n form.setControl('args', argsForm);\n }\n\n submit() {\n const result = {\n functions: this.calibrationForms.controls\n .filter((ctrl) => ctrl.valid)\n .map((ctrl) => ({\n ...ctrl.value,\n args: Object.values(ctrl.value.args),\n })),\n };\n\n this.deviceCreation\n .calibrateDevice(this.data.device.device_id, result)\n .subscribe((device) => {\n this.deviceUpdated.emit(device);\n this.ref.close(true);\n });\n }\n}\n\nfunction uniqueKeys(formArray: AbstractControl) {\n const controls = (formArray as UntypedFormArray).controls;\n const keys = controls.map((form) => form.get('field')?.value);\n const mapper = {};\n for (const key of keys) {\n if (mapper[key]) return { uniqueKeys: true };\n else mapper[key] = 1;\n }\n\n return null;\n}\n","\n
\n \n \n \n {{ i === 0 ? 'Received Timestamp' : column }}\n \n \n {{\n isTimestamp(column)\n ? (row[column] | date: 'yyyy-MM-ddTHH:mm:ssZZZZZ')\n : row[column]\n }}\n \n \n \n \n \n
\n\n\n\n

No data preview available for this device.

\n
\n","import {\n Component,\n EventEmitter,\n Input,\n OnChanges,\n Output,\n} from '@angular/core';\nimport { MatTableDataSource } from '@angular/material/table';\nimport { PubSubMessage } from 'src/models/data-routing.models';\n\n@Component({\n selector: 'app-data-preview',\n templateUrl: './data-preview.component.html',\n styleUrls: ['./data-preview.component.scss'],\n})\nexport class DataPreviewComponent implements OnChanges {\n @Input() tableData: PubSubMessage[] = [];\n @Input() columnsToDisplay: string[];\n dataSource = new MatTableDataSource(this.tableData);\n\n @Output() rowSelect = new EventEmitter();\n\n selectedRow: PubSubMessage;\n\n constructor() {}\n\n ngOnChanges() {\n this.dataSource = new MatTableDataSource(\n [...this.tableData].sort((a, b) =>\n a._received_timestamp < b._received_timestamp ? 1 : -1,\n ),\n );\n }\n\n public isTimestamp(key: string): boolean {\n return key.includes('timestamp');\n }\n}\n","
\n \n

{{ count }}

\n
\n","import { Component, Input } from '@angular/core';\n\n@Component({\n selector: 'app-counter-chip',\n templateUrl: './counter-chip.component.html',\n styleUrls: ['./counter-chip.component.scss'],\n})\nexport class CounterChipComponent {\n @Input() label: string;\n @Input() count: number;\n constructor() {}\n}\n","\n \n
\n

Device ID:

\n

{{ device.device_id }}

\n

Manufacturer:

\n

{{ device.deviceType.brand.name }}

\n

Model:

\n

{{ device.deviceType.name }}

\n

Data Source:

\n

{{ device.source_id | titlecase }}

\n

Functions:

\n
\n \n {{ function | titlecase }}\n

\n
\n \n

Control Groups:

\n
\n

\n {{ group.tag_id | titlecase }}\n

\n
\n
\n
\n
\n \n
\n \n

{{ replaceUnderScore(key) | titlecase }}:

\n

\n {{ device.metadata[key] | date: 'yyyy-MM-ddTHH:mm:ssZZZZZ' }}\n

\n

\n {{ device.metadata[key] }}\n

\n
\n

\n Device Region:\n

\n

\n {{ device.device_region | titlecase }}\n

\n
\n
\n \n \n \n
\n","import { Component, Input, OnInit } from '@angular/core';\nimport { MatDialog } from '@angular/material/dialog';\nimport { Observable } from 'rxjs';\nimport { DeviceDto, Downlink } from 'src/models/device.models';\nimport { SourceCode } from '../../../../../../models/device-type.models';\nimport { DataLoaderService } from '../../../../../services/state/data/data-loader.service';\nimport { DataStoreService } from '../../../../../services/state/data/data-store.service';\nimport { SendDownlinkDialogComponent } from '../../send-downlink-dialog/send-downlink-dialog.component';\n\n@Component({\n selector: 'app-detail-stepper',\n templateUrl: './detail-stepper.component.html',\n styleUrls: ['./detail-stepper.component.scss'],\n})\nexport class DetailStepperComponent implements OnInit {\n @Input() device: DeviceDto;\n\n public downlinks$: Observable;\n public downlinkHistoryColumns = ['date', 'payload', 'port', 'action'];\n\n constructor(\n private dataStoreService: DataStoreService,\n private dataLoaderService: DataLoaderService,\n private dialog: MatDialog,\n ) {}\n\n ngOnInit(): void {\n this.dataLoaderService\n .loadDeviceDownlinks(this.device.device_id)\n .subscribe();\n\n this.downlinks$ = this.dataStoreService.deviceDownlinks$;\n }\n\n public getSortedObjectKeys(obj: object): string[] {\n return Object.keys(obj)\n .filter((key) => !key.startsWith('_'))\n .sort((a: string, b: string) => a.localeCompare(b));\n }\n\n public isIOTcoreDevice(deviceSource: SourceCode): boolean {\n return deviceSource.toLowerCase() === 'iot_core';\n }\n\n public isTimeStamp(key: string): boolean {\n return key === 'created_at' || key === 'updated_at';\n }\n\n public replaceUnderScore(key: string): string {\n return key.replace('_', ' ');\n }\n\n public onSendDownlink(downlink: Downlink) {\n const { device_id, source_id } = this.device;\n this.dialog.open(SendDownlinkDialogComponent, {\n data: { deviceId: device_id, sourceId: source_id, downlink: downlink },\n });\n }\n\n public timestampToDate(timestamp: number) {\n return new Date(timestamp);\n }\n\n canSendDownlink(): boolean {\n return (\n this.device.source_id === 'firefly' ||\n this.device.source_id === 'iot_core'\n );\n }\n}\n","\n
\n

{{ device?.metadata?.name }}

\n
\n \n
\n \n Send Downlink\n \n
\n \n

\n {{\n device.calibration_functions.length <= 9\n ? device.calibration_functions.length\n : '9+'\n }}\n

\n
\n \n functions\n \n \n\n \n edit\n \n \n delete\n \n \n close\n \n
\n \n
\n \n add_a_photo\n \n \n fullscreen\n \n
\n \n
\n \n
\n
\n \n
\n
\n
\n \n \n
\n
\n
{{ selectedRow | json }}
\n
\n
\n
\n \n

\n {{ warning }}\n

\n \n \n
\n\n \n

Attention!

\n
\n

This action will delete the device permanently!

\n
\n
\n \n \n Delete\n \n
\n
\n\n \n \n\n
\n \n
\n
\n
\n","import {\n animate,\n state,\n style,\n transition,\n trigger,\n} from '@angular/animations';\nimport { Component, TemplateRef } from '@angular/core';\nimport { MatDialog } from '@angular/material/dialog';\nimport { PageEvent } from '@angular/material/paginator';\nimport { MatSnackBar } from '@angular/material/snack-bar';\nimport { ActivatedRoute, Router } from '@angular/router';\nimport { combineLatest, of, pipe } from 'rxjs';\nimport { filter, first, map, switchMap, tap } from 'rxjs/operators';\nimport { DeviceManagementService } from 'src/app/pages/main/device-management/device-management.service';\nimport { DevicesService } from 'src/app/services/http/devices.service';\nimport { InterfaceStateService } from 'src/app/services/state/interface/interface-store.service';\nimport { PubSubMessage } from 'src/models/data-routing.models';\nimport { DeviceTypeDTO } from 'src/models/device-type.models';\nimport { DeviceDto } from 'src/models/device.models';\nimport { DataStoreService } from '../../../../services/state/data/data-store.service';\nimport { DevicePictureUpdateComponent } from '../device-picture-update/device-picture-update.component';\nimport { SendDownlinkDialogComponent } from '../send-downlink-dialog/send-downlink-dialog.component';\nimport { DeviceUpdateComponent } from './../device-update/device-update.component';\nimport { DeviceCalibrationFunctionComponent } from './device-calibration-function/device-calibration-function.component';\n\n@Component({\n selector: 'app-device-detail',\n templateUrl: './device-detail.component.html',\n styleUrls: ['./device-detail.component.scss'],\n animations: [\n trigger('json', [\n state('void', style({ width: '0' })),\n state('*', style({ width: '*' })),\n transition(':enter', animate('250ms ease-out')),\n transition(':leave', animate('250ms ease-out')),\n ]),\n ],\n})\nexport class DeviceDetailComponent {\n device: DeviceDto;\n deviceList: DeviceDto[];\n messages?: PubSubMessage[];\n messageKeys: string[] = [];\n openWarnings: string[];\n\n deviceMessagesCount = 0;\n pageIndex = 0;\n pageSize = 25;\n messagesLoading = false;\n selectedRow?: PubSubMessage;\n\n constructor(\n private router: Router,\n private route: ActivatedRoute,\n public dialog: MatDialog,\n private deviceHttp: DevicesService,\n private deviceManagement: DeviceManagementService,\n private interfaceState: InterfaceStateService,\n private snackBar: MatSnackBar,\n private data: DataStoreService,\n ) {\n this._loadData();\n }\n\n private _loadData() {\n this.data.devices$\n .pipe(\n switchMap((devices) => {\n const device = devices?.find(\n (dev) => dev.device_id === this.route.snapshot.params.id,\n );\n return device\n ? of(device)\n : this.deviceHttp.getDeviceById(this.route.snapshot.params.id);\n }),\n tap((device) => {\n this.device = device;\n this.deviceList = [device];\n this.openWarnings = device.attribute_tags.map(\n (tag) => tag.metadata.document_marking,\n );\n }),\n switchMap((device) => of(device).pipe(this.setMessagesAndKeys$)),\n first(),\n )\n .subscribe();\n }\n\n private get setMessagesAndKeys$() {\n return pipe(\n switchMap((device: DeviceDto) =>\n combineLatest([\n this.deviceHttp\n .getDeviceTypeByID(device.deviceType.code, true)\n .pipe(this.extractBusinessFields$()),\n this.deviceHttp\n .getDeviceMessages(device, undefined, undefined, this.pageSize)\n .pipe(\n tap((msg) => (this.messages = msg)),\n this.extractMessageKey$(),\n ),\n this.deviceHttp\n .getDeviceMessagesCount(device)\n .pipe(tap((count) => (this.deviceMessagesCount = count))),\n ]),\n ),\n map(([businessFields, messageFields]) => [\n '_received_timestamp',\n ...(businessFields.length ? businessFields : messageFields),\n ]),\n tap((keys) => {\n if (this.messageKeys.length === 0) {\n this.messageKeys = keys;\n }\n }),\n );\n }\n\n updateMessages({ pageSize, pageIndex }: PageEvent) {\n const msg = this.messages!;\n let pageAction: 'PREV' | 'NEXT';\n let referenceTimestamp: number;\n\n if (pageIndex > this.pageIndex) {\n pageAction = 'NEXT';\n referenceTimestamp = msg[msg.length - 1]._received_timestamp;\n } else {\n pageAction = 'PREV';\n referenceTimestamp = msg[0]._received_timestamp;\n }\n\n this.messagesLoading = true;\n\n this.pageIndex = pageIndex;\n\n this.deviceHttp\n .getDeviceMessages(\n this.device,\n undefined,\n undefined,\n pageSize,\n pageAction,\n referenceTimestamp,\n )\n .pipe(\n tap((msg) => {\n this.messages = msg;\n this.messagesLoading = false;\n }),\n first(),\n )\n .subscribe();\n }\n\n private extractBusinessFields$() {\n return pipe(\n map((deviceType: DeviceTypeDTO) =>\n deviceType.exposedData\n ? deviceType.exposedData.businessFields.map((field) =>\n field.outputName ? field.outputName : field.name,\n )\n : [],\n ),\n );\n }\n\n private extractMessageKey$() {\n const reducer = (acc: string[], curr: PubSubMessage) =>\n acc.concat(this.getSortedObjectKeys(curr));\n return pipe(\n map((messages: PubSubMessage[]) => messages.reduce(reducer, [])),\n map((fields) => Array.from(new Set(fields))),\n );\n }\n\n public getSortedObjectKeys(obj: object): string[] {\n return Object.keys(obj)\n .filter((key) => !key.startsWith('_'))\n .sort((a: string, b: string) => a.localeCompare(b));\n }\n\n public onEdit() {\n const dialogRef = this.dialog.open(DeviceUpdateComponent, {\n width: '700px',\n data: { device: this.device },\n });\n\n dialogRef.afterClosed().subscribe((res) => {\n if (res) {\n this.device = res;\n this.openWarnings = res.attribute_tags.map(\n (tag) => tag.metadata.document_marking,\n );\n this.deviceList = [res];\n }\n });\n }\n\n public onDelete(templateRef: TemplateRef) {\n const deleteMsg = `Device ${this.device.device_id} was successfully deleted!`;\n const dialogRef = this.dialog.open(templateRef);\n\n dialogRef\n .afterClosed()\n .pipe(\n switchMap((res) =>\n res\n ? this.deviceManagement.deleteDevice(this.device).pipe(\n tap(async () => {\n await this.onClose();\n this.snackBar.open(deleteMsg, 'close');\n }),\n )\n : of(null),\n ),\n )\n .subscribe();\n }\n\n public onSendDownlink() {\n this.dialog.open(SendDownlinkDialogComponent, {\n data: {\n deviceId: this.device.device_id,\n sourceId: this.device.source_id,\n },\n });\n }\n\n public onClose() {\n this.router.navigateByUrl(this.interfaceState.lastRoutedUrl);\n }\n\n public get actionsHidden(): boolean {\n const source = this.device.source_id;\n return (\n source === 'pub_sub' ||\n source === 'sigfox' ||\n !this.deviceManagement.userHasWriteRights(this.device.tags[0].tag_id)\n );\n }\n\n public onEditPicture(imageUrl) {\n const dialogRef = this.dialog.open(DevicePictureUpdateComponent, {\n width: '700px',\n data: { device: this.device, imageUrl },\n });\n\n dialogRef.afterClosed().subscribe((res) => {\n if (res) {\n const info = { ...this.device, ...res };\n this.device = info;\n this.deviceList = [info];\n }\n });\n }\n\n public onEnlargePicture(templateRef: TemplateRef) {\n this.dialog.open(templateRef, { width: '800px', height: '800px' });\n }\n\n get deviceImageUrl() {\n const imgUrl =\n this.device.metadata.device_logo_url ||\n this.device.deviceType.logoUrl ||\n './assets/img/no_image_available.png';\n return `url('${imgUrl}')`;\n }\n\n onFunction() {\n const ref = this.dialog.open(DeviceCalibrationFunctionComponent, {\n width: '80vw',\n data: { fields: this.messageKeys, device: this.device },\n });\n\n ref.componentInstance.deviceUpdated.subscribe(\n (device) =>\n (this.device.calibration_functions = device.calibration_functions),\n );\n ref.backdropClick().subscribe(() => ref.close());\n\n ref\n .afterClosed()\n .pipe(filter((v) => !!v))\n .subscribe(() =>\n this.snackBar.open('Device characterized successfully', 'OK'),\n );\n }\n\n closeWarning(index: number) {\n this.openWarnings.splice(index, 1);\n }\n\n canSendDownlink(): boolean {\n return (\n this.device.source_id === 'firefly' ||\n this.device.source_id === 'iot_core'\n );\n }\n}\n","\n \n \n
  • \n \n \n \n {{ treeControl.isExpanded(node) ? 'folder_open' : 'folder' }}\n \n \n {{ node.name }}\n
    \n \n \n {{\n treeControl.isExpanded(node) ? 'arrow_drop_up' : 'arrow_drop_down'\n }}\n \n arrow_right \n \n \n
      \n \n
    \n
  • \n \n\n","import { NestedTreeControl } from '@angular/cdk/tree';\nimport {\n AfterViewInit,\n Component,\n Input,\n OnDestroy,\n OnInit,\n} from '@angular/core';\nimport { MatSnackBar } from '@angular/material/snack-bar';\nimport { MatTreeNestedDataSource } from '@angular/material/tree';\nimport { Router } from '@angular/router';\nimport { combineLatest, Subscription } from 'rxjs';\nimport { delay, filter, first, map, switchMap, tap } from 'rxjs/operators';\nimport { DeviceHierarchyStoreService } from 'src/app/services/state/data/device-hierarchy/device-hierarchy-store.service';\nimport { HierarchyNode } from 'src/models/device-hierarchy.models';\nimport { DeviceCreationService } from '../device-creation/device-creation.service';\nimport { DeviceManagementService } from '../device-management.service';\n\n@Component({\n selector: 'app-hierarchy-tree',\n templateUrl: './hierarchy-tree.component.html',\n styleUrls: ['./hierarchy-tree.component.scss'],\n})\nexport class HierarchyTreeComponent\n implements OnInit, AfterViewInit, OnDestroy\n{\n @Input() selectedNode: HierarchyNode;\n treeControl = new NestedTreeControl((node) => node.children);\n dataSource = new MatTreeNestedDataSource();\n\n subscriptions = new Subscription();\n\n constructor(\n private router: Router,\n private deviceManagement: DeviceManagementService,\n private deviceHierarchy: DeviceHierarchyStoreService,\n private deviceCreation: DeviceCreationService,\n private snack: MatSnackBar,\n ) {}\n\n ngOnInit(): void {\n this.subscriptions.add(\n this.deviceHierarchy.filteredHierarchyTree$\n .pipe(\n tap((hierarchy) => (this.dataSource.data = hierarchy)),\n delay(1),\n )\n .subscribe(() => this.scrollToActiveNode()),\n );\n\n this.subscriptions.add(\n combineLatest([\n this.deviceManagement.path$,\n this.deviceHierarchy.filteredHierarchyTree$,\n ])\n .pipe(\n map(([path]) => path),\n filter((path) => !!path?.length),\n map((path) => this.deviceHierarchy.getNodesForPath(path)),\n tap((nodes) => this.openNodes(nodes)),\n )\n .subscribe(),\n );\n }\n\n ngAfterViewInit(): void {\n this.scrollToActiveNode();\n }\n\n ngOnDestroy(): void {\n this.subscriptions.unsubscribe();\n }\n\n public isFolder(_: number, node: HierarchyNode): boolean {\n return !node.isDevice;\n }\n\n public nodeSelected(node: HierarchyNode): void {\n this.deviceHierarchy.filteredHierarchyTree$\n .pipe(first())\n .subscribe((hierarchy) => {\n const newPath = this.deviceHierarchy.getPathForNode(node, hierarchy);\n this.router.navigateByUrl(`home/device/manager?path=${newPath}`);\n });\n }\n\n private openNodes(nodes: HierarchyNode[]) {\n nodes.forEach((node) => this.treeControl.expand(node));\n }\n\n private scrollToActiveNode() {\n let activeNodeElement: HTMLElement | null;\n if (this.selectedNode) {\n activeNodeElement = document.getElementById(this.selectedNode.id);\n if (activeNodeElement) {\n activeNodeElement.scrollIntoView();\n }\n }\n }\n\n nodeIsSelected(node: HierarchyNode): boolean {\n return this.selectedNode ? this.selectedNode.id === node.id : false;\n }\n\n endDrag(event: DragEvent, node: HierarchyNode) {\n this.deviceManagement\n .dropDraggedItemOnNode(event, node)\n ?.pipe(\n switchMap((deviceIds) =>\n this.deviceCreation.moveDevices(\n deviceIds,\n this.deviceHierarchy.getPathForNode(node),\n ),\n ),\n switchMap(() => this.deviceHierarchy.loadDeviceHierarchy()),\n )\n .subscribe(() => {\n this.deviceManagement.resetDragData();\n this.deviceManagement.setSelectedNode(\n this.deviceHierarchy.getSelectedNodeForPath(\n this.deviceManagement.path,\n ),\n );\n this.snack.open('Device successfully moved', 'OK');\n });\n }\n\n allowDrop(event: DragEvent) {\n this.deviceManagement.allowDroppingDraggedItem(event);\n }\n\n preventDrop(event: DragEvent) {\n this.deviceManagement.preventDroppingDraggedItem(event);\n }\n}\n","\n
    \n

    Site List

    \n
    \n
    \n \n
    \n
    \n \n Instant search\n \n close\n \n \n {{ option }}\n \n \n \n
    \n
    \n \n
    \n
    \n","import { Component, OnInit } from '@angular/core';\nimport { ActivatedRoute } from '@angular/router';\nimport { of } from 'rxjs';\nimport {\n filter,\n first,\n map,\n skip,\n skipWhile,\n switchMap,\n tap,\n} from 'rxjs/operators';\nimport { DeviceHierarchyStoreService } from 'src/app/services/state/data/device-hierarchy/device-hierarchy-store.service';\nimport { HierarchyNode } from '../../../../models/device-hierarchy.models';\nimport { DeviceManagementService } from './device-management.service';\n\n@Component({\n selector: 'app-device-management',\n templateUrl: './device-management.component.html',\n styleUrls: ['./device-management.component.scss'],\n})\nexport class DeviceManagementComponent implements OnInit {\n public selectedNode$ = this.deviceManagement.selectedNode$;\n\n searchControl = this.hierarchyStore.searchControl;\n\n options$ = this.hierarchyStore.searchOptions$;\n\n loaded$ = this.hierarchyStore.deviceHierarchyTree$;\n\n constructor(\n private route: ActivatedRoute,\n private hierarchyStore: DeviceHierarchyStoreService,\n private deviceManagement: DeviceManagementService,\n ) {\n this._loadData();\n }\n\n hierarchyLoaded(hierarchy: HierarchyNode[]) {\n return !!hierarchy?.length;\n }\n\n private _loadData() {\n this.hierarchyStore.loadDeviceHierarchy().pipe(first()).subscribe();\n }\n\n ngOnInit() {\n this.route.queryParams\n .pipe(\n map((params) => params.path ?? ''),\n tap((path) => this.deviceManagement.setPath(path)),\n filter((path) => !!path.length),\n switchMap((path) => this.updateSelectedNode(path)),\n )\n .subscribe();\n }\n\n resetSearch() {\n const path = this.route.snapshot.queryParams.path;\n this.hierarchyStore.filteredHierarchyTree$\n .pipe(skip(1), first())\n .subscribe((hierarchy) => {\n this.deviceManagement.setSelectedNode(\n this.hierarchyStore.getSelectedNodeForPath(path, hierarchy),\n );\n });\n this.searchControl.setValue('');\n }\n\n private updateSelectedNode(path: string) {\n return of(path).pipe(\n switchMap(() =>\n this.hierarchyStore.filteredHierarchyTree$.pipe(\n skipWhile((v) => !v.length),\n first(),\n ),\n ),\n tap((hierarchy) => {\n this.deviceManagement.setSelectedNode(\n this.hierarchyStore.getSelectedNodeForPath(path, hierarchy),\n );\n }),\n );\n }\n}\n","
    \n \n Source\n\n \n \n
    \n {{ item?.source?.name }}\n \"Data\n
    \n
    \n
    \n
    \n\n \n Manufacturer\n\n \n \n
    \n {{ item?.brand?.name }}\n \"Brand\n
    \n \n
    \n
    \n\n \n Model\n\n \n \n
    \n {{ item?.metadata?.label }}\n \"Device\n
    \n \n
    \n
    \n
    \n","import { Component, Input, OnInit, Optional, Self } from '@angular/core';\nimport {\n ControlValueAccessor,\n NgControl,\n UntypedFormBuilder,\n Validators,\n} from '@angular/forms';\nimport { UntilDestroy, untilDestroyed } from '@ngneat/until-destroy';\nimport { BehaviorSubject, combineLatest } from 'rxjs';\nimport { first, map } from 'rxjs/operators';\nimport { DeviceTypeDTO } from 'src/models/device-type.models';\nimport { DataStoreService } from '../../../../../services/state/data/data-store.service';\n\n@UntilDestroy()\n@Component({\n selector: 'app-device-providing-model-select',\n templateUrl: './device-providing-model-select.component.html',\n styleUrls: ['./device-providing-model-select.component.scss'],\n})\nexport class DeviceProvidingModelSelectComponent\n implements OnInit, ControlValueAccessor\n{\n private _sourceFilter = new BehaviorSubject('');\n\n @Input() set sourceFilter(value: string) {\n this._sourceFilter.next(value);\n }\n\n groupedTypes$ = combineLatest([\n this.data.groupedDeviceTypes$,\n this._sourceFilter.asObservable(),\n ]).pipe(\n map(([groups, filter]) =>\n filter\n ? groups.filter((group) => group?.source?.code === filter)\n : groups,\n ),\n );\n\n form = this.fb.group({\n source: [null, [Validators.required]],\n brand: [null, [Validators.required]],\n model: [null, [Validators.required]],\n });\n\n private _changeFn: (arg: unknown) => void;\n\n constructor(\n private data: DataStoreService,\n private fb: UntypedFormBuilder,\n @Optional() @Self() private _ngControl: NgControl,\n ) {\n if (this._ngControl) this._ngControl.valueAccessor = this;\n }\n\n ngOnInit(): void {\n this.form\n .get('source')\n ?.valueChanges.pipe(untilDestroyed(this))\n .subscribe(() => this.form.patchValue({ brand: null }));\n\n this.form\n .get('brand')\n ?.valueChanges.pipe(untilDestroyed(this))\n .subscribe(() => this.form.patchValue({ model: null }));\n\n this.form\n .get('model')\n ?.valueChanges.pipe(untilDestroyed(this))\n .subscribe((value) => this._changeFn(value));\n }\n\n writeValue(obj: DeviceTypeDTO): void {\n this.groupedTypes$.pipe(first()).subscribe((groups) => {\n const source = groups?.find(\n (item) => item?.source?.code === obj?.source?.code,\n );\n const brand = source?.brands?.find(\n (item) => item?.brand?.name === obj?.brand?.name,\n );\n const model = brand?.models?.find(\n (item) => item?.device_type_id === obj?.code,\n );\n\n if (source && brand && model)\n this.form.patchValue({ source, brand, model });\n });\n }\n\n registerOnChange(fn: (arg: unknown) => void): void {\n this._changeFn = fn;\n }\n\n registerOnTouched(): void {}\n\n setDisabledState(value: boolean) {\n const method = value ? 'disable' : 'enable';\n for (const controlName in this.form.controls)\n this.form.get(controlName)?.[method]?.();\n }\n\n compareSourceFn(one, two) {\n return one?.source.code === two?.source.code;\n }\n compareBrandFn(one, two) {\n return one?.brand?.id === two?.brand?.id;\n }\n compareModelFn(one, two) {\n return one?.device_type_id === two?.device_type_id;\n }\n}\n","\n

    Multi-device provisioning

    \n\n \n
    \n

    Upload a .csv file to provide multiple firefly devices at once.

    \n\n

    \n Use the button \"Download template\" at the bottom of this dialog to\n download the template required to upload them.
    \n

    \n

    \n \n \n Note : region will be \"{{ regions[0]?.option }}\", data rate will be\n \"{{ dataRates[0]?.option }}\", devices will be added to \"{{ path }}\"\n \n \n

    \n\n \n\n

    \n
    \n
    \n\n \n
    \n \n Upload CSV file\n \n \n \n \n Upload {{ deviceCount || '' }} device{{\n (deviceCount > 2 && 's') || ''\n }}\n \n
    \n
    \n
    \n\n\n

    Multi-device provisioning

    \n\n \n
    \n\n\n

    Multi-device provisioning

    \n\n \n
    \n

    \n {{ createdDevices.length }} device{{\n (createdDevices.length >= 2 && 's have') || ' has'\n }}\n been successfully created!\n

    \n

    \n {{ failureCount }} device{{ (failureCount >= 2 && 's') || '' }} could\n not be created. Download the feedback CSV for more information.\n

    \n
    \n
    \n\n \n
    \n \n Download Feedback CSV\n \n\n \n \n
    \n
    \n
    \n","import { Component } from '@angular/core';\nimport { UntypedFormControl, Validators } from '@angular/forms';\nimport { MatDialogRef } from '@angular/material/dialog';\nimport { ActivatedRoute } from '@angular/router';\nimport { DataStoreService } from 'src/app/services/state/data/data-store.service';\nimport { DeviceTypeDTO } from 'src/models/device-type.models';\nimport {\n DeviceDto,\n fireflyDeviceCSVInfo,\n iotCoreDeviceCSVInfo,\n} from 'src/models/device.models';\nimport { DeviceCreationService } from '../device-creation/device-creation.service';\n\n@Component({\n selector: 'app-device-providing',\n templateUrl: './device-providing.component.html',\n styleUrls: ['./device-providing.component.scss'],\n})\nexport class DeviceProvidingComponent {\n creationRequestLoader = false;\n createdDevices: DeviceDto[] = [];\n errorResult: string;\n path = this.route.snapshot.queryParams.path;\n\n regions = this.data.regions;\n dataRates = this.data.dataRates;\n\n private _csvTemplates = {\n firefly: createFirstLinesOfCsvModels(fireflyDeviceCSVInfo),\n iotcore: createFirstLinesOfCsvModels(iotCoreDeviceCSVInfo),\n };\n\n private template = this._csvTemplates.firefly;\n defaultRegion = this.regions[0].value;\n defaultDatarate = this.dataRates[0]?.value;\n\n deviceTypeControl = new UntypedFormControl(null, [Validators.required]);\n\n httpPayload: string;\n deviceCount: number;\n\n constructor(\n private route: ActivatedRoute,\n private deviceCreationService: DeviceCreationService,\n private data: DataStoreService,\n public ref: MatDialogRef,\n ) {}\n\n downloadTemplate(template = this.template, deviceType = 'firefly') {\n const blob = new Blob([template], { type: 'text/csv' });\n const url = URL.createObjectURL(blob);\n const link = document.createElement('a');\n link.href = url;\n link.download = deviceType + '_device_import.csv';\n link.click();\n URL.revokeObjectURL(url);\n }\n\n downloadErrorResults(errorResult: string, deviceType = 'firefly') {\n const blob = new Blob([errorResult], { type: 'text/csv' });\n const url = URL.createObjectURL(blob);\n const link = document.createElement('a');\n link.href = url;\n link.download = deviceType + '_device_creation_failures.csv';\n link.click();\n URL.revokeObjectURL(url);\n }\n\n uploadFile() {\n const fileInput = document.createElement('input');\n fileInput.type = 'file';\n fileInput.accept = '.csv';\n\n fileInput.onchange = () => {\n const file = fileInput.files?.item(0);\n\n if (!file) return;\n\n const reader = new FileReader();\n\n reader.onloadend = () => {\n const content = reader.result as string;\n const lines = content.split('\\r\\n');\n const delimiter = detectDelimiter(lines[0]);\n\n lines[0] += `${delimiter}activationType${delimiter}isClassC${delimiter}dataRate`;\n lines[1] += `${delimiter}Activation Type 'OTAA'${delimiter}Class C device${delimiter}Device data rate`;\n\n lines\n .slice(2)\n .forEach(\n (line, i) =>\n (lines[i + 2] += line\n ? `${delimiter}OTAA${delimiter}false${delimiter}${this.defaultDatarate}`\n : ''),\n );\n\n this.httpPayload = lines.join('\\n');\n this.deviceCount = lines.slice(2).filter((v) => !!v).length;\n };\n\n reader.readAsText(file);\n };\n\n fileInput.click();\n }\n\n uploadDevices() {\n this.creationRequestLoader = true;\n this.deviceCreationService\n .createFireflyDevices(\n this.httpPayload,\n this.path,\n (this.deviceTypeControl.value as DeviceTypeDTO).code,\n )\n .subscribe(\n (res) => {\n this.createdDevices = res.created;\n },\n (error) => {\n this.errorResult = error.error.error;\n this.createdDevices = error.error.created;\n },\n );\n }\n\n get failureCount() {\n return this.deviceCount - this.createdDevices.length;\n }\n}\n\nfunction createFirstLinesOfCsvModels(objectToUse: Record) {\n return Object.entries(objectToUse)\n .reduce(\n ([fl, sl], [key, value]) => [\n fl ? `${fl},${key}` : `${key}`,\n sl ? `${sl},${value}` : `${value}`,\n ],\n ['', ''],\n )\n .join('\\n');\n}\n\nfunction detectDelimiter(input: string): string {\n const separators = [',', ';', '|', '\\t'];\n const idx = separators\n .map((separator) => input.indexOf(separator))\n .reduce((prev, cur) =>\n prev === -1 || (cur !== -1 && cur < prev) ? cur : prev,\n );\n return (input[idx] || ',') as string;\n}\n","import { Component } from '@angular/core';\nimport {\n UntypedFormControl,\n UntypedFormGroup,\n Validators,\n} from '@angular/forms';\nimport { MatDialogRef } from '@angular/material/dialog';\n\n@Component({\n selector: 'app-new-folder-dialog',\n templateUrl: './new-folder-dialog.component.html',\n styleUrls: ['./new-folder-dialog.component.scss'],\n})\nexport class NewFolderDialogComponent {\n nameForm = new UntypedFormGroup({\n name: new UntypedFormControl(null, Validators.required),\n });\n\n constructor(public dialogRef: MatDialogRef) {}\n\n onNoClick(): void {\n this.dialogRef.close();\n }\n\n onSubmit(): void {\n this.dialogRef.close(this.nameForm.value.name);\n }\n}\n","
    \n

    Please enter a name for the new Folder!

    \n
    \n \n \n \n
    \n
    \n
    \n \n \n Ok\n \n
    \n","import { Component, Input } from '@angular/core';\nimport { HierarchyNode } from 'src/models/device-hierarchy.models';\n\n@Component({\n selector: 'app-folder-list-element',\n templateUrl: './folder-list-element.component.html',\n styleUrls: ['./folder-list-element.component.scss'],\n})\nexport class FolderListElementComponent {\n @Input() node: HierarchyNode;\n\n constructor() {}\n\n public get deviceCount(): number {\n return this.node.children.filter((node) => node.isDevice).length;\n }\n}\n","
    \n {{ node.id }}\n
    \n
    \n

    {{ deviceCount }} devices

    \n
    \n","import {\n Component,\n HostBinding,\n HostListener,\n Input,\n ViewChild,\n} from '@angular/core';\nimport { MatCheckbox } from '@angular/material/checkbox';\nimport { DeviceDto } from 'src/models/device.models';\nimport { DeviceManagementService } from '../../device-management.service';\n\n@Component({\n selector: 'app-device-list-element',\n templateUrl: './device-list-element.component.html',\n styleUrls: ['./device-list-element.component.scss'],\n})\nexport class DeviceListElementComponent {\n @Input() device: DeviceDto;\n\n @HostBinding('attr.draggable') private isDraggable = true;\n\n @ViewChild('dragBoxEl') dragBoxEl: MatCheckbox;\n\n constructor(private service: DeviceManagementService) {}\n\n @HostListener('dragstart', ['$event'])\n startDrag(event: DragEvent) {\n this.service.startDraggingItem(event, this.device);\n }\n\n dragboxChange(checked: boolean) {\n this.service.toggleDragItem(this.device, checked);\n }\n\n toggleCheckbox(checked: boolean) {\n this.dragBoxEl.writeValue(checked);\n }\n}\n","
    \n \n \n
    \n
    \n \n

    \n {{\n device.metadata.name.length > 22\n ? (device.metadata.name | slice: 0 : 22) + '...'\n : device.metadata.name\n }}\n

    \n

    \n EUI:\n {{\n device.device_id.length > 16\n ? (device.device_id | slice: 0 : 16) + '...'\n : device.device_id\n }}\n

    \n
    \n
    \n

    Source

    \n
    \n

    {{ device?.deviceType?.source?.name }}

    \n \n
    \n

    Model

    \n

    \n {{\n device?.deviceType?.name?.length > 18\n ? (device?.deviceType?.name | slice: 0 : 18) + '...'\n : device?.deviceType?.name\n }}\n

    \n
    \n\n","import { Component, EventEmitter, Output } from '@angular/core';\n\n@Component({\n selector: 'app-action-buttons',\n templateUrl: './action-buttons.component.html',\n styleUrls: ['./action-buttons.component.scss'],\n})\nexport class ActionButtonsComponent {\n @Output() addFolder = new EventEmitter();\n @Output() addDevice = new EventEmitter();\n @Output() addDevices = new EventEmitter();\n\n open = false;\n\n constructor() {}\n\n public toggleOpen() {\n this.open = !this.open;\n }\n}\n","
    \n \n \n \n \n \n \n \n \n \n \n
    \n","\n
    \n

    Elements

    \n
    \n \n Uncheck all devices\n \n \n list\n \n \n folder_open\n \n
    \n
    \n \n \n \n
    \n
    \n","import { Component, QueryList, ViewChildren, inject } from '@angular/core';\nimport { MatSnackBar } from '@angular/material/snack-bar';\nimport { MatDialog } from '@angular/material/dialog';\nimport { ResolveFn, Router } from '@angular/router';\nimport { Observable, of } from 'rxjs';\nimport { filter, first, map, switchMap, tap } from 'rxjs/operators';\nimport { DeviceManagementService } from 'src/app/pages/main/device-management/device-management.service';\nimport { DataStoreService } from 'src/app/services/state/data/data-store.service';\nimport { DeviceHierarchyStoreService } from 'src/app/services/state/data/device-hierarchy/device-hierarchy-store.service';\nimport { HierarchyNode } from 'src/models/device-hierarchy.models';\nimport { DeviceDto } from 'src/models/device.models';\nimport { AuthService } from '../../../../services/state/auth/auth.service';\nimport { DataLoaderService } from '../../../../services/state/data/data-loader.service';\nimport { DeviceCreationService } from '../device-creation/device-creation.service';\nimport { DeviceProvidingComponent } from '../device-providing/device-providing.component';\nimport { DeviceListElementComponent } from './device-list-element/device-list-element.component';\nimport { NewFolderDialogComponent } from './new-folder-dialog/new-folder-dialog.component';\n\n@Component({\n selector: 'app-hierarchy-node-list',\n templateUrl: './hierarchy-node-list.component.html',\n styleUrls: ['./hierarchy-node-list.component.scss'],\n})\nexport class HierarchyNodeListComponent {\n folders$ = this.foldersInSelectedNode$;\n devices$ = this.devicesInSelectedNode$;\n\n allDevices$ = this.data.devices$;\n\n get hasDragData() {\n return this.deviceManagement.hasDragData();\n }\n\n @ViewChildren('deviceEls') deviceEls: QueryList;\n\n static getResolver(): Record> {\n return {\n sites: () =>\n inject(DeviceManagementService).userHasWriteRights()\n ? inject(DataStoreService).sites ??\n inject(DataLoaderService).loadSites()\n : undefined,\n };\n }\n\n constructor(\n private deviceManagement: DeviceManagementService,\n private deviceHierarchy: DeviceHierarchyStoreService,\n private data: DataStoreService,\n public router: Router,\n public dialog: MatDialog,\n public auth: AuthService,\n private dataLoader: DataLoaderService,\n private snack: MatSnackBar,\n private deviceCreation: DeviceCreationService,\n ) {\n this._loadData();\n }\n\n private _loadData() {\n this.dataLoader.loadDevices().pipe(first()).subscribe();\n }\n\n resetDragData() {\n this.deviceManagement.resetDragData();\n for (const el of this.deviceEls?.toArray() ?? []) el.toggleCheckbox(false);\n }\n\n private get foldersInSelectedNode$(): Observable {\n return this.deviceManagement.selectedNode$.pipe(\n filter((node) => !!node),\n map((node: HierarchyNode) =>\n this.deviceHierarchy.getSortedFolders(node.children),\n ),\n tap(() => this.resetDragData()),\n );\n }\n\n private get devicesInSelectedNode$(): Observable {\n return this.deviceManagement.selectedNode$.pipe(\n map((node) => this.deviceHierarchy.getSortedDevices(node.children)),\n map((deviceNodes) =>\n deviceNodes\n .map(\n (node) =>\n this.data.devices?.find(\n (device) => device.device_id === node.id,\n ) as DeviceDto,\n )\n .filter((v) => !!v),\n ),\n );\n }\n\n public get actionButtonsEnabled(): boolean {\n return (\n this.deviceManagement.userHasWriteRights() &&\n this.deviceManagement.selectedNode.id !== 'root'\n );\n }\n\n public folderSelected(folder: HierarchyNode): void {\n const newPath = `${this.deviceManagement.path}/${folder.id}`;\n this.router.navigate([], { queryParams: { path: newPath } });\n }\n\n public deviceSelected(device: DeviceDto): void {\n this.router.navigateByUrl(`home/device/details/${device.device_id}`);\n }\n\n public addFolder(): void {\n const newFolder = {\n id: '',\n name: '',\n children: [],\n isDevice: false,\n isData: false,\n };\n\n const dialogRef = this.dialog.open(NewFolderDialogComponent);\n\n dialogRef\n .afterClosed()\n .pipe(\n filter((res) => !!res),\n tap((res) => {\n newFolder.name = res;\n newFolder.id = res;\n }),\n tap(() => this.deviceManagement.addFolder(newFolder)),\n )\n .subscribe();\n }\n\n public addDevice(): void {\n this.router.navigate(['/home/device/new'], {\n queryParams: { path: this.deviceManagement.path },\n });\n }\n\n addDevices(): void {\n if (!this.deviceManagement.isFireflyConfiguredInSelectedSite()) {\n this.snack.open(\n 'Operation impossible: the current site misses a configured Firefly organization.',\n 'Close',\n );\n return;\n }\n this.data.deviceTypes$\n .pipe(\n first(),\n switchMap((types) =>\n types?.length ? of(types) : this.dataLoader.loadDeviceTypes(),\n ),\n map(() =>\n this.dialog.open(DeviceProvidingComponent, {\n autoFocus: false,\n }),\n ),\n tap((ref) => ref.backdropClick().subscribe(() => ref.close())),\n switchMap((ref) => ref.afterClosed()),\n )\n .subscribe((res) => {\n if (res) this.snack.open('Devices added successfully', 'OK');\n });\n }\n\n endDrag(event: DragEvent, node: HierarchyNode) {\n this.deviceManagement\n .dropDraggedItemOnNode(event, node)\n ?.pipe(\n switchMap((deviceIds) =>\n this.deviceCreation.moveDevices(\n deviceIds,\n this.deviceHierarchy.getPathForNode(node),\n ),\n ),\n switchMap(() => this.deviceHierarchy.loadDeviceHierarchy()),\n )\n .subscribe(() => {\n this.deviceManagement.resetDragData();\n this.deviceManagement.setSelectedNode(\n this.deviceHierarchy.getSelectedNodeForPath(\n this.deviceManagement.path,\n ),\n );\n this.snack.open('Device successfully moved', 'OK');\n });\n }\n\n allowDrop(event: DragEvent) {\n this.deviceManagement.allowDroppingDraggedItem(event);\n }\n\n preventDrop(event: DragEvent) {\n this.deviceManagement.preventDroppingDraggedItem(event);\n }\n\n openMultiDownlink() {\n this.deviceManagement.setView('multi-downlink');\n this.router.navigateByUrl(`home/device/${this.deviceManagement.view}`);\n }\n\n openManager() {\n this.deviceManagement.setView('manager');\n this.router.navigate([`/home/device/${this.deviceManagement.view}`], {\n queryParams: { path: this.deviceManagement.path },\n });\n }\n}\n","
    \n
    \n

    Devices

    \n
    \n \n list\n \n \n folder_open\n \n
    \n
    \n \n
    \n
    \n \n SEND DOWNLINK\n \n
    \n
    \n
    \n\n
    \n \n \n \n \n \n \n \n \n \n \n \n \n \n Site\n \n \n {{ device.site_label }}\n \n \n \n \n Model\n \n \n {{ device.device_type_label }}\n \n \n \n \n Source\n \n \n {{ device.source_label }}\n \n \n \n \n ID (EUI)\n \n \n {{ device.id }}\n \n \n \n \n Name\n \n \n {{ device.name }}\n \n \n \n \n Creation date\n \n \n {{ device.creation_date | date: 'yyyy-MM-dd' }}\n \n \n \n \n Last downlink\n \n \n {{ device.last_downlink | date: 'yyyy-MM-dd' || '--' }}\n \n \n \n \n \n
    \n
    \n Selected{{ selection.selected.length }}/{{\n this.dataSource.paginator?.pageSize\n }}\n
    \n \n
    \n
    \n\n\n
    \n \n Site\n \n \n {{ site.country.isoCode }} -\n {{ site.name }}\n \n \n \n \n Source\n \n All\n {{ source.name }}\n \n \n \n Model\n \n All\n {{ model?.brand.name }} - {{ model?.metadata?.label }}\n \n \n \n history RESET FILTER\n \n \n
    \n","import { SelectionModel } from '@angular/cdk/collections';\nimport { Component, OnInit, ViewChild } from '@angular/core';\nimport { FormControl, FormGroup } from '@angular/forms';\nimport { MatPaginator } from '@angular/material/paginator';\nimport { MatDialog } from '@angular/material/dialog';\nimport { MatSort } from '@angular/material/sort';\nimport { MatTableDataSource } from '@angular/material/table';\nimport { Router } from '@angular/router';\nimport { catchError, filter, map, merge, of, switchMap, tap } from 'rxjs';\nimport {\n DeviceTypeDTO,\n Source,\n SourceCode,\n} from '../../../../../models/device-type.models';\nimport { DeviceDto } from '../../../../../models/device.models';\nimport { AuthService } from '../../../../services/state/auth/auth.service';\nimport { DataLoaderService } from '../../../../services/state/data/data-loader.service';\nimport { DataStoreService } from '../../../../services/state/data/data-store.service';\nimport { DeviceManagementService } from '../device-management.service';\nimport { SendDownlinkDialogComponent } from '../send-downlink-dialog/send-downlink-dialog.component';\n\nconst sortDeviceTypes = (a: DeviceTypeDTO, b: DeviceTypeDTO) => {\n if (`${a.brand.name} - ${a.name}` < `${b.brand.name} - ${b.name}`) {\n return -1;\n } else if (`${a.brand.name} - ${a.name}` > `${b.brand.name} - ${b.name}`) {\n return 1;\n } else {\n return 0;\n }\n};\n\ninterface DeviceTableData {\n id: string;\n name: string;\n device_type_id: string;\n device_type_label: string;\n source_id: SourceCode;\n source_label: string;\n creation_date: number;\n creation_date_iso: string;\n last_downlink?: number;\n last_downlink_iso: string;\n site_id: string;\n site_label: string;\n}\n\nconst formatTableDataElement = (\n device: DeviceDto,\n sources: Source[],\n): DeviceTableData => {\n return {\n id: device.device_id,\n name: device.metadata.name,\n device_type_id: device.deviceType.code,\n device_type_label: `${device.deviceType.brand.name} - ${device.deviceType.name}`,\n source_id: device.source_id,\n source_label: `${sources.find((source) => source.code === device.source_id)?.name}`,\n creation_date: device.metadata.created_at as number,\n creation_date_iso: device.metadata.created_at\n ? new Date(device.metadata.created_at as number).toISOString()\n : '',\n last_downlink: device.statistics.last_downlink,\n last_downlink_iso: device.statistics.last_downlink\n ? new Date(device.statistics.last_downlink as number).toISOString()\n : '',\n site_id: device.site.tag_id,\n site_label: `${device.site.metadata.iso_code} - ${device.site.metadata.site_long_name}`,\n };\n};\n\n@Component({\n selector: 'app-multi-downlink',\n templateUrl: './multi-downlink.component.html',\n styleUrls: ['./multi-downlink.component.scss'],\n})\nexport class MultiDownlinkComponent implements OnInit {\n //filter\n filterForm = this.buildFilterForm();\n models$ = this.data.deviceTypes$.pipe(\n filter((dt) => !!dt),\n map((dt) => dt!.sort((a, b) => sortDeviceTypes(a, b))),\n );\n sites$ = this.data.sites$;\n sources$ = this.data.sources$;\n\n //table\n @ViewChild(MatPaginator, { static: true })\n paginator!: MatPaginator;\n @ViewChild(MatSort, { static: true }) sort: MatSort;\n deviceTableData: DeviceTableData[];\n dataSource = new MatTableDataSource();\n selection = new SelectionModel(true, []);\n displayedColumns: string[] = [\n 'select',\n 'site_label',\n 'source_label',\n 'device_type_label',\n 'id',\n 'name',\n 'creation_date',\n 'last_downlink',\n ];\n\n constructor(\n private deviceManagement: DeviceManagementService,\n private router: Router,\n public auth: AuthService,\n private dataLoader: DataLoaderService,\n private data: DataStoreService,\n public dialog: MatDialog,\n ) {\n this._loadData().subscribe();\n }\n\n ngOnInit(): void {\n this.handleFilterChanges().subscribe();\n }\n\n openMultiDownlink() {\n this.deviceManagement.setView('multi-downlink');\n this.router.navigateByUrl(`home/device/${this.deviceManagement.view}`);\n }\n\n openManager() {\n this.deviceManagement.setView('manager');\n this.router.navigate([`/home/device/${this.deviceManagement.view}`], {\n queryParams: { path: this.deviceManagement.path },\n });\n }\n\n resetForm() {\n this.filterForm.patchValue({\n project_ids: '',\n device_type_id: '',\n source: '',\n });\n this.filterForm.markAsUntouched();\n }\n\n getPageData() {\n return this.dataSource._pageData(\n this.dataSource._orderData(this.dataSource.filteredData),\n );\n }\n\n isEntirePageSelected() {\n return this.getPageData().every((row) => this.selection.isSelected(row));\n }\n\n masterToggle() {\n this.isEntirePageSelected()\n ? this.selection.clear()\n : this.selection.select(...this.getPageData());\n }\n\n resetSelection() {\n this.selection.clear();\n }\n\n get isValidSelection(): boolean {\n const selection = this.selection.selected;\n return this.checkAllFirefly(selection) && this.checkAllSameModel(selection);\n }\n\n get sendButtonTooltip(): string {\n const selection = this.selection.selected;\n if (!selection.length) {\n return 'Please select at least one device';\n } else if (!this.checkAllFirefly(selection)) {\n return 'Downlink is only available for Firefly (LoRaWAN) devices';\n } else if (!this.checkAllSameModel(selection)) {\n return 'Downlink is only available for devices of the same model';\n }\n return '';\n }\n\n get resetTooltip() {\n return this.selection.selected.length\n ? 'changing the filter or table page will undo your current selection'\n : '';\n }\n\n checkAllFirefly(selection: DeviceTableData[]): boolean {\n return selection.every((device) => device.source_id.includes('firefly'));\n }\n\n checkAllSameModel(selection: DeviceTableData[]): boolean {\n return new Set(selection.map((device) => device.device_type_id)).size === 1;\n }\n\n public onSendDownlink() {\n this.dialog\n .open(SendDownlinkDialogComponent, {\n data: { deviceIds: this.selection.selected.map((device) => device.id) },\n })\n .afterClosed()\n .pipe(\n filter((success) => !!success),\n switchMap(() => this._loadDevices()),\n )\n .subscribe(() => {\n this.dataSource.data = this.filterDeviceTable(this.filterForm.value);\n this.dataSource.paginator = this.paginator;\n this.dataSource.sort = this.sort;\n this.selection.clear();\n this.paginator.firstPage();\n });\n }\n\n private _loadData() {\n return merge(\n this._loadDevices(),\n this.data.deviceTypes$.pipe(\n switchMap((state) =>\n state ? of(state) : this.dataLoader.loadDeviceTypes(),\n ),\n catchError(() => of([])),\n ),\n this.data.sites$.pipe(\n switchMap((state) => (state ? of(state) : this.dataLoader.loadSites())),\n catchError(() => of([])),\n ),\n this.data.sources$.pipe(\n switchMap((state) =>\n state ? of(state) : this.dataLoader.loadSources(),\n ),\n catchError(() => of([])),\n ),\n );\n }\n\n private _loadDevices() {\n return this.dataLoader.loadDevices().pipe(\n map((devices) => {\n const sources = this.data.sources ?? [];\n return devices.map((device) => formatTableDataElement(device, sources));\n }),\n tap((tableData) => {\n this.deviceTableData = tableData;\n this.dataSource.data = tableData;\n this.dataSource.paginator = this.paginator;\n this.dataSource.sort = this.sort;\n }),\n );\n }\n\n private handleFilterChanges() {\n return this.filterForm.valueChanges.pipe(\n tap((value) => {\n this.selection.clear();\n this.dataSource.data = this.filterDeviceTable(value);\n this.dataSource.paginator = this.paginator;\n this.dataSource.sort = this.sort;\n }),\n );\n }\n\n private buildFilterForm(\n projectIds = [],\n deviceType = '',\n source = '',\n ): FormGroup {\n return new FormGroup({\n project_ids: new FormControl(projectIds),\n device_type_id: new FormControl(deviceType),\n source: new FormControl(source),\n });\n }\n\n private filterDeviceTable(filter): DeviceTableData[] {\n let devices = this.deviceTableData;\n if (devices) {\n if (filter.project_ids.length) {\n devices = devices.filter((device) =>\n filter.project_ids.includes(device.site_id),\n );\n }\n\n if (filter.source) {\n devices = devices.filter(\n (device) => device.source_id === filter.source,\n );\n }\n\n if (filter.device_type_id) {\n devices = devices.filter(\n (device) => device.device_type_id === filter.device_type_id,\n );\n }\n }\n if (this.dataSource.paginator) {\n this.dataSource.paginator.firstPage();\n }\n return devices ?? [];\n }\n}\n","
    \n

    Import an existing Gateway from Mulititech DeviceHQ

    \n \n
    \n
    \n \n Serial\n \n \n \n Site\n \n \n {{ site.country.isoCode }} - {{ site.name }}\n \n \n \n\n
    \n \n
    \n \n Submit\n \n
    \n\n","import { Component } from '@angular/core';\nimport {\n UntypedFormControl,\n UntypedFormGroup,\n Validators,\n} from '@angular/forms';\nimport { Router } from '@angular/router';\nimport { UntilDestroy } from '@ngneat/until-destroy';\nimport { DevicesService } from 'src/app/services/http/devices.service';\nimport { DataLoaderService } from 'src/app/services/state/data/data-loader.service';\n\nimport { Observable } from 'rxjs';\nimport { filter, map, switchMap, tap } from 'rxjs/operators';\nimport { AuthService } from 'src/app/services/state/auth/auth.service';\nimport { DataStoreService } from 'src/app/services/state/data/data-store.service';\nimport { Site } from 'src/models/site.models';\n\n@UntilDestroy()\n@Component({\n selector: 'app-gateway-import',\n templateUrl: './gateway-import.component.html',\n styleUrls: ['./gateway-import.component.scss'],\n})\nexport class GatewayImportComponent {\n gatewayForm = this.buildForm();\n sites$: Observable;\n\n constructor(\n private data: DataStoreService,\n private dataLoader: DataLoaderService,\n private device: DevicesService,\n private router: Router,\n public auth: AuthService,\n ) {\n this._loadData();\n this.sites$ = this.data.sites$.pipe(\n filter((sites) => !!sites),\n map((sites) => {\n return this.auth.isAdmin() || this.auth.isTechnicalAdmin()\n ? sites!\n : sites!.filter((site) => this.auth.isMaintainerOnSite(site.code));\n }),\n );\n }\n\n private _loadData() {\n this.dataLoader.loadSites().subscribe();\n }\n\n private buildForm(): UntypedFormGroup {\n return new UntypedFormGroup({\n gateway_id: new UntypedFormControl('', Validators.required),\n type: new UntypedFormControl('MULTITECH_LORA', Validators.required),\n name: new UntypedFormControl(''),\n site: new UntypedFormControl('', Validators.required),\n });\n }\n\n public submitForm(): void {\n this.device\n .importGateway(this.gatewayForm.value)\n .pipe(\n tap(() => this.router.navigate(['home', 'gateways'])),\n switchMap(() => this.dataLoader.loadGateways()),\n )\n .subscribe();\n }\n}\n","import { Component, Inject, OnInit } from '@angular/core';\nimport { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog';\nimport Chart from 'chart.js';\nimport { first, tap } from 'rxjs/operators';\nimport { DataLoaderService } from 'src/app/services/state/data/data-loader.service';\nimport { DataStoreService } from 'src/app/services/state/data/data-store.service';\nimport { RssiHistoryData } from 'src/models/gateway.models';\n\n@Component({\n selector: 'app-gateway-data-visual',\n templateUrl: './gateway-data-visual.component.html',\n styleUrls: ['./gateway-data-visual.component.scss'],\n})\nexport class GatewayDataVisualComponent implements OnInit {\n public chart: Chart;\n\n constructor(\n @Inject(MAT_DIALOG_DATA) private data: { gw: string },\n private ref: MatDialogRef,\n private store: DataStoreService,\n private dataLoader: DataLoaderService,\n ) {}\n\n ngOnInit(): void {\n this.loadData();\n }\n\n loadData() {\n const rssi = this.store.gatewayRssi[this.data.gw];\n if (rssi) {\n this.formatGraphData(rssi);\n } else\n this.dataLoader\n .loadGatewayRssi(this.data.gw)\n .pipe(\n first(),\n tap((res) => this.formatGraphData(res)),\n )\n .subscribe();\n }\n\n onClose() {\n this.ref.close();\n }\n\n formatGraphData(rssi: RssiHistoryData[]) {\n const data = {\n labels: rssi.map(\n (data) =>\n `${data.timestamp.slice(0, 10)} ${data.timestamp.slice(11, 16)}`,\n ),\n datasets: [\n {\n label: 'RSSI signal strength',\n data: rssi.map((data) => data.rssi),\n fill: false,\n borderColor: '#0077e3',\n },\n ],\n };\n\n this.chart = new Chart(document.getElementById('gatewayDataChart'), {\n type: 'line',\n data: data,\n });\n }\n}\n","

    RSSI Historic

    \n\n\n \n\n\n\n \n\n","
    \n \n Site\n \n All\n \n {{ site.country.isoCode }} -\n {{ site.name }}\n \n \n \n
    \n","import { Component, EventEmitter, Input, OnInit, Output } from '@angular/core';\nimport { UntypedFormControl, UntypedFormGroup } from '@angular/forms';\nimport { merge } from 'rxjs';\nimport { startWith, tap } from 'rxjs/operators';\n\nimport { DataStoreService } from 'src/app/services/state/data/data-store.service';\nimport { Gateway } from 'src/models/gateway.models';\nimport { Site } from 'src/models/site.models';\n\n@Component({\n selector: 'app-gateway-filter',\n templateUrl: './gateway-filter.component.html',\n styleUrls: ['./gateway-filter.component.scss'],\n})\nexport class GatewayFilterComponent implements OnInit {\n @Input() gateways: Gateway[];\n @Input() sites: Site[];\n @Output() gatewaysFiltered = new EventEmitter();\n\n form: UntypedFormGroup;\n\n constructor(private data: DataStoreService) {}\n\n ngOnInit(): void {\n this.form = this.buildFilterForm();\n\n merge(\n this.form.valueChanges,\n this.data.gateways$.pipe(\n tap((gw) => {\n this.gateways = gw ? gw : [];\n }),\n ),\n )\n .pipe(\n startWith(this.form.value),\n tap(() => {\n this.emitFilteredGateways();\n }),\n )\n .subscribe();\n }\n\n private emitFilteredGateways() {\n const result = this.siteFilter(this.gateways);\n this.gatewaysFiltered.emit(result);\n }\n\n private siteFilter(gateways: Gateway[]): Gateway[] {\n if (this.form.value.site) {\n return gateways.filter((gateway) =>\n gateway.gatewaySites\n .map((gs) => gs.siteId)\n .includes(this.form.value.site.id),\n );\n } else {\n return gateways;\n }\n }\n\n private buildFilterForm(): UntypedFormGroup {\n return new UntypedFormGroup({\n site: new UntypedFormControl(null),\n });\n }\n}\n","import { AfterViewInit, Component, Input, OnDestroy } from '@angular/core';\nimport {\n icon,\n latLng,\n latLngBounds,\n map,\n marker,\n markerClusterGroup,\n tileLayer,\n} from 'leaflet';\nimport 'leaflet.markercluster';\nimport { environment } from 'src/environments/environment';\nimport { Gateway } from 'src/models/gateway.models';\n\nconst mapOptions = {\n layers: [\n tileLayer(environment.openStreetMap.layerTilesUrl, {\n maxZoom: 18,\n attribution: environment.openStreetMap.attribution,\n }),\n ],\n};\n\n@Component({\n selector: 'app-gateway-map',\n templateUrl: './gateway-map.component.html',\n styleUrls: ['./gateway-map.component.scss'],\n})\nexport class GatewayMapComponent implements AfterViewInit, OnDestroy {\n @Input() set gateways(gw: Gateway[]) {\n this.bounds = this.mapGatewaysToBounds(gw);\n this.map\n ? this.updateMap(gw)\n : (this.markerLayer = this.mapGatewaysToMarkerLayer(gw));\n }\n public mapContainerId = Date.now().toString();\n private map: L.Map;\n private markerLayer: L.LayerGroup = markerClusterGroup();\n private bounds: L.LatLngBounds;\n\n ngAfterViewInit() {\n if (document.getElementById(this.mapContainerId)) {\n this.map = map(this.mapContainerId, mapOptions);\n this.markerLayer.addTo(this.map);\n this.map.fitBounds(this.bounds);\n }\n }\n\n private updateMap(gateways: Gateway[]): void {\n this.map.removeLayer(this.markerLayer);\n this.markerLayer = this.mapGatewaysToMarkerLayer(gateways).addTo(this.map);\n this.map.fitBounds(this.bounds);\n }\n\n private mapGatewaysToMarkerLayer(gateways: Gateway[]): L.LayerGroup {\n const cluster = markerClusterGroup({ showCoverageOnHover: false });\n gateways\n .filter((gateway) => gateway.location)\n .map((gateway) =>\n marker(\n latLng(gateway.location!.latitude, gateway.location!.longitude),\n {\n icon: icon({\n iconSize: [25, 41],\n iconAnchor: [13, 41],\n iconUrl: 'assets/img/marker-icon.png',\n shadowUrl: 'assets/img/marker-shadow.png',\n }),\n },\n ).bindTooltip(`${gateway.name}`),\n )\n .forEach((mkr) => cluster.addLayer(mkr));\n return cluster;\n }\n\n private mapGatewaysToBounds(gateways: Gateway[]): L.LatLngBounds {\n const coords = gateways\n .filter((gateway) => gateway.location)\n .map((gateway) =>\n latLng(gateway.location!.latitude, gateway.location!.longitude),\n );\n return coords.length === 0\n ? latLngBounds([\n [\n environment.openStreetMap.defaultMapCenter.lat,\n environment.openStreetMap.defaultMapCenter.lng,\n ],\n ])\n : latLngBounds(coords);\n }\n\n ngOnDestroy() {\n if (this.map) {\n this.map.remove();\n }\n }\n}\n","
    \n","
    \n
    = 2\">\n \n
    \n \n \n Filter \n \n \n \n
    \n\n
    \n

    No gateways found

    \n
    \n
    \n
    \n
    \n
    Name
    \n
    Status
    \n
    ID
    \n
    LoRaWan radio status
    \n
    Last uplink
    \n
    Network connection status
    \n
    Actions
    \n
    \n
    \n
    \n \n
    \n {{ gateway.name }}\n
    \n
    \n
    \n fiber_manual_record\n Inactive\n
    \n
    \n fiber_manual_recordActive\n
    \n
    \n
    \n {{ gateway.serial }}\n
    \n
    \n
    \n online_prediction{{ gateway.gprsActive ? 'Started' : 'No Information' }}\n
    \n
    \n
    \n {{ gateway.loraUpdatedAt | date: 'yyyy-MM-ddTHH:mm:ssZZZZZ' }}\n
    \n
    \n \n signal_cellular_alt\n
    \n
    \n
    \n travel_explore\n query_stats\n
    \n \n \n
    \n\n\n add\n\n\n\n \n\n\n\n \n
    \n \n
    \n
    \n
    \n \n
    \n
    \n","import { Component, TemplateRef } from '@angular/core';\nimport { MatDialog } from '@angular/material/dialog';\nimport { combineLatest, of } from 'rxjs';\nimport { first, switchMap } from 'rxjs/operators';\nimport { AuthService } from 'src/app/services/state/auth/auth.service';\nimport { DataStoreService } from 'src/app/services/state/data/data-store.service';\nimport { InterfaceStateService } from 'src/app/services/state/interface/interface-store.service';\nimport { Gateway } from 'src/models/gateway.models';\nimport { DataLoaderService } from '../../../services/state/data/data-loader.service';\nimport { GatewayDataVisualComponent } from './gateway-data-visual/gateway-data-visual.component';\n\n@Component({\n selector: 'app-gateway-list',\n templateUrl: './gateway-list.component.html',\n styleUrls: ['./gateway-list.component.scss'],\n})\nexport class GatewayListComponent {\n screensizeIndex$ = this.interfaceState.breakpointIndex$;\n filteredGateways$ = this.data.gateways$;\n gateways$ = this.data.gateways$;\n sites$ = this.data.sites$;\n selectedGateway: Gateway[];\n loading = true;\n emptyList = true;\n\n constructor(\n private data: DataStoreService,\n private interfaceState: InterfaceStateService,\n private dataLoader: DataLoaderService,\n public dialog: MatDialog,\n public auth: AuthService,\n ) {\n this._loadData();\n }\n\n private _loadData() {\n combineLatest([\n this.dataLoader.loadGateways(),\n this.data.sites$.pipe(\n switchMap((state) => (state ? of(state) : this.dataLoader.loadSites())),\n ),\n ])\n .pipe(first())\n .subscribe(() => {\n this.loading = false;\n this.emptyList = false;\n });\n }\n\n public updateFilteredGateways(gateways: Gateway[]): void {\n this.filteredGateways$ = of(gateways);\n this.emptyList = gateways && !(gateways.length > 0);\n }\n\n public onShowDataVisual(gateway: Gateway) {\n this.dialog.open(GatewayDataVisualComponent, {\n data: { gw: gateway.id },\n });\n }\n\n public openMap(templateRef: TemplateRef, gateway: Gateway) {\n this.selectedGateway = [gateway];\n this.dialog.open(templateRef);\n }\n\n public networkActive(gateway: Gateway): boolean {\n return gateway.networkActive;\n }\n\n public gatewayIsActive(lastCheckin: string): boolean {\n const allowedTimeout = 14400000; // 4hours in milliseconds\n return Date.now() - Date.parse(lastCheckin) < allowedTimeout;\n }\n}\n","
    \n \n \n {{ title$ | async }}\n
    \n \n person\n \n
    \n\n \n \n \n \n equalizer\n
    Home
    \n \n \n tune\n\n
    Device Management
    \n \n \n router\n\n
    Gateways
    \n \n \n \n\n
    Catalogue
    \n \n \n linear_scale\n\n
    Routing
    \n \n \n business\n\n
    Site Management
    \n \n \n alt_route\n\n
    Interface Management
    \n \n \n supervised_user_circle\n\n
    User Management
    \n \n \n notifications\n\n
    Alerts
    \n \n \n replay\n\n
    Redrive Messages
    \n \n \n contact_support\n
    Support
    \n
    \n
    \n
    \n
    \n
    \n","import { Component } from '@angular/core';\nimport { Router } from '@angular/router';\nimport Package from 'src/../package.json';\nimport { AuthService } from 'src/app/services/state/auth/auth.service';\nimport { InterfaceStateService } from 'src/app/services/state/interface/interface-store.service';\nimport { environment } from 'src/environments/environment';\nimport { DeviceManagementService } from './device-management/device-management.service';\n\n@Component({\n selector: 'app-main',\n templateUrl: './main.component.html',\n styleUrls: ['./main.component.scss'],\n})\nexport class MainComponent {\n supportUrl = environment.supportGoogleSheetUrl;\n title$ = this.interfaceState.mainTitle$;\n version = Package.version;\n\n constructor(\n public auth: AuthService,\n private router: Router,\n public deviceManagement: DeviceManagementService,\n public interfaceState: InterfaceStateService,\n ) {}\n\n public onLogin() {\n this.auth.login();\n }\n\n public onLogout() {\n this.auth.logout();\n this.router.navigateByUrl('/login');\n }\n\n public isActive(url: string): boolean {\n return this.router.url.includes(url);\n }\n}\n","import { Component, Inject } from '@angular/core';\nimport { FormControl, FormGroup, Validators } from '@angular/forms';\nimport { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog';\n\nexport class RedriveMessagesSettings {\n maximumMessageCount: number;\n pollingDurationSeconds: number;\n}\n\n@Component({\n selector: 'app-redrive-messages-settings',\n templateUrl: './redrive-messages-settings.component.html',\n styleUrls: ['./redrive-messages-settings.component.scss'],\n})\nexport class RedriveMessagesSettingsComponent {\n form = this.buildForm;\n\n constructor(\n public dialogRef: MatDialogRef,\n @Inject(MAT_DIALOG_DATA) public data: RedriveMessagesSettings,\n ) {}\n\n private get buildForm(): FormGroup {\n return new FormGroup({\n maximumMessageCount: new FormControl(\n this.data.maximumMessageCount,\n Validators.min(1),\n ),\n pollingDurationSeconds: new FormControl(\n this.data.pollingDurationSeconds,\n Validators.min(1),\n ),\n });\n }\n\n submit() {\n this.dialogRef.close({ dialogResult: this.form.value });\n }\n}\n","

    Poll settings

    \n
    \n
    \n \n Maximum polling messages\n \n \n
    \n
    \n \n Polling duration\n \n s\n \n
    \n
    \n
    \n \n \n Confirm\n \n
    \n","
    \n \n \n \n Message Id\n \n \n {{ message.messageId }}\n \n \n \n \n Sent Date\n \n \n {{ message.sentTimestamp | date: 'yyyy-MM-ddTHH:mm:ssZZZZZ' }}\n \n \n \n \n Body\n \n \n {{ message.body }}\n \n \n \n \n Receive\n \n \n {{ message.approximateReceiveCount }}\n \n \n\n \n \n \n
    \n\n\n","import { AfterViewInit, Component, Input, ViewChild } from '@angular/core';\nimport { MatPaginator } from '@angular/material/paginator';\nimport { MatSort } from '@angular/material/sort';\nimport { MatTableDataSource } from '@angular/material/table';\nimport { MesMessageDto } from '../../../../../models/mes-messages';\n\n@Component({\n selector: 'app-redrive-messages-table',\n templateUrl: './redrive-messages-table.component.html',\n styleUrls: ['./redrive-messages-table.component.scss'],\n})\nexport class RedriveMessagesTableComponent implements AfterViewInit {\n @Input()\n messages: MesMessageDto[] = [];\n\n public dataSource = new MatTableDataSource(this.messages);\n public displayedColumns: string[] = [\n 'messageId',\n 'sentTimestamp',\n 'body',\n 'approximateReceiveCount',\n ];\n\n @ViewChild(MatPaginator) paginator: MatPaginator;\n @ViewChild(MatSort) sort: MatSort;\n\n ngAfterViewInit(): void {\n this.dataSource.paginator = this.paginator;\n this.dataSource.sort = this.sort;\n }\n\n refresh(): void {\n this.dataSource.data = this.messages;\n }\n}\n","import { Component, ContentChildren, QueryList } from '@angular/core';\nimport { DataLayoutItemComponent } from './data-layout-item/data-layout-item.component';\n\n@Component({\n selector: 'app-data-layout',\n templateUrl: './data-layout.component.html',\n styleUrls: ['./data-layout.component.scss'],\n})\nexport class DataLayoutComponent {\n @ContentChildren('app-data-layout-item')\n items!: QueryList;\n}\n","\n","import { Component, Input } from '@angular/core';\n\n@Component({\n selector: 'app-data-layout-item',\n templateUrl: './data-layout-item.component.html',\n styleUrls: ['./data-layout-item.component.scss'],\n})\nexport class DataLayoutItemComponent {\n @Input() title: string;\n}\n","
    \n
    {{ title }}
    \n
    \n \n
    \n
    \n","
    \n
    \n

    MES Dead Letter Queue Redrive Messages

    \n
    \n
    \n
    \n \n \n \n
    \n
    Inspect messages - Optional
    \n info\n \n
    \n
    \n \n Poll settings\n \n \n Poll messages\n \n \n Cancel\n \n
    \n
    \n
    \n \n \n \n ~{{ approximateNumberOfMessages }}\n \n \n {{ maximumMessageCount }}\n \n \n {{ pollingDurationSeconds }}s\n \n \n
    \n \n {{ pollingProgressPercent | number: '1.0-0' }}%\n
    \n
    \n
    \n
    \n
    \n \n \n \n
    Last redrive status
    \n
    \n \n Redrive Messages\n \n
    \n
    \n
    \n \n \n \n {{\n redriveTask?.startedTimestamp | date: 'yyyy-MM-ddTHH:mm:ssZZZZZ'\n }}\n \n \n {{ redriveTask?.status }}\n
    \n {{ redriveTask?.failureReason }}\n
    \n
    \n \n ~{{ redriveTask?.approximateNumberOfMessagesToMove }}\n \n \n ~{{ redriveTask?.approximateNumberOfMessagesMoved }}\n \n
    \n
    \n
    \n
    \n
    \n \n \n Messages\n \n \n \n \n \n
    \n
    \n
    \n","import { Component, OnDestroy, OnInit, ViewChild } from '@angular/core';\nimport { MatSnackBar } from '@angular/material/snack-bar';\nimport { MatDialog } from '@angular/material/dialog';\nimport { firstValueFrom } from 'rxjs';\nimport { MesMessageDto, RedriveTaskDto } from '../../../../models/mes-messages';\nimport { DevicesService } from '../../../services/http/devices.service';\nimport { AuthService } from '../../../services/state/auth/auth.service';\nimport { hasOwnProperty } from '../../../services/util/utils';\nimport { RedriveMessagesSettingsComponent } from './redrive-messages-settings/redrive-messages-settings.component';\nimport { RedriveMessagesTableComponent } from './redrive-messages-table/redrive-messages-table.component';\n\n@Component({\n selector: 'app-redrive-messages',\n templateUrl: './redrive-messages.component.html',\n styleUrls: ['./redrive-messages.component.scss'],\n})\nexport class RedriveMessagesComponent implements OnInit, OnDestroy {\n public approximateNumberOfMessages: number | undefined;\n public redriveTask: RedriveTaskDto | undefined;\n public interval = 0;\n\n public maximumMessageCount = 20;\n public pollingDurationSeconds = 10;\n public pollingProgressPercent = 0;\n public pollingCancelled = false;\n public polling = false;\n\n private messages: MesMessageDto[] = [];\n\n @ViewChild(RedriveMessagesTableComponent)\n table: RedriveMessagesTableComponent;\n\n constructor(\n public readonly auth: AuthService,\n private readonly http: DevicesService,\n private readonly snackBar: MatSnackBar,\n private dialog: MatDialog,\n ) {}\n\n ngOnInit(): void {\n this.refreshData();\n this.interval = setInterval(() => {\n this.refreshData();\n }, 5000);\n }\n\n ngOnDestroy(): void {\n clearInterval(this.interval);\n }\n\n private refreshData(): void {\n this.getApproximateNumberOfMessages();\n this.getLastRedriveTask();\n }\n\n private async getApproximateNumberOfMessages(): Promise {\n this.approximateNumberOfMessages = await firstValueFrom(\n this.http.mesDeadLetterQueueGetApproximateNumberOfMessages(),\n );\n }\n\n private async getLastRedriveTask(): Promise {\n this.redriveTask = await firstValueFrom(\n this.http.mesDeadLetterQueueGetLastRedriveTask(),\n );\n }\n\n openPollSettings(): void {\n const dialogRef = this.dialog.open(RedriveMessagesSettingsComponent, {\n width: '350px',\n data: {\n maximumMessageCount: this.maximumMessageCount,\n pollingDurationSeconds: this.pollingDurationSeconds,\n },\n });\n\n dialogRef.afterClosed().subscribe((result) => {\n if (result) {\n this.maximumMessageCount = result.dialogResult.maximumMessageCount;\n this.pollingDurationSeconds =\n result.dialogResult.pollingDurationSeconds;\n }\n });\n }\n\n public async cancelPolling(): Promise {\n this.pollingCancelled = true;\n }\n\n public async pollMessages(): Promise {\n try {\n this.polling = true;\n this.pollingProgressPercent = 0;\n this.messages = [];\n this.table?.refresh();\n const pollingEndDate = new Date();\n pollingEndDate.setSeconds(\n new Date().getSeconds() + this.pollingDurationSeconds,\n );\n while (new Date() < pollingEndDate) {\n if (this.pollingCancelled) {\n break;\n }\n this.pollingProgressPercent =\n 100 -\n +(+pollingEndDate - +new Date()) / this.pollingDurationSeconds / 10;\n await this.pollMessage();\n\n if (this.messages.length >= this.maximumMessageCount) {\n break;\n }\n }\n this.pollingProgressPercent = 100;\n } catch (error) {\n const message = hasOwnProperty(error, 'message') ? error.message : error;\n this.snackBar.open(message as string, 'close');\n throw error;\n } finally {\n this.polling = false;\n this.pollingCancelled = false;\n }\n }\n\n public async pollMessage(): Promise {\n const messages = await firstValueFrom(\n this.http.mesDeadLetterQueuePollMessages(),\n );\n if (messages) {\n for (const message of messages) {\n if (!this.messages.find((o) => o.messageId === message.messageId)) {\n this.messages.push(message);\n }\n }\n\n this.table.refresh();\n }\n }\n\n public async redriveMessages(): Promise {\n await firstValueFrom(this.http.mesDeadLetterQueueRedrive());\n await this.getLastRedriveTask();\n }\n}\n","/**\n * Check if a variable has a property. If it does, it tells typescript we can access this property\n */\nexport function hasOwnProperty(\n obj: T,\n prop: K,\n): obj is T & Record {\n return typeof obj === 'object' && obj !== null && prop in obj;\n}\n","import { Component } from '@angular/core';\n\n@Component({\n selector: 'app-mqtt-topic-help-dialog',\n templateUrl: './mqtt-topic-help-dialog.component.html',\n styleUrls: ['./mqtt-topic-help-dialog.component.scss'],\n})\nexport class MQTTTopicHelpDialogComponent {\n constructor() {}\n}\n","
    \n

    MQTT Topic Patterns

    \n

    \n Topic patterns are used to classify and filter the devices registered the\n IOT-Hub and the messages they are sending. To achieve the goal of selecting\n device data for routing, users need to follow and understand MQTT topic\n patterns.\n

    \n

    Topic Structures

    \n \n

    \n This is how a typical topic would look like on IOT-Hub. As you can see, the\n topic has different levels and each level is seperated by “/”. On IOT-Hub,\n all topics start with the production site followed by the topic levels\n specified during the device creation process.\n

    \n

    \n A topic may have many different levels for organizing devices and their\n messages. As you can see in the sample topic above, you can set different\n levels for better organization of device messages. You can treat mqtt topics\n as channels for communication.\n

    \n

    Topic Level Wildcard

    \n

    \n You can use wildcard symbols to represent all topics at specific levels.\n

    \n

    Single Level Using +

    \n

    \n You can use the plus sign in the topic to represent a wildcard for one\n level. In this case, any topic with arbitrary string would match the level\n that contains the plus sign. For example,\n site_passadena/bu/+/temperature would match the following:\n

    \n
      \n
    • site_passadena/bu/sensor_1/temperature
    • \n
    • site_passadena/bu/sensor_2/temperature
    • \n
    \n

    but not the following:

    \n
      \n
    • site_passadena/bu/temperature
    • \n
    • site_passadena/bu/sensor_2/humidity
    • \n
    \n

    Multi Levels Using #

    \n

    \n You can use the hashtag to represent multi levels. In this case, any topic\n with arbitrary string in arbitrary levels would match the level that\n contains the hashtag sign. Note that the hashtag symbol can only be\n presented at the end of a topic string. For example,\n site_passadena/bu/project_1/#\n would match the following:\n

    \n
      \n
    • site_passadena/bu/project_1/sensor_1/temperature
    • \n
    • site_passadena/bu/project_1/sensor_3/humidity
    • \n
    • \n site_passadena/bu/project_1/subfolder/sensor_25/light\n
    • \n
    \n

    but not the following:

    \n
      \n
    • site_passadena/bu/project_3/sensor_1/temperature
    • \n
    • site_passadena/bu/sensor_3/humidity
    • \n
    \n
    \n
    \n \n
    \n","import { Injectable } from '@angular/core';\nimport { BehaviorSubject, Observable } from 'rxjs';\nimport { tap } from 'rxjs/operators';\nimport { DevicesService } from 'src/app/services/http/devices.service';\nimport { WizardStep } from 'src/models/app-routing.models';\n\nimport { routingCreationSteps } from './routing-creation.config';\n\n@Injectable()\nexport class RoutingCreationService {\n private _activeStep$: BehaviorSubject;\n private _routeData$ = new BehaviorSubject([] as string[]);\n\n constructor(private deviceHttp: DevicesService) {\n this._activeStep$ = new BehaviorSubject({\n ...routingCreationSteps[0],\n step: 1,\n totalSteps: routingCreationSteps.length,\n });\n }\n\n public get activeStep$(): Observable {\n return this._activeStep$.asObservable();\n }\n\n public setActiveStep(step: number): void {\n const nextStep: WizardStep = {\n ...routingCreationSteps[step - 1],\n step,\n totalSteps: routingCreationSteps.length,\n };\n this._activeStep$.next(nextStep);\n }\n\n public get routeData$(): Observable {\n return this._routeData$.asObservable();\n }\n\n public updateRouteData(pattern: string) {\n this.deviceHttp\n .getPatternData(pattern)\n .pipe(\n tap((data) => {\n this._routeData$.next(data);\n }),\n )\n .subscribe();\n }\n}\n","\n \n \n \n \n {{ treeControl.isExpanded(node) ? 'folder_open' : 'folder' }}\n \n \n \n {{ node.isDevice ? 'settings_remote' : 'timeline' }}\n \n \n \n {{ node.name }}\n
    \n \n \n \n \n
  • \n
    \n \n \n {{ treeControl.isExpanded(node) ? 'folder_open' : 'folder' }}\n \n settings_remote \n \n {{ node.name }}\n
    \n \n \n \n {{\n treeControl.isExpanded(node)\n ? 'arrow_drop_up'\n : 'arrow_drop_down'\n }}\n \n \n
    \n
      \n \n
    \n
  • \n \n \n
    \n","import { NestedTreeControl } from '@angular/cdk/tree';\nimport { Component, EventEmitter, OnInit, Output } from '@angular/core';\nimport { UntypedFormControl } from '@angular/forms';\nimport { MatTreeNestedDataSource } from '@angular/material/tree';\nimport { delay, map, tap } from 'rxjs/operators';\nimport { DeviceHierarchyStoreService } from 'src/app/services/state/data/device-hierarchy/device-hierarchy-store.service';\nimport { HierarchyNode } from 'src/models/device-hierarchy.models';\n\n@Component({\n selector: 'app-pattern-builder',\n templateUrl: './pattern-builder.component.html',\n styleUrls: ['./pattern-builder.component.scss'],\n})\nexport class PatternBuilderComponent implements OnInit {\n @Output() patternChanged = new EventEmitter();\n selectedNode = new UntypedFormControl(null);\n treeControl = new NestedTreeControl((node) => node.children);\n dataSource: MatTreeNestedDataSource | null;\n\n constructor(private deviceHierarchy: DeviceHierarchyStoreService) {}\n\n ngOnInit(): void {\n this.deviceHierarchy.deviceHierarchyTree$\n .pipe(\n tap((hierarchy) => this.updateDatasource(hierarchy)),\n delay(2),\n )\n .subscribe();\n\n this.selectedNode.valueChanges\n .pipe(\n tap((node) => this.treeControl.expand(node)),\n map((node: HierarchyNode) => {\n const path = this.deviceHierarchy.getPathForNode(node);\n return node.isData ? path : `${path}/#`;\n }),\n tap((pattern) => this.patternChanged.emit(pattern)),\n )\n .subscribe();\n }\n\n public hasChildren(_: number, node: HierarchyNode): boolean {\n return !!node.children.length;\n }\n\n public nodeIsSelected(node: HierarchyNode): boolean {\n return this.selectedNode.value\n ? this.selectedNode.value.id === node.id\n : false;\n }\n\n private updateDatasource(data: HierarchyNode[]) {\n this.dataSource = null;\n setTimeout(() => {\n this.dataSource = new MatTreeNestedDataSource();\n this.dataSource.data = data;\n });\n }\n}\n","import { Component } from '@angular/core';\nimport { MatDialog } from '@angular/material/dialog';\nimport { MQTTTopicHelpDialogComponent } from './../mqtt-topic-help-dialog/mqtt-topic-help-dialog.component';\n\n@Component({\n selector: 'app-pattern-builder-help',\n templateUrl: './pattern-builder-help.component.html',\n styleUrls: ['./pattern-builder-help.component.scss'],\n})\nexport class PatternBuilderHelpComponent {\n constructor(private dialog: MatDialog) {}\n\n public openMqttHelp(): void {\n this.dialog.open(MQTTTopicHelpDialogComponent);\n }\n}\n","\n \n Help \n \n\n

    The data selection is done with the aid of a MQTT topic pattern.

    \n

    \n There are two different ways to create your topic pattern:\n

    \n

    \n You can either select an element in the project hierarchy below by simply\n clicking the\n panorama_fish_eye\n next to it. The pattern matching your selection will be automatically\n created for you. This method is simple and save, however it offers limited\n possiblities.\n

    \n

    \n The second method is to manually enter the desired pattern in the input\n field at the bottom of the page. Latter allows the use of topic level\n wildcards and therefore a more precise data selection.\n

    \n

    Need an explanation of MQTT topic patterns?

    \n \n
    \n","
    \n

    Available Data

    \n

    Data points related to your previous selection:

    \n

    {{ pattern }}

    \n
    \n
    \n \n {{ element }}\n \n
    \n","import { Component, EventEmitter, Input, Output } from '@angular/core';\n\n@Component({\n selector: 'app-data-select-list',\n templateUrl: './data-select-list.component.html',\n styleUrls: ['./data-select-list.component.scss'],\n})\nexport class DataSelectListComponent {\n @Input() pattern: string;\n @Input() data: string[];\n @Output() dataSelected = new EventEmitter();\n\n constructor() {}\n\n public dataClicked(data: string): void {\n this.dataSelected.emit(data);\n }\n}\n","export const columnTitles = [\n 'A',\n 'B',\n 'C',\n 'D',\n 'E',\n 'F',\n 'G',\n 'H',\n 'I',\n 'J',\n 'K',\n 'L',\n 'M',\n 'N',\n 'O',\n 'P',\n 'Q',\n 'R',\n 'S',\n 'T',\n 'U',\n 'V',\n 'W',\n 'X',\n 'Y',\n 'Z',\n 'AA',\n 'AB',\n 'AC',\n 'AD',\n 'AE',\n 'AF',\n 'AG',\n 'AH',\n 'AI',\n 'AJ',\n 'AK',\n 'AL',\n 'AM',\n 'AN',\n 'AO',\n 'AP',\n 'AQ',\n 'AR',\n 'AS',\n 'AT',\n 'AU',\n 'AV',\n 'AW',\n 'AX',\n 'AY',\n 'AZ',\n];\n","
    \n

    Order Data

    \n

    Assign data to the columns of your {{ tableName || 'Google Sheet' }}

    \n
    \n\n
    \n \n
    \n

    {{ colTitles[i] }}

    \n
    \n \n \n \n
    \n \n
    \n\n\n add\n\n","import { Component, EventEmitter, Input, OnInit, Output } from '@angular/core';\nimport {\n UntypedFormArray,\n UntypedFormControl,\n UntypedFormGroup,\n} from '@angular/forms';\nimport { Observable } from 'rxjs';\nimport { map, tap } from 'rxjs/operators';\nimport { columnTitles } from './columns.config';\n\n@Component({\n selector: 'app-sheet-data-builder',\n templateUrl: './sheet-data-builder.component.html',\n styleUrls: ['./sheet-data-builder.component.scss'],\n})\nexport class SheetDataBuilderComponent implements OnInit {\n @Input() dataStream: Observable;\n @Input() columns?: string[];\n @Input() tableName?: string;\n @Input() disabled?: boolean;\n @Output() dataAssigned = new EventEmitter();\n colTitles = columnTitles;\n dataOrderForm = new UntypedFormGroup({\n data: new UntypedFormArray([\n new UntypedFormControl('_received_timestamp'),\n new UntypedFormControl('device_id'),\n new UntypedFormControl(''),\n new UntypedFormControl(''),\n new UntypedFormControl(''),\n ]),\n });\n\n constructor() {}\n\n ngOnInit(): void {\n this.setFormValueWhenDataSelected.subscribe();\n this.emitFormValueChanges.subscribe();\n if (this.columns) {\n const dataControl = this.dataOrderForm.controls.data;\n dataControl.removeAt(0);\n dataControl.removeAt(1);\n this.columns.forEach((data, i) => {\n dataControl.setControl(i, new UntypedFormControl(data));\n if (this.disabled) dataControl.disable();\n });\n }\n }\n\n public get dataArray(): UntypedFormArray {\n return this.dataOrderForm.get('data') as UntypedFormArray;\n }\n\n addColumn() {\n const control = new UntypedFormControl('');\n this.dataArray.push(control);\n }\n\n private get setFormValueWhenDataSelected(): Observable {\n return this.dataStream.pipe(\n tap((data) =>\n this.dataArray.controls.find((ctrl) => !ctrl.value)?.setValue(data),\n ),\n );\n }\n\n private get emitFormValueChanges(): Observable {\n return this.dataOrderForm.valueChanges.pipe(\n map((value) => value.data.filter((column) => column.length)),\n tap((data) => this.dataAssigned.emit(data)),\n );\n }\n}\n","
    \n
    \n

    Choose or add a destination for your rule

    \n \n Destination Type\n \n \n {{ destinationType.label }}\n \n \n \n \n Destination Name\n \n \n {{ destination.label }}\n \n \n \n
    \n warning\n

    \n There are no Bigquery outputs for your site.\n

    \n

    \n Please contact the support if the creation of a new Bigquery output is\n necessary!\n

    \n
    \n \n Sheet Tab Name \n \n \n \n \n New Sheet Name \n \n \n\n \n New Sheet URL\n \n Please enter a valid Google sheet url\n \n \n New Sheet Tab Name \n \n \n \n

    Control Groups

    \n
    \n \n {{ flag }}\n \n
    \n
    \n
    \n warning\n

    Make sure to share the google sheet with

    \n

    {{ gsServiceAccount }}

    \n
    \n
    \n\n \n \n Dataset \n \n {{ datasetPrefix }}\n \n \n Table \n \n \n \n

    Control Groups

    \n
    \n \n {{ flag }}\n \n
    \n
    \n
    \n
    \n
    \n
    \n

    {{ destinationType.value || 'Destination' }}

    \n
    \n
    \n
    \n
    \n \n
    \n
    \n \n \n \n \n \n
    \n","import { Component, Input, OnInit } from '@angular/core';\nimport {\n FormControl,\n FormGroup,\n UntypedFormControl,\n UntypedFormGroup,\n Validators,\n} from '@angular/forms';\nimport { UntilDestroy, untilDestroyed } from '@ngneat/until-destroy';\nimport { Observable, Subject } from 'rxjs';\nimport { startWith, tap } from 'rxjs/operators';\nimport { AuthService } from 'src/app/services/state/auth/auth.service';\nimport { environment } from 'src/environments/environment';\nimport { Interface, RouteDto } from 'src/models/data-routing.models';\nimport { Site } from 'src/models/site.models';\nimport { DataLoaderService } from '../../../../../services/state/data/data-loader.service';\nimport { routingDestinationTypes } from '../routing-creation.config';\n\n@UntilDestroy()\n@Component({\n selector: 'app-destination-form',\n templateUrl: './destination-form.component.html',\n styleUrls: ['./destination-form.component.scss'],\n})\nexport class DestinationFormComponent implements OnInit {\n @Input() destinationForm = new FormGroup({\n destinationType: new FormControl('', Validators.required),\n output: new FormControl('', [Validators.required, Validators.minLength(1)]),\n });\n\n @Input() pattern: string;\n @Input() data: string[];\n @Input() interfaces: Interface[];\n @Input() formValues: RouteDto;\n @Input() projectId: string;\n shareAccount = environment.serviceAccountGoogleSheet;\n userAccessFlags = this.authService.claims?.accessFlags || [];\n interfaceControlGroups = new Set();\n dataSelected$ = new Subject();\n destinationTypesChoices = routingDestinationTypes;\n destinationType = new UntypedFormControl(null);\n destinationsChoices: { id: string; label: string }[] = [];\n destination = new UntypedFormControl(null, Validators.required);\n tab = new UntypedFormControl('', [Validators.maxLength(51)]);\n newSheetForm = new UntypedFormGroup({\n sheet_name: new UntypedFormControl('', Validators.required),\n sheet_id: new UntypedFormControl('', Validators.required),\n tab_name: new UntypedFormControl('', [Validators.maxLength(51)]),\n fields: new UntypedFormControl([], Validators.required),\n });\n newBigqueryForm = new UntypedFormGroup({\n dataset: new UntypedFormControl('', [\n Validators.required,\n Validators.pattern(/[A-Za-z0-9_]{2,150}$/),\n ]),\n table: new UntypedFormControl('', [\n Validators.required,\n Validators.pattern(/[A-Za-z0-9_]{2,150}$/),\n ]),\n fields: new UntypedFormControl([]),\n });\n gsServiceAccount = environment.gsExporterServiceAccount;\n\n datasetPrefix = `bq_ds_iothub_${environment.stage}_`.replace('-', '_');\n site: Site | undefined;\n\n constructor(\n public authService: AuthService,\n private dataLoader: DataLoaderService,\n ) {\n this.tab.disable();\n }\n\n ngOnInit(): void {\n this.resetFormsOnDestTypeChange.pipe(untilDestroyed(this)).subscribe();\n this.sheetUrlValidator$.pipe(untilDestroyed(this)).subscribe();\n if (this.formValues) {\n setTimeout(() => {\n this.destinationType.setValue(this.formValues.destination_type);\n this.destination.setValue(this.formValues.destination_id);\n });\n }\n\n this.dataLoader\n .loadSites()\n .pipe(untilDestroyed(this))\n .subscribe(\n (sites) =>\n (this.site = sites?.find((site) => site?.code === this.projectId)),\n );\n\n this.destinationType.valueChanges\n .pipe(untilDestroyed(this))\n .subscribe((destinationType) =>\n this.destinationForm.patchValue({ destinationType }),\n );\n\n this.destination.valueChanges\n .pipe(untilDestroyed(this))\n .subscribe((output) => {\n const newValue = this.destinationsChoices.some(\n (destination) => destination.id === output,\n )\n ? output\n : '';\n\n if (newValue) {\n const destinationInterface = this.interfaces.find(\n (_interface) => _interface.id === newValue,\n );\n const tab_name = destinationInterface?.interfaceConfig.tabName;\n this.tab.patchValue(tab_name);\n }\n this.destinationForm.patchValue({ output: newValue });\n });\n\n this.destinationForm\n .get('destinationType')\n ?.valueChanges.pipe(untilDestroyed(this))\n .subscribe(() => {\n const destType = this.destinationType.value;\n const destinations = this.interfaces\n .filter((int) => int.destination === destType)\n .map((int) => ({\n id: int.id,\n label: int.name ?? int.id,\n }));\n this.destinationsChoices = destinations;\n if (destType && destType === 'sheet') {\n this.destinationsChoices.push({\n id: `add new ${destType}`,\n label: `Add new ${destType}`,\n });\n }\n });\n\n this.newSheetForm.valueChanges\n .pipe(untilDestroyed(this))\n .subscribe((newSheetFormValues) => {\n if (this.newSheetSelected) {\n const { sheet_id, ...otherValues } = newSheetFormValues;\n const output = JSON.stringify({\n ...otherValues,\n sheet_id: this.getSheetIDfromUrl(sheet_id),\n control_groups: Array.from(this.interfaceControlGroups),\n });\n this.destinationForm.patchValue({ output });\n }\n });\n\n this.newBigqueryForm.valueChanges\n .pipe(untilDestroyed(this))\n .subscribe((newBigQueryFormValues) => {\n if (this.newSheetSelected) {\n const { dataset, fields, ...otherValues } = newBigQueryFormValues;\n const formattedDataset = `${this.datasetPrefix}${dataset}`;\n const control_groups = Array.from(this.interfaceControlGroups);\n\n const output = JSON.stringify({\n ...otherValues,\n dataset: formattedDataset,\n control_groups,\n ...(fields.length > 0 && { fields }),\n });\n this.destinationForm.patchValue({ output });\n }\n });\n }\n\n public get formValidator(): boolean {\n let newInterfaceValid = true;\n if (this.newSheetSelected) {\n newInterfaceValid = this.newSheetForm.valid;\n }\n if (this.newBigQuerySelected) {\n newInterfaceValid = this.newBigqueryForm.valid;\n }\n return (\n this.destinationType.valid && this.destination.valid && newInterfaceValid\n );\n }\n\n public onFlagChange(checked: boolean, flag: string): void {\n checked\n ? this.interfaceControlGroups.add(flag)\n : this.interfaceControlGroups.delete(flag);\n }\n\n public getSheetIDfromUrl(url: string): string {\n const chunks = url.split('/');\n const idIndex =\n chunks.findIndex((chunk) => chunk.includes('spreadsheets')) + 2;\n return chunks[idIndex];\n }\n\n public get sheetUrlValidator$(): Observable {\n return this.newSheetForm.controls.sheet_id.valueChanges.pipe(\n tap((url) => {\n if (!url.includes('google') || !url.includes('spreadsheets/')) {\n this.newSheetForm.controls.sheet_id.setErrors({ url: true });\n } else {\n this.newSheetForm.controls.sheet_id.setErrors(null);\n }\n }),\n );\n }\n\n public get sheets(): Interface[] {\n return this.interfaces.filter((int) => int.destination === 'sheet');\n }\n\n public get bigqueryInterfaces(): Interface[] {\n return this.interfaces.filter((int) => int.destination === 'bigquery');\n }\n\n public get resetFormsOnDestTypeChange(): Observable {\n return this.destinationType.valueChanges.pipe(\n startWith(this.destinationType.value),\n tap((type) =>\n type ? this.destination.enable() : this.destination.disable(),\n ),\n tap(() => {\n this.destination.setValue(null);\n this.destination.markAsUntouched();\n }),\n tap(() => this.newSheetForm.markAsUntouched()),\n tap(() => this.interfaceControlGroups.clear()),\n );\n }\n\n public get newSheetSelected(): boolean {\n return this.destination.value === 'add new sheet';\n }\n\n public gsUpdateAllowed(inter: Interface): boolean {\n return (\n this.destinationType.value === 'sheet' &&\n this.destination.value === inter.id\n );\n }\n\n public getColumns(sheetInterface: Interface): string[] {\n const fields = sheetInterface.interfaceConfig.fields;\n const defaultFields = ['', '', '', '', ''];\n return fields ? fields.split('#') : defaultFields;\n }\n\n public get newBigQuerySelected(): boolean {\n return this.destination.value === 'add new bigquery';\n }\n\n public dataSelected(data: string) {\n this.dataSelected$.next(data);\n }\n\n public setNewSheetFields(data: string[]) {\n this.newSheetForm.get('fields')?.setValue(data);\n }\n\n public setNewBigqueryFields(data: string[]) {\n this.newBigqueryForm.get('fields')?.setValue(data);\n }\n}\n","
    \n

    \n {{ isEditMode ? ' Update a routing rule' : 'Create a new routing rule' }}\n

    \n \n
    \n
    \n \n
    \n \n
    \n
    \n \n
    \n
    \n \n
    \n \n
    \n\n\n
    \n
    \n

    Name your routing rule to personalize it

    \n \n Name\n \n \n
    \n
    \n

    Set the state of your route after creation

    \n \n Active\n \n \n
    \n
    \n
    \n\n\n
    \n
    \n \n
    \n
    \n \n
    \n
    \n \n Topic pattern for data selection\n \n \n \n
    \n
    \n
    \n\n\n
    \n \n
    \n
    \n","import { Component, OnInit } from '@angular/core';\nimport {\n FormControl,\n FormGroup,\n UntypedFormControl,\n Validators,\n} from '@angular/forms';\nimport { MatDialog } from '@angular/material/dialog';\nimport { ActivatedRoute, Router } from '@angular/router';\nimport { UntilDestroy, untilDestroyed } from '@ngneat/until-destroy';\nimport { Observable, combineLatest } from 'rxjs';\nimport {\n debounceTime,\n distinctUntilChanged,\n filter,\n first,\n map,\n shareReplay,\n tap,\n} from 'rxjs/operators';\nimport { DataLoaderService } from 'src/app/services/state/data/data-loader.service';\nimport { DataStoreService } from 'src/app/services/state/data/data-store.service';\nimport { CustomErrorStateMatcher } from 'src/app/services/util/formErrorStateMatcher';\nimport { Interface, RouteDto } from 'src/models/data-routing.models';\nimport { DevicesService } from '../../../../services/http/devices.service';\nimport { DeviceHierarchyStoreService } from '../../../../services/state/data/device-hierarchy/device-hierarchy-store.service';\nimport { MQTTTopicHelpDialogComponent } from './mqtt-topic-help-dialog/mqtt-topic-help-dialog.component';\nimport { RoutingCreationService } from './routing-creation.service';\n@UntilDestroy()\n@Component({\n selector: 'app-routing-creation',\n templateUrl: './routing-creation.component.html',\n styleUrls: ['./routing-creation.component.scss'],\n})\nexport class RoutingCreationComponent implements OnInit {\n isEditMode: boolean;\n // interface state\n activeStepConfig = this.routingCreation.activeStep$;\n errorMatcher = new CustomErrorStateMatcher();\n activeStepIndex: number;\n\n // user input\n stepOneForm = new FormGroup({\n name: new FormControl('', Validators.required),\n is_active: new FormControl(true, Validators.required),\n });\n stepTwoForm = new FormGroup({\n pattern: new FormControl('', Validators.required),\n projectId: new FormControl('', Validators.required),\n });\n stepThreeForm = new FormGroup({\n destinationType: new FormControl('', Validators.required),\n output: new FormControl('', [Validators.required, Validators.minLength(1)]),\n });\n\n // data\n routeToEdit: RouteDto;\n interfaces$ = this.interfacesByProject$;\n exportedData$ = this.routingCreation.routeData$;\n\n loader$ = combineLatest([\n this.deviceHierarchy.loadDeviceHierarchy(),\n this.dataLoader.loadInterfaces(),\n this.dataLoader.loadSites(),\n ]).pipe(first(), shareReplay(1));\n\n constructor(\n private routingCreation: RoutingCreationService,\n private route: ActivatedRoute,\n private router: Router,\n private dialog: MatDialog,\n private data: DataStoreService,\n private deviceHierarchy: DeviceHierarchyStoreService,\n private devHttp: DevicesService,\n private dataLoader: DataLoaderService,\n ) {\n this.isEditMode = this.route.snapshot.url[0].path === 'edit';\n }\n\n loadCondition(obss) {\n return !!obss?.length;\n }\n\n ngOnInit(): void {\n this.loader$.pipe(untilDestroyed(this)).subscribe();\n this.handleQueryParamChanges$.pipe(untilDestroyed(this)).subscribe();\n this.handlePatternChanges$.pipe(untilDestroyed(this)).subscribe();\n\n if (this.isEditMode) {\n this.devHttp\n .getRouteById(decodeURIComponent(this.route.snapshot.params.id))\n .pipe(untilDestroyed(this))\n .pipe(first())\n .subscribe((route) => {\n this.routeToEdit = route;\n\n this.stepOneForm.patchValue({\n name: route?.name ?? '',\n is_active: route?.is_active ?? true,\n });\n\n this.stepTwoForm.patchValue({\n pattern: route?.pattern ?? '',\n projectId: route?.pattern?.split('/')[1] ?? '',\n });\n\n this.routingCreation.updateRouteData(route.pattern);\n });\n }\n }\n\n private get handleQueryParamChanges$(): Observable {\n return this.route.queryParams.pipe(\n map((params) => parseInt(params.step, 10)),\n tap((step) => (this.activeStepIndex = step)),\n tap((step) => this.routingCreation.setActiveStep(step)),\n filter((step) => !this.stepValidator(step - 1)),\n tap(() =>\n this.router.navigate([], {\n queryParams: { step: 1 },\n queryParamsHandling: 'merge',\n }),\n ),\n );\n }\n\n private get handlePatternChanges$(): Observable {\n return (\n this.stepTwoForm.get('pattern') as UntypedFormControl\n ).valueChanges.pipe(\n debounceTime(200),\n distinctUntilChanged(),\n tap((pattern: string) => this.routingCreation.updateRouteData(pattern)),\n tap((pattern) =>\n (this.stepTwoForm.get('projectId') as UntypedFormControl).setValue(\n pattern.split('/')[1],\n ),\n ),\n );\n }\n\n private get interfacesByProject$(): Observable {\n return this.data.interfaces$.pipe(\n map((interfaces) => {\n if (!interfaces) return [];\n const site = this.data.sites?.find(\n (s) => s.code === this.stepTwoForm.value.projectId,\n );\n if (!site) return [];\n return interfaces.filter((interf) => interf.siteIds.includes(site.id));\n }),\n );\n }\n\n public stepValidator(step = this.activeStepIndex): boolean {\n switch (step) {\n case 1:\n return this.stepOneForm.valid;\n case 2:\n return this.stepTwoForm.valid;\n case 3:\n return (\n this.stepOneForm.valid &&\n this.stepTwoForm.valid &&\n this.stepThreeForm.valid\n );\n\n default:\n return false;\n }\n }\n\n public submitForm(): void {\n const destinationType = this.stepThreeForm.value.destinationType ?? '';\n let output = this.stepThreeForm.value.output ?? '';\n const name = this.stepOneForm.value.name ?? '';\n const is_active = !!this.stepOneForm.value.is_active;\n const pattern = this.stepTwoForm.value.pattern ?? '';\n const projectId = this.stepTwoForm.value.projectId ?? '';\n\n if (['sheet', 'bigquery'].includes(destinationType)) {\n try {\n output = JSON.parse(output);\n } catch {\n // skip JSON parsing if string is an id\n }\n }\n\n const routeInfo = {\n info: {\n name,\n is_active,\n pattern,\n projectId,\n },\n output: output,\n };\n if (this.routeToEdit) {\n this.dataLoader.updateExportRoute(\n this.routeToEdit.id,\n destinationType,\n routeInfo,\n );\n } else {\n this.dataLoader.createExportRoute(destinationType, routeInfo);\n }\n }\n\n public openMqttHelp(): void {\n this.dialog.open(MQTTTopicHelpDialogComponent);\n }\n}\n","
    \n \n \n
    \n

    {{ routing.name }}

    \n
    \n Paused\n Active\n \n lock\n \n\n \n lock_open\n \n\n \n edit\n \n \n delete\n \n \n close\n \n
    \n
    \n
    \n
    \n
    \n
    \n {{\n routing.is_locked ? 'lock' : 'lock_open'\n }}\n
    \n

    \n {{ routing.is_locked ? 'Locked' : 'Unlocked' }}\n

    \n
    \n\n
    \n
    \n \n
    \n

    {{ routing.pattern }}

    \n
    \n
    \n
    \n
    \n \n
    \n

    Paused

    \n
    \n
    \n
    \n \n
    \n

    Active

    \n
    \n \n \n \n
    \n
    \n
    \n \n Locked by:\n {{ routing.locked_by }}\n

    \n

    \n Created at:\n {{ routing.created_at | date: 'yyyy-MM-ddTHH:mm:ssZZZZZ' }}\n

    \n

    \n Updated at:{{ routing.updated_at | date: 'yyyy-MM-ddTHH:mm:ssZZZZZ' }}\n

    \n
    \n
    \n \n
    \n \n
    \n \n

    {{ routing.destination_type }}

    \n \n
    \n
    \n
    \n \n
    \n
    \n
    \n","import { Component, OnDestroy, OnInit } from '@angular/core';\nimport { FormControl } from '@angular/forms';\nimport { MatDialog } from '@angular/material/dialog';\nimport { ActivatedRoute, Router } from '@angular/router';\nimport { UntilDestroy, untilDestroyed } from '@ngneat/until-destroy';\nimport { BehaviorSubject, combineLatest, Observable } from 'rxjs';\nimport {\n filter,\n first,\n map,\n mergeMap,\n pairwise,\n switchMap,\n tap,\n} from 'rxjs/operators';\nimport { ConfirmationDialogComponent } from 'src/app/components/confirmation-dialog/confirmation-dialog.component';\nimport { DevicesService } from 'src/app/services/http/devices.service';\nimport { DataStoreService } from 'src/app/services/state/data/data-store.service';\nimport { environment } from 'src/environments/environment';\nimport { DeviceLightDto, RouteDto } from 'src/models/data-routing.models';\nimport { AuthService } from './../../../../services/state/auth/auth.service';\nimport { DataLoaderService } from './../../../../services/state/data/data-loader.service';\n\n@UntilDestroy()\n@Component({\n selector: 'app-routing-details',\n templateUrl: './routing-details.component.html',\n styleUrls: ['./routing-details.component.scss'],\n})\nexport class RoutingDetailsComponent implements OnInit, OnDestroy {\n routeId: string;\n displayedData: DevicePath[] = [];\n googleSheetUrl: string;\n routeActive = new FormControl();\n destinationLabel: string;\n\n routing$: Observable;\n waitForUpdate$ = new BehaviorSubject(false);\n isUpdateActionDisabled$: Observable;\n isUnlockDisabled$: Observable;\n tooltipUnlock$: Observable;\n\n constructor(\n private route: ActivatedRoute,\n private router: Router,\n private dialog: MatDialog,\n private deviceHttp: DevicesService,\n private data: DataStoreService,\n private dataLoader: DataLoaderService,\n public auth: AuthService,\n ) {}\n\n ngOnInit(): void {\n this.routeId = decodeURIComponent(\n this.route.snapshot.paramMap.get('id') as string,\n );\n\n this.routing$ = this.data.routing$.pipe(\n untilDestroyed(this),\n filter((route) => route !== undefined),\n map((route) => route as RouteDto), // avoid TS error\n tap(() => this.waitForUpdate$.next(false)),\n );\n\n this.isUpdateActionDisabled$ = combineLatest([\n this.routing$,\n this.waitForUpdate$,\n ]).pipe(\n untilDestroyed(this),\n map(([routing, waitForUpdate]) => routing.is_locked || waitForUpdate),\n );\n\n this.isUpdateActionDisabled$.subscribe((isUpdateActionDisabled) => {\n if (isUpdateActionDisabled) {\n this.routeActive.disable();\n } else {\n this.routeActive.enable();\n }\n });\n\n this.isUnlockDisabled$ = combineLatest([\n this.routing$,\n this.auth.userEmail$,\n this.waitForUpdate$,\n ]).pipe(\n map(\n ([routing, userEmail, waitForUpdate]) =>\n waitForUpdate ||\n (routing.locked_by !== userEmail && !this.auth.isAdmin()),\n ),\n );\n\n this.tooltipUnlock$ = combineLatest([\n this.routing$,\n this.auth.userEmail$,\n ]).pipe(\n map(([routing, userEmail]) =>\n routing.locked_by !== userEmail && !this.auth.isAdmin()\n ? `this routing is locked by: ${routing.locked_by}`\n : 'unlock this routing',\n ),\n );\n\n this.dataLoader.loadDevices().subscribe();\n this.dataLoader.loadSites().subscribe();\n this.dataLoader.loadRouting(this.routeId).subscribe();\n\n this.routing$.pipe(first()).subscribe((route) => {\n this.destinationLabel = `${route.destination_name} (${route.destination_type})`;\n // TODO: check this code, concatenation of non-existing value will result in the string \"undefined\"\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n this.googleSheetUrl = `${environment.googleSheetBaseUrl}${(route as any)?.info?.spreadsheet_id}`;\n });\n\n this.routing$\n .pipe(\n map((route) => route.is_active),\n tap((is_active) => this.routeActive.setValue(is_active)),\n )\n .subscribe();\n\n this.routeActive.valueChanges\n .pipe(\n untilDestroyed(this),\n pairwise(),\n filter(\n ([oldValue, newValue]) =>\n oldValue !== null && newValue !== null && oldValue !== newValue,\n ),\n tap(() => this.waitForUpdate$.next(true)),\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n mergeMap(([oldValue, newValue]) =>\n this.dataLoader.changeRouteActiveState(this.routeId, newValue),\n ),\n )\n .subscribe();\n }\n\n ngOnDestroy(): void {\n this.data.resetRouting();\n }\n\n public closeDetails(): void {\n this.router.navigateByUrl('home/routing');\n }\n\n public dataSelected(data: DevicePath[]): void {\n this.displayedData = data;\n }\n\n public deleteRoute(): void {\n const confirmationMessage = 'This action will delete the route definitely!';\n const dialogRef = this.dialog.open(ConfirmationDialogComponent, {\n data: confirmationMessage,\n });\n\n dialogRef\n .afterClosed()\n .pipe(\n filter((answer) => !!answer),\n tap(() => this.waitForUpdate$.next(true)),\n switchMap(() => this.deviceHttp.deleteRouting(this.routeId)),\n tap(() => this.data.deleteRoute(this.routeId)),\n tap(() => this.router.navigateByUrl('/home/routing')),\n )\n .subscribe();\n }\n\n public editRoute(): void {\n this.waitForUpdate$.next(true);\n this.router.navigate(\n ['/home/routing/edit', encodeURIComponent(this.routeId)],\n { queryParams: { step: 1 } },\n );\n }\n\n public updateLockRoute(is_locked: boolean): void {\n const confirmationMessage = is_locked\n ? '

    Locking this route will prevent anyone from updating or deleting it.
    Only you and administrators will be able to unlock it afterwards.

    '\n : '

    Unlocking this route will allow anyone to update or delete it.

    ';\n const dialogRef = this.dialog.open(ConfirmationDialogComponent, {\n data: { html: confirmationMessage },\n });\n\n dialogRef\n .afterClosed()\n .pipe(\n filter((answer) => !!answer),\n tap(() => this.waitForUpdate$.next(true)),\n switchMap(() =>\n this.dataLoader.updateLockRouting(this.routeId, is_locked),\n ),\n )\n .subscribe();\n }\n}\n\nexport interface DevicePath {\n device: DeviceLightDto;\n path: string;\n}\n","
    \n
    \n
    \n \n \n
    \n
    \n\n

    {{ routing.name }}

    \n
    \n
    \n
    \n \n
    \n

    {{ routing.pattern }}

    \n \n \n
    \n
    \n
    \n \n \n \n
    \n\n \n
    \n\n","import { Component, Input } from '@angular/core';\nimport { ActivatedRoute, Router } from '@angular/router';\n\nimport { RouteDto } from 'src/models/data-routing.models';\n\n@Component({\n selector: 'app-routing-list-element',\n templateUrl: './routing-list-element.component.html',\n styleUrls: ['./routing-list-element.component.scss'],\n})\nexport class RoutingListElementComponent {\n @Input() routing: RouteDto;\n\n constructor(\n private router: Router,\n private route: ActivatedRoute,\n ) {}\n\n public openDetails(id: string): void {\n this.router.navigate(['details', encodeURIComponent(id)], {\n relativeTo: this.route,\n });\n }\n}\n","export interface Interface {\n id: string;\n name: string;\n topic: string;\n destination: DestinationType;\n dataFormat: 'message' | 'value';\n interfaceConfig: { [key: string]: string };\n siteIds: string[];\n}\n\nexport interface Routing {\n pattern: string;\n interfaces: string[];\n active_interfaces: string[];\n}\n\nexport interface RoutingDTO {\n id: string;\n pattern: string;\n interfaces: Interface[];\n active_interfaces: string[];\n}\n\nexport interface RoutingAnswer {\n mainRoutes: RoutingDTO[];\n inheritedRoutes: RoutingDTO[];\n}\n\nexport interface PubSubMessageValue {\n path: string;\n value: string | number | boolean;\n tags: string[];\n timestamp?: number;\n _received_timestamp: number;\n metadata?: { [key: string]: string | number | boolean };\n}\n\nexport interface PubSubMessage {\n _device_id: string;\n _received_timestamp: number;\n _path: string;\n _tags: string[];\n timestamp?: number;\n [key: string]: unknown;\n}\n\nexport type DestinationType =\n | 'mes'\n | 'sheet'\n | 'bigquery'\n | 'iot_core'\n | 'pubsub';\n\nexport enum Destinations {\n MES = 'mes',\n GOOGLE_SHEET = 'sheet',\n BIGQUERY = 'bigquery',\n IOT_CORE = 'iot_core',\n PUBSUB = 'pubsub',\n}\n\nexport const destinationValues = (): string[] => {\n return Object.values(Destinations);\n};\n\nexport interface RouteDto {\n id: string;\n name: string;\n pattern: string;\n is_active: boolean;\n is_locked: boolean;\n locked_by?: string;\n destination_name: string;\n destination_type: DestinationType;\n destination_id: string;\n devices_number: number;\n data_number: number;\n updated_at?: number;\n created_at?: number;\n description?: string;\n devices?: DeviceLightDto[];\n info?: BigqueryOutputInfo | MesOutputInfo | SheetOutputInfo;\n}\n\nexport interface BigqueryOutputInfo {\n dataset: string;\n table: string;\n fields?: string[];\n control_groups?: string[];\n}\n\nexport interface SheetOutputInfo {\n sheet_name: string;\n sheet_id: string;\n fields?: string[];\n control_groups?: string[];\n}\n\nexport interface MesOutputInfo {\n mes_name: string;\n}\n\nexport interface SheetData {\n column: string;\n data: string;\n}\n\nexport interface DeviceLightDto {\n device_id: string;\n device_name: string;\n hierarchy_prefix: string;\n data: string[];\n}\n\nexport interface GeneralRouteInfo {\n name: string;\n pattern: string;\n projectId: string;\n is_active: boolean;\n description?: string;\n}\n\nexport interface DefaultRouteInfo {\n info: GeneralRouteInfo;\n output: string;\n}\n\nexport interface SheetRouteInfo {\n info: GeneralRouteInfo;\n output: string | SheetOutputInfo;\n}\n\nexport interface BigqueryRouteInfo {\n info: GeneralRouteInfo;\n output: string | BigqueryOutputInfo;\n}\n","
    \n \n \n Search\n \n search\n \n \n Site\n \n All\n \n {{ site.country.isoCode }} -\n {{ site.name }}\n \n \n \n \n Destination\n \n All\n {{\n dest\n }}\n \n \n \n\n Tile View\n
    \n","import { Component, EventEmitter, Input, OnInit, Output } from '@angular/core';\nimport { UntypedFormControl, UntypedFormGroup } from '@angular/forms';\nimport { UntilDestroy, untilDestroyed } from '@ngneat/until-destroy';\nimport { merge } from 'rxjs';\nimport { startWith, tap } from 'rxjs/operators';\nimport { InterfaceStateService } from 'src/app/services/state/interface/interface-store.service';\n\nimport { DataStoreService } from 'src/app/services/state/data/data-store.service';\nimport { RouteDto, destinationValues } from 'src/models/data-routing.models';\nimport { Site } from 'src/models/site.models';\n\n@UntilDestroy()\n@Component({\n selector: 'app-routing-filter',\n templateUrl: './routing-filter.component.html',\n styleUrls: ['./routing-filter.component.scss'],\n})\nexport class RoutingFilterComponent implements OnInit {\n @Input() routings: RouteDto[];\n @Input() sites: Site[];\n @Output() routingsFiltered = new EventEmitter();\n @Output() tileViewActive = new EventEmitter();\n destinations = destinationValues();\n form: UntypedFormGroup;\n\n constructor(\n private data: DataStoreService,\n private interfaceState: InterfaceStateService,\n ) {}\n\n ngOnInit(): void {\n this.interfaceState.routingFilter$\n .pipe(\n untilDestroyed(this),\n tap((routingForm) => (this.form = routingForm)),\n )\n .subscribe();\n\n merge(\n this.filterForm.valueChanges,\n this.data.routings$.pipe(\n tap((routings) => {\n this.routings = routings ? routings : [];\n }),\n ),\n )\n .pipe(\n startWith(this.filterForm.value),\n tap(() => {\n this.emitFilteredRoutings();\n }),\n )\n .subscribe();\n\n this.tileView.valueChanges\n .pipe(\n startWith(this.tileView.value),\n tap((val) => this.tileViewActive.emit(val)),\n )\n .subscribe();\n }\n\n private emitFilteredRoutings() {\n let result = this.routings;\n\n if (result) {\n result = this.destinationFilter(result as RouteDto[]);\n result = this.siteFilter(result);\n result = this.keywordFilter(result);\n this.routingsFiltered.emit(result);\n }\n }\n\n private destinationFilter(routings: RouteDto[]): RouteDto[] {\n const dest = this.filterForm.value.destination;\n return !dest\n ? routings\n : routings.filter((route) => route.destination_type === dest);\n }\n\n private siteFilter(routings: RouteDto[]): RouteDto[] {\n const site = this.filterForm.value.site;\n return !site\n ? routings\n : routings.filter((route) => {\n const chunks = route.pattern.split('/');\n const interfaceTagId = chunks[1];\n return interfaceTagId === site;\n });\n }\n\n private keywordFilter(routings: RouteDto[]): RouteDto[] {\n const keyword = this.filterForm?.value?.keyword?.toLowerCase();\n\n return !keyword\n ? routings\n : routings\n .filter(\n (route) =>\n route.name && route.destination_type && route.pattern && route.id,\n )\n .filter(\n (route) =>\n route.name.toLowerCase().includes(keyword) ||\n route.destination_type.toLowerCase().includes(keyword) ||\n route.pattern.toLowerCase().includes(keyword) ||\n route.id.toLowerCase().includes(keyword) ||\n !!route.devices!.some(\n (device) => device.device_id.toLocaleLowerCase() === keyword,\n ),\n );\n }\n\n get filterForm(): UntypedFormGroup {\n return this.form.get('filter') as UntypedFormGroup;\n }\n\n get tileView(): UntypedFormControl {\n return this.form.controls.tileView as UntypedFormControl;\n }\n}\n","
    \n
    = 3\" class=\"filter-banner\">\n \n
    \n \n \n Filter \n \n \n \n
    \n\n \n
    \n \n \n
    \n \n
    \n
    \n
    \n
    Name
    \n
    Destination
    \n
    Devices
    \n
    Data
    \n
    Status
    \n
    Actions
    \n
    \n
    \n
    \n \n
    {{ routing.name }}
    \n
    \n {{ routing.destination_name }} ({{ routing.destination_type }})\n
    \n
    {{ routing.devices_number }}
    \n
    {{ routing.data_number }}
    \n
    \n \n
    \n
    \n \n open\n \n
    \n
    \n
    \n \n\n \n add\n \n\n\n\n \n\n","import { Component } from '@angular/core';\nimport { ActivatedRoute, Router } from '@angular/router';\nimport { combineLatest, of } from 'rxjs';\nimport { first, switchMap } from 'rxjs/operators';\nimport { AuthService } from 'src/app/services/state/auth/auth.service';\nimport { DataStoreService } from 'src/app/services/state/data/data-store.service';\nimport { InterfaceStateService } from 'src/app/services/state/interface/interface-store.service';\nimport { RouteDto } from 'src/models/data-routing.models';\nimport { DataLoaderService } from '../../../services/state/data/data-loader.service';\n\n@Component({\n selector: 'app-routing-list',\n templateUrl: './routing-list.component.html',\n styleUrls: ['./routing-list.component.scss'],\n})\nexport class RoutingListComponent {\n routings$ = this.data.routings$;\n sites$ = this.data.sites$;\n screensizeIndex$ = this.interfaceState.breakpointIndex$;\n creationParams = { step: 1 };\n filteredRoutings$ = this.data.routings$;\n tileView: boolean;\n\n constructor(\n private data: DataStoreService,\n private interfaceState: InterfaceStateService,\n private dataLoader: DataLoaderService,\n private router: Router,\n private route: ActivatedRoute,\n public auth: AuthService,\n ) {\n this._loadData();\n }\n\n routingLoader(routings) {\n return routings !== undefined;\n }\n\n private _loadData() {\n combineLatest([\n this.data.routings$.pipe(\n switchMap((routings) =>\n routings ? of(routings) : this.dataLoader.loadRoutings(),\n ),\n ),\n this.data.sites$.pipe(\n switchMap((state) => (state ? of(state) : this.dataLoader.loadSites())),\n ),\n ])\n .pipe(first())\n .subscribe();\n }\n\n public updateFilteredRoutings(routings: RouteDto[]): void {\n this.filteredRoutings$ = of(routings);\n }\n\n public setViewSelection(tileView: boolean): void {\n this.tileView = tileView;\n }\n\n public openDetails(id: string): void {\n this.router.navigate(['details', encodeURIComponent(id)], {\n relativeTo: this.route,\n });\n }\n}\n","import { AbstractControl, ValidationErrors, ValidatorFn } from '@angular/forms';\n\nexport function allOrNoneValidator(fields: string[]): ValidatorFn {\n return (formGroup: AbstractControl): ValidationErrors | null => {\n const controls = fields.map((field) => formGroup.get(field));\n const values = controls.map((control) => control?.value);\n\n controls.forEach((control) => control?.setErrors(null));\n\n const filledCount = values.filter((value) => !!value).length;\n\n if (filledCount === 0 || filledCount === fields.length) {\n return null;\n }\n\n const error = { allOrNone: true };\n\n controls.forEach((control, index) => {\n if (!values[index] && control) {\n control.markAsTouched(); // Mark field as touched to trigger the error display\n control.setErrors(error);\n }\n });\n\n return error;\n };\n}\n","

    Create a new site

    \n

    \n Edit site: {{ site?.metadata?.site_long_name }}\n

    \n
    \n
    \n
    \n \n Name\n \n \n\n
    \n \n Country\n \n \n {{ country.name }}\n \n \n \n \n Infra code\n \n \n
    \n
    \n \n Organization\n \n \n {{ organization.name }}\n \n \n \n \n Firefly organization\n \n \n
    \n \n
    \n \n Latitude\n \n \n This field must be filled along with the longitude.\n \n \n \n Longitude\n \n \n This field must be filled along with the latitude.\n \n \n
    \n
    \n
    \n \n
    \n
    \n
    \n \n \n Confirm\n \n
    \n","import { Component, Inject, OnInit } from '@angular/core';\nimport { FormControl, FormGroup, Validators } from '@angular/forms';\nimport { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog';\nimport { MatSnackBar } from '@angular/material/snack-bar';\nimport { catchError, of, tap } from 'rxjs';\nimport { DataLoaderService } from 'src/app/services/state/data/data-loader.service';\nimport { DataStoreService } from 'src/app/services/state/data/data-store.service';\nimport { CreateSiteDTO, Site } from 'src/models/site.models';\nimport { allOrNoneValidator } from './all-or-none-validator.directive';\n\n@Component({\n selector: 'app-site-creation',\n templateUrl: './site-creation.component.html',\n styleUrls: ['./site-creation.component.scss'],\n})\nexport class SiteCreationComponent implements OnInit {\n form = this.buildForm;\n countries$ = this.data.countries$;\n organizations$ = this.data.organizations$;\n saving = false;\n\n constructor(\n @Inject(MAT_DIALOG_DATA) public site: Site | undefined,\n private data: DataStoreService,\n private dataLoader: DataLoaderService,\n private snackBar: MatSnackBar,\n private dialogRef: MatDialogRef,\n ) {}\n\n ngOnInit(): void {\n if (this.site) {\n this.prefillForm(this.site);\n }\n }\n\n private get buildForm(): FormGroup {\n return new FormGroup({\n name: new FormControl('', Validators.required),\n countryId: new FormControl('', Validators.required),\n location: new FormGroup(\n {\n latitude: new FormControl(null),\n longitude: new FormControl(null),\n },\n { validators: allOrNoneValidator(['latitude', 'longitude']) },\n ),\n organizationId: new FormControl('', Validators.required),\n fireflyOrganization: new FormControl(),\n infraSite: new FormControl('', Validators.required),\n });\n }\n\n private prefillForm(site: Site): void {\n this.form.setValue({\n name: site.name,\n countryId: site.country.id,\n location: {\n latitude: site.location?.latitude ?? null,\n longitude: site.location?.longitude ?? null,\n },\n organizationId: site.organization.id,\n fireflyOrganization: site.fireflyOrganization,\n infraSite: site.infraSite,\n });\n }\n\n public get createSite(): CreateSiteDTO {\n const { location, fireflyOrganization, ...formValues } = this.form.value;\n return {\n siteId: this.site?.code ?? '',\n ...formValues,\n alertEnabled: this.site?.alertEnabled ?? false,\n alertUnixCron: this.site?.alertUnixCron ?? null,\n fireflyOrganization:\n fireflyOrganization ?? this.site?.fireflyOrganization ?? null,\n location: location?.latitude && location?.longitude ? location : null,\n };\n }\n\n public async submit() {\n this.saving = true;\n if (!this.site?.code) {\n this.dataLoader\n .createSite(this.createSite)\n .pipe(\n tap(() => {\n this.snackBar.open('Site was successfully created!', 'Close');\n this.dialogRef.close();\n }),\n catchError((error) => {\n this.saving = false;\n return of(error);\n }),\n )\n .subscribe();\n } else {\n this.dataLoader\n .updateSite(this.site.code, this.createSite)\n .pipe(\n tap(() => {\n this.snackBar.open('Site was successfully updated!', 'Close');\n this.dialogRef.close();\n }),\n catchError((error) => {\n this.saving = false;\n return of(error);\n }),\n )\n .subscribe();\n }\n }\n\n public updateLocation(e: { lat: number; lng: number }) {\n this.form.controls.location.setValue({\n latitude: +e.lat.toFixed(7),\n longitude: +e.lng.toFixed(7),\n });\n }\n}\n","
    \n
    \n \n Search\n \n search\n \n \n Country\n \n All\n \n {{ country.name }}\n \n \n \n \n Organization\n \n All\n \n {{ organization.name }}\n \n \n \n
    \n
    \n","import { Component, EventEmitter, Input, OnInit, Output } from '@angular/core';\nimport { UntypedFormControl, UntypedFormGroup } from '@angular/forms';\nimport { Observable, combineLatest, merge, of } from 'rxjs';\nimport { first, startWith, switchMap, tap } from 'rxjs/operators';\n\nimport { DataLoaderService } from 'src/app/services/state/data/data-loader.service';\nimport { DataStoreService } from 'src/app/services/state/data/data-store.service';\nimport { Site } from 'src/models/site.models';\n\n@Component({\n selector: 'app-site-filter',\n templateUrl: './site-filter.component.html',\n})\nexport class SiteFilterComponent implements OnInit {\n @Input() sites: Site[];\n @Output() sitesFiltered = new EventEmitter();\n form: UntypedFormGroup;\n\n organizations$ = this.data.organizations$;\n countries$ = this.data.countries$;\n\n constructor(\n private data: DataStoreService,\n private dataLoader: DataLoaderService,\n ) {\n this.loadData();\n }\n\n ngOnInit(): void {\n this.form = this.buildFilterForm();\n this.handleInputs.subscribe();\n }\n\n private loadData() {\n combineLatest([\n this.data.organizations$.pipe(\n switchMap((organizations) =>\n organizations\n ? of(organizations)\n : this.dataLoader.loadOrganizations(),\n ),\n ),\n this.data.countries$.pipe(\n switchMap((countries) =>\n countries ? of(countries) : this.dataLoader.loadCountries(),\n ),\n ),\n ])\n .pipe(first())\n .subscribe();\n }\n\n private get handleInputs(): Observable {\n return merge(\n this.form.valueChanges,\n this.data.sites$.pipe(\n tap((sites) => {\n this.sites = sites ? sites : [];\n }),\n ),\n ).pipe(\n startWith(this.form.value),\n tap(() => {\n this.emitFilteredSites();\n }),\n );\n }\n\n private emitFilteredSites() {\n let result = this.sites;\n result = this.searchFilter(result);\n result = this.countryFilter(result);\n result = this.organizationFilter(result);\n\n this.sitesFiltered.emit(result);\n }\n\n private countryFilter(sites: Site[]): Site[] {\n const keyword = this.form.value.country;\n return !keyword\n ? sites\n : sites.filter((site) => site.country.name.includes(keyword));\n }\n\n private organizationFilter(sites: Site[]): Site[] {\n const keyword = this.form.value.organization;\n return !keyword\n ? sites\n : sites.filter((site) => site.organization.name.includes(keyword));\n }\n\n private searchFilter(sites: Site[]): Site[] {\n const keyword = this.form.value.search.toLowerCase();\n return !keyword\n ? sites\n : sites.filter(\n (site) =>\n site.infraSite.toLowerCase().includes(keyword) ||\n site.code.toLowerCase().includes(keyword) ||\n site.name.toLowerCase().includes(keyword),\n );\n }\n\n private buildFilterForm(): UntypedFormGroup {\n return new UntypedFormGroup({\n search: new UntypedFormControl(''),\n country: new UntypedFormControl(''),\n organization: new UntypedFormControl(''),\n });\n }\n}\n","
    \n
    \n
    = 2\">\n \n
    \n \n \n Filter \n \n \n \n
    \n
    \n
    \n
    \n
    Infra code
    \n
    Name
    \n
    Country
    \n
    Organization
    \n
    \n
    \n
    \n \n
    {{ site.infraSite }}
    \n
    {{ site.name }}
    \n
    {{ site.country.name }}
    \n
    {{ site.organization.name }}
    \n
    \n
    \n \n \n add\n \n\n \n \n \n\n","import { Component } from '@angular/core';\nimport { MatDialog } from '@angular/material/dialog';\nimport { combineLatest } from 'rxjs';\nimport { of } from 'rxjs/internal/observable/of';\nimport { first, switchMap } from 'rxjs/operators';\nimport { DataStoreService } from 'src/app/services/state/data/data-store.service';\nimport { InterfaceStateService } from 'src/app/services/state/interface/interface-store.service';\nimport { Site } from 'src/models/site.models';\nimport { AuthService } from '../../../services/state/auth/auth.service';\nimport { DataLoaderService } from '../../../services/state/data/data-loader.service';\nimport { SiteCreationComponent } from './site-creation/site-creation.component';\n\n@Component({\n selector: 'app-site',\n templateUrl: './site.component.html',\n})\nexport class SiteComponent {\n screensizeIndex$ = this.interfaceState.breakpointIndex$;\n filteredSites$ = this.data.sites$;\n users$ = this.data.users$;\n sites$ = this.data.sites$;\n constructor(\n private data: DataStoreService,\n private interfaceState: InterfaceStateService,\n private dataLoader: DataLoaderService,\n public auth: AuthService,\n private dialog: MatDialog,\n ) {\n this._loadData();\n }\n\n private _loadData() {\n combineLatest([\n this.data.users$.pipe(\n switchMap((users) => (users ? of(users) : this.dataLoader.loadUsers())),\n ),\n this.data.sites$.pipe(\n switchMap((state) => (state ? of(state) : this.dataLoader.loadSites())),\n ),\n ])\n .pipe(first())\n .subscribe();\n }\n\n public updateFilteredSites(sites: Site[]): void {\n this.filteredSites$ = of(sites);\n }\n\n public editSite(siteTag: Site): void {\n this.dialog.open(SiteCreationComponent, { data: siteTag });\n }\n\n public createSite() {\n this.dialog.open(SiteCreationComponent, {});\n }\n}\n","
    \n \n
    \n

    User Information

    \n\n \n Contact Email\n \n \n Has to be a valid Email address on a \"solvay.com\" or \"syensqo.com\"\n domain\n \n \n \n\n

    \n Site Access\n \n help\n \n

    \n\n \n Administrator\n \n \n Technical Administrator\n \n \n Active\n \n \n
    \n \n \n Site\n \n \n {{ site.country.isoCode }} -\n {{ site.name }}\n \n \n \n \n Access\n \n \n {{ level.name }}\n \n \n \n \n \n \n
    \n
    \n \n +\n \n
    \n \n \n Submit\n \n
    \n
    \n\n
    \n

    Administrator: Has read and write access to all sites.

    \n

    \n Maintainer: Has read and write access to one or more specified sites.\n

    \n

    Operator: Has only read access to one or more specified sites.

    \n

    \n Active: A user can be deactivated by admins. This will not delete the\n user but block access to the platform.\n

    \n
    \n\n \n delete\n \n
    \n
    \n\n\n

    Confirm Delete Resort

    \n
    \n

    Are you sure you want to delete this?

    \n
    \n
    \n \n \n Yes\n \n
    \n
    \n","import { Component, OnInit, TemplateRef } from '@angular/core';\nimport {\n UntypedFormArray,\n UntypedFormControl,\n UntypedFormGroup,\n Validators,\n} from '@angular/forms';\nimport { MatDialog } from '@angular/material/dialog';\nimport { ActivatedRoute, Router } from '@angular/router';\nimport { Observable, merge, of } from 'rxjs';\nimport { filter, first, map, switchMap, tap } from 'rxjs/operators';\nimport { AuthService } from 'src/app/services/state/auth/auth.service';\nimport { DataLoaderService } from 'src/app/services/state/data/data-loader.service';\nimport { DataStoreService } from 'src/app/services/state/data/data-store.service';\nimport { Site } from 'src/models/site.models';\nimport { User, UserInfo } from 'src/models/user.models';\n\n@Component({\n selector: 'app-user-creation',\n templateUrl: './user-creation.component.html',\n})\nexport class UserCreationComponent implements OnInit {\n form = this.buildForm();\n displayHelp = false;\n editMode = false;\n accessLevels = [\n { name: 'Operator', level: 0 },\n { name: 'Maintainer', level: 1 },\n ];\n private readonly HOME_USERS_TEXT = 'home/users';\n\n sites$ = this.data.sites$;\n\n constructor(\n private readonly data: DataStoreService,\n private readonly dataLoader: DataLoaderService,\n private readonly router: Router,\n public route: ActivatedRoute,\n public auth: AuthService,\n public dialog: MatDialog,\n ) {\n this._loadData();\n }\n\n private _loadData() {\n this.data.sites$\n .pipe(\n switchMap((state) => (state ? of(state) : this.dataLoader.loadSites())),\n first(),\n )\n .subscribe();\n }\n\n ngOnInit(): void {\n this.route.paramMap\n .pipe(\n map(() => history.state),\n filter((state) => state.email),\n tap((user) => {\n this.editMode = true;\n this.form = this.buildForm(user as User);\n }),\n )\n .subscribe();\n }\n\n get accessForm(): UntypedFormArray {\n return this.form.get('access') as UntypedFormArray;\n }\n\n public addAccessFormFields(): void {\n const newFields = new UntypedFormGroup({\n site: new UntypedFormControl(''),\n level: new UntypedFormControl(null),\n });\n this.accessForm.push(newFields);\n }\n\n public removeAccessFromFields(index: number): void {\n index > 0 || this.accessForm.controls.length > 1\n ? this.accessForm.removeAt(index)\n : this.accessForm.controls[index].setValue({ site: '', level: '' });\n }\n\n public unchosenSites$(accessFormFieldIndex: number): Observable {\n return merge(this.form.valueChanges, this.data.sites$).pipe(\n switchMap(() => this.data.sites$),\n map((sites) => {\n const selectedSites = this.form.value.access\n .filter((access, index) => index !== accessFormFieldIndex)\n .map((access) => access.site);\n return sites\n ? sites.filter((site) => !selectedSites.includes(site.code))\n : [];\n }),\n );\n }\n\n public cancel(): void {\n this.router.navigateByUrl(this.HOME_USERS_TEXT);\n }\n\n public submit(): void {\n const userInfo = this.formatInput();\n !this.editMode\n ? this.dataLoader.createUser(userInfo).subscribe(() => {\n this.router.navigateByUrl(this.HOME_USERS_TEXT);\n })\n : this.dataLoader.updateUser(userInfo).subscribe(() => {\n this.router.navigateByUrl(this.HOME_USERS_TEXT);\n });\n }\n\n public delete(templateRef: TemplateRef) {\n const dialogRef = this.dialog.open(templateRef);\n\n dialogRef.afterClosed().subscribe((res: boolean) => {\n if (res) {\n this.dataLoader.deleteUser(this.form.value.email).subscribe(() => {\n this.router.navigateByUrl(this.HOME_USERS_TEXT);\n });\n }\n });\n }\n\n public toggleHelp(): void {\n this.displayHelp = !this.displayHelp;\n }\n\n public siteExists(site): boolean {\n return !!this.data.sites?.find((s) => s.id === site);\n }\n\n private buildForm(user?: User): UntypedFormGroup {\n let userAccessForm = [\n new UntypedFormGroup({\n site: new UntypedFormControl(''),\n level: new UntypedFormControl(null),\n }),\n ];\n\n if (user) {\n userAccessForm = user.roles.length\n ? user.roles.map(\n (role) =>\n new UntypedFormGroup({\n site: new UntypedFormControl(role.site.id),\n level: new UntypedFormControl(\n role.role === 'maintainer' ? 1 : 0,\n ),\n }),\n )\n : userAccessForm;\n }\n\n return new UntypedFormGroup({\n email: new UntypedFormControl(user ? user.email : '', [\n Validators.required,\n Validators.email,\n Validators.pattern(\n /^[A-Za-z0-9._%+-]+@solvay.com$|^[A-Za-z0-9._%+-]+@syensqo.com$/,\n ),\n ]),\n administrator: new UntypedFormControl(user ? user.administrator : false),\n technicalAdministrator: new UntypedFormControl(\n user ? user.technicalAdministrator : false,\n ),\n active: new UntypedFormControl(user ? user.active : true),\n access: new UntypedFormArray(userAccessForm),\n });\n }\n\n private formatInput(): UserInfo {\n const formValue = this.form.value;\n const validAccess = formValue.access.filter(\n (access) => access.site && (access.level === 0 || access.level === 1),\n );\n\n return {\n email: formValue.email,\n administrator: formValue.administrator,\n technicalAdministrator: formValue.technicalAdministrator,\n active: formValue.active,\n maintainer: validAccess\n .filter((access) => access.level === 1)\n .map((access) => access.site),\n operator: validAccess\n .filter((access) => access.level === 0)\n .map((access) => access.site),\n };\n }\n}\n","
    \n
    \n \n E-mail\n \n search\n \n \n Permission Level\n \n All\n {{ level.name }}\n \n \n \n Site\n \n All\n \n {{ site.country.isoCode }} -\n {{ site.name }}\n \n \n \n
    \n
    \n","import { Component, EventEmitter, Input, OnInit, Output } from '@angular/core';\nimport { UntypedFormControl, UntypedFormGroup } from '@angular/forms';\nimport { merge } from 'rxjs';\nimport { startWith, tap } from 'rxjs/operators';\n\nimport { DataStoreService } from 'src/app/services/state/data/data-store.service';\nimport { Site } from 'src/models/site.models';\nimport { User } from 'src/models/user.models';\n\n@Component({\n selector: 'app-user-filter',\n templateUrl: './user-filter.component.html',\n})\nexport class UserFilterComponent implements OnInit {\n @Input() users: User[];\n @Input() sites: Site[];\n @Output() usersFiltered = new EventEmitter();\n permissionLevels = [\n { name: 'Operator', level: 0 },\n { name: 'Maintainer', level: 1 },\n { name: 'Administrator', level: 2 },\n { name: 'Technical Administrator', level: 3 },\n ];\n form: UntypedFormGroup;\n\n constructor(private data: DataStoreService) {}\n\n ngOnInit(): void {\n this.form = this.buildFilterForm();\n\n merge(\n this.form.valueChanges,\n this.data.users$.pipe(\n tap((users) => {\n this.users = users ? users : [];\n }),\n ),\n )\n .pipe(\n startWith(this.form.value),\n tap(() => {\n this.emitFilteredUsers();\n }),\n )\n .subscribe();\n }\n\n private emitFilteredUsers() {\n const siteKeyword = this.form.value.site;\n const level = this.form.value.permissionLevel;\n let result = this.users;\n\n if (level !== 4 && siteKeyword) {\n result = this.permissionForSiteFilter(result);\n result = this.emailFilter(result);\n } else {\n result = this.siteFilter(result);\n result = this.permissionLevelFilter(result);\n result = this.emailFilter(result);\n }\n\n this.usersFiltered.emit(result);\n }\n\n private permissionLevelFilter(users: User[]): User[] {\n const level = this.form.value.permissionLevel;\n return level === 4\n ? users\n : users.filter((user) => {\n switch (level) {\n case 3:\n return user.technicalAdministrator;\n case 2:\n return user.administrator;\n case 1:\n return user.roles.map((role) => role.role).includes('maintainer');\n case 0:\n return user.roles.map((role) => role.role).includes('operator');\n default:\n return false;\n }\n });\n }\n\n private permissionForSiteFilter(users: User[]): User[] {\n const siteKeyword = this.form.value.site;\n const level = this.form.value.permissionLevel;\n\n return users.filter((user) => {\n switch (level) {\n case 3:\n return user.technicalAdministrator;\n case 2:\n return user.administrator;\n case 1:\n return (\n user.roles.find((role) => role.site.code === siteKeyword)?.role ===\n 'maintainer'\n );\n case 0:\n return (\n user.roles.find((role) => role.site.code === siteKeyword)?.role ===\n 'operator'\n );\n }\n });\n }\n\n private siteFilter(users: User[]): User[] {\n const siteKeyword = this.form.value.site;\n return !siteKeyword\n ? users\n : users.filter(\n (user) =>\n user.roles.filter((role) => role.site.code === siteKeyword)\n .length || user.administrator,\n );\n }\n\n private emailFilter(users: User[]): User[] {\n const keyword = this.form.value.email.toLowerCase();\n return !keyword\n ? users\n : users.filter((user) => user.email.toLowerCase().includes(keyword));\n }\n\n private buildFilterForm(): UntypedFormGroup {\n return new UntypedFormGroup({\n email: new UntypedFormControl(''),\n permissionLevel: new UntypedFormControl(4),\n site: new UntypedFormControl(null),\n });\n }\n}\n","
    \n
    \n
    = 2\">\n \n
    \n \n \n Filter \n \n \n \n
    \n
    \n
    \n
    \n
    Contact Email
    \n
    Permission Level
    \n
    Site
    \n
    Status
    \n
    \n
    \n
    \n \n
    {{ user.email }}
    \n
    {{ getHighestPermission(user) }}
    \n
    \n {{ getUserSiteLabel(user) }}\n
    \n
    \n {{ user.active ? 'active' : 'blocked' }}\n
    \n
    \n
    \n \n \n person_add\n \n\n \n \n \n\n","import { Component } from '@angular/core';\nimport { Router } from '@angular/router';\nimport { combineLatest, of } from 'rxjs';\nimport { first, switchMap } from 'rxjs/operators';\nimport { DataStoreService } from 'src/app/services/state/data/data-store.service';\nimport { InterfaceStateService } from 'src/app/services/state/interface/interface-store.service';\nimport { User } from 'src/models/user.models';\nimport { DataLoaderService } from '../../../services/state/data/data-loader.service';\nimport { AuthService } from './../../../services/state/auth/auth.service';\n\n@Component({\n selector: 'app-user-management',\n templateUrl: './user-management.component.html',\n})\nexport class UserManagementComponent {\n screenSizeIndex$ = this.interfaceState.breakpointIndex$;\n filteredUsers$ = this.data.users$;\n users$ = this.data.users$;\n sites$ = this.data.sites$;\n\n constructor(\n private readonly data: DataStoreService,\n private readonly interfaceState: InterfaceStateService,\n private readonly router: Router,\n private readonly dataLoader: DataLoaderService,\n public auth: AuthService,\n ) {\n this._loadData();\n }\n\n private _loadData() {\n combineLatest([\n this.data.users$.pipe(\n switchMap((users) => (users ? of(users) : this.dataLoader.loadUsers())),\n ),\n this.data.sites$.pipe(\n switchMap((state) => (state ? of(state) : this.dataLoader.loadSites())),\n ),\n ])\n .pipe(first())\n .subscribe();\n }\n\n public updateFilteredUsers(users: User[]): void {\n this.filteredUsers$ = of(users);\n }\n\n public hasMultipleSiteAccess(user: User): boolean {\n return user.administrator || user.roles.length > 1;\n }\n\n public getHighestPermission(user: User): string {\n if (user.technicalAdministrator) {\n return 'Technical Administrator';\n }\n if (user.administrator) {\n return 'Administrator';\n }\n if (user.roles.map((role) => role.role).includes('maintainer')) {\n return 'Maintainer';\n }\n if (user.roles.map((role) => role.role).includes('operator')) {\n return 'Operator';\n }\n return 'None';\n }\n\n public getUserSiteLabel(user: User): string {\n const userSiteIds = user.roles.map((role) => role.siteId);\n const userSite = this.data.sites?.find(\n (site) => site.id === userSiteIds[0],\n );\n if (this.hasMultipleSiteAccess(user)) {\n return 'Multiple';\n }\n if (!userSiteIds.length) {\n return 'None';\n }\n return userSite\n ? `${userSite?.country.isoCode} - ${userSite?.name}`\n : userSiteIds[0];\n }\n\n public editUser(user: User): void {\n this.router.navigateByUrl('home/users/edit', { state: user });\n }\n}\n","import { Component } from '@angular/core';\nimport { AuthService } from 'src/app/services/state/auth/auth.service';\n\n@Component({\n selector: 'app-unauthorized',\n templateUrl: './unauthorized.component.html',\n styleUrls: ['./unauthorized.component.scss'],\n})\nexport class UnauthorizedComponent {\n constructor(private auth: AuthService) {}\n\n login() {\n this.auth.login();\n }\n}\n","
    \n
    \n
    \n
    \n

    401

    \n

    UNAUTHORIZED

    \n \n
    \n
    \n","import { Injectable } from '@angular/core';\nimport { ActivatedRouteSnapshot } from '@angular/router';\n\nimport { catchError, map, Observable, of, switchMap } from 'rxjs';\nimport { DataLoaderService } from '../data/data-loader.service';\nimport { DataStoreService } from '../data/data-store.service';\nimport { AuthService } from './auth.service';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class EditRoutingGuard {\n constructor(\n private auth: AuthService,\n private data: DataStoreService,\n private dataLoader: DataLoaderService,\n ) {}\n\n canActivate(route: ActivatedRouteSnapshot): Observable {\n const routeId = route.paramMap.get('id');\n\n if (routeId === null) return of(false);\n\n return this.data.routing$.pipe(\n switchMap((routing) =>\n routing\n ? of(routing)\n : this.dataLoader.loadRouting(decodeURIComponent(routeId)),\n ),\n map(\n (routing) =>\n routing !== undefined &&\n !routing?.is_locked &&\n !!this.auth.isMaintainerOnRoute(routing.id),\n ),\n catchError(() => of(false)),\n );\n }\n}\n","import { Injectable } from '@angular/core';\n\nimport { AuthService } from './auth.service';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class OperatorGuard {\n constructor(private auth: AuthService) {}\n\n canActivate(): boolean {\n return !!this.auth.isMaintainer();\n }\n}\n","import { inject } from '@angular/core';\nimport { ActivatedRouteSnapshot, CanActivateFn, Router } from '@angular/router';\nimport { AuthService } from './auth.service';\n\nexport const writeRightsGuard: CanActivateFn = (\n route: ActivatedRouteSnapshot,\n) => {\n const path = route.queryParamMap.get('path');\n const hasWriteRights = path\n ? inject(AuthService).hasWriteRightsForProject(path)\n : false;\n return hasWriteRights || inject(Router).createUrlTree(['/home']);\n};\n","import { NgModule } from '@angular/core';\nimport { RouterModule, Routes } from '@angular/router';\nimport { DashboardComponent } from 'src/app/pages/main/dashboard/dashboard.component';\nimport { InterfaceManagementComponent } from 'src/app/pages/main/interface-management/interface-management.component';\nimport { AuthGuard } from 'src/app/services/state/auth/auth.guard';\nimport { techAdminGuard } from 'src/app/services/state/auth/tech-admin.guard';\nimport { RouterOutletComponent } from './components/router-outlet/router-outlet.component';\nimport { LoginComponent } from './pages/login/login.component';\nimport { LoginResolver } from './pages/login/login.resolver';\nimport { AlertingComponent } from './pages/main/alerting/alerting.component';\nimport { CatalogueComponent } from './pages/main/catalogue/catalogue.component';\nimport { ModelDetailComponent } from './pages/main/catalogue/model-detail/model-detail.component';\nimport { DefaultDeviceCreationComponent } from './pages/main/device-management/device-creation/default-device-creation/default-device-creation.component';\nimport { DeviceCreationComponent } from './pages/main/device-management/device-creation/device-creation.component';\nimport { FireflyDeviceCreationComponent } from './pages/main/device-management/device-creation/firefly-device-creation/firefly-device-creation.component';\nimport { IotCoreDeviceCreationComponent } from './pages/main/device-management/device-creation/iot-core-creation/iotcore-device-creation.component';\nimport { ModelChoiceComponent } from './pages/main/device-management/device-creation/model-choice/model-choice.component';\nimport { PathGuard } from './pages/main/device-management/device-creation/path.guard';\nimport { DeviceTypeSelectedGuard } from './pages/main/device-management/device-creation/type-selected.guard';\nimport { DeviceDetailComponent } from './pages/main/device-management/device-detail/device-detail.component';\nimport { DeviceManagementComponent } from './pages/main/device-management/device-management.component';\nimport { HierarchyNodeListComponent } from './pages/main/device-management/hierarchy-node-list/hierarchy-node-list.component';\nimport { MultiDownlinkComponent } from './pages/main/device-management/multi-downlink/multi-downlink.component';\nimport { GatewayImportComponent } from './pages/main/gateway-list/gateway-import/gateway-import.component';\nimport { GatewayListComponent } from './pages/main/gateway-list/gateway-list.component';\nimport { MainComponent } from './pages/main/main.component';\nimport { RedriveMessagesComponent } from './pages/main/redrive-messages/redrive-messages.component';\nimport { RoutingCreationComponent } from './pages/main/routing-list/routing-creation/routing-creation.component';\nimport { RoutingDetailsComponent } from './pages/main/routing-list/routing-details/routing-details.component';\nimport { RoutingListComponent } from './pages/main/routing-list/routing-list.component';\nimport { SiteComponent } from './pages/main/site/site.component';\nimport { UserCreationComponent } from './pages/main/user-management/user-creation/user-creation.component';\nimport { UserManagementComponent } from './pages/main/user-management/user-management.component';\nimport { UnauthorizedComponent } from './pages/unauthorized/unauthorized.component';\nimport { EditRoutingGuard } from './services/state/auth/edit-routing.guard';\nimport { OperatorGuard } from './services/state/auth/oparator.guard';\nimport { writeRightsGuard } from './services/state/auth/write-rights.guard';\n\nconst resolver = [LoginResolver];\n\nconst routes: Routes = [\n {\n path: 'login',\n component: LoginComponent,\n },\n {\n path: 'unauthorized',\n component: UnauthorizedComponent,\n },\n {\n path: 'home',\n component: MainComponent,\n canActivate: [AuthGuard],\n children: [\n {\n path: '',\n redirectTo: 'dashboard',\n pathMatch: 'full',\n },\n {\n path: 'dashboard',\n component: DashboardComponent,\n canActivate: [AuthGuard],\n },\n {\n path: 'device',\n component: RouterOutletComponent,\n canActivate: [AuthGuard],\n children: [\n {\n path: 'manager',\n component: DeviceManagementComponent,\n canActivate: [AuthGuard],\n children: [\n {\n path: '',\n component: HierarchyNodeListComponent,\n resolve: HierarchyNodeListComponent.getResolver(),\n canActivate: [AuthGuard],\n },\n ],\n },\n {\n path: 'multi-downlink',\n component: MultiDownlinkComponent,\n canActivate: [AuthGuard],\n },\n {\n path: 'details/:id',\n component: DeviceDetailComponent,\n canActivate: [AuthGuard],\n },\n {\n path: 'new',\n component: DeviceCreationComponent,\n canActivate: [AuthGuard, writeRightsGuard],\n children: [\n {\n path: '',\n canActivate: [AuthGuard, PathGuard],\n component: ModelChoiceComponent,\n resolve: ModelChoiceComponent.getResolver(),\n },\n {\n path: 'firefly',\n canActivate: [AuthGuard, PathGuard, DeviceTypeSelectedGuard],\n component: FireflyDeviceCreationComponent,\n },\n {\n path: 'generic',\n canActivate: [AuthGuard, PathGuard, DeviceTypeSelectedGuard],\n component: DefaultDeviceCreationComponent,\n },\n {\n path: 'iotcore',\n canActivate: [AuthGuard, PathGuard, DeviceTypeSelectedGuard],\n component: IotCoreDeviceCreationComponent,\n },\n ],\n },\n ],\n },\n {\n path: 'catalogue',\n component: RouterOutletComponent,\n canActivate: [AuthGuard],\n children: [\n {\n path: '',\n component: CatalogueComponent,\n canActivate: [AuthGuard],\n },\n {\n path: 'details/:id',\n component: ModelDetailComponent,\n canActivate: [AuthGuard],\n },\n ],\n },\n {\n path: 'site',\n component: RouterOutletComponent,\n canActivate: [AuthGuard, techAdminGuard],\n children: [\n {\n path: '',\n component: SiteComponent,\n canActivate: [AuthGuard],\n },\n ],\n },\n {\n path: 'interfaces',\n component: RouterOutletComponent,\n canActivate: [AuthGuard, techAdminGuard],\n children: [\n {\n path: '',\n component: InterfaceManagementComponent,\n canActivate: [AuthGuard],\n },\n ],\n },\n {\n path: 'users',\n component: RouterOutletComponent,\n canActivate: [AuthGuard],\n children: [\n {\n path: '',\n component: UserManagementComponent,\n canActivate: [AuthGuard],\n },\n {\n path: 'new',\n component: UserCreationComponent,\n canActivate: [AuthGuard, OperatorGuard],\n },\n {\n path: 'edit',\n component: UserCreationComponent,\n canActivate: [AuthGuard],\n },\n ],\n },\n {\n path: 'routing',\n component: RouterOutletComponent,\n canActivate: [AuthGuard],\n children: [\n {\n path: '',\n component: RoutingListComponent,\n canActivate: [AuthGuard],\n },\n {\n path: 'details/:id',\n component: RoutingDetailsComponent,\n canActivate: [AuthGuard],\n },\n {\n path: 'new',\n component: RoutingCreationComponent,\n canActivate: [AuthGuard, OperatorGuard],\n },\n {\n path: 'edit/:id',\n canActivate: [AuthGuard, EditRoutingGuard],\n component: RoutingCreationComponent,\n },\n ],\n },\n {\n path: 'gateways',\n component: RouterOutletComponent,\n canActivate: [AuthGuard],\n children: [\n {\n path: '',\n component: GatewayListComponent,\n canActivate: [AuthGuard],\n },\n {\n path: 'import',\n component: GatewayImportComponent,\n canActivate: [AuthGuard],\n },\n ],\n },\n {\n path: 'redrive',\n component: RedriveMessagesComponent,\n canActivate: [AuthGuard, techAdminGuard],\n children: [\n {\n path: '',\n component: RedriveMessagesComponent,\n canActivate: [AuthGuard],\n },\n ],\n },\n {\n path: 'alerts',\n component: AlertingComponent,\n canActivate: [AuthGuard],\n },\n ],\n },\n {\n path: '**',\n redirectTo: 'login',\n },\n];\n\n@NgModule({\n imports: [\n RouterModule.forRoot(routes, {\n useHash: true,\n initialNavigation: 'enabledNonBlocking',\n }),\n ],\n exports: [RouterModule],\n providers: resolver,\n})\nexport class AppRoutingModule {}\n","import { Component } from '@angular/core';\n\n@Component({\n selector: 'app-root',\n templateUrl: './app.component.html',\n styles: [],\n})\nexport class AppComponent {}\n","\n","import { LayoutModule } from '@angular/cdk/layout';\nimport { CommonModule } from '@angular/common';\nimport { NgModule } from '@angular/core';\nimport { MatAutocompleteModule } from '@angular/material/autocomplete';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatCardModule } from '@angular/material/card';\nimport { MatCheckboxModule } from '@angular/material/checkbox';\nimport { MatDialogModule } from '@angular/material/dialog';\nimport { MatDividerModule } from '@angular/material/divider';\nimport { MatExpansionModule } from '@angular/material/expansion';\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { MatIconModule, MatIconRegistry } from '@angular/material/icon';\nimport { MatInputModule } from '@angular/material/input';\nimport { MatListModule } from '@angular/material/list';\nimport { MatPaginatorModule } from '@angular/material/paginator';\nimport { MatProgressBarModule } from '@angular/material/progress-bar';\nimport { MatProgressSpinnerModule } from '@angular/material/progress-spinner';\nimport { MatRadioModule } from '@angular/material/radio';\nimport { MatSelectModule } from '@angular/material/select';\nimport { MatSidenavModule } from '@angular/material/sidenav';\nimport { MatSlideToggleModule } from '@angular/material/slide-toggle';\nimport {\n MAT_SNACK_BAR_DEFAULT_OPTIONS,\n MatSnackBarModule,\n} from '@angular/material/snack-bar';\nimport { MatSortModule } from '@angular/material/sort';\nimport { MatStepperModule } from '@angular/material/stepper';\nimport { MatTableModule } from '@angular/material/table';\nimport { MatTabsModule } from '@angular/material/tabs';\nimport { MatToolbarModule } from '@angular/material/toolbar';\nimport { MatTooltipModule } from '@angular/material/tooltip';\nimport { MatTreeModule } from '@angular/material/tree';\nimport { DomSanitizer } from '@angular/platform-browser';\nimport { BrowserAnimationsModule } from '@angular/platform-browser/animations';\n\n@NgModule({\n declarations: [],\n imports: [\n CommonModule,\n BrowserAnimationsModule,\n MatToolbarModule,\n MatButtonModule,\n MatIconModule,\n MatSidenavModule,\n MatFormFieldModule,\n MatTableModule,\n MatDialogModule,\n MatCheckboxModule,\n MatInputModule,\n MatSelectModule,\n MatStepperModule,\n MatTooltipModule,\n MatExpansionModule,\n MatDividerModule,\n LayoutModule,\n MatListModule,\n MatRadioModule,\n MatTreeModule,\n\n MatTabsModule,\n MatSnackBarModule,\n MatProgressSpinnerModule,\n MatSlideToggleModule,\n MatAutocompleteModule,\n MatPaginatorModule,\n MatCardModule,\n MatSortModule,\n MatProgressBarModule,\n ],\n exports: [\n BrowserAnimationsModule,\n MatToolbarModule,\n MatButtonModule,\n MatIconModule,\n MatSidenavModule,\n MatFormFieldModule,\n MatTableModule,\n MatDialogModule,\n MatCheckboxModule,\n MatInputModule,\n MatSelectModule,\n MatStepperModule,\n MatTooltipModule,\n MatExpansionModule,\n MatDividerModule,\n LayoutModule,\n MatListModule,\n MatRadioModule,\n MatTreeModule,\n\n MatTabsModule,\n MatSnackBarModule,\n MatProgressSpinnerModule,\n MatSlideToggleModule,\n MatAutocompleteModule,\n MatPaginatorModule,\n MatCardModule,\n MatSortModule,\n MatProgressBarModule,\n ],\n providers: [\n { provide: MAT_SNACK_BAR_DEFAULT_OPTIONS, useValue: { duration: 3000 } },\n ],\n})\nexport class MaterialModule {\n constructor(\n private matIconRegistry: MatIconRegistry,\n private domSanitizer: DomSanitizer,\n ) {\n this.matIconRegistry.addSvgIcon(\n 'custom-solvay-logo',\n this.domSanitizer.bypassSecurityTrustResourceUrl(\n 'assets/svg/logo-solvay-white.svg',\n ),\n );\n this.matIconRegistry.addSvgIcon(\n 'custom-routing-active',\n this.domSanitizer.bypassSecurityTrustResourceUrl(\n 'assets/svg/route_active.svg',\n ),\n );\n this.matIconRegistry.addSvgIcon(\n 'custom-routing-paused',\n this.domSanitizer.bypassSecurityTrustResourceUrl(\n 'assets/svg/route_paused.svg',\n ),\n );\n this.matIconRegistry.addSvgIcon(\n 'custom-info',\n this.domSanitizer.bypassSecurityTrustResourceUrl('assets/svg/info.svg'),\n );\n this.matIconRegistry.addSvgIcon(\n 'custom-infos',\n this.domSanitizer.bypassSecurityTrustResourceUrl('assets/svg/Infos.svg'),\n );\n this.matIconRegistry.addSvgIcon(\n 'custom-catalogue',\n this.domSanitizer.bypassSecurityTrustResourceUrl(\n 'assets/svg/catalogue.svg',\n ),\n );\n this.matIconRegistry.addSvgIcon(\n 'custom-add-folder',\n this.domSanitizer.bypassSecurityTrustResourceUrl(\n 'assets/svg/add-folder.svg',\n ),\n );\n this.matIconRegistry.addSvgIcon(\n 'custom-add-device',\n this.domSanitizer.bypassSecurityTrustResourceUrl(\n 'assets/svg/add-device.svg',\n ),\n );\n this.matIconRegistry.addSvgIcon(\n 'custom-add-devices',\n this.domSanitizer.bypassSecurityTrustResourceUrl(\n 'assets/svg/add-devices.svg',\n ),\n );\n this.matIconRegistry.addSvgIcon(\n 'custom-route-btn',\n this.domSanitizer.bypassSecurityTrustResourceUrl(\n 'assets/svg/route-btn.svg',\n ),\n );\n }\n}\n","import { Component } from '@angular/core';\n\n@Component({\n selector: 'app-form-field',\n templateUrl: './form-field.component.html',\n styleUrls: ['./form-field.component.scss'],\n})\nexport class FormFieldComponent {\n constructor() {}\n}\n","
    \n \n
    \n\n","import { CdkTableModule } from '@angular/cdk/table';\nimport { CommonModule } from '@angular/common';\nimport { NgModule } from '@angular/core';\nimport { FormsModule, ReactiveFormsModule } from '@angular/forms';\n\nimport { AngularFireModule } from '@angular/fire/compat';\nimport { AngularFireAuthModule } from '@angular/fire/compat/auth';\nimport { environment } from 'src/environments/environment';\nimport { MaterialModule } from './material/material.module';\n\nimport { ConfirmationDialogComponent } from 'src/app/components/confirmation-dialog/confirmation-dialog.component';\nimport { CounterChipComponent } from 'src/app/components/counter-chip/counter-chip.component';\nimport { DataLayoutItemComponent } from '../components/data-layout/data-layout-item/data-layout-item.component';\nimport { DataLayoutComponent } from '../components/data-layout/data-layout.component';\nimport { DisplayPositionMapComponent } from '../components/display-position-map/display-position-map.component';\nimport { FormFieldComponent } from '../components/form-field/form-field.component';\nimport { FormStepperComponent } from '../components/form-stepper/form-stepper.component';\nimport { LoaderComponent } from '../components/loader/loader.component';\nimport { NoResultComponent } from '../components/no-result/no-result.component';\nimport { ModelFilterComponent } from '../pages/main/catalogue/model-filter/model-filter.component';\nimport { ModelItemComponent } from '../pages/main/catalogue/model-item/model-item.component';\nimport { DataPreviewComponent } from '../pages/main/device-management/device-detail/data-preview/data-preview.component';\nimport { ImageUploadComponent } from './../components/image-upload/image-upload.component';\nimport { AutofocusDirective } from './util/auto-focus.directive';\nimport { LoaderDirective } from './util/loader.directive';\nimport { SelectPositionComponent } from '../components/select-position/select-position.component';\n\nconst COMPONENTS = [\n DisplayPositionMapComponent,\n DataPreviewComponent,\n LoaderComponent,\n AutofocusDirective,\n FormFieldComponent,\n ImageUploadComponent,\n ModelItemComponent,\n ModelFilterComponent,\n ConfirmationDialogComponent,\n CounterChipComponent,\n FormStepperComponent,\n NoResultComponent,\n DataLayoutComponent,\n DataLayoutItemComponent,\n SelectPositionComponent,\n];\n\n@NgModule({\n declarations: [COMPONENTS, LoaderDirective],\n imports: [\n CommonModule,\n MaterialModule,\n FormsModule,\n CdkTableModule,\n ReactiveFormsModule,\n AngularFireAuthModule,\n AngularFireModule.initializeApp(environment.firebaseConfig),\n ],\n providers: [],\n exports: [\n MaterialModule,\n CdkTableModule,\n AngularFireModule,\n AngularFireAuthModule,\n FormsModule,\n ReactiveFormsModule,\n COMPONENTS,\n LoaderDirective,\n ],\n})\nexport class SharedModule {}\n","import {\n provideHttpClient,\n withInterceptorsFromDi,\n} from '@angular/common/http';\nimport { NgModule } from '@angular/core';\nimport { BrowserAnimationsModule } from '@angular/platform-browser/animations';\nimport { RouterModule } from '@angular/router';\n\nimport { SharedModule } from 'src/app/services/shared.module';\n\nimport { LoginComponent } from './login.component';\n\nconst COMPONENTS = [LoginComponent];\n\n@NgModule({\n declarations: [COMPONENTS],\n exports: [COMPONENTS],\n imports: [SharedModule, BrowserAnimationsModule, RouterModule],\n providers: [provideHttpClient(withInterceptorsFromDi())],\n})\nexport class LoginModule {}\n","import { CommonModule } from '@angular/common';\nimport {\n provideHttpClient,\n withInterceptorsFromDi,\n} from '@angular/common/http';\nimport { NgModule } from '@angular/core';\nimport { BrowserAnimationsModule } from '@angular/platform-browser/animations';\nimport { RouterModule } from '@angular/router';\nimport { InterfaceCreationComponent } from 'src/app/pages/main/interface-management/interface-creation/interface-creation.component';\nimport { InterfaceFilterComponent } from 'src/app/pages/main/interface-management/interface-filter/interface-filter.component';\nimport { SharedModule } from 'src/app/services/shared.module';\nimport { InterfaceManagementComponent } from './interface-management.component';\n\n@NgModule({\n declarations: [\n InterfaceManagementComponent,\n InterfaceFilterComponent,\n InterfaceCreationComponent,\n ],\n imports: [CommonModule, BrowserAnimationsModule, SharedModule, RouterModule],\n providers: [provideHttpClient(withInterceptorsFromDi())],\n})\nexport class InterfaceManagementModule {}\n","import {\n provideHttpClient,\n withInterceptorsFromDi,\n} from '@angular/common/http';\nimport { NgModule } from '@angular/core';\nimport { BrowserAnimationsModule } from '@angular/platform-browser/animations';\nimport { RouterModule } from '@angular/router';\n\nimport { SharedModule } from 'src/app/services/shared.module';\nimport { AlertingComponent } from './alerting.component';\n\nconst COMPONENTS = [AlertingComponent];\n\n@NgModule({\n declarations: [COMPONENTS],\n exports: [COMPONENTS],\n imports: [BrowserAnimationsModule, SharedModule, RouterModule],\n providers: [provideHttpClient(withInterceptorsFromDi())],\n})\nexport class AlertingModule {}\n","import {\n provideHttpClient,\n withInterceptorsFromDi,\n} from '@angular/common/http';\nimport { NgModule } from '@angular/core';\nimport { BrowserAnimationsModule } from '@angular/platform-browser/animations';\nimport { RouterModule } from '@angular/router';\n\nimport { SharedModule } from 'src/app/services/shared.module';\n\nimport { BrandCreationComponent } from 'src/app/pages/main/catalogue/brand-creation/brand-creation.component';\nimport { BlueprintTestComponent } from 'src/app/pages/main/catalogue/model-detail/parser-tab/blueprint-test/blueprint-test.component';\nimport { BrandItemComponent } from './brand-item/brand-item.component';\nimport { CatalogueComponent } from './catalogue.component';\nimport { ModelCreationComponent } from './model-creation/model-creation.component';\nimport { ModelDetailComponent } from './model-detail/model-detail.component';\nimport { FieldHintComponent } from './model-detail/parser-tab/json-parser-editor/field-hint/field-hint.component';\nimport { JsonInputComponent } from './model-detail/parser-tab/json-parser-editor/json-input/json-input.component';\nimport { JsonParserEditorComponent } from './model-detail/parser-tab/json-parser-editor/json-parser-editor.component';\nimport { MessageFieldMappingComponent } from './model-detail/parser-tab/json-parser-editor/message-field-mapping/message-field-mapping.component';\nimport { MultiParserEditorComponent } from './model-detail/parser-tab/multi-parser-editor/multi-parser-editor.component';\nimport { SingleParserDialogComponent } from './model-detail/parser-tab/multi-parser-editor/single-parser-dialog/single-parser-dialog.component';\nimport { ParserTabComponent } from './model-detail/parser-tab/parser-tab.component';\nimport { ParserTypeSelectionComponent } from './model-detail/parser-tab/parser-type-selection/parser-type-selection.component';\nimport { SingleParserEditorComponent } from './model-detail/parser-tab/single-parser-editor/single-parser-editor.component';\n\nconst COMPONENTS = [\n CatalogueComponent,\n BrandItemComponent,\n ModelDetailComponent,\n ParserTabComponent,\n ParserTypeSelectionComponent,\n SingleParserEditorComponent,\n ModelCreationComponent,\n MultiParserEditorComponent,\n SingleParserDialogComponent,\n JsonParserEditorComponent,\n JsonInputComponent,\n MessageFieldMappingComponent,\n FieldHintComponent,\n BlueprintTestComponent,\n BrandCreationComponent,\n];\n\n@NgModule({\n declarations: [COMPONENTS],\n exports: [COMPONENTS],\n imports: [BrowserAnimationsModule, SharedModule, RouterModule],\n providers: [provideHttpClient(withInterceptorsFromDi())],\n})\nexport class CatalogueModule {}\n","import {\n provideHttpClient,\n withInterceptorsFromDi,\n} from '@angular/common/http';\nimport { NgModule } from '@angular/core';\nimport { BrowserAnimationsModule } from '@angular/platform-browser/animations';\nimport { RouterModule } from '@angular/router';\nimport { GatewayStatusChartComponent } from './gateway-status-chart/gateway-status-chart.component';\n\nimport { LeafletModule } from '@asymmetrik/ngx-leaflet';\nimport { SharedModule } from 'src/app/services/shared.module';\n\nimport { DashboardComponent } from './dashboard.component';\nimport { DeviceListComponent } from './device-list/device-list.component';\nimport { DeviceStatusChartComponent } from './device-status-chart/device-status-chart.component';\n\nconst COMPONENTS = [\n DeviceListComponent,\n DashboardComponent,\n DeviceStatusChartComponent,\n GatewayStatusChartComponent,\n];\n\n@NgModule({\n declarations: [COMPONENTS],\n exports: [COMPONENTS],\n imports: [BrowserAnimationsModule, SharedModule, RouterModule, LeafletModule],\n providers: [provideHttpClient(withInterceptorsFromDi())],\n})\nexport class DashboardModule {}\n","import {\n provideHttpClient,\n withInterceptorsFromDi,\n} from '@angular/common/http';\nimport { NgModule } from '@angular/core';\nimport { MatSnackBarModule } from '@angular/material/snack-bar';\nimport { BrowserAnimationsModule } from '@angular/platform-browser/animations';\nimport { RouterModule } from '@angular/router';\nimport { SharedModule } from 'src/app/services/shared.module';\nimport { DefaultDeviceCreationComponent } from './device-creation/default-device-creation/default-device-creation.component';\nimport { DeviceCreationComponent } from './device-creation/device-creation.component';\nimport { FireflyDeviceCreationComponent } from './device-creation/firefly-device-creation/firefly-device-creation.component';\nimport { IotCoreDeviceCreationComponent } from './device-creation/iot-core-creation/iotcore-device-creation.component';\nimport { ModelChoiceComponent } from './device-creation/model-choice/model-choice.component';\nimport { DeviceTypeBannerComponent } from './device-creation/shared/device-type-banner/device-type-banner.component';\nimport { MetadataFormComponent } from './device-creation/shared/metadata-form/metadata-form.component';\nimport { DetailStepperComponent } from './device-detail/detail-stepper/detail-stepper.component';\nimport { DeviceCalibrationFunctionComponent } from './device-detail/device-calibration-function/device-calibration-function.component';\nimport { DeviceDetailComponent } from './device-detail/device-detail.component';\nimport { DeviceManagementComponent } from './device-management.component';\nimport { DeviceMoveConfirmationDialogComponent } from './device-move-confirmation-dialog/device-move-confirmation-dialog.component';\nimport { DevicePictureUpdateComponent } from './device-picture-update/device-picture-update.component';\nimport { DeviceProvidingModelSelectComponent } from './device-providing/device-providing-model-select/device-providing-model-select.component';\nimport { DeviceProvidingComponent } from './device-providing/device-providing.component';\nimport { DeviceUpdateComponent } from './device-update/device-update.component';\nimport { ActionButtonsComponent } from './hierarchy-node-list/action-buttons/action-buttons.component';\nimport { DeviceListElementComponent } from './hierarchy-node-list/device-list-element/device-list-element.component';\nimport { FolderListElementComponent } from './hierarchy-node-list/folder-list-element/folder-list-element.component';\nimport { HierarchyNodeListComponent } from './hierarchy-node-list/hierarchy-node-list.component';\nimport { NewFolderDialogComponent } from './hierarchy-node-list/new-folder-dialog/new-folder-dialog.component';\nimport { HierarchyTreeComponent } from './hierarchy-tree/hierarchy-tree.component';\nimport { MultiDownlinkComponent } from './multi-downlink/multi-downlink.component';\nimport { SendDownlinkDialogComponent } from './send-downlink-dialog/send-downlink-dialog.component';\n\nconst COMPONENTS = [\n DeviceManagementComponent,\n HierarchyTreeComponent,\n ModelChoiceComponent,\n NewFolderDialogComponent,\n DeviceDetailComponent,\n MetadataFormComponent,\n HierarchyNodeListComponent,\n FolderListElementComponent,\n DeviceListElementComponent,\n ActionButtonsComponent,\n IotCoreDeviceCreationComponent,\n DeviceTypeBannerComponent,\n FireflyDeviceCreationComponent,\n DefaultDeviceCreationComponent,\n DeviceCreationComponent,\n DetailStepperComponent,\n DeviceProvidingComponent,\n DeviceProvidingModelSelectComponent,\n DeviceMoveConfirmationDialogComponent,\n SendDownlinkDialogComponent,\n];\n\n@NgModule({\n declarations: [\n COMPONENTS,\n DeviceUpdateComponent,\n DevicePictureUpdateComponent,\n DeviceCalibrationFunctionComponent,\n MultiDownlinkComponent,\n ],\n exports: [COMPONENTS],\n imports: [\n BrowserAnimationsModule,\n SharedModule,\n RouterModule,\n MatSnackBarModule,\n ],\n providers: [provideHttpClient(withInterceptorsFromDi())],\n})\nexport class DeviceManagementModule {}\n","import {\n provideHttpClient,\n withInterceptorsFromDi,\n} from '@angular/common/http';\nimport { NgModule } from '@angular/core';\nimport { BrowserAnimationsModule } from '@angular/platform-browser/animations';\nimport { RouterModule } from '@angular/router';\nimport { GatewayFilterComponent } from './gateway-filter/gateway-filter.component';\nimport { GatewayImportComponent } from './gateway-import/gateway-import.component';\n\nimport { SharedModule } from 'src/app/services/shared.module';\nimport { GatewayDataVisualComponent } from './gateway-data-visual/gateway-data-visual.component';\nimport { GatewayListComponent } from './gateway-list.component';\nimport { GatewayMapComponent } from './gateway-map/gateway-map.component';\n\nconst COMPONENTS = [\n GatewayListComponent,\n GatewayFilterComponent,\n GatewayDataVisualComponent,\n GatewayMapComponent,\n GatewayImportComponent,\n];\n\n@NgModule({\n declarations: [COMPONENTS],\n exports: [COMPONENTS],\n imports: [BrowserAnimationsModule, SharedModule, RouterModule],\n providers: [provideHttpClient(withInterceptorsFromDi())],\n})\nexport class GatewayModule {}\n","import { CommonModule } from '@angular/common';\nimport {\n provideHttpClient,\n withInterceptorsFromDi,\n} from '@angular/common/http';\nimport { NgModule } from '@angular/core';\nimport { BrowserAnimationsModule } from '@angular/platform-browser/animations';\nimport { RouterModule } from '@angular/router';\nimport { SharedModule } from 'src/app/services/shared.module';\nimport { RedriveMessagesSettingsComponent } from './redrive-messages-settings/redrive-messages-settings.component';\nimport { RedriveMessagesTableComponent } from './redrive-messages-table/redrive-messages-table.component';\nimport { RedriveMessagesComponent } from './redrive-messages.component';\n\n@NgModule({\n declarations: [\n RedriveMessagesComponent,\n RedriveMessagesTableComponent,\n RedriveMessagesSettingsComponent,\n ],\n imports: [CommonModule, BrowserAnimationsModule, SharedModule, RouterModule],\n providers: [provideHttpClient(withInterceptorsFromDi())],\n})\nexport class RedriveMessagesModule {}\n","export enum FileTypes {\n CSV_TYPE = 'text/csv;charset=utf-8;',\n PEM_TYPE = 'text/pem;charset=utf-8;',\n}\n\nexport enum FileExtensions {\n CSV_EXTENSION = '.csv',\n PEM_EXTENSION = '.pem',\n}\n","import { Injectable } from '@angular/core';\nimport { FileTypes } from 'src/models/download.models';\nimport { FileExtensions } from './../../../models/download.models';\n\n@Injectable({ providedIn: 'root' })\nexport class DownloadService {\n convertToCSV(data: string[]): string {\n return '\\ufeff' + data.join('\\r\\n');\n }\n\n downloadFile(\n data: string,\n fileName: string,\n fileType: FileTypes,\n fileExtension: FileExtensions,\n ) {\n const blob = new Blob([data], { type: fileType });\n const dwldLink = document.createElement('a');\n const url = URL.createObjectURL(blob);\n const isSafariBrowser =\n navigator.userAgent.indexOf('Safari') !== -1 &&\n navigator.userAgent.indexOf('Chrome') === -1;\n if (isSafariBrowser) {\n // if Safari open in new window to save file with random filename.\n dwldLink.setAttribute('target', '_blank');\n }\n dwldLink.setAttribute('href', url);\n dwldLink.setAttribute('download', fileName + fileExtension);\n dwldLink.style.visibility = 'hidden';\n document.body.appendChild(dwldLink);\n dwldLink.click();\n document.body.removeChild(dwldLink);\n }\n}\n","
    \n

    Details Data: {{ displayedData.length }}

    \n \n Export\n \n
    \n\n
    \n \n \n \n
    \n\n\n
    \n
    \n \n \n \n file_copy\n \n \n \n {{ route.value }} \n ({{ getDeviceName(route.value) }})\n \n
    \n
    \n \n \n \n
    \n
    \n\n\n\n","import { Component, Input, OnInit } from '@angular/core';\nimport { MatTooltip } from '@angular/material/tooltip';\nimport { firstValueFrom } from 'rxjs';\nimport { DownloadService } from 'src/app/services/util/download.service';\nimport { RouteDto } from 'src/models/data-routing.models';\nimport { FileExtensions, FileTypes } from 'src/models/download.models';\nimport { DataLoaderService } from '../../../../../services/state/data/data-loader.service';\nimport { DevicePath } from '../routing-details.component';\nimport { DataStoreService } from './../../../../../services/state/data/data-store.service';\n\n@Component({\n selector: 'app-data-list',\n templateUrl: './data-list.component.html',\n styleUrls: ['./data-list.component.scss'],\n})\nexport class DataListComponent implements OnInit {\n private _displayedData: DevicePath[];\n tooltip = 'copy';\n groupedRoutes: GroupedRoutes[];\n get displayedData() {\n return this._displayedData;\n }\n\n @Input() set displayedData(v: DevicePath[]) {\n this._displayedData = v;\n\n const mapper = {};\n\n this._displayedData.reduce(\n (_: void, curr) => {\n const crumbs = curr.path.split(',')[1].split('/');\n if (crumbs[0] === '') crumbs.splice(0, 2, '/' + crumbs[1]);\n let ref = mapper;\n for (const crumb of crumbs) ref = ref[crumb] = ref[crumb] ?? {};\n return;\n },\n void 0,\n );\n\n const recur = (ref: object) =>\n Object.entries(ref).map(([key, value]) => ({\n value: key,\n children: recur(value),\n }));\n\n this.groupedRoutes = recur(mapper);\n }\n @Input() routing: RouteDto;\n\n constructor(\n private download: DownloadService,\n private data: DataStoreService,\n private loader: DataLoaderService,\n ) {}\n\n async ngOnInit() {\n if (!this.data.devices) {\n await firstValueFrom(this.loader.loadDevices());\n }\n }\n\n onCopyToClipBoard(text: string, toolTip: MatTooltip) {\n this.tooltip = 'copied to clipboard';\n setTimeout(() => toolTip.show());\n setTimeout(() => {\n toolTip.hide();\n }, 2000);\n const selBox = document.createElement('textarea');\n selBox.style.position = 'fixed';\n selBox.style.left = '0';\n selBox.style.top = '0';\n selBox.style.opacity = '0';\n selBox.value = text;\n document.body.appendChild(selBox);\n selBox.focus();\n selBox.select();\n document.execCommand('copy');\n document.body.removeChild(selBox);\n }\n\n exportAsCSV(): void {\n const site = this.data.sites!.find(\n (site) => site.code === this.routing.pattern.split('/')[1],\n );\n const fileName = site\n ? `${site.country.isoCode} - ${site.name}_${this.routing.name}_IoT-paths_${new Date().toISOString()}`\n : `${this.routing.name}_IoT-paths_${new Date().toISOString()}`;\n\n const withDeviceDetails = this._displayedData.map((devicePath) =>\n this.addDeviceTypeAndBrand(devicePath),\n );\n\n this.download.downloadFile(\n this.download.convertToCSV(withDeviceDetails),\n fileName,\n FileTypes.CSV_TYPE,\n FileExtensions.CSV_EXTENSION,\n );\n }\n\n resetTooltip() {\n this.tooltip = 'copy';\n }\n\n getDeviceName(id: string): string {\n const device = this.data.getDeviceByID(id);\n return device ? device.metadata.name : '';\n }\n\n addDeviceTypeAndBrand(devicePath: DevicePath): string {\n const device = this.data.devices!.find(\n (d) => d.device_id === devicePath.device.device_id,\n );\n if (!device) {\n throw new Error(`Unknown device ${devicePath.device.device_id}`);\n }\n return `${devicePath.path},${device.deviceType.brand.name},${device.deviceType.name}`;\n }\n}\n\ntype GroupedRoutes = { value: string; children: GroupedRoutes[] };\n","
    \n
    \n

    Listing Devices: {{ routedDevices.length }}

    \n \n \n Filter devices\n \n \n \n
    \n Toggle all devices at once\n
    \n
    \n \n
    \n

    {{ device.device_name }}

    \n

    {{ device.hierarchy_prefix }}

    \n
    \n
    \n \n visibility\n

    {{ device.data.length }} Data

    \n
    \n
    \n\n","import { Component, EventEmitter, Input, OnInit, Output } from '@angular/core';\nimport { FormControl } from '@angular/forms';\n\nimport { debounceTime, startWith, tap } from 'rxjs/operators';\nimport { DeviceLightDto } from 'src/models/data-routing.models';\nimport { DevicePath } from '../routing-details.component';\n\n@Component({\n selector: 'app-device-data-selection',\n templateUrl: './device-data-selection.component.html',\n styleUrls: ['./device-data-selection.component.scss'],\n})\nexport class DeviceDataSelectionComponent implements OnInit {\n @Input() routedDevices: DeviceLightDto[];\n @Output() deviceDataSelected = new EventEmitter();\n selectedDevices: DeviceLightDto[];\n filteredDevices: DeviceLightDto[];\n allSelected = new FormControl(true);\n filter = new FormControl('', { nonNullable: true });\n\n ngOnInit(): void {\n this.selectedDevices = this.routedDevices;\n this.filteredDevices = this.routedDevices;\n\n this.allSelected.valueChanges\n .pipe(\n startWith(this.allSelected.value),\n tap(\n (allSelected) =>\n (this.selectedDevices = allSelected ? this.routedDevices : []),\n ),\n tap(() => this.deviceDataSelected.emit(this.selectedData)),\n )\n .subscribe();\n\n this.filter.valueChanges\n .pipe(\n debounceTime(150),\n tap((value) => {\n const filterResult = this.routedDevices.filter(\n (devices) =>\n devices.device_name.toLowerCase().includes(value.toLowerCase()) ||\n devices.device_id.toLowerCase().includes(value.toLowerCase()),\n );\n this.selectedDevices = filterResult;\n this.filteredDevices = filterResult;\n this.deviceDataSelected.emit(this.selectedData);\n }),\n )\n .subscribe();\n }\n\n public isDeviceSelected(deviceId: string): boolean {\n return this.selectedDevices\n .map((device) => device.device_id)\n .includes(deviceId);\n }\n\n public addDeviceToSelection(device: DeviceLightDto): void {\n this.selectedDevices.push(device);\n this.deviceDataSelected.emit(this.selectedData);\n }\n\n public removeDeviceFromSelection(device: DeviceLightDto): void {\n this.selectedDevices = this.selectedDevices.filter(\n (dev) => dev.device_id !== device.device_id,\n );\n this.deviceDataSelected.emit(this.selectedData);\n }\n\n private get selectedData(): DevicePath[] {\n const dataArrays = this.selectedDevices\n .filter((device) => !!device.data.length)\n .map((device) =>\n device.data.map((data) => ({\n device,\n path: `${device.device_name},${device.hierarchy_prefix}${device.device_id}/${data}`,\n })),\n );\n return ([] as DevicePath[]).concat(...dataArrays);\n }\n}\n","import {\n provideHttpClient,\n withInterceptorsFromDi,\n} from '@angular/common/http';\nimport { NgModule } from '@angular/core';\nimport { BrowserAnimationsModule } from '@angular/platform-browser/animations';\nimport { RouterModule } from '@angular/router';\nimport { RoutingCreationService } from './routing-creation/routing-creation.service';\n\nimport { SharedModule } from 'src/app/services/shared.module';\n\nimport { DataSelectListComponent } from './routing-creation/destination-form/data-select-list/data-select-list.component';\nimport { DestinationFormComponent } from './routing-creation/destination-form/destination-form.component';\nimport { SheetDataBuilderComponent } from './routing-creation/destination-form/sheet-data-builder/sheet-data-builder.component';\nimport { MQTTTopicHelpDialogComponent } from './routing-creation/mqtt-topic-help-dialog/mqtt-topic-help-dialog.component';\nimport { PatternBuilderHelpComponent } from './routing-creation/pattern-builder-help/pattern-builder-help.component';\nimport { PatternBuilderComponent } from './routing-creation/pattern-builder/pattern-builder.component';\nimport { RoutingCreationComponent } from './routing-creation/routing-creation.component';\nimport { DataListComponent } from './routing-details/data-list/data-list.component';\nimport { DeviceDataSelectionComponent } from './routing-details/device-data-selection/device-data-selection.component';\nimport { RoutingDetailsComponent } from './routing-details/routing-details.component';\nimport { RoutingFilterComponent } from './routing-filter/routing-filter.component';\nimport { RoutingListElementComponent } from './routing-list-element/routing-list-element.component';\nimport { RoutingListComponent } from './routing-list.component';\n\nconst COMPONENTS = [\n RoutingListComponent,\n RoutingListElementComponent,\n RoutingFilterComponent,\n RoutingDetailsComponent,\n DeviceDataSelectionComponent,\n DataListComponent,\n RoutingCreationComponent,\n PatternBuilderComponent,\n PatternBuilderHelpComponent,\n MQTTTopicHelpDialogComponent,\n DestinationFormComponent,\n DataSelectListComponent,\n SheetDataBuilderComponent,\n];\n\n@NgModule({\n declarations: [COMPONENTS],\n exports: [COMPONENTS],\n imports: [BrowserAnimationsModule, SharedModule, RouterModule],\n providers: [\n RoutingCreationService,\n provideHttpClient(withInterceptorsFromDi()),\n ],\n})\nexport class RoutingModule {}\n","import { CommonModule } from '@angular/common';\nimport {\n provideHttpClient,\n withInterceptorsFromDi,\n} from '@angular/common/http';\nimport { NgModule } from '@angular/core';\nimport { BrowserAnimationsModule } from '@angular/platform-browser/animations';\nimport { RouterModule } from '@angular/router';\nimport { SharedModule } from 'src/app/services/shared.module';\nimport { SiteCreationComponent } from './site-creation/site-creation.component';\nimport { SiteFilterComponent } from './site-filter/site-filter.component';\nimport { SiteComponent } from './site.component';\n\n@NgModule({\n declarations: [SiteComponent, SiteCreationComponent, SiteFilterComponent],\n imports: [CommonModule, BrowserAnimationsModule, SharedModule, RouterModule],\n providers: [provideHttpClient(withInterceptorsFromDi())],\n})\nexport class SiteModule {}\n","import { CommonModule } from '@angular/common';\nimport {\n provideHttpClient,\n withInterceptorsFromDi,\n} from '@angular/common/http';\nimport { NgModule } from '@angular/core';\nimport { BrowserAnimationsModule } from '@angular/platform-browser/animations';\nimport { RouterModule } from '@angular/router';\nimport { SharedModule } from 'src/app/services/shared.module';\nimport { UserCreationComponent } from './user-creation/user-creation.component';\nimport { UserFilterComponent } from './user-filter/user-filter.component';\nimport { UserManagementComponent } from './user-management.component';\n\n@NgModule({\n declarations: [\n UserManagementComponent,\n UserFilterComponent,\n UserCreationComponent,\n ],\n imports: [CommonModule, BrowserAnimationsModule, SharedModule, RouterModule],\n providers: [provideHttpClient(withInterceptorsFromDi())],\n})\nexport class UserManagementModule {}\n","import {\n provideHttpClient,\n withInterceptorsFromDi,\n} from '@angular/common/http';\nimport { NgModule } from '@angular/core';\nimport { BrowserModule } from '@angular/platform-browser';\nimport { RouterModule } from '@angular/router';\nimport { InterfaceManagementModule } from 'src/app/pages/main/interface-management/interface-management.module';\nimport { SharedModule } from 'src/app/services/shared.module';\nimport { AlertingModule } from './alerting/alerting.module';\nimport { CatalogueModule } from './catalogue/catalogue.module';\nimport { DashboardModule } from './dashboard/dashboard.module';\nimport { DeviceManagementModule } from './device-management/device-management.module';\nimport { GatewayModule } from './gateway-list/gateway.module';\nimport { MainComponent } from './main.component';\nimport { RedriveMessagesModule } from './redrive-messages/redrive-messages.module';\nimport { RoutingModule } from './routing-list/routing.module';\nimport { SiteModule } from './site/site.module';\nimport { UserManagementModule } from './user-management/user-management.module';\n\nconst COMPONENTS = [MainComponent];\n\n@NgModule({\n declarations: [COMPONENTS],\n imports: [\n BrowserModule,\n RouterModule,\n SharedModule,\n DashboardModule,\n CatalogueModule,\n RoutingModule,\n GatewayModule,\n DeviceManagementModule,\n UserManagementModule,\n AlertingModule,\n RedriveMessagesModule,\n SiteModule,\n InterfaceManagementModule,\n ],\n providers: [provideHttpClient(withInterceptorsFromDi())],\n})\nexport class MainModule {}\n","import {\n provideHttpClient,\n withInterceptorsFromDi,\n} from '@angular/common/http';\nimport { NgModule } from '@angular/core';\nimport { BrowserAnimationsModule } from '@angular/platform-browser/animations';\nimport { RouterModule } from '@angular/router';\n\nimport { SharedModule } from 'src/app/services/shared.module';\nimport { UnauthorizedComponent } from './unauthorized.component';\n\nconst COMPONENTS = [UnauthorizedComponent];\n\n@NgModule({\n declarations: [COMPONENTS],\n exports: [COMPONENTS],\n imports: [BrowserAnimationsModule, SharedModule, RouterModule],\n providers: [provideHttpClient(withInterceptorsFromDi())],\n})\nexport class UnauthorizedModule {}\n","import {\n provideHttpClient,\n withInterceptorsFromDi,\n} from '@angular/common/http';\nimport { NgModule } from '@angular/core';\nimport { AngularFireAuth } from '@angular/fire/compat/auth';\nimport { BrowserModule } from '@angular/platform-browser';\nimport { httpInterceptorProviders } from './services/http/interceptors';\n\nimport { LeafletModule } from '@asymmetrik/ngx-leaflet';\nimport { RouterOutletComponent } from 'src/app/components/router-outlet/router-outlet.component';\nimport { AppRoutingModule } from './app-routing.module';\nimport { AppComponent } from './app.component';\nimport { LoginModule } from './pages/login/login.module';\nimport { MainModule } from './pages/main/main.module';\nimport { UnauthorizedModule } from './pages/unauthorized/unauthorized.module';\nimport { SharedModule } from './services/shared.module';\n\n@NgModule({\n declarations: [AppComponent, RouterOutletComponent],\n bootstrap: [AppComponent],\n imports: [\n BrowserModule,\n SharedModule,\n MainModule,\n LoginModule,\n UnauthorizedModule,\n AppRoutingModule,\n LeafletModule,\n ],\n providers: [\n AngularFireAuth,\n httpInterceptorProviders,\n provideHttpClient(withInterceptorsFromDi()),\n ],\n})\nexport class AppModule {}\n","import { enableProdMode } from '@angular/core';\nimport { platformBrowserDynamic } from '@angular/platform-browser-dynamic';\n\nimport { AppModule } from './app/app.module';\nimport { environment } from './environments/environment';\n\nif (environment.production) {\n enableProdMode();\n}\n\nplatformBrowserDynamic()\n .bootstrapModule(AppModule)\n .catch((err) => console.error(err));\n","var map = {\n\t\"./af\": 5637,\n\t\"./af.js\": 5637,\n\t\"./ar\": 6777,\n\t\"./ar-dz\": 4508,\n\t\"./ar-dz.js\": 4508,\n\t\"./ar-kw\": 7504,\n\t\"./ar-kw.js\": 7504,\n\t\"./ar-ly\": 5373,\n\t\"./ar-ly.js\": 5373,\n\t\"./ar-ma\": 2412,\n\t\"./ar-ma.js\": 2412,\n\t\"./ar-ps\": 8823,\n\t\"./ar-ps.js\": 8823,\n\t\"./ar-sa\": 6670,\n\t\"./ar-sa.js\": 6670,\n\t\"./ar-tn\": 6448,\n\t\"./ar-tn.js\": 6448,\n\t\"./ar.js\": 6777,\n\t\"./az\": 3009,\n\t\"./az.js\": 3009,\n\t\"./be\": 8299,\n\t\"./be.js\": 8299,\n\t\"./bg\": 4685,\n\t\"./bg.js\": 4685,\n\t\"./bm\": 1171,\n\t\"./bm.js\": 1171,\n\t\"./bn\": 3590,\n\t\"./bn-bd\": 5841,\n\t\"./bn-bd.js\": 5841,\n\t\"./bn.js\": 3590,\n\t\"./bo\": 4309,\n\t\"./bo.js\": 4309,\n\t\"./br\": 4130,\n\t\"./br.js\": 4130,\n\t\"./bs\": 8033,\n\t\"./bs.js\": 8033,\n\t\"./ca\": 5294,\n\t\"./ca.js\": 5294,\n\t\"./cs\": 3028,\n\t\"./cs.js\": 3028,\n\t\"./cv\": 5807,\n\t\"./cv.js\": 5807,\n\t\"./cy\": 342,\n\t\"./cy.js\": 342,\n\t\"./da\": 8269,\n\t\"./da.js\": 8269,\n\t\"./de\": 1489,\n\t\"./de-at\": 2123,\n\t\"./de-at.js\": 2123,\n\t\"./de-ch\": 7757,\n\t\"./de-ch.js\": 7757,\n\t\"./de.js\": 1489,\n\t\"./dv\": 8152,\n\t\"./dv.js\": 8152,\n\t\"./el\": 7687,\n\t\"./el.js\": 7687,\n\t\"./en-au\": 6668,\n\t\"./en-au.js\": 6668,\n\t\"./en-ca\": 6798,\n\t\"./en-ca.js\": 6798,\n\t\"./en-gb\": 3615,\n\t\"./en-gb.js\": 3615,\n\t\"./en-ie\": 1364,\n\t\"./en-ie.js\": 1364,\n\t\"./en-il\": 9907,\n\t\"./en-il.js\": 9907,\n\t\"./en-in\": 533,\n\t\"./en-in.js\": 533,\n\t\"./en-nz\": 3190,\n\t\"./en-nz.js\": 3190,\n\t\"./en-sg\": 1096,\n\t\"./en-sg.js\": 1096,\n\t\"./eo\": 3962,\n\t\"./eo.js\": 3962,\n\t\"./es\": 7726,\n\t\"./es-do\": 5010,\n\t\"./es-do.js\": 5010,\n\t\"./es-mx\": 3654,\n\t\"./es-mx.js\": 3654,\n\t\"./es-us\": 9043,\n\t\"./es-us.js\": 9043,\n\t\"./es.js\": 7726,\n\t\"./et\": 5343,\n\t\"./et.js\": 5343,\n\t\"./eu\": 728,\n\t\"./eu.js\": 728,\n\t\"./fa\": 787,\n\t\"./fa.js\": 787,\n\t\"./fi\": 1771,\n\t\"./fi.js\": 1771,\n\t\"./fil\": 5335,\n\t\"./fil.js\": 5335,\n\t\"./fo\": 9761,\n\t\"./fo.js\": 9761,\n\t\"./fr\": 1670,\n\t\"./fr-ca\": 8991,\n\t\"./fr-ca.js\": 8991,\n\t\"./fr-ch\": 7280,\n\t\"./fr-ch.js\": 7280,\n\t\"./fr.js\": 1670,\n\t\"./fy\": 4203,\n\t\"./fy.js\": 4203,\n\t\"./ga\": 9858,\n\t\"./ga.js\": 9858,\n\t\"./gd\": 8605,\n\t\"./gd.js\": 8605,\n\t\"./gl\": 7365,\n\t\"./gl.js\": 7365,\n\t\"./gom-deva\": 3896,\n\t\"./gom-deva.js\": 3896,\n\t\"./gom-latn\": 5587,\n\t\"./gom-latn.js\": 5587,\n\t\"./gu\": 7950,\n\t\"./gu.js\": 7950,\n\t\"./he\": 2029,\n\t\"./he.js\": 2029,\n\t\"./hi\": 1897,\n\t\"./hi.js\": 1897,\n\t\"./hr\": 9816,\n\t\"./hr.js\": 9816,\n\t\"./hu\": 2253,\n\t\"./hu.js\": 2253,\n\t\"./hy-am\": 8196,\n\t\"./hy-am.js\": 8196,\n\t\"./id\": 1307,\n\t\"./id.js\": 1307,\n\t\"./is\": 5474,\n\t\"./is.js\": 5474,\n\t\"./it\": 3099,\n\t\"./it-ch\": 8188,\n\t\"./it-ch.js\": 8188,\n\t\"./it.js\": 3099,\n\t\"./ja\": 9127,\n\t\"./ja.js\": 9127,\n\t\"./jv\": 182,\n\t\"./jv.js\": 182,\n\t\"./ka\": 758,\n\t\"./ka.js\": 758,\n\t\"./kk\": 3444,\n\t\"./kk.js\": 3444,\n\t\"./km\": 2034,\n\t\"./km.js\": 2034,\n\t\"./kn\": 6223,\n\t\"./kn.js\": 6223,\n\t\"./ko\": 3064,\n\t\"./ko.js\": 3064,\n\t\"./ku\": 8714,\n\t\"./ku-kmr\": 961,\n\t\"./ku-kmr.js\": 961,\n\t\"./ku.js\": 8714,\n\t\"./ky\": 2062,\n\t\"./ky.js\": 2062,\n\t\"./lb\": 4796,\n\t\"./lb.js\": 4796,\n\t\"./lo\": 9279,\n\t\"./lo.js\": 9279,\n\t\"./lt\": 106,\n\t\"./lt.js\": 106,\n\t\"./lv\": 1840,\n\t\"./lv.js\": 1840,\n\t\"./me\": 2240,\n\t\"./me.js\": 2240,\n\t\"./mi\": 3588,\n\t\"./mi.js\": 3588,\n\t\"./mk\": 5518,\n\t\"./mk.js\": 5518,\n\t\"./ml\": 7823,\n\t\"./ml.js\": 7823,\n\t\"./mn\": 8657,\n\t\"./mn.js\": 8657,\n\t\"./mr\": 1285,\n\t\"./mr.js\": 1285,\n\t\"./ms\": 3014,\n\t\"./ms-my\": 6253,\n\t\"./ms-my.js\": 6253,\n\t\"./ms.js\": 3014,\n\t\"./mt\": 167,\n\t\"./mt.js\": 167,\n\t\"./my\": 7940,\n\t\"./my.js\": 7940,\n\t\"./nb\": 14,\n\t\"./nb.js\": 14,\n\t\"./ne\": 9023,\n\t\"./ne.js\": 9023,\n\t\"./nl\": 4208,\n\t\"./nl-be\": 1412,\n\t\"./nl-be.js\": 1412,\n\t\"./nl.js\": 4208,\n\t\"./nn\": 1354,\n\t\"./nn.js\": 1354,\n\t\"./oc-lnc\": 870,\n\t\"./oc-lnc.js\": 870,\n\t\"./pa-in\": 389,\n\t\"./pa-in.js\": 389,\n\t\"./pl\": 7342,\n\t\"./pl.js\": 7342,\n\t\"./pt\": 4774,\n\t\"./pt-br\": 3003,\n\t\"./pt-br.js\": 3003,\n\t\"./pt.js\": 4774,\n\t\"./ro\": 5333,\n\t\"./ro.js\": 5333,\n\t\"./ru\": 3451,\n\t\"./ru.js\": 3451,\n\t\"./sd\": 3921,\n\t\"./sd.js\": 3921,\n\t\"./se\": 9682,\n\t\"./se.js\": 9682,\n\t\"./si\": 582,\n\t\"./si.js\": 582,\n\t\"./sk\": 4348,\n\t\"./sk.js\": 4348,\n\t\"./sl\": 5337,\n\t\"./sl.js\": 5337,\n\t\"./sq\": 9358,\n\t\"./sq.js\": 9358,\n\t\"./sr\": 683,\n\t\"./sr-cyrl\": 9382,\n\t\"./sr-cyrl.js\": 9382,\n\t\"./sr.js\": 683,\n\t\"./ss\": 1156,\n\t\"./ss.js\": 1156,\n\t\"./sv\": 9855,\n\t\"./sv.js\": 9855,\n\t\"./sw\": 8536,\n\t\"./sw.js\": 8536,\n\t\"./ta\": 7754,\n\t\"./ta.js\": 7754,\n\t\"./te\": 7809,\n\t\"./te.js\": 7809,\n\t\"./tet\": 1297,\n\t\"./tet.js\": 1297,\n\t\"./tg\": 2527,\n\t\"./tg.js\": 2527,\n\t\"./th\": 5862,\n\t\"./th.js\": 5862,\n\t\"./tk\": 9331,\n\t\"./tk.js\": 9331,\n\t\"./tl-ph\": 4387,\n\t\"./tl-ph.js\": 4387,\n\t\"./tlh\": 3592,\n\t\"./tlh.js\": 3592,\n\t\"./tr\": 9732,\n\t\"./tr.js\": 9732,\n\t\"./tzl\": 9570,\n\t\"./tzl.js\": 9570,\n\t\"./tzm\": 3553,\n\t\"./tzm-latn\": 80,\n\t\"./tzm-latn.js\": 80,\n\t\"./tzm.js\": 3553,\n\t\"./ug-cn\": 5674,\n\t\"./ug-cn.js\": 5674,\n\t\"./uk\": 9974,\n\t\"./uk.js\": 9974,\n\t\"./ur\": 5773,\n\t\"./ur.js\": 5773,\n\t\"./uz\": 357,\n\t\"./uz-latn\": 7135,\n\t\"./uz-latn.js\": 7135,\n\t\"./uz.js\": 357,\n\t\"./vi\": 43,\n\t\"./vi.js\": 43,\n\t\"./x-pseudo\": 767,\n\t\"./x-pseudo.js\": 767,\n\t\"./yo\": 150,\n\t\"./yo.js\": 150,\n\t\"./zh-cn\": 1828,\n\t\"./zh-cn.js\": 1828,\n\t\"./zh-hk\": 6644,\n\t\"./zh-hk.js\": 6644,\n\t\"./zh-mo\": 9305,\n\t\"./zh-mo.js\": 9305,\n\t\"./zh-tw\": 1860,\n\t\"./zh-tw.js\": 1860\n};\n\n\nfunction webpackContext(req) {\n\tvar id = webpackContextResolve(req);\n\treturn __webpack_require__(id);\n}\nfunction webpackContextResolve(req) {\n\tif(!__webpack_require__.o(map, req)) {\n\t\tvar e = new Error(\"Cannot find module '\" + req + \"'\");\n\t\te.code = 'MODULE_NOT_FOUND';\n\t\tthrow e;\n\t}\n\treturn map[req];\n}\nwebpackContext.keys = function webpackContextKeys() {\n\treturn Object.keys(map);\n};\nwebpackContext.resolve = webpackContextResolve;\nmodule.exports = webpackContext;\nwebpackContext.id = 5358;"],"x_google_ignoreList":[246]}