{"version":3,"file":"main.js","mappings":"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","names":["OriginalPaletteProvider","_PaletteProvider","GlobalService","constructor","httpClient","dialog","this","EventEmitter","showAlert","model","data","open","width","panelClass","height","showAlertWithCallBack","methodRef","thisRef","afterClosed","subscribe","result","openModelWindow","modelComponent","widthOfWindow","panelClassName","dataToPass","isNotNull","response","undefined","replaceDisplayText","tempText","replaceFilterText","conditionalDataFiltering","filterResponse","temp","selectedValue","length","filter","df","selectedFieldName","i0","factory","AlertComponent","dialogRef","globals","title","success","onCancelClick","close","MAT_DIALOG_DATA","selectors","ctx","RenameModelComponent","disableClose","ngOnInit","modelName","name","modeler","entireModeler","validateKey","event","nameExisiting","latest","target","value","diagrams","plane","planeElement","m","bpmnElement","$attrs","modelUniqueId","nameExist","saveFlowSheet","FlowSheet","bpmnXml","flowSheetId","description","refineryName","createdBy","lastUpdatedTimeStamp","Date","lastUpdatedBy","initialModelUniqueIds","models","DataSrc","Globals","flowsheetApi_client_resourceUri","flowsheetApi_client_resourceScope","notificationApi_client_resourceUri","notificationApi_client_resourceScope","graphApi_client_resourceUri","graphApi_client_resourceScope","modelManagementApi_client_resourceUri","modelManagementApi_client_resourceScope","platformAdminApi_client_resourceUri","platformAdminApi_client_resourceScope","platformHubUrl","platformHomeUrl","FlowSheetService","http","apiUri","config","graphUri","getToken","get","tokenApi","getFlowSheetsList","getFlowSheetsListApi","getFlowData","id","getFlowSheetDataById","params","deleteFlowSheet","delete","deleteFlowSheetApi","flowsheetId","loadBpmn","getBpmnApi","headers","observe","responseType","flowSheetData","post","saveFlowSheetApi","getDataSources","getDataSourcesApi","getDataSourceParameters","dataSourceId","getDataSourceParametersApi","getFlowsheetRunsList","getFlowSheetRunsListApi","getFlowSheetRunDetails","flowSheetRunId","getFlowSheetRunDetailsApi","getLatestRunDetails","getLatestRunDetailsApi","initiateNewRun","runReqData","runFlowSheetApi","terminateFlowsheetRun","terminiateFlowSheetApi","SaveFlowSheetComponent","flowSheetService","getFlowsheetsList","flowSheet","flowsheetList","isLoading","error","message","validateUniqueName","flowsheetName","flowSheetName","CustomPaletteProvider","palette","originalPaletteProvider","elementFactory","create","registerProvider","getPaletteEntries","JSON","parse","localStorage","getItem","actions","count","modelCnt","modelData","group","className","action","click","createShape","dragstart","shape","type","modelId","modelType","modelImg","modelImage","modelVersion","start","window","Model","inputParameters","outputParameters","srcModels","sinkModels","ParameterModel","ModelParameter","parameterId","parameterName","parameterDefaultValue","parameterDataType","parameterUom","captionName","InputParameter","mappedDataSource","mappedDataSourceId","mappedParameterId","mappedParameterName","mappedFrequency","mappedParameterUoM","OutputParameter","FlowSheetEventsHandler","Subject","ngOnDestroy","destroyed","next","complete","calculateInitialModels","forEach","push","addModel","flowsheetBuilder","setUpModelParameters","mlService","getModelParameters","pipe","takeUntil","concatMap","_this","addInputParameter","addOutputParameter","param","inputParam","parseParameterData","outputParam","parameter","removeModel","index","findIndex","splice","removeSrcModelParameterMappings","srcModelUniqueId","resetParameterSrcMapData","updateParameterMapping","parameterModel","find","p","dataSource","srcFrequency","srcParameterId","srcParameterName","srcParameterUoM","defaultValue","returnParameterToOriginalPosition","paramList","prevIndex","Math","max","apply","map","HttpService","HttpHeaders","postFormData","url","body","catchError","err","handleError","httpParams","header","throwError","GraphService","displayName","groupIDs","getGroups","getNextPage","nextPage","TenantService","httpService","graphService","getTenantListFromServer","componentId","element","tenantList","filteredTenants","filterTenants","tenant1","tenantSecurityGrp","indexOf","refineryTenantMap","publishTenantRefineryMap","tenantId","console","log","groups","user","finalTenantList","tenant","sort","a","b","tenantName","setActivatedTenantId","getTenants","tenantList$","asObservable","setCurrentTenant","currentTenant","getCurrentTenant","activatedTenantId","refineryWithTenant","v","some","ref","tenantIndex","t","toString","toLowerCase","isSelected","MLService","router","tenantService","getModelList","getModelListApi","getModelParametersApi","redirectTo","location","href","redirectToNotifiction","eventId","createUrlTree","ConnectorSpecificationComponent","flowSheetHandler","srcModel","sinkModel","readOnly","setSrcParameters","setSinkParameters","srcOutputParameters","ip","sinkParam","srcConnParameterList","sinkInputParameters","sinkConnParameterList","drop","previousContainer","container","moveItemInArray","previousIndex","currentIndex","transferArrayItem","deleteMapping","deletedSinkParam","deletedSrcParam","saveConnectorSpecification","connParam","srcParam","MlModel","modelApiVersion","businessDescription","businessFunctionType","providerInformation","lastUpdatedDate","ModelContainerId","ModelContainerUrl","apiUrl","modelEntityType","DataSourceManagerComponent","flowsheetService","setConnectedParameters","sinkConnVariablesList","sinkVariablesConnToSrcModel","srcConnVariablesList","dataSourceSelected","modelError","parameterList","onSelectParameter","frequncy","srcParameter","selectedParameter","saveMappingDetails","saveDataSourceMapping","userSinkVar","formItem","i","obj","inputModel","label","uom","form_template","input_template","UntypedFormControl","myFormGroup","UntypedFormGroup","gotoPrev","onSubmit","key","Object","entries","res","split","COLOR_OFF_WHITE","CustomRenderer","eventBus","styles","BaseRenderer","computeStyle","drawTriangle","side","points","attrs","stroke","strokeWidth","fill","polygon","svgCreate","svgAttr","svgimg","document","createElementNS","setAttributeNS","append","getTrianglePath","componentsToPath","x","y","customModel","modelHeight","modelWidth","modalImagePath","circle","svgNS","svgAppend","newText","textNode","createTextNode","appendChild","getModelPath","radius","draw","opts","svg","k","setAttribute","drawCustomConnection","marker","viewBox","refX","refY","markerUnits","markerWidth","markerHeight","orient","marker_path","d","strokeDasharray","markerEnd","createLine","waypoints","getCustomConnectionPath","connection","original","connectionPath","waypoint","inherits","$inject","prototype","canRender","test","drawShape","businessObject","getShapePath","drawConnection","getConnectionPath","__init__","customRenderer","CustomModeler","options","Modeler","_modules","concat","CustomModule","ConfirmModelComponent","intendedAction","FlowSheetRunDetail","status","startTime","endTime","runCreatedBy","ModelRunDetail","ModelRunParameterDetail","parameterDisplayName","FlowSheetRunDetailsComponent","httpClientObj","route","modelRunDetails","flowSheetRunData","runStartDateTimeStamp","runEndDateTimeStamp","modelDataObj","modelDataList","selModel","showParameters","isShowParam","inputsList","outputsList","selModelUniqueId","r","paramData","parameterRunValue","inputDataSource","MatTableDataSource","outputDataSource","FlowsheetBuilderComponent","matIconRegistry","domSanitizer","_eref","getModelListData","EMPTY","switchMap","setItem","stringify","palletData","assignPalletCopy","createCustomModeler","of","getFlowsheetDetails","validateIfReadyForNewRun","flowSheetRuns","isReadyForTerminiate","isReadyForNewRun","filteredPalletData","assign","searchPallet","searchText","subElement","includes","flowsheetShow","isAuthorized","editFlowsheet","isEdit","load","seteventBus","viewOnly","importXML","then","zoom","inEditMode","onClick","showContextMenu","thisObj","that","on","context","setUniqueIdForModel","elem","cancel","processShapeAddedEvent","validateConnetion","source","sourceRef","targetRef","updateConnection","$parent","flowElements","e","$type","removeConnection","processDblClkEvent","stopPropagation","processContextMenuEvent","c","Number","modelToRename","posX","originalEvent","pageX","posY","pageY","getDefinitions","renameModelInfo","gfx","parentNode","children","textContent","preventDefault","renameModel","changeModelName","newModelName","oldName","m1","svgTextElement","getTextNodeElement","childNodes","nodeValue","getElementsByTagName","connElem","isSameModel","conns","parent","connectionAlreadyExist","srcModelsTrace","getSrcModelUniqueIdRecursive","isCausingCircle","removeElementFromRegistry","conn","elementId","elementRegistry","modeling","removeElements","maxId","c1","b1","replace","isNaN","slice","newSrcModel","newSinkModel","s","oldSrcModel","oldSinkModel","additionalModules","paletteProvider","changeSource","src","selectPalleteType","paletteType","activPallet","selectModel","querySelector","canvasZoomIn","stepZoom","canvasZoomOut","canvasZoomReset","reset","setFlowSheetData","tenantRefinery","loggedInUser","bpmnDiagram","xml","editMode","save","saveXML","format","validateBeforeRun","validateInputParameters","unmappedModels","openRunDetails","tenantIdDetails","flowsheetData","terminateRun","terminateRunConfirm","isDelete","FilterModel","CommonConstants","FilterFieldTypes","FilterResponseModel","AddFilterComponent","fb","globalService","constants","addFilterForm","filterName","Validators","condition","onFieldSelected","valuesList","selectedField","setValue","filterList","o","fieldName","fieldType","conditionList","conditionTypeText","conditionTypeValues","onConditionSelected","tempType","values","localeCompare","parseInt","hideFieldName","selectedFilters","disableValues","submitFilter","selectedCondition","emit","FlowSheetComponent","_router","global","events","NavigationEnd","initialize","flowsheetsListDetails","expandedIndex","masterData","isUserAuthorized","paginator","createFilterList","modelErrorMessage","filteredData","isUnauthorized","rbacName","flowSheetIdToDelete","deleteOnConfirm","applyFilter","filterValue","trim","displayedColumns","unique","tempFilter","Array","from","Set","flowSheetDescription","popover","isOpen","remove","selectedFilter","MatPaginator","MatSort","sheet","OverageComponent","authService","service","handleResponse","getGroupId","handleNextPage","syncGroups","InteractionRequiredAuthError","errorCode","errorMessage","acquireTokenPopup","scopes","toPromise","navigate","redirectPath","GroupGuardService","globalServ","canActivate","validateGroup","routeConfig","path","expectedGroups","matchGroups","grp","redirectOnUnAuthorizedAccess","environment","production","process","clientId","authority","validateAuthority","redirectUri","postLogoutRedirectUri","navigateToLoginRequestUrl","notificationApi_client_resourceUri_resourceScope","groups_client_PlatformAdminGroupId","groups_client_FlowsheetBuilderUserGroupId","cache_client","cacheLocation","ReleaseDetails","Version","DateOfBuild","BuildNumber","subscription","appInsightKey","platformDocumentation","routes","component","MsalGuard","pathMatch","AppRoutingModule","RouterModule","useHash","relativeLinkResolution","AuthInterceptorService","injector","intercept","request","finalTenantId","serviceTenant","clone","setHeaders","handle","OverageService","readGraphGroups","objRef","handleNextPageWithMethodRef","syncGroupswithRef","DialogData","AboutComponent","onNoClick","light","properties","dark","ThemeService","isDarkTheme","active","setDarkTheme","setActiveTheme","setLightTheme","theme","keys","property","documentElement","style","setProperty","NavBarComponent","mlServie","themeService","countryList","Id","Name","Code","getReleaseDetails","countryCode","$","toggleClass","removeClass","addClass","item","refineryList","refinerytMap","checkActivatedTenant","tenantPopulated","selectedTenantIndex","ten","populateTenant","isCallFromUI","u","onTenantChange","logout","openAboutRelease","releaseDetails","selectFlag","toggleTheme","$localize","AppComponent","msalGuardConfig","msalBroadcastService","grphService","overageService","getScreenSize","screenWidth","innerWidth","isMobileResolution","detectCurrentComponent","currentComponent","msalSubject$","msg","eventType","EventType","_destroying$","checkoutAccount","login","authRequest","loginPopup","instance","setActiveAccount","account","getActiveAccount","getAllAccounts","accounts","userAccount","userName","idParts","userShortName","charAt","userEmail","username","initAppInsight","assignRole","appInsights","ApplicationInsights","instrumentationKey","enableAutoRouteTracking","loadAppInsights","setUserId","logPageView","measurements","trackPageView","uri","setAuthenticatedUserContext","toggleCollapse","sidenavWidth","disableTooltip","showCross","isMenuOpen","isActive","MSAL_GUARD_CONFIG","XsrfInterceptor","xsrfTokenExtractor","req","xsrfToken","authorizedRequest","withCredentials","set","enValue","isIE","navigator","userAgent","MSALInstanceFactory","PublicClientApplication","auth","cache","storeAuthStateInCookie","MSALInterceptorConfigFactory","protectedResourceMap","Map","interactionType","InteractionType","AppModule","bootstrap","provide","APP_INITIALIZER","useValue","Promise","resolve","setTimeout","multi","HTTP_INTERCEPTORS","useClass","MsalInterceptor","MSAL_INSTANCE","useFactory","MSAL_INTERCEPTOR_CONFIG","MsalService","MsalBroadcastService","APP_BASE_HREF","imports","BrowserModule","HttpClientModule","FormsModule","ReactiveFormsModule","MatStepperModule","MatToolbarModule","MatIconModule","MatTabsModule","MatSidenavModule","MatMenuModule","MatFormFieldModule","MatSelectModule","MatListModule","MatTooltipModule","MatTableModule","MatDialogModule","MatInputModule","MatSortModule","MatPaginatorModule","MatRadioModule","MatAutocompleteModule","MatChipsModule","BrowserAnimationsModule","NgbModule","MatTableExporterModule","NgMultiSelectDropDownModule","TypeaheadModule","MatDatepickerModule","MatNativeDateModule","MatRippleModule","OwlDateTimeModule","OwlNativeDateTimeModule","MatCheckboxModule","DragDropModule","providers","getBaseUrl","deps","enableProdMode","__NgCli_bootstrap_1","bootstrapModule","catch"],"sourceRoot":"webpack:///","sources":["./src/app/bpmn-js/bpmn-js.ts","./src/app/services/global.service.ts","./src/app/common/alert/alert.component.html","./src/app/common/alert/alert.component.ts","./src/app/flowsheet/rename-model/rename-model.component.html","./src/app/flowsheet/rename-model/rename-model.component.ts","./src/app/models/flowsheet/flowsheet.model.ts","./src/app/models/globals.model.ts","./src/app/services/flowsheet-service.ts","./src/app/flowsheet/save-flowsheet/save-flowsheet.component.html","./src/app/flowsheet/save-flowsheet/save-flowsheet.component.ts","./src/app/props-provider/CustomPaletteProvider.ts","./src/app/models/flowsheet/Model.model.ts","./src/app/models/flowsheet/parameter.model.ts","./src/app/models/mlmodel/mlModel-parameters.model.ts","./src/app/models/flowsheet/inputParameters.model.ts","./src/app/models/flowsheet/outputParameters.model.ts","./src/app/flowsheet/flowsheet-events/flowsheet.events.handler.ts","./src/app/services/http.service.ts","./src/app/services/graph.service.ts","./src/app/services/tenant.service.ts","./src/app/app.constants.ts","./src/app/services/ml-service.ts","./src/app/flowsheet-builder/connector-specification/connector-specification.component.html","./src/app/flowsheet-builder/connector-specification/connector-specification.component.ts","./src/app/models/mlmodel/mlModel.model.ts","./src/app/flowsheet-builder/data-source-manager/data-source-manager.component.html","./src/app/flowsheet-builder/data-source-manager/data-source-manager.component.ts","./src/app/flowsheet-builder/custom-js/CustomRenderer.js","./src/app/flowsheet-builder/custom-js/index.js","./src/app/flowsheet-builder/index.js","./src/app/common/confirm-model/confirm-model.component.html","./src/app/common/confirm-model/confirm-model.component.ts","./src/app/models/flowsheet/model-run-details.model.ts","./src/app/flowsheet/flowsheet-run-details/flowsheet-run-details.component.html","./src/app/flowsheet/flowsheet-run-details/flowsheet-run-details.component.ts","./src/app/flowsheet-builder/flowsheet-builder.component.html","./src/app/flowsheet-builder/flowsheet-builder.component.ts","./src/app/models/filter/filter-request.model.ts","./src/app/common/common-constants.ts","./src/app/models/filter/filter-response.model.ts","./src/app/common/add-filter/add-filter.component.html","./src/app/common/add-filter/add-filter.component.ts","./src/app/flowsheet/flowsheet.component.html","./src/app/flowsheet/flowsheet.component.ts","./src/app/overage/overage.component.ts","./src/app/services/group-guard.service.ts","./src/environments/environment.ts","./src/app/app-routing.module.ts","./src/app/services/auth.interceptor.ts","./src/app/services/overage.service.ts","./src/app/about/about.component.ts","./src/app/about/about.component.html","./src/app/theme/theme.module.ts","./src/app/services/theme.service.ts","./src/app/nav-bar/nav-bar.component.html","./src/app/nav-bar/nav-bar.component.ts","./src/app/app.component.html","./src/app/app.component.ts","./src/app/services/xsrf.interceptor.ts","./src/app/app.module.ts","./src/main.ts"],"sourcesContent":["import _PaletteProvider from 'bpmn-js/lib/features/palette/PaletteProvider';\r\n\r\nexport const InjectionNames = {\r\n eventBus: 'eventBus',\r\n bpmnFactory: 'bpmnFactory',\r\n elementRegistry: 'elementRegistry',\r\n translate: 'translate',\r\n propertiesProvider: 'propertiesProvider',\r\n bpmnPropertiesProvider: 'bpmnPropertiesProvider',\r\n paletteProvider: 'paletteProvider',\r\n originalPaletteProvider: 'originalPaletteProvider',\r\n};\r\n\r\nexport const OriginalPaletteProvider = _PaletteProvider;\r\n\r\nexport interface IPaletteProvider {\r\n getPaletteEntries(): any;\r\n}\r\n\r\nexport interface IPalette {\r\n registerProvider(provider: IPaletteProvider): any;\r\n}\r\n","import { HttpClient } from '@angular/common/http';\r\nimport { EventEmitter, Injectable, Output } from '@angular/core';\r\nimport { MatDialog } from '@angular/material/dialog';\r\nimport { HttpService } from './../services/http.service';\r\nimport { FilterResponseModel } from '../models/filter/filter-response.model';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\n\r\nexport class GlobalService {\r\n\r\n @Output() renderRibbon: EventEmitter = new EventEmitter();\r\n authCode: any;\r\n loggedInUser;\r\n subscription: string;\r\n environment: string;\r\n tagMovMsg;\r\n constructor(public httpClient: HttpClient, public dialog: MatDialog) { }\r\n isAuthorize: boolean = false;\r\n isActivate: boolean = true;\r\n userDetails: any;\r\n \r\n showAlert(model, data) {\r\n this.dialog.open(model, {\r\n width: '450px',\r\n panelClass: 'confirm-modalbox-dark',\r\n height: 'auto',\r\n data: data\r\n });\r\n }\r\n\r\n showAlertWithCallBack(model, data, methodRef: (thisRef: any) => void, thisRef) {\r\n const dialogRef = this.dialog.open(model, {\r\n width: '450px',\r\n panelClass: 'confirm-modalbox-dark',\r\n height: 'auto',\r\n data: data\r\n });\r\n dialogRef.afterClosed().subscribe(result => {\r\n if(result && result != null){\r\n methodRef(thisRef);\r\n }\r\n });\r\n }\r\n\r\n openModelWindow(methodRef: (thisRef: any, result?: any) => void, thisRef, modelComponent, widthOfWindow, panelClassName, dataToPass) {\r\n {\r\n const dialogRef = this.dialog.open(modelComponent, {\r\n width: widthOfWindow,\r\n panelClass: panelClassName,\r\n data: dataToPass\r\n });\r\n dialogRef.afterClosed().subscribe(result => {\r\n if (result === true && methodRef != null) {\r\n methodRef(thisRef);\r\n }\r\n else if (result !== false) {\r\n methodRef(thisRef, result);\r\n }\r\n });\r\n }\r\n }\r\n /**\r\n * Checks if the given string parameter is not undefined, null or empty.\r\n * @param data string to be checked\r\n */\r\n isNotNull(data: string) {\r\n let response: boolean = false;\r\n if (data != undefined && data != null && data != \"\") {\r\n response = true;\r\n }\r\n return response;\r\n }\r\n\r\n /**\r\n * Replaces display text for filter\r\n * @param tempText\r\n */\r\n replaceDisplayText(tempText: string) {\r\n if (tempText == \"flowSheetName\") {\r\n return \"Flowsheet Name\";\r\n } else if (tempText == \"flowSheetDescription\") {\r\n return \"Description\";\r\n } else if (tempText == \"lastUpdatedTimeStamp\") {\r\n return \"Last Modified At\";\r\n } else if (tempText == \"lastUpdatedBy\") {\r\n return \"Last Modified By\";\r\n } \r\n }\r\n\r\n /**\r\n * Replace filter texts\r\n * @param tempText\r\n */\r\n replaceFilterText(tempText: string): string {\r\n if (tempText == \"Flowsheet Name\") {\r\n return \"flowSheetName\";\r\n } else if (tempText == \"Description\") {\r\n return \"flowSheetDescription\";\r\n } else if (tempText == \"Last Modified By\") {\r\n return \"lastUpdatedBy\";\r\n } else if (tempText == \"Last Modified At\") {\r\n return \"lastUpdatedTimeStamp\";\r\n } else {\r\n return \"\";\r\n }\r\n }\r\n\r\n /**\r\n * Filters data\r\n * @param filterResponse\r\n */\r\n conditionalDataFiltering(filterResponse: FilterResponseModel, data) {\r\n let temp;\r\n if (filterResponse.selectedValue.length == 1) {\r\n temp = data.filter(function (df) {\r\n return (df[filterResponse.selectedFieldName] === filterResponse.selectedValue[0]);\r\n });\r\n } else if (filterResponse.selectedValue.length == 2) {\r\n temp = data.filter(function (df) {\r\n return (df[filterResponse.selectedFieldName] === filterResponse.selectedValue[0]) || (df[filterResponse.selectedFieldName] === filterResponse.selectedValue[1]);\r\n });\r\n } else if (filterResponse.selectedValue.length == 3) {\r\n temp = data.filter(function (df) {\r\n return (df[filterResponse.selectedFieldName] === filterResponse.selectedValue[0]) || (df[filterResponse.selectedFieldName] === filterResponse.selectedValue[1])\r\n || (df[filterResponse.selectedFieldName] === filterResponse.selectedValue[2]);\r\n });\r\n } else if (filterResponse.selectedValue.length == 4) {\r\n temp = data.filter(function (df) {\r\n return (df[filterResponse.selectedFieldName] === filterResponse.selectedValue[0]) || (df[filterResponse.selectedFieldName] === filterResponse.selectedValue[1])\r\n || (df[filterResponse.selectedFieldName] === filterResponse.selectedValue[2]) || (df[filterResponse.selectedFieldName] === filterResponse.selectedValue[3]);\r\n });\r\n } else if (filterResponse.selectedValue.length == 5) {\r\n temp = data.filter(function (df) {\r\n return (df[filterResponse.selectedFieldName] === filterResponse.selectedValue[0]) || (df[filterResponse.selectedFieldName] === filterResponse.selectedValue[1])\r\n || (df[filterResponse.selectedFieldName] === filterResponse.selectedValue[2]) || (df[filterResponse.selectedFieldName] === filterResponse.selectedValue[3])\r\n || (df[filterResponse.selectedFieldName] === filterResponse.selectedValue[4]);\r\n });\r\n }\r\n return temp;\r\n }\r\n}\r\n","
\r\n
\r\n \r\n
\r\n
\r\n {{data.title}}\r\n
\r\n
\r\n
\r\n
\"Success\"
\r\n
\r\n
\r\n
\"Failure\"
\r\n
\r\n
{{data.message}}
\r\n
\r\n
\r\n\r\n","import { Component, Inject } from '@angular/core';\r\nimport { MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog';\r\nimport { HttpClient } from '@angular/common/http';\r\nimport { GlobalService } from '../../services/global.service';\r\n\r\n@Component({\r\n selector: 'app-alert',\r\n templateUrl: './alert.component.html',\r\n styleUrls: ['./alert.component.css']\r\n})\r\nexport class AlertComponent {\r\n\r\n constructor(\r\n public dialogRef: MatDialogRef,\r\n @Inject(MAT_DIALOG_DATA) public data: any,\r\n private httpClient: HttpClient,\r\n private globals: GlobalService\r\n ) {\r\n data.title = data.success ? \"Success\" : \"Failure\";\r\n };\r\n\r\n onCancelClick(): void {\r\n this.dialogRef.close();\r\n }\r\n}\r\n","
\r\n
\r\n \r\n
\r\n
\r\n Rename Model\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n \r\n *\r\n
\r\n
\r\n \r\n
\r\n A name is required for Model.\r\n
\r\n
\r\n This name already exists, please enter a different name.\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n \r\n
\r\n
\r\n
\r\n
\r\n
\r\n\r\n","import { Component, OnInit, Inject } from '@angular/core';\r\nimport { MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog';\r\n\r\n@Component({\r\n selector: 'app-rename-model',\r\n templateUrl: './rename-model.component.html',\r\n styleUrls: ['./rename-model.component.css']\r\n})\r\nexport class RenameModelComponent implements OnInit {\r\n\r\n modelName = \"\";\r\n modeler;\r\n nameExist = true;\r\n constructor(public dialogRef: MatDialogRef,\r\n @Inject(MAT_DIALOG_DATA) public data: any) {\r\n dialogRef.disableClose = true;\r\n };\r\n\r\n ngOnInit(): void {\r\n this.modelName = this.data.name;\r\n this.modeler = this.data.entireModeler;\r\n }\r\n\r\n validateKey(event) {\r\n let latest = event.target.value;\r\n let nameExisiting;\r\n nameExisiting = this.data.modeler.diagrams[0].plane.planeElement.filter((m) => { return m.bpmnElement.$attrs.modelUniqueId == latest });\r\n this.nameExist = nameExisiting.length > 0;\r\n }\r\n\r\n saveFlowSheet() {\r\n this.dialogRef.close(this.modelName);\r\n }\r\n\r\n onCancelClick(): void {\r\n this.dialogRef.close(false);\r\n }\r\n\r\n}\r\n","import { Model } from \"./Model.model\";\r\n\r\nexport class FlowSheet {\r\n bpmnXml: string;\r\n flowSheetId: number;\r\n name: string;\r\n description: string;\r\n refineryName: string;\r\n createdBy: string;\r\n lastUpdatedTimeStamp: Date;\r\n lastUpdatedBy: string;\r\n tenantId: number;\r\n\r\n initialModelUniqueIds: string[];\r\n models: Model[];\r\n\r\n constructor() {\r\n this.bpmnXml = '';\r\n this.flowSheetId = 0;\r\n this.name = '';\r\n this.description = '';\r\n this.refineryName = '';\r\n this.createdBy = '';\r\n this.lastUpdatedTimeStamp = new Date();\r\n this.lastUpdatedBy = '';\r\n\r\n this.initialModelUniqueIds = [];\r\n this.models = [];\r\n }\r\n}\r\n\r\nexport enum DataSrc {\r\n model = 0,\r\n user = 1,\r\n extDataSrc = 2\r\n}\r\n","import { Injectable } from '@angular/core';\r\n \r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\n\r\nexport class Globals {\r\n config: any = {\r\n flowsheetApi_client_resourceUri: \"\",\r\n flowsheetApi_client_resourceScope: \"\",\r\n notificationApi_client_resourceUri: \"\",\r\n notificationApi_client_resourceScope: \"\",\r\n graphApi_client_resourceUri: \"\",\r\n graphApi_client_resourceScope: \"\",\r\n modelManagementApi_client_resourceUri: \"\",\r\n modelManagementApi_client_resourceScope: \"\",\r\n platformAdminApi_client_resourceUri: \"\",\r\n platformAdminApi_client_resourceScope: \"\",\r\n platformHubUrl: \"\",\r\n platformHomeUrl: \"\"\r\n };\r\n\r\n userName: string = '';\r\n name: string = '';\r\n userShortName: string;\r\n userEmail: string;\r\n rbacName: string;\r\n groups: any = [];\r\n\r\n subscription: string = '';\r\n releaseDetails: any;\r\n}\r\n","import { Injectable} from '@angular/core';\r\nimport { HttpClient } from '@angular/common/http';\r\nimport { Globals } from '../models/globals.model';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class FlowSheetService {\r\n\r\n apiUri: string;\r\n graphUri: string;\r\n\r\n getFlowSheetsListApi = \"api/FlowsheetBuilder/GetFlowSheets\";\r\n deleteFlowSheetApi = \"api/FlowsheetBuilder/DeleteFlowsheet/\";\r\n saveFlowSheetApi = \"api/FlowsheetBuilder/SaveFlowsheet\";\r\n getFlowSheetDataById = \"api/FlowsheetBuilder/LoadFlowsheet\";\r\n getDataSourcesApi = \"api/FlowsheetBuilder/GetDataSources\";\r\n getDataSourceParametersApi = \"api/FlowsheetBuilder/GetDataSourceParameters\";\r\n getLatestRunDetailsApi = \"api/FlowsheetBuilder/GetLatestRunDetails\";\r\n getFlowSheetRunsListApi = \"api/FlowsheetBuilder/GetFlowsheetRunsList\";\r\n runFlowSheetApi = \"api/FlowsheetBuilder/Run\";\r\n terminiateFlowSheetApi = \"api/FlowsheetBuilder/TerminateFlowsheet\"\r\n getFlowSheetRunDetailsApi = \"api/FlowsheetBuilder/GetFlowsheetRunDetails\";\r\n tokenApi = \"api/FlowsheetBuilder/getToken\";\r\n getBpmnApi = \"assets/bpmn/initial.bpmn\";\r\n constructor(private globals: Globals, private http: HttpClient) {\r\n this.apiUri = this.globals.config.flowsheetApi_client_resourceUri;\r\n this.graphUri = this.globals.config.graphApi_client_resourceUri;\r\n }\r\n getToken() {\r\n return this.http.get(this.apiUri + this.tokenApi);\r\n }\r\n\r\n getFlowSheetsList() {\r\n return this.http.get(this.apiUri + this.getFlowSheetsListApi);\r\n }\r\n\r\n getFlowData(id) {\r\n let params = { id: id };\r\n return this.http.get(this.apiUri + this.getFlowSheetDataById, {\r\n params: params\r\n });\r\n }\r\n\r\n deleteFlowSheet(flowSheetId) {\r\n let params = { flowsheetId: flowSheetId };\r\n return this.http.delete(this.apiUri + this.deleteFlowSheetApi, {\r\n params: params\r\n });\r\n }\r\n\r\n loadBpmn() {\r\n return this.http.get(this.apiUri + this.getBpmnApi, {\r\n headers: { observe: 'response' }, responseType: 'text'\r\n })\r\n }\r\n\r\n saveFlowSheet(flowSheetData) {\r\n return this.http.post(this.apiUri + this.saveFlowSheetApi, flowSheetData);\r\n }\r\n\r\n getDataSources() {\r\n return this.http.get(this.apiUri + this.getDataSourcesApi);\r\n }\r\n\r\n getDataSourceParameters(dataSourceId) {\r\n let params = { dataSourceId: dataSourceId };\r\n return this.http.get(this.apiUri + this.getDataSourceParametersApi, {\r\n params: params\r\n });\r\n }\r\n\r\n getFlowsheetRunsList(flowSheetId) {\r\n let params = { flowSheetId: flowSheetId };\r\n return this.http.get(this.apiUri + this.getFlowSheetRunsListApi, {\r\n params: params\r\n });\r\n }\r\n\r\n getFlowSheetRunDetails(flowSheetRunId) { \r\n let params = { flowSheetRunId: flowSheetRunId };\r\n return this.http.get(this.apiUri + this.getFlowSheetRunDetailsApi, {\r\n params: params\r\n });\r\n }\r\n\r\n getLatestRunDetails(flowSheetId) {\r\n let params = { flowSheetId: flowSheetId };\r\n return this.http.get(this.apiUri + this.getLatestRunDetailsApi, {\r\n params: params\r\n });\r\n }\r\n\r\n initiateNewRun(runReqData) {\r\n return this.http.post(this.apiUri + this.runFlowSheetApi, runReqData);\r\n }\r\n\r\n terminateFlowsheetRun(runReqData) {\r\n return this.http.post(this.apiUri + this.terminiateFlowSheetApi, runReqData);\r\n }\r\n}\r\n","
\r\n
\r\n
\r\n
\r\n
\r\n \r\n
\r\n
\r\n Save Flowsheet\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n \r\n *\r\n
\r\n
\r\n \r\n
\r\n A name is required for flowsheet.\r\n
\r\n
\r\n This name already exists, please enter a different name.\r\n
\r\n
\r\n
\r\n
\r\n
\r\n \r\n
\r\n
\r\n \r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n \r\n
\r\n
\r\n
\r\n
\r\n
\r\n\r\n","import { Component, Inject } from '@angular/core';\r\nimport { MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog';\r\nimport { FlowSheet } from '../../models/flowsheet/flowsheet.model';\r\nimport { FlowSheetService } from '../../services/flowsheet-service';\r\nimport { GlobalService } from '../../services/global.service';\r\nimport { AlertComponent } from '../../common/alert/alert.component';\r\n\r\n@Component({\r\n selector: 'app-save-flowsheet',\r\n templateUrl: './save-flowsheet.component.html',\r\n styleUrls: ['./save-flowsheet.component.css']\r\n})\r\nexport class SaveFlowSheetComponent {\r\n flowSheet = new FlowSheet();\r\n flowsheetList = [];\r\n isLoading = true;\r\n nameExist = true;\r\n constructor(public dialogRef: MatDialogRef,\r\n public flowSheetService: FlowSheetService,\r\n public globals: GlobalService,\r\n @Inject(MAT_DIALOG_DATA) public data: any) {\r\n dialogRef.disableClose = true;\r\n };\r\n\r\n ngOnInit() {\r\n this.getFlowsheetsList();\r\n }\r\n\r\n saveFlowSheet() {\r\n this.dialogRef.close(this.flowSheet);\r\n }\r\n\r\n getFlowsheetsList() {\r\n this.flowSheetService.getFlowSheetsList().subscribe((data: any): void => {\r\n this.flowsheetList = data;\r\n this.isLoading = false;\r\n }, (error: Error) => {\r\n this.globals.showAlert(AlertComponent, { success: false, message: \"Something went wrong!\" });\r\n this.isLoading = false;\r\n });\r\n }\r\n\r\n validateUniqueName(event) {\r\n this.nameExist = false;\r\n let flowsheetName = event.target.value;\r\n let nameExisiting;\r\n nameExisiting = this.flowsheetList.filter((m) => { return m.flowSheetName == flowsheetName });\r\n this.nameExist = nameExisiting.length > 0;\r\n }\r\n\r\n onCancelClick(): void {\r\n this.dialogRef.close(false);\r\n }\r\n}\r\n","import { IPalette, IPaletteProvider } from \"../bpmn-js/bpmn-js\";\r\n\r\nexport class CustomPaletteProvider implements IPaletteProvider {\r\n\r\n static $inject = ['palette', 'originalPaletteProvider', 'elementFactory', 'create'];\r\n private readonly elementFactory: any;\r\n private create: any;\r\n\r\n constructor(private palette: IPalette, private originalPaletteProvider: IPaletteProvider, elementFactory, create) {\r\n palette.registerProvider(this);\r\n this.elementFactory = elementFactory;\r\n this.create = create;\r\n }\r\n\r\n getPaletteEntries() {\r\n let value = JSON.parse(localStorage.getItem('palletData'));\r\n let actions = {};\r\n for (let count = 0; count < value.length; count++) {\r\n for (let modelCnt = 0; modelCnt < value[count].modelData.length; modelCnt++) {\r\n actions['create.' + value[count].modelData[modelCnt].modelName + '-task'] =\r\n {\r\n group: 'activity',\r\n className: ['icon-custom-' + value[count].modelData[modelCnt].modelName],\r\n title: value[count].modelData[modelCnt].modelName,\r\n action: {\r\n click: () => {\r\n this.createShape(value, count, modelCnt);\r\n },\r\n dragstart: () => {\r\n this.createShape(value, count, modelCnt);\r\n }\r\n }\r\n } \r\n }\r\n }\r\n return actions;\r\n }\r\n\r\n createShape(value, count: number, modelCnt: number) {\r\n let shape = this.elementFactory.createShape({\r\n type: 'bpmn:Task',\r\n modelName: value[count].modelData[modelCnt].modelName,\r\n modelId: value[count].modelData[modelCnt].modelId,\r\n modelType: 'custom',\r\n modelImg: value[count].modelData[modelCnt].modelImage,\r\n modelVersion: value[count].modelData[modelCnt].modelVersion,\r\n height: 300,\r\n width: 300\r\n });\r\n this.create.start(window.event, shape)\r\n }\r\n}\r\n","import { InputParameter } from \"./inputParameters.model\";\r\nimport { OutputParameter } from \"./outputParameters.model\";\r\n\r\nexport class Model {\r\n modelUniqueId: string;\r\n modelId: number;\r\n modelName: string;\r\n modelImage: string;\r\n\r\n inputParameters: InputParameter[];\r\n outputParameters: OutputParameter[];\r\n srcModels: string[];\r\n sinkModels: string[];\r\n modelVersion: string;\r\n\r\n constructor() {\r\n this.modelUniqueId = '00';\r\n this.modelId = 0;\r\n this.modelName = '';\r\n this.modelImage = null;\r\n this.inputParameters = [];\r\n this.outputParameters = [];\r\n this.srcModels = [];\r\n this.sinkModels = [];\r\n this.modelVersion = '';\r\n }\r\n}\r\n","import { DataSrc } from \"./flowsheet.model\";\r\nimport { Model } from \"./Model.model\";\r\n\r\n\r\nexport class ParameterModel {\r\n model: Model;\r\n parameterId;\r\n dataSource: DataSrc;\r\n dataSourceId;\r\n srcFrequency;\r\n srcParameterId;\r\n srcParameterName;\r\n srcParameterUoM;\r\n defaultValue\r\n\r\n constructor() {\r\n // constructor is empty\r\n }\r\n}","export class ModelParameter{\r\n parameterId: number;\r\n parameterName: string;\r\n parameterDefaultValue: unknown;\r\n parameterDataType: string;\r\n parameterUom: string;\r\n captionName: string;\r\n\r\n constructor() {\r\n this.parameterId = 0;\r\n this.parameterName = '';\r\n this.parameterDefaultValue = null;\r\n this.parameterDataType = '';\r\n this.parameterUom = '';\r\n this.captionName = '';\r\n }\r\n}\r\n","import { ModelParameter } from \"../mlmodel/mlModel-parameters.model\";\r\nimport { DataSrc } from \"./flowsheet.model\";\r\n\r\nexport class InputParameter {\r\n data: ModelParameter;\r\n mappedDataSource: DataSrc;\r\n mappedDataSourceId: string;\r\n mappedParameterId: number;\r\n mappedParameterName: string;\r\n mappedFrequency: number;\r\n mappedParameterUoM: string;\r\n\r\n constructor() {\r\n this.data = new ModelParameter();\r\n this.mappedDataSource = DataSrc.user;\r\n this.mappedDataSourceId = '1';\r\n this.mappedParameterId = 0;\r\n this.mappedParameterName = '';\r\n this.mappedFrequency = 0;\r\n this.mappedParameterUoM = '';\r\n }\r\n\r\n}\r\n","import { ModelParameter } from \"../mlmodel/mlModel-parameters.model\";\r\n\r\nexport class OutputParameter{\r\n data: ModelParameter;\r\n\r\n constructor() {\r\n this.data = new ModelParameter();\r\n }\r\n}\r\n","import { Injectable} from '@angular/core';\r\nimport { FlowSheet, DataSrc } from '../../models/flowsheet/flowsheet.model';\r\nimport { Model } from '../../models/flowsheet/Model.model';\r\nimport { InputParameter } from '../../models/flowsheet/inputParameters.model';\r\nimport { ModelParameter } from '../../models/mlmodel/mlModel-parameters.model';\r\nimport { OutputParameter } from '../../models/flowsheet/outputParameters.model';\r\nimport { FlowsheetBuilderComponent } from '../../flowsheet-builder/flowsheet-builder.component';\r\nimport { concatMap, takeUntil } from 'rxjs/operators';\r\nimport { Subject } from 'rxjs';\r\nimport { ParameterModel } from 'src/app/models/flowsheet/parameter.model';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\n\r\nexport class FlowSheetEventsHandler {\r\n public destroyed = new Subject();\r\n\r\n constructor() {\r\n // constructor is empty\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.destroyed.next();\r\n this.destroyed.complete();\r\n }\r\n\r\n calculateInitialModels(flowSheet: FlowSheet) {\r\n flowSheet.initialModelUniqueIds = [];\r\n flowSheet.models.filter(m => m.srcModels.length == 0).forEach((model) => {\r\n flowSheet.initialModelUniqueIds.push(model.modelUniqueId);\r\n });\r\n }\r\n\r\n addModel(flowsheetBuilder: FlowsheetBuilderComponent, modelUniqueId, modelId, modelName, modelVersion){\r\n let model = new Model();\r\n model.modelUniqueId = modelUniqueId;\r\n model.modelId = modelId;\r\n model.modelName = modelName;\r\n model.modelVersion = modelVersion;\r\n this.setUpModelParameters(model, flowsheetBuilder);\r\n\r\n flowsheetBuilder.flowSheet.models.push(model);\r\n }\r\n\r\n setUpModelParameters(model: Model, flowsheetBuilder: FlowsheetBuilderComponent) {\r\n flowsheetBuilder.mlService.getModelParameters(model.modelId)\r\n .pipe(\r\n takeUntil(this.destroyed),\r\n concatMap(async (data: any) => {\r\n this.addInputParameter(model, data.inputParameters);\r\n this.addOutputParameter(model, data.outputParameters);\r\n flowsheetBuilder.isLoading = false;\r\n })\r\n ).subscribe()\r\n }\r\n\r\n addInputParameter(model: Model, inputParameters: any) {\r\n inputParameters.forEach((param) => {\r\n let inputParam = new InputParameter();\r\n inputParam.data = this.parseParameterData(param);\r\n model.inputParameters.push(inputParam);\r\n });\r\n }\r\n\r\n addOutputParameter(model: Model, outputParameters: any) {\r\n outputParameters.forEach((param) => {\r\n let outputParam = new OutputParameter();\r\n outputParam.data = this.parseParameterData(param);\r\n model.outputParameters.push(outputParam);\r\n });\r\n }\r\n\r\n parseParameterData(param: any): ModelParameter {\r\n let parameter = new ModelParameter();\r\n parameter.parameterId = param.parameterId;\r\n parameter.parameterName = param.parameterName;\r\n parameter.parameterDataType = param.parameterDataType;\r\n parameter.parameterUom = param.parameterUom;\r\n parameter.captionName = param.captionName;\r\n\r\n return parameter;\r\n }\r\n\r\n removeModel(flowSheet: FlowSheet, modelUniqueId) {\r\n let index = flowSheet.models.findIndex(m => m.modelUniqueId == modelUniqueId);\r\n if (index > -1) {\r\n // remove model from flowsheet\r\n flowSheet.models.splice(index, 1);\r\n index = flowSheet.initialModelUniqueIds.findIndex(m => m == modelUniqueId);\r\n flowSheet.initialModelUniqueIds.splice(index, 1);\r\n }\r\n }\r\n\r\n removeSrcModelParameterMappings(model: Model, srcModelUniqueId: any) {\r\n let mappedInputParams = model.inputParameters.filter((param) => {\r\n return param.mappedDataSource == DataSrc.model && param.mappedDataSourceId == srcModelUniqueId;\r\n });\r\n mappedInputParams.forEach((param) => { this.resetParameterSrcMapData(param); });\r\n }\r\n\r\n updateParameterMapping(parameterModel : ParameterModel) {\r\n\r\n let param = parameterModel.model.inputParameters.find(p => p.data.parameterId == parameterModel.parameterId);\r\n\r\n param.mappedDataSource = parameterModel.dataSource;\r\n param.mappedDataSourceId = parameterModel.dataSourceId;\r\n param.mappedFrequency = parameterModel.srcFrequency;\r\n param.mappedParameterId = parameterModel.srcParameterId;\r\n param.mappedParameterName = parameterModel.srcParameterName;\r\n param.mappedParameterUoM = parameterModel.srcParameterUoM;\r\n param.data.parameterDefaultValue = parameterModel.defaultValue;\r\n }\r\n\r\n resetParameterSrcMapData(param: InputParameter) {\r\n param.mappedDataSource = DataSrc.user;\r\n param.mappedDataSourceId = '';\r\n param.mappedParameterId = 0;\r\n param.mappedParameterName = '';\r\n param.mappedFrequency = 0;\r\n param.mappedParameterUoM = '';\r\n }\r\n\r\n returnParameterToOriginalPosition(paramList, param) {\r\n let prevIndex = Math.max.apply(Math, paramList\r\n .filter(p => p.data.parameterId < param.data.parameterId)\r\n .map(function (p) { return p.data.parameterId; }));\r\n prevIndex = prevIndex < 0 ? 0 : prevIndex;\r\n paramList.splice(prevIndex, 0, param);\r\n }\r\n}\r\n\r\n","import { Injectable } from '@angular/core';\r\nimport { HttpClient, HttpHeaders, HttpParams, HttpErrorResponse } from '@angular/common/http';\r\nimport { Observable, throwError } from 'rxjs';\r\nimport { catchError } from 'rxjs/operators';\r\n\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class HttpService {\r\n\r\n private header = { headers: new HttpHeaders({ 'Content-Type': 'application/x-www-form-urlencoded' }) };\r\n\r\n constructor(private http: HttpClient) { }\r\n\r\n private multiPartFormReqHeader = {\r\n headers: new HttpHeaders({\r\n 'Content-Type': 'multipart/form-data',\r\n 'Access-Control-Allow-Headers': 'x-access-token,Content-Type',\r\n 'Access-Control-Allow-Methods': 'POST, GET'\r\n })\r\n };\r\n public postFormData(url: string, body: any): Observable {\r\n return this.http.post(url, body)\r\n .pipe(catchError(err => this.handleError(err)));\r\n }\r\n\r\n public delete(url: string, httpParams: HttpParams, header: HttpHeaders): Observable {\r\n const httpOptions = {\r\n headers: header,\r\n params: httpParams\r\n };\r\n return this.http.delete(url, httpOptions)\r\n .pipe(catchError(err => this.handleError(err)));\r\n }\r\n\r\n public post(url: string, body: any, header: HttpHeaders): Observable {\r\n const httpOptions = {\r\n headers: header\r\n };\r\n return this.http.post(url, body, httpOptions)\r\n .pipe(catchError(err => this.handleError(err)));\r\n }\r\n\r\n public get(url: string, header: HttpHeaders): Observable {\r\n const httpOptions = {\r\n headers: header\r\n };\r\n return this.http.get(url, httpOptions)\r\n .pipe(catchError(err => this.handleError(err)));\r\n }\r\n\r\n public handleError(error: HttpErrorResponse) {\r\n switch (error.status) {\r\n default:\r\n return throwError(error);\r\n }\r\n }\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { HttpClient } from '@angular/common/http';\r\nimport { User } from '../models/interfaces/user';\r\nimport { Globals } from '../models/globals.model';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class GraphService {\r\n\r\n user: User = {\r\n displayName: \"\",\r\n groupIDs: [],\r\n };\r\n graphUri: string;\r\n\r\n constructor(private http: HttpClient, private globals: Globals) {\r\n this.graphUri = this.globals.config.graphApi_client_resourceUri;\r\n }\r\n\r\n getGroups() {\r\n return this.http.get(this.graphUri);\r\n }\r\n\r\n getNextPage(nextPage) {\r\n return this.http.get(nextPage);\r\n }\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { Subject } from 'rxjs';\r\nimport { Globals } from '../models/globals.model';\r\nimport { Tenant } from '../models/tenant.model';\r\nimport { HttpService } from './http.service';\r\nimport { HttpClient } from '@angular/common/http';\r\nimport { GraphService } from './graph.service';\r\nimport { AppConstants } from '../app.constants';\r\nimport { Refinery } from '../models/refinery.model';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class TenantService {\r\n private refineryTenantMap: Refinery[];\r\n private tenantList$ = new Subject();\r\n private currentTenant: Tenant;\r\n private activatedTenantId: any;\r\n apiUri: string;\r\n graphUri: string;\r\n constructor(private http: HttpClient, private httpService: HttpService, private globals: Globals,\r\n private graphService: GraphService) {\r\n this.apiUri = this.globals.config.platformAdminApi_client_resourceUri;\r\n this.graphUri = this.globals.config.graphApi_client_resourceUri;\r\n }\r\n /**\r\n * calls api for getting list of tenants and exports data to other\r\n * components using subject\r\n */\r\n getTenantListFromServer(componentId: number) {\r\n this.httpService.get(this.apiUri + 'api/Tenant/GetRefineries?componentId=' + componentId, null).subscribe((data: Refinery[]) => {\r\n if (data && data.length > 0) {\r\n data.forEach(element => {\r\n if (element.tenantList !== null) {\r\n const filteredTenants: Tenant[] = this.filterTenants(element.tenantList);\r\n // case for a user who dont have access on any of the tenant of donges\r\n // so that he/she will be able to access data of Test Bed tenant\r\n if (filteredTenants.length === 0 && element.refineryName === 'Donges') {\r\n filteredTenants.push(element.tenantList.find(tenant1 => tenant1.tenantSecurityGrp === AppConstants.platformAdminT1GroupId));\r\n } else if (filteredTenants.length === 0 && element.refineryName !== 'Donges') {\r\n data.splice(data.indexOf(element), 1);\r\n }\r\n element.tenantList = filteredTenants;\r\n } else {\r\n data.splice(data.indexOf(element), 1);\r\n }\r\n });\r\n }\r\n this.refineryTenantMap = data;\r\n if(this.refineryTenantMap.length > 0){\r\n let activeTenantId = this.refineryTenantMap[0].tenantList[0].tenantId\r\n this.publishTenantRefineryMap(activeTenantId);\r\n }\r\n }, (err) => {\r\n console.log(err);\r\n });\r\n }\r\n\r\n /**\r\n * filters list of tenants available with security grps of user\r\n * @param data list of all tenants available\r\n */\r\n filterTenants(data: Tenant[]): Tenant[] {\r\n const groups: string[] = this.graphService.user.groupIDs;\r\n const finalTenantList: Tenant[] = [];\r\n for (const element of groups) {\r\n const tenant: Tenant = data.find(tenant1 => tenant1.tenantSecurityGrp === element);\r\n if (tenant) {\r\n finalTenantList.push(tenant);\r\n }\r\n }\r\n finalTenantList.sort((a:any, b:any) => (a.tenantName > b.tenantName ? 1 : -1));\r\n if(finalTenantList.length > 0){\r\n this.setActivatedTenantId(finalTenantList[0].tenantId);\r\n }\r\n\r\n return finalTenantList;\r\n }\r\n\r\n /**\r\n * @returns tenantlist as an observable\r\n */\r\n getTenants() {\r\n return this.tenantList$.asObservable();\r\n }\r\n\r\n /**\r\n * sets current tenant\r\n * @param tenant current tenant to be set\r\n */\r\n setCurrentTenant(tenant) {\r\n this.currentTenant = tenant;\r\n }\r\n\r\n /**\r\n * @returns current tenant\r\n */\r\n getCurrentTenant() {\r\n return this.currentTenant;\r\n }\r\n\r\n setActivatedTenantId(tenantId) {\r\n if(!tenantId){\r\n this.activatedTenantId = tenantId;\r\n }\r\n }\r\n\r\n /**\r\n * this method identifies selected tenant, enables isSelected property\r\n * and publishes refinery map\r\n * @param activatedTenantId tenant selected specifically before redirection\r\n */\r\n publishTenantRefineryMap(activatedTenantId) {\r\n if (this.refineryTenantMap && this.refineryTenantMap.length > 0) { \r\n let refineryWithTenant = this.refineryTenantMap.filter(v => v.tenantList !== null); \r\n refineryWithTenant.some(ref => {\r\n if(ref.tenantList !== null && ref.tenantList !== undefined && ref.tenantList.length > 0){\r\n const tenantIndex = ref.tenantList.findIndex(t =>\r\n t.tenantId.toString().toLowerCase() === activatedTenantId.toString().toLowerCase());\r\n if (tenantIndex >= 0) {\r\n this.setCurrentTenant(ref.tenantList[tenantIndex]);\r\n ref.tenantList[tenantIndex].isSelected = true;\r\n }\r\n }\r\n });\r\n this.tenantList$.next(refineryWithTenant);\r\n }\r\n }\r\n}\r\n","export const AppConstants = {\r\n componentId: 6,\r\n platformAdminT1GroupId: 'ba2233f5-d1c8-4d50-842e-a020b409f78f',\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { HttpClient} from '@angular/common/http';\r\nimport { HttpService } from './../services/http.service';\r\nimport { Globals } from '../models/globals.model';\r\nimport { Router } from '@angular/router';\r\nimport { TenantService } from '../services/tenant.service';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class MLService {\r\n\r\n apiUri: string;\r\n graphUri: string;\r\n\r\n getModelListApi = \"api/ListModel\";\r\n getModelParametersApi = \"api/GetModelParameter\";\r\n\r\n constructor(\r\n private httpService: HttpService, \r\n private globals: Globals, \r\n private http: HttpClient, \r\n public router: Router,\r\n public tenantService: TenantService) {\r\n this.apiUri = this.globals.config.modelManagementApi_client_resourceUri;\r\n this.graphUri = this.globals.config.graphApi_client_resourceUri;\r\n }\r\n\r\n getModelList() {\r\n return this.http.get(this.apiUri + this.getModelListApi);\r\n } \r\n\r\n getModelParameters(modelId) {\r\n return this.http.get(this.apiUri + this.getModelParametersApi + \"/\" + modelId);\r\n }\r\n\r\n redirectTo(url) {\r\n window.location.href = url;\r\n }\r\n\r\n redirectToNotifiction(eventId) {\r\n let url = this.router.createUrlTree(['/FSRunDetails', eventId]);\r\n window.open(url.toString(), '_blank');\r\n }\r\n\r\n}\r\n","
\r\n
\r\n \r\n
\r\n
\r\n Connector Specification\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n \r\n
\r\n
\r\n \r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
Output Variables
\r\n
\r\n
\r\n {{item.data.captionName}}\r\n
\r\n
\r\n
\r\n
\r\n No parameters available\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
Source Variables
\r\n
\r\n
\r\n {{item.data.captionName}}\r\n \r\n
\r\n
\r\n
\r\n
\r\n
Sink Variables
\r\n
\r\n
\r\n {{item.data.captionName}}\r\n \r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n \r\n
\r\n
\r\n \r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
Input Variables
\r\n
\r\n
\r\n {{item.data.captionName}}\r\n
\r\n
\r\n
\r\n
\r\n No parameters available\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n \r\n \r\n
\r\n
\r\n
\r\n
\r\n
\r\n\r\n","import { Component, OnInit, Inject } from '@angular/core';\r\nimport { MatDialogRef, MAT_DIALOG_DATA, MatDialog } from '@angular/material/dialog';\r\nimport { GlobalService } from '../../services/global.service';\r\nimport { MLService } from '../../services/ml-service';\r\nimport { moveItemInArray, transferArrayItem } from '@angular/cdk/drag-drop';\r\nimport { Model } from '../../models/flowsheet/Model.model';\r\nimport { InputParameter } from '../../models/flowsheet/inputParameters.model';\r\nimport { DataSrc } from '../../models/flowsheet/flowsheet.model';\r\nimport { OutputParameter } from '../../models/flowsheet/outputParameters.model';\r\nimport { FlowSheetEventsHandler } from '../../flowsheet/flowsheet-events/flowsheet.events.handler';\r\nimport { ParameterModel } from 'src/app/models/flowsheet/parameter.model';\r\n\r\n@Component({\r\n selector: 'app-connector-specification',\r\n templateUrl: './connector-specification.component.html',\r\n styleUrls: ['./connector-specification.component.css']\r\n})\r\nexport class ConnectorSpecificationComponent implements OnInit {\r\n\r\n srcModel = new Model();\r\n srcOutputParameters: OutputParameter[] = [];\r\n srcConnParameterList: OutputParameter[] = [];\r\n deletedSrcParam: OutputParameter;\r\n sinkModel = new Model();\r\n sinkInputParameters: InputParameter[] = [];\r\n sinkConnParameterList: InputParameter[] = [];\r\n deletedSinkParam: InputParameter;\r\n readOnly = false;\r\n parameterModel = new ParameterModel();\r\n\r\n constructor(public dialogRef: MatDialogRef,\r\n @Inject(MAT_DIALOG_DATA) public data: any,\r\n public globals: GlobalService,\r\n public flowSheetHandler: FlowSheetEventsHandler,\r\n public mlService: MLService,\r\n public dialog: MatDialog) {\r\n };\r\n\r\n ngOnInit() {\r\n\r\n this.srcModel = this.data.srcModel;\r\n this.sinkModel = this.data.sinkModel;\r\n this.readOnly = this.data.readOnly;\r\n this.setSrcParameters();\r\n this.setSinkParameters();\r\n }\r\n\r\n setSrcParameters() {\r\n this.srcOutputParameters = this.srcModel.outputParameters\r\n .filter(p => this.sinkModel.inputParameters\r\n .findIndex(ip => ip.mappedDataSource == DataSrc.model && ip.mappedDataSourceId == this.srcModel.modelUniqueId\r\n && ip.mappedParameterId == p.data.parameterId) == -1);\r\n\r\n this.sinkModel.inputParameters.filter(p => p.mappedDataSource == DataSrc.model\r\n && p.mappedDataSourceId == this.srcModel.modelUniqueId).forEach((sinkParam) => {\r\n this.srcConnParameterList.push(this.srcModel.outputParameters.find(p => p.data.parameterId == sinkParam.mappedParameterId));\r\n });\r\n }\r\n\r\n setSinkParameters() {\r\n this.sinkInputParameters = this.sinkModel.inputParameters.filter(p => p.mappedDataSource == DataSrc.user);\r\n this.sinkConnParameterList = this.sinkModel.inputParameters.filter(p => p.mappedDataSource == DataSrc.model\r\n && p.mappedDataSourceId == this.srcModel.modelUniqueId);\r\n }\r\n\r\n drop(event) {\r\n if (event.previousContainer === event.container) {\r\n moveItemInArray(event.container.data, event.previousIndex, event.currentIndex);\r\n } else {\r\n transferArrayItem(event.previousContainer.data,\r\n event.container.data,\r\n event.previousIndex,\r\n event.currentIndex\r\n );\r\n }\r\n }\r\n\r\n onCancelClick() {\r\n this.dialogRef.close(false);\r\n }\r\n\r\n deleteMapping(index) {\r\n this.deletedSinkParam = this.sinkConnParameterList.splice(index, 1)[0];\r\n this.flowSheetHandler.resetParameterSrcMapData(this.deletedSinkParam);\r\n this.flowSheetHandler.returnParameterToOriginalPosition(this.sinkInputParameters, this.deletedSinkParam);\r\n if (this.srcConnParameterList[index]) {\r\n this.deletedSrcParam = this.srcConnParameterList.splice(index, 1)[0];\r\n this.flowSheetHandler.returnParameterToOriginalPosition(this.srcOutputParameters, this.deletedSrcParam);\r\n }\r\n }\r\n\r\n saveConnectorSpecification() {\r\n this.sinkConnParameterList.forEach((connParam, index) => {\r\n let srcParam = this.srcConnParameterList[index];\r\n this.parameterModel.model = this.sinkModel;\r\n this.parameterModel.parameterId = connParam.data.parameterId\r\n this.parameterModel.dataSource = DataSrc.model;\r\n this.parameterModel.dataSourceId = this.srcModel.modelUniqueId;\r\n this.parameterModel.srcFrequency = 0;\r\n this.parameterModel.srcParameterId = srcParam.data.parameterId;\r\n this.parameterModel.srcParameterName = srcParam.data.parameterName;\r\n this.parameterModel.srcParameterUoM = srcParam.data.parameterUom;\r\n this.parameterModel.defaultValue = connParam.data.parameterDefaultValue;\r\n\r\n this.flowSheetHandler.updateParameterMapping(this.parameterModel);\r\n });\r\n this.dialogRef.close(false);\r\n }\r\n}\r\n","import { ModelParameter } from \"./mlModel-parameters.model\";\r\n\r\nexport class MlModel{\r\n modelId: number;\r\n modelName: string;\r\n modelApiVersion: number;\r\n businessDescription: string;\r\n modelType: string;\r\n businessFunctionType: number;\r\n providerInformation: string;\r\n lastUpdatedDate: Date;\r\n createdBy: string;\r\n lastUpdatedBy: string;\r\n refineryName: string;\r\n ModelContainerId: string;\r\n ModelContainerUrl: string;\r\n apiUrl: string;\r\n modelEntityType: string;\r\n inputParameters: ModelParameter[];\r\n outputParameters: ModelParameter[];\r\n\r\n constructor() {\r\n this.modelId = 0;\r\n this.modelName = '';\r\n this.modelApiVersion = 0;\r\n this.businessDescription = '';\r\n this.modelType = '';\r\n this.businessFunctionType = 0;\r\n this.providerInformation = '';\r\n this.lastUpdatedDate = new Date();\r\n this.createdBy = '';\r\n this.lastUpdatedBy = '';\r\n this.refineryName = '';\r\n this.ModelContainerId = '';\r\n this.ModelContainerUrl = '';\r\n this.apiUrl = '';\r\n this.modelEntityType = '';\r\n this.inputParameters = [];\r\n this.outputParameters = [];\r\n }\r\n}\r\n","
\r\n
\r\n
\r\n \r\n
\r\n
\r\n Model Specification: Data Source\r\n
\r\n
\r\n Model Specification: User Input\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n \r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
Variables
\r\n
\r\n
\r\n
\r\n {{item.data.captionName}}\r\n 25\">{{item.data.captionName.slice(0,25)}}...\r\n
\r\n
\r\n
\r\n No parameters available\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
Variables Name
\r\n
Data Source
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n {{item.data.captionName}}\r\n 25\">{{item.data.captionName.slice(0,25)}}...\r\n \r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n {{item.mappedParameterName}}\r\n \r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n \r\n
\r\n \r\n
\r\n
\r\n
\r\n \r\n
\r\n \r\n
\r\n
Min
\r\n
\r\n
\r\n \r\n
\r\n \r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n \r\n \r\n \r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n \r\n
\r\n \r\n
\r\n
{{form_elem.uom}}
\r\n
\r\n
\r\n \r\n
\r\n \r\n
\r\n
{{form_elem.uom}}
\r\n
\r\n
\r\n \r\n
\r\n \r\n
\r\n
{{form_elem.uom}}
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n \r\n
\r\n \r\n
\r\n
link
\r\n
\r\n
\r\n
\r\n
\r\n \r\n
\r\n \r\n
\r\n
link
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n \r\n \r\n \r\n
\r\n
\r\n
\r\n
\r\n
\r\n\r\n","import { Component, OnInit, Inject, ViewChild } from '@angular/core';\r\nimport { MatDialogRef, MAT_DIALOG_DATA, MatDialog } from '@angular/material/dialog';\r\nimport { MlModel } from '../../models/mlmodel/mlModel.model';\r\nimport { GlobalService } from '../../services/global.service';\r\nimport { MLService } from '../../services/ml-service';\r\nimport { moveItemInArray, transferArrayItem } from '@angular/cdk/drag-drop';\r\nimport { NgForm, UntypedFormGroup, UntypedFormControl } from '@angular/forms';\r\nimport { FlowSheetService } from '../../services/flowsheet-service';\r\nimport { Model } from '../../models/flowsheet/Model.model';\r\nimport { DataSrc } from '../../models/flowsheet/flowsheet.model';\r\nimport { InputParameter } from '../../models/flowsheet/inputParameters.model';\r\nimport { FlowSheetEventsHandler } from '../../flowsheet/flowsheet-events/flowsheet.events.handler';\r\nimport { concatMap, map, switchMap, takeUntil } from 'rxjs/operators';\r\nimport { Subject } from 'rxjs';\r\nimport { ParameterModel } from 'src/app/models/flowsheet/parameter.model';\r\n\r\n@Component({\r\n selector: 'app-data-source-manager',\r\n templateUrl: './data-source-manager.component.html',\r\n styleUrls: ['./data-source-manager.component.css']\r\n})\r\n\r\nexport class DataSourceManagerComponent implements OnInit {\r\n\r\n model: Model = new Model();\r\n inputParameters = [];\r\n srcConnParameterList = [];\r\n sinkConnParameterList = [];\r\n sinkModel = new MlModel();\r\n sinkConnVariablesList: InputParameter[] = [];\r\n sinkVariablesConnToSrcModel: InputParameter[] = [];\r\n srcConnVariablesList = [];\r\n dataToPass = [];\r\n userSinkVar = false;\r\n form_template = [];\r\n @ViewChild('f', { static: true }) registerForm: NgForm;\r\n modelError: string;\r\n myFormGroup: UntypedFormGroup;\r\n connSetUserData = [];\r\n deletedSinkParam: InputParameter;\r\n readOnly: false;\r\n isLoading = false;\r\n dataSource;\r\n dataSourceSelected;\r\n dataSourceName;\r\n parameterList: any[];\r\n selectedParameter;\r\n frequncy = 120;\r\n public destroyed = new Subject();\r\n parameterModel = new ParameterModel();\r\n\r\n constructor(public dialogRef: MatDialogRef,\r\n @Inject(MAT_DIALOG_DATA) public data: any,\r\n public globals: GlobalService,\r\n public mlService: MLService,\r\n public flowsheetService: FlowSheetService,\r\n public flowSheetHandler: FlowSheetEventsHandler,\r\n public dialog: MatDialog) {\r\n };\r\n\r\n ngOnInit() {\r\n this.getDataSources();\r\n this.isLoading = true;\r\n this.dialogRef.disableClose = true;\r\n\r\n this.model = this.data.model;\r\n this.readOnly = this.data.readOnly;\r\n this.inputParameters = this.model.inputParameters;\r\n this.setConnectedParameters();\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.destroyed.next();\r\n this.destroyed.complete();\r\n }\r\n\r\n setConnectedParameters() {\r\n this.sinkConnVariablesList = this.model.inputParameters.filter(p => p.mappedDataSource == DataSrc.extDataSrc);\r\n this.inputParameters = this.model.inputParameters.filter(p => p.mappedDataSource == DataSrc.user);\r\n this.sinkVariablesConnToSrcModel = this.model.inputParameters.filter(p => p.mappedDataSource == DataSrc.model);\r\n\r\n this.sinkConnVariablesList.forEach((param) => {\r\n let srcParameterData = {\r\n mappedDataSource: param.mappedDataSource,\r\n mappedDataSourceId: param.mappedDataSourceId,\r\n mappedFrequency: param.mappedFrequency,\r\n mappedParameterId: param.mappedParameterId,\r\n mappedParameterName: param.mappedParameterName,\r\n mappedParameterUoM: param.mappedParameterUoM\r\n };\r\n this.srcConnVariablesList.push(srcParameterData);\r\n });\r\n }\r\n\r\n getDataSources() {\r\n let dataSource\r\n this.flowsheetService.getDataSources()\r\n .pipe(\r\n takeUntil(this.destroyed),\r\n map((data: any) => {\r\n this.dataSource = data;\r\n this.dataSourceSelected = this.dataSource[0];\r\n this.getDataSourceParameters();\r\n })\r\n ).subscribe(\r\n (error) => {\r\n this.modelError = 'Failed to load Data sources.'; this.isLoading = false;\r\n }\r\n )\r\n }\r\n\r\n getDataSourceParameters() {\r\n this.isLoading = true;\r\n this.flowsheetService.getDataSourceParameters(this.dataSourceSelected.dataSourceId).subscribe((data: any): void => {\r\n this.parameterList = data;\r\n this.isLoading = false;\r\n }, (error: Error) => { this.modelError = 'Failed to load data source parameters.'; this.isLoading = false; });\r\n }\r\n\r\n drop(event) {\r\n if (event.previousContainer === event.container) {\r\n moveItemInArray(event.container.data, event.previousIndex, event.currentIndex);\r\n } else {\r\n transferArrayItem(event.previousContainer.data,\r\n event.container.data,\r\n event.previousIndex,\r\n event.currentIndex\r\n );\r\n }\r\n }\r\n\r\n onCancelClick() {\r\n this.dialogRef.close(false);\r\n }\r\n\r\n deleteMapping(index) {\r\n this.srcConnVariablesList.splice(index, 1);\r\n if (this.sinkConnVariablesList[index]) {\r\n this.deletedSinkParam = this.sinkConnVariablesList.splice(index, 1)[0];\r\n this.flowSheetHandler.resetParameterSrcMapData(this.deletedSinkParam);\r\n this.flowSheetHandler.returnParameterToOriginalPosition(this.inputParameters, this.deletedSinkParam);\r\n }\r\n }\r\n\r\n onSelectParameter(parameter) {\r\n let srcParameterData = {\r\n mappedDataSource: DataSrc.extDataSrc,\r\n mappedDataSourceId: this.dataSourceSelected.dataSourceId,\r\n mappedFrequency: this.frequncy,\r\n mappedParameterId: parameter.srcParameterId,\r\n mappedParameterName: parameter.srcParameter,\r\n mappedParameterUoM: ''\r\n };\r\n this.srcConnVariablesList.push(srcParameterData);\r\n this.selectedParameter = undefined;\r\n }\r\n\r\n saveMappingDetails() {\r\n if (this.inputParameters.length === 0) {\r\n this.saveDataSourceMapping();\r\n this.dialogRef.close(false);\r\n }\r\n else {\r\n this.userSinkVar = true;\r\n let formItem = [];\r\n let group = {};\r\n\r\n for (let i = 0; i < this.inputParameters.length; i++) {\r\n if (this.inputParameters[i].mappedDataSource === DataSrc.user) {\r\n let obj = {};\r\n obj['inputModel'] = this.inputParameters[i].data.parameterName + \"-\" + this.inputParameters[i].data.parameterId;\r\n obj['label'] = this.inputParameters[i].data.captionName;\r\n obj['uom'] = this.inputParameters[i].data.parameterUom;\r\n obj['value'] = this.inputParameters[i].data.parameterDefaultValue;\r\n if (obj['value'] == null || typeof (this.inputParameters[i].data.parameterDefaultValue) === 'string') {\r\n obj['type'] = 'textBox';\r\n } else if (obj['value'] == null || typeof (this.inputParameters[i].data.parameterDefaultValue) === 'number') {\r\n obj['type'] = 'number';\r\n } else {\r\n obj['type'] = 'checkbox';\r\n }\r\n formItem.push(obj);\r\n }\r\n }\r\n this.form_template = formItem;\r\n this.form_template.forEach(input_template => {\r\n group[input_template.inputModel] = new UntypedFormControl(input_template.value);\r\n })\r\n this.myFormGroup = new UntypedFormGroup(group);\r\n }\r\n }\r\n\r\n gotoPrev() {\r\n this.userSinkVar = false;\r\n }\r\n\r\n onSubmit() {\r\n for (let [key, value] of Object.entries(this.myFormGroup.value)) {\r\n let res = key.split('-');\r\n\r\n this.parameterModel.model = this.model;\r\n this.parameterModel.parameterId = res[1];\r\n this.parameterModel.dataSource = DataSrc.user;\r\n this.parameterModel.dataSourceId = 1;\r\n this.parameterModel.srcFrequency = 0;\r\n this.parameterModel.srcParameterId = 0;\r\n this.parameterModel.srcParameterName = '';\r\n this.parameterModel.srcParameterUoM = '';\r\n this.parameterModel.defaultValue = value;\r\n\r\n this.flowSheetHandler.updateParameterMapping(this.parameterModel);\r\n }\r\n this.saveDataSourceMapping();\r\n this.dialogRef.close(false);\r\n }\r\n\r\n saveDataSourceMapping() {\r\n this.sinkConnVariablesList.forEach((connParam, index) => {\r\n\r\n let srcParam = this.srcConnVariablesList[index];\r\n\r\n this.parameterModel.model = this.model;\r\n this.parameterModel.parameterId = connParam.data.parameterId\r\n this.parameterModel.dataSource = DataSrc.extDataSrc;\r\n this.parameterModel.dataSourceId = srcParam.mappedDataSourceId;\r\n this.parameterModel.srcFrequency = srcParam.mappedFrequency;\r\n this.parameterModel.srcParameterId = srcParam.mappedParameterId;\r\n this.parameterModel.srcParameterName = srcParam.mappedParameterName;\r\n this.parameterModel.srcParameterUoM = srcParam.mappedParameterUoM;\r\n this.parameterModel.defaultValue = connParam.data.parameterDefaultValue;\r\n\r\n this.flowSheetHandler.updateParameterMapping(this.parameterModel);\r\n });\r\n }\r\n\r\n}\r\n","import inherits from 'inherits';\r\n\r\nimport BaseRenderer from 'diagram-js/lib/draw/BaseRenderer';\r\n\r\nimport {\r\n componentsToPath,\r\n createLine\r\n} from 'diagram-js/lib/util/RenderUtil';\r\n\r\nimport {\r\n append as svgAppend,\r\n attr as svgAttr,\r\n create as svgCreate\r\n} from 'tiny-svg';\r\n\r\nvar COLOR_GREEN = '#346cad',\r\n COLOR_WHITE = \"#346cad\",\r\n COLOR_OFF_WHITE = \"#346cad\";\r\n\r\n/**\r\n * A renderer that knows how to render custom elements.\r\n */\r\nexport default function CustomRenderer(eventBus, styles) {\r\n\r\n BaseRenderer.call(this, eventBus, 2000);\r\n\r\n var computeStyle = styles.computeStyle;\r\n\r\n this.drawTriangle = function(p, side) {\r\n var halfSide = side / 2,\r\n points,\r\n attrs;\r\n\r\n points = [side, 0, side, side, 0, side ];\r\n\r\n attrs = computeStyle(attrs, {\r\n stroke: COLOR_WHITE,\r\n strokeWidth: 2,\r\n fill: COLOR_GREEN\r\n });\r\n\r\n var polygon = svgCreate('polygon');\r\n\r\n svgAttr(polygon, {\r\n points: points\r\n });\r\n\r\n svgAttr(polygon, attrs);\r\n\r\n //svgAppend(p, polygon);\r\n\r\n /* return polygon;*/\r\n\r\n /*var smgImg = svgCreate('image');\r\n svgAttr(smgImg, {\r\n src: \"play-sign_Green.svg\", \r\n alt: \"triangle with all three sides equal\",\r\n height: \"87\",\r\n width: \"100\"\r\n });*/\r\n\r\n var svgimg = document.createElementNS('http://www.w3.org/2000/svg', 'image');\r\n svgimg.setAttributeNS(null, 'height', '100');\r\n svgimg.setAttributeNS(null, 'width', '100');\r\n svgimg.setAttributeNS('http://www.w3.org/1999/xlink', 'href', 'play-sign_Green.svg');\r\n //svgAppend(p, svgimg);\r\n p.append(svgimg);\r\n return polygon;\r\n };\r\n\r\n this.getTrianglePath = function(element) {\r\n var x = element.x,\r\n y = element.y,\r\n width = element.width,\r\n height = element.height;\r\n\r\n var trianglePath = [\r\n ['M', x + width / 2, y],\r\n ['l', width / 2, height],\r\n ['l', -width, 0 ],\r\n ['z']\r\n ];\r\n\r\n return componentsToPath(trianglePath);\r\n };\r\n\r\n this.customModel = function (p, modelImg, modelHeight, modelWidth, modelName) {\r\n var circle = svgCreate('circle');\r\n var svgNS = \"http://www.w3.org/2000/svg\";\r\n var svgimg = document.createElementNS(svgNS, 'image');\r\n var modalImagePath = 'assets/bpmn/defaultModel.svg';\r\n if (modelImg && modelImg !== \"null\") {\r\n modalImagePath = \"data:image/svg+xml;base64,\" + modelImg;// 'assets/bpmn/defaultModel.svg';\r\n } else {\r\n modalImagePath = 'assets/bpmn/defaultModel.svg';\r\n }\r\n svgimg.setAttributeNS(null, 'height', modelHeight);\r\n svgimg.setAttributeNS(null, 'width', modelWidth);\r\n\r\n svgimg.setAttributeNS('http://www.w3.org/1999/xlink', 'href', modalImagePath);\r\n svgAppend(p, svgimg);\r\n \r\n var newText = document.createElementNS(svgNS, \"text\");\r\n newText.setAttributeNS(null, \"x\", modelWidth/2);\r\n newText.setAttributeNS(null, \"y\", modelHeight+12);\r\n newText.setAttributeNS(null, \"font-size\", \"13\");\r\n newText.setAttributeNS(null, \"fill\", \"#346cad\");\r\n newText.setAttributeNS(null, \"dominant-baseline\", \"middle\");\r\n newText.setAttributeNS(null, \"text-anchor\", \"middle\");\r\n var textNode = document.createTextNode(modelName);\r\n newText.appendChild(textNode);\r\n svgAppend(p, newText);\r\n return circle;\r\n };\r\n\r\n this.getModelPath = function (shape) {\r\n //shape.height = 100;\r\n var cx = shape.x + shape.width / 2,\r\n cy = shape.y + shape.height / 2,\r\n radius = shape.width / 2;\r\n\r\n var circlePath = [\r\n ['M', cx, cy],\r\n ['m', 0, -radius],\r\n ['a', radius, radius, 0, 1, 1, 0, 2 * radius],\r\n ['a', radius, radius, 0, 1, 1, 0, -2 * radius],\r\n ['z']\r\n ];\r\n\r\n return componentsToPath(circlePath);\r\n };\r\n\r\n var draw = function (type, opts) {\r\n var svg = document.createElementNS(\"http://www.w3.org/2000/svg\", type);\r\n for (var k in opts) {\r\n svg.setAttribute(k, opts[k]);\r\n }\r\n return svg;\r\n };\r\n\r\n this.drawCustomConnection = function (p, element) {\r\n var marker = draw(\"marker\", {\r\n \"id\": \"endpoint\",\r\n \"viewBox\": \"-50 0 50 50\",\r\n \"refX\": 0,\r\n \"refY\": 25,\r\n \"markerUnits\": \"strokeWidth\",\r\n \"markerWidth\": 5,\r\n \"markerHeight\": 5,\r\n \"orient\": \"auto\",\r\n \"fill\": COLOR_OFF_WHITE\r\n });\r\n var marker_path = draw(\"path\", {\r\n \"d\": \"M -50 0 L 0 25 L -50 50 z\"\r\n });\r\n\r\n svgAppend(p, marker);\r\n marker.appendChild(marker_path);\r\n\r\n var attrs = computeStyle(attrs, {\r\n stroke: COLOR_OFF_WHITE,\r\n strokeWidth: 2,\r\n strokeDasharray: 5,\r\n markerEnd: \"url(#endpoint)\"\r\n });\r\n\r\n return svgAppend(p, createLine(element.waypoints, attrs));\r\n };\r\n\r\n this.getCustomConnectionPath = function(connection) {\r\n var waypoints = connection.waypoints.map(function(p) {\r\n return p.original || p;\r\n });\r\n\r\n var connectionPath = [\r\n ['M', waypoints[0].x, waypoints[0].y]\r\n ];\r\n\r\n waypoints.forEach(function(waypoint, index) {\r\n if (index !== 0) {\r\n connectionPath.push(['L', waypoint.x, waypoint.y]);\r\n }\r\n });\r\n\r\n return componentsToPath(connectionPath);\r\n };\r\n}\r\n\r\ninherits(CustomRenderer, BaseRenderer);\r\n\r\nCustomRenderer.$inject = [ 'eventBus', 'styles' ];\r\n\r\n\r\nCustomRenderer.prototype.canRender = function(element) {\r\n return /^bpmn:/.test(element.type);\r\n};\r\n\r\nCustomRenderer.prototype.drawShape = function(p, element) {\r\n var type = element.type;\r\n var modelType = element.modelType;\r\n\r\n if (modelType === 'custom-fcc') {\r\n return this.drawTriangle(p, element.width);\r\n }\r\n\r\n if (modelType === 'custom') {\r\n element.businessObject.$attrs['modelType'] = 'custom';\r\n element.businessObject.$attrs['modelImg'] = element.modelImg;\r\n element.businessObject.$attrs['modelName'] = element.modelName;\r\n element.businessObject.$attrs['modelId'] = element.modelId;\r\n element.businessObject.$attrs['modelUniqueId'] = element.modelUniqueId;\r\n return this.customModel(p, element.modelImg, element.height, element.width, element.modelUniqueId);\r\n }\r\n\r\n if (element.businessObject.$attrs.modelType === 'custom') {\r\n return this.customModel(p, element.businessObject.$attrs.modelImg, element.height, element.width, element.businessObject.$attrs.modelUniqueId);\r\n }\r\n};\r\n\r\nCustomRenderer.prototype.getShapePath = function(shape) {\r\n var type = shape.type;\r\n var modelType = shape.modelType;\r\n\r\n if (modelType === 'custom-fcc') {\r\n return this.getTrianglePath(shape);\r\n }\r\n\r\n if (modelType === 'custom') {\r\n return this.getModelPath(shape);\r\n }\r\n};\r\n\r\nCustomRenderer.prototype.drawConnection = function(p, element) {\r\n\r\n var type = element.type;\r\n\r\n //if (type === 'custom:connection') {\r\n return this.drawCustomConnection(p, element);\r\n //}\r\n};\r\n\r\n\r\nCustomRenderer.prototype.getConnectionPath = function(connection) {\r\n\r\n var type = connection.type;\r\n\r\n if (type === 'custom:connection') {\r\n return this.getCustomConnectionPath(connection);\r\n }\r\n};","\r\nimport CustomRenderer from './CustomRenderer';\r\n\r\nexport default {\r\n __init__: [\r\n 'customRenderer',\r\n //'PaletteProvider'\r\n ],\r\n customRenderer: ['type', CustomRenderer],\r\n //PaletteProvider: ['type', PaletteProvider]\r\n};","import Modeler from 'bpmn-js/lib/Modeler';\r\nimport inherits from 'inherits';\r\nimport CustomModule from './custom-js';\r\n\r\n// Function to explort Custom modeler\r\nexport default function CustomModeler(options) {\r\n Modeler.call(this, options);\r\n}\r\n// Call inherits to sync CustomModeler with modeler\r\ninherits(CustomModeler, Modeler);\r\n// Set Prototype modules of CustomModeler\r\nCustomModeler.prototype._modules = [].concat(\r\n CustomModeler.prototype._modules,\r\n [\r\n CustomModule\r\n ]\r\n);\r\n","
\r\n
\r\n \r\n
\r\n
\r\n {{data.title}}?\r\n
\r\n
\r\n
\r\n
\"Delete\"
\r\n
\r\n {{data.message}}\r\n
This process cannot be undone.\r\n
\r\n
\r\n \r\n \r\n
\r\n
\r\n
\r\n
\r\n
\"Confirm\"
\r\n
\r\n {{data.message}}\r\n
Click \"OK\" to continue.\r\n
\r\n
\r\n \r\n \r\n
\r\n
\r\n
\r\n
\r\n
\r\n\r\n","import { Component, Inject } from '@angular/core';\r\nimport { MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog';\r\n\r\n@Component({\r\n selector: 'app-confirm-model',\r\n templateUrl: './confirm-model.component.html',\r\n styleUrls: ['./confirm-model.component.css']\r\n})\r\nexport class ConfirmModelComponent {\r\n constructor(public dialogRef: MatDialogRef,\r\n @Inject(MAT_DIALOG_DATA) public data: any) { }\r\n\r\n \r\n\r\n onCancelClick(): void {\r\n this.dialogRef.close(false);\r\n }\r\n\r\n intendedAction() {\r\n this.dialogRef.close(true);\r\n }\r\n\r\n}\r\n","export class FlowSheetRunDetail {\r\n flowSheetId: number;\r\n flowSheetRunId: number;\r\n flowSheetName: string;\r\n status: string;\r\n startTime: Date;\r\n endTime: Date;\r\n runCreatedBy: string;\r\n \r\n constructor() {\r\n this.flowSheetId = 0;\r\n this.flowSheetRunId = 0;\r\n this.flowSheetName = '';\r\n this.status = '';\r\n this.startTime = null;\r\n this.endTime = null;\r\n this.runCreatedBy = '';\r\n }\r\n }\r\n \r\n export class ModelRunDetail {\r\n modelUniqueId: string;\r\n modelName: string;\r\n status: string;\r\n startTime: Date;\r\n endTime: Date;\r\n \r\n constructor() {\r\n this.modelUniqueId = '';\r\n this.modelName = '';\r\n this.status = '';\r\n this.startTime = null;\r\n this.endTime = null;\r\n }\r\n }\r\n \r\n export class ModelRunParameterDetail {\r\n parameterName: string;\r\n parameterDisplayName: string;\r\n value: string;\r\n \r\n constructor() {\r\n this.parameterName = '';\r\n this.parameterDisplayName = '';\r\n this.value = '';\r\n }\r\n }","
\r\n
\r\n
\r\n \r\n
\r\n
\r\n Flowsheet Simulation Report\r\n
\r\n
\r\n
\r\n
\r\n
\r\n \r\n
\r\n
\r\n \r\n
\r\n
\r\n \r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n \r\n
\r\n
\r\n \r\n
\r\n
\r\n
\r\n
\r\n \r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n\r\n
\r\n
\r\n
\r\n Inputs\r\n
\r\n
\r\n \r\n \r\n Parameter\r\n {{element.parameterDisplayName}}\r\n \r\n \r\n \r\n Value\r\n {{element.value}} \r\n \r\n\r\n \r\n \r\n \r\n
\r\n
\r\n
\r\n
\r\n Outputs\r\n
\r\n
\r\n \r\n \r\n Parameter\r\n {{element.parameterDisplayName}}\r\n \r\n \r\n \r\n Value\r\n {{element.value}} \r\n \r\n\r\n \r\n \r\n \r\n
\r\n
\r\n
\r\n
\r\n ","import { Component, OnInit, Inject } from '@angular/core';\r\nimport { HttpClient } from '@angular/common/http';\r\nimport { GlobalService } from '../../services/global.service';\r\nimport { MatTableDataSource } from '@angular/material/table';\r\nimport { MatDialog, MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog';\r\nimport { FlowSheetService } from '../../services/flowsheet-service';\r\nimport { AlertComponent } from '../../common/alert/alert.component';\r\nimport { ModelRunDetail, ModelRunParameterDetail, FlowSheetRunDetail } from '../../models/flowsheet/model-run-details.model';\r\nimport { ActivatedRoute, Params } from '@angular/router';\r\nimport { TenantService } from 'src/app/services/tenant.service';\r\nimport { Refinery } from 'src/app/models/refinery.model';\r\nimport { Tenant } from 'src/app/models/tenant.model';\r\n\r\n@Component({\r\n selector: 'app-flowsheet-run-details',\r\n templateUrl: './flowsheet-run-details.component.html',\r\n styleUrls: ['./flowsheet-run-details.component.css']\r\n})\r\nexport class FlowSheetRunDetailsComponent implements OnInit {\r\n isLoading = true;\r\n flowSheetId: any;\r\n modelErrorMessage = 'Error';\r\n isLinear = false;\r\n flowSheetRunData = new FlowSheetRunDetail();\r\n modelDataList = [];\r\n modelRunDetails: any;\r\n selModel = new ModelRunDetail();\r\n inputsList = [];\r\n outputsList = [];\r\n stringLimit = 30;\r\n\r\n paramDisplayedColumns = [\"parameterName\", \"value\"]\r\n isShowParam = false;\r\n selModelUniqueId = '';\r\n inputDataSource: any;\r\n outputDataSource: any;\r\n\r\n currentTenant: Tenant;\r\n\r\n constructor(\r\n public globals: GlobalService,\r\n private httpClientObj: HttpClient,\r\n public flowSheetService: FlowSheetService,\r\n public dialog: MatDialog,\r\n public route: ActivatedRoute,\r\n public tenantService: TenantService,\r\n public dialogRef: MatDialogRef,\r\n @Inject(MAT_DIALOG_DATA) public data: any) {\r\n }\r\n\r\n ngOnInit() {\r\n this.getFlowSheetRunDetails();\r\n }\r\n\r\n getFlowSheetRunDetails() {\r\n this.flowSheetId = this.data.flowSheetId;\r\n this.tenantService.setActivatedTenantId(this.data.tenantId);\r\n this.getLatestRunDetails();\r\n }\r\n\r\n getLatestRunDetails() {\r\n this.flowSheetService.getLatestRunDetails(this.flowSheetId).subscribe((data: any): void => {\r\n if (data.modelRunDetails.length > 0) {\r\n\r\n this.flowSheetRunData.flowSheetId = data.flowSheetId;\r\n this.flowSheetRunData.flowSheetName = data.flowSheetName;\r\n this.flowSheetRunData.flowSheetRunId = data.flowSheetRunId;\r\n this.flowSheetRunData.status = data.status;\r\n this.flowSheetRunData.startTime = data.runStartDateTimeStamp;\r\n this.flowSheetRunData.endTime = data.runEndDateTimeStamp;\r\n this.flowSheetRunData.runCreatedBy = data.runCreatedBy;\r\n\r\n this.modelRunDetails = data.modelRunDetails;\r\n\r\n data.modelRunDetails.forEach((modelData) => {\r\n let modelDataObj = new ModelRunDetail();\r\n modelDataObj.modelUniqueId = modelData.modelUniqueId;\r\n modelDataObj.modelName = modelData.modelName;\r\n modelDataObj.status = modelData.status;\r\n modelDataObj.startTime = modelData.runStartDateTimeStamp;\r\n modelDataObj.endTime = modelData.runEndDateTimeStamp;\r\n\r\n this.modelDataList.push(modelDataObj);\r\n\r\n });\r\n\r\n this.selModel = this.modelDataList[0];\r\n this.showParameters();\r\n } else {\r\n this.globals.showAlert(AlertComponent, { success: false, message: \"Error in fetching Model run details!\" });\r\n }\r\n this.isLoading = false;\r\n }, (error: Error) => {\r\n this.globals.showAlert(AlertComponent, { success: false, message: \"Error in fetching FlowSheet runs List!\" });\r\n this.isLoading = false;\r\n });\r\n }\r\n\r\n showParameters() {\r\n this.isShowParam = true;\r\n this.inputsList = [];\r\n this.outputsList = [];\r\n this.selModelUniqueId = this.selModel.modelUniqueId;\r\n let modelData = this.modelRunDetails.find(r => r.modelUniqueId == this.selModel.modelUniqueId);\r\n\r\n modelData.inputParameters.forEach((param) => {\r\n let paramData = new ModelRunParameterDetail();\r\n paramData.parameterName = param.parameterName;\r\n paramData.value = param.parameterRunValue;\r\n paramData.parameterDisplayName = param.captionName;\r\n\r\n this.inputsList.push(paramData);\r\n });\r\n\r\n this.inputDataSource = new MatTableDataSource(this.inputsList);\r\n\r\n modelData.outputParameters.forEach((param) => {\r\n let paramData = new ModelRunParameterDetail();\r\n paramData.parameterName = param.parameterName;\r\n paramData.value = param.parameterRunValue;\r\n paramData.parameterDisplayName = param.captionName;\r\n\r\n this.outputsList.push(paramData);\r\n });\r\n\r\n this.outputDataSource = new MatTableDataSource(this.outputsList);\r\n\r\n } \r\n\r\n onCancelClick() {\r\n this.dialogRef.close(false);\r\n }\r\n}\r\n\r\n","
\r\n
\r\n Flowsheet Builder - Untitled*\r\n {{flowSheet.name}}\r\n
\r\n \r\n \r\n \r\n \r\n \r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
    \r\n
  • \r\n \r\n
  • \r\n
  • \r\n
    \r\n
  • \r\n
  • \r\n \r\n
  • \r\n
  • \r\n
    \r\n
  • \r\n
  • \r\n \r\n
  • \r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
{{item.modelType}}
\r\n
\r\n
\r\n
\r\n
\r\n \r\n \r\n
\r\n
\r\n
\r\n
\r\n
\r\n \"modelIcon\"\r\n \"modelIcon\"\r\n
\r\n
{{modelInfo.modelName}}
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n Diagnostics\r\n
\r\n
\r\n
    \r\n
  • Rename
  • \r\n
\r\n","import { HttpClient } from '@angular/common/http';\r\nimport { Component, ElementRef, OnInit } from '@angular/core';\r\nimport { MatDialog } from '@angular/material/dialog';\r\nimport { MatIconRegistry } from '@angular/material/icon';\r\nimport { DomSanitizer } from '@angular/platform-browser';\r\nimport { ActivatedRoute, Params, Router } from '@angular/router';\r\nimport { InjectionNames, OriginalPaletteProvider } from '../bpmn-js/bpmn-js';\r\nimport { AlertComponent } from '../common/alert/alert.component';\r\nimport { FlowSheetEventsHandler } from '../flowsheet/flowsheet-events/flowsheet.events.handler';\r\nimport { RenameModelComponent } from '../flowsheet/rename-model/rename-model.component';\r\nimport { SaveFlowSheetComponent } from '../flowsheet/save-flowsheet/save-flowsheet.component';\r\nimport { DataSrc, FlowSheet } from '../models/flowsheet/flowsheet.model';\r\nimport { CustomPaletteProvider } from '../props-provider/CustomPaletteProvider';\r\nimport { FlowSheetService } from '../services/flowsheet-service';\r\nimport { GlobalService } from '../services/global.service';\r\nimport { MLService } from '../services/ml-service';\r\nimport { ConnectorSpecificationComponent } from './connector-specification/connector-specification.component';\r\nimport { DataSourceManagerComponent } from './data-source-manager/data-source-manager.component';\r\nimport CustomModeler from './index';\r\nimport { ConfirmModelComponent } from '../common/confirm-model/confirm-model.component';\r\nimport { TenantService } from '../services/tenant.service';\r\nimport { catchError, switchMap, tap } from 'rxjs/operators';\r\nimport { EMPTY, of } from 'rxjs';\r\nimport { FlowSheetRunDetailsComponent } from '../flowsheet/flowsheet-run-details/flowsheet-run-details.component';\r\n\r\n@Component({\r\n selector: 'app-flowsheet',\r\n templateUrl: './flowsheet-builder.component.html',\r\n styleUrls: ['./flowsheet-builder.component.css'],\r\n host: {\r\n '(document:click)': 'onClick($event)',\r\n }\r\n})\r\nexport class FlowsheetBuilderComponent implements OnInit {\r\n isLoading = false;\r\n modeler;\r\n activPallet = \"Basic\";\r\n palletData;\r\n dataToPass: any = [];\r\n modelSvgIcons: any = [];\r\n bpmnDiagram: any;\r\n element: any;\r\n isEdit: boolean = false;\r\n flowSheetId: number;\r\n editMode = false;\r\n viewOnly: boolean = false;\r\n isReadyForNewRun = false;\r\n flowsheetShow = false;\r\n flowSheet: FlowSheet = new FlowSheet();\r\n isReadyForTerminiate = false;\r\n isAuthorized = false;\r\n showContextMenu = false;\r\n posX = 0;\r\n posY = 0;\r\n modelToRename: any = {};\r\n renameModelInfo: any = {};\r\n getRouteParams;\r\n searchText: string;\r\n filteredPalletData: any;\r\n\r\n constructor(private http: HttpClient,\r\n public globals: GlobalService,\r\n public flowSheetService: FlowSheetService,\r\n private matIconRegistry: MatIconRegistry,\r\n private domSanitizer: DomSanitizer,\r\n public mlService: MLService,\r\n public dialog: MatDialog,\r\n public router: Router,\r\n public route: ActivatedRoute,\r\n private _eref: ElementRef,\r\n public flowSheetHandler: FlowSheetEventsHandler,\r\n public tenantService: TenantService\r\n ) {\r\n }\r\n\r\n ngOnInit() {\r\n this.isLoading = true;\r\n this.getModelListData();\r\n }\r\n\r\n getModelListData(){\r\n this.mlService.getModelList().pipe(\r\n catchError(() => {\r\n this.globals.showAlert(AlertComponent, { success: false, message: \"Error getting models data\" });\r\n this.isLoading = false;\r\n return EMPTY;\r\n }),\r\n switchMap((data: any) => {\r\n localStorage.setItem('palletData', JSON.stringify(data));\r\n this.palletData = data;\r\n this.assignPalletCopy();\r\n this.modeler = this.createCustomModeler();\r\n return of(data);\r\n }),\r\n switchMap((data) => { this.getFlowsheetDetails(); return of(data); }),\r\n switchMap((data) => { this.validateIfReadyForNewRun(); return of(data); }),\r\n ).subscribe((data: any) => {\r\n if (data.flowSheetRuns && data.flowSheetRuns.length > 0 && data.flowSheetRuns[0].status.toLowerCase() === \"in progress\") {\r\n this.isReadyForTerminiate = true;\r\n this.isReadyForNewRun = false;\r\n }\r\n else {\r\n this.isReadyForNewRun = true;\r\n }\r\n this.isLoading = false;\r\n }, (error: Error) => {\r\n this.globals.showAlert(AlertComponent, { success: false, message: \"Failed to check if Flowsheet can be run.\" });\r\n this.isLoading = false;\r\n this.isReadyForNewRun = false;\r\n });\r\n }\r\n\r\n\r\n assignPalletCopy() {\r\n this.filteredPalletData = Object.assign([], this.palletData);\r\n }\r\n\r\n searchPallet(data: string) {\r\n if (data) {\r\n this.searchText = data;\r\n this.filteredPalletData = Object.assign([], this.palletData)\r\n .filter((element) =>\r\n element.modelData.some((subElement) => subElement.modelName.toLowerCase().includes(this.searchText.toLowerCase())))\r\n .map(element => {\r\n return Object.assign({}, element, { modelData: element.modelData.filter(subElement => subElement.modelName.toLowerCase().includes(this.searchText.toLowerCase())) });\r\n });\r\n }\r\n else {\r\n this.assignPalletCopy();\r\n } \r\n }\r\n\r\n getFlowsheetDetails() {\r\n this.isLoading = true;\r\n return this.route.params.subscribe(\r\n (params: Params) => {\r\n this.flowsheetShow = params.id;\r\n if (this.flowsheetShow) {\r\n this.isAuthorized = params.isAuthorized === 'true';\r\n this.editFlowsheet(params.id, params.isEdit);\r\n return of(params);\r\n } else {\r\n this.load();\r\n this.seteventBus(this);\r\n this.isLoading = false;\r\n }\r\n return of(params);\r\n }, (error: Error) => {\r\n this.globals.showAlert(AlertComponent, { success: false, message: \"Error getting models data\" });\r\n this.isLoading = false;\r\n }\r\n );\r\n }\r\n\r\n editFlowsheet(parameterId, isEdit) {\r\n this.isEdit = (isEdit === 'true' && this.isAuthorized === true);\r\n this.viewOnly = isEdit === 'false';\r\n this.flowSheetId = parameterId;\r\n this.flowSheetService.getFlowData(parameterId).subscribe((data: any): void => {\r\n this.flowSheet = data;\r\n this.validateIfReadyForNewRun();\r\n try {\r\n this.modeler.importXML(this.flowSheet.bpmnXml)\r\n .then(({ warnings }) => {\r\n this.modeler.get('canvas').zoom('fit-viewport', 'auto');\r\n });\r\n this.seteventBus(this);\r\n } catch (err) {\r\n this.globals.showAlert(AlertComponent, { success: false, message: err.message });\r\n }\r\n this.isLoading = false;\r\n }, (error: Error) => {\r\n this.globals.showAlert(AlertComponent, { success: false, message: \"Error in getting flowsheet data\" });\r\n this.isLoading = false;\r\n });\r\n }\r\n\r\n validateIfReadyForNewRun() {\r\n this.isLoading = true;\r\n this.flowSheetService.getFlowsheetRunsList(this.flowSheet.flowSheetId).subscribe((data: any) => {\r\n return of(data);\r\n }, (error: Error) => {\r\n this.globals.showAlert(AlertComponent, { success: false, message: \"Failed to check if Flowsheet can be run.\" });\r\n this.isLoading = false;\r\n this.isReadyForNewRun = false;\r\n });\r\n }\r\n inEditMode() {\r\n this.isEdit = true;\r\n this.viewOnly = false;\r\n this.seteventBus(this);\r\n }\r\n\r\n onClick() {\r\n if (this.showContextMenu) // or some similar check\r\n this.showContextMenu = false;\r\n }\r\n\r\n seteventBus(thisObj) {\r\n let that = thisObj;\r\n let eventBus = thisObj.modeler.get('eventBus');\r\n eventBus.on(['element.click', 'element.contextmenu'], 10000, function (context) {\r\n if (thisObj.viewOnly) {\r\n return false;\r\n }\r\n });\r\n eventBus.on('create.start', function (element) {\r\n // Set uniqueId in model element\r\n that.setUniqueIdForModel(element);\r\n });\r\n eventBus.on('directEditing.activate', function (elem) {\r\n // Cancel direct editing to override dblclick event properly\r\n let directEditing = that.modeler.get('directEditing');\r\n directEditing.cancel();\r\n });\r\n eventBus.on('shape.added', function (elem) {\r\n that.processShapeAddedEvent(elem);\r\n });\r\n eventBus.on('shape.removed', function (elem) {\r\n that.removeModel(elem.element.modelUniqueId);\r\n });\r\n eventBus.on('commandStack.connection.create.postExecuted', function (elem) {\r\n that.validateConnetion(elem.context);\r\n });\r\n eventBus.on('connection.added', function (elem) {\r\n if (elem.element.source.modelUniqueId != elem.element.target.modelUniqueId) {\r\n if (!elem.element.businessObject.sourceRef && !elem.element.businessObject.targetRef) {\r\n that.updateConnection(elem.element);\r\n }\r\n }\r\n });\r\n eventBus.on('connection.removed', function (elem) {\r\n let conns = elem.element.businessObject.$parent.flowElements.filter(e => e.$type == 'bpmn:SequenceFlow');\r\n if (conns.filter(e => e.id != elem.element.id\r\n && e.sourceRef.$attrs.modelUniqueId == elem.element.source.modelUniqueId\r\n && e.targetRef.$attrs.modelUniqueId == elem.element.target.modelUniqueId).length == 0) {\r\n that.removeConnection(elem.element);\r\n }\r\n });\r\n eventBus.on('element.dblclick', 10000, function (context) {\r\n that.processDblClkEvent(context, that);\r\n context.stopPropagation();\r\n });\r\n eventBus.on(\"element.contextmenu\", event => {\r\n that.processContextMenuEvent(event);\r\n });\r\n }\r\n\r\n processShapeAddedEvent(elem) {\r\n if (this.flowSheet.models.findIndex(c => c.modelUniqueId == elem.element.businessObject.$attrs.modelUniqueId) == -1) {\r\n this.addModel(elem.element);\r\n } else {\r\n elem.element['modelId'] = Number(elem.element.businessObject.$attrs.modelId);\r\n elem.element['modelImg'] = elem.element.businessObject.$attrs.modelImg;\r\n elem.element['modelName'] = elem.element.businessObject.$attrs.modelName;\r\n elem.element['modelType'] = 'custom';\r\n elem.element['modelUniqueId'] = elem.element.businessObject.$attrs.modelUniqueId;\r\n elem.element['modelVersion'] = elem.element.businessObject.$attrs.modelVersion;\r\n }\r\n }\r\n\r\n processContextMenuEvent(event) {\r\n if (event.element.type === \"bpmn:Task\") {\r\n this.modelToRename = event;\r\n this.posX = event.originalEvent.pageX;\r\n this.posY = event.originalEvent.pageY;\r\n let entireModeler = this.modeler.getDefinitions();\r\n this.renameModelInfo = { name: event.gfx.parentNode.children[0].textContent, modeler: entireModeler };\r\n this.showContextMenu = true;\r\n }\r\n event.preventDefault();\r\n event.stopPropagation();\r\n }\r\n\r\n renameModel() {\r\n this.globals.openModelWindow(this.changeModelName, this, RenameModelComponent, '40%', 'custom-modalbox', this.renameModelInfo);\r\n }\r\n\r\n changeModelName(thisRef: FlowsheetBuilderComponent, newModelName: any) {\r\n let oldName = thisRef.modelToRename.gfx.parentNode.children[0].textContent;\r\n thisRef.flowSheet.models.forEach((m) => {\r\n if (m.modelUniqueId == oldName) {\r\n m.modelUniqueId = newModelName;\r\n }\r\n m.srcModels.forEach((m1, index) => {\r\n m.srcModels[index] = m1 == oldName ? newModelName : m1;\r\n });\r\n m.sinkModels.forEach((m1, index) => {\r\n m.sinkModels[index] = m1 == oldName ? newModelName : m1;\r\n });\r\n m.inputParameters.forEach((p) => {\r\n if (p.mappedDataSource == DataSrc.model && p.mappedDataSourceId == oldName) {\r\n p.mappedDataSourceId = newModelName;\r\n }\r\n });\r\n });\r\n let svgTextElement = thisRef.getTextNodeElement();\r\n thisRef.modelToRename.element.modelUniqueId = newModelName;\r\n thisRef.modelToRename.element.businessObject.$attrs.modelUniqueId = newModelName;\r\n svgTextElement[0].childNodes[0].nodeValue = newModelName;\r\n }\r\n\r\n getTextNodeElement() {\r\n return this.modelToRename.gfx.parentNode.children[0].getElementsByTagName(\"text\");\r\n }\r\n\r\n validateConnetion(connElem) {\r\n // Check if the source and target of the connection element is same model\r\n let isSameModel = connElem.source.modelUniqueId == connElem.target.modelUniqueId;\r\n\r\n let conns = connElem.parent.children.filter(e => e.type == 'bpmn:SequenceFlow');\r\n // Check If save connection already exists\r\n let connectionAlreadyExist = conns.filter(e => e.id != connElem.connection.id\r\n && e.source.modelUniqueId == connElem.source.modelUniqueId\r\n && e.target.modelUniqueId == connElem.target.modelUniqueId).length > 0;\r\n\r\n // Check if the connection is creating any circle in execution cycle\r\n let srcModelsTrace = [connElem.source.modelUniqueId];\r\n this.getSrcModelUniqueIdRecursive(conns, srcModelsTrace, connElem.source.modelUniqueId);\r\n let isCausingCircle = srcModelsTrace.findIndex(m => m == connElem.target.modelUniqueId) != -1;\r\n\r\n if (isSameModel || connectionAlreadyExist || isCausingCircle) {\r\n this.removeElementFromRegistry(connElem.connection.id);\r\n }\r\n }\r\n\r\n getSrcModelUniqueIdRecursive(conns: any, srcModelsTrace: string[], modelUniqueId: string) {\r\n let conn = conns.find(c => c.target.modelUniqueId == modelUniqueId);\r\n if (conn != null && srcModelsTrace.findIndex(m => m == conn.source.modelUniqueId) == -1) {\r\n srcModelsTrace.push(conn.source.modelUniqueId);\r\n this.getSrcModelUniqueIdRecursive(conns, srcModelsTrace, conn.source.modelUniqueId);\r\n }\r\n }\r\n\r\n removeElementFromRegistry(elementId) {\r\n let elementRegistry = this.modeler.get('elementRegistry');\r\n let modeling = this.modeler.get('modeling');\r\n let element = elementRegistry.get(elementId);\r\n modeling.removeElements([element]);\r\n }\r\n\r\n addModel(element) {\r\n this.isLoading = true;\r\n this.flowSheetHandler.addModel(this, element.modelUniqueId, element.modelId, element.modelName, element.modelVersion);\r\n }\r\n\r\n setUniqueIdForModel(element) {\r\n let maxId: number = 0;\r\n this.modeler.get('elementRegistry');\r\n\r\n let b1 = this.modeler.getDefinitions();\r\n let c1;\r\n if (b1.diagrams[0].plane.planeElement) {\r\n c1 = b1.diagrams[0].plane.planeElement.filter((m) => { return m.bpmnElement.$attrs.modelId == element.shape.modelId });\r\n\r\n if (c1.length > 0) {\r\n maxId = Math.max.apply(Math, c1.map(function (m) {\r\n let value = m.bpmnElement.$attrs.modelUniqueId.replace(element.shape.modelName + \"_\", \"\");\r\n return isNaN(value) ? 0 : value;\r\n }));\r\n }\r\n }\r\n\r\n element.shape['modelUniqueId'] = element.shape.modelName + \"_\" + (\"0\" + (maxId + 1)).slice(-2);\r\n }\r\n\r\n updateConnection(element) {\r\n // source and target models in new connection\r\n let newSrcModel = element.source;\r\n let newSinkModel = element.target;\r\n // source and target model instances in flowsheet\r\n let srcModel = this.flowSheet.models.find(s => s.modelUniqueId == newSrcModel.modelUniqueId);\r\n let sinkModel = this.flowSheet.models.find(s => s.modelUniqueId == newSinkModel.modelUniqueId);\r\n // add src and sink relation if not already exist\r\n if (srcModel.sinkModels.findIndex(p => p == sinkModel.modelUniqueId) == -1) {\r\n srcModel.sinkModels.push(newSinkModel.modelUniqueId);\r\n }\r\n if (sinkModel.srcModels.findIndex(p => p == srcModel.modelUniqueId) == -1) {\r\n sinkModel.srcModels.push(newSrcModel.modelUniqueId);\r\n }\r\n }\r\n\r\n removeConnection(element) {\r\n // source and target models in removed connection\r\n let oldSrcModel = element.source;\r\n let oldSinkModel = element.target;\r\n // source and target model instances in flowsheet\r\n let srcModel = this.flowSheet.models.find(s => s.modelUniqueId == oldSrcModel.modelUniqueId);\r\n let sinkModel = this.flowSheet.models.find(s => s.modelUniqueId == oldSinkModel.modelUniqueId);\r\n // remove src and sink relation\r\n srcModel.sinkModels.splice(\r\n srcModel.sinkModels.findIndex(m => m == oldSinkModel.modelUniqueId)\r\n , 1);\r\n\r\n this.flowSheetHandler.removeSrcModelParameterMappings(sinkModel, oldSrcModel.modelUniqueId);\r\n sinkModel.srcModels.splice(\r\n sinkModel.srcModels.findIndex(m => m == oldSrcModel.modelUniqueId)\r\n , 1);\r\n }\r\n\r\n removeModel(modelUniqueId) {\r\n this.flowSheetHandler.removeModel(this.flowSheet, modelUniqueId);\r\n }\r\n\r\n createCustomModeler(): any {\r\n return new CustomModeler({\r\n container: '#canvas',\r\n width: '100%',\r\n height: '540px',\r\n additionalModules: [\r\n { [InjectionNames.originalPaletteProvider]: ['type', OriginalPaletteProvider] },\r\n { [InjectionNames.paletteProvider]: ['type', CustomPaletteProvider] },\r\n ]\r\n });\r\n }\r\n\r\n changeSource(event) {\r\n event.target.src = 'assets/bpmn/defaultModel.svg';\r\n }\r\n\r\n processDblClkEvent(context, thisRef) {\r\n this.element = context.element;\r\n if (this.element.type == \"bpmn:SequenceFlow\") {\r\n let srcModel = this.flowSheet.models.find(m => m.modelUniqueId == this.element.businessObject.sourceRef.$attrs.modelUniqueId);\r\n let sinkModel = this.flowSheet.models.find(m => m.modelUniqueId == this.element.businessObject.targetRef.$attrs.modelUniqueId);\r\n thisRef.dataToPass = {\r\n 'srcModel': srcModel,\r\n 'sinkModel': sinkModel,\r\n 'readOnly': this.viewOnly\r\n };\r\n thisRef.globals.openModelWindow(null, thisRef, ConnectorSpecificationComponent, '80%', 'custom-modalbox', thisRef.dataToPass);\r\n } else if (this.element.type == \"bpmn:Task\") {\r\n thisRef.dataToPass = {\r\n 'model': this.flowSheet.models.find(m => m.modelUniqueId == this.element.modelUniqueId),\r\n 'readOnly': this.viewOnly\r\n };\r\n thisRef.globals.openModelWindow(null, thisRef, DataSourceManagerComponent, '80%', 'custom-modalbox', thisRef.dataToPass);\r\n }\r\n \r\n return false;\r\n }\r\n\r\n selectPalleteType(paletteType) {\r\n this.activPallet = paletteType;\r\n }\r\n\r\n handleError(err: any) {\r\n if (err) {\r\n this.globals.showAlert(AlertComponent, { success: false, message: \"Ups, error, please reload the page\" });\r\n }\r\n }\r\n\r\n selectModel(modelName) {\r\n let element: HTMLElement = document.querySelector(\"[data-action='create.\" + modelName + \"-task']\") as HTMLElement;\r\n element.click();\r\n }\r\n\r\n canvasZoomIn() {\r\n this.modeler.get('zoomScroll').stepZoom(1);\r\n }\r\n canvasZoomOut() {\r\n this.modeler.get('zoomScroll').stepZoom(-1);\r\n }\r\n canvasZoomReset() {\r\n this.modeler.get('zoomScroll').reset();\r\n }\r\n\r\n load() {\r\n let blankBpmnXml = \"\\n\\n \\n \\n \\n \\n\\n\";\r\n try {\r\n this.modeler.importXML(blankBpmnXml)\r\n .then(({ warnings }) => {\r\n this.modeler.get('canvas').zoom('fit-viewport', 'auto');\r\n });\r\n } catch (err) {\r\n this.globals.showAlert(AlertComponent, { success: false, message: err.message });\r\n }\r\n }\r\n\r\n setFlowSheetData(thisRef: FlowsheetBuilderComponent, data: FlowSheet) {\r\n thisRef.isLoading = true;\r\n if (thisRef.flowSheet.flowSheetId === 0 && thisRef.flowSheet.name === '') {\r\n thisRef.flowSheet.name = data.name;\r\n thisRef.flowSheet.description = data.description;\r\n thisRef.flowSheet.refineryName = thisRef.tenantService.getCurrentTenant().tenantRefinery;\r\n thisRef.flowSheet.createdBy = thisRef.globals.loggedInUser;\r\n thisRef.flowSheet.lastUpdatedBy = thisRef.globals.loggedInUser;\r\n thisRef.flowSheet.bpmnXml = thisRef.bpmnDiagram.xml;\r\n thisRef.flowSheet.tenantId = thisRef.tenantService.getCurrentTenant().tenantId;\r\n }\r\n else {\r\n thisRef.flowSheet.refineryName = thisRef.tenantService.getCurrentTenant().tenantRefinery;\r\n thisRef.flowSheet.lastUpdatedBy = thisRef.globals.loggedInUser;\r\n thisRef.flowSheet.bpmnXml = thisRef.bpmnDiagram.xml;\r\n thisRef.flowSheet.tenantId = thisRef.tenantService.getCurrentTenant().tenantId;\r\n }\r\n\r\n thisRef.flowSheetService.saveFlowSheet(thisRef.flowSheet).subscribe((data: any): void => {\r\n thisRef.flowSheet.flowSheetId = data;\r\n thisRef.editMode = true;\r\n thisRef.isReadyForNewRun = true;\r\n thisRef.globals.showAlert(AlertComponent, { success: true, message: \"Saved Successfully\" });\r\n thisRef.isLoading = false;\r\n }, (error: Error) => {\r\n thisRef.globals.showAlert(AlertComponent, { success: false, message: \"Error in Saving, please try again.\" });\r\n thisRef.isLoading = false;\r\n });\r\n }\r\n\r\n async save() {\r\n if (this.flowSheet.models.length !== 0) {\r\n try {\r\n this.bpmnDiagram = await this.modeler.saveXML({ format: true });\r\n this.flowSheetHandler.calculateInitialModels(this.flowSheet);\r\n\r\n if (this.flowSheet.initialModelUniqueIds.length == 0) {\r\n this.globals.showAlert(AlertComponent, { success: false, message: \"Failed to trace starting models. Please have atleast 1 model as starting model.\" });\r\n }\r\n\r\n this.saveFlowSheet();\r\n\r\n } catch (err) {\r\n this.globals.showAlert(AlertComponent, { success: false, message: \"Could not save flowsheet diagram.\" });\r\n }\r\n } else {\r\n this.globals.showAlert(AlertComponent, { success: false, message: \"No models added to save.\" });\r\n }\r\n }\r\n\r\n saveFlowSheet() {\r\n if (this.flowSheet.flowSheetId === 0 && this.flowSheet.name === '') {\r\n this.globals.openModelWindow(this.setFlowSheetData, this, SaveFlowSheetComponent, '40%', 'custom-modalbox', '');\r\n }\r\n else {\r\n this.setFlowSheetData(this, null);\r\n }\r\n }\r\n\r\n validateBeforeRun() {\r\n if (this.flowSheet.models.length > 0) {\r\n this.validateInputParameters(0);\r\n }\r\n else {\r\n this.globals.showAlert(AlertComponent, { success: false, message: \"New run request failed. There is no model present in flowsheet to run.\" });\r\n }\r\n }\r\n\r\n validateInputParameters(index) {\r\n // check which models still have unmapped parameters\r\n let unmappedModels = this.flowSheet.models.filter(m => m.inputParameters\r\n .findIndex(p => p.mappedDataSource == DataSrc.user && p.data.parameterDefaultValue == null) >= 0);\r\n\r\n if (unmappedModels.length > 0) {\r\n this.globals.showAlert(AlertComponent, { success: false, message: \"Not all input parameters mapped for model \" + unmappedModels[0].modelUniqueId + \".\" });\r\n }\r\n else {\r\n this.initiateNewRun();\r\n }\r\n }\r\n\r\n initiateNewRun() {\r\n this.isLoading = true;\r\n let runReqData = { flowSheetId: this.flowSheet.flowSheetId };\r\n this.flowSheetService.initiateNewRun(runReqData).subscribe((data: any): void => {\r\n this.globals.showAlert(AlertComponent, { success: true, message: \"New run request has been submitted successfully.\" });\r\n this.isReadyForNewRun = false;\r\n this.isReadyForTerminiate = true;\r\n this.isLoading = false;\r\n }, (error: Error) => {\r\n this.globals.showAlert(AlertComponent, { success: false, message: \"New run request failed. Please check models parameters.\" });\r\n this.isLoading = false;\r\n });\r\n }\r\n\r\n openRunDetails() {\r\n this.isLoading = true;\r\n \r\n this.flowSheetService.getFlowsheetRunsList(this.flowSheet.flowSheetId).subscribe((data: any): void => {\r\n if (data.flowSheetRuns && data.flowSheetRuns.length > 0) { \r\n let tenantIdDetails = { tenantId: this.tenantService.getCurrentTenant().tenantId };\r\n let flowsheetData = { ...this.flowSheet, ...tenantIdDetails }\r\n this.dialog.open(FlowSheetRunDetailsComponent, {\r\n width: '1100px',\r\n panelClass: 'details-modalbox',\r\n data: flowsheetData\r\n });\r\n }\r\n else {\r\n this.globals.showAlert(AlertComponent, { success: false, message: \"No run details are available.\" });\r\n }\r\n this.isLoading = false;\r\n }, (error: Error) => {\r\n this.globals.showAlert(AlertComponent, { success: false, message: \"Run details check failed.\" });\r\n this.isLoading = false;\r\n });\r\n }\r\n\r\n terminateRun() {\r\n let dataToPass = {\r\n title: 'Delete',\r\n isDelete: false,\r\n message: 'Do you really want to terminate the letest run request of this flowsheet?'\r\n };\r\n this.globals.openModelWindow(this.terminateRunConfirm, this, ConfirmModelComponent, '450px', 'confirm-modalbox', dataToPass);\r\n }\r\n\r\n terminateRunConfirm(thisRef: FlowsheetBuilderComponent) {\r\n thisRef.isLoading = true;\r\n \r\n thisRef.flowSheetService.terminateFlowsheetRun(thisRef.flowSheet.flowSheetId).subscribe((data: any): void => {\r\n if (data === \"inprogress\") {\r\n thisRef.globals.showAlert(AlertComponent, { success: true, message: \"Flowsheet latest run terminated successfully!\" });\r\n } else {\r\n thisRef.globals.showAlert(AlertComponent, { success: false, message: \"Flowsheet run is already completed, it can't be terminate\" });\r\n }\r\n thisRef.isReadyForTerminiate = false;\r\n thisRef.isReadyForNewRun = true;\r\n thisRef.isLoading = false;\r\n }, (error: Error) => {\r\n thisRef.globals.showAlert(AlertComponent, { success: false, message: \"Something went wrong!\" });\r\n thisRef.isLoading = false;\r\n });\r\n }\r\n\r\n}\r\n","export class FilterModel {\r\n fieldName: string;\r\n fieldType: string;\r\n values: string[];\r\n}\r\n","export class CommonConstants {\r\n\r\n public conditionTypeText: string[] = [\"==\"];\r\n public conditionTypeValues: string[] = [\"==\", \">=\", \"<=\"];\r\n\r\n}\r\n\r\nexport enum FilterFieldTypes {\r\n text = \"text\",\r\n values = \"values\"\r\n}\r\n","export class FilterResponseModel {\r\n selectedFieldName: string;\r\n selectedCondition: string;\r\n selectedValue: string[];\r\n}\r\n","
\r\n
\r\n
\r\n
\r\n \r\n
\r\n
\r\n
\r\n \r\n
\r\n
\r\n
\r\n \r\n
\r\n
\r\n
\r\n \r\n
\r\n
\r\n
\r\n","import { Component, OnInit, Input, Output, EventEmitter } from '@angular/core';\r\nimport { FilterModel } from '../../models/filter/filter-request.model';\r\nimport { CommonConstants, FilterFieldTypes } from '../common-constants';\r\nimport { UntypedFormGroup, UntypedFormControl, UntypedFormBuilder, Validators } from '@angular/forms';\r\nimport { FilterResponseModel } from '../../models/filter/filter-response.model';\r\nimport { GlobalService } from '../../services/global.service';\r\n\r\n@Component({\r\n selector: 'app-add-filter',\r\n templateUrl: './add-filter.component.html',\r\n styleUrls: ['./add-filter.component.css']\r\n})\r\nexport class AddFilterComponent implements OnInit {\r\n\r\n @Input() filterList: FilterModel[];\r\n @Input() selectedFilters: FilterResponseModel[];\r\n @Output() filterResponse = new EventEmitter();\r\n\r\n public conditionList: string[];\r\n public valuesList: string[];\r\n public constants: CommonConstants;\r\n\r\n public addFilterForm: UntypedFormGroup;\r\n /** control for the MatSelect filter keyword multi-selection */\r\n\r\n constructor(public fb: UntypedFormBuilder, private globalService: GlobalService) { }\r\n\r\n ngOnInit(): void {\r\n this.constants = new CommonConstants();\r\n this.addFilterForm = this.fb.group({\r\n filterName: ['', Validators.required],\r\n condition: ['', Validators.required],\r\n value: ['', Validators.required]\r\n });\r\n }\r\n\r\n /** Triggered when field is selected*/\r\n onFieldSelected() {\r\n this.valuesList = [];\r\n let selectedField = this.addFilterForm.get('filterName').value;\r\n this.addFilterForm.reset();\r\n this.addFilterForm.get('filterName').setValue(selectedField);\r\n let tempType = this.filterList.find(o => o.fieldName === this.addFilterForm.get('filterName').value.fieldName);\r\n switch (tempType.fieldType) {\r\n case FilterFieldTypes.text:\r\n this.conditionList = this.constants.conditionTypeText;\r\n break;\r\n case FilterFieldTypes.values:\r\n this.conditionList = this.constants.conditionTypeValues;\r\n break;\r\n }\r\n }\r\n\r\n /**\r\n * Receive user input and send to search method\r\n * @param value\r\n */\r\n /*onKey(value) {\r\n let filter = value.toLowerCase();\r\n let temp = this.valuesList.filter(option => option.toLowerCase().includes(filter));\r\n this.valuesList = temp;\r\n }*/\r\n\r\n /**When condition is selected */\r\n onConditionSelected() {\r\n let tempType = this.filterList.find(o => o.fieldName === this.addFilterForm.get('filterName').value.fieldName);\r\n if (tempType.fieldType == \"text\") {\r\n this.valuesList = [...tempType.values].sort(function (a, b) {\r\n return a.toLowerCase().localeCompare(b.toLowerCase());\r\n });\r\n } else if (tempType.fieldType == \"values\") {\r\n this.valuesList = [...tempType.values].sort((a, b) => parseInt(a, 10) - parseInt(b, 10));\r\n }\r\n }\r\n\r\n /**\r\n * Hides field name from dropdown\r\n * @param fieldName\r\n */\r\n hideFieldName(fieldName: string) {\r\n return this.selectedFilters?.find(t => t.selectedFieldName == fieldName);\r\n }\r\n\r\n /**\r\n * Disables value\r\n * @param element\r\n */\r\n disableValues(element: string) {\r\n let check: boolean = (!this.addFilterForm.get('value').value?.includes(element) && this.addFilterForm.get('value').value?.length >= 5);\r\n return check;\r\n }\r\n\r\n /**Adding a new filter */\r\n submitFilter() {\r\n let response: FilterResponseModel = new FilterResponseModel();\r\n response.selectedFieldName = this.globalService.replaceFilterText(this.addFilterForm.get('filterName').value.fieldName);\r\n response.selectedCondition = this.addFilterForm.get('condition').value;\r\n response.selectedValue = this.addFilterForm.get('value').value;\r\n this.filterResponse.emit({ filterResponse: response });\r\n }\r\n\r\n}\r\n","
\r\n
\r\n
\r\n Flowsheet Builder\r\n
\r\n\r\n
\r\n
\r\n \r\n search\r\n
\r\n \r\n
\r\n \r\n \r\n {{globals.replaceDisplayText(element.selectedFieldName) + \" \" + element.selectedCondition + \" \" + element.selectedValue}}\r\n cancel\r\n \r\n \r\n
\r\n
\r\n  \r\n  \r\n
\r\n
\r\n
\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n Flowsheet Name\r\n {{element.flowSheetName}} \r\n \r\n \r\n Description\r\n {{element.flowSheetDescription}} \r\n \r\n \r\n Last Modified At​\r\n {{element.lastUpdatedTimeStamp | date: 'yyyy-MM-dd T HH:mm:ss' }} \r\n \r\n \r\n Last Modified By​\r\n {{element.lastUpdatedBy}} \r\n \r\n \r\n Action\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\n \r\n
\r\n There are no records to display.\r\n
\r\n \r\n \r\n
\r\n
\r\n \r\n
\r\n\r\n","import { Component, OnInit, ViewChild, OnDestroy } from '@angular/core';\r\nimport { NavigationEnd, Router, RouterEvent } from '@angular/router';\r\nimport { filter, takeUntil } from 'rxjs/operators';\r\nimport { Subject } from 'rxjs';\r\nimport { MatDialog } from '@angular/material/dialog';\r\nimport { MatPaginator } from '@angular/material/paginator';\r\nimport { MatSort, MatSortable } from '@angular/material/sort';\r\nimport { MatTableDataSource } from '@angular/material/table';\r\nimport { ConfirmModelComponent } from '../common/confirm-model/confirm-model.component';\r\nimport { FlowSheetService } from '../services/flowsheet-service';\r\nimport { GlobalService } from '../services/global.service';\r\nimport { FilterModel } from '../models/filter/filter-request.model';\r\nimport { FilterResponseModel } from '../models/filter/filter-response.model';\r\nimport { NgbPopover } from '@ng-bootstrap/ng-bootstrap';\r\nimport { FilterFieldTypes } from '../common/common-constants';\r\nimport { Globals } from '../models/globals.model';\r\nimport { TenantService } from '../services/tenant.service';\r\n\r\n\r\n@Component({\r\n selector: 'app-flowsheet',\r\n templateUrl: './flowsheet.component.html',\r\n styleUrls: ['./flowsheet.component.css']\r\n})\r\nexport class FlowSheetComponent implements OnInit, OnDestroy {\r\n resourceList: any = [];\r\n expandedIndex: any;\r\n isLoading = true;\r\n modelErrorMessage = 'Error';\r\n modelDetails: any;\r\n flowsheetsListDetails: MatTableDataSource;\r\n displayedColumns: string[] = ['Add', 'flowSheetName', 'flowSheetDescription', 'lastUpdatedTimeStamp', 'lastUpdatedBy', 'Action'];\r\n isLinear = false;\r\n flowSheetIdToDelete: number = 0;\r\n @ViewChild(MatPaginator, { static: true }) paginator: MatPaginator;\r\n @ViewChild(MatSort, { static: true }) sort: MatSort;\r\n\r\n filterList: FilterModel[] = [];\r\n selectedFilters: FilterResponseModel[] = [];\r\n masterData: any;\r\n @ViewChild('popOver') public popover: NgbPopover;\r\n public destroyed = new Subject();\r\n constructor(\r\n public _router: Router,\r\n public globals: GlobalService,\r\n public global: Globals,\r\n public flowSheetService: FlowSheetService,\r\n private tenantService:TenantService,\r\n public dialog: MatDialog) {\r\n this._router.events.pipe(\r\n filter((event: RouterEvent) => event instanceof NavigationEnd),\r\n takeUntil(this.destroyed)\r\n ).subscribe(() => {\r\n this.initialize();\r\n });\r\n const emptyList: any[] = [];\r\n this.flowsheetsListDetails = new MatTableDataSource(emptyList);\r\n }\r\n\r\n initialize() {\r\n this.expandedIndex = -1;\r\n this.getFlowsheetsList();\r\n }\r\n\r\n ngOnInit() {\r\n // we cant remove empty 'ngOnInit'\r\n }\r\n\r\n\r\n ngOnDestroy(): void {\r\n this.destroyed.next();\r\n this.destroyed.complete();\r\n }\r\n\r\n getFlowsheetsList() {\r\n this.selectedFilters = [];\r\n this.isLoading = true;\r\n this.flowSheetService.getFlowSheetsList().subscribe((data: any): void => {\r\n if (data && data !== null && data.length > 0) {\r\n this.masterData = [...data];\r\n this.flowsheetsListDetails = new MatTableDataSource(data);\r\n this.isUserAuthorized();\r\n this.sort.sort(({ id: 'flowSheetName', start: 'asc' }) as MatSortable);\r\n this.flowsheetsListDetails.sort = this.sort;\r\n this.flowsheetsListDetails.paginator = this.paginator;\r\n }\r\n else{\r\n this.flowsheetsListDetails.data = [];\r\n }\r\n this.isLoading = false;\r\n this.filterList = [];\r\n this.createFilterList();\r\n }, (error: Error) => {\r\n this.modelErrorMessage = 'Error in fetching Flowsheets List, more details: ' + error.message;\r\n this.isLoading = false;\r\n });\r\n }\r\n\r\n\r\n /**\r\n * checks if user is authorized or not and marks flag as true and false\r\n */\r\n isUserAuthorized() {\r\n for (const element of this.flowsheetsListDetails.filteredData) {\r\n if (element &&\r\n element.createdBy !== this.globals.loggedInUser &&\r\n this.global.rbacName !== 'Platform Admin') {\r\n element.isUnauthorized = true;\r\n } else {\r\n element.isUnauthorized = false;\r\n }\r\n }\r\n }\r\n\r\n deleteFlowSheet(flowSheetId) {\r\n this.flowSheetIdToDelete = flowSheetId;\r\n let dataToPass = {\r\n title: 'Delete',\r\n isDelete: true,\r\n message: 'Do you really want to delete it?'\r\n };\r\n this.globals.openModelWindow(this.deleteOnConfirm, this, ConfirmModelComponent, '450px', 'confirm-modalbox', dataToPass);\r\n }\r\n\r\n deleteOnConfirm(thisRef: FlowSheetComponent) {\r\n thisRef.isLoading = true;\r\n thisRef.flowSheetService.deleteFlowSheet(thisRef.flowSheetIdToDelete).subscribe((result: any): void => {\r\n if (result == \"Success\") {\r\n thisRef.getFlowsheetsList();\r\n }\r\n thisRef.isLoading = false;\r\n thisRef.flowSheetIdToDelete = 0;\r\n }, (error: Error) => {\r\n thisRef.modelErrorMessage = 'Error in deleting FlowSheet, more details: ' + error.message;\r\n thisRef.isLoading = false;\r\n thisRef.flowSheetIdToDelete = 0;\r\n });\r\n }\r\n\r\n /**\r\n * Filters data based on input text\r\n * @param filterValue\r\n */\r\n applyFilter(filterValue: string) {\r\n filterValue = filterValue.trim().toLowerCase(); // Remove whitespace and MatTableDataSource defaults to lowercase matches\r\n this.flowsheetsListDetails.filter = filterValue;\r\n }\r\n\r\n /**Creates data for filter list */\r\n createFilterList() {\r\n for (let a = 0; a < this.displayedColumns.length - 1; a++) {\r\n let tempFilter: FilterModel = new FilterModel();\r\n let unique;\r\n tempFilter.fieldName = this.globals.replaceDisplayText(this.displayedColumns[a]);\r\n tempFilter.fieldType = FilterFieldTypes.text;\r\n if (this.displayedColumns[a] == \"flowSheetName\") {\r\n unique = Array.from(new Set(this.flowsheetsListDetails.data.map(a => a.flowSheetName)));\r\n } else if (this.displayedColumns[a] == \"flowSheetDescription\") {\r\n unique = Array.from(new Set(this.flowsheetsListDetails.data.map(a => a.flowSheetDescription)));\r\n } else if (this.displayedColumns[a] == \"lastUpdatedTimeStamp\") {\r\n unique = Array.from(new Set(this.flowsheetsListDetails.data.map(a => a.lastUpdatedTimeStamp)));\r\n } else if (this.displayedColumns[a] == \"lastUpdatedBy\") {\r\n unique = Array.from(new Set(this.flowsheetsListDetails.data.map(a => a.lastUpdatedBy)));\r\n }\r\n tempFilter.values = unique;\r\n this.filterList.push(tempFilter);\r\n }\r\n this.filterList.splice(0, 1);\r\n }\r\n\r\n /**\r\n * Returns data from child filter component\r\n * @param event\r\n */\r\n filterResponse(event) {\r\n let filterResponse: FilterResponseModel = event.filterResponse;\r\n this.flowsheetsListDetails.data = this.globals.conditionalDataFiltering(filterResponse, this.flowsheetsListDetails.data);\r\n this.selectedFilters.push(filterResponse);\r\n if (this.popover.isOpen()) this.popover.close();\r\n }\r\n\r\n /**\r\n * Removes that filter\r\n * @param selectedFilter\r\n */\r\n remove(selectedFilter: FilterResponseModel): void {\r\n const index = this.selectedFilters.indexOf(selectedFilter); \r\n if (index >= 0) {\r\n this.selectedFilters.splice(index, 1);\r\n this.flowsheetsListDetails.data = this.masterData.slice(0);\r\n if (this.selectedFilters.length > 0) {\r\n for (let element of this.selectedFilters) {\r\n this.flowsheetsListDetails.data = this.globals.conditionalDataFiltering(element, this.flowsheetsListDetails.data);\r\n }\r\n }\r\n }\r\n }\r\n\r\n}\r\n","import { Component, OnInit } from '@angular/core';\r\nimport { HttpClient } from '@angular/common/http';\r\nimport { GraphService } from 'src/app/services/graph.service';\r\nimport { Router, ActivatedRoute, Params } from '@angular/router';\r\nimport { Globals } from '../models/globals.model';\r\nimport { MsalService } from '@azure/msal-angular';\r\nimport { AuthError, InteractionRequiredAuthError } from '@azure/msal-browser';\r\n\r\n@Component({\r\n selector: 'app-overage',\r\n templateUrl: './overage.component.html',\r\n styleUrls: ['./overage.component.css']\r\n})\r\nexport class OverageComponent implements OnInit {\r\n\r\n groups: string[] = [];\r\n\r\n constructor(private authService: MsalService, private service: GraphService, private http: HttpClient\r\n , private router: Router\r\n , public route: ActivatedRoute\r\n , public globals: Globals) { }\r\n\r\n ngOnInit(): void {\r\n this.handleResponse();\r\n }\r\n\r\n handleResponse(): void {\r\n this.service.getGroups().subscribe({\r\n next: (response: any) => {\r\n this.getGroupId(response.value);\r\n\r\n /**\r\n * Some queries against Microsoft Graph return multiple pages of data either due to server-side paging \r\n * or due to the use of the $top query parameter to specifically limit the page size in a request. \r\n * When a result set spans multiple pages, Microsoft Graph returns an @odata.nextLink property in \r\n * the response that contains a URL to the next page of results.\r\n * learn more at https://docs.microsoft.com/graph/paging\r\n */\r\n if (response['@odata.nextLink']) {\r\n this.handleNextPage(response['@odata.nextLink'])\r\n } else {\r\n this.syncGroups();\r\n }\r\n },\r\n error: (err: AuthError) => {\r\n console.log(err)\r\n // If there is an interaction required error,\r\n // call one of the interactive methods and then make the request again.\r\n if (InteractionRequiredAuthError.isInteractionRequiredError(err.errorCode, err.errorMessage)) {\r\n this.authService.acquireTokenPopup({\r\n scopes: [this.globals.config.graphApi_client_resourceUri]\r\n })\r\n .subscribe(() => {\r\n this.service.getGroups()\r\n .toPromise()\r\n .then((response: any) => {\r\n this.getGroupId(response.value);\r\n\r\n if (response['@odata.nextLink']) {\r\n this.handleNextPage(response['@odata.nextLink'])\r\n } else {\r\n this.syncGroups();\r\n }\r\n });\r\n });\r\n }\r\n }\r\n });\r\n }\r\n\r\n getGroupId(value) {\r\n return value.map(v => this.groups.push(v.id));\r\n }\r\n\r\n private syncGroups() {\r\n this.service.user.groupIDs = this.groups;\r\n this.route.params.subscribe(\r\n (params: Params) => {\r\n this.router.navigate(['/' + params.redirectPath]);\r\n });\r\n }\r\n\r\n handleNextPage(nextPage): void {\r\n this.service.getNextPage(nextPage)\r\n .subscribe((response: any) => {\r\n\r\n response.value.map(v => {\r\n if (!this.groups.includes(v.id)) {\r\n this.groups.push(v.id);\r\n }\r\n });\r\n\r\n if (response['@odata.nextLink']) {\r\n this.handleNextPage(response['@odata.nextLink'])\r\n } else {\r\n this.syncGroups();\r\n }\r\n })\r\n }\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { ActivatedRouteSnapshot, CanActivate, Router } from '@angular/router';\r\nimport { AlertComponent } from '../common/alert/alert.component';\r\nimport { MsalService } from '@azure/msal-angular';\r\nimport { GlobalService } from './global.service';\r\nimport { GraphService } from './graph.service';\r\nimport { Globals } from '../models/globals.model';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class GroupGuardService implements CanActivate {\r\n route: ActivatedRouteSnapshot;\r\n\r\n constructor(private authService: MsalService, private service: GraphService\r\n , private router: Router\r\n , public globalServ: GlobalService\r\n , public globals: Globals) { }\r\n\r\n canActivate(route: ActivatedRouteSnapshot): boolean {\r\n this.route = route;\r\n\r\n if (this.service.user.groupIDs.length > 0) {\r\n return this.validateGroup();\r\n }\r\n else {\r\n this.router.navigate(['/overage', { redirectPath: route.routeConfig.path }]);\r\n }\r\n }\r\n\r\n validateGroup(): boolean {\r\n const expectedGroups = this.route.data.expectedGroups;\r\n let matchGroups = expectedGroups.filter(grp => this.service.user.groupIDs.includes(grp));\r\n if (expectedGroups.length > 0 && matchGroups.length == 0) {\r\n this.globalServ.showAlertWithCallBack(AlertComponent, { success: false, message: \"You do not have enough access. Redirecting to Home Page...\" }\r\n , this.redirectOnUnAuthorizedAccess, this);\r\n return false;\r\n } else {\r\n return true;\r\n }\r\n }\r\n\r\n redirectOnUnAuthorizedAccess(thisRef: GroupGuardService) {\r\n window.location.href = thisRef.globals.config.platformHomeUrl;\r\n }\r\n}\r\n","export const environment = {\r\n production: process.env[\"ISPRODUCTION\"],\r\n clientId: process.env[\"AUTH_CLIENT_CLIENTID\"],\r\n authority: \"https://login.microsoftonline.com/329e91b0-e21f-48fb-a071-456717ecc28e\",\r\n validateAuthority: true,\r\n redirectUri: process.env[\"AUTH_CLIENT_REDIRECTURI\"],\r\n postLogoutRedirectUri: process.env[\"AUTH_CLIENT_POSTLOGOUTREDIRECTURI\"],\r\n navigateToLoginRequestUrl: true,\r\n flowsheetApi_client_resourceUri: process.env[\"FLOWSHEETAPI_CLIENT_RESOURCEURI\"],\r\n flowsheetApi_client_resourceScope: process.env[\"FLOWSHEETAPI_CLIENT_RESOURCESCOPE\"],\r\n notificationApi_client_resourceUri: \"https://totalr4platformnotification-cidi.azurewebsites.net/\",\r\n notificationApi_client_resourceUri_resourceScope: \"api://38523345-ce40-4f68-9a1b-4d58329d934e/access_as_user_APIM\",\r\n platformAdminApi_client_resourceUri: process.env[\"PLATFORMADMINAPI_CLIENT_RESOURCEURI\"],\r\n platformAdminApi_client_resourceScope: process.env[\"PLATFORMADMINAPI_CLIENT_RESOURCESCOPE\"],\r\n modelManagementApi_client_resourceUri: process.env[\"MODELMANAGEMENTAPI_CLIENT_RESOURCEURI\"],\r\n modelManagementApi_client_resourceScope: process.env[\"MODELMANAGEMENTAPI_CLIENT_RESOURCESCOPE\"],\r\n groups_client_PlatformAdminGroupId: process.env[\"GROUPS_CLIENT_PLATFORMADMINGROUPID\"],\r\n groups_client_FlowsheetBuilderUserGroupId: process.env[\"GROUPS_CLIENT_FLOWSHEETBUILDERUSERGROUPID\"],\r\n graphApi_client_resourceUri: \"https://graph.microsoft.com/v1.0/me/memberOf\",\r\n graphApi_client_resourceScope: \"User.Read\",\r\n cache_client: {\r\n cacheLocation: \"localStorage\"\r\n },\r\n ReleaseDetails: {\r\n Version: \"1.0.0\",\r\n DateOfBuild: \"NA\",\r\n BuildNumber: \"NA\"\r\n },\r\n subscription: process.env[\"SUBSCRIPTION\"],\r\n environment: process.env[\"environment\"],\r\n platformHomeUrl: process.env[\"PLATFORMHOMEURL\"],\r\n platformHubUrl: process.env[\"PLATFORMHUBURL\"],\r\n appInsightKey: process.env[\"APPINSIGHTKEY\"],\r\n platformDocumentation: process.env[\"PLATFORMDOCUMENTATION\"]\r\n};","import { NgModule } from '@angular/core';\r\nimport { RouterModule, Routes } from '@angular/router';\r\nimport { FlowsheetBuilderComponent } from './flowsheet-builder/flowsheet-builder.component';\r\nimport { FlowSheetRunDetailsComponent } from './flowsheet/flowsheet-run-details/flowsheet-run-details.component';\r\nimport { FlowSheetComponent } from './flowsheet/flowsheet.component';\r\nimport { MsalGuard } from '@azure/msal-angular';\r\nimport { OverageComponent } from './overage/overage.component';\r\nimport { GroupGuardService } from './services/group-guard.service';\r\nimport { environment } from 'src/environments/environment';\r\n\r\nlet enValue = environment;\r\n\r\nconst routes: Routes = [\r\n {\r\n path: 'overage',\r\n component: OverageComponent,\r\n canActivate: [\r\n MsalGuard,\r\n ]\r\n },\r\n {\r\n path: 'Flowsheet',\r\n component: FlowSheetComponent,\r\n canActivate: [\r\n MsalGuard,\r\n GroupGuardService\r\n ],\r\n data: {\r\n expectedGroups: [\r\n enValue.groups_client_PlatformAdminGroupId,\r\n enValue.groups_client_FlowsheetBuilderUserGroupId\r\n ]\r\n }\r\n },\r\n {\r\n path: 'flowsheetBuilder',\r\n component: FlowsheetBuilderComponent,\r\n canActivate: [\r\n MsalGuard,\r\n GroupGuardService\r\n ],\r\n data: {\r\n expectedGroups: [\r\n enValue.groups_client_PlatformAdminGroupId,\r\n enValue.groups_client_FlowsheetBuilderUserGroupId\r\n ]\r\n }\r\n },\r\n {\r\n path: 'FSRunDetails',\r\n component: FlowSheetRunDetailsComponent,\r\n canActivate: [\r\n MsalGuard\r\n ],\r\n data: {\r\n expectedGroups: [\r\n enValue.groups_client_PlatformAdminGroupId,\r\n enValue.groups_client_FlowsheetBuilderUserGroupId\r\n ]\r\n }\r\n },\r\n {\r\n path: 'FSRunDetails:flowSheetId:tenantId',\r\n component: FlowSheetRunDetailsComponent,\r\n canActivate: [\r\n MsalGuard\r\n ],\r\n data: {\r\n expectedGroups: [\r\n enValue.groups_client_PlatformAdminGroupId,\r\n enValue.groups_client_FlowsheetBuilderUserGroupId\r\n ]\r\n }\r\n },\r\n {\r\n path: 'flowsheetBuilder:id:edit',\r\n component: FlowsheetBuilderComponent,\r\n canActivate: [\r\n MsalGuard,\r\n GroupGuardService\r\n ],\r\n data: {\r\n expectedGroups: [\r\n enValue.groups_client_PlatformAdminGroupId,\r\n enValue.groups_client_FlowsheetBuilderUserGroupId\r\n ]\r\n }\r\n },\r\n {\r\n path: '**',\r\n redirectTo: 'Flowsheet',\r\n pathMatch: 'full'\r\n }\r\n];\r\n\r\n@NgModule({\r\n imports: [RouterModule.forChild(routes), RouterModule.forRoot(routes, { useHash: false, relativeLinkResolution: 'legacy' })],\r\n exports: [RouterModule]\r\n})\r\nexport class AppRoutingModule { }\r\n","import { Injectable, Injector } from '@angular/core';\r\nimport { Observable } from 'rxjs';\r\nimport { HttpRequest, HttpHandler, HttpEvent, HttpInterceptor} from '@angular/common/http';\r\nimport { TenantService } from './tenant.service';\r\n\r\n@Injectable()\r\n\r\nexport class AuthInterceptorService implements HttpInterceptor {\r\n constructor(private injector: Injector, private tenantService: TenantService) {}\r\n intercept(request: HttpRequest, next: HttpHandler): Observable> {\r\n let finalTenantId:any;\r\n const injectTenant = this.injector.get(TenantService);\r\n let serviceTenant:any = injectTenant.getCurrentTenant();\r\n\r\n if (serviceTenant?.tenantId && serviceTenant.tenantId > 0) {\r\n finalTenantId = serviceTenant.tenantId;\r\n }\r\n \r\n request = request.clone({\r\n setHeaders: {\r\n tenantId: `${finalTenantId}`\r\n }\r\n })\r\n return next.handle(request);\r\n }\r\n}","import { Injectable } from '@angular/core';\r\nimport { HttpClient } from '@angular/common/http';\r\nimport { GraphService } from './graph.service';\r\nimport { Globals } from '../models/globals.model';\r\nimport { MsalService } from '@azure/msal-angular';\r\nimport { InteractionRequiredAuthError, AuthError } from '@azure/msal-browser';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\n\r\nexport class OverageService {\r\n\r\n groups: string[] = [];\r\n\r\n constructor(private http: HttpClient, private globals: Globals) {\r\n }\r\n\r\n readGraphGroups(authService: MsalService, service: GraphService, methodRef: (objRef: any) => void, objRef): void {\r\n service.getGroups().subscribe({\r\n next: (response: any) => {\r\n this.getGroupId(response.value);\r\n if (response['@odata.nextLink']) {\r\n this.handleNextPageWithMethodRef(service, response['@odata.nextLink'], methodRef, objRef)\r\n } else {\r\n this.syncGroupswithRef(service, methodRef, objRef);\r\n }\r\n },\r\n error: (err: AuthError) => {\r\n // If there is an interaction required error,\r\n // call one of the interactive methods and then make the request again.\r\n if (InteractionRequiredAuthError.isInteractionRequiredError(err.errorCode, err.errorMessage)) {\r\n authService.acquireTokenPopup({\r\n scopes: [this.globals.config.graphApi_client_resourceUri]\r\n })\r\n .subscribe(() => {\r\n service.getGroups()\r\n .toPromise()\r\n .then((response: any) => {\r\n this.getGroupId(response.value);\r\n if (response['@odata.nextLink']) {\r\n this.handleNextPageWithMethodRef(service, response['@odata.nextLink'], methodRef, objRef)\r\n } else {\r\n this.syncGroupswithRef(service, methodRef, objRef);\r\n }\r\n });\r\n });\r\n }\r\n }\r\n });\r\n }\r\n\r\n getGroupId(value) {\r\n return value.map(v => this.groups.push(v.id));\r\n }\r\n\r\n syncGroupswithRef(service: GraphService, methodRef: (objRef: any) => void, objRef) {\r\n service.user.groupIDs = this.groups;\r\n methodRef(objRef);\r\n }\r\n\r\n handleNextPageWithMethodRef(service: GraphService, nextPage, methodRef: (objRef: any) => void, objRef): void {\r\n service.getNextPage(nextPage)\r\n .subscribe((response: any) => {\r\n response.value.map(v => {\r\n if (!this.groups.includes(v.id)) {\r\n this.groups.push(v.id);\r\n }\r\n });\r\n if (response['@odata.nextLink']) {\r\n this.handleNextPageWithMethodRef(service, response['@odata.nextLink'], methodRef, objRef)\r\n } else {\r\n this.syncGroupswithRef(service, methodRef, objRef);\r\n }\r\n });\r\n }\r\n\r\n}\r\n","import { Component, Inject, Optional } from '@angular/core';\r\nimport { MatDialogRef, MAT_DIALOG_DATA } from \"@angular/material/dialog\";\r\n\r\nexport class DialogData {\r\n Version: string;\r\n BuildNumber: string;\r\n DateOfBuild: string;\r\n}\r\n\r\n@Component({\r\n selector: 'app-about',\r\n templateUrl: './about.component.html',\r\n styleUrls: ['../nav-bar/nav-bar.component.css']\r\n})\r\nexport class AboutComponent {\r\n\r\n constructor(\r\n @Optional() public dialogRef: MatDialogRef,\r\n @Optional() @Inject(MAT_DIALOG_DATA) public data: DialogData\r\n ) { }\r\n ngOnInit() {\r\n if (this.data == null) {\r\n this.data = new DialogData();\r\n }\r\n }\r\n // close the about dialog\r\n onNoClick(): void {\r\n this.dialogRef.close();\r\n }\r\n}\r\n","

About Release

\r\n
\r\n \r\n \r\n \r\n \r\n
Version{{data.Version}}
Build Number{{data.BuildNumber}}
Build Date{{data.DateOfBuild}}
\r\n
\r\n
\r\n
\r\n \r\n
\r\n","import { NgModule } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\n\r\n\r\n\r\n@NgModule({\r\n declarations: [],\r\n imports: [\r\n CommonModule\r\n ]\r\n})\r\nexport class ThemeModule { }\r\nexport interface Theme {\r\n name: string;\r\n properties: any;\r\n}\r\n\r\nexport const light: Theme = {\r\n name: \"light\",\r\n properties: {\r\n \"--background-default\": \"#FFFFFF\",\r\n \"--background-item-box\": \"#FFFFFF\",\r\n \"--heading-item-box\": \"#000000\",\r\n \"--background-right-default\": \"#FFFFFF\",\r\n \"--background-chart-box\": \"#FFFFFF\",\r\n }\r\n};\r\n\r\nexport const dark: Theme = {\r\n name: \"dark\",\r\n properties: {\r\n \"--background-default\": \"#2C2C2C\",\r\n \"--background-item-box\": \"#576271\",\r\n \"--heading-item-box\": \"#FFFFFF\",\r\n \"--background-right-default\": \"#707070\",\r\n \"--background-chart-box\": \"#FFFFFF\",\r\n }\r\n};\r\n","import { Injectable } from \"@angular/core\";\r\nimport { Theme, light, dark } from '../theme/theme.module';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class ThemeService {\r\n private active: Theme = light;\r\n\r\n isDarkTheme(): boolean {\r\n return this.active.name === dark.name;\r\n }\r\n\r\n setDarkTheme(): void {\r\n this.setActiveTheme(dark);\r\n }\r\n\r\n setLightTheme(): void {\r\n this.setActiveTheme(light);\r\n }\r\n\r\n setActiveTheme(theme: Theme): void {\r\n this.active = theme;\r\n\r\n Object.keys(this.active.properties).forEach(property => {\r\n document.documentElement.style.setProperty(\r\n property,\r\n this.active.properties[property]\r\n );\r\n });\r\n }\r\n}\r\n","\r\n\r\n","import { Component, OnInit, ViewEncapsulation, Input, SimpleChanges } from '@angular/core';\r\nimport { MatDialog } from '@angular/material/dialog';\r\nimport { ActivatedRoute, Router } from '@angular/router';\r\nimport * as $ from 'jquery';\r\nimport { MsalService } from '@azure/msal-angular';\r\nimport { AboutComponent } from '../about/about.component';\r\nimport { Globals } from '../models/globals.model';\r\nimport { GlobalService } from '../services/global.service';\r\nimport { ThemeService } from '../services/theme.service';\r\nimport { notification } from '../models/interfaces/notifications';\r\n/*NOSONAR\r\n//import { NotificationService } from '../services/notification-service';\r\n//import { AlertComponent } from '../common/alert/alert.component';\r\n//import { NotificationComponent } from '../notification/notification.component';\r\n*/\r\nimport { MLService } from '../services/ml-service';\r\nimport { Tenant } from '../models/tenant.model';\r\nimport { TenantService } from '../services/tenant.service';\r\nimport { Refinery } from '../models/refinery.model';\r\nimport { concatMap, takeUntil } from 'rxjs/operators';\r\nimport { Subject } from 'rxjs';\r\n\r\n\r\n@Component({\r\n selector: 'app-nav-bar',\r\n templateUrl: './nav-bar.component.html',\r\n styleUrls: ['./nav-bar.component.css'],\r\n encapsulation: ViewEncapsulation.None\r\n})\r\nexport class NavBarComponent implements OnInit {\r\n userName: string;\r\n userShortName: string;\r\n notification: notification[] = [];\r\n unreadNotifications: number = 0;\r\n rbacName: string = '';\r\n countryCode: any;\r\n countryList: any;\r\n releaseDetails: any;\r\n /*NOSONAR\r\n //zeroNotification = false;\r\n //errorNotification = false;\r\n //notificationLimit = 10;\r\n //hideNotificationNumber = false;\r\n */\r\n dateString: string;\r\n tenantList: Tenant[];\r\n tenantName: string;\r\n tenantId: number;\r\n refineryName: string;\r\n refineryList: string[];\r\n refinerytMap: Refinery[];\r\n public destroyed = new Subject();\r\n @Input() data: string;\r\n\r\n constructor(private authService: MsalService, public mlServie: MLService,\r\n public dialog: MatDialog, public globals: Globals, public globalService: GlobalService,\r\n /*NOSONAR\r\n public notificationService: NotificationService,\r\n */\r\n private tenantService: TenantService,\r\n public themeService: ThemeService, public _router: Router,\r\n public route: ActivatedRoute) {\r\n this.countryList = [\r\n {\r\n 'Id': 1,\r\n 'Name': 'English',\r\n 'Code': 'EN',\r\n }\r\n ];\r\n }\r\n ngOnInit() {\r\n this.themeService.setDarkTheme();\r\n this.getReleaseDetails();\r\n this.countryCode = 'EN';\r\n $('#handberg').click(function () {\r\n $('.row-offcanvas').toggleClass('active');\r\n $('.collapse').toggleClass('in').toggleClass('hidden-xs').toggleClass('visible-xs');\r\n });\r\n $('#close-sidebar').click(function () {\r\n $('.page-wrapper').removeClass('toggled');\r\n });\r\n $('#show-sidebar').click(function () {\r\n $('.page-wrapper').addClass('toggled');\r\n });\r\n this.tenantService.getTenants()\r\n .pipe(\r\n takeUntil(this.destroyed),\r\n concatMap(async (data: Refinery[]) => {\r\n let item = data.filter(item => item.tenantList[0] != undefined && item.tenantList.length > 0);\r\n this.refineryList = item.map(a => a.refineryName);\r\n this.refinerytMap = item;\r\n this.checkActivatedTenant();\r\n })\r\n ).subscribe()\r\n\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.destroyed.next();\r\n this.destroyed.complete();\r\n }\r\n /**\r\n * checks if any tenant is activated\r\n */\r\n checkActivatedTenant() {\r\n let tenantPopulated = false;\r\n this.refinerytMap.forEach(ref => {\r\n const selectedTenantIndex = ref.tenantList.findIndex(ten => ten.isSelected);\r\n if (selectedTenantIndex >= 0) {\r\n this.populateTenant(ref.refineryName, true, selectedTenantIndex);\r\n tenantPopulated = true;\r\n }\r\n });\r\n if (!tenantPopulated) {\r\n this.populateTenant(this.refineryList[0], true, 0);\r\n }\r\n }\r\n /**\r\n * Used for switching tenants and redirection to particular page\r\n * @param isCallFromUI to check call from UI\r\n */\r\n populateTenant(refineryName: string, isCallFromUI?: boolean, tenantIndex?: number) {\r\n if (this.refinerytMap && this.refinerytMap.length > 0) {\r\n this.refinerytMap.some((u) => {\r\n if (refineryName === u.refineryName) {\r\n this.refineryName = refineryName;\r\n this.tenantList = u.tenantList;\r\n this.tenantName = this.tenantList[tenantIndex].tenantName;\r\n this.onTenantChange(this.tenantList[tenantIndex], isCallFromUI);\r\n }\r\n });\r\n }\r\n }\r\n logout() {\r\n this.authService.logout();\r\n }\r\n // show about dialog for version, build date and build number\r\n openAboutRelease(): void {\r\n this.dialog.open(AboutComponent, {\r\n data: this.releaseDetails,\r\n });\r\n \r\n }\r\n /*NOSONAR\r\n //getNotification() {\r\n // this.notificationService.getTopNotificationList().subscribe((data: any): void => {\r\n // let notificationsList = data.Notifications;\r\n // if (notificationsList && notificationsList.length > 0) {\r\n // this.zeroNotification = false;\r\n // this.notification = notificationsList.sort((a, b) => a.acknowledged - b.acknowledged);\r\n // this.unreadNotifications = data.UnreadCount;\r\n // } else if (notificationsList.length == 0) {\r\n // this.unreadNotifications = 0;\r\n // this.zeroNotification = true;\r\n // }\r\n // }, (error: Error) => {\r\n // this.errorNotification = true;\r\n // this.globalService.showAlert(AlertComponent, { success: false, message: 'Error getting notifications' });\r\n // });\r\n //}\r\n\r\n //dropdownStatus(event) {\r\n // if (event) {\r\n // this.dateString = new Date().toISOString();\r\n // this.hideNotificationNumber = true;\r\n // this.notificationService.markReadTopNotification(this.dateString);\r\n // } else {\r\n // this.hideNotificationNumber = false;\r\n // }\r\n //}\r\n //notificationOpen() {\r\n // this.hideNotificationNumber = true;\r\n // this.dateString = new Date().toISOString();\r\n //}\r\n\r\n //notificationClose() {\r\n // this.hideNotificationNumber = false;\r\n // this.notificationService.markReadTopNotification(this.dateString);\r\n //}\r\n */\r\n getReleaseDetails() {\r\n this.releaseDetails = this.globals.releaseDetails;\r\n }\r\n\r\n selectFlag(Code: any) {\r\n this.countryCode = Code;\r\n }\r\n toggleTheme() {\r\n if (this.themeService.isDarkTheme()) {\r\n this.themeService.setLightTheme();\r\n } else {\r\n this.themeService.setDarkTheme();\r\n }\r\n }\r\n /*NOSONAR\r\n //showAllNotification() {\r\n // this.globalService.openModelWindow(null, this, NotificationComponent, '80%', 'custom-modalbox', this.notification);\r\n //}\r\n\r\n //ngOnChanges(changes: SimpleChanges): void {\r\n // if (this.globalService.isNotNull(changes.data.currentValue)) {\r\n // this.getNotification();\r\n // }\r\n //}\r\n */\r\n /**\r\n * Used for switching tenants and redirection to particular page\r\n * @param tenant tenant to be updated\r\n */\r\n onTenantChange(tenant: Tenant, isCallFromUI?: boolean) {\r\n this.tenantName = tenant.tenantName;\r\n this.tenantId = tenant.tenantId;\r\n this.tenantService.setCurrentTenant(tenant);\r\n if (isCallFromUI) {\r\n this._router.navigate(['flowsheet']);\r\n }\r\n /*NOSONAR\r\n //this.getNotification();\r\n */\r\n }\r\n}\r\n","\r\n
\r\n \r\n \r\n \r\n
\r\n
\r\n \r\n \r\n 6)?'horizontalMenu':'verticalMenu'\" [disableClose]=\"true\" #sidenav mode=\"side\" class=\"example-sidenav\" [ngStyle]=\"{ 'width.em': sidenavWidth }\" opened=\"true\">\r\n \r\n\r\n \r\n
\r\n
Flowsheet
\r\n
\r\n
\r\n
Builder
\r\n
\r\n
\r\n
\r\n
\r\n\r\n 6)?'collapsedMatSidenavContent':'non-collapsedMatSidenavContent'\">\r\n
\r\n \r\n
\r\n
\r\n\r\n\r\n
\r\n\r\n\r\n","import { Component, HostListener, Inject, Input, OnInit } from '@angular/core';\r\nimport { Router } from \"@angular/router\";\r\nimport { AuthenticationResult, EventMessage, EventType, PopupRequest } from '@azure/msal-browser';\r\nimport { Subject } from 'rxjs';\r\nimport { concatMap, filter, takeUntil } from 'rxjs/operators';\r\nimport { Globals } from './models/globals.model';\r\nimport { MsalBroadcastService, MsalService, MSAL_GUARD_CONFIG, MsalGuardConfiguration } from '@azure/msal-angular';\r\nimport { GlobalService } from './services/global.service';\r\nimport { GraphService } from './services/graph.service';\r\nimport { HttpService } from './services/http.service';\r\nimport { OverageService } from './services/overage.service';\r\nimport { ApplicationInsights } from '@microsoft/applicationinsights-web';\r\nimport { TenantService } from './services/tenant.service';\r\nimport { AppConstants } from './app.constants';\r\n\r\n@Component({\r\n selector: 'app-root',\r\n templateUrl: './app.component.html',\r\n styleUrls: ['./app.component.css']\r\n})\r\n\r\nexport class AppComponent implements OnInit {\r\n\r\n isLoading: boolean;\r\n response: any;\r\n @Input('ngModel') model: any;\r\n disableTooltip = false;\r\n sidenavWidth = 3.5;\r\n showCross = false;\r\n isAuthorize: boolean = false;\r\n isActivate: boolean = true;\r\n appInsights: ApplicationInsights;\r\n appInsightKey: any;\r\n isMenuOpen: boolean = false;\r\n\r\n\r\n private readonly _destroying$ = new Subject();\r\n\r\n constructor(private authService: MsalService,\r\n @Inject(MSAL_GUARD_CONFIG) private msalGuardConfig: MsalGuardConfiguration,\r\n private msalBroadcastService: MsalBroadcastService,\r\n private grphService: GraphService,\r\n private overageService: OverageService,\r\n public _router: Router, private httpService: HttpService, private tenantService: TenantService,\r\n public globals: Globals, private globalService: GlobalService) {\r\n this.countryList = [\r\n {\r\n \"Id\": 1,\r\n \"Name\": \"Dutch\",\r\n \"Code\": \"NL\",\r\n },\r\n {\r\n \"Id\": 2,\r\n \"Name\": \"English\",\r\n \"Code\": \"EN\",\r\n },\r\n {\r\n \"Id\": 3,\r\n \"Name\": \"French\",\r\n \"Code\": \"FR\",\r\n },\r\n {\r\n \"Id\": 4,\r\n \"Name\": \"German\",\r\n \"Code\": \"DE\",\r\n },\r\n ];\r\n }\r\n\r\n\r\n title = 'Platform';\r\n countryList: any;\r\n data: any;\r\n countryCode: any;\r\n isMobileResolution: boolean;\r\n screenWidth: any;\r\n currentComponent: number;\r\n\r\n @HostListener('window:resize', ['$event'])\r\n getScreenSize() {\r\n this.screenWidth = window.innerWidth;\r\n if (this.screenWidth < 768) {\r\n this.isMobileResolution = true;\r\n }\r\n else {\r\n this.isMobileResolution = false;\r\n }\r\n }\r\n\r\n public ngOnInit() {\r\n this.isLoading = true;\r\n this.initialize();\r\n this.countryCode = \"EN\";\r\n }\r\n\r\n /**\r\n * detects current component as per current url\r\n * sets component id as per url detected.\r\n */\r\n detectCurrentComponent() {\r\n this.currentComponent = AppConstants.componentId;\r\n }\r\n\r\n initialize() { \r\n this.msalBroadcastService.msalSubject$\r\n .pipe(\r\n filter((msg: EventMessage) => msg.eventType === EventType.LOGIN_SUCCESS || msg.eventType === EventType.ACQUIRE_TOKEN_SUCCESS),\r\n takeUntil(this._destroying$),\r\n concatMap(async () => this.checkoutAccount())\r\n ).subscribe()\r\n }\r\n\r\n login() {\r\n if (this.msalGuardConfig.authRequest){\r\n this.authService.loginPopup({...this.msalGuardConfig.authRequest} as PopupRequest)\r\n .subscribe((response: AuthenticationResult) => {\r\n this.authService.instance.setActiveAccount(response.account);\r\n this.checkoutAccount();\r\n });\r\n } else {\r\n this.authService.loginPopup()\r\n .subscribe((response: AuthenticationResult) => {\r\n this.authService.instance.setActiveAccount(response.account);\r\n });\r\n }\r\n }\r\n\r\n checkoutAccount() {\r\n let activeAccount = this.authService.instance.getActiveAccount();\r\n\r\n if (!activeAccount && this.authService.instance.getAllAccounts().length > 0) {\r\n let accounts = this.authService.instance.getAllAccounts();\r\n this.authService.instance.setActiveAccount(accounts[0]);\r\n }\r\n \r\n let userAccount = this.authService.instance.getAllAccounts()[0];\r\n if (userAccount?.name && this.globals.userName == '') {\r\n this.globals.userName = userAccount.name;\r\n let idParts = userAccount.name.split(' ');\r\n if (idParts.length > 1 ) { \r\n this.globals.userShortName = idParts[0].charAt(0) + idParts[1].charAt(0);\r\n this.globalService.loggedInUser = idParts[0] + ' ' + idParts[1];\r\n }\r\n else{\r\n this.globals.userShortName = idParts[0].charAt(0);\r\n this.globalService.loggedInUser = idParts[0];\r\n }\r\n //set user details in global session \r\n this.globals.userEmail = userAccount.username;\r\n // call appinsight\r\n this.initAppInsight(this);\r\n if (this.globals.groups.length === 0) {\r\n this.overageService.readGraphGroups(this.authService, this.grphService, this.assignRole, this);\r\n }\r\n }\r\n }\r\n\r\n initAppInsight(thisRef: AppComponent) {\r\n let appInsightKey = (thisRef.globals.config.appInsightKey) ? thisRef.globals.config.appInsightKey : \"test\";\r\n this.appInsights = new ApplicationInsights({\r\n config: {\r\n instrumentationKey: appInsightKey,\r\n enableAutoRouteTracking: true\r\n }\r\n });\r\n this.appInsights.loadAppInsights();\r\n this.setUserId();\r\n this.logPageView();\r\n }\r\n\r\n logPageView(name?: string, url?: string, properties?: any, measurements?: any) {\r\n this.appInsights.trackPageView({\r\n name: name,\r\n uri: url,\r\n properties: properties,\r\n measurements: measurements\r\n });\r\n }\r\n setUserId() {\r\n this.appInsights.setAuthenticatedUserContext(this.globals.userEmail);\r\n this.appInsights.context.user.id = this.globals.userEmail;\r\n }\r\n\r\n assignRole(thisRef: AppComponent) {\r\n thisRef.globals.groups.push(\r\n thisRef.globals.config.groups_client_FlowsheetBuilderUserGroupId, \r\n thisRef.globals.config.groups_client_PlatformAdminGroupId\r\n );\r\n if (thisRef.grphService.user.groupIDs.includes(thisRef.globals.config.groups_client_PlatformAdminGroupId)) {\r\n thisRef.globals.rbacName = 'Platform Admin';\r\n }\r\n else if (thisRef.grphService.user.groupIDs.includes(thisRef.globals.config.groups_client_FlowsheetBuilderUserGroupId)) {\r\n thisRef.globals.rbacName = 'Flowsheet Builder User';\r\n }\r\n else {\r\n thisRef.globals.rbacName = 'User';\r\n }\r\n thisRef.detectCurrentComponent();\r\n thisRef.tenantService.getTenantListFromServer(thisRef.currentComponent);\r\n thisRef.isLoading = false;\r\n }\r\n\r\n // toggle side navigation drawer\r\n toggleCollapse() {\r\n if (this.sidenavWidth === 3.5) {\r\n this.disableTooltip = true;\r\n this.showCross = true;\r\n this.sidenavWidth = 15.5;\r\n this.isMenuOpen = true;\r\n } else {\r\n this.disableTooltip = false;\r\n this.showCross = false;\r\n this.sidenavWidth = 3.5;\r\n this.isMenuOpen = false;\r\n }\r\n }\r\n\r\n isActive(label): boolean {\r\n if (this._router.url.includes(label)) {\r\n return this._router.url.includes(label);\r\n }\r\n }\r\n\r\n selectFlag(Code: any) {\r\n this.countryCode = Code;\r\n }\r\n\r\n}\r\n","import { Injectable } from \"@angular/core\";\r\nimport { HttpInterceptor, HttpXsrfTokenExtractor, HttpEvent, HttpHandler, HttpRequest } from \"@angular/common/http\";\r\nimport { Observable } from \"rxjs\";\r\n\r\n\r\n@Injectable()\r\nexport class XsrfInterceptor implements HttpInterceptor {\r\n constructor(private xsrfTokenExtractor: HttpXsrfTokenExtractor) {\r\n }\r\n\r\n intercept(req: HttpRequest, next: HttpHandler): Observable> {\r\n // load token\r\n let xsrfToken = this.xsrfTokenExtractor.getToken();\r\n if (req.url.indexOf('/api') > -1) {\r\n if (xsrfToken != null) {\r\n // create a copy of the request and\r\n // append the XSRF token to the headers list\r\n const authorizedRequest = req.clone({\r\n withCredentials: false,\r\n headers: req.headers.set('X-XSRF-TOKEN', xsrfToken)\r\n });\r\n\r\n return next.handle(authorizedRequest);\r\n } else {\r\n return next.handle(req);\r\n }\r\n }\r\n else {\r\n return next.handle(req);\r\n }\r\n }\r\n}\r\n","import { DragDropModule } from '@angular/cdk/drag-drop';\r\nimport { APP_BASE_HREF } from '@angular/common';\r\nimport { HttpClient, HttpClientModule, HTTP_INTERCEPTORS } from '@angular/common/http';\r\nimport { APP_INITIALIZER, CUSTOM_ELEMENTS_SCHEMA, NgModule, NO_ERRORS_SCHEMA } from '@angular/core';\r\nimport { FormsModule, ReactiveFormsModule } from '@angular/forms';\r\nimport { MatAutocompleteModule } from '@angular/material/autocomplete';\r\nimport { MatCheckboxModule } from '@angular/material/checkbox';\r\nimport { MatNativeDateModule, MatRippleModule } from '@angular/material/core';\r\nimport { MatDatepickerModule } from '@angular/material/datepicker';\r\nimport { MatDialogModule } from '@angular/material/dialog';\r\nimport { MatFormFieldModule } from '@angular/material/form-field';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatInputModule } from '@angular/material/input';\r\nimport { MatListModule } from '@angular/material/list';\r\nimport { MatMenuModule } from '@angular/material/menu';\r\nimport { MatPaginatorModule } from '@angular/material/paginator';\r\nimport { MatRadioModule } from '@angular/material/radio';\r\nimport { MatSelectModule } from '@angular/material/select';\r\nimport { MatSidenavModule } from '@angular/material/sidenav';\r\nimport { MatSortModule } from '@angular/material/sort';\r\nimport { MatStepperModule } from '@angular/material/stepper';\r\nimport { MatTableModule } from '@angular/material/table';\r\nimport { MatTabsModule } from '@angular/material/tabs';\r\nimport { MatToolbarModule } from '@angular/material/toolbar';\r\nimport { MatTooltipModule } from '@angular/material/tooltip';\r\nimport { BrowserModule } from '@angular/platform-browser';\r\nimport { BrowserAnimationsModule } from '@angular/platform-browser/animations';\r\nimport { BrowserCacheLocation, InteractionType, IPublicClientApplication, PublicClientApplication } from '@azure/msal-browser';\r\nimport { NgbModule } from '@ng-bootstrap/ng-bootstrap';\r\nimport { NgMultiSelectDropDownModule } from 'ng-multiselect-dropdown';\r\nimport { OwlDateTimeModule, OwlNativeDateTimeModule } from '@danielmoncada/angular-datetime-picker';\r\nimport { TypeaheadModule } from 'ngx-bootstrap/typeahead';\r\nimport { AboutComponent } from './about/about.component';\r\nimport { AppRoutingModule } from './app-routing.module';\r\nimport { AuthInterceptorService } from './services/auth.interceptor';\r\n/** Components*/\r\nimport { AppComponent } from './app.component';\r\nimport { AlertComponent } from './common/alert/alert.component';\r\nimport { ConfirmModelComponent } from './common/confirm-model/confirm-model.component';\r\nimport { ConnectorSpecificationComponent } from './flowsheet-builder/connector-specification/connector-specification.component';\r\nimport { DataSourceManagerComponent } from './flowsheet-builder/data-source-manager/data-source-manager.component';\r\nimport { FlowsheetBuilderComponent } from './flowsheet-builder/flowsheet-builder.component';\r\nimport { FlowSheetEventsHandler } from './flowsheet/flowsheet-events/flowsheet.events.handler';\r\nimport { FlowSheetComponent } from './flowsheet/flowsheet.component';\r\nimport { RenameModelComponent } from './flowsheet/rename-model/rename-model.component';\r\nimport { SaveFlowSheetComponent } from './flowsheet/save-flowsheet/save-flowsheet.component';\r\nimport { Globals } from './models/globals.model';\r\nimport { \r\n MsalBroadcastService, \r\n MsalGuard, \r\n MsalInterceptor, \r\n MsalService, \r\n MSAL_INSTANCE, \r\n MSAL_GUARD_CONFIG, \r\n MSAL_INTERCEPTOR_CONFIG, \r\n MsalGuardConfiguration, \r\n MsalInterceptorConfiguration} from '@azure/msal-angular';\r\nimport { NavBarComponent } from './nav-bar/nav-bar.component';\r\nimport { OverageComponent } from './overage/overage.component';\r\nimport { MatChipsModule } from '@angular/material/chips';\r\n\r\n/** Services */\r\nimport { GlobalService } from './services/global.service';\r\nimport { HttpService } from './services/http.service';\r\nimport { MatTableExporterModule } from 'mat-table-exporter';\r\nimport { AddFilterComponent } from './common/add-filter/add-filter.component';\r\nimport { NotificationComponent } from './notification/notification.component';\r\nimport { XsrfInterceptor } from './services/xsrf.interceptor';\r\nimport { ViewFlowsheetComponent } from './flowsheet/view-flowsheet/view-flowsheet.component';\r\nimport { FlowSheetRunResultsComponent } from './flowsheet/flowsheet-run-results/flowsheet-run-results.component';\r\nimport { FlowSheetRunDetailsComponent } from './flowsheet/flowsheet-run-details/flowsheet-run-details.component';\r\nimport { environment } from 'src/environments/environment';\r\n\r\nlet enValue = environment;\r\n// checks if the app is running on IE\r\nexport const isIE = window.navigator.userAgent.indexOf('MSIE ') > -1 || window.navigator.userAgent.indexOf('Trident/') > -1;\r\n\r\nexport const protectedResourceMap: [string, string[]][] = [\r\n [enValue.flowsheetApi_client_resourceUri, [enValue.flowsheetApi_client_resourceScope]],\r\n [enValue.graphApi_client_resourceUri, [enValue.graphApi_client_resourceScope]],\r\n [enValue.modelManagementApi_client_resourceUri, [enValue.modelManagementApi_client_resourceScope]],\r\n [enValue.platformAdminApi_client_resourceUri, [enValue.platformAdminApi_client_resourceScope]]\r\n];\r\n\r\nfunction MSALInstanceFactory(): IPublicClientApplication {\r\n return new PublicClientApplication({\r\n auth: {\r\n clientId: enValue.clientId,\r\n redirectUri: enValue.redirectUri,\r\n authority: enValue.authority,\r\n postLogoutRedirectUri: enValue.postLogoutRedirectUri,\r\n },\r\n cache: {\r\n cacheLocation: enValue.cache_client.cacheLocation,\r\n storeAuthStateInCookie: isIE, // set to true for IE 11\r\n }\r\n });\r\n}\r\n\r\nfunction MSALInterceptorConfigFactory(): MsalInterceptorConfiguration {\r\n const protectedResourceMap = new Map>();\r\n protectedResourceMap.set(enValue.flowsheetApi_client_resourceUri, [enValue.flowsheetApi_client_resourceScope]);\r\n protectedResourceMap.set(enValue.graphApi_client_resourceUri, [enValue.graphApi_client_resourceScope]);\r\n protectedResourceMap.set(enValue.modelManagementApi_client_resourceUri, [enValue.modelManagementApi_client_resourceScope]);\r\n protectedResourceMap.set(enValue.platformAdminApi_client_resourceUri, [enValue.platformAdminApi_client_resourceScope]);\r\n\r\n return {\r\n interactionType: InteractionType.Popup,\r\n protectedResourceMap,\r\n };\r\n}\r\n\r\n@NgModule({\r\n declarations: [\r\n AppComponent,\r\n NavBarComponent,\r\n OverageComponent,\r\n AboutComponent,\r\n FlowSheetComponent,\r\n AlertComponent,\r\n ConfirmModelComponent,\r\n SaveFlowSheetComponent,\r\n FlowsheetBuilderComponent,\r\n ConnectorSpecificationComponent,\r\n ViewFlowsheetComponent,\r\n DataSourceManagerComponent,\r\n FlowSheetRunResultsComponent,\r\n FlowSheetRunDetailsComponent,\r\n RenameModelComponent,\r\n AddFilterComponent,\r\n NotificationComponent\r\n ],\r\n imports: [\r\n BrowserModule,\r\n HttpClientModule,\r\n FormsModule,\r\n ReactiveFormsModule,\r\n MatStepperModule,\r\n MatToolbarModule,\r\n MatIconModule,\r\n MatTabsModule,\r\n MatSidenavModule,\r\n MatMenuModule,\r\n MatFormFieldModule,\r\n MatSelectModule,\r\n MatListModule,\r\n MatTooltipModule,\r\n MatTableModule,\r\n MatDialogModule,\r\n MatInputModule,\r\n MatSortModule,\r\n MatPaginatorModule,\r\n MatRadioModule,\r\n MatAutocompleteModule,\r\n MatChipsModule,\r\n BrowserAnimationsModule,\r\n NgbModule,\r\n MatTableExporterModule,\r\n NgMultiSelectDropDownModule.forRoot(),\r\n AppRoutingModule,\r\n TypeaheadModule.forRoot(),\r\n MatDatepickerModule,\r\n MatNativeDateModule,\r\n MatRippleModule,\r\n OwlDateTimeModule,\r\n OwlNativeDateTimeModule,\r\n MatCheckboxModule,\r\n DragDropModule\r\n ],\r\n schemas: [CUSTOM_ELEMENTS_SCHEMA, NO_ERRORS_SCHEMA],\r\n providers: [\r\n {\r\n provide: APP_INITIALIZER, \r\n useValue: () => new Promise(resolve =>\r\n setTimeout(resolve, 2000)\r\n ),\r\n multi: true\r\n },\r\n { provide: HTTP_INTERCEPTORS, useClass: XsrfInterceptor, multi: true },\r\n {\r\n provide: HTTP_INTERCEPTORS,\r\n useClass: MsalInterceptor,\r\n multi: true\r\n },\r\n { \r\n provide: HTTP_INTERCEPTORS, \r\n useClass: AuthInterceptorService, \r\n multi: true \r\n },\r\n {\r\n provide: MSAL_INSTANCE,\r\n useFactory: MSALInstanceFactory\r\n },\r\n {\r\n provide: MSAL_GUARD_CONFIG,\r\n useValue: {\r\n interactionType: InteractionType.Redirect\r\n } as MsalGuardConfiguration\r\n },\r\n {\r\n provide: MSAL_INTERCEPTOR_CONFIG,\r\n useFactory: MSALInterceptorConfigFactory\r\n },\r\n MsalService,\r\n MsalGuard,\r\n MsalBroadcastService,\r\n Globals,\r\n { provide: APP_BASE_HREF, useValue: '/' }, HttpService, GlobalService,\r\n FlowSheetEventsHandler\r\n ],\r\n bootstrap: [AppComponent]\r\n})\r\nexport class AppModule {\r\n\r\n constructor(public globalService: GlobalService, public globals: Globals, public http: HttpClient) {\r\n\r\n // global config details\r\n this.globals.config = enValue;\r\n\r\n this.globals.releaseDetails = enValue.ReleaseDetails;\r\n\r\n // Check Subscription\r\n this.globals.subscription = enValue.subscription;\r\n this.globalService.environment = enValue.environment;\r\n\r\n // Check Tag Movement Environment\r\n //this.globalService.tagMovMsg = enValue.moveTagMasterMsg;\r\n }\r\n}\r\n","/***************************************************************************************************\r\n * Load `$localize` onto the global scope - used if i18n tags appear in Angular templates.\r\n */\r\nimport '@angular/localize/init';\r\nimport './polyfills.ts';\r\nimport { enableProdMode } from '@angular/core';\r\nimport { platformBrowserDynamic } from '@angular/platform-browser-dynamic';\r\n\r\nimport { AppModule } from './app/app.module';\r\nimport { environment } from './environments/environment';\r\n\r\nexport function getBaseUrl() {\r\n return document.getElementsByTagName('base')[0].href;\r\n}\r\n\r\nconst providers = [\r\n { provide: 'BASE_URL', useFactory: getBaseUrl, deps: [] }\r\n];\r\n\r\nif (environment.production) {\r\n enableProdMode();\r\n}\r\n\r\nplatformBrowserDynamic(providers).bootstrapModule(AppModule)\r\n .catch(err => console.log(err));\r\n"],"x_google_ignoreList":[]}