-
Notifications
You must be signed in to change notification settings - Fork 0
/
main-es5.1d1ea700449735343db6.js.map
1 lines (1 loc) · 306 KB
/
main-es5.1d1ea700449735343db6.js.map
1
{"version":3,"sources":["webpack:///src/app/components/side-bar/tag-images/form-generator/form-fields/form-dropdown/form-dropdown.component.html","webpack:///src/app/components/side-bar/select-image/select-image.component.html","webpack:///src/app/components/modal-file-browser/modal-file-browser.component.html","webpack:///src/app/components/side-bar/tag-images/form-generator/form-fields/form-file/form-file.component.scss","webpack:///src/app/components/side-bar/tag-images/form-generator/form-fields/form-file/form-file.component.html","webpack:///src/app/components/notfound/notfound.component.scss","webpack:///src/app/components/modal-download-selector/modal-download-selector.component.html","webpack:///src/app/components/main/main.component.scss","webpack:///src/app/components/main/main.component.html","webpack:///src/app/components/notfound/notfound.component.html","webpack:///src/app/components/modal-download-selector/modal-download-selector.component.scss","webpack:///src/app/components/side-bar/tag-images/form-generator/form-fields/form-color/form-color.component.scss","webpack:///src/app/components/side-bar/select-group/select-group.component.scss","webpack:///src/app/components/side-bar/side-bar.component.scss","webpack:///src/app/components/side-bar/tag-generator/tag-generator.component.html","webpack:///src/app/components/image-gallery/image-gallery.component.scss","webpack:///src/app/components/modal-share-project/modal-share-project.component.html","webpack:///src/app/components/image-gallery/image-gallery.component.html","webpack:///src/app/components/side-bar/tag-images/form-generator/form-fields/form-fields.component.html","webpack:///src/app/components/side-bar/select-image/select-image.component.scss","webpack:///src/app/app.component.html","webpack:///src/app/components/callback/callback.component.html","webpack:///src/app/components/image-box/image-box.component.html","webpack:///src/app/components/side-bar/side-bar.component.html","webpack:///src/$_lazy_route_resource lazy namespace object","webpack:///src/app/components/side-bar/tag-generator/tag-generator.component.scss","webpack:///src/app/components/side-bar/tag-images/form-generator/form-fields/form-textbox/form-textbox.component.html","webpack:///src/app/components/modal-share-project/modal-share-project.component.scss","webpack:///src/app/components/map/map.component.html","webpack:///src/app/components/side-bar/tag-images/form-generator/form-fields/form-radio/form-radio.component.html","webpack:///src/app/components/modal-create-project/modal-create-project.component.scss","webpack:///src/app/components/image-box/image-box.component.scss","webpack:///src/app/components/side-bar/tag-images/form-generator/form-generator.component.scss","webpack:///src/app/components/side-bar/tag-images/form-generator/form-fields/form-color/form-color.component.html","webpack:///src/app/components/modal-current-project/modal-current-project.component.html","webpack:///src/app/components/modal-create-project/modal-create-project.component.html","webpack:///src/app/components/map/map.component.scss","webpack:///src/app/components/side-bar/tag-images/tag-images.component.scss","webpack:///src/app/components/side-bar/select-group/select-group.component.html","webpack:///src/app/components/modal-current-project/modal-current-project.component.scss","webpack:///src/app/components/callback/callback.component.scss","webpack:///src/app/components/modal-file-browser/modal-file-browser.component.scss","webpack:///src/app/components/control-bar/control-bar.component.scss","webpack:///src/app/components/control-bar/control-bar.component.html","webpack:///src/app/components/side-bar/tag-images/form-generator/form-fields/form-checkbox/form-checkbox.component.html","webpack:///src/app/app.component.scss","webpack:///src/app/components/notfound/notfound.component.ts","webpack:///src/environments/environmentType.ts","webpack:///src/app/models/models.ts","webpack:///src/environments/environment.ts","webpack:///src/app/services/authentication.service.ts","webpack:///src/app/services/notifications.service.ts","webpack:///src/app/services/scroll.service.ts","webpack:///src/app/services/geo-data.service.ts","webpack:///src/app/utils/randomColor.ts","webpack:///src/app/components/main/main.component.ts","webpack:///src/app/components/callback/callback.component.ts","webpack:///src/app/services/forms.service.ts","webpack:///src/app/services/groups.service.ts","webpack:///src/app/services/projects.service.ts","webpack:///src/app/components/side-bar/tag-generator/tag-generator.component.ts","webpack:///src/app/components/side-bar/tag-images/tag-images.component.ts","webpack:///src/app/app-routing.module.ts","webpack:///src/app/app.component.ts","webpack:///src/app/utils/leafletUtils.ts","webpack:///src/app/components/map/map.component.ts","webpack:///src/app/services/agave-systems.service.ts","webpack:///src/app/services/tapis-files.service.ts","webpack:///src/app/components/modal-file-browser/modal-file-browser.component.ts","webpack:///src/app/components/modal-download-selector/modal-download-selector.component.ts","webpack:///src/app/components/modal-create-project/modal-create-project.component.ts","webpack:///src/app/components/modal-share-project/modal-share-project.component.ts","webpack:///src/app/components/modal-current-project/modal-current-project.component.ts","webpack:///src/app/services/feature.service.ts","webpack:///src/app/components/control-bar/control-bar.component.ts","webpack:///src/app/app.interceptors.ts","webpack:///src/app/components/image-gallery/image-gallery.component.ts","webpack:///src/app/components/image-box/image-box.component.ts","webpack:///src/app/components/side-bar/tag-images/form-generator/form-generator.component.ts","webpack:///src/app/components/side-bar/side-bar.component.ts","webpack:///src/app/utils/groups.ts","webpack:///src/app/components/side-bar/select-group/select-group.component.ts","webpack:///src/app/components/side-bar/select-image/select-image.component.ts","webpack:///src/app/components/side-bar/tag-images/form-generator/form-fields/form-fields.component.ts","webpack:///src/app/components/side-bar/tag-images/form-generator/form-fields/form-checkbox/form-checkbox.component.ts","webpack:///src/app/components/side-bar/tag-images/form-generator/form-fields/form-dropdown/form-dropdown.component.ts","webpack:///src/app/components/side-bar/tag-images/form-generator/form-fields/form-file/form-file.component.ts","webpack:///src/app/components/side-bar/tag-images/form-generator/form-fields/form-radio/form-radio.component.ts","webpack:///src/app/components/side-bar/tag-images/form-generator/form-fields/form-textbox/form-textbox.component.ts","webpack:///src/app/components/side-bar/tag-images/form-generator/form-fields/form-color/form-color.component.ts","webpack:///src/app/app.module.ts","webpack:///src/main.ts","webpack:///src/app/components/side-bar/tag-images/tag-images.component.html","webpack:///src/app/components/side-bar/tag-images/form-generator/form-generator.component.html"],"names":["__webpack_require__","r","__webpack_exports__","webpackEmptyAsyncContext","req","Promise","resolve","then","e","Error","code","keys","module","exports","id","NotFoundComponent","_classCallCheck","this","_createClass","key","value","tslib_es6","a","Object","core","n","selector","template","EnvironmentType","GroupForm","AssetFilters","bbox","assetType","Set","has","add","Project","ProjectRequest","AuthToken","token","expires","Date","getTime","expires_in","Feature","f","geometry","properties","taggit","groups","tags","type","assets","styles","project_id","length","initialAsset","asset_type","display_path","path","toString","_slicedToArray","exec","slice","Production","Staging","Local","environment","production","apiUrl","clientId","baseHref","backend","AuthenticatedUser","username","email","authentication_service_AuthService","http","router","_currentUser","ReplaySubject","currentUser","asObservable","LS_TOKEN_KEY","LS_USER_KEY","tokenStr","localStorage","getItem","JSON","parse","userToken","isExpired","logout","redirectToauthenticaor","getUserInfo","AUTH_URL","location","origin","Math","random","window","href","removeItem","fromExpiresIn","setItem","stringify","navigate","_this","userStr","user","next","get","subscribe","resp","u","name","fesm2015_http","b","fesm2015_router","C","providedIn","notifications_service_NotificationsService","toastr","authService","TIMEOUT","_notifications","notifications","isLoggedIn","interval","getRecent","_this3","baseUrl","now","toISOString","notes","forEach","note","status","showSuccessToast","message","showErrorToast","success","error","ngx_toastr","ScrollService","scrollRestored","scrollPosition","change","document","documentElement","scrollTop","scroll","top","geo_data_service_GeoDataService","notificationsService","scrollService","_pointClouds","BehaviorSubject","pointClouds","_loaded","loaded","_loadingGallery","loadingGallery","_activeGroupId","activeGroupId","_activeGroup","activeGroup","_tagFeaturesQueue","tagFeaturesQueue","_loadingFeatureProperties","loadingFeatureProperties","_activeGroupFeature","activeGroupFeature","_groups","_groupsFeatures","groupsFeatures","_features","features","features$","_activeFeature","_mapMouseLocation","_basemap","_overlays","_activeOverlay","projectId","feature","fc","map","feat","getGroups","featureId","pipe","first","setFeatures","find","updateFeatureProperty","resetTagFeaturesQueue","_this7","query","arguments","undefined","restoreScroll","qstring","querystring","toJson","setScrollRestored","getFeatures","group","groupFeatures","some","gf","setActiveGroupFeature","updatedTag","tagFeatures","t","includes","push","take","current","title","conversionParams","payload","description","conversion_parameters","post","getPointClouds","groupData","setFeatureProperties","setFeatureStyles","pc","file","form","FormData","append","console","log","files","tmp","system","fileList","showImportErrorToast","remoteFile","system_id","response","importImage","downloadLink","createElement","blob","Blob","URL","createObjectURL","setAttribute","body","appendChild","click","removeChild","feats","addFeature","getValue","activeFeature","ovs","label","minLat","maxLat","minLon","maxLon","toFixed","getOverlays","featureList","Map","filter","set","setActiveGroup","groupName","grp","style","groupProp","getGroupFeatures","uuid","v4","myRandColor","color","i","floor","icon","faIcon","createGroupFeatures","createGroup","deleteGroup","updateGroup","renamedGroup","assign","updateGroupFeatures","reiconedGroup","reiconedStyle","ov","loc","bmap","MainComponent","geoDataService","bsModalService","ngx_foundation","c","CallbackComponent","route","auth","frag","snapshot","fragment","params","URLSearchParams","setToken","forms_service_FormsService","featureGroups","taggedGroup","forms","targetForm","newName","selectedColor","activeProject","tagValue","tagProp","tag","newValues","tagValueObj","featTag","groups_service_GroupsService","_selectedImages","selectedImages","_showTagger","showTagger","_showTagGenerator","showTagGenerator","_groupToAdd","groupToAdd","currentFeatures","newFeatures","imageSelected","projects_service_ProjectsService","_projects","projects","_activeProject","_projectUsers","projectUsers$","_this26","_this27","data","proj","deletable","setActiveProject","put","project","getProjects","tap","users","uname","getProjectUsers","TagGeneratorComponent","formsService","groupsService","dialog","projectsService","formOptions","optionColorFilter","openOption","enabledControls","showSubitem","_this34","formType","formName","formLabel","formValue","formRequired","event","target","formColor","opt","option","selectedGroup","open","toLowerCase","optionFilter","labelFilter","clearLabel","clearOptionColor","clearOption","formItem","options","_step","myOpts","_iterator","_createForOfIteratorHelper","s","done","err","createForm","setShowTagGenerator","clear","esm2015_dialog","tag_images_component_TagImagesComponent","formList","tagName","tagValues","newTagValue","_this35","combineLatest","_ref","grps","grpFts","deleteForm","renameForm","closeAll","Activate","authSvc","state","login","routes","component","canActivate","children","canActivateChild","AppRoutingModule","K","imports","forRoot","onSameUrlNavigation","providers","AppComponent","createMarker","latlng","featureType","ico","leaflet_src","divIcon","className","html","marker","circleMarker","radius","fillColor","weight","opacity","fillOpacity","map_component_MapComponent","GeoDataService","mapType","FeatureGroup","featureClickHandler","bind","mouseEventHandler","_this36","overlays","center","zoom","baseOSM","tileLayer","maxZoom","attribution","satellite","addLayer","loadFeatures","on","ev","activeOverlay","skip","addRemoveOverlay","turf_min","fitBounds","basemap","removeLayer","overlay","imageOverlay","getBounds","mapMouseLocation","_this37","geojsonOptions","pointToLayer","collection","clearLayers","markers","markerClusterGroup","iconCreateFunction","cluster","getChildCount","d","geoJSON","layer","agave_systems_service_AgaveSystemsService","tapis","_systems","systems","_this38","systemsList","result","sys","startsWith","ng_tapis","tapis_files_service_TapisFilesService","popup","_listing","listing","IMPORTABLE_TYPES","ext","getFileExtension","split","pop","offset","limit","filesList","systemId","filePath","arr","replace","join","systemID","fileName","extension","snackbarConfig","duration","horizontalPosition","verticalPosition","fullURL","date","File","lastModified","valueOf","msg","sysStr","lastSystem","fileStr","lastFile","noPreviousSelections","snack_bar","modal_file_browser_component_ModalFileBrowserComponent","_ModalFileBrowserComponent_","ModalFileBrowserComponent_1","tapisFilesService","dialogRef","agaveSystemsService","currentPath","w","allowedExtensions","inProgress","retrievalError","selectedFiles","onClose","Subject","_this40","list","_ref3","myDataSystem","communityDataSystem","publishedDataSystem","selectedSystem","currentDirectory","init","browse","pth","selectedPath","getFiles","_this41","hasMoreFiles","listFiles","shift","getParentPath","unshift","newFile","allowedExt","index","concat","shiftKey","selectFilesShiftClick","checkIfSelectable","addSelectedFile","selectShift","firstFileIndex","saveState","Array","from","values","close","_step2","count","_iterator2","select","addRangeFiles","lastFileIndex","again","maxIndex","max","min","R","modal_download_selector_component_ModalDownloadSelectorComponent","_ModalDownloadSelectorComponent_","ModalDownloadSelectorComponent_1","passbackData","fileExtension","_this42","downloadSelectForm","fesm2015_forms","Name","Extension","_ref5","_this43","dirty","modal_create_project_component_ModalCreateProjectComponent","projCreateForm","projRqst","create","modal_share_project_component_ModalShareProjectComponent","_this44","projShareForm","activeProj","projectUsers","onlyOne","addUserToProject","deleteUserFromProject","modal_current_project_component_ModalCurrentProjectComponent","projData","_this45","confirm","p","update","B","args","feature_service_FeatureService","featureCollection","featListfeat","deleteFeature","delFeats","featListFeature","Number","featProp","saveFeature","control_bar_component_ControlBarComponent","cdr","filesService","featureService","LatLng","invalidNameError","existingNameError","foundFilePaths","_this48","getState","groupsExist","size","_ref7","activeGroupFeatures","activeGroupFeaturesRotate","hasSuccessNotification","hasFailureNotification","selectedProject","item","substring","uploadNewFeature","createBlankFeature","lastProject","selectedLastProject","prj","getDataForProject","hazmapperLink","detectChanges","unselectAllImages","setGroupToAdd","_this49","afterClosed","importFileFromTapis","coordinates","saveFile","height","width","createNewGroup","setScrollPosition","initialGroupName","toggleTagger","featureShortPath","dir","exportFeatures","headerArray","ef","_this51","exportList","exportGroupObj","groupFeature","featureSource","featureObj","src","longitude","latitude","charAt","toUpperCase","v","isJSON","forExport","filename","content","download","csvFiles","exportItem","csvRows","headers","getCSVHeaders","header","zip","jszip_min","csv","generateAsync","url","navigator","userAgent","indexOf","visibility","revokeObjectURL","updateTagFeaturesQueue","k","app_interceptors_AuthInterceptor","request","handle","catchError","reload","statusText","throwError","app_interceptors_TokenInterceptor","clone","setHeaders","Authorization","X-JWT-Assertion-designsafe","jwt","image_gallery_component_ImageGalleryComponent","renderer","spinner","scrolling","imagesExist","scrollSum","_this54","projectsExist","featureListScroll","scrollStatus","_this55","hide","setTimeout","show","appendSum","Z","ngx_spinner","image_box_component_ImageBoxComponent","hasGroup","colors","_this56","featurePath","toggleImageSelect","deleteGroupFeatures","F","form_generator_component_FormGeneratorComponent","checked","colorArray","generateColors","itemCount","isOdd","incrementVal","temp","baseNum","SideBarComponent","_this57","groupIcons","unicode","select_group_component_SelectGroupComponent","iconList","selectedIcon","_this58","groups$","activeGroup$","reiconGroup","renameGroup","unsubscribe","SelectImageComponent","_this59","nextGroup","FormFieldsComponent","FormCheckBoxComponent","_this60","getTagValue","val","setTagFeaturesQueue","FormDropDownComponent","field","_this61","FormFileComponent","FormRadioComponent","_this62","String","FormTextBoxComponent","_this63","FormColorComponent","chosenColor","_this64","chosenTag","_this65","saveStyles","AppModule","declarations","progress_bar","rootUrl","platform_browser","animations","ngx_infinite_scroll","ngx_masonry","menu","toolbar","esm2015_button","tooltip","input","esm2015_checkbox","esm2015_select","esm2015_radio","j","dist","common","progress_spinner","tree","card","provide","multi","useClass","useValue","bootstrap","entryComponents","sb","platform_browser_dynamic","bootstrapModule"],"mappings":"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","file":"main-es5.1d1ea700449735343db6.js","sourcesContent":["export default \"<div>\\n <select\\n class=\\\"form-control\\\"\\n [(ngModel)]=\\\"value\\\"\\n id=\\\"field.name\\\"\\n name=\\\"field.name\\\"\\n (change)=\\\"updateCheckedTag()\\\"\\n >\\n <option *ngFor=\\\"let opt of field\\\" [value]=\\\"opt.label\\\">\\n {{ opt.label }}\\n </option>\\n </select>\\n</div>\\n\"","export default \"<div class=\\\"asset-list\\\">\\n <div class=\\\"subitem-title\\\" (click)=\\\"expandPanel()\\\">Image List</div>\\n\\n <div *ngIf=\\\"showSubitem\\\" class=\\\"subitem asset-subitem\\\">\\n <div\\n *ngFor=\\\"let feature of getActiveFeatures()\\\"\\n (click)=\\\"jumpToImage(feature)\\\"\\n class=\\\"asset-container\\\"\\n [ngClass]=\\\"{ highlight: isActiveFeature(feature) }\\\"\\n >\\n <div class=\\\"name-group\\\">\\n {{ getFeaturePath(feature) }}\\n </div>\\n\\n <div class=\\\"button-group\\\">\\n <div (click)=\\\"deleteFeature(feature)\\\">\\n <i\\n class=\\\"fas fa-minus\\\"\\n matTooltip=\\\"Delete\\\"\\n matTooltipPosition=\\\"above\\\"\\n >\\n </i>\\n </div>\\n </div>\\n </div>\\n </div>\\n</div>\\n\"","export default \"<h4>Select Files</h4>\\n<small\\n ><em>\\n Note: Only files are selectable, not folders. Double click on a folder to\\n navigate into it.\\n </em></small\\n>\\n<hr />\\n<select (ngModelChange)=\\\"selectSystem($event)\\\" [(ngModel)]=\\\"selectedSystem\\\">\\n <option [ngValue]=\\\"myDataSystem\\\">My Data</option>\\n <option [ngValue]=\\\"communityDataSystem\\\">Community Data</option>\\n <option [ngValue]=\\\"publishedDataSystem\\\">Published Data</option>\\n <optgroup label=\\\"My Projects\\\">\\n <option *ngFor=\\\"let project of projects\\\" [ngValue]=\\\"project\\\">\\n {{ project.description }}\\n </option>\\n </optgroup>\\n</select>\\n\\n<div\\n class=\\\"fileslisting\\\"\\n infiniteScroll\\n [infiniteScrollDistance]=\\\"2\\\"\\n [infiniteScrollThrottle]=\\\"100\\\"\\n [scrollWindow]=\\\"false\\\"\\n (scrolled)=\\\"getFiles()\\\"\\n>\\n <div class=\\\"clickable\\\" class=\\\"grid-x file-row\\\" (dblclick)=\\\"toRoot()\\\">\\n <i class=\\\"fas fa-folder\\\"></i>\\n <span> Home </span>\\n </div>\\n <div class=\\\"clickable\\\" class=\\\"grid-x file-row\\\">\\n <i class=\\\"fas fa-folder-open\\\"></i>\\n <span class=\\\"lineBreak\\\"> {{ selectedPath }} </span>\\n </div>\\n <div *ngIf=\\\"retrievalError\\\" class=\\\"grid-x file-row\\\" class=\\\"error\\\">\\n Error retrieving files\\n </div>\\n <div\\n class=\\\"grid-x file-row\\\"\\n *ngFor=\\\"let file of filesList; let fileIndex = index\\\"\\n [ngClass]=\\\"{ selected: selectedFiles.has(file.path) }\\\"\\n >\\n <div\\n class=\\\"clickable\\\"\\n (click)=\\\"select($event, file, fileIndex)\\\"\\n (dblclick)=\\\"browse(file)\\\"\\n >\\n <i class=\\\"fas fa-folder\\\" *ngIf=\\\"file.type === 'dir'\\\"></i>\\n <i class=\\\"far fa-file\\\" *ngIf=\\\"file.type !== 'dir'\\\"></i>\\n <span> {{ file.name }} </span>\\n </div>\\n <div class=\\\"size\\\">\\n {{ file.length | filesize }}\\n </div>\\n </div>\\n <div class=\\\"grid-x\\\" *ngIf=\\\"inProgress\\\">\\n <div class=\\\"cell medium-12\\\">\\n <i class=\\\"fas fa-spin fa-atom\\\"></i>\\n </div>\\n </div>\\n</div>\\n\\n<div class=\\\"button-group\\\">\\n <button mat-raised-button color=\\\"basic\\\" (click)=\\\"selectAll()\\\">\\n Select all\\n </button>\\n <button\\n mat-raised-button\\n color=\\\"warn\\\"\\n class=\\\"button warning\\\"\\n (click)=\\\"cancel()\\\"\\n >\\n Done\\n </button>\\n <button\\n mat-raised-button\\n color=\\\"primary\\\"\\n class=\\\"button\\\"\\n [disabled]=\\\"!selectedFiles.size\\\"\\n (click)=\\\"chooseFiles()\\\"\\n >\\n Import\\n </button>\\n</div>\\n\"","export default \":host .drop-container {\\n background: #fff;\\n border-radius: 6px;\\n height: 150px;\\n width: 100%;\\n box-shadow: 1px 2px 20px rgba(10, 10, 10, 0.1);\\n display: flex;\\n align-items: center;\\n justify-content: center;\\n border: 2px dashed #c0c4c7;\\n}\\n:host p {\\n font-size: 16px;\\n font-weight: 400;\\n color: #c0c4c7;\\n}\\n:host .upload-button {\\n display: inline-block;\\n border: none;\\n outline: none;\\n cursor: pointer;\\n color: #5754a3;\\n}\\n:host .upload-button input {\\n display: none;\\n}\\n:host .dropzone {\\n display: flex;\\n align-items: center;\\n justify-content: center;\\n flex-direction: column;\\n border-radius: 5px;\\n background: white;\\n margin: 10px 0;\\n}\\n:host .dropzone.hovering {\\n border: 2px solid #f16624;\\n color: #dadada !important;\\n}\\n:host progress::-webkit-progress-value {\\n transition: width 0.1s ease;\\n}\"","export default \"<div [formGroup]=\\\"form\\\">\\n <div\\n *ngIf=\\\"!field.value\\\"\\n class=\\\"drop-container dropzone\\\"\\n dropZone\\n (hovered)=\\\"toggleHover($event)\\\"\\n (dropped)=\\\"field.onUpload($event)\\\"\\n [class.hovering]=\\\"isHovering\\\"\\n >\\n <p class=\\\"m-0\\\">\\n Drag a file here or\\n <label class=\\\"upload-button\\\">\\n <input\\n type=\\\"file\\\"\\n multiple=\\\"\\\"\\n (change)=\\\"field.onUpload($event.target.files)\\\"\\n />\\n browse\\n </label>\\n to upload.\\n </p>\\n </div>\\n <div *ngIf=\\\"field.value\\\">\\n <!-- <button type=\\\"button\\\" class=\\\"btn btn-primary\\\">Change</button> -->\\n <div class=\\\"card\\\">\\n <img class=\\\"card-img-top\\\" [src]=\\\"field.value\\\" />\\n </div>\\n </div>\\n</div>\\n\"","export default \"\"","export default \"<h4>Select Files</h4>\\n<small\\n ><em>\\n If no folder is selected, the file will be saved in the root of your\\n selected system.\\n </em></small\\n>\\n<hr />\\n<select (ngModelChange)=\\\"selectSystem($event)\\\" [(ngModel)]=\\\"selectedSystem\\\">\\n <option [ngValue]=\\\"myDataSystem\\\">My Data</option>\\n <option [ngValue]=\\\"communityDataSystem\\\">Community Data</option>\\n <option [ngValue]=\\\"publishedDataSystem\\\">Published Data</option>\\n <optgroup label=\\\"My Galleries\\\">\\n <option *ngFor=\\\"let project of projects\\\" [ngValue]=\\\"project\\\">\\n {{ project.description }}\\n </option>\\n </optgroup>\\n</select>\\n<div\\n class=\\\"fileslisting\\\"\\n infiniteScroll\\n [infiniteScrollDistance]=\\\"2\\\"\\n [infiniteScrollThrottle]=\\\"100\\\"\\n [scrollWindow]=\\\"false\\\"\\n (scrolled)=\\\"getFiles()\\\"\\n>\\n <div\\n class=\\\"grid-x file-row\\\"\\n *ngFor=\\\"let file of filesList\\\"\\n [ngClass]=\\\"{ selected: selectedFiles.has(file.path) }\\\"\\n >\\n <div class=\\\"clickable\\\" (dblclick)=\\\"browse(file)\\\">\\n <i class=\\\"fas fa-folder\\\" *ngIf=\\\"file.type === 'dir'\\\"></i>\\n <i class=\\\"far fa-file\\\" *ngIf=\\\"file.type !== 'dir'\\\"></i>\\n <span> {{ file.name }} </span>\\n </div>\\n <div class=\\\"size\\\">\\n {{ file.length | filesize }}\\n </div>\\n </div>\\n <div class=\\\"grid-x\\\" *ngIf=\\\"inProgress\\\">\\n <div class=\\\"cell medium-12\\\">\\n <i class=\\\"fas fa-spin fa-atom\\\"></i>\\n </div>\\n </div>\\n</div>\\n\\n<form\\n [formGroup]=\\\"downloadSelectForm\\\"\\n (ngSubmit)=\\\"update()\\\"\\n id=\\\"current-project-form\\\"\\n>\\n <div>\\n <small\\n ><em>\\n If no filename is specified, it will default to the Gallery/Map ID number.\\n </em></small\\n >\\n </div>\\n\\n <mat-form-field>\\n <input\\n matInput\\n type=\\\"text\\\"\\n formControlName=\\\"Name\\\"\\n appearance=\\\"filled\\\"\\n required=\\\"false\\\"\\n />\\n </mat-form-field>\\n</form>\\n<span class=\\\"radio-box\\\">\\n <mat-radio-group [(ngModel)]=\\\"fileExtension\\\">\\n <mat-radio-button value=\\\".csv\\\">.csv</mat-radio-button>\\n <mat-radio-button value=\\\".json\\\">.json</mat-radio-button>\\n </mat-radio-group>\\n</span>\\n\\n<div class=\\\"button-group\\\">\\n <button\\n mat-raised-button\\n color=\\\"warn\\\"\\n class=\\\"button warning\\\"\\n (click)=\\\"cancel()\\\"\\n >\\n Cancel\\n </button>\\n <button\\n mat-raised-button\\n color=\\\"primary\\\"\\n class=\\\"button\\\"\\n (click)=\\\"chooseFiles()\\\"\\n >\\n Save\\n </button>\\n</div>\\n\"","export default \":host .top-bar {\\n height: 40px;\\n padding: 5px;\\n padding-left: 0.5em;\\n flex-wrap: nowrap;\\n position: fixed;\\n overflow: hidden;\\n width: 100%;\\n z-index: 999;\\n}\\n:host .top-bar-right .top-bar-left {\\n -webkit-box-flex: 0;\\n flex-wrap: nowrap;\\n flex: 0 1 auto;\\n max-width: 100%;\\n}\\n@media print, screen and (min-width: 40em) {\\n :host .top-bar {\\n flex-wrap: nowrap;\\n flex: 0 1 auto;\\n }\\n}\"","export default \"<!-- <div class=\\\"grid-x\\\"> -->\\n\\n<!-- <div class=\\\"top-bar\\\" style=\\\"background-color: black\\\" id=\\\"navbar\\\"> -->\\n\\n<!--\\t<div class=\\\"top-bar-left\\\"> -->\\n<!--\\t <img src=\\\"assets/logo.svg\\\" width=\\\"30PX\\\"> -->\\n<!--\\t <span style=\\\"color: white\\\">Taggit</span> -->\\n<!--\\t</div> -->\\n\\n<!--\\t<div class=\\\"top-bar-right\\\"> -->\\n<!--\\t <div class=\\\"light-blue\\\" *ngIf=\\\"currentUser\\\">{{ currentUser.username }}</div> -->\\n<!--\\t</div> -->\\n\\n<!-- </div> -->\\n\\n<!-- <\\\\!-- <div class=\\\"cell control-bar\\\"> -\\\\-> -->\\n<!-- <\\\\!--\\t<app-control-bar></app-control-bar> -\\\\-> -->\\n<!-- <\\\\!-- </div> -\\\\-> -->\\n<!-- </div> -->\\n\\n<app-control-bar></app-control-bar>\\n<!-- NOTE Router Outlet was here -->\\n<app-image-gallery></app-image-gallery>\\n\\n<!-- NOTE Leaflet was here -->\\n\"","export default \"<p>notfound works!</p>\\n\"","export default \":host {\\n min-height: 20em;\\n}\\n:host .fileslisting {\\n height: 20em;\\n overflow-y: scroll;\\n padding: 0px 20px;\\n}\\n:host .file-row {\\n display: flex;\\n background: #f9f9f9;\\n border: 1px solid transparent;\\n user-select: none;\\n -webkit-user-select: none;\\n -moz-user-select: none;\\n}\\n:host .clickable {\\n flex: 1;\\n max-width: 20em;\\n}\\n:host .size {\\n align-items: flex-end;\\n}\\n:host .file-row:hover {\\n border: 1px solid;\\n}\\n:host .file-row.selected {\\n background: #d3d3d3;\\n}\\n:host .mat-radio-button ~ .mat-radio-button {\\n margin-left: 16px;\\n}\\n:host .radio-box {\\n position: relative;\\n bottom: 45px;\\n left: 45%;\\n}\"","export default \"\"","export default \":host {\\n overflow-y: scroll;\\n}\\n:host .select-group {\\n overflow: hidden;\\n max-height: 20%;\\n}\\n:host .subitem-title {\\n text-align: left;\\n color: #555;\\n font-size: 14px;\\n padding: 10px;\\n background-color: #f1f1f1;\\n display: flex;\\n justify-content: space-between;\\n}\\n:host .subitem {\\n border-width: 0px 10px;\\n border-color: #f1f1f1;\\n border-style: solid;\\n overflow-y: scroll;\\n background-color: #ffffff;\\n height: 100%;\\n}\\n:host .group-subitem {\\n height: 100px;\\n}\\n:host .subitem-scroll {\\n border-width: 5px;\\n}\\n:host .boxed input[type=radio] {\\n display: none;\\n}\\n:host .boxed label {\\n background-color: #fff;\\n transition: all 0.3s;\\n}\\n:host .boxed input[type=radio]:checked + label {\\n background-color: #b3e5ff;\\n}\\n:host .group-container {\\n display: flex;\\n flex-direction: row;\\n margin: 0;\\n justify-content: space-between;\\n}\\n:host .name-group {\\n display: inline-block;\\n padding: 3px;\\n}\\n:host .button-group {\\n margin: 0;\\n display: flex;\\n flex-direction: row;\\n}\\n:host .button-group div {\\n padding: 3px;\\n}\\n:host .fa {\\n font-weight: 900;\\n display: inline-block;\\n font-style: normal;\\n font-variant: normal;\\n text-rendering: auto;\\n font-family: \\\"FontAwesome\\\";\\n line-height: 1;\\n}\\n:host .fa option {\\n font-weight: 900;\\n}\"","export default \":host {\\n background-color: #f1f1f1;\\n}\"","export default \"<div class=\\\"create-prompt\\\">\\n <div class=\\\"subitem-title\\\" (click)=\\\"expandPanel()\\\">\\n <span> Create Tag </span>\\n </div>\\n <!-- subitem-title -->\\n\\n <div *ngIf=\\\"showSubitem\\\" class=\\\"subitem\\\">\\n <form class=\\\"form-type-form\\\">\\n <div\\n *ngFor=\\\"let control of enabledControls; let idx = index\\\"\\n class=\\\"box form\\\"\\n >\\n <input\\n type=\\\"radio\\\"\\n [id]=\\\"control\\\"\\n value=\\\"control.toLowerCase()\\\"\\n name=\\\"form-type\\\"\\n [checked]=\\\"idx === 0\\\"\\n (change)=\\\"selectInputForm(control.toLowerCase())\\\"\\n />\\n <label\\n style=\\\"cursor: pointer; margin: 3px; padding: 3px; font-size: 10px\\\"\\n [for]=\\\"control\\\"\\n >{{ control }}</label\\n >\\n </div>\\n <!-- form-type-form -->\\n </form>\\n\\n <div class=\\\"form-name\\\">\\n <mat-form-field class=\\\"input-label-group\\\">\\n <mat-label>Label</mat-label>\\n <input\\n matInput\\n placeholder=\\\"Label\\\"\\n #labelValue\\n [(ngModel)]=\\\"labelFilter\\\"\\n (keyup)=\\\"inputFormLabel($event)\\\"\\n name=\\\"labelFilter\\\"\\n class=\\\"tiny\\\"\\n type=\\\"text\\\"\\n />\\n </mat-form-field>\\n\\n <ng-container *ngIf=\\\"formType != 'text'\\\">\\n <ng-container *ngIf=\\\"formType == 'color'\\\">\\n <mat-form-field class=\\\"input-label-group\\\">\\n <mat-label>Option Color</mat-label>\\n <input\\n matInput\\n #optionColorValue\\n placeholder=\\\"Option Color\\\"\\n #labelValue\\n [(ngModel)]=\\\"optionColorFilter\\\"\\n (change)=\\\"inputFormColor($event)\\\"\\n name=\\\"optionColorilter\\\"\\n class=\\\"tiny\\\"\\n type=\\\"color\\\"\\n />\\n </mat-form-field>\\n </ng-container>\\n\\n <mat-form-field class=\\\"input-label-group\\\">\\n <mat-label>Options</mat-label>\\n <div class=\\\"input-group\\\">\\n <input\\n matInput\\n #optionValue\\n class=\\\"input-group-field\\\"\\n placeholder=\\\"Option\\\"\\n type=\\\"text\\\"\\n [(ngModel)]=\\\"optionFilter\\\"\\n name=\\\"optionFilter\\\"\\n (keyup.enter)=\\\"\\n addOptionItem(optionValue.value);\\n optionValue.value = '';\\n optionColorValue.value = '';\\n clearOption();\\n clearOptionColor()\\n \\\"\\n />\\n </div>\\n <!-- input-group -->\\n </mat-form-field>\\n\\n <div class=\\\"input-group-button\\\">\\n <button\\n mat-button\\n color=\\\"accent\\\"\\n class=\\\"button\\\"\\n (click)=\\\"\\n addOptionItem(optionValue.value);\\n optionValue.value = '';\\n clearOption()\\n \\\"\\n >\\n <i class=\\\"fas fa-plus\\\"></i>\\n </button>\\n </div>\\n <!-- input-group-button -->\\n\\n <ul class=\\\"form-option-container\\\">\\n <li *ngFor=\\\"let opt of formOptions\\\" class=\\\"list-group\\\">\\n <div>\\n {{ opt.label }}\\n <ng-container *ngIf=\\\"formType == 'color'\\\">\\n <svg class=\\\"box\\\" width=\\\"10px\\\" height=\\\"10px\\\">\\n <rect width=\\\"10px\\\" height=\\\"10px\\\" style=\\\"fill: #ffffff\\\" />\\n <rect\\n width=\\\"8px\\\"\\n height=\\\"8px\\\"\\n x=\\\"1px\\\"\\n y=\\\"1px\\\"\\n [style.fill]=\\\"opt.color\\\"\\n />\\n </svg>\\n </ng-container>\\n </div>\\n <!-- showopt -->\\n <div class=\\\"button-group\\\">\\n <div (click)=\\\"deleteOption(opt)\\\">\\n <i\\n class=\\\"fas fa-minus\\\"\\n matTooltip=\\\"Delete\\\"\\n matTooltipPosition=\\\"above\\\"\\n style=\\\"cursor: pointer\\\"\\n >\\n </i>\\n </div>\\n <!-- delete opt -->\\n\\n <div (click)=\\\"openRenameOptionModal(renameOptionModal)\\\">\\n <i\\n class=\\\"fas fa-edit\\\"\\n style=\\\"cursor: pointer\\\"\\n matTooltip=\\\"Rename\\\"\\n matTooltipPosition=\\\"above\\\"\\n >\\n </i>\\n </div>\\n\\n <ng-template #renameOptionModal>\\n <input matInput #optionRename placeholder=\\\"Rename Option\\\" />\\n <br />\\n <br />\\n <div class=\\\"button-group\\\">\\n <button\\n matDialogClose\\n mat-raised-button\\n color=\\\"primary\\\"\\n (click)=\\\"renameOption(opt, optionRename.value)\\\"\\n >\\n Rename\\n </button>\\n <button matDialogClose mat-button>Cancel</button>\\n </div>\\n </ng-template>\\n </div>\\n <!-- button group -->\\n </li>\\n </ul>\\n </ng-container>\\n </div>\\n <!-- form-name -->\\n\\n <button mat-raised-button color=\\\"primary\\\" (click)=\\\"addFormItem()\\\">\\n Save\\n </button>\\n <button mat-button color=\\\"primary\\\" (click)=\\\"cancelCreate()\\\">Cancel</button>\\n </div>\\n <!-- subitem -->\\n</div>\\n<!-- create-group -->\\n\"","export default \":host .img-list-container {\\n display: grid;\\n grid-template-columns: repeat(auto-fill, minmax(300px, 1fr));\\n grid-gap: 1em;\\n height: 100%;\\n padding: 1em;\\n}\\n:host #no-img {\\n font-size: 32px;\\n display: flex;\\n justify-content: center;\\n align-items: center;\\n height: 70vh;\\n}\\n:host #no-proj {\\n font-size: 32px;\\n display: flex;\\n justify-content: center;\\n align-items: center;\\n height: 70vh;\\n}\\n:host #new-proj {\\n font-size: 32px;\\n display: flex;\\n height: 100vh;\\n justify-content: center;\\n align-items: center;\\n}\\n:host app-image-box {\\n height: 100%;\\n}\\n:host .masonry-item {\\n width: 200px;\\n}\\n:host img-spin {\\n position: relative;\\n bottom: 0px;\\n left: 0px;\\n width: 100%;\\n height: 100px;\\n background: #fff;\\n}\\n:host load-spin {\\n position: relative;\\n width: 100%;\\n height: 100px;\\n background: #fff;\\n}\\n:host .side-bar-container {\\n background-color: #f1f1f1;\\n position: fixed;\\n width: 25%;\\n margin-right: 0px;\\n height: calc(100vh - 50px);\\n right: 0;\\n}\\n:host .success {\\n margin-right: 20%;\\n}\\n:host .danger {\\n margin-right: 0%;\\n}\\n:host #gallery-container-container {\\n position: relative;\\n width: 100%;\\n height: auto;\\n text-align: center;\\n display: flex;\\n flex-direction: column;\\n margin-top: 0px;\\n}\\n:host #loading-load {\\n position: relative;\\n width: 100%;\\n height: auto;\\n text-align: center;\\n flex-direction: column;\\n margin-top: 50px;\\n}\\n:host #gallery-container {\\n position: relative;\\n width: 100%;\\n height: auto;\\n text-align: center;\\n display: flex;\\n flex-direction: column;\\n}\\n:host #gallery-container .gallery-image {\\n height: 100%;\\n display: inline-flex;\\n justify-content: center;\\n align-items: center;\\n}\\n:host #gallery-container .gallery-image img {\\n max-width: 100%;\\n max-height: 100%;\\n margin: 0 auto;\\n}\\n:host .imager {\\n width: 75%;\\n height: calc(100vh - 50px);\\n background-color: #fefefe;\\n}\\n:host .view-image {\\n max-width: 100%;\\n height: auto;\\n}\\n:host .gallery-btn {\\n width: 35px;\\n height: 35px;\\n background: #000;\\n color: #fff;\\n text-align: center;\\n line-height: 35px;\\n cursor: pointer;\\n transition: all 0.4s ease;\\n font-size: 20px;\\n box-sizing: border-box;\\n padding-left: 2px;\\n position: fixed;\\n bottom: 10px;\\n}\\n:host .gallery-btn:hover {\\n background: #222;\\n}\\n:host .gallery-close {\\n top: 10px;\\n}\\n:host .gallery-close .gallery-next {\\n right: 10px;\\n}\\n:host .gallery-prev {\\n right: 50px;\\n}\\n:host .gallery-prev .gallery-next {\\n bottom: 10px;\\n}\\n@media (min-width: 478px) {\\n :host .img-list-container img:nth-child(3n):not(last-of-type) {\\n grid-row-end: span 2;\\n }\\n}\\n@media (max-width: 768px) {\\n :host .img-list-container {\\n grid-template-columns: repeat(auto-fit, minmax(150px, 1fr));\\n }\\n}\\n@media (max-width: 450px) {\\n :host .img-list-container {\\n grid-template-columns: repeat(auto-fit, minmax(100px, 1fr));\\n }\\n}\"","export default \"<h4>Share this project</h4>\\n<small\\n ><em>\\n People you share your project with will have full ability to edit and delete\\n this project on Taggit and on HazMapper.\\n </em></small\\n>\\n\\n<form [formGroup]=\\\"projShareForm\\\" (ngSubmit)=\\\"submit()\\\" id=\\\"share-project-form\\\">\\n <mat-form-field>\\n <mat-label>Username:</mat-label>\\n <input matInput type=\\\"text\\\" formControlName=\\\"name\\\" required=\\\"true\\\" />\\n </mat-form-field>\\n\\n <div class=\\\"button-group small\\\">\\n <button\\n mat-raised-button\\n color=\\\"warn\\\"\\n class=\\\"button small warning\\\"\\n type=\\\"button\\\"\\n (click)=\\\"close()\\\"\\n >\\n Close\\n </button>\\n <button\\n mat-raised-button\\n color=\\\"primary\\\"\\n class=\\\"button small align-right\\\"\\n type=\\\"submit\\\"\\n [disabled]=\\\"!projShareForm.valid\\\"\\n >\\n Add Member\\n </button>\\n </div>\\n\\n <br />\\n <h5>Current Users</h5>\\n <div *ngFor=\\\"let user of projectUsers\\\">\\n <br />\\n <mat-card class=\\\"card-container\\\">\\n <span class=\\\"card-item\\\">\\n {{ user.username }}\\n </span>\\n <span class=\\\"card-buttons\\\">\\n <button\\n mat-raised-button\\n color=\\\"warn\\\"\\n class=\\\"button small warning\\\"\\n type=\\\"button\\\"\\n [disabled]=\\\"onlyOne\\\"\\n (click)=\\\"delete(user.username)\\\"\\n >\\n <i class=\\\"fas fa-trash\\\"></i>\\n </button>\\n </span>\\n </mat-card>\\n </div>\\n</form>\\n\"","export default \"<div *ngIf=\\\"loaded; else loader\\\" id=\\\"loading-load\\\">\\n <div *ngIf=\\\"projectsExist; else noProjWarn\\\" id=\\\"gallery-container\\\">\\n\\n <div *ngIf=\\\"loadingGallery; else galleryLoader\\\">\\n <div *ngIf=\\\"imagesExist; else noImgWarn\\\" id=\\\"gallery-container-container\\\">\\n <div\\n [ngClass]=\\\"scrollStatus\\\"\\n infiniteScroll\\n [infiniteScrollDistance]=\\\"1\\\"\\n [infiniteScrollThrottle]=\\\"1500\\\"\\n (scrolled)=\\\"onScroll()\\\"\\n class=\\\"img-list-container\\\"\\n *ngIf=\\\"!showTagger; else tagger\\\"\\n >\\n <app-image-box *ngFor=\\\"let feat of featureListScroll\\\" [feature]=\\\"feat\\\">\\n </app-image-box>\\n </div>\\n\\n <ngx-spinner\\n bdOpacity=\\\"0.9\\\"\\n bdColor=\\\"\\\"\\n size=\\\"default\\\"\\n color=\\\"#3ADB76\\\"\\n type=\\\"line-scale-pulse-out\\\"\\n id=\\\"img-spin\\\"\\n [fullScreen]=\\\"false\\\"\\n >\\n </ngx-spinner>\\n <ng-template #tagger>\\n <div>\\n <div class=\\\"imager\\\">\\n <img class=\\\"view-image\\\" [src]=\\\"getPath()\\\" />\\n </div>\\n </div>\\n </ng-template>\\n <div *ngIf=\\\"showTagger\\\" class=\\\"side-bar-container\\\">\\n <app-side-bar></app-side-bar>\\n </div>\\n </div>\\n </div>\\n\\n <ng-template #galleryLoader>\\n <div id=\\\"no-img\\\">\\n <i class=\\\"fas fa-circle-notch fa-spin\\\"></i>\\n </div>\\n </ng-template>\\n\\n <ng-template #noImgWarn>\\n <div id=\\\"no-img\\\">\\n No images have been imported!<br />Please import images through the\\n menu.\\n </div>\\n </ng-template>\\n </div>\\n\\n <ng-template #noProjWarn>\\n <div id=\\\"no-proj\\\">\\n No project has been created!<br />Please create a project through the\\n menu.\\n </div>\\n </ng-template>\\n</div>\\n\\n<ng-template #loader>\\n <div *ngIf=\\\"projectsExist; else createProj\\\" id=\\\"loader\\\">Loading...</div>\\n\\n <ng-template #createProj>\\n <div id=\\\"new-proj\\\" (click)=\\\"openCreateProjectModal()\\\">\\n Start a new project\\n </div>\\n </ng-template>\\n</ng-template>\\n\"","export default \"<div class=\\\"form-group row\\\" *ngFor=\\\"let tag of field\\\">\\n <label class=\\\"col-md-3 form-control-label\\\" [attr.for]=\\\"tag.label\\\">\\n {{ field.label }}\\n <strong class=\\\"text-danger\\\" *ngIf=\\\"tag.required\\\">*</strong>\\n </label>\\n <div class=\\\"col-md-9\\\" [ngSwitch]=\\\"tag.type\\\">\\n <app-form-color\\n *ngSwitchCase=\\\"'color'\\\"\\n [field]=\\\"field\\\"\\n [form]=\\\"form\\\"\\n ></app-form-color>\\n <app-form-textbox\\n *ngSwitchCase=\\\"'text'\\\"\\n [field]=\\\"field\\\"\\n [form]=\\\"form\\\"\\n ></app-form-textbox>\\n <app-form-dropdown\\n *ngSwitchCase=\\\"'dropdown'\\\"\\n [field]=\\\"field\\\"\\n [form]=\\\"form\\\"\\n ></app-form-dropdown>\\n <app-form-checkbox\\n *ngSwitchCase=\\\"'checkbox'\\\"\\n [field]=\\\"field\\\"\\n [form]=\\\"form\\\"\\n ></app-form-checkbox>\\n <app-form-radio\\n *ngSwitchCase=\\\"'radio'\\\"\\n [field]=\\\"field\\\"\\n [form]=\\\"form\\\"\\n ></app-form-radio>\\n </div>\\n</div>\\n\"","export default \":host .subitem-title {\\n text-align: left;\\n color: #555;\\n font-size: 14px;\\n padding: 10px;\\n background-color: #f1f1f1;\\n display: flex;\\n justify-content: space-between;\\n}\\n:host .subitem {\\n border-width: 0px 10px;\\n border-color: #f1f1f1;\\n border-style: solid;\\n overflow-y: scroll;\\n background-color: #ffffff;\\n height: 100%;\\n}\\n:host .subitem-scroll {\\n border-width: 5px;\\n}\\n:host .asset-list {\\n max-height: 20%;\\n overflow: hidden;\\n}\\n:host .asset-subitem {\\n height: 100px;\\n}\\n:host .asset-container {\\n display: flex;\\n flex-direction: row;\\n justify-content: space-between;\\n cursor: pointer;\\n}\\n:host .highlight {\\n background-color: #b3e5ff;\\n}\\n:host .name-group {\\n display: inline-block;\\n padding: 3px;\\n}\\n:host .button-group {\\n margin: 0;\\n display: flex;\\n flex-direction: row;\\n}\\n:host .button-group div {\\n padding: 3px;\\n padding-right: 5px;\\n}\"","export default \"<!--The content below is only a placeholder and can be replaced.-->\\n<router-outlet></router-outlet>\\n\"","export default \"<div id=\\\"callback\\\">\\n <div>\\n <i class=\\\"fas fa-spinner\\\"></i>\\n </div>\\n</div>\\n\"","export default \"<div class=\\\"img-container\\\">\\n <img\\n [ngClass]=\\\"imageSelected\\\"\\n [src]=\\\"featureSource\\\"\\n (click)=\\\"imageSelect()\\\"\\n class=\\\"img-responsive img-target\\\"\\n title=\\\"{{ featurePath }}\\\"\\n />\\n <div class=\\\"top-overlay\\\">\\n <div\\n class=\\\"image-option\\\"\\n matTooltip=\\\"Zoom\\\"\\n matTooltipPosition=\\\"below\\\"\\n (click)=\\\"imageZoom(diffSizes)\\\"\\n >\\n <i class=\\\"fas fa-search-plus\\\"></i>\\n </div>\\n\\n <ng-template #diffSizes>\\n <div class=\\\"zoom-content\\\">\\n <div class=\\\"img-container\\\">\\n <img [src]=\\\"featureSource\\\" title=\\\"{{ featurePath }}\\\" />\\n </div>\\n <div class=\\\"img-details\\\">\\n <div class=\\\"detail-container\\\">\\n <div class=\\\"title\\\">Coordinates</div>\\n <div class=\\\"detail-contents\\\">\\n <div class=\\\"detail-item\\\">{{ coordinates[0] }},</div>\\n <div class=\\\"detail-item\\\">\\n {{ coordinates[1] }}\\n </div>\\n </div>\\n </div>\\n <div class=\\\"detail-container\\\">\\n <div class=\\\"title\\\">Image Source</div>\\n <div class=\\\"detail-contents\\\">\\n <div class=\\\"detail-item\\\">\\n {{ featurePath }}\\n </div>\\n </div>\\n </div>\\n </div>\\n <button\\n mat-button\\n class=\\\"close-button\\\"\\n matDialogClose\\n aria-label=\\\"Close modal\\\"\\n type=\\\"button\\\"\\n >\\n <span aria-hidden=\\\"true\\\">×</span>\\n </button>\\n </div>\\n </ng-template>\\n\\n <div\\n class=\\\"image-option\\\"\\n matTooltip=\\\"Remove\\\"\\n matTooltipPosition=\\\"below\\\"\\n (click)=\\\"openPreserveScrollModal(deleteImage)\\\"\\n >\\n <i class=\\\"fas fa-trash\\\"></i>\\n </div>\\n\\n <ng-template #deleteImage>\\n <div *ngIf=\\\"selectedImages.length === 1\\\">\\n This image will be deleted from the current project. It will not be\\n deleted from the Data Depot.\\n </div>\\n\\n <div *ngIf=\\\"selectedImages.length > 1\\\">\\n {{ selectedImages.length }} images will be deleted from the current\\n project. They will not be deleted from the Data Depot.\\n </div>\\n\\n <button\\n mat-raised-button\\n color=\\\"primary\\\"\\n matDialogClose\\n (click)=\\\"imageDelete()\\\"\\n >\\n Delete Image\\n </button>\\n <button mat-button matDialogClose>Cancel</button>\\n </ng-template>\\n\\n <div\\n class=\\\"image-option\\\"\\n matTooltip=\\\"Add To Group\\\"\\n matTooltipPosition=\\\"below\\\"\\n (click)=\\\"openPreserveScrollModal(addMoreToGroup)\\\"\\n >\\n <i class=\\\"fas fa-plus\\\"></i>\\n </div>\\n\\n <ng-template #addMoreToGroup>\\n <mat-form-field appearance=\\\"fill\\\">\\n <mat-label>Groups</mat-label>\\n <mat-select\\n matNativeControl\\n required\\n [value]=\\\"groupToAdd\\\"\\n [compareWith]=\\\"compareGroup\\\"\\n (selectionChange)=\\\"changeGroupToAdd($event)\\\"\\n >\\n <mat-option\\n *ngFor=\\\"let group of groups | keyvalue\\\"\\n [value]=\\\"group.value\\\"\\n >\\n {{ group.key }}\\n </mat-option>\\n </mat-select>\\n </mat-form-field>\\n\\n <p>\\n <button\\n mat-raised-button\\n color=\\\"primary\\\"\\n matDialogClose\\n (click)=\\\"addGroup(groupToAdd)\\\"\\n [disabled]=\\\"!groupToAdd\\\"\\n >\\n Add To Group\\n </button>\\n <button mat-button color=\\\"secondary\\\" matDialogClose>Cancel</button>\\n </p>\\n </ng-template>\\n </div>\\n\\n <div class=\\\"bottom-overlay\\\">\\n <div\\n *ngIf=\\\"feature.properties.taggit.groups && feature.properties.taggit.groups.length > 0\\\"\\n >\\n <div\\n *ngIf=\\\"feature.properties.taggit.groups.length < 5; else dotdot\\\"\\n class=\\\"group-tags\\\"\\n >\\n <div\\n *ngFor=\\\"let group of feature.properties.taggit.groups\\\"\\n class=\\\"center\\\"\\n (mouseover)=\\\"(group.name)\\\"\\n [matTooltip]=\\\"group.name\\\"\\n matTooltipPosition=\\\"above\\\"\\n >\\n <svg\\n class=\\\"box\\\"\\n width=\\\"25px\\\"\\n height=\\\"75px\\\"\\n (click)=\\\"deleteFromGroup(feature, group)\\\"\\n >\\n <rect\\n width=\\\"15px\\\"\\n height=\\\"15px\\\"\\n x=\\\"5\\\"\\n y=\\\"30\\\"\\n [style.fill]=\\\"group.color\\\"\\n />\\n <rect\\n class=\\\"inner-del\\\"\\n width=\\\"25px\\\"\\n height=\\\"15px\\\"\\n rx=\\\"3\\\"\\n x=\\\"0\\\"\\n y=\\\"0\\\"\\n style=\\\"fill: #ffffff\\\"\\n />\\n <rect\\n class=\\\"inner-del\\\"\\n width=\\\"15px\\\"\\n height=\\\"5px\\\"\\n x=\\\"5\\\"\\n y=\\\"5\\\"\\n style=\\\"fill: #de6363\\\"\\n />\\n </svg>\\n </div>\\n </div>\\n\\n <ng-template #dotdot class=\\\"text\\\">\\n <div\\n class=\\\"image-option\\\"\\n (click)=\\\"openModal(moreGroupsModal)\\\"\\n >\\n <i class=\\\"fas fa-ellipsis-h\\\"></i>\\n </div>\\n </ng-template>\\n\\n <!-- TODO Should close modal once zero groups -->\\n <ng-template #moreGroupsModal>\\n <div\\n style=\\\"display: flex; justify-content: center; align-items: center\\\"\\n >\\n <div\\n *ngFor=\\\"let group of feature.properties.taggit.groups\\\"\\n class=\\\"center-temp\\\"\\n style=\\\"display: flex\\\"\\n (mouseover)=\\\"(group.name)\\\"\\n [matTooltip]=\\\"group.name\\\"\\n matTooltipPosition=\\\"right\\\"\\n >\\n <svg\\n style=\\\"padding: 1\\\"\\n (click)=\\\"deleteFromGroup(feature, group)\\\"\\n width=\\\"15px\\\"\\n height=\\\"15px\\\"\\n >\\n <rect width=\\\"15px\\\" height=\\\"15px\\\" [style.fill]=\\\"group.color\\\" />\\n <rect\\n class=\\\"inner-del-temp\\\"\\n width=\\\"8px\\\"\\n height=\\\"4px\\\"\\n x=\\\"3.3\\\"\\n y=\\\"5.5\\\"\\n style=\\\"fill: #000\\\"\\n />\\n </svg>\\n </div>\\n </div>\\n </ng-template>\\n </div>\\n </div>\\n</div>\\n\"","export default \"<ng-container *ngIf=\\\"!loadingFeatureProperties; else loading\\\">\\n <app-select-group></app-select-group>\\n <app-select-image></app-select-image>\\n\\n <app-tag-generator\\n *ngIf=\\\"showTagGenerator; else tagImages\\\"\\n ></app-tag-generator>\\n <ng-template #tagImages>\\n <app-tag-images></app-tag-images>\\n </ng-template>\\n</ng-container>\\n<ng-template #loading>\\n <div\\n style=\\\"\\n display: flex;\\n flex-direction: column;\\n align-items: center;\\n justify-content: center;\\n height: 100%;\\n \\\"\\n >\\n <span>\\n Updating Group Data\\n <i class=\\\"fas fa-circle-notch fa-spin\\\"></i>\\n </span>\\n </div>\\n</ng-template>\\n\"","function webpackEmptyAsyncContext(req) {\n\t// Here Promise.resolve().then() is used instead of new Promise() to prevent\n\t// uncaught exception popping up in devtools\n\treturn Promise.resolve().then(function() {\n\t\tvar e = new Error(\"Cannot find module '\" + req + \"'\");\n\t\te.code = 'MODULE_NOT_FOUND';\n\t\tthrow e;\n\t});\n}\nwebpackEmptyAsyncContext.keys = function() { return []; };\nwebpackEmptyAsyncContext.resolve = webpackEmptyAsyncContext;\nmodule.exports = webpackEmptyAsyncContext;\nwebpackEmptyAsyncContext.id = \"crnd\";","export default \":host {\\n display: block;\\n font-size: 0.8em;\\n height: calc(100vh - 50px);\\n}\\n:host .lat-lon-label {\\n font-size: 0.8em;\\n color: #4d4d4d;\\n}\\n:host .active-project {\\n background-color: #1aff8c;\\n}\\n:host .menu button.dropdown.button {\\n padding: 0.85em 1em;\\n}\\n:host .switch {\\n margin: 0;\\n}\\n:host .button.tiny {\\n margin: 0;\\n}\\n:host .create-prompt {\\n max-height: 500px;\\n height: 500px;\\n}\\n:host .select-group {\\n max-height: 20%;\\n height: 20%;\\n}\\n:host .subitem-title {\\n text-align: left;\\n color: #555;\\n font-size: 14px;\\n padding: 10px;\\n background-color: #f1f1f1;\\n display: flex;\\n justify-content: space-between;\\n}\\n:host .input-label-group {\\n padding: 10px;\\n display: block;\\n}\\n:host .input-group {\\n display: inline-block;\\n}\\n:host .form-name {\\n text-align: center;\\n}\\n:host .input-group-button {\\n display: inline-block;\\n}\\n:host .subitem {\\n border-width: 0px 10px;\\n border-color: #f1f1f1;\\n border-style: solid;\\n overflow-y: auto;\\n background-color: #ffffff;\\n height: 40vh;\\n padding: 20px;\\n}\\n:host .subitem-scroll {\\n border-width: 5px;\\n}\\n:host .preset-descriptions {\\n max-height: 20%;\\n height: 20%;\\n}\\n:host .boxed input[type=radio] {\\n display: none;\\n}\\n:host .boxed label {\\n background-color: #fff;\\n transition: all 0.3s;\\n}\\n:host .boxed input[type=radio]:checked + label {\\n background-color: #b3e5ff;\\n}\\n:host .group-container {\\n display: flex;\\n flex-direction: row;\\n margin: 0;\\n justify-content: space-between;\\n}\\n:host .button-group {\\n margin: 0;\\n display: flex;\\n flex-direction: row;\\n}\\n:host .form-option-container {\\n padding: 0px;\\n}\\n:host .list-group {\\n display: flex;\\n flex-direction: row;\\n margin: 0;\\n justify-content: space-between;\\n}\\n:host .list-suboptions {\\n background-color: #f0f0f0;\\n}\\n:host .button-group div {\\n padding: 3px;\\n}\\n:host .name-group {\\n display: inline-block;\\n padding: 3px;\\n}\\n:host .form-item-container {\\n display: flex;\\n flex-direction: row;\\n margin: 0;\\n justify-content: space-between;\\n}\\n:host .form-type-form {\\n display: flex;\\n flex-direction: row;\\n justify-content: space-between;\\n margin: 5px;\\n margin-bottom: 15px;\\n}\\n:host .form-type-form input[type=radio] {\\n display: none;\\n}\\n:host .form-type-form label {\\n border-style: solid;\\n border-width: 1px;\\n border-color: #ddd;\\n transition: all 0.3s;\\n}\\n:host .form-type-form input[type=radio]:checked + label {\\n border-style: solid;\\n border-width: 1px;\\n border-color: #000;\\n}\\n:host .changed {\\n color: #f07575;\\n}\\n:host .unchanged {\\n color: #555555;\\n}\\n:host .asset-list {\\n max-height: 20%;\\n height: 20%;\\n}\\n:host .asset-container {\\n display: flex;\\n flex-direction: row;\\n justify-content: space-between;\\n cursor: pointer;\\n}\\n:host .highlight {\\n background-color: #b3e5ff;\\n}\"","export default \"<div>\\n <textarea\\n [id]=\\\"field.name\\\"\\n rows=\\\"9\\\"\\n class=\\\"form-control\\\"\\n [placeholder]=\\\"'notes'\\\"\\n [(ngModel)]=\\\"value\\\"\\n (keyup)=\\\"updateValue()\\\"\\n ></textarea>\\n</div>\\n\"","export default \":host #share-project-form {\\n display: flex;\\n flex-direction: column;\\n text-align: center;\\n padding: 5em;\\n}\\n\\n.card-container {\\n display: flex;\\n justify-content: space-between;\\n width: 99%;\\n}\\n\\n.card-item {\\n text-align: center;\\n align-items: center;\\n}\\n\\n.card-buttons {\\n align-items: flex-end;\\n}\"","export default \"<div id=\\\"map\\\" style=\\\"min-height: calc(100vh - 67px)\\\"></div>\\n\"","export default \"<div *ngFor=\\\"let opt of form.options\\\" [id]=\\\"form.label\\\" class=\\\"input-group\\\">\\n <div class=\\\"form-check form-check\\\">\\n <label class=\\\"form-check-label\\\">\\n <input\\n class=\\\"form-check-input\\\"\\n [(ngModel)]=\\\"value\\\"\\n type=\\\"radio\\\"\\n id=\\\"inlineCheckbox2\\\"\\n name=\\\"{{ label }}\\\"\\n value=\\\"{{ opt.label }}\\\"\\n (change)=\\\"updateCheckedTag()\\\"\\n />\\n {{ opt.label }}\\n </label>\\n </div>\\n</div>\\n\"","export default \":host #create-project-form {\\n display: flex;\\n flex-direction: column;\\n text-align: center;\\n padding: 5em;\\n}\"","export default \":host .img-container {\\n position: relative;\\n}\\n:host .img-container img {\\n -o-object-fit: cover;\\n object-fit: cover;\\n cursor: default;\\n width: 100%;\\n height: 100%;\\n transition: opacity 0.3s ease;\\n backface-visibility: hidden;\\n max-width: 100%;\\n max-height: 100%;\\n margin: 0 auto;\\n}\\n:host .top-overlay {\\n display: flex;\\n flex-direction: row;\\n transition: 0.3s ease;\\n opacity: 0;\\n position: absolute;\\n right: 10px;\\n top: 10px;\\n cursor: pointer;\\n text-align: center;\\n}\\n:host .bottom-overlay {\\n display: flex;\\n flex-direction: row;\\n transition: 0.3s ease;\\n opacity: 1;\\n position: absolute;\\n right: 10px;\\n bottom: 10px;\\n text-align: center;\\n}\\n:host .img-container:hover img {\\n opacity: 0.9;\\n}\\n:host .img-container:hover .top-overlay {\\n opacity: 0.9;\\n}\\n:host .img-container:hover .top-overlay:hover {\\n opacity: 1;\\n}\\n:host .image-option {\\n opacity: 0.9;\\n background-color: white;\\n display: flex;\\n color: black;\\n width: 40px;\\n height: 30px;\\n border-radius: 5px;\\n font-size: 16px;\\n margin: 3px;\\n justify-content: center;\\n align-items: center;\\n}\\n:host .image-option:hover {\\n opacity: 1;\\n}\\n:host .image-option .fas {\\n top: 5px;\\n}\\n:host .img-selected {\\n border: solid #0191ff;\\n border-width: 5px;\\n}\\n:host .img-unselected {\\n border: solid #fff;\\n border-width: 5px;\\n}\\n:host .group-tags {\\n opacity: 0.9;\\n background-color: white;\\n display: flex;\\n flex-direction: row;\\n width: auto;\\n height: 30px;\\n border-radius: 5px;\\n padding: 5px;\\n justify-content: center;\\n align-items: center;\\n z-index: 999;\\n}\\n:host .center {\\n display: flex;\\n flex-direction: row;\\n justify-content: center;\\n transition: 0.3s ease;\\n align-items: center;\\n}\\n:host .center .inner-del {\\n opacity: 0;\\n transition: 0.3s ease;\\n cursor: pointer;\\n}\\n:host .center:hover .inner-del {\\n opacity: 1;\\n}\\n:host .box {\\n padding: 1px;\\n}\\n.center-temp {\\n display: flex;\\n flex-direction: row;\\n justify-content: center;\\n align-items: center;\\n}\\n.center-temp .inner-del-temp {\\n opacity: 0;\\n transition: 0.3s ease;\\n cursor: pointer;\\n}\\n.center-temp:hover .inner-del-temp {\\n opacity: 0.5;\\n}\\n.zoom-content {\\n display: flex;\\n flex-direction: column;\\n max-height: 700px;\\n}\\n.zoom-content .img-container {\\n overflow-y: scroll;\\n width: 100%;\\n height: 100%;\\n background-color: #e7e7e7;\\n}\\n.zoom-content .img-details {\\n display: flex;\\n flex-direction: row;\\n margin-top: 24px;\\n background-color: #e7e7e7;\\n align-items: center;\\n text-align: center;\\n}\\n.zoom-content .title {\\n background-color: #ccc;\\n padding: 5px;\\n}\\n.zoom-content .detail-container {\\n display: flex;\\n flex-grow: 1;\\n flex-direction: column;\\n padding: 5px;\\n}\\n.zoom-content .detail-contents {\\n display: flex;\\n flex-direction: row;\\n padding: 5px;\\n background-color: #fff;\\n}\\n.zoom-content .detail-item {\\n padding: 5px;\\n}\"","export default \":host {\\n text-align: left;\\n}\\n:host .mat-form-field {\\n width: 100%;\\n text-align: left;\\n}\\n:host .input-group {\\n padding: 5px;\\n}\\n:host label {\\n padding: 5px;\\n}\\n:host input {\\n padding: 5px;\\n vertical-align: middle;\\n}\\n:host .radio-group {\\n display: flex;\\n flex-direction: column;\\n}\\n:host .form-controls {\\n padding: 20px;\\n}\"","export default \"<div *ngFor=\\\"let opt of form.options\\\" [id]=\\\"form.label\\\" class=\\\"input-group\\\">\\n <div class=\\\"form-check form-check\\\">\\n <label class=\\\"form-check-label\\\">\\n <input\\n class=\\\"form-check-input\\\"\\n [(ngModel)]=\\\"chosenTag\\\"\\n type=\\\"radio\\\"\\n id=\\\"inlineCheckbox3\\\"\\n name=\\\"{{ label }}\\\"\\n value=\\\"{{ opt.label }}\\\"\\n (change)=\\\"updateCheckedTag()\\\"\\n />\\n {{ opt.label }}\\n\\n <svg class=\\\"box\\\" width=\\\"10px\\\" height=\\\"10px\\\">\\n <rect width=\\\"10px\\\" height=\\\"10px\\\" style=\\\"fill: #ffffff\\\" />\\n <rect\\n width=\\\"8px\\\"\\n height=\\\"8px\\\"\\n x=\\\"1px\\\"\\n y=\\\"1px\\\"\\n [style.fill]=\\\"opt.color\\\"\\n />\\n </svg>\\n </label>\\n </div>\\n</div>\\n\"","export default \"<h4>Current Gallery/Map</h4>\\n<form\\n [formGroup]=\\\"projCreateForm\\\"\\n id=\\\"current-project-form\\\"\\n>\\n <mat-form-field>\\n <mat-label>Name:</mat-label>\\n <input\\n matInput\\n type=\\\"text\\\"\\n formControlName=\\\"name\\\"\\n appearance=\\\"filled\\\"\\n required=\\\"true\\\"\\n />\\n </mat-form-field>\\n\\n <mat-form-field>\\n <mat-label>Description</mat-label>\\n <textarea matInput formControlName=\\\"description\\\" required=\\\"true\\\"></textarea>\\n </mat-form-field>\\n\\n <div class=\\\"button-group small\\\">\\n <button\\n mat-raised-button\\n color=\\\"basic\\\"\\n class=\\\"button small warning\\\"\\n type=\\\"button\\\"\\n (click)=\\\"close()\\\"\\n >\\n Close\\n </button>\\n <button\\n *ngIf=\\\"activeProject.deletable\\\"\\n mat-raised-button\\n color=\\\"warn\\\"\\n class=\\\"button small warning\\\"\\n type=\\\"delete\\\"\\n (click)=\\\"delete()\\\"\\n >\\n Delete\\n </button>\\n <button\\n mat-raised-button\\n color=\\\"primary\\\"\\n class=\\\"button small align-right\\\"\\n type=\\\"submit\\\"\\n (click)=\\\"update()\\\"\\n [disabled]=\\\"!projCreateForm.valid\\\"\\n >\\n Update\\n </button>\\n </div>\\n</form>\\n\"","export default \"<h4>Create a new Gallery/Map</h4>\\n<form\\n [formGroup]=\\\"projCreateForm\\\"\\n (ngSubmit)=\\\"submit()\\\"\\n id=\\\"create-project-form\\\"\\n>\\n <mat-form-field>\\n <mat-label>Name:</mat-label>\\n <input matInput type=\\\"text\\\" formControlName=\\\"name\\\" required=\\\"true\\\" />\\n </mat-form-field>\\n\\n <mat-form-field>\\n <mat-label>Description</mat-label>\\n <textarea matInput formControlName=\\\"description\\\" required=\\\"true\\\"></textarea>\\n </mat-form-field>\\n\\n <div class=\\\"button-group small\\\">\\n <button\\n mat-raised-button\\n color=\\\"warn\\\"\\n class=\\\"button small warning\\\"\\n type=\\\"button\\\"\\n (click)=\\\"close()\\\"\\n >\\n Close\\n </button>\\n <button\\n mat-raised-button\\n color=\\\"primary\\\"\\n class=\\\"button small align-right\\\"\\n type=\\\"submit\\\"\\n [disabled]=\\\"!projCreateForm.valid\\\"\\n >\\n Submit\\n </button>\\n </div>\\n</form>\\n\"","export default \"\"","export default \":host {\\n font-size: 0.8em;\\n display: block;\\n}\\n:host .subitem-title {\\n text-align: left;\\n display: flex;\\n justify-content: space-between;\\n color: #555;\\n font-size: 14px;\\n padding: 10px;\\n background-color: #f1f1f1;\\n}\\n:host .subitem {\\n border-width: 0px 10px;\\n border-color: #f1f1f1;\\n border-style: solid;\\n padding: 10px;\\n overflow-y: auto;\\n background-color: #ffffff;\\n height: 40vh;\\n}\\n:host .main-form-container {\\n padding: 10px;\\n}\\n:host .subitem-scroll {\\n padding: 10px;\\n}\\n:host .subitem-scroll {\\n border-width: 5px;\\n}\\n:host .highlight {\\n background-color: #b3e5ff;\\n}\\n:host .boxed input[type=radio] {\\n display: none;\\n}\\n:host .boxed label {\\n background-color: #fff;\\n transition: all 0.3s;\\n}\\n:host .boxed input[type=radio]:checked + label {\\n background-color: #b3e5ff;\\n}\\n:host .group-container {\\n display: flex;\\n flex-direction: row;\\n margin: 0;\\n justify-content: space-between;\\n}\\n:host .select-group {\\n max-height: 20%;\\n height: 20%;\\n}\\n:host .tag-forms {\\n height: 500px;\\n}\\n:host .asset-list {\\n max-height: 20%;\\n height: 20%;\\n}\\n:host .asset-container {\\n display: flex;\\n flex-direction: row;\\n justify-content: space-between;\\n cursor: pointer;\\n}\\n:host .preset-descriptions {\\n max-height: 20%;\\n height: 20%;\\n}\\n:host .form-item-container {\\n display: flex;\\n flex-direction: row;\\n margin: 0;\\n justify-content: space-between;\\n}\\n:host .button-group {\\n display: flex;\\n flex-direction: row;\\n margin: 0;\\n}\\n:host .button-group div {\\n padding: 3px;\\n}\\n:host .name-group {\\n padding: 3px;\\n font-size: 17px;\\n font-weight: bold;\\n}\\n:host .list-group {\\n display: flex;\\n flex-direction: row;\\n margin: 0;\\n justify-content: space-between;\\n}\\n:host .list-suboptions {\\n background-color: #f0f0f0;\\n}\"","export default \"<div class=\\\"select-group\\\">\\n <div class=\\\"subitem-title\\\" (click)=\\\"expandPanel()\\\">Groups</div>\\n <div *ngIf=\\\"showSubitem\\\" class=\\\"subitem group-subitem\\\">\\n <!-- TODO redundant functionality radio is just for style -->\\n <form class=\\\"boxed\\\">\\n <div\\n *ngFor=\\\"let group of groups | keyvalue\\\"\\n (click)=\\\"selectGroupForm(group.value)\\\"\\n class=\\\"box form\\\"\\n >\\n <input\\n type=\\\"radio\\\"\\n [id]=\\\"group.key\\\"\\n [value]=\\\"group.key\\\"\\n name=\\\"skills\\\"\\n [checked]=\\\"isChecked(group.key)\\\"\\n />\\n <label\\n class=\\\"group-container\\\"\\n style=\\\"cursor: pointer\\\"\\n [for]=\\\"group.key\\\"\\n >\\n <div class=\\\"name-group\\\">\\n {{ group.key }}\\n <svg class=\\\"box\\\" width=\\\"10px\\\" height=\\\"10px\\\">\\n <rect width=\\\"10px\\\" height=\\\"10px\\\" style=\\\"fill: #ffffff\\\" />\\n <rect\\n width=\\\"8px\\\"\\n height=\\\"8px\\\"\\n x=\\\"1px\\\"\\n y=\\\"1px\\\"\\n [style.fill]=\\\"group.value.color\\\"\\n />\\n </svg>\\n </div>\\n <div class=\\\"button-group\\\">\\n <div (click)=\\\"deleteGroup(group.value)\\\">\\n <i\\n class=\\\"fas fa-minus\\\"\\n matTooltip=\\\"Delete\\\"\\n matTooltipPosition=\\\"below\\\"\\n >\\n </i>\\n </div>\\n <div (click)=\\\"openRenameModal(renameModal, group.value)\\\">\\n <i\\n class=\\\"fas fa-edit\\\"\\n matTooltip=\\\"Rename\\\"\\n matTooltipPosition=\\\"below\\\"\\n >\\n </i>\\n </div>\\n <div (click)=\\\"openIconSelection(iconModal, group.value)\\\">\\n <span\\n class=\\\"fa {{ group.value.icon }}\\\"\\n matTooltip=\\\"icons\\\"\\n matTooltipPosition=\\\"below\\\"\\n ></span>\\n </div>\\n </div>\\n </label>\\n </div>\\n </form>\\n\\n <ng-template #renameModal>\\n <input\\n matInput\\n #groupRename\\n placeholder=\\\"Rename Group\\\"\\n (keyup.enter)=\\\"renameGroup(groupRename.value)\\\"\\n />\\n <br />\\n <br />\\n <div class=\\\"button-group\\\">\\n <button\\n matDialogClose\\n color=\\\"primary\\\"\\n mat-raised-button\\n (click)=\\\"renameGroup(groupRename.value)\\\"\\n >\\n Rename\\n </button>\\n <button matDialogClose mat-button>Cancel</button>\\n </div>\\n </ng-template>\\n\\n <ng-template #iconModal>\\n <div class=\\\"iconDropdown\\\">\\n <select class=\\\"fa\\\" [(ngModel)]=\\\"selectedIcon\\\">\\n <option\\n class=\\\"fa\\\"\\n *ngFor=\\\"let icon of iconList\\\"\\n value=\\\"{{ icon.id }}\\\"\\n [innerHTML]=\\\"icon.unicode\\\"\\n ></option>\\n </select>\\n <br />\\n <br />\\n <div class=\\\"button-group\\\">\\n <button\\n matDialogClose\\n color=\\\"primary\\\"\\n mat-raised-button\\n (click)=\\\"saveIcon(selectedIcon)\\\"\\n >\\n Save\\n </button>\\n <button matDialogClose mat-button>Cancel</button>\\n </div>\\n </div>\\n </ng-template>\\n </div>\\n <!-- subitem -->\\n</div>\\n<!-- select-group -->\\n\"","export default \":host #current-project-form {\\n display: flex;\\n flex-direction: column;\\n text-align: center;\\n padding: 5em;\\n}\"","export default \"\"","export default \":host {\\n min-height: 20em;\\n}\\n:host .fileslisting {\\n height: 20em;\\n overflow-y: scroll;\\n padding: 0px 20px;\\n}\\n:host .file-row {\\n display: flex;\\n background: #f9f9f9;\\n border: 1px solid transparent;\\n user-select: none;\\n -webkit-user-select: none;\\n -moz-user-select: none;\\n}\\n:host .clickable {\\n flex: 1;\\n max-width: 20em;\\n}\\n:host .size {\\n align-items: flex-end;\\n}\\n:host .file-row:hover {\\n border: 1px solid;\\n}\\n:host .file-row.selected {\\n background: #d3d3d3;\\n}\\n.error {\\n background-color: red;\\n color: white;\\n}\\n.lineBreak {\\n max-width: 350px;\\n word-break: break-word;\\n}\"","export default \":host .active-project {\\n background-color: #1aff8c;\\n}\\n:host .menu button.dropdown.button {\\n padding: 0.85em 1em;\\n}\\n:host .button.tiny {\\n margin: 0;\\n}\\n:host .current-project {\\n padding: 30px;\\n font-size: 14px;\\n}\\n:host .goods {\\n height: 27px;\\n margin: 0px;\\n padding: 0px;\\n}\\n:host .toggler {\\n margin-left: 10px;\\n}\\n:host .picker {\\n display: inline-block;\\n}\\n:host .group-bar {\\n display: flex;\\n flex-direction: row;\\n}\\n:host .path-buttons {\\n text-align: center;\\n}\\n:host .project-menu {\\n margin-left: 10px;\\n}\\n:host .top-bar {\\n position: fixed;\\n margin-top: -50px;\\n height: 50px;\\n z-index: 999;\\n}\\n:host .top-bar-right .top-bar-left {\\n -webkit-box-flex: 0;\\n flex-wrap: nowrap;\\n flex: 0 1 auto;\\n max-width: 100%;\\n}\\n:host .my-button {\\n border-radius: 5px;\\n padding: 5px;\\n}\\n:host .button-spacing {\\n margin-right: 15px;\\n}\\n@media print, screen and (min-width: 40em) {\\n :host .top-bar {\\n flex-wrap: nowrap;\\n flex: 0 1 auto;\\n }\\n}\\n:host .example-spacer {\\n flex: 1 1 auto;\\n}\"","export default \"<mat-toolbar class=\\\"top-bar\\\" color=\\\"primary\\\">\\n <img src=\\\"assets/logo.svg\\\" width=\\\"40PX\\\" />\\n <span style=\\\"color: white\\\">Taggit</span>\\n\\n <button\\n mat-icon-button\\n [matMenuTriggerFor]=\\\"project\\\"\\n color=\\\"foreground\\\"\\n class=\\\"project-menu\\\"\\n >\\n <mat-icon>menu</mat-icon>\\n </button>\\n\\n <mat-menu #project=\\\"matMenu\\\">\\n <span\\n mat-menu-item\\n *ngIf=\\\"selectedProject\\\"\\n (click)=\\\"openProjectModal(selectedProject)\\\"\\n >\\n Current Gallery/Map : {{ selectedProject.name }}\\n </span>\\n <button mat-menu-item (click)=\\\"openCreateProjectModal()\\\">\\n Create Gallery/Map\\n </button>\\n <button mat-menu-item [matMenuTriggerFor]=\\\"projectList\\\">\\n Select Gallery/Map\\n </button>\\n <button mat-menu-item (click)=\\\"openFilePicker(test)\\\">Import images from DesignSafe</button>\\n <button mat-menu-item [matMenuTriggerFor]=\\\"saveOptions\\\">Export Tags/Groups</button>\\n </mat-menu>\\n\\n <mat-menu #projectList=\\\"matMenu\\\">\\n <button\\n mat-menu-item\\n class=\\\"clickable\\\"\\n *ngFor=\\\"let p of projects\\\"\\n (click)=\\\"selectProject(p)\\\"\\n [ngClass]=\\\"{ 'active-project': p === selectedProject }\\\"\\n >\\n {{ p.name }}\\n </button>\\n </mat-menu>\\n\\n <mat-menu #saveOptions=\\\"matMenu\\\">\\n <button mat-menu-item (click)=\\\"saveFile(0)\\\">CSV file</button>\\n <button mat-menu-item (click)=\\\"saveFile(1)\\\">JSON file</button>\\n <button mat-menu-item (click)=\\\"openDownloadSelector()\\\">\\n Export to DesignSafe\\n </button>\\n </mat-menu>\\n\\n <span class=\\\"example-spacer\\\"></span>\\n\\n <div *ngIf=\\\"showTagger\\\" class=\\\"path-buttons\\\">\\n <div class=\\\"slides\\\" style=\\\"line-height: 1; font-size: 12px\\\">\\n {{ getAssetDisplay() }}\\n <div class=\\\"lr-buttons\\\" style=\\\"margin-top: 5px\\\">\\n <i\\n (click)=\\\"otherPath(false)\\\"\\n style=\\\"margin-right: 10px; cursor: pointer\\\"\\n class=\\\"fas fa-angle-left\\\"\\n ></i>\\n <i\\n (click)=\\\"otherPath(true)\\\"\\n style=\\\"margin-left: 10px; cursor: pointer\\\"\\n class=\\\"fas fa-angle-right\\\"\\n ></i>\\n </div>\\n </div>\\n </div>\\n\\n <span class=\\\"example-spacer\\\"></span>\\n\\n <div class=\\\"group-bar grid-x align-right\\\">\\n <button\\n mat-raised-button\\n class=\\\"button-spacing\\\"\\n [disabled]=\\\"selectedImages.length === 0\\\"\\n (click)=\\\"clearAll()\\\"\\n >\\n Clear Selected\\n </button>\\n\\n <!-- A link that looks like a button, links to Hazmapper-->\\n <a\\n class=\\\"button-spacing\\\"\\n mat-raised-button\\n href=\\\"{{ hazmapperLink }}\\\"\\n title=\\\"View in HazMapper\\\"\\n target=\\\"_blank\\\"\\n >\\n <img src=\\\"assets/hazmapper-header-logo.png\\\" width=\\\"25PX\\\" />\\n <span style=\\\"padding-left: 5px; color: #00BBD8\\\">View in HazMapper</span>\\n </a>\\n\\n <button\\n mat-raised-button\\n (click)=\\\"openAddGroupModal(addToGroupModal)\\\"\\n *ngIf=\\\"selectedImages.length > 0 && groupsExist && !showTagger\\\"\\n class=\\\"button-spacing\\\"\\n >\\n Add To Group\\n </button>\\n\\n <button\\n mat-raised-button\\n (click)=\\\"openAddGroupModal(addGroupModal)\\\"\\n *ngIf=\\\"selectedImages.length > 0 && !showTagger\\\"\\n >\\n Create Group\\n </button>\\n\\n <ng-template #addGroupModal>\\n <mat-form-field>\\n <mat-label>Group Name</mat-label>\\n <input\\n matInput\\n placeholder=\\\"Group Name\\\"\\n (keyup.enter)=\\\"addGroup(groupInput.value)\\\"\\n #groupInput\\n />\\n </mat-form-field>\\n\\n <div style=\\\"color: #ff0000\\\" *ngIf=\\\"invalidNameError\\\">Invalid Name!</div>\\n <div style=\\\"color: #ff0000\\\" *ngIf=\\\"existingNameError\\\">Existing Name!</div>\\n <br />\\n <br />\\n <button\\n mat-raised-button\\n color=\\\"primary\\\"\\n (click)=\\\"addGroup(groupInput.value)\\\"\\n >\\n Add Group\\n </button>\\n <button mat-button matDialogClose color=\\\"secondary\\\">Cancel</button>\\n </ng-template>\\n\\n <ng-template #addToGroupModal>\\n <mat-form-field appearance=\\\"fill\\\">\\n <mat-label>Groups</mat-label>\\n <mat-select\\n matNativeControl\\n required\\n [value]=\\\"groupToAdd\\\"\\n [compareWith]=\\\"compareGroup\\\"\\n (selectionChange)=\\\"changeGroupToAdd($event)\\\"\\n >\\n <mat-option\\n *ngFor=\\\"let group of groups | keyvalue\\\"\\n [value]=\\\"group.value\\\"\\n >\\n {{ group.key }}\\n </mat-option>\\n </mat-select>\\n </mat-form-field>\\n\\n <p>\\n <button\\n mat-raised-button\\n color=\\\"primary\\\"\\n matDialogClose\\n (click)=\\\"addToGroup(groupToAdd)\\\"\\n [disabled]=\\\"!groupToAdd\\\"\\n >\\n Add To Group\\n </button>\\n <button mat-button color=\\\"secondary\\\" matDialogClose>Cancel</button>\\n </p>\\n </ng-template>\\n </div>\\n\\n <button\\n *ngIf=\\\"showTagger && tagFeaturesQueue.length > 0\\\"\\n mat-raised-button\\n style=\\\"margin-left: 15px\\\"\\n (click)=\\\"saveTags()\\\"\\n >\\n <i class=\\\"fas fa-save\\\"></i>\\n Save Tags\\n </button>\\n\\n <button\\n *ngIf=\\\"groupsExist && !showTagger\\\"\\n mat-raised-button\\n style=\\\"margin-left: 15px\\\"\\n (click)=\\\"toggleTagger()\\\"\\n >\\n Taggit!\\n </button>\\n\\n <button\\n *ngIf=\\\"showTagger\\\"\\n mat-raised-button\\n style=\\\"margin-left: 15px\\\"\\n (click)=\\\"toggleTagger()\\\"\\n >\\n Gallery/Map\\n </button>\\n</mat-toolbar>\\n\"","export default \"<div *ngFor=\\\"let opt of form.options\\\" [id]=\\\"form.label\\\" class=\\\"input-group\\\">\\n <div class=\\\"form-check form-check\\\">\\n <label class=\\\"form-check-label\\\">\\n <input\\n class=\\\"form-check-input\\\"\\n type=\\\"checkbox\\\"\\n [checked]=\\\"isChecked(opt)\\\"\\n id=\\\"inlineCheckbox1\\\"\\n value=\\\"{{ opt.label }}\\\"\\n (change)=\\\"selected($event, opt)\\\"\\n />\\n {{ opt.label }}\\n </label>\\n </div>\\n</div>\\n\"","export default \"\"","import { Component, OnInit } from '@angular/core';\n\n@Component({\n selector: 'app-notfound',\n templateUrl: './notfound.component.html',\n styleUrls: ['./notfound.component.scss'],\n})\nexport class NotFoundComponent implements OnInit {\n constructor() {}\n\n ngOnInit() {}\n}\n","export enum EnvironmentType {\n Production = 'production',\n Staging = 'staging',\n Local = 'local',\n}\n","import {\n Feature as GeoJSONFeature,\n GeoJsonProperties,\n Geometry,\n FeatureCollection as IFeatureCollection,\n} from 'geojson';\n\n// TODO: break these out into their own files\n\nexport interface IPointCloud {\n id: number;\n description: string;\n conversion_parameters: string;\n feature_id?: number;\n task_id?: string;\n project_id: number;\n}\n\n// export interface Group {\n// groupName: Array<string>;\n// formList: Array<any>;\n// // type: any;\n// }\n\n// export interface Group {\n// groupName: Array<string>;\n// formList: Array<any>;\n// // type: any;\n// }\n\nexport interface Group {\n groupName: string;\n formList: Array<any>;\n color: string;\n // type: any;\n}\n\nexport class Group implements Group {}\n\nexport interface TagGroup {\n name: string;\n id?: number;\n color?: string;\n icon?: string;\n forms?: GroupForm[];\n}\n\nexport class TagGroup implements TagGroup {}\n\nexport interface GroupForm {\n id?: string;\n groupName?: string;\n label?: string;\n color?: string;\n type?: string;\n options?: Array<any>;\n}\n\nexport class GroupForm implements GroupForm {}\n\nexport interface Tag {\n id?: string;\n value?: any;\n}\n\nexport class Tag implements Tag {}\n\n// NOTE: For geojson/tag\nexport interface TagValue {\n id: number;\n featureId?: number;\n tagId?: number;\n groupId?: string;\n value?: Array<any> | string | number;\n}\n\nexport class TagValue implements TagValue {}\n\nexport class AssetFilters {\n // bbox has the following format: [sw_lng, sw_lat, ne_lng, ne_lat], the same as leaflet\n bbox: Array<number> = [];\n assetType: Set<string> = new Set<string>();\n\n updateAssetTypes(assetType: string) {\n this.assetType.has(assetType)\n ? this.assetType.delete(assetType)\n : this.assetType.add(assetType);\n }\n\n updateBBox(bbox: Array<number>): void {\n this.bbox = bbox;\n }\n\n toJson() {\n return {\n assetType: [...this.assetType],\n bbox: this.bbox,\n };\n }\n}\n\nexport interface Project {\n description: string;\n id?: number;\n name: string;\n ds_id?: string;\n title?: string;\n uuid?: string;\n public?: boolean;\n system_file?: string;\n system_id?: string;\n system_path?: string;\n deletable?: boolean;\n deleting?: boolean;\n deletingFailed?: boolean;\n}\n\nexport class Project implements Project {}\n\nexport interface ProjectRequest {\n project: Project;\n observable?: boolean;\n watch_content?: boolean;\n}\n\nexport class ProjectRequest implements ProjectRequest {}\n\nexport class AuthToken {\n token: string;\n expires: Date;\n /**\n *\n * @param token : String\n * @param expires: Date\n */\n constructor(token: string, expires: Date) {\n this.token = token;\n this.expires = new Date(expires);\n }\n\n static fromExpiresIn(token: string, expires_in: number) {\n const expires = new Date(new Date().getTime() + expires_in * 1000);\n return new AuthToken(token, expires);\n }\n\n /**\n * Checks if the token is expired or not\n */\n public isExpired(): boolean {\n return new Date().getTime() > this.expires.getTime();\n }\n}\n\nexport interface IFeatureAsset {\n id?: number;\n path?: string;\n uuid?: string;\n feature_id?: number;\n asset_type?: string;\n display_path?: string;\n}\n\nexport class FeatureAsset implements IFeatureAsset {\n id: number;\n path: string;\n uuid: string;\n feature_id: number;\n asset_type: string;\n display_path: string;\n\n // TODO: Implenent this\n get assetPath(): string {\n return '';\n }\n}\n\nexport interface FeatureStyles {\n // [key: string]?: string | number;\n faIcon?: string;\n color?: string;\n}\n\nexport class FeatureStyles implements FeatureStyles {}\n\nexport interface Overlay {\n id: number;\n path: string;\n uuid: string;\n minLon: number;\n minLat: number;\n maxLon: number;\n maxLat: number;\n project_id: number;\n label: string;\n}\n\ninterface AppGeoJSONFeature extends GeoJSONFeature {\n assets?: Array<IFeatureAsset>;\n styles?: FeatureStyles;\n project_id?: number;\n // featureType?(): String\n}\n\nexport class FeatureCollection implements IFeatureCollection {\n features: Feature[];\n type: any;\n}\n\nexport class Feature implements AppGeoJSONFeature {\n geometry: Geometry;\n // Taggit specific:\n // properties.taggit\n // properties.taggit.tags: Tag[]\n // properties.taggit.groups: Group[]\n properties: GeoJsonProperties;\n id?: string | number;\n type: any;\n assets?: Array<IFeatureAsset>;\n styles?: FeatureStyles;\n project_id?: number;\n\n constructor(f: AppGeoJSONFeature) {\n this.geometry = f.geometry;\n this.properties = f.properties;\n\n // NOTE: Taggit-specific\n this.properties.taggit = this.properties.taggit ? this.properties.taggit : {};\n this.properties.taggit.groups = this.properties.taggit.groups ? this.properties.taggit.groups : [];\n this.properties.taggit.tags = this.properties.taggit.tags ? this.properties.taggit.tags : [];\n\n this.id = f.id;\n this.type = f.type;\n this.assets = f.assets;\n this.styles = f.styles;\n this.project_id = f.project_id;\n }\n\n initialAsset?() {\n return this.assets[0];\n }\n\n featureType?(): string {\n if (this.assets && this.assets.length === 1) {\n return this.initialAsset().asset_type;\n }\n\n if (this.assets && this.assets.length > 1) {\n return 'collection';\n }\n\n if (!this.assets.length) {\n return this.geometry.type;\n }\n }\n\n featurePath?(): string {\n const initialAsset = this.initialAsset();\n if (initialAsset.display_path) {\n return initialAsset.display_path;\n } else if (initialAsset.path) {\n return initialAsset.path;\n } else {\n return this.id.toString();\n }\n }\n\n featureShortPath?(): string {\n const [initialAsset] = this.assets;\n if (initialAsset.display_path) {\n return /[^/]*$/.exec(initialAsset.display_path)[0];\n } else if (initialAsset.path) {\n const path = /[^/]*$/.exec(initialAsset.path)[0];\n return path.slice(0, 15) + '...';\n } else {\n return this.id.toString();\n }\n }\n}\n\nexport interface IProjectUser {\n id: number;\n username: string;\n}\n","import { EnvironmentType } from './environmentType';\n\nexport interface AppEnvironment {\n production: boolean;\n apiUrl: string;\n jwt?: string;\n clientId: string;\n baseHref: string;\n backend: EnvironmentType;\n}\n\nexport const environment: AppEnvironment = {\n production: true,\n apiUrl: 'https://agave.designsafe-ci.org/geo/v2/',\n clientId: 'jHXnvsmQQcmP43qlrG7ATaxFXHQa',\n baseHref: '/',\n backend: EnvironmentType.Production,\n};\n","import { Injectable } from '@angular/core';\nimport { HttpClient } from '@angular/common/http';\nimport { AuthToken } from '../models/models';\nimport { environment } from '../../environments/environment';\nimport { Observable, ReplaySubject } from 'rxjs';\nimport { Router } from '@angular/router';\n\nexport class AuthenticatedUser {\n public readonly username: string;\n public readonly email: string;\n private _token: AuthToken;\n\n constructor(username: string, email: string) {\n this.username = username;\n this.email = email;\n }\n}\n\ninterface OpenIDUser {\n name: string;\n email: string;\n}\n\n@Injectable({ providedIn: 'root' })\nexport class AuthService {\n private _currentUser: ReplaySubject<AuthenticatedUser> =\n new ReplaySubject<AuthenticatedUser>(1);\n public readonly currentUser: Observable<AuthenticatedUser> =\n this._currentUser.asObservable();\n userToken: AuthToken;\n private LS_TOKEN_KEY = 'hazmapperToken';\n private LS_USER_KEY = 'hazmapperUser';\n\n constructor(private http: HttpClient, private router: Router) {}\n\n public login() {\n // First, check if the user has a token in localStorage\n const tokenStr = localStorage.getItem(this.LS_TOKEN_KEY);\n if (!tokenStr) {\n this.redirectToauthenticaor();\n } else {\n const token = JSON.parse(tokenStr);\n this.userToken = new AuthToken(token.token, new Date(token.expires));\n if (!this.userToken || this.userToken.isExpired()) {\n this.logout();\n this.redirectToauthenticaor();\n }\n this.getUserInfo();\n }\n }\n\n private redirectToauthenticaor() {\n const client_id = environment.clientId;\n const callback = location.origin + environment.baseHref + 'callback';\n const state = Math.random().toString(36);\n const AUTH_URL = `https://agave.designsafe-ci.org/authorize?scope=openid&client_id=${client_id}&response_type=token&redirect_uri=${callback}&state=${state}`;\n window.location.href = AUTH_URL;\n }\n\n /**\n * Checks to make sure that the user has a token and the token is not expired;\n */\n public isLoggedIn(): boolean {\n return this.userToken && !this.userToken.isExpired();\n }\n\n public logout(): void {\n this.userToken = null;\n localStorage.removeItem(this.LS_TOKEN_KEY);\n localStorage.removeItem(this.LS_USER_KEY);\n }\n\n public setToken(token: string, expires: number): void {\n this.userToken = AuthToken.fromExpiresIn(token, expires);\n localStorage.setItem(this.LS_TOKEN_KEY, JSON.stringify(this.userToken));\n // hit the wso2 api to retrieve the username etc\n this.router.navigate(['/']);\n }\n\n public getUserInfo() {\n const INFO_URL = `https://agave.designsafe-ci.org/oauth2/userinfo?schema=openid`;\n const userStr = localStorage.getItem(this.LS_USER_KEY);\n const user = JSON.parse(userStr);\n if (user !== null) {\n this._currentUser.next(new AuthenticatedUser(user.username, user.email));\n } else {\n this.http.get<OpenIDUser>(INFO_URL).subscribe((resp) => {\n const u = new AuthenticatedUser(resp.name, resp.email);\n localStorage.setItem(this.LS_USER_KEY, JSON.stringify(u));\n this._currentUser.next(u);\n });\n }\n }\n}\n","import { Injectable } from '@angular/core';\nimport { environment } from 'src/environments/environment';\nimport { ToastrService } from 'ngx-toastr';\nimport { HttpClient } from '@angular/common/http';\nimport { INotification } from '../models/notification';\nimport { interval, Observable, ReplaySubject } from 'rxjs';\nimport { AuthService } from '../services/authentication.service';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class NotificationsService {\n // Interval time to get notifications in millisecs\n private TIMEOUT = 5000;\n private _notifications: ReplaySubject<Array<INotification>> =\n new ReplaySubject<Array<INotification>>(1);\n public readonly notifications: Observable<Array<INotification>> =\n this._notifications.asObservable();\n\n constructor(\n private toastr: ToastrService,\n private http: HttpClient,\n private authService: AuthService\n ) {\n if (this.authService.isLoggedIn()) {\n const timer = interval(this.TIMEOUT);\n timer.subscribe((next) => {\n this.getRecent();\n });\n }\n }\n\n // Sends a request to GeoAPI to retrieve recent notifications\n getRecent(): void {\n const baseUrl = environment.apiUrl + 'notifications/';\n const now = new Date();\n const then = new Date(now.getTime() - this.TIMEOUT);\n\n this.http\n .get<Array<INotification>>(baseUrl + `?startDate=${then.toISOString()}`)\n .subscribe((notes) => {\n this._notifications.next(notes);\n notes.forEach((note) => {\n switch (note.status) {\n case 'success':\n this.showSuccessToast(note.message);\n break;\n case 'error':\n this.showErrorToast(note.message);\n break;\n default:\n break;\n }\n });\n });\n }\n\n showSuccessToast(message: string): void {\n this.toastr.success(message);\n }\n\n showImportErrorToast(message: string): void {\n this.toastr.error(message + ', trying alternate method');\n }\n\n showErrorToast(message: string): void {\n this.toastr.error(message);\n }\n}\n","import { Injectable } from '@angular/core';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class ScrollService {\n constructor() {}\n\n public scrollRestored = true; // if true, the scroll was restored to the proper place\n public scrollPosition = 0;\n\n setScrollRestored(change: boolean) {\n this.scrollRestored = change;\n }\n\n setScrollPosition() {\n this.scrollPosition = document.documentElement.scrollTop;\n }\n\n scroll() {\n // Attempts to scroll to the specified location\n document.documentElement.scroll({ top: this.scrollPosition });\n // if it reaches there, marks the check as complete\n if (document.documentElement.scrollTop == this.scrollPosition) {\n this.scrollRestored = false;\n }\n }\n}\n","import { Injectable } from '@angular/core';\nimport { HttpClient } from '@angular/common/http';\nimport { BehaviorSubject, Observable, ReplaySubject, Subject } from 'rxjs';\nimport { LatLng } from 'leaflet';\nimport {\n AssetFilters,\n FeatureAsset,\n FeatureStyles,\n IFeatureAsset,\n IPointCloud,\n Overlay,\n TagGroup,\n Tag,\n TagValue,\n GroupForm,\n} from '../models/models';\nimport { Feature, FeatureCollection } from '../models/models';\nimport { environment } from '../../environments/environment';\nimport { Form } from '@angular/forms';\nimport { take, first } from 'rxjs/operators';\nimport * as querystring from 'querystring';\nimport { RemoteFile } from 'ng-tapis';\nimport { NotificationsService } from './notifications.service';\nimport { ScrollService } from './scroll.service';\nimport { getRandomColor } from '../utils/randomColor';\nimport { v4 as uuidv4 } from 'uuid';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class GeoDataService {\n // TODO: clean this up and put the observables up here. Also look into Replay/Behavior\n // TODO: Go over this and remove all unused functions, a lot of this was copy/pasted over from Hazmapper without a second thought\n private _features: BehaviorSubject<FeatureCollection>;\n private features$: Observable<FeatureCollection>;\n private _activeFeature: BehaviorSubject<any>;\n private _mapMouseLocation: BehaviorSubject<any>;\n private _basemap: BehaviorSubject<any>;\n private _overlays: BehaviorSubject<any>;\n private _activeOverlay: BehaviorSubject<any>;\n private _pointClouds: BehaviorSubject<Array<IPointCloud>> =\n new BehaviorSubject<Array<IPointCloud>>(null);\n public readonly pointClouds: Observable<Array<IPointCloud>> =\n this._pointClouds.asObservable();\n private fileList: Array<RemoteFile>;\n\n private _loaded: BehaviorSubject<boolean> = new BehaviorSubject(null);\n public loaded: Observable<boolean> = this._loaded.asObservable();\n\n private _loadingGallery: BehaviorSubject<boolean> = new BehaviorSubject(null);\n public loadingGallery: Observable<boolean> = this._loadingGallery.asObservable();\n\n private _activeGroupId: BehaviorSubject<number> = new BehaviorSubject(null);\n public activeGroupId: Observable<number> = this._activeGroupId.asObservable();\n\n private _activeGroup: BehaviorSubject<TagGroup> = new BehaviorSubject(null);\n public activeGroup: Observable<TagGroup> = this._activeGroup.asObservable();\n\n private _tagFeaturesQueue: BehaviorSubject<any[]> = new BehaviorSubject([]);\n public tagFeaturesQueue: Observable<any[]> =\n this._tagFeaturesQueue.asObservable();\n\n private _loadingFeatureProperties: BehaviorSubject<boolean> =\n new BehaviorSubject(false);\n public loadingFeatureProperties: Observable<boolean> =\n this._loadingFeatureProperties.asObservable();\n\n private _activeGroupFeature: BehaviorSubject<any> = new BehaviorSubject<any>(\n null\n );\n public activeGroupFeature: Observable<any> =\n this._activeGroupFeature.asObservable();\n\n private _groups: BehaviorSubject<Map<string, TagGroup>> = new BehaviorSubject(\n null\n );\n public groups: Observable<Map<string, TagGroup>> =\n this._groups.asObservable();\n\n private _groupsFeatures: BehaviorSubject<Map<string, Feature[]>> =\n new BehaviorSubject(null);\n public groupsFeatures: Observable<Map<string, Feature[]>> =\n this._groupsFeatures.asObservable();\n\n constructor(\n private http: HttpClient,\n private notificationsService: NotificationsService,\n private scrollService: ScrollService\n ) {\n this._features = new BehaviorSubject<FeatureCollection>({\n type: 'FeatureCollection',\n features: [],\n });\n this.features$ = this._features.asObservable();\n this._activeFeature = new BehaviorSubject<any>(null);\n this._mapMouseLocation = new BehaviorSubject<any>(null);\n\n // For the style of the basemap, defaults to OpenStreetmap\n this._basemap = new BehaviorSubject<any>('roads');\n\n // Holds all of the overlays on a project\n this._overlays = new BehaviorSubject<any>(null);\n this._activeOverlay = new BehaviorSubject<any>(null);\n }\n\n getFeature(\n projectId: number,\n feature: Feature\n ): Observable<FeatureCollection> {\n return this.http.get<FeatureCollection>(\n environment.apiUrl + `/projects/${projectId}/features/${feature.id}/`\n );\n }\n\n setFeatures(fc: FeatureCollection) {\n fc.features = fc.features.map((feat: Feature) => new Feature(feat));\n this.getGroups(fc.features);\n this._features.next(fc);\n }\n\n setFeatureProperties(featureId: string | number, properties: any) {\n this.features.pipe(first()).subscribe((fc) => {\n fc.features = fc.features.map((feat: Feature) => {\n if (feat.id === featureId) {\n feat.properties = properties;\n }\n return feat;\n });\n this.setFeatures(fc);\n });\n }\n\n updateTagFeaturesQueue(projectId) {\n this._tagFeaturesQueue.value.forEach((featureId) => {\n const feature = this._features.value.features.find(\n (f) => f.id == featureId\n );\n this.updateFeatureProperty(projectId, featureId, feature.properties);\n });\n this.resetTagFeaturesQueue();\n }\n\n setFeatureStyles(featureId: string | number, styles: FeatureStyles) {\n this.features.pipe(first()).subscribe((fc) => {\n fc.features = fc.features.map((feat: Feature) => {\n if (feat.id === featureId) {\n feat.styles = styles;\n }\n return feat;\n });\n this.setFeatures(fc);\n });\n }\n\n getFeatures(\n projectId: number,\n query: AssetFilters = new AssetFilters(),\n restoreScroll = false\n ): void {\n const qstring: string = querystring.stringify(query.toJson());\n this._loadingGallery.next(false);\n this.http\n .get<FeatureCollection>(\n environment.apiUrl + `/projects/${projectId}/features/` + '?' + qstring\n )\n .subscribe(\n (fc: FeatureCollection) => {\n this.setFeatures(fc);\n this._loaded.next(true);\n this._loadingGallery.next(true);\n\n if (restoreScroll) {\n this.scrollService.setScrollRestored(true);\n }\n },\n (error) => {\n this.notificationsService.showErrorToast(\n 'Failed to retrieve project data! Geoapi might be down.'\n );\n }\n );\n }\n\n deleteFeature(feature: Feature) {\n this.http\n .delete(\n environment.apiUrl +\n `projects/${feature.project_id}/features/${feature.id}/`\n )\n .subscribe((resp) => {\n this.getFeatures(feature.project_id, new AssetFilters(), true);\n });\n }\n\n getPointClouds(projectId: number) {\n this.http\n .get<Array<IPointCloud>>(\n environment.apiUrl + `/projects/${projectId}/point-cloud/`\n )\n .subscribe((resp) => {\n this._pointClouds.next(resp);\n });\n }\n\n setActiveGroup(group: TagGroup): void {\n this._activeGroup.next(group);\n if (group) {\n const groupFeatures = this._groupsFeatures.value.get(group.name);\n if (\n !this._activeGroupFeature.value ||\n !groupFeatures.some((gf) => this._activeGroupFeature.value.id === gf.id)\n ) {\n this.setActiveGroupFeature(groupFeatures[0]);\n }\n } else {\n this.setActiveGroupFeature(null);\n }\n }\n\n // NOTE: Tag features queue is the local change to tags before posting it \n // to geoapi to persist.\n setTagFeaturesQueue(featureId, updatedTag) {\n const tagFeatures = this._tagFeaturesQueue.value;\n const fc = this._features.value;\n\n fc.features.map((f) => {\n if (featureId == f.id) {\n if (f.properties.taggit.tags.some((t) => updatedTag.id == t.id)) {\n f.properties.taggit.tags.map((t) => {\n if (t.id == updatedTag.id) {\n t.value = updatedTag.value;\n }\n return t;\n });\n } else {\n f.properties.taggit.tags = f.properties.taggit.tags.length\n ? [...f.properties.taggit.tags, updatedTag]\n : [updatedTag];\n }\n }\n return f;\n });\n\n if (!tagFeatures.includes(featureId)) {\n tagFeatures.push(featureId);\n }\n\n this._tagFeaturesQueue.next(tagFeatures);\n this._features.next(fc);\n }\n\n resetTagFeaturesQueue() {\n this._tagFeaturesQueue.next([]);\n }\n\n setActiveGroupFeature(feat: any): void {\n this._activeGroupFeature.next(feat);\n }\n\n addFeature(feat: Feature): void {\n this.features$.pipe(take(1)).subscribe((current: FeatureCollection) => {\n current.features.push(feat);\n this._features.next(current);\n });\n }\n\n addPointCloud(\n projectId: number,\n title: string,\n conversionParams: string\n ): void {\n const payload = {\n description: title,\n conversion_parameters: conversionParams,\n };\n this.http\n .post(environment.apiUrl + `/projects/${projectId}/point-cloud/`, payload)\n .subscribe(\n (resp) => {\n this.getPointClouds(projectId);\n },\n (error) => {\n this.notificationsService.showErrorToast(\n 'Failed to update image property!'\n );\n }\n );\n }\n\n updateFeatureProperty(\n projectId: number,\n featureId: string | number,\n groupData: any\n ): void {\n this._loadingFeatureProperties.next(true);\n this.http\n .post(\n environment.apiUrl +\n `projects/${projectId}/features/${featureId}/properties/`,\n groupData\n )\n .subscribe(\n (resp) => {\n this.features.pipe(first()).subscribe((fc) => {\n this.setFeatureProperties(featureId, groupData);\n this._loadingFeatureProperties.next(false);\n });\n },\n (error) => {\n this.notificationsService.showErrorToast(\n 'Failed to save tag values!'\n );\n }\n );\n }\n\n // NOTE: unused for now\n updateFeatureStyles(\n projectId: number,\n featureId: string | number,\n styles: FeatureStyles\n ): void {\n this.http\n .post(\n environment.apiUrl +\n `/projects/${projectId}/features/${featureId}/styles/`,\n styles\n )\n .subscribe(\n (resp) => {\n this.features.pipe(first()).subscribe((fc) => {\n this.setFeatureStyles(featureId, styles);\n });\n },\n (error) => {\n this.notificationsService.showErrorToast(\n 'Failed to update image style!'\n );\n }\n );\n }\n\n deletePointCloud(pc: IPointCloud): void {\n this.http\n .delete(\n environment.apiUrl + `/projects/${pc.project_id}/point-cloud/${pc.id}/`\n )\n .subscribe((resp) => {\n this.getPointClouds(pc.project_id);\n });\n }\n\n addFileToPointCloud(pc: IPointCloud, file: File) {\n const form = new FormData();\n form.append('file', file);\n this.http\n .post(\n environment.apiUrl + `/projects/${pc.project_id}/point-cloud/${pc.id}/`,\n form\n )\n .subscribe((resp) => {\n console.log(resp);\n });\n }\n\n // This function updates the underlying observable, so changes naturally flow to feature service\n importFileFromTapis(projectId: number, files: Array<RemoteFile>): void {\n const tmp = files.map((f) => ({ system: f.system, path: f.path }));\n const payload = {\n files: tmp,\n };\n this.fileList = tmp;\n this.http\n .post(\n environment.apiUrl + `projects/${projectId}/features/files/import/`,\n payload\n )\n\n .subscribe(\n (resp) => {\n this.notificationsService.showSuccessToast('Import started!');\n },\n (error) => {\n this.notificationsService.showImportErrorToast(\n 'Import failed! Try again?'\n );\n }\n );\n }\n\n // An alternate function for importing images with no GPS data. A feature is created elsewhere, and the image is added to the feature\n // Inputs:\n // projectId: Id number of current project\n // features: A pre-created feature with user-defined or zeroed out gps data\n // file: A Tapis Remote File containing the image to be imported\n importImage(projectId: number, feature: Feature, path: string): void {\n const featureId = feature.id;\n let file;\n this.fileList.forEach((remoteFile) => {\n if (remoteFile.path == path) {\n file = remoteFile;\n }\n });\n const payload = { system_id: file.system, path: file.path };\n this.http\n .post(\n environment.apiUrl +\n `projects/${projectId}/features/${featureId}/assets/`,\n payload\n )\n .subscribe((resp) => {\n this.notificationsService.showSuccessToast('Import started!');\n // this.getFeatures(projectId)\n });\n }\n\n // Creates a new feature from an uploaded locally created feature\n uploadNewFeature(projectId: number, feature: Feature, path: string): void {\n const payload = feature;\n let response;\n // Calls the addFeatureAsset route in GeoAPI, resp is a list of features\n this.http\n .post(environment.apiUrl + `projects/${projectId}/features/`, payload)\n .subscribe((resp) => {\n response = new Feature(resp[0]);\n this.importImage(projectId, response, path);\n });\n }\n\n downloadGeoJSON(projectId: number, query: AssetFilters = new AssetFilters()) {\n const qstring: string = querystring.stringify(query.toJson());\n const downloadLink = document.createElement('a');\n\n this.http\n .get<FeatureCollection>(\n environment.apiUrl + `/projects/${projectId}/features/` + '?' + qstring\n )\n .subscribe((resp) => {\n const blob = new Blob([JSON.stringify(resp)], {\n type: 'application/json',\n });\n downloadLink.href = URL.createObjectURL(blob);\n downloadLink.setAttribute('download', 'hazmapper.json');\n document.body.appendChild(downloadLink);\n downloadLink.click();\n document.body.removeChild(downloadLink);\n });\n }\n\n uploadFile(projectId: number, file: File): void {\n const form: FormData = new FormData();\n form.append('file', file, file.name);\n this.http\n .post<Array<Feature>>(\n environment.apiUrl + `/projects/${projectId}/features/files/`,\n form\n )\n .subscribe(\n (feats) => {\n feats.forEach((feat) => {\n this.addFeature(new Feature(feat));\n });\n },\n (error) => {\n // TODO: Add notification\n }\n );\n }\n\n uploadAssetFile(projectId: number, featureId: number, file: File): void {\n const form: FormData = new FormData();\n form.append('file', file, file.name);\n this.http\n .post<Feature>(\n environment.apiUrl +\n `/api/projects/${projectId}/features/${featureId}/assets/`,\n form\n )\n .subscribe(\n (feature) => {\n // TODO workaround to update activeFeature\n const f = this._activeFeature.getValue();\n if (f && f.id === featureId) {\n this.activeFeature = new Feature(feature);\n this.getFeatures(projectId);\n }\n },\n (error) => {\n // TODO: Add notification\n }\n );\n }\n\n getOverlays(projectId: number): void {\n this.http\n .get(environment.apiUrl + `/projects/${projectId}/overlays/`)\n .subscribe((ovs: Array<Overlay>) => {\n this._overlays.next(ovs);\n });\n }\n\n addOverlay(\n projectId: number,\n file: File,\n label: string,\n minLat: number,\n maxLat: number,\n minLon: number,\n maxLon: number\n ) {\n const payload = new FormData();\n payload.append('file', file);\n payload.append('label', label);\n payload.append('minLat', minLat.toFixed(6));\n payload.append('maxLat', maxLat.toFixed(6));\n payload.append('minLon', minLon.toFixed(6));\n payload.append('maxLon', maxLon.toFixed(6));\n\n this.http\n .post(environment.apiUrl + `/projects/${projectId}/overlays/`, payload)\n .subscribe((resp) => {\n this.getOverlays(projectId);\n });\n }\n\n // Call on getFeatures (each time feature update)\n getGroups(featureList: Feature[]): void {\n const groups = new Map<string, TagGroup>();\n const groupsFeatures = new Map<string, Feature[]>();\n featureList\n .filter(\n (feat: Feature) =>\n feat.properties.taggit.groups && feat.properties.taggit.groups.length > 0\n )\n .forEach((feat: Feature) => {\n feat.properties.taggit.groups.forEach((group: TagGroup) => {\n groupsFeatures.set(\n group.name,\n groupsFeatures.has(group.name)\n ? [...groupsFeatures.get(group.name), feat]\n : [feat]\n );\n groups.set(group.name, group);\n });\n });\n this._groups.next(groups);\n this._groupsFeatures.next(groupsFeatures);\n const activeGroup = this._activeGroup.value;\n if (activeGroup) {\n this.setActiveGroup(groups.get(activeGroup.name));\n }\n }\n\n getGroup(groupName: string) {\n return this._groups.value.get(groupName);\n }\n\n getGroupFeatures(featureList: Feature[], group: TagGroup) {\n return featureList.filter(\n (feat: Feature) =>\n feat.properties.taggit.groups &&\n feat.properties.taggit.groups.length &&\n feat.properties.taggit.groups.some((grp: TagGroup) => grp.id === group.id)\n );\n }\n\n private createGroup(\n featureList: Feature[],\n group: TagGroup,\n style?: FeatureStyles\n ): Feature[] {\n return featureList.map((feat: Feature) => {\n const groupProp = feat.properties.taggit.groups.filter((grp: TagGroup) => grp.id !== group.id);\n groupProp.push(group);\n feat.properties.taggit.groups = groupProp;\n feat.properties.style = style\n ? style\n : feat.properties.style\n ? feat.properties.style\n : {};\n\n return feat;\n });\n }\n\n private updateGroup(\n featureList: Feature[],\n group: TagGroup,\n style?: FeatureStyles\n ): Feature[] {\n return this.getGroupFeatures(featureList, group).map((feat: Feature) => {\n const groupProp = feat.properties.taggit.groups.filter(\n (grp: TagGroup) => grp.id !== group.id\n );\n groupProp.push(group);\n feat.properties.taggit.groups = groupProp;\n feat.properties.style = style\n ? style\n : feat.properties.style\n ? feat.properties.style\n : {};\n\n return feat;\n });\n }\n\n private deleteGroup(featureList: Feature[], group: TagGroup): Feature[] {\n return this.getGroupFeatures(featureList, group).map((feat: Feature) => {\n feat.properties.taggit.groups = feat.properties.taggit.groups.filter(\n (grp: TagGroup) => grp.id !== group.id\n );\n return feat;\n });\n }\n\n createNewGroup(projectId: number, featureList: Feature[], name: string) {\n const id = uuidv4();\n const myRandColor: string = getRandomColor();\n const group: TagGroup = {\n id,\n name,\n color: myRandColor,\n icon: 'fa-house-damage',\n };\n const style = {\n color: myRandColor,\n faIcon: 'fa-house-damage',\n };\n this.createGroupFeatures(projectId, featureList, group, style);\n return group;\n }\n\n createGroupFeatures(\n projectId: number,\n featureList: Feature[],\n group: TagGroup,\n style?: FeatureStyles\n ) {\n if (style) {\n this.createGroup(featureList, group, style).forEach((feat: Feature) => {\n this.updateFeatureProperty(projectId, feat.id, feat.properties);\n });\n } else {\n this.createGroup(featureList, group).forEach((feat: Feature) => {\n this.updateFeatureProperty(projectId, feat.id, feat.properties);\n });\n }\n }\n\n deleteGroupFeatures(\n projectId: number,\n featureList: Feature[],\n group: TagGroup\n ) {\n this.deleteGroup(featureList, group).forEach((feat: Feature) => {\n this.updateFeatureProperty(projectId, feat.id, feat.properties);\n });\n }\n\n updateGroupFeatures(\n projectId: number,\n featureList: Feature[],\n group: TagGroup,\n style?: FeatureStyles\n ) {\n if (style) {\n this.updateGroup(featureList, group, style).forEach((feat: Feature) => {\n this.updateFeatureProperty(projectId, feat.id, feat.properties);\n });\n } else {\n this.updateGroup(featureList, group).forEach((feat: Feature) => {\n this.updateFeatureProperty(projectId, feat.id, feat.properties);\n });\n }\n }\n\n renameGroup(\n projectId: number,\n featureList: Feature[],\n group: TagGroup,\n name: string\n ): void {\n const renamedGroup = {\n ...group,\n name,\n };\n\n this.updateGroupFeatures(projectId, featureList, renamedGroup);\n }\n\n reiconGroup(\n projectId: number,\n featureList: Feature[],\n group: TagGroup,\n icon: string\n ): void {\n const reiconedGroup = {\n ...group,\n icon,\n };\n\n const reiconedStyle = {\n faIcon: icon,\n color: group.color ? group.color : '#00C8FF',\n };\n\n this.updateGroupFeatures(\n projectId,\n featureList,\n reiconedGroup,\n reiconedStyle\n );\n }\n\n public get overlays(): Observable<Array<Overlay>> {\n return this._overlays.asObservable();\n }\n\n public get features(): Observable<FeatureCollection> {\n return this._features.asObservable();\n }\n\n public get activeFeature() {\n return this._activeFeature.asObservable();\n }\n\n // TODO: This is heinous\n public set activeFeature(f: any) {\n if (f) {\n if (f === this._activeFeature.getValue()) {\n this._activeFeature.next(null);\n } else {\n this._activeFeature.next(f);\n }\n } else {\n this._activeFeature.next(null);\n }\n }\n\n public get activeOverlay(): Observable<Overlay> {\n return this._activeOverlay.asObservable();\n }\n\n public set activeOverlay(ov) {\n this._activeOverlay.next(ov);\n }\n\n public get mapMouseLocation(): Observable<LatLng> {\n return this._mapMouseLocation.asObservable();\n }\n\n public set mapMouseLocation(loc) {\n this._mapMouseLocation.next(loc);\n }\n\n public set basemap(bmap) {\n this._basemap.next(bmap);\n }\n\n public get basemap(): any {\n return this._basemap.asObservable();\n }\n}\n","export function getRandomColor() {\n const letters = '0123456789ABCDEF';\n let color = '#';\n for (let i = 0; i < 6; i++) {\n color += letters[Math.floor(Math.random() * 16)];\n }\n return color;\n}\n","import { Component, OnInit } from '@angular/core';\nimport { GeoDataService } from '../../services/geo-data.service';\nimport { Feature } from '../../models/models';\nimport {\n AuthenticatedUser,\n AuthService,\n} from '../../services/authentication.service';\nimport { Observable } from 'rxjs';\nimport { BsModalRef, BsModalService } from 'ngx-foundation';\nimport { ModalFileBrowserComponent } from '../modal-file-browser/modal-file-browser.component';\nimport { RemoteFile } from 'ng-tapis';\n\n@Component({\n selector: 'app-main',\n templateUrl: './main.component.html',\n styleUrls: ['./main.component.scss'],\n})\nexport class MainComponent implements OnInit {\n // public activeFeature: Feature;\n // public currentUser: AuthenticatedUser;\n\n constructor(\n private geoDataService: GeoDataService,\n private authService: AuthService,\n private bsModalService: BsModalService\n ) {}\n\n ngOnInit() {\n // this.geoDataService.activeFeature.subscribe( next => {\n // this.activeFeature = next;\n // });\n // this.authService.currentUser.subscribe(next => this.currentUser = next);\n }\n}\n","import { Component, NgZone, OnInit } from '@angular/core';\nimport { ActivatedRoute, Router, Route } from '@angular/router';\nimport { AuthService } from '../../services/authentication.service';\n\n@Component({\n selector: 'app-callback',\n templateUrl: './callback.component.html',\n styleUrls: ['./callback.component.scss'],\n})\nexport class CallbackComponent implements OnInit {\n constructor(private route: ActivatedRoute, private auth: AuthService) {}\n\n ngOnInit() {\n // TODO: For some reason wso2 is sending back a fragment like #access_token=qadad&expires_in=3600\n const frag = this.route.snapshot.fragment;\n const params = new URLSearchParams(frag);\n const token = params.get('access_token');\n const expires_in = +params.get('expires_in');\n this.auth.setToken(token, expires_in);\n }\n}\n","import { Component, Injectable } from '@angular/core';\nimport { BehaviorSubject, Observable, ReplaySubject, Subject } from 'rxjs';\nimport { Group, TagGroup, GroupForm, Tag, Project } from '../models/models';\nimport { map, first } from 'rxjs/operators';\nimport { FormControl, FormGroup, Validators } from '@angular/forms';\nimport { GeoDataService } from './geo-data.service';\nimport { prepareSyntheticListenerFunctionName } from '@angular/compiler/src/render3/util';\nimport { fadeInItems } from '@angular/material';\nimport { Feature, FeatureCollection } from 'geojson';\nimport { v4 as uuidv4 } from 'uuid';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class FormsService {\n constructor(private geoDataService: GeoDataService) {}\n\n deleteForm(\n projectId: number,\n form: GroupForm,\n activeGroup: TagGroup,\n featureGroups: Feature[]\n ): void {\n const taggedGroup: TagGroup = {\n ...activeGroup,\n forms: activeGroup.forms.filter((t: GroupForm) => t.id !== form.id),\n };\n\n this.geoDataService.updateGroupFeatures(\n projectId,\n featureGroups,\n taggedGroup\n );\n }\n\n renameForm(\n projectId: number,\n targetForm: GroupForm,\n activeGroup: TagGroup,\n featureGroups: Feature[],\n newName: string\n ): void {\n const taggedGroup: TagGroup = {\n ...activeGroup,\n forms: activeGroup.forms.map((form) => {\n if (form.id == targetForm.id) {\n form.label = newName;\n }\n return form;\n })\n }\n\n this.geoDataService.updateGroupFeatures(\n projectId,\n featureGroups,\n taggedGroup\n );\n }\n\n createForm(\n projectId: number,\n form: GroupForm,\n activeGroup: TagGroup,\n featureGroups: Feature[]\n ): void {\n const id = uuidv4();\n form = { ...form, id };\n const taggedGroup: TagGroup = {\n ...activeGroup,\n forms: activeGroup.forms ? [...activeGroup.forms, form] : [form],\n };\n this.geoDataService.updateGroupFeatures(\n projectId,\n featureGroups,\n taggedGroup\n );\n }\n\n checkDefault(selectedColor: string, feature: any) {\n if (selectedColor === 'default') {\n try {\n selectedColor = feature.styles.color;\n } catch (error) {\n selectedColor = '#00C8FF';\n }\n }\n return selectedColor;\n }\n\n // Inputs:\n // color:string A 7 digit hexadecimal string (#RRGGBB) passed in from a color tag\n // This method accesses group services to retrive the current group's icon as well\n saveStyles(\n projectId: number,\n featureList: Feature[],\n group: TagGroup,\n color?: string,\n icon?: string\n ) {\n const style = {\n color: color ? color : '#00C8FF',\n faIcon: icon ? icon : group.icon,\n };\n }\n\n updateTagValue(\n activeProject: Project,\n feature: Feature,\n form: GroupForm,\n tagValue: any\n ) {\n const tagProp = feature.properties.taggit.tags.filter((tag: Tag) => form.id !== tag.id);\n\n const tag = {\n id: form.id,\n value: tagValue,\n };\n\n feature.properties.taggit.tags = [...tagProp, tag];\n\n this.geoDataService.updateFeatureProperty(\n activeProject.id,\n feature.id,\n feature.properties\n );\n }\n\n updateTagValues(activeProject: Project, feature: Feature, newValues: any[]) {\n feature.properties.taggit.tags = newValues;\n this.geoDataService.updateFeatureProperty(\n activeProject.id,\n feature.id,\n feature.properties\n );\n }\n\n getTagValue(feature: Feature, form: GroupForm): any {\n if (feature && feature.properties.taggit.tags) {\n const tagValueObj = feature.properties.taggit.tags.find(\n (featTag: any) => featTag.id && featTag.id === form.id\n );\n\n if (tagValueObj) {\n return tagValueObj.value;\n }\n }\n if (form.type === 'checkbox') {\n return [];\n } else {\n return '';\n }\n }\n}\n\n// TODO: put this in models so we can reference it like we do the Features type\nexport interface tags {\n type: string;\n groupName: string;\n label: string;\n options: Array<Group>;\n feature: string | number;\n extra: Array<Group>;\n id?: string;\n}\n","import { Injectable } from '@angular/core';\nimport { BehaviorSubject, Observable, ReplaySubject, Subject } from 'rxjs';\nimport { ProjectsService } from './projects.service';\nimport { Feature, TagGroup } from '../models/models';\n\n// Will inject Projects and GeoData Service to get properties of Feature\n@Injectable({\n providedIn: 'root',\n})\nexport class GroupsService {\n private _selectedImages: BehaviorSubject<Array<any>> = new BehaviorSubject(\n []\n );\n public selectedImages: Observable<Array<any>> =\n this._selectedImages.asObservable();\n\n private _showTagger: BehaviorSubject<boolean> = new BehaviorSubject(false);\n public showTagger: Observable<boolean> = this._showTagger.asObservable();\n\n private _showTagGenerator: BehaviorSubject<boolean> =\n new BehaviorSubject<boolean>(false);\n public showTagGenerator: Observable<boolean> =\n this._showTagGenerator.asObservable();\n\n private _groupToAdd: BehaviorSubject<TagGroup> = new BehaviorSubject({\n name: undefined,\n });\n public groupToAdd: Observable<TagGroup> = this._groupToAdd.asObservable();\n\n constructor() {}\n\n imageSelected(feature: Feature): boolean {\n const currentFeatures = this._selectedImages.value;\n return currentFeatures.some((feat) => feat.id === feature.id);\n }\n\n unselectAllImages() {\n this._selectedImages.next([]);\n }\n\n toggleImageSelect(feature: Feature): void {\n const currentFeatures = this._selectedImages.value;\n const newFeatures = this.imageSelected(feature)\n ? currentFeatures.filter((feat) => feat.id !== feature.id)\n : [feature, ...currentFeatures];\n\n this._selectedImages.next(newFeatures);\n }\n\n setSelectedImages(selectedImages: any): void {\n this._selectedImages.next(selectedImages);\n }\n\n setGroupToAdd(group: TagGroup): void {\n this._groupToAdd.next(group);\n }\n\n toggleTagger(): void {\n this._showTagger.next(!this._showTagger.value);\n }\n\n setShowTagGenerator(value: boolean): void {\n this._showTagGenerator.next(value);\n }\n}\n","import { Injectable } from '@angular/core';\nimport { HttpClient } from '@angular/common/http';\nimport { BehaviorSubject, Observable, ReplaySubject } from 'rxjs';\nimport { tap } from 'rxjs/operators';\nimport { Project, IProjectUser, ProjectRequest } from '../models/models';\nimport { environment } from '../../environments/environment';\nimport { AuthService } from './authentication.service';\nimport { NotificationsService } from './notifications.service';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class ProjectsService {\n private _projects: BehaviorSubject<Project[]> = new BehaviorSubject([]);\n public readonly projects: Observable<Project[]> =\n this._projects.asObservable();\n private _activeProject: ReplaySubject<Project> = new ReplaySubject<Project>(\n 1\n );\n public readonly activeProject: Observable<Project> =\n this._activeProject.asObservable();\n private _projectUsers: ReplaySubject<Array<IProjectUser>> = new ReplaySubject<\n Array<IProjectUser>\n >(1);\n public readonly projectUsers$: Observable<Array<IProjectUser>> =\n this._projectUsers.asObservable();\n\n\n constructor(\n private http: HttpClient,\n private authService: AuthService,\n private notificationsService: NotificationsService\n ) {}\n\n testGeoApi(): void {\n const data = {\n name: 'Awesome Project',\n description: 'Cool project',\n };\n const prom = this.http\n .post<Project>(`http://localhost:8888/projects/`, data)\n .subscribe((resp) => {\n this._projects.next([...this._projects.value, resp]);\n // Set the active project to the one just created?\n this._activeProject.next(resp);\n });\n\n this.http\n .get<Project[]>(`http://localhost:8888/projects/`)\n .subscribe((resp) => {\n this._projects.next(resp);\n });\n }\n\n // Queries database for all user projects.\n getProjects(): void {\n this.http.get<Project[]>(environment.apiUrl + `/projects/`).subscribe(\n (projects) => {\n this._projects.next(projects);\n },\n (error) => {\n this.notificationsService.showErrorToast(\n 'Error getting projects DesignSafe or GeoAPI might be down'\n );\n }\n );\n }\n\n create(data: ProjectRequest) {\n this.http.post<Project>(\n environment.apiUrl + `/projects/`,\n data\n ).subscribe((proj) => {\n // Adding deletable attribute as missing from response https://jira.tacc.utexas.edu/browse/DES-2381\n proj = {...proj, deletable: true};\n this.setActiveProject(proj);\n this._projects.next([...this._projects.value, proj]);\n });\n }\n\n setActiveProject(proj: Project): void {\n // saves change as last visited project\n window.localStorage.setItem('lastProj', JSON.stringify(proj));\n try {\n this._activeProject.next(proj);\n } catch (error) {\n return error;\n }\n }\n\n update(data: ProjectRequest): void {\n this.http\n .put<Project>(environment.apiUrl + `/projects/${data.project.id}/`, data)\n .subscribe((resp) => {\n this._activeProject.next(resp);\n this.getProjects();\n });\n }\n\n // Note: This will delete the project for everyone, if the project is shared.\n delete(data: Project): void {\n this.http.delete(environment.apiUrl + `projects/${data.id}/`).subscribe(\n (resp) => {\n window.localStorage.removeItem('lastProj');\n this.getProjects();\n },\n (error) => {\n this.notificationsService.showErrorToast('Could not delete project!');\n console.error(error);\n }\n );\n }\n\n getProjectUsers(proj: Project): Observable<Array<IProjectUser>> {\n return this.http\n .get<Array<IProjectUser>>(\n environment.apiUrl + `/projects/${proj.id}/users/`\n )\n .pipe(\n tap((users) => {\n this._projectUsers.next(users);\n })\n );\n }\n\n addUserToProject(proj: Project, uname: string): void {\n const payload = {\n username: uname,\n };\n this.http\n .post(environment.apiUrl + `/projects/${proj.id}/users/`, payload)\n .subscribe((resp) => {\n this.getProjectUsers(proj).subscribe();\n });\n }\n\n deleteUserFromProject(proj: Project, user: string): void {\n this.http\n .delete(environment.apiUrl + `/projects/${proj.id}/users/${user}/`)\n .subscribe(\n (resp) => {\n this.getProjectUsers(proj).subscribe();\n },\n (error) => {\n // TODO: Create popup for an error message.\n console.log(error);\n }\n );\n }\n}\n","import {\n Component,\n OnInit,\n TemplateRef,\n ChangeDetectorRef,\n ChangeDetectionStrategy,\n} from '@angular/core';\nimport { FormsService, tags } from '../../../services/forms.service';\nimport { GroupsService } from '../../../services/groups.service';\nimport { MatDialog } from '@angular/material/dialog';\nimport { Router } from '@angular/router';\nimport { Subscription } from 'rxjs';\nimport { Feature, Project, TagGroup, GroupForm } from 'src/app/models/models';\nimport { GeoDataService } from 'src/app/services/geo-data.service';\nimport { ProjectsService } from 'src/app/services/projects.service';\n\n@Component({\n selector: 'app-tag-generator',\n templateUrl: './tag-generator.component.html',\n styleUrls: ['./tag-generator.component.scss'],\n})\nexport class TagGeneratorComponent implements OnInit {\n formLabel: string;\n formColor: string;\n formOptions: Array<any> = [];\n selectedGroup: string;\n formType: string;\n labelFilter: string;\n optionColorFilter = '#000000';\n activeGroup: TagGroup;\n optionFilter: string;\n formName: string;\n formValue: string;\n formRequired: boolean;\n openOption: any = {};\n enabledControls: Array<string> = [];\n showSubitem = true;\n groups: Map<string, TagGroup>;\n groupsFeatures: Map<string, any>;\n groups$: Subscription;\n private activeProject: Project;\n\n constructor(\n private formsService: FormsService,\n private groupsService: GroupsService,\n private dialog: MatDialog,\n private router: Router,\n private geoDataService: GeoDataService,\n private projectsService: ProjectsService\n ) {}\n\n ngOnInit() {\n this.geoDataService.activeGroup.subscribe((next) => {\n this.activeGroup = next;\n });\n\n this.geoDataService.groups.subscribe((next) => {\n this.groups = next;\n });\n\n this.geoDataService.groupsFeatures.subscribe((next) => {\n this.groupsFeatures = next;\n });\n\n this.projectsService.activeProject.subscribe((next) => {\n this.activeProject = next;\n });\n\n this.formOptions = [];\n this.formType = 'text';\n this.formName = '';\n this.formLabel = '';\n this.formValue = '';\n this.formRequired = false;\n this.enabledControls = ['Text', 'Checkbox', 'Radio', 'Dropdown', 'Color'];\n }\n\n inputFormLabel(event: any) {\n this.formLabel = event.target.value;\n }\n\n inputFormColor(event: any) {\n this.formColor = event.target.value;\n }\n\n addOptionItem(value: string) {\n if (value) {\n const formWithValue = this.formOptions.filter((e) => e.label == value);\n if (formWithValue.length == 0 && value.length != 0) {\n this.formOptions.push({\n label: value,\n color: this.optionColorFilter,\n });\n }\n }\n }\n\n deleteOption(opt: any) {\n this.formOptions = this.formOptions.filter(\n (option) => option.label != opt.label\n );\n }\n\n openRenameModal(template: TemplateRef<any>, name: string) {\n this.selectedGroup = name;\n this.dialog.open(template);\n }\n\n openRenameOptionModal(template: TemplateRef<any>) {\n this.dialog.open(template);\n }\n\n renameOption(opt: any, label: string) {\n label = label.toLowerCase();\n this.formOptions.forEach((e) => {\n if (e.label == opt.label) {\n e.label = label;\n }\n });\n }\n\n selectInputForm(name: string) {\n this.formType = name;\n this.formLabel = '';\n this.formOptions = [];\n }\n\n clearOption() {\n this.optionFilter = '';\n }\n\n clearLabel() {\n this.labelFilter = '';\n }\n\n clearOptionColor() {\n this.optionColorFilter = '#000000';\n }\n\n clear() {\n this.clearLabel();\n this.clearOptionColor();\n this.clearOption();\n }\n\n addFormItem() {\n // Assemble the new tag\n const formItem: GroupForm = {\n type: this.formType,\n groupName: this.activeGroup.name,\n label: this.formLabel,\n options: [],\n };\n this.openOption[this.formLabel] = false;\n // Adds the options for drop down, checklist, and radio buttons\n if (this.formType !== 'text' && this.formOptions.length != 0) {\n const myOpts = [];\n for (const opt of this.formOptions) {\n myOpts.push({\n label: opt,\n });\n }\n formItem.options = this.formOptions;\n }\n\n this.formsService.createForm(\n this.activeProject.id,\n formItem,\n this.groups.get(this.activeGroup.name),\n this.groupsFeatures.get(this.activeGroup.name)\n );\n\n // Reset user-defined fields to blank options\n this.formLabel = '';\n this.formColor = '';\n this.formOptions = [];\n this.groupsService.setShowTagGenerator(false);\n this.clear();\n }\n\n cancelCreate() {\n this.groupsService.setShowTagGenerator(false);\n this.clear();\n }\n\n expandPanel() {\n this.showSubitem = !this.showSubitem;\n }\n}\n","import { Component, OnInit, TemplateRef } from '@angular/core';\nimport { MatDialog } from '@angular/material/dialog';\nimport { Feature } from 'geojson';\nimport { combineLatest } from 'rxjs';\nimport { GroupForm, TagGroup } from 'src/app/models/models';\nimport { GeoDataService } from 'src/app/services/geo-data.service';\nimport { ProjectsService } from 'src/app/services/projects.service';\nimport { FormsService } from '../../../services/forms.service';\nimport { GroupsService } from '../../../services/groups.service';\n\n@Component({\n selector: 'app-tag-images',\n templateUrl: './tag-images.component.html',\n styleUrls: ['./tag-images.component.scss'],\n})\nexport class TagImagesComponent implements OnInit {\n private activeProject;\n payload: any;\n activeGroup: TagGroup;\n showSubitem = true;\n formList: GroupForm[] = [];\n tagName = '';\n groups: Map<string, TagGroup>;\n groupsFeatures: Map<string, Feature[]>;\n activeGroupFeature: Feature;\n tagValues = [];\n newTagValue = '';\n\n constructor(\n private groupsService: GroupsService,\n private formsService: FormsService,\n private dialog: MatDialog,\n private projectsService: ProjectsService,\n private geoDataService: GeoDataService\n ) { }\n\n ngOnInit() {\n combineLatest(\n this.geoDataService.activeGroup,\n this.geoDataService.groupsFeatures,\n this.geoDataService.groups\n ).subscribe(([grp, grpFts, grps]) => {\n this.activeGroup = grp;\n this.groupsFeatures = grpFts;\n this.groups = grps;\n if (grp) {\n this.formList = grp.forms;\n }\n });\n\n this.geoDataService.activeGroupFeature.subscribe((next) => {\n this.activeGroupFeature = next;\n });\n\n this.projectsService.activeProject.subscribe((next) => {\n this.activeProject = next;\n });\n }\n\n openRenameModal(template: TemplateRef<any>) {\n this.dialog.open(template);\n }\n\n // Takes the name of the tag's group, and the tag itself to delete\n deleteForm(tag: GroupForm) {\n this.formsService.deleteForm(\n this.activeProject.id,\n tag,\n this.groups.get(this.activeGroup.name),\n this.groupsFeatures.get(this.activeGroup.name)\n );\n }\n\n // submits a tag's name change to geoAPI\n renameForm(tag: GroupForm) {\n this.formsService.renameForm(\n this.activeProject.id,\n tag,\n this.groups.get(this.activeGroup.name),\n this.groupsFeatures.get(this.activeGroup.name),\n this.tagName\n );\n // Reset newTagValue for the next rename\n this.tagName = '';\n this.dialog.closeAll(); // Ensures the window closes when using enter-submission\n }\n\n showTagGenerator() {\n this.groupsService.setShowTagGenerator(true);\n }\n\n expandPanel() {\n this.showSubitem = !this.showSubitem;\n }\n}\n","import { Injectable, NgModule } from '@angular/core';\nimport {\n Routes,\n RouterModule,\n CanActivate,\n ActivatedRouteSnapshot,\n RouterStateSnapshot,\n} from '@angular/router';\nimport { NotFoundComponent } from './components/notfound/notfound.component';\nimport { AuthService } from './services/authentication.service';\nimport { MainComponent } from './components/main/main.component';\nimport { CallbackComponent } from './components/callback/callback.component';\nimport { TagGeneratorComponent } from './components/side-bar/tag-generator/tag-generator.component';\nimport { TagImagesComponent } from './components/side-bar/tag-images/tag-images.component';\n\n@Injectable()\nexport class Activate implements CanActivate {\n constructor(private authSvc: AuthService) {}\n\n canActivate(\n route: ActivatedRouteSnapshot,\n state: RouterStateSnapshot\n ): boolean {\n if (this.authSvc.isLoggedIn()) {\n return true;\n }\n this.authSvc.login();\n }\n}\n\nconst routes: Routes = [\n {\n path: '',\n component: MainComponent,\n canActivate: [Activate],\n children: [\n {\n path: 'tagger',\n component: TagImagesComponent,\n canActivateChild: [Activate],\n },\n {\n path: 'preset',\n component: TagGeneratorComponent,\n canActivateChild: [Activate],\n },\n ],\n },\n { path: 'callback', component: CallbackComponent },\n { path: '404', component: NotFoundComponent },\n];\n\n@NgModule({\n imports: [RouterModule.forRoot(routes, { onSameUrlNavigation: 'reload' })],\n exports: [RouterModule],\n providers: [Activate],\n})\nexport class AppRoutingModule {}\n","import { Component, OnInit } from '@angular/core';\nimport { AuthService } from './services/authentication.service';\n\n@Component({\n selector: 'app-root',\n templateUrl: './app.component.html',\n styleUrls: ['./app.component.scss'],\n})\nexport class AppComponent implements OnInit {\n title = 'viewer';\n\n constructor(private authService: AuthService) {}\n\n ngOnInit() {\n this.authService.login();\n }\n}\n","import {\n CircleMarker,\n circleMarker,\n divIcon,\n LatLng,\n Marker,\n marker,\n} from 'leaflet';\nimport { Feature } from '../models/models';\n\nfunction createCircleMarker(feature: Feature, latlng: LatLng): CircleMarker {\n const options = {\n radius: 8,\n fillColor: '#d3d3d3',\n color: 'black',\n weight: 1,\n opacity: 1,\n fillOpacity: 0.8,\n };\n return circleMarker(latlng, options);\n}\n\nfunction createImageMarker(feature: Feature, latlng: LatLng): Marker {\n const divHtml = '<i class=\\'fas fa-camera-retro fa-2x light-blue\\'></i>';\n const ico = divIcon({ className: 'leaflet-fa-marker-icon', html: divHtml });\n return marker(latlng, { icon: ico });\n}\n\nfunction createCollectionMarker(feature: Feature, latlng: LatLng): Marker {\n const divHtml = '<i class=\"fa fa-folder-open fa-2x light-blue\"></i>';\n const ico = divIcon({ className: 'icon-marker', html: divHtml });\n return marker(latlng, { icon: ico });\n}\nfunction createVideoMarker(feature: Feature, latlng: LatLng): Marker {\n const divHtml = '<i class=\\'fas fa-video fa-2x light-blue\\'></i>';\n const ico = divIcon({ className: 'leaflet-fa-marker-icon', html: divHtml });\n return marker(latlng, { icon: ico });\n}\n\nexport function createMarker(feature: Feature, latlng: LatLng): Marker {\n let marker;\n if (feature.featureType() == 'image') {\n marker = createImageMarker(feature, latlng);\n } else if (feature.featureType() == 'collection') {\n marker = createCollectionMarker(feature, latlng);\n } else if (feature.featureType() == 'video') {\n marker = createVideoMarker(feature, latlng);\n } else {\n marker = createCircleMarker(feature, latlng);\n }\n return marker;\n}\n","import { Component, OnInit } from '@angular/core';\nimport { ActivatedRoute } from '@angular/router';\nimport * as L from 'leaflet';\nimport 'leaflet.markercluster';\n\nimport { GeoDataService } from '../../services/geo-data.service';\nimport { createMarker } from '../../utils/leafletUtils';\nimport { Feature } from 'geojson';\nimport { FeatureGroup, ImageOverlay, LatLng, LeafletMouseEvent } from 'leaflet';\nimport * as turf from '@turf/turf';\nimport { AllGeoJSON } from '@turf/helpers';\nimport { filter, skip } from 'rxjs/operators';\nimport { Overlay } from '../../models/models';\nimport { AppEnvironment, environment } from '../../../environments/environment';\n\n@Component({\n selector: 'app-map',\n templateUrl: './map.component.html',\n styleUrls: ['./map.component.scss'],\n})\nexport class MapComponent implements OnInit {\n map: L.Map;\n mapType = 'normal';\n activeFeature: Feature;\n activeOverlay: Overlay;\n features: FeatureGroup = new FeatureGroup();\n overlays: Map<number, ImageOverlay>;\n environment: AppEnvironment;\n\n constructor(\n private GeoDataService: GeoDataService,\n private route: ActivatedRoute\n ) {\n // Have to bind these to keep this being this\n this.featureClickHandler.bind(this);\n this.mouseEventHandler.bind(this);\n }\n\n ngOnInit() {\n // const mapType: string = this.route.snapshot.queryParamMap.get('mapType');\n // this.projectId = +this.route.snapshot.paramMap.get(\"projectId\");\n // this.cluster = this.route.snapshot.queryParamMap.get('mapType');\n this.environment = environment;\n this.overlays = new Map();\n this.map = new L.Map('map', {\n center: [40, -80],\n zoom: 9,\n });\n\n const baseOSM = L.tileLayer(\n 'https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png',\n {\n maxZoom: 19,\n attribution:\n '© <a href=\"https://www.openstreetmap.org/copyright\">OpenStreetMap</a> contributors',\n }\n );\n const satellite = L.tileLayer(\n 'https://server.arcgisonline.com/ArcGIS/rest/services/World_Imagery/MapServer/tile/{z}/{y}/{x}',\n {\n attribution:\n 'Tiles © Esri — Source: Esri, i-cubed, USDA, USGS, AEX, GeoEye, Getmapping, Aerogrid, IGN, IGP, UPR-EGP, and the GIS User Community',\n }\n );\n // default to streetmap view;\n this.map.addLayer(baseOSM);\n\n this.loadFeatures();\n\n // Publish the mouse location on the mapMouseLocation stream\n this.map.on('mousemove', (ev: LeafletMouseEvent) =>\n this.mouseEventHandler(ev)\n );\n this.GeoDataService.activeOverlay.pipe(skip(1)).subscribe((next) => {\n this.addRemoveOverlay(next);\n });\n\n // Listen on the activeFeature stream and zoom map to that feature when it changes\n this.GeoDataService.activeFeature\n .pipe(filter((n) => n != null))\n .subscribe((next) => {\n this.activeFeature = next;\n const bbox = turf.bbox(<AllGeoJSON> next);\n this.map.fitBounds([\n [bbox[1], bbox[0]],\n [bbox[3], bbox[2]],\n ]);\n });\n\n // Listen for changes to the basemap\n this.GeoDataService.basemap.pipe(skip(1)).subscribe((next) => {\n if (next == 'sat') {\n this.map.removeLayer(baseOSM);\n this.map.addLayer(satellite);\n }\n if (next == 'roads') {\n this.map.removeLayer(satellite);\n this.map.addLayer(baseOSM);\n }\n });\n }\n\n addRemoveOverlay(ov: Overlay): void {\n if (this.overlays.has(ov.id)) {\n this.features.removeLayer(this.overlays.get(ov.id));\n this.overlays.delete(ov.id);\n } else {\n const overlay = L.imageOverlay(\n environment.apiUrl + '/assets/' + ov.path,\n [\n [ov.minLat, ov.minLon],\n [ov.maxLat, ov.maxLon],\n ]\n );\n this.overlays.set(ov.id, overlay);\n this.features.addLayer(overlay);\n }\n this.map.fitBounds(this.features.getBounds());\n }\n\n mouseEventHandler(ev: any): void {\n this.GeoDataService.mapMouseLocation = ev.latlng;\n }\n\n /**\n * Load Features for a project.\n */\n loadFeatures() {\n const geojsonOptions = {\n pointToLayer: createMarker,\n };\n this.GeoDataService.features.subscribe((collection) => {\n this.features.clearLayers();\n const markers = L.markerClusterGroup({\n iconCreateFunction: (cluster) => {\n return L.divIcon({\n html: `<div><b>${cluster.getChildCount()}</b></div>`,\n className: 'marker-cluster',\n });\n },\n });\n collection.features.forEach((d) => {\n const feat = L.geoJSON(d, geojsonOptions);\n feat.on('click', (ev) => {\n this.featureClickHandler(ev);\n });\n\n if (d.geometry.type == 'Point') {\n markers.addLayer(feat);\n } else {\n this.features.addLayer(feat);\n }\n });\n this.features.addLayer(markers);\n this.map.addLayer(this.features);\n try {\n this.map.fitBounds(this.features.getBounds());\n } catch (e) {}\n });\n }\n\n /**\n *\n * @param ev\n */\n featureClickHandler(ev: any): void {\n const f = ev.layer.feature;\n this.GeoDataService.activeFeature = f;\n }\n}\n","import { Injectable } from '@angular/core';\nimport { SystemSummary } from 'ng-tapis';\nimport { ApiService } from 'ng-tapis';\nimport { Observable, ReplaySubject } from 'rxjs';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class AgaveSystemsService {\n private baseUrl = 'https://agave.designsafe-ci.org/systems/v2/';\n private _systems: ReplaySubject<SystemSummary[]> = new ReplaySubject<\n SystemSummary[]\n >(1);\n public readonly systems: Observable<SystemSummary[]> =\n this._systems.asObservable();\n private _projects: ReplaySubject<SystemSummary[]> = new ReplaySubject<\n SystemSummary[]\n >(1);\n public readonly projects: Observable<SystemSummary[]> =\n this._projects.asObservable();\n private systemsList: SystemSummary[];\n\n constructor(private tapis: ApiService) {}\n\n // list() runs when the file browser is opened, retrieves all files in TACC for given user\n list() {\n this.tapis.systemsList({ type: 'STORAGE' }).subscribe(\n (resp) => {\n this._systems.next(resp.result);\n this._projects.next(\n resp.result.filter((sys) => sys.id.startsWith('project'))\n );\n },\n (error) => {\n this._systems.next(null);\n this._projects.next(null);\n }\n );\n }\n}\n","import { Injectable } from '@angular/core';\nimport { BehaviorSubject, Observable } from 'rxjs';\nimport { ApiService, FileOperationRequest } from 'ng-tapis';\nimport { RemoteFile } from 'ng-tapis';\nimport { Project } from '../models/models';\nimport { share } from 'rxjs/operators';\nimport { HttpClient } from '@angular/common/http';\nimport { HttpHeaders } from '@angular/common/http';\nimport { environment } from '../../environments/environment';\nimport { AuthService } from './authentication.service';\nimport { MatSnackBar, MatSnackBarConfig } from '@angular/material/snack-bar';\nimport { SystemSummary } from 'ng-tapis';\n// import { verify } from 'ts-mockito';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class TapisFilesService {\n private baseUrl = 'https://agave.designsafe-ci.org/files/v2/';\n public currentListing: Array<RemoteFile>;\n private _listing: BehaviorSubject<RemoteFile[]> = new BehaviorSubject<\n RemoteFile[]\n >([]);\n public readonly listing: Observable<RemoteFile[]> =\n this._listing.asObservable();\n public readonly IMPORTABLE_TYPES: Array<string> = [\n 'jpg',\n 'jpeg',\n 'las',\n 'laz',\n 'json',\n 'geojson',\n 'geotiff',\n 'tiff',\n 'gpx',\n ];\n public lastSystem: SystemSummary; // The last filesystem the user was browsing\n public lastFile: RemoteFile; // The last directory the user was browsing\n public noPreviousSelections: boolean;\n\n constructor(\n private tapis: ApiService,\n private http: HttpClient,\n private authService: AuthService,\n private popup: MatSnackBar\n ) {}\n\n checkIfSelectable(file: RemoteFile): boolean {\n if (file.type === 'dir') {\n return false;\n }\n const ext = this.getFileExtension(file);\n return this.IMPORTABLE_TYPES.includes(ext);\n }\n\n private getFileExtension(file: RemoteFile): string {\n return file.name.split('.').pop().toLowerCase();\n }\n\n listFiles(system: string, path: string, offset: number, limit: number) {\n return this.tapis.filesList({\n systemId: system,\n filePath: path,\n offset,\n limit,\n });\n }\n\n public getParentPath(path: string): string {\n const cleaned = path.replace('//', '/');\n const arr = cleaned.split('/');\n arr.pop();\n const parentPath = arr.join('/');\n return parentPath;\n }\n\n // saves project to a specified format in Design Safe's my Data section\n public export(\n systemID: string,\n path: string,\n fileName: string,\n extension: string,\n data: any\n ) {\n // Constructs an object that configures the success/error pop-up\n const snackbarConfig: MatSnackBarConfig = {\n duration: 3000,\n horizontalPosition: 'right',\n verticalPosition: 'top',\n };\n // construct the full URL that points to where the data will be stored\n const fullURL = `https://agave.designsafe-ci.org/files/v2/media/system/${systemID}${path}`;\n\n // construct a file to submit\n let fileType = 'plain/text';\n extension == '.csv'\n ? (fileType = 'text/csv')\n : (fileType = 'application/json');\n const tmp = new Blob([data], { type: fileType });\n const date = new Date();\n const file = new File([tmp], fileName, { lastModified: date.valueOf() });\n\n // Creates a form data object which holds the file to be uploaded\n const form: FormData = new FormData();\n form.append('fileToUpload', file);\n\n // sends the packaged data to Designsafe. URL its being uploaded to handles authentication\n this.http.post(fullURL, form).subscribe(\n (resp) => {\n console.log(resp);\n const msg = 'Successfully saved file to ' + systemID + path;\n this.popup.open(msg, '', snackbarConfig);\n },\n (error) => {\n console.log(error);\n const msg = 'Faled to save file to ' + systemID + path;\n this.popup.open(msg, '', snackbarConfig);\n }\n );\n }\n\n // Saves the current file directory and file system to Local Storage\n saveState() {\n const sysStr = JSON.stringify(this.lastSystem);\n const fileStr = JSON.stringify(this.lastFile);\n window.localStorage.setItem('system', sysStr);\n window.localStorage.setItem('file', fileStr);\n }\n\n // Attempts to retrieve the last used state\n getState() {\n try {\n this.lastSystem = JSON.parse(window.localStorage.getItem('system'));\n this.lastFile = JSON.parse(window.localStorage.getItem('file'));\n this.noPreviousSelections = this.lastFile == null;\n } catch (error) {\n console.log(error);\n }\n }\n}\n","import { Component, OnInit, Output, EventEmitter, Input } from '@angular/core';\nimport { AgaveSystemsService } from '../../services/agave-systems.service';\nimport {\n AuthenticatedUser,\n AuthService,\n} from '../../services/authentication.service';\nimport { RemoteFile } from 'ng-tapis/models/remote-file';\nimport { SystemSummary } from 'ng-tapis';\nimport { TapisFilesService } from '../../services/tapis-files.service';\nimport { BsModalRef } from 'ngx-foundation/modal/bs-modal-ref.service';\nimport { Subject, combineLatest } from 'rxjs';\nimport { MatDialog, MatDialogRef } from '@angular/material/dialog';\nimport { take } from 'rxjs/operators';\n\n@Component({\n selector: 'app-modal-file-browser',\n templateUrl: './modal-file-browser.component.html',\n styleUrls: ['./modal-file-browser.component.scss'],\n})\nexport class ModalFileBrowserComponent implements OnInit {\n static limit = 200; // Limits maximum amount of files displayed\n\n @Output() currentPath: EventEmitter<string> = new EventEmitter<string>();\n\n public allowedExtensions: Array<string> =\n this.tapisFilesService.IMPORTABLE_TYPES;\n\n private currentUser: AuthenticatedUser;\n public selectedPath;\n public filesList: Array<RemoteFile> = [];\n public inProgress = true;\n public retrievalError = false;\n public selectedFiles: Map<string, RemoteFile> = new Map();\n public onClose: Subject<Array<RemoteFile>> = new Subject<Array<RemoteFile>>();\n public projects: Array<SystemSummary>;\n private selectedSystem: SystemSummary;\n public myDataSystem: SystemSummary;\n public communityDataSystem: SystemSummary;\n public publishedDataSystem: SystemSummary;\n public currentDirectory: RemoteFile;\n private offset: number;\n public firstFileIndex: number;\n\n constructor(\n private tapisFilesService: TapisFilesService,\n // private modalRef: BsModalRef,\n public dialogRef: MatDialogRef<ModalFileBrowserComponent>,\n private dialog: MatDialog,\n private authService: AuthService,\n private agaveSystemsService: AgaveSystemsService\n ) {}\n\n ngOnInit() {\n // retrive state data\n // this.tapisFilesService.getState()\n\n // This finds all the projects, and file systems found from a user\n this.agaveSystemsService.list();\n\n // TODO: change those hard coded systemIds to environment vars or some sort of config\n // wait on the currentUser and systems to resolve\n combineLatest([\n this.authService.currentUser,\n this.agaveSystemsService.systems,\n this.agaveSystemsService.projects,\n ])\n // This little thing helped me fix the problem on calling ngOnInit several times\n .pipe(take(1))\n .subscribe(([user, systems, projects]) => {\n // Uses systems to find the different directories that has the files in\n this.myDataSystem = systems.find(\n (sys) => sys.id === 'designsafe.storage.default'\n );\n this.communityDataSystem = systems.find(\n (sys) => sys.id === 'designsafe.storage.community'\n );\n this.publishedDataSystem = systems.find(\n (sys) => sys.id === 'designsafe.storage.published'\n );\n\n // This is where they choose which one they start with\n this.selectedSystem = this.tapisFilesService.lastSystem;\n\n if (this.selectedSystem == null) {\n this.selectedSystem = this.myDataSystem;\n this.tapisFilesService.lastSystem = this.myDataSystem;\n }\n\n // If the user has already navigated to a folder, restore those options\n this.currentDirectory = this.tapisFilesService.lastFile;\n\n this.projects = projects;\n this.currentUser = user;\n const init = <RemoteFile> {\n system: this.myDataSystem.id,\n type: 'dir',\n path: this.currentUser.username,\n };\n // If the user hasn't yet opened the file browser, set the last file to an init file.\n if (this.tapisFilesService.noPreviousSelections) {\n this.selectedSystem = this.myDataSystem;\n this.tapisFilesService.lastFile = init;\n this.tapisFilesService.noPreviousSelections = false;\n }\n this.browse(this.tapisFilesService.lastFile);\n });\n }\n\n selectSystem(system: SystemSummary): void {\n let pth;\n system.id === this.myDataSystem.id\n ? (pth = this.currentUser.username)\n : (pth = '/');\n const init = <RemoteFile> {\n system: system.id,\n type: 'dir',\n path: pth,\n };\n this.selectedSystem = system;\n this.tapisFilesService.lastSystem = this.selectedSystem;\n this.browse(init);\n }\n\n browse(file: RemoteFile) {\n this.selectedPath = file.path;\n this.selectedSystem = this.selectedSystem; // Self-assignment keeps the system name from disappearing while browsing subfolders\n if (file.type !== 'dir') {\n return;\n }\n this.currentDirectory = file;\n this.tapisFilesService.lastFile = file; // Updates the last directory visted\n // this.selectedFiles.clear();\n this.filesList = [];\n this.offset = 0;\n this.inProgress = false;\n this.getFiles();\n }\n\n toRoot() {\n let pth;\n this.selectedSystem.id === this.myDataSystem.id\n ? (pth = this.currentUser.username)\n : (pth = '/');\n const init = <RemoteFile> {\n system: this.selectedSystem.id,\n type: 'dir',\n path: pth,\n };\n this.browse(init);\n }\n\n getFiles() {\n const hasMoreFiles = this.offset % ModalFileBrowserComponent.limit === 0;\n\n if (this.inProgress || !hasMoreFiles) {\n return;\n }\n\n this.inProgress = true;\n this.tapisFilesService\n .listFiles(\n this.currentDirectory.system,\n this.currentDirectory.path,\n this.offset,\n ModalFileBrowserComponent.limit\n )\n .subscribe(\n (listing) => {\n const files = listing.result;\n\n if (files.length && files[0].name === '.') {\n // This removes the first item in the listing, which in Agave\n // is always a reference to self '.' and replaces with '..'\n const current = files.shift();\n this.currentPath.next(current.path);\n current.path = this.tapisFilesService.getParentPath(current.path);\n current.name = '..';\n files.unshift(current);\n }\n const newFile = [];\n const allowedExt = this.allowedExtensions;\n files.forEach(function(value, index) {\n if (\n (value.type == 'file' &&\n allowedExt.includes(\n value.path.split('.').pop().toLowerCase()\n )) ||\n value.type == 'dir'\n ) {\n newFile.push(value);\n }\n });\n\n this.inProgress = false;\n this.retrievalError = false;\n this.filesList = this.filesList.concat(newFile);\n this.offset = this.offset + files.length;\n },\n (error) => {\n // If retrieving the files from DesignSafe bugs out due to the site being down, this is where it ends up\n this.retrievalError = true;\n this.inProgress = false;\n }\n );\n }\n\n // TODO: Ian: Error message on incorrect file type?\n select(event: any, file: RemoteFile, index: number) {\n if (event.shiftKey) {\n this.selectFilesShiftClick(index, file);\n } else {\n if (this.tapisFilesService.checkIfSelectable(file)) {\n this.addSelectedFile(file, index);\n } else {\n }\n }\n }\n\n selectFilesShiftClick(index: number, file: RemoteFile) {\n // this.selectedFiles.clear();\n this.selectShift(index, file);\n }\n\n addSelectedFile(file: RemoteFile, index: number) {\n if (index != -1) {\n this.firstFileIndex = index;\n }\n\n if (this.tapisFilesService.checkIfSelectable(file)) {\n if (this.selectedFiles.has(file.path)) {\n this.selectedFiles.delete(file.path);\n } else {\n this.selectedFiles.set(file.path, file);\n }\n }\n }\n\n chooseFiles() {\n this.tapisFilesService.saveState();\n this.tapisFilesService.lastSystem = this.selectedSystem;\n const tmp = Array.from(this.selectedFiles.values());\n this.dialogRef.close(tmp);\n }\n\n cancel() {\n this.tapisFilesService.saveState();\n this.tapisFilesService.lastSystem = this.selectedSystem;\n this.dialogRef.close();\n }\n\n selectAll() {\n const indexTmp = -1;\n let count = 0;\n for (const file of this.filesList) {\n if (!this.selectedFiles.has(file.path)) {\n this.select('', file, indexTmp);\n count += 1;\n }\n }\n if (count == 1) {\n this.selectedFiles.clear();\n }\n }\n\n selectShift(index: number, file: RemoteFile) {\n if (this.firstFileIndex != undefined && this.firstFileIndex != index) {\n this.addRangeFiles(this.firstFileIndex, index, true);\n } else {\n this.addSelectedFile(file, index);\n }\n }\n\n addRangeFiles(firstFileIndex: number, lastFileIndex: number, again: boolean) {\n const maxIndex = Math.max(firstFileIndex, lastFileIndex);\n const minIndex = Math.min(firstFileIndex, lastFileIndex);\n\n for (let i = minIndex; i < maxIndex + 1; ++i) {\n this.addSelectedFile(this.filesList[i], -1);\n }\n\n if (again) {\n this.addSelectedFile(this.filesList[firstFileIndex], -1);\n }\n }\n}\n","import { Component, OnInit, Output, EventEmitter } from '@angular/core';\nimport { AgaveSystemsService } from '../../services/agave-systems.service';\nimport {\n AuthenticatedUser,\n AuthService,\n} from '../../services/authentication.service';\nimport { RemoteFile } from 'ng-tapis/models/remote-file';\nimport { SystemSummary } from 'ng-tapis';\nimport { TapisFilesService } from '../../services/tapis-files.service';\nimport { BsModalRef } from 'ngx-foundation/modal/bs-modal-ref.service';\nimport { Subject, combineLatest } from 'rxjs';\nimport { MatDialog, MatDialogRef } from '@angular/material/dialog';\nimport { take } from 'rxjs/operators';\nimport { FormGroup, FormControl } from '@angular/forms';\n\n@Component({\n selector: 'app-modal-download-selector',\n templateUrl: './modal-download-selector.component.html',\n styleUrls: ['./modal-download-selector.component.scss'],\n})\nexport class ModalDownloadSelectorComponent implements OnInit {\n static limit = 200; // Limits maximum amount of files displayed\n\n @Output() currentPath: EventEmitter<string> = new EventEmitter<string>();\n\n private downloadSelectForm: FormGroup;\n private currentUser: AuthenticatedUser;\n public filesList: Array<RemoteFile> = [];\n public inProgress = true;\n public selectedFiles: Map<string, RemoteFile> = new Map();\n public onClose: Subject<Array<RemoteFile>> = new Subject<Array<RemoteFile>>();\n public projects: Array<SystemSummary>;\n private selectedSystem: SystemSummary;\n public myDataSystem: SystemSummary;\n public communityDataSystem: SystemSummary;\n public publishedDataSystem: SystemSummary;\n public currentDirectory: RemoteFile;\n public passbackData: Array<string> = ['', '', '', ''];\n public fileName = 'Custom File Name';\n public fileExtension = '.csv';\n private offset: number;\n\n constructor(\n private tapisFilesService: TapisFilesService,\n // private modalRef: BsModalRef,\n public dialogRef: MatDialogRef<ModalDownloadSelectorComponent>,\n private dialog: MatDialog,\n private authService: AuthService,\n private agaveSystemsService: AgaveSystemsService\n ) {}\n\n ngOnInit() {\n this.downloadSelectForm = new FormGroup({\n Name: new FormControl(this.fileName),\n Extension: new FormControl(this.fileExtension),\n });\n\n // This finds all the projects, and file systems found from a user\n this.agaveSystemsService.list();\n\n // TODO: change those hard coded systemIds to environment vars or some sort of config\n // wait on the currentUser and systems to resolve\n combineLatest([\n this.authService.currentUser,\n this.agaveSystemsService.systems,\n this.agaveSystemsService.projects,\n ])\n // This little thing helped me fix the problem on calling ngOnInit several times\n .pipe(take(1))\n .subscribe(([user, systems, projects]) => {\n // Uses systems to find the different directories that has the files in\n this.myDataSystem = systems.find(\n (sys) => sys.id === 'designsafe.storage.default'\n );\n this.communityDataSystem = systems.find(\n (sys) => sys.id === 'designsafe.storage.community'\n );\n this.publishedDataSystem = systems.find(\n (sys) => sys.id === 'designsafe.storage.published'\n );\n\n // This is where they choose which one they start with\n this.selectedSystem = this.myDataSystem;\n\n this.projects = projects;\n this.currentUser = user;\n const init = <RemoteFile> {\n system: this.myDataSystem.id,\n type: 'dir',\n path: this.currentUser.username,\n };\n this.browse(init);\n });\n }\n\n selectSystem(system: SystemSummary): void {\n let pth;\n system.id === this.myDataSystem.id\n ? (pth = this.currentUser.username)\n : (pth = '/');\n const init = <RemoteFile> {\n system: system.id,\n type: 'dir',\n path: pth,\n };\n this.browse(init);\n }\n\n browse(file: RemoteFile) {\n if (file.type !== 'dir') {\n return;\n }\n this.currentDirectory = file;\n // this.selectedFiles.clear();\n this.filesList = [];\n this.offset = 0;\n this.inProgress = false;\n this.getFiles();\n }\n\n getFiles() {\n const hasMoreFiles =\n this.offset % ModalDownloadSelectorComponent.limit === 0;\n\n if (this.inProgress || !hasMoreFiles) {\n return;\n }\n\n this.inProgress = true;\n\n this.tapisFilesService\n .listFiles(\n this.currentDirectory.system,\n this.currentDirectory.path,\n this.offset,\n ModalDownloadSelectorComponent.limit\n )\n .subscribe(\n (listing) => {\n const files = listing.result;\n\n if (files.length && files[0].name === '.') {\n // This removes the first item in the listing, which in Agave\n // is always a reference to self '.' and replaces with '..'\n const current = files.shift();\n this.currentPath.next(current.path);\n this.passbackData[1] = current.path;\n current.path = this.tapisFilesService.getParentPath(current.path);\n current.name = '..';\n files.unshift(current);\n }\n const newFile = [];\n files.forEach(function(value, index) {\n if (value.type == 'file' || value.type == 'dir') {\n newFile.push(value);\n }\n });\n\n this.inProgress = false;\n this.filesList = this.filesList.concat(newFile);\n this.offset = this.offset + files.length;\n },\n (error) => {\n this.inProgress = false;\n }\n );\n }\n\n chooseFiles() {\n this.passbackData[0] = this.selectedSystem.id;\n\n // checks to see if the input was left unchanged\n if (this.downloadSelectForm.dirty) {\n // if changed, enter name as specified\n this.passbackData[2] = this.downloadSelectForm.get('Name').value;\n } else {\n // if unchanged, enter filename as empty string\n this.passbackData[2] = '';\n }\n this.passbackData[3] = this.fileExtension;\n this.dialogRef.close(this.passbackData);\n }\n\n cancel() {\n this.dialogRef.close();\n }\n}\n","import { Component, OnInit } from '@angular/core';\nimport { BsModalService, BsModalRef } from 'ngx-foundation';\nimport { FormGroup, FormControl } from '@angular/forms';\nimport { ProjectsService } from '../../services/projects.service';\nimport { Project, ProjectRequest } from '../../models/models';\nimport { MatDialog, MatDialogRef } from '@angular/material/dialog';\nimport { Subject } from 'rxjs';\n\n@Component({\n selector: 'app-modal-create-project',\n templateUrl: './modal-create-project.component.html',\n styleUrls: ['./modal-create-project.component.scss'],\n})\nexport class ModalCreateProjectComponent implements OnInit {\n public readonly onClose: Subject<any> = new Subject<any>();\n\n projCreateForm: FormGroup;\n\n constructor(\n public dialogRef: MatDialogRef<ModalCreateProjectComponent>,\n private dialog: MatDialog,\n private projectsService: ProjectsService\n ) {}\n\n ngOnInit() {\n this.projCreateForm = new FormGroup({\n name: new FormControl(''),\n description: new FormControl(''),\n });\n }\n\n close(project: Project) {\n this.dialogRef.close();\n }\n\n submit() {\n // Watch content we can set to false, for our project, we don't need this yet.\n // Watch content refers to syncing files created in a folder with a hazmapper map\n // Set observable to true, Hazmapper doesn't let users define that value for some reason.\n const proj = new Project();\n const projRqst = new ProjectRequest();\n\n // Retrieve project name and description\n proj.description = this.projCreateForm.get('description').value;\n proj.name = this.projCreateForm.get('name').value;\n\n projRqst.project = proj;\n\n this.projectsService.create(projRqst);\n this.dialogRef.close();\n }\n}\n","import { Component, OnInit } from '@angular/core';\nimport { MatDialog, MatDialogRef } from '@angular/material/dialog';\nimport { FormGroup, FormControl } from '@angular/forms';\nimport { ProjectsService } from '../../services/projects.service';\nimport { Project } from '../../models/models';\nimport { THIS_EXPR } from '@angular/compiler/src/output/output_ast';\n\n@Component({\n selector: 'app-modal-share-project',\n templateUrl: './modal-share-project.component.html',\n styleUrls: ['./modal-share-project.component.scss'],\n})\nexport class ModalShareProjectComponent implements OnInit {\n projShareForm: FormGroup;\n activeProj: Project;\n projectUsers;\n onlyOne: boolean; // if only one user is present == TRUE\n\n constructor(\n public dialogRef: MatDialogRef<ModalShareProjectComponent>,\n private dialog: MatDialog,\n private projectsService: ProjectsService\n ) {}\n\n ngOnInit() {\n // creates new form control group to access input value\n this.projShareForm = new FormGroup({\n name: new FormControl(''),\n });\n\n // retrieves active project, needed to add users to the project\n this.projectsService.activeProject.subscribe((proj) => {\n this.activeProj = proj;\n });\n\n // retrieves all users currently registered to the active project\n this.projectsService.getProjectUsers(this.activeProj).subscribe((next) => {\n this.projectUsers = next;\n this.onlyOne = this.projectUsers.length == 1;\n });\n }\n\n // closes modal without submitting anything\n close() {\n this.dialogRef.close();\n }\n\n // shares project with specified user\n submit() {\n this.projectsService.addUserToProject(\n this.activeProj,\n this.projShareForm.get('name').value\n );\n this.dialogRef.close();\n }\n\n // deletes user from project\n delete(user) {\n this.projectsService.deleteUserFromProject(this.activeProj, user);\n this.dialogRef.close();\n }\n}\n","import { Component, OnInit, Inject } from '@angular/core';\nimport { BsModalService, BsModalRef } from 'ngx-foundation';\nimport { FormGroup, FormControl } from '@angular/forms';\nimport { ProjectsService } from '../../services/projects.service';\nimport { Project, ProjectRequest } from '../../models/models';\nimport {\n MAT_DIALOG_DATA,\n MatDialog,\n MatDialogRef,\n} from '@angular/material/dialog';\n\n@Component({\n selector: 'app-modal-current-project',\n templateUrl: './modal-current-project.component.html',\n styleUrls: ['./modal-current-project.component.scss'],\n})\nexport class ModalCurrentProjectComponent implements OnInit {\n projCreateForm: FormGroup;\n activeProject: Project;\n\n constructor(\n public dialogRef: MatDialogRef<ModalCurrentProjectComponent>,\n private dialog: MatDialog,\n private projectsService: ProjectsService,\n @Inject(MAT_DIALOG_DATA) public projData: any\n ) {}\n\n ngOnInit() {\n this.projectsService.activeProject.subscribe((next) => {\n this.activeProject = next;\n });\n\n this.projCreateForm = new FormGroup({\n name: new FormControl(this.activeProject.name),\n description: new FormControl(this.activeProject.description),\n });\n }\n\n close() {\n this.dialogRef.close();\n }\n\n delete() {\n if (\n confirm(\n 'Are you sure you want to delete this project? This will also delete it from HazMapper, and anyone this project was shared with.'\n )\n ) {\n this.projectsService.delete(this.activeProject);\n }\n this.dialogRef.close();\n }\n\n update() {\n const p = new Project();\n const projRqst = new ProjectRequest();\n\n p.description = this.projCreateForm.get('description').value;\n p.name = this.projCreateForm.get('name').value;\n p.id = this.activeProject.id;\n p.uuid = this.activeProject.uuid;\n\n projRqst.project = p;\n\n this.projectsService.update(projRqst);\n this.dialogRef.close();\n }\n}\n","import { Injectable } from '@angular/core';\nimport { Feature, FeatureCollection } from '../models/models';\nimport { BehaviorSubject, Observable } from 'rxjs';\nimport { GeoDataService } from './geo-data.service';\nimport { feature } from '@turf/turf';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class FeatureService {\n private featureCollection: FeatureCollection;\n private _features: BehaviorSubject<FeatureCollection>;\n public features$: Observable<FeatureCollection>;\n\n constructor(private geoDataService: GeoDataService) {\n this._features = new BehaviorSubject<FeatureCollection>({\n type: 'FeatureCollection',\n features: [],\n });\n this.features$ = this._features.asObservable();\n\n this.geoDataService.features.subscribe((fc: FeatureCollection) => {\n this._features.next(fc);\n this.featureCollection = fc;\n });\n }\n\n // Takes the feature to be deleted, and filters it out of the feature list\n deleteFeature(feat: Feature): void {\n this.featureCollection.features = this.featureCollection.features.filter(\n (featListfeat) => featListfeat.id != feat.id\n );\n this._features.next(this.featureCollection); // Update the observable\n this.geoDataService.deleteFeature(feat);\n }\n\n // Takes a list of features, and deletes them from the observable in a more efficient manner\n bulkFeatureDelete(delFeats: Array<Feature>): void {\n delFeats.forEach((feat) => {\n // Filter out every feature in delFeats from the master list\n this.featureCollection.features = this.featureCollection.features.filter(\n (featListFeature) => featListFeature.id != feat.id\n );\n this.geoDataService.deleteFeature(feat);\n });\n this._features.next(this.featureCollection); // Update the observable with the filtered list\n }\n\n saveFeature(feat: Feature): void {\n this.geoDataService.updateFeatureProperty(\n feat.project_id,\n Number(feat.id),\n feat.properties\n );\n }\n\n // Takes a feature, and optionally an updated property section\n // If featprop is null, it assumes the passed in feature was already updated with the new properties\n updateFeatureProperties(feature: Feature, featProp = null): void {\n // If featprop has a value, update the feature's properties to the new section\n if (featProp != null) {\n feature.properties = featProp;\n }\n // Update and save the list\n this.featureCollection.features.forEach((feat) => {\n if (feat.id == feature.id) {\n feat = feature;\n }\n });\n this.saveFeature(feature);\n }\n}\n","import {\n Component,\n OnInit,\n Output,\n TemplateRef,\n ChangeDetectorRef,\n} from '@angular/core';\nimport { ProjectsService } from '../../services/projects.service';\nimport { Feature, Project, TagGroup } from '../../models/models';\nimport { FeatureCollection } from 'geojson';\nimport { GeoDataService } from '../../services/geo-data.service';\nimport { LatLng } from 'leaflet';\nimport { skip } from 'rxjs/operators';\nimport { BsModalRef, BsModalService } from 'ngx-foundation';\nimport { ModalFileBrowserComponent } from '../modal-file-browser/modal-file-browser.component';\nimport { ModalDownloadSelectorComponent } from '../modal-download-selector/modal-download-selector.component';\nimport { ModalCreateProjectComponent } from '../modal-create-project/modal-create-project.component';\nimport { ModalShareProjectComponent } from '../modal-share-project/modal-share-project.component';\nimport { combineLatest } from 'rxjs';\nimport { RemoteFile } from 'ng-tapis';\nimport { GroupsService } from '../../services/groups.service';\nimport { FormsService } from '../../services/forms.service';\nimport {\n AuthenticatedUser,\n AuthService,\n} from '../../services/authentication.service';\nimport { Router } from '@angular/router';\nimport { MatDialog } from '@angular/material/dialog';\nimport { ModalCurrentProjectComponent } from '../modal-current-project/modal-current-project.component';\nimport { environment } from '../../../environments/environment';\nimport { TapisFilesService } from '../../services/tapis-files.service';\n\nimport { ScrollService } from 'src/app/services/scroll.service';\nimport { NotificationsService } from 'src/app/services/notifications.service';\nimport { FeatureService } from 'src/app/services/feature.service';\nimport * as JSZip from 'jszip';\n\n@Component({\n selector: 'app-control-bar',\n templateUrl: './control-bar.component.html',\n styleUrls: ['./control-bar.component.scss'],\n})\nexport class ControlBarComponent implements OnInit {\n public activeFeature: Feature;\n features: FeatureCollection;\n featureList: Array<any> = [];\n\n public currentUser: AuthenticatedUser;\n public projects: Project[];\n public selectedProject: Project;\n public mapMouseLocation: LatLng = new LatLng(0, 0);\n imageName: string;\n groupsExist: boolean;\n groupName: string;\n showTagger = false;\n selectedImages: Array<any>;\n modalRef: BsModalRef;\n activeGroup: TagGroup;\n groups: Map<string, TagGroup>;\n groupsFeatures: Map<string, any>;\n activeGroupFeatures: any;\n activeGroupFeaturesRotate: any;\n activeGroupFeature: any;\n invalidNameError = false;\n existingNameError = false;\n hazmapperLink: string;\n foundFilePaths = [];\n groupToAdd: TagGroup;\n public activeProject: Project;\n tagFeaturesQueue: any;\n\n constructor(\n private projectsService: ProjectsService,\n private geoDataService: GeoDataService,\n private bsModalService: BsModalService,\n private groupsService: GroupsService,\n private formsService: FormsService,\n private authService: AuthService,\n private readonly cdr: ChangeDetectorRef,\n private filesService: TapisFilesService,\n private router: Router,\n private dialog: MatDialog,\n private scrollService: ScrollService,\n private notificationsService: NotificationsService,\n private featureService: FeatureService\n ) {}\n\n ngOnInit() {\n this.filesService.getState();\n\n this.groupsService.groupToAdd.subscribe((next) => {\n console.log(next);\n this.groupToAdd = next;\n });\n\n this.geoDataService.tagFeaturesQueue.subscribe((next) => {\n this.tagFeaturesQueue = next;\n });\n\n this.featureService.features$.subscribe((fc: FeatureCollection) => {\n this.features = fc;\n\n if (this.features != undefined) {\n this.featureList = fc.features.filter(\n (feature: Feature) =>\n feature.assets.length &&\n feature.initialAsset() &&\n feature.featureType() === 'image'\n );\n }\n });\n\n this.geoDataService.groups.subscribe((next) => {\n this.groups = next;\n this.groupsExist = next && next.size ? true : false;\n });\n\n this.projectsService.activeProject.subscribe((next) => {\n this.activeProject = next;\n });\n\n combineLatest(\n this.geoDataService.activeGroup,\n this.geoDataService.groupsFeatures\n ).subscribe(([grp, grpFts]) => {\n this.activeGroup = grp;\n this.groupsFeatures = grpFts;\n if (grp && grpFts) {\n this.activeGroupFeatures = grpFts.get(grp.name);\n if (this.activeGroupFeatures) {\n this.activeGroupFeaturesRotate = [...this.activeGroupFeatures];\n }\n }\n });\n\n this.geoDataService.activeGroupFeature.subscribe((next) => {\n this.activeGroupFeature = next;\n });\n\n this.geoDataService.activeFeature.subscribe((next) => {\n this.activeFeature = next;\n });\n\n this.notificationsService.notifications.subscribe((next) => {\n const hasSuccessNotification = next.some(\n (note) => note.status === 'success'\n );\n const hasFailureNotification = next.some(\n (note) => note.status === 'error'\n );\n if (hasSuccessNotification) {\n this.geoDataService.getFeatures(this.selectedProject.id);\n }\n if (hasFailureNotification) {\n next.forEach((item) => {\n // Compiles a list of all necessary files to import via the alt method\n // The substring from 0 to 16 contains the phrase \"Error importing\", everything after this is the file path\n if (\n item.message.substring(0, 16) == 'Error importing ' &&\n !this.foundFilePaths.some(\n (filePath) => filePath === item.message.substring(16)\n )\n ) {\n const path = item.message.substring(16);\n this.geoDataService.uploadNewFeature(\n this.selectedProject.id,\n this.createBlankFeature(),\n path\n );\n this.foundFilePaths.push(path);\n }\n });\n this.geoDataService.getFeatures(this.selectedProject.id);\n }\n });\n\n this.authService.currentUser.subscribe((next) => (this.currentUser = next));\n\n this.projectsService.getProjects();\n this.projectsService.projects.subscribe((projects) => {\n this.projects = projects;\n\n // restores view to the last visited project from local storage\n let lastProject = null;\n try {\n lastProject = JSON.parse(window.localStorage.getItem('lastProj'));\n } catch (error) {\n // possible that lastProj item is null and not json\n lastProject = null;\n }\n\n if (projects.length) {\n const selectedLastProject = lastProject\n ? this.projects.find((prj) => prj.id === lastProject.id)\n : null;\n if (selectedLastProject) {\n this.projectsService.setActiveProject(selectedLastProject);\n } else {\n // default to the first project in the list\n this.projectsService.setActiveProject(this.projects[0]);\n }\n }\n\n this.groupsService.selectedImages.subscribe((next) => {\n this.selectedImages = next;\n });\n\n this.groupsService.showTagger.subscribe((next) => {\n this.showTagger = next;\n });\n });\n\n this.projectsService.activeProject.subscribe((next) => {\n this.selectedProject = next;\n if (this.selectedProject) {\n this.getDataForProject(this.selectedProject);\n // retrieves uuid for project, formats result into a link to that Hazmapper map\n this.hazmapperLink =\n 'https://hazmapper.tacc.utexas.edu/hazmapper/project/' + next.uuid;\n }\n });\n\n this.geoDataService.mapMouseLocation.pipe(skip(1)).subscribe((next) => {\n this.mapMouseLocation = next;\n });\n }\n\n ngAfterViewChecked() {\n this.cdr.detectChanges();\n }\n\n clearAll() {\n this.groupsService.unselectAllImages();\n }\n\n compareGroup(a, b) {\n return a.name === b.name;\n }\n\n changeGroupToAdd(ev: any) {\n this.groupsService.setGroupToAdd(ev.value);\n }\n\n selectProject(p: Project): void {\n this.projectsService.setActiveProject(p);\n }\n\n getDataForProject(p: Project): void {\n this.geoDataService.getFeatures(p.id);\n this.geoDataService.getOverlays(p.id);\n this.geoDataService.getPointClouds(p.id);\n }\n\n openFilePicker() {\n // Refreshes the list of found paths used in importing images without Geo tagging\n this.foundFilePaths = [];\n const modal = this.dialog.open(ModalFileBrowserComponent);\n modal.afterClosed().subscribe((files: Array<RemoteFile>) => {\n if (files != null) {\n this.geoDataService.importFileFromTapis(this.selectedProject.id, files);\n }\n });\n }\n\n // Creates a feature with a long/lat value of 0,0 and no associated image. Used in alternate image inport\n // I think if we want a placeholder image, we can add it here.\n createBlankFeature() {\n const blankFeature: Feature = {\n type: 'Feature',\n geometry: {\n type: 'Point',\n coordinates: [0, 0],\n },\n properties: {},\n };\n return blankFeature;\n }\n\n openDownloadSelector(fileName: string) {\n const modal = this.dialog.open(ModalDownloadSelectorComponent);\n let path: Array<string>;\n modal.afterClosed().subscribe((passbackData: Array<string>) => {\n path = passbackData;\n this.saveFile(path[3] == '.json', true, path[0], path[1], path[2]);\n });\n }\n\n openCreateProjectModal() {\n this.dialog.open(ModalCreateProjectComponent, {\n height: '400px',\n width: '600px',\n });\n }\n\n openShareProjectModal() {\n this.dialog.open(ModalShareProjectComponent, {\n height: '400px',\n width: '600px',\n });\n }\n\n openProjectModal(project) {\n const modal = this.dialog.open(ModalCurrentProjectComponent, {\n height: '400px',\n width: '600px',\n data: {\n id: project.id,\n name: project.name,\n description: project.description,\n uuid: project.uuid,\n },\n });\n }\n\n addGroup(name: string) {\n this.groupName = name;\n if (!name || 0 === name.length) {\n this.invalidNameError = true;\n this.existingNameError = false;\n } else if (this.groups.get(name)) {\n this.invalidNameError = false;\n this.existingNameError = true;\n } else {\n this.invalidNameError = false;\n this.existingNameError = false;\n const newGroup = this.geoDataService.createNewGroup(\n this.selectedProject.id,\n this.selectedImages,\n name\n );\n this.dialog.closeAll();\n this.groupsService.unselectAllImages();\n }\n }\n\n addToGroup(group: TagGroup) {\n this.geoDataService.createGroupFeatures(\n this.activeProject.id,\n this.selectedImages,\n this.groups.get(group.name)\n );\n this.groupsService.unselectAllImages();\n this.scrollService.setScrollRestored(true);\n }\n openAddGroupModal(template: TemplateRef<any>) {\n this.dialog.open(template);\n }\n\n toggleTagger() {\n if (!this.showTagger) {\n this.scrollService.setScrollPosition();\n\n const [initialGroupName] = this.groupsFeatures.keys();\n const activeGroupFeatures = this.groupsFeatures.get(initialGroupName);\n const activeGroup = this.groups.get(initialGroupName);\n this.geoDataService.setActiveGroup(activeGroup);\n\n this.groupsService.setShowTagGenerator(false);\n this.groupsService.unselectAllImages();\n } else {\n this.scrollService.setScrollRestored(true);\n }\n\n this.groupsService.toggleTagger();\n }\n\n getAssetDisplay() {\n return this.activeGroupFeature.featureShortPath();\n }\n\n otherPath(dir: boolean) {\n if (dir) {\n this.activeGroupFeaturesRotate.push(\n this.activeGroupFeaturesRotate.shift()\n );\n } else {\n this.activeGroupFeaturesRotate.unshift(\n this.activeGroupFeaturesRotate.pop()\n );\n }\n this.activeGroupFeature = this.activeGroupFeaturesRotate[0];\n this.geoDataService.setActiveGroupFeature(this.activeGroupFeature);\n }\n\n getCSVHeaders(exportFeatures) {\n let headerArray = [];\n exportFeatures.forEach((ef) => {\n headerArray = [...Object.keys(ef)];\n });\n return headerArray;\n }\n\n exportList() {\n const exportList = [];\n\n this.groups.forEach((e) => {\n const exportGroupObj = {};\n exportGroupObj['groupName'] = e.name;\n const groupFeatures = this.groupsFeatures.get(e.name);\n exportGroupObj['features'] = [];\n\n const forms = e.forms;\n\n groupFeatures.forEach((groupFeature) => {\n let featureSource =\n environment.apiUrl + '/assets/' + groupFeature.assets[0].path;\n featureSource = featureSource.replace(/([^:])(\\/{2,})/g, '$1/');\n const coordinates = groupFeature.geometry.coordinates;\n const tags = groupFeature.properties.taggit.tags;\n const featureObj = {\n src: featureSource,\n id: groupFeature.id,\n longitude: coordinates[0],\n latitude: coordinates[1],\n groupName: e.name,\n icon: e.icon,\n color: e.color,\n };\n\n if (forms && tags) {\n forms.forEach((f) => {\n const tag = tags.find((t) => {\n return f.id === t.id;\n });\n if (tag) {\n const label = f.label.charAt(0).toUpperCase() + f.label.slice(1);\n featureObj['Tag' + label + 'Type'] = f.type;\n featureObj['Tag' + label + 'Value'] =\n f.type === 'checkbox'\n ? tag.value.map((v) => v.label).join('|')\n : tag.value;\n }\n });\n }\n exportGroupObj['features'].push(featureObj);\n });\n exportList.push(exportGroupObj);\n });\n return exportList;\n }\n\n saveFile(\n isJSON: Boolean,\n forExport: Boolean = false,\n systemID = '',\n path = '',\n fileName\n ) {\n const exportList = this.exportList();\n const filename = 'taggit-proj-' + this.selectedProject.name;\n if (isJSON) {\n const content = JSON.stringify(exportList);\n const blob = new Blob(['\\ufeff' + content], {\n type: 'text/json;charset=utf-8;',\n });\n if (forExport) {\n this.filesService.export(systemID, path, fileName, '.json', blob);\n } else {\n this.download(blob, '.json', filename);\n }\n } else {\n const csvFiles = exportList.map((exportItem) => {\n const csvRows = [];\n const headers = this.getCSVHeaders(exportItem.features);\n csvRows.push(headers.join(','));\n\n exportItem.features.forEach((ef) => {\n const values = headers.map((header) =>\n ef[header] ? ef[header] : ''\n );\n csvRows.push(values.join(','));\n });\n\n return csvRows.join('\\n');\n });\n\n const zip = new JSZip();\n csvFiles.forEach((csv, i) => {\n zip.file(`group-${i}.csv`, csv);\n });\n\n zip.generateAsync({ type: 'blob' }).then((content) => {\n if (forExport) {\n this.filesService.export(systemID, path, fileName, '.zip', content);\n } else {\n this.download(content, '.zip', filename);\n }\n });\n }\n }\n\n download(content, extension, filename) {\n // Creates a download link in typescript through a blob\n const download = document.createElement('a');\n const url = window.URL.createObjectURL(content);\n\n // checks if the browser is Safari or otherwise, if so open download in new window\n // Its a quirk of those browsers that they don't allow same-page downloads\n if (\n navigator.userAgent.indexOf('Safari') != -1 &&\n navigator.userAgent.indexOf('Chrome') == -1\n ) {\n download.setAttribute('target', '_blank');\n }\n // Sets up the link, and simulates a click\n download.setAttribute('href', url);\n download.setAttribute('download', filename + extension);\n download.style.visibility = 'hidden';\n document.body.appendChild(download);\n download.click();\n document.body.removeChild(download);\n\n window.URL.revokeObjectURL(url);\n }\n\n saveTags(ev) {\n this.geoDataService.updateTagFeaturesQueue(this.activeProject.id);\n }\n}\n","import { Injectable } from '@angular/core';\nimport {\n HttpRequest,\n HttpHandler,\n HttpEvent,\n HttpInterceptor,\n} from '@angular/common/http';\nimport { Observable, throwError } from 'rxjs';\nimport { AuthService } from './services/authentication.service';\nimport { environment } from '../environments/environment';\nimport { catchError } from 'rxjs/operators';\n\n@Injectable()\nexport class AuthInterceptor implements HttpInterceptor {\n constructor(private authService: AuthService) {}\n\n intercept(\n request: HttpRequest<any>,\n next: HttpHandler\n ): Observable<HttpEvent<any>> {\n return next.handle(request).pipe(\n catchError((err) => {\n if (err.status === 401) {\n // auto logout if 401 response returned from api\n this.authService.logout();\n location.reload();\n }\n\n const error = err.error.message || err.statusText;\n return throwError(error);\n })\n );\n }\n}\n\n@Injectable()\nexport class TokenInterceptor implements HttpInterceptor {\n constructor(private authSvc: AuthService) {}\n\n intercept(\n request: HttpRequest<any>,\n next: HttpHandler\n ): Observable<HttpEvent<any>> {\n if (request.url.indexOf('https://agave.designsafe-ci.org') > -1) {\n if (this.authSvc.isLoggedIn()) {\n request = request.clone({\n setHeaders: {\n Authorization: 'Bearer ' + this.authSvc.userToken.token,\n },\n });\n }\n }\n // we put the JWT on the request to our geoapi API because it is not behind ws02 if in local dev\n // and if user is logged in\n if (\n request.url.indexOf('http://localhost') > -1 &&\n this.authSvc.isLoggedIn()\n ) {\n // add header\n request = request.clone({\n setHeaders: {\n 'X-JWT-Assertion-designsafe': environment.jwt,\n },\n });\n }\n\n return next.handle(request);\n }\n}\n","import {\n AfterViewChecked,\n Component,\n OnInit,\n Renderer2,\n ChangeDetectorRef,\n} from '@angular/core';\nimport { GeoDataService } from '../../services/geo-data.service';\nimport {\n FeatureAsset,\n Feature,\n Project,\n FeatureCollection,\n TagGroup,\n} from '../../models/models';\nimport { AppEnvironment, environment } from '../../../environments/environment';\nimport { ProjectsService } from '../../services/projects.service';\nimport { ScrollService } from 'src/app/services/scroll.service';\nimport { GroupsService } from '../../services/groups.service';\nimport { NgxSpinnerService } from 'ngx-spinner';\nimport { startWith } from 'rxjs/operators';\nimport { MatDialog } from '@angular/material/dialog';\nimport { ModalCreateProjectComponent } from '../modal-create-project/modal-create-project.component';\nimport { FeatureService } from 'src/app/services/feature.service';\n\n@Component({\n selector: 'app-image-gallery',\n templateUrl: './image-gallery.component.html',\n styleUrls: ['./image-gallery.component.scss'],\n})\nexport class ImageGalleryComponent implements OnInit, AfterViewChecked {\n environment: AppEnvironment;\n\n public projects: Project[];\n groupName: string;\n showTagger = false;\n scrolling = false;\n scrollStatus: string;\n imagesExist: boolean = false;\n projectsExist: boolean;\n featureList: Array<any> = [];\n featureListScroll: Array<any>;\n scrollSum = 15;\n activeGroup: TagGroup;\n activeFeature: Feature;\n activeGroupFeature: Feature;\n // activeFeatureNum: number;\n featurePath: string;\n loaded: boolean;\n loadingGallery: boolean = false;\n groupsFeatures: Map<string, any>;\n groups: Map<string, any>;\n\n constructor(\n private geoDataService: GeoDataService,\n private projectsService: ProjectsService,\n private groupsService: GroupsService,\n private readonly cdr: ChangeDetectorRef,\n private renderer: Renderer2,\n private spinner: NgxSpinnerService,\n private dialog: MatDialog,\n private scrollService: ScrollService,\n private featureService: FeatureService\n ) {}\n\n ngAfterViewChecked() {\n if (this.scrollService.scrollRestored) {\n this.scrollService.scroll();\n }\n this.cdr.detectChanges();\n }\n\n ngOnInit() {\n this.environment = environment;\n\n this.geoDataService.loaded.subscribe(\n (e) => {\n this.loaded = e;\n },\n (error) => {\n this.projectsExist = false;\n }\n );\n\n this.geoDataService.loadingGallery.subscribe(e => {\n this.loadingGallery = e;\n });\n\n this.featureService.features$.subscribe((fc: any) => {\n this.imagesExist = false;\n if (fc) {\n if (fc.features.length > 0) {\n this.featureList = fc.features.filter((feature) => {\n try {\n return (\n feature.initialAsset() && feature.featureType() === 'image'\n );\n } catch (error) {\n // If a feature has no asset, it ends up in this catch\n console.error(error);\n // After outputting the error, add an \"image not found\" placeholder,\n // Allowing users to still select their errored import\n // Note that this doesn't really work!\n feature.assets.push({ path: '../../images/Image-not-found.png' });\n return false;\n }\n });\n if (this.featureList.length > 0) {\n this.imagesExist = true;\n }\n this.featureListScroll = this.featureList.slice(0, this.scrollSum);\n } else {\n this.imagesExist = false;\n }\n }\n });\n\n this.projectsService.projects.subscribe((projects) => {\n this.projects = projects;\n if (this.projects.length) {\n this.projectsExist = true;\n } else {\n this.projectsExist = false;\n }\n });\n\n this.geoDataService.groupsFeatures.subscribe((next) => {\n this.groupsFeatures = next;\n });\n\n this.geoDataService.groups.subscribe((next) => {\n this.groups = next;\n });\n\n this.geoDataService.activeFeature.subscribe((next) => {\n if (next) {\n this.activeFeature = next;\n }\n });\n\n this.geoDataService.activeGroup.subscribe((next: TagGroup) => {\n this.activeGroup = next;\n });\n\n this.geoDataService.activeGroupFeature.subscribe((next) => {\n this.activeGroupFeature = next;\n });\n\n this.geoDataService.groups.subscribe((next) => {\n this.groups = next;\n });\n\n this.groupsService.showTagger.subscribe((next) => {\n this.showTagger = next;\n this.scrollStatus = next ? 'success' : 'danger';\n });\n }\n\n getPath() {\n return (\n this.environment.apiUrl +\n '/assets/' +\n this.activeGroupFeature.assets[0].path.replace(/([^:])(\\/{2,})/g, '$1/')\n );\n }\n\n appendSum() {\n if (this.featureList.length != 0) {\n if (this.scrollSum == this.featureList.length) {\n this.spinner.hide();\n this.scrolling = false;\n return;\n }\n // If scrollSum is larger than the length of the feature list, curtail it to just be the length\n if (this.scrollSum > this.featureList.length) {\n this.scrollSum = this.featureList.length;\n }\n }\n this.featureListScroll = this.featureList.slice(0, this.scrollSum);\n setTimeout(() => {\n this.spinner.hide();\n this.scrolling = false;\n }, 1300);\n }\n\n onScroll() {\n if (!this.scrolling) {\n this.spinner.show();\n this.scrollSum += 10;\n this.appendSum();\n this.scrolling = true;\n }\n }\n\n openCreateProjectModal() {\n this.dialog.open(ModalCreateProjectComponent, {\n height: '400px',\n width: '600px',\n });\n }\n}\n","import { Component, Input, OnInit, TemplateRef } from '@angular/core';\nimport { MatDialog } from '@angular/material/dialog';\nimport { BsModalRef } from 'ngx-foundation/modal/bs-modal-ref.service';\nimport { FeatureService } from 'src/app/services/feature.service';\nimport { ScrollService } from 'src/app/services/scroll.service';\nimport { AppEnvironment, environment } from '../../../environments/environment';\nimport { Feature, Project, TagGroup } from '../../models/models';\nimport { GeoDataService } from '../../services/geo-data.service';\nimport { GroupsService } from '../../services/groups.service';\nimport { ProjectsService } from '../../services/projects.service';\n\n@Component({\n selector: 'app-image-box',\n templateUrl: './image-box.component.html',\n styleUrls: ['./image-box.component.scss'],\n})\nexport class ImageBoxComponent implements OnInit {\n @Input() feature: any;\n environment: AppEnvironment;\n featureSource: string;\n featurePath: string;\n status = false; // Controls the whether or not an image box is selected or not\n imageSelected = 'img-unselected'; // Controls the whether or not an image box is selected or not\n hasGroup = false;\n colors: Array<string> = [];\n groups: Map<string, TagGroup>;\n coordinates: Array<any>;\n containingGroupList: Array<any>;\n selectedImages: Array<any>;\n modalRef: BsModalRef;\n groupToAdd: TagGroup;\n\n public activeProject: Project;\n\n constructor(\n private geoDataService: GeoDataService,\n private groupsService: GroupsService,\n private projectsService: ProjectsService,\n private dialog: MatDialog,\n private scrollService: ScrollService,\n private featureService: FeatureService\n ) {}\n\n ngOnInit() {\n // TODO: put this in models\n this.environment = environment;\n let featureSource: string;\n if (this.feature.assets[0].path != '../../images/Image-not-found.png') {\n featureSource =\n this.environment.apiUrl + '/assets/' + this.feature.assets[0].path;\n } else {\n featureSource = this.feature.assets[0].path;\n }\n featureSource = featureSource.replace(/([^:])(\\/{2,})/g, '$1/');\n this.featureSource = featureSource;\n this.coordinates = this.feature.geometry.coordinates;\n\n this.projectsService.activeProject.subscribe((next) => {\n this.activeProject = next;\n });\n\n this.geoDataService.groups.subscribe((next) => {\n this.groups = next;\n });\n\n this.groupsService.selectedImages.subscribe((next) => {\n this.selectedImages = next;\n this.imageSelected = this.groupsService.imageSelected(this.feature)\n ? 'img-selected'\n : 'img-unselected';\n });\n\n this.groupsService.groupToAdd.subscribe((next) => {\n this.groupToAdd = next;\n });\n\n this.featurePath = this.feature.featurePath();\n }\n\n imageSelect() {\n this.groupsService.toggleImageSelect(this.feature);\n }\n\n compareGroup(a, b) {\n return a.name === b.name;\n }\n\n imageZoom(template: TemplateRef<any>) {\n this.dialog.open(template);\n }\n\n imageDelete() {\n const featureService = this.featureService;\n this.selectedImages.forEach(function (value) {\n featureService.deleteFeature(value);\n });\n this.groupsService.unselectAllImages();\n this.scrollService.setScrollRestored(true);\n }\n\n openModal(template: TemplateRef<any>) {\n this.dialog.open(template);\n }\n\n openPreserveScrollModal(template: TemplateRef<any>) {\n this.scrollService.setScrollPosition();\n this.dialog.open(template);\n }\n\n deleteFromGroup(feature: Feature, group: TagGroup) {\n this.geoDataService.deleteGroupFeatures(\n this.activeProject.id,\n [feature],\n group\n );\n }\n\n openImageAddModal(template: TemplateRef<any>) {\n this.scrollService.setScrollPosition();\n this.dialog.open(template);\n }\n\n changeGroupToAdd(ev: any) {\n this.groupsService.setGroupToAdd(ev.value);\n }\n\n addGroup(group: TagGroup) {\n this.geoDataService.createGroupFeatures(\n this.activeProject.id,\n [this.feature],\n this.groups.get(group.name)\n );\n this.groupsService.unselectAllImages();\n this.scrollService.setScrollRestored(true);\n }\n}\n","import { Component, EventEmitter, Input, OnInit, Output } from '@angular/core';\nimport { FormControl } from '@angular/forms';\nimport { GroupForm } from 'src/app/models/models';\n\n@Component({\n selector: 'app-form-generator',\n templateUrl: './form-generator.component.html',\n styleUrls: ['./form-generator.component.scss'],\n})\nexport class FormGeneratorComponent implements OnInit {\n constructor() { }\n @Input() form: GroupForm;\n checked = false;\n colorArray: Array<string> = [];\n values = [];\n\n name = new FormControl('');\n\n ngOnInit() {\n if (this.form.type == 'color' && this.form.options) {\n this.generateColors();\n }\n }\n\n // Generates a key:value list of colors ranging from green (#00FF00) to red (#FF0000) based on passed in info\n generateColors() {\n let itemCount = this.form.options.length;\n let isOdd = false;\n if (itemCount % 2 === 1) {\n // if there are an odd number of items in the collection, mark it and decriment the counter\n isOdd = true;\n itemCount--;\n }\n // Subtract 2 from item count (first entry is always green, #00FF00, last entry is always red, #FF0000\n // Then half the item count, and use it to divide 255, this gives the amount we have to increment the colors\n itemCount = (itemCount - 2) / 2;\n let incrementVal = Math.floor(255 / itemCount);\n if (incrementVal === 255) {\n incrementVal = Math.floor(incrementVal / 2);\n }\n this.colorArray.push('#00FF00');\n let baseNum = 0;\n let temp: string;\n // First loop, counts up from zero towards 255\n for (let index = 0; index < itemCount; index++) {\n baseNum = baseNum + incrementVal;\n temp = baseNum.toString(16);\n this.colorArray.push(`#${temp}FF00`);\n }\n // if there is an odd number of selections, push full yellow as a midpoint in the gradient\n if (isOdd) {\n this.colorArray.push('#FFFF00');\n }\n baseNum = 255; // Resets baseNum to 255 for the count down\n // Second loop, counts down from 255 towards zero\n for (let index = 0; index < itemCount; index++) {\n baseNum = baseNum - incrementVal;\n temp = baseNum.toString(16);\n if (temp.length != 2) {\n temp = '0' + temp;\n }\n this.colorArray.push(`#FF${temp}00`);\n }\n // Finally, pushes the color code for red onto the stack for the last entry\n this.colorArray.push('#FF0000');\n }\n}\n","import { Component, OnInit } from '@angular/core';\nimport { GroupsService } from '../../services/groups.service';\nimport { GeoDataService } from '../../services/geo-data.service';\n\n@Component({\n selector: 'app-side-bar',\n templateUrl: './side-bar.component.html',\n styleUrls: ['./side-bar.component.scss'],\n})\nexport class SideBarComponent implements OnInit {\n showTagGenerator = false;\n loadingFeatureProperties;\n\n constructor(\n private groupsService: GroupsService,\n private geoDataService: GeoDataService\n ) { }\n\n ngOnInit() {\n this.groupsService.showTagGenerator.subscribe((next) => {\n this.showTagGenerator = next;\n });\n\n this.geoDataService.loadingFeatureProperties.subscribe((next) => {\n this.loadingFeatureProperties = next;\n });\n }\n}\n","export const groupIcons: Array<any> = [\n { id: 'fa-house-damage', unicode: ' house-damage' },\n { id: 'fa-car', unicode: ' car' },\n { id: 'fa-tree', unicode: ' tree' },\n\n { id: 'fa-school', unicode: ' school' },\n { id: 'fa-archway', unicode: ' archway' },\n { id: 'fa-building', unicode: ' building' },\n { id: 'fa-bus', unicode: ' bus' },\n { id: 'fa-church', unicode: ' church' },\n\n { id: 'fa-helicopter', unicode: ' helicopter' },\n { id: 'fa-hospital-alt', unicode: ' hospital' },\n { id: 'fa-hotel', unicode: ' hotel' },\n { id: 'fa-igloo', unicode: ' igloo' },\n { id: 'fa-motorcycle', unicode: ' motorcycle' },\n { id: 'fa-place-of-worship', unicode: ' place-of-worship' },\n { id: 'fa-plane', unicode: ' plane' },\n { id: 'fa-school', unicode: ' school' },\n\n { id: 'fa-rocket', unicode: ' rocket' },\n { id: 'fa-ship', unicode: ' ship' },\n { id: 'fa-shopping-cart', unicode: ' shopping-cart' },\n { id: 'fa-shuttle-van', unicode: ' shuttle-van' },\n { id: 'fa-monument', unicode: ' monument' },\n { id: 'fa-store', unicode: ' store' },\n\n { id: 'fa-subway', unicode: ' subway' },\n { id: 'fa-taxi', unicode: ' taxi' },\n { id: 'fa-train', unicode: ' train' },\n { id: 'fa-truck', unicode: ' truck' },\n { id: 'fa-truck-pickup', unicode: ' truck-pickup' },\n { id: 'fa-university', unicode: ' university' },\n { id: 'fa-warehouse', unicode: ' warehouse' },\n { id: 'fa-bolt', unicode: ' bolt' },\n];\n","import { Component, OnInit, OnDestroy, TemplateRef } from '@angular/core';\nimport { Project, TagGroup } from '../../../models/models';\nimport { ProjectsService } from '../../../services/projects.service';\nimport { FormsService } from '../../../services/forms.service';\nimport { GroupsService } from '../../../services/groups.service';\nimport { GeoDataService } from '../../../services/geo-data.service';\nimport { MatDialog } from '@angular/material/dialog';\nimport { Subscription } from 'rxjs';\nimport { FeatureService } from 'src/app/services/feature.service';\n\nimport { groupIcons } from 'src/app/utils/groups';\n\n@Component({\n selector: 'app-select-group',\n templateUrl: './select-group.component.html',\n styleUrls: ['./select-group.component.scss'],\n})\nexport class SelectGroupComponent implements OnInit, OnDestroy {\n groups$: Subscription;\n activeGroup$: Subscription;\n\n public selectedProject: Project;\n\n iconList = groupIcons;\n selectedIcon = 'fa-house-damage';\n\n selectedGroup: TagGroup;\n\n activeGroup: TagGroup;\n groups: Map<string, TagGroup>;\n groupsFeatures: Map<string, any>;\n\n showTagger: boolean;\n showSubitem = true;\n\n constructor(\n private groupsService: GroupsService,\n private geoDataService: GeoDataService,\n private projectsService: ProjectsService,\n private dialog: MatDialog\n ) {}\n\n ngOnInit() {\n this.projectsService.activeProject.subscribe((next) => {\n this.selectedProject = next;\n });\n\n this.groups$ = this.geoDataService.groups.subscribe((next) => {\n this.groups = next;\n });\n\n this.geoDataService.groupsFeatures.subscribe((next) => {\n this.groupsFeatures = next;\n });\n\n this.activeGroup$ = this.geoDataService.activeGroup.subscribe((next) => {\n this.activeGroup = next;\n if (!next) {\n this.groupsService.toggleTagger();\n }\n });\n }\n\n selectGroupForm(group: TagGroup) {\n this.geoDataService.setActiveGroup(group);\n }\n\n openRenameOptionModal(template: TemplateRef<any>) {\n this.dialog.open(template);\n }\n\n // TODO: ensure ui is updated from getFeatures()\n deleteGroup(group: TagGroup) {\n const features = this.groupsFeatures.get(group.name);\n this.geoDataService.deleteGroupFeatures(\n this.selectedProject.id,\n features,\n group\n );\n }\n\n openRenameModal(template: TemplateRef<any>, group: TagGroup) {\n this.selectedGroup = group;\n this.dialog.open(template);\n }\n\n openIconSelection(template: TemplateRef<any>, group: TagGroup) {\n this.selectedGroup = group;\n this.selectedIcon = group.icon;\n this.dialog.open(template);\n }\n\n saveIcon(icon: string) {\n this.geoDataService.reiconGroup(\n this.selectedProject.id,\n this.groupsFeatures.get(this.selectedGroup.name),\n this.groups.get(this.selectedGroup.name),\n icon\n );\n\n this.dialog.closeAll();\n }\n\n isChecked(name: string) {\n if (this.activeGroup && this.activeGroup.name === name) {\n return 'checked';\n } else {\n return '';\n }\n }\n\n renameGroup(name: string) {\n this.geoDataService.renameGroup(\n this.selectedProject.id,\n this.groupsFeatures.get(this.selectedGroup.name),\n this.groups.get(this.selectedGroup.name),\n name\n );\n\n this.dialog.closeAll();\n }\n\n expandPanel() {\n this.showSubitem = !this.showSubitem;\n }\n\n ngOnDestroy() {\n this.groups$.unsubscribe();\n this.activeGroup$.unsubscribe();\n }\n}\n","import { Component, OnInit } from '@angular/core';\nimport { Project, TagGroup } from '../../../models/models';\nimport { ProjectsService } from '../../../services/projects.service';\nimport { GeoDataService } from '../../../services/geo-data.service';\nimport { FormsService } from '../../../services/forms.service';\nimport { Feature } from '@turf/turf';\n\n@Component({\n selector: 'app-select-image',\n templateUrl: './select-image.component.html',\n styleUrls: ['./select-image.component.scss'],\n})\nexport class SelectImageComponent implements OnInit {\n public activeProject: Project;\n private groups: Map<string, TagGroup>;\n activeGroup: TagGroup;\n activeGroupFeature: Feature;\n showSubitem = true;\n groupsFeatures: Map<string, any>;\n\n constructor(\n private geoDataService: GeoDataService,\n private projectsService: ProjectsService\n ) {}\n\n ngOnInit() {\n this.projectsService.activeProject.subscribe((next) => {\n this.activeProject = next;\n });\n\n this.geoDataService.groups.subscribe((next) => {\n this.groups = next;\n });\n\n this.geoDataService.activeGroup.subscribe((next) => {\n this.activeGroup = next;\n });\n\n this.geoDataService.activeGroupFeature.subscribe((next) => {\n this.activeGroupFeature = next;\n });\n\n this.geoDataService.groupsFeatures.subscribe((next) => {\n this.groupsFeatures = next;\n if (next && this.activeGroup) {\n const groupFeatures = this.groupsFeatures.get(this.activeGroup.name);\n if (groupFeatures) {\n if (!groupFeatures.some((f) => f.id === this.activeGroupFeature.id)) {\n this.geoDataService.setActiveGroupFeature(groupFeatures[0]);\n }\n } else {\n const [nextGroup] = this.groups.values();\n if (nextGroup) {\n this.geoDataService.setActiveGroup(nextGroup);\n } else {\n this.geoDataService.setActiveGroup(null);\n }\n }\n }\n });\n }\n\n getActiveFeatures() {\n if (this.activeGroup) {\n const groupFeatures = this.groupsFeatures.get(this.activeGroup.name);\n const group = this.groups.get(this.activeGroup.name);\n if (group) {\n return groupFeatures;\n } else {\n const [nextGroup] = this.groups.values();\n if (nextGroup) {\n this.geoDataService.setActiveGroup(nextGroup);\n return this.groupsFeatures.get(nextGroup.name);\n } else {\n return [];\n }\n }\n } else {\n return [];\n }\n }\n\n jumpToImage(feat: Feature) {\n this.geoDataService.setActiveGroupFeature(feat);\n }\n\n isActiveFeature(feature: Feature) {\n return this.activeGroupFeature.id === feature.id;\n }\n\n deleteFeature(feat: any) {\n this.geoDataService.deleteGroupFeatures(\n this.activeProject.id,\n [feat],\n this.groups.get(this.activeGroup.name)\n );\n }\n\n getFeaturePath(feat: any) {\n return feat.featureShortPath();\n }\n\n expandPanel() {\n this.showSubitem = !this.showSubitem;\n }\n}\n","import { Component, OnInit } from '@angular/core';\nimport { GroupForm } from 'src/app/models/models';\n\n@Component({\n selector: 'app-form-fields',\n templateUrl: './form-fields.component.html',\n})\nexport class FormFieldsComponent implements OnInit {\n field: any;\n form: GroupForm;\n\n constructor() {}\n\n // This file and the HTML connected to this is useless so don't worry about it\n ngOnInit() {}\n}\n","import { Component, Input, Output, EventEmitter } from '@angular/core';\nimport { FormGroup } from '@angular/forms';\nimport { Subscription } from 'rxjs';\nimport { take } from 'rxjs/operators';\nimport { FeatureService } from 'src/app/services/feature.service';\nimport { FormsService } from 'src/app/services/forms.service';\nimport { GroupsService } from 'src/app/services/groups.service';\nimport { Feature, GroupForm, Project, TagGroup } from 'src/app/models/models';\nimport { ProjectsService } from 'src/app/services/projects.service';\nimport { GeoDataService } from 'src/app/services/geo-data.service';\n\n@Component({\n selector: 'app-form-checkbox',\n templateUrl: 'form-checkbox.component.html',\n})\nexport class FormCheckBoxComponent {\n @Input() field: any;\n @Input() form: GroupForm;\n value: any[] = [];\n activeGroupFeature: Feature;\n activeGroup: TagGroup;\n private activeProject: Project;\n\n constructor(\n private formsService: FormsService,\n private groupsService: GroupsService,\n private geoDataService: GeoDataService,\n private projectsService: ProjectsService,\n private featureService: FeatureService\n ) {}\n\n ngOnInit() {\n this.geoDataService.activeGroupFeature.subscribe((next) => {\n this.activeGroupFeature = next;\n this.value = this.formsService.getTagValue(next, this.form);\n });\n\n this.geoDataService.activeGroup.subscribe((next) => {\n this.activeGroup = next;\n });\n\n this.projectsService.activeProject.subscribe((next) => {\n this.activeProject = next;\n });\n }\n\n isChecked(opt) {\n return this.value.some((val) => val.label === opt.label);\n }\n\n selected(e: any, option: any) {\n this.value = this.value.filter((opt) => opt.label !== option.label);\n if (e.target.checked) {\n this.value.push(option);\n }\n this.geoDataService.setTagFeaturesQueue(this.activeGroupFeature.id, {\n id: this.form.id,\n value: this.value,\n });\n }\n}\n","import { Component, Input, Output, EventEmitter } from '@angular/core';\nimport { FormGroup } from '@angular/forms';\nimport { Subscription } from 'rxjs';\nimport { FormsService } from 'src/app/services/forms.service';\nimport { GroupsService } from 'src/app/services/groups.service';\nimport { Feature, GroupForm } from 'src/app/models/models';\nimport { GeoDataService } from 'src/app/services/geo-data.service';\n\n@Component({\n selector: 'app-form-dropdown',\n templateUrl: './form-dropdown.component.html',\n})\nexport class FormDropDownComponent {\n @Input() field: any = {};\n @Input() form: GroupForm;\n value: string;\n activeGroupFeature: any;\n\n constructor(\n private formsService: FormsService,\n private geoDataService: GeoDataService\n ) {}\n\n ngOnInit() {\n this.geoDataService.activeGroupFeature.subscribe((next) => {\n this.activeGroupFeature = next;\n this.value = this.formsService.getTagValue(next, this.form);\n });\n }\n\n updateCheckedTag() {\n this.geoDataService.setTagFeaturesQueue(this.activeGroupFeature.id, {\n id: this.form.id,\n value: this.value,\n });\n }\n}\n","import { Component, Input } from '@angular/core';\nimport { FormGroup } from '@angular/forms';\nimport { GroupForm } from 'src/app/models/models';\n\n@Component({\n selector: 'app-form-file',\n templateUrl: './form-file.component.html',\n styleUrls: ['./form-file.component.scss'],\n})\nexport class FormFileComponent {\n field: any = {};\n form: GroupForm;\n\n constructor() {}\n\n ngOnChange() {\n console.log(this.field.value);\n }\n}\n","import { Component, Input, Output, EventEmitter } from '@angular/core';\nimport { FormsService } from 'src/app/services/forms.service';\nimport { GroupForm } from 'src/app/models/models';\nimport { GeoDataService } from 'src/app/services/geo-data.service';\n\n@Component({\n selector: 'app-form-radio',\n templateUrl: './form-radio.component.html',\n})\nexport class FormRadioComponent {\n @Input() field: any = {};\n @Input() form: GroupForm;\n @Input() label: String;\n public value: string;\n activeGroupFeature: any;\n\n constructor(\n private formsService: FormsService,\n private geoDataService: GeoDataService\n ) {}\n\n ngOnInit() {\n this.geoDataService.activeGroupFeature.subscribe((next) => {\n this.activeGroupFeature = next;\n this.value = this.formsService.getTagValue(next, this.form);\n });\n }\n\n updateCheckedTag() {\n this.geoDataService.setTagFeaturesQueue(this.activeGroupFeature.id, {\n id: this.form.id,\n value: this.value,\n });\n }\n}\n","import { Component, Input, Output, EventEmitter } from '@angular/core';\nimport { FormGroup } from '@angular/forms';\nimport { Subscription } from 'rxjs';\nimport { FormsService } from 'src/app/services/forms.service';\nimport { Feature, GroupForm, Project, TagGroup } from 'src/app/models/models';\nimport { GeoDataService } from 'src/app/services/geo-data.service';\n\n@Component({\n selector: 'app-form-textbox',\n templateUrl: './form-textbox.component.html',\n})\nexport class FormTextBoxComponent {\n @Input() field: any = {};\n @Input() form: GroupForm;\n value = '';\n activeGroupFeature: any;\n\n constructor(\n private formsService: FormsService,\n private geoDataService: GeoDataService\n ) {}\n\n ngOnInit() {\n this.geoDataService.activeGroupFeature.subscribe((next) => {\n this.activeGroupFeature = next;\n this.value = this.formsService.getTagValue(next, this.form);\n });\n }\n\n updateValue() {\n this.geoDataService.setTagFeaturesQueue(this.activeGroupFeature.id, {\n id: this.form.id,\n value: this.value,\n });\n }\n}\n","import { Component, OnInit, Input, Output, EventEmitter } from '@angular/core';\nimport { FormGroup } from '@angular/forms';\nimport { Subscription } from 'rxjs';\nimport { FormsService } from 'src/app/services/forms.service';\nimport { Feature, Project, GroupForm, TagGroup } from 'src/app/models/models';\nimport { GeoDataService } from 'src/app/services/geo-data.service';\nimport { ProjectsService } from 'src/app/services/projects.service';\n\n@Component({\n selector: 'app-form-color',\n templateUrl: './form-color.component.html',\n styleUrls: ['./form-color.component.scss'],\n})\nexport class FormColorComponent implements OnInit {\n @Input() field: any = {};\n @Input() form: GroupForm;\n @Input() color: string;\n @Input() label: String;\n\n public chosenTag: string;\n public activeProject: Project;\n public activeGroup: TagGroup;\n public activeGroupFeature: Feature;\n public chosenColor = '#ffffff';\n value: any = {};\n\n constructor(\n private formsService: FormsService,\n private projectsService: ProjectsService,\n private geoDataService: GeoDataService\n ) {}\n\n ngOnInit() {\n this.geoDataService.activeGroupFeature.subscribe((next) => {\n this.value = this.formsService.getTagValue(next, this.form);\n this.chosenTag = this.value.label;\n });\n\n this.projectsService.activeProject.subscribe((next) => {\n this.activeProject = next;\n });\n\n this.geoDataService.activeGroup.subscribe((next: TagGroup) => {\n this.activeGroup = next;\n });\n\n this.geoDataService.activeGroupFeature.subscribe((next) => {\n this.activeGroupFeature = next;\n });\n }\n\n updateCheckedTag() {\n this.value = this.form.options.find((opt) => opt.label === this.chosenTag);\n this.formsService.saveStyles(\n this.activeProject.id,\n [this.activeGroupFeature],\n this.activeGroup,\n this.value.color\n );\n\n this.geoDataService.setTagFeaturesQueue(this.activeGroupFeature.id, {\n id: this.form.id,\n value: this.value,\n });\n }\n}\n","import { BrowserModule } from '@angular/platform-browser';\nimport { NgModule } from '@angular/core';\nimport { BrowserAnimationsModule } from '@angular/platform-browser/animations';\nimport { HttpClientModule, HTTP_INTERCEPTORS } from '@angular/common/http';\n// CommonModule for dynamic field\nimport { APP_BASE_HREF, CommonModule } from '@angular/common';\n\nimport { InfiniteScrollModule } from 'ngx-infinite-scroll';\nimport { NgxSpinnerModule } from 'ngx-spinner';\nimport { ModalModule, BsDropdownModule, AccordionModule } from 'ngx-foundation';\nimport { MatSliderModule } from '@angular/material/slider';\nimport { MatMenuModule } from '@angular/material/menu';\nimport { MatToolbarModule } from '@angular/material/toolbar';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatDialogModule } from '@angular/material/dialog';\nimport { MatTooltipModule } from '@angular/material/tooltip';\nimport { MatInputModule } from '@angular/material/input';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatCheckboxModule } from '@angular/material/checkbox';\nimport { MatRadioModule } from '@angular/material/radio';\nimport { MatSelectModule } from '@angular/material/select';\nimport { NgxMasonryModule } from 'ngx-masonry';\nimport { ToastrModule } from 'ngx-toastr';\n\nimport { FileSizeModule } from 'ngx-filesize';\nimport { ApiModule } from 'ng-tapis';\n\nimport { AppRoutingModule } from './app-routing.module';\nimport { AppComponent } from './app.component';\nimport { MapComponent } from './components/map/map.component';\nimport { MainComponent } from './components/main/main.component';\nimport { NotFoundComponent } from './components/notfound/notfound.component';\nimport { ControlBarComponent } from './components/control-bar/control-bar.component';\nimport { AuthService } from './services/authentication.service';\nimport { CallbackComponent } from './components/callback/callback.component';\nimport { AuthInterceptor, TokenInterceptor } from './app.interceptors';\nimport { ReactiveFormsModule, FormsModule } from '@angular/forms';\nimport { ModalFileBrowserComponent } from './components/modal-file-browser/modal-file-browser.component';\nimport { environment } from '../environments/environment';\nimport { ImageGalleryComponent } from './components/image-gallery/image-gallery.component';\n// import { TaggerComponent } from './components/tagger/tagger.component';\n// import { PresetGeneratorComponent } from './components/preset-generator/preset-generator.component';\nimport { ImageBoxComponent } from './components/image-box/image-box.component';\nimport { FormGeneratorComponent } from './components/side-bar/tag-images/form-generator/form-generator.component';\nimport { SideBarComponent } from './components/side-bar/side-bar.component';\n// import { ImageListComponent } from './components/image-list/image-list.component';\nimport { SelectGroupComponent } from './components/side-bar/select-group/select-group.component';\nimport { SelectImageComponent } from './components/side-bar/select-image/select-image.component';\nimport { TagGeneratorComponent } from './components/side-bar/tag-generator/tag-generator.component';\nimport { TagImagesComponent } from './components/side-bar/tag-images/tag-images.component';\nimport { ModalCreateProjectComponent } from './components/modal-create-project/modal-create-project.component';\nimport { ModalCurrentProjectComponent } from './components/modal-current-project/modal-current-project.component';\nimport { ScrollingModule } from '@angular/cdk/scrolling';\nimport { MatProgressSpinnerModule } from '@angular/material/progress-spinner';\nimport { MatTreeModule } from '@angular/material/tree';\nimport { MatProgressBar } from '@angular/material';\nimport { MatSnackBarModule } from '@angular/material/snack-bar';\nimport { ModalDownloadSelectorComponent } from './components/modal-download-selector/modal-download-selector.component';\nimport { FormFieldsComponent } from './components/side-bar/tag-images/form-generator/form-fields/form-fields.component';\nimport { FormCheckBoxComponent } from './components/side-bar/tag-images/form-generator/form-fields/form-checkbox/form-checkbox.component';\nimport { FormDropDownComponent } from './components/side-bar/tag-images/form-generator/form-fields/form-dropdown/form-dropdown.component';\nimport { FormFileComponent } from './components/side-bar/tag-images/form-generator/form-fields/form-file/form-file.component';\nimport { FormRadioComponent } from './components/side-bar/tag-images/form-generator/form-fields/form-radio/form-radio.component';\nimport { FormTextBoxComponent } from './components/side-bar/tag-images/form-generator/form-fields/form-textbox/form-textbox.component';\nimport { FormColorComponent } from './components/side-bar/tag-images/form-generator/form-fields/form-color/form-color.component';\nimport { ModalShareProjectComponent } from './components/modal-share-project/modal-share-project.component';\nimport { MatCardModule } from '@angular/material/card';\n\n@NgModule({\n declarations: [\n AppComponent,\n MapComponent,\n NotFoundComponent,\n MainComponent,\n ControlBarComponent,\n CallbackComponent,\n ModalFileBrowserComponent,\n ImageGalleryComponent,\n // TaggerComponent,\n // PresetGeneratorComponent,\n ImageBoxComponent,\n FormGeneratorComponent,\n SideBarComponent,\n // ImageListComponent,\n SelectGroupComponent,\n SelectImageComponent,\n TagGeneratorComponent,\n TagImagesComponent,\n ModalCreateProjectComponent,\n ModalCurrentProjectComponent,\n MatProgressBar,\n ModalDownloadSelectorComponent,\n FormFieldsComponent,\n FormCheckBoxComponent,\n FormDropDownComponent,\n FormFileComponent,\n FormRadioComponent,\n FormTextBoxComponent,\n ModalShareProjectComponent,\n FormColorComponent,\n ],\n imports: [\n // this is for the ng-tapis library\n ApiModule.forRoot({ rootUrl: 'https://agave.designsafe-ci.org/' }),\n BrowserModule,\n AppRoutingModule,\n HttpClientModule,\n BrowserAnimationsModule,\n InfiniteScrollModule,\n NgxSpinnerModule,\n NgxMasonryModule,\n ToastrModule.forRoot(),\n ModalModule.forRoot(),\n MatMenuModule,\n MatToolbarModule,\n MatButtonModule,\n MatDialogModule,\n MatTooltipModule,\n MatInputModule,\n MatCheckboxModule,\n MatSelectModule,\n MatRadioModule,\n MatIconModule,\n AccordionModule.forRoot(),\n ReactiveFormsModule,\n FormsModule,\n FileSizeModule,\n BsDropdownModule.forRoot(),\n CommonModule,\n MatProgressSpinnerModule,\n ScrollingModule,\n MatTreeModule,\n MatSnackBarModule,\n MatCardModule,\n ],\n providers: [\n AuthService,\n {\n provide: HTTP_INTERCEPTORS,\n multi: true,\n useClass: AuthInterceptor,\n },\n {\n provide: HTTP_INTERCEPTORS,\n multi: true,\n useClass: TokenInterceptor,\n },\n {\n provide: APP_BASE_HREF,\n useValue: environment.baseHref,\n },\n ],\n bootstrap: [AppComponent],\n entryComponents: [\n ModalFileBrowserComponent,\n ModalDownloadSelectorComponent,\n ModalCreateProjectComponent,\n ModalCurrentProjectComponent,\n ModalShareProjectComponent,\n ],\n})\nexport class AppModule {}\n","import 'hammerjs';\nimport { enableProdMode } from '@angular/core';\nimport { platformBrowserDynamic } from '@angular/platform-browser-dynamic';\n\nimport { AppModule } from './app/app.module';\nimport { environment } from './environments/environment';\n\nif (environment.production) {\n enableProdMode();\n}\n\nplatformBrowserDynamic()\n .bootstrapModule(AppModule)\n .catch((err) => console.error(err));\n","export default \"<div class=\\\"tag-forms\\\">\\n <div class=\\\"subitem-title\\\" (click)=\\\"expandPanel()\\\">\\n <span> Tag Images </span>\\n <span>\\n <span\\n style=\\\"cursor: pointer\\\"\\n (click)=\\\"showTagGenerator()\\\"\\n matTooltip=\\\"Add New Tag Form\\\"\\n style=\\\"cursor: pointer; margin-right: 10px\\\"\\n matTooltipPosition=\\\"above\\\"\\n >\\n <i class=\\\"fas fa-plus\\\"></i>\\n </span>\\n </span>\\n </div>\\n <!-- subitem-title -->\\n\\n <div *ngIf=\\\"showSubitem\\\" class=\\\"subitem\\\">\\n <div class=\\\"subitem-scroll\\\">\\n <div *ngFor=\\\"let form of formList\\\">\\n <div class=\\\"form-item-container\\\">\\n <div class=\\\"name-group\\\">{{ form.label }} ({{ form.type }})</div>\\n <div class=\\\"button-group\\\">\\n <div (click)=\\\"deleteForm(form)\\\">\\n <i\\n class=\\\"fas fa-minus\\\"\\n matTooltip=\\\"Delete\\\"\\n matTooltipPosition=\\\"above\\\"\\n style=\\\"cursor: pointer\\\"\\n >\\n </i>\\n </div>\\n <!-- delete button -->\\n\\n <div (click)=\\\"openRenameModal(renameFormItemModal)\\\">\\n <i\\n class=\\\"fas fa-edit\\\"\\n matTooltip=\\\"Rename\\\"\\n matTooltipPosition=\\\"above\\\"\\n style=\\\"cursor: pointer\\\"\\n >\\n </i>\\n </div>\\n\\n <ng-template #renameFormItemModal>\\n <input\\n matInput\\n #formItemRename\\n [(ngModel)]=\\\"tagName\\\"\\n value=\\\"{{ form.label }}\\\"\\n placeholder=\\\"Rename Form Item\\\"\\n (keyup.enter)=\\\"renameForm(form)\\\"\\n />\\n <br />\\n <br />\\n <div class=\\\"button-group\\\">\\n <button\\n matDialogClose\\n mat-raised-button\\n color=\\\"primary\\\"\\n (click)=\\\"renameForm(form.label)\\\"\\n >\\n Rename\\n </button>\\n <button matDialogClose mat-button>Cancel</button>\\n </div>\\n </ng-template>\\n <!-- rename modal -->\\n </div>\\n <!-- button group -->\\n </div>\\n <!-- form-item-container -->\\n <app-form-generator [form]=\\\"form\\\"></app-form-generator>\\n </div>\\n </div>\\n <!-- subitem scroll -->\\n </div>\\n <!--subitem -->\\n</div>\\n<!-- tag-forms -->\\n\"","export default \"<div>\\n <div [ngSwitch]=\\\"form.type\\\" class=\\\"form-controls\\\">\\n <ng-container *ngSwitchCase=\\\"'text'\\\">\\n <app-form-textbox [field]=\\\"form.options\\\" [form]=\\\"form\\\"></app-form-textbox>\\n </ng-container>\\n\\n <ng-container *ngSwitchCase=\\\"'dropdown'\\\">\\n <app-form-dropdown\\n [field]=\\\"form.options\\\"\\n [form]=\\\"form\\\"\\n ></app-form-dropdown>\\n </ng-container>\\n\\n <ng-container *ngSwitchCase=\\\"'radio'\\\">\\n <app-form-radio\\n [field]=\\\"opt\\\"\\n [form]=\\\"form\\\"\\n label=\\\"{{ form.label }}\\\"\\n ></app-form-radio>\\n </ng-container>\\n\\n <ng-container *ngSwitchCase=\\\"'checkbox'\\\">\\n <app-form-checkbox [form]=\\\"form\\\"></app-form-checkbox>\\n </ng-container>\\n\\n <ng-container *ngSwitchCase=\\\"'color'\\\">\\n <app-form-color\\n [field]=\\\"opt\\\"\\n [form]=\\\"form\\\"\\n label=\\\"{{ form.label }}\\\"\\n [color]=\\\"colorArray[form.options.indexOf(opt)]\\\"\\n ></app-form-color>\\n </ng-container>\\n </div>\\n</div>\\n\""]}